diff --git a/ApplePaySwagServer.py b/ApplePaySwagServer.py new file mode 100644 index 0000000..bdca5ea --- /dev/null +++ b/ApplePaySwagServer.py @@ -0,0 +1,43 @@ +import stripe +from flask import Flask +from flask import request +from flask import json + +app = Flask(__name__) + +#1 +@app.route('/pay', methods=['POST']) +def pay(): + + #2 + # Set this to your Stripe secret key (use your test key!) + stripe.api_key = "sk_test_4HKKLEaGa6YweA50gknGDYEf" + + #3 + # Parse the request as JSON + json = request.get_json(force=True) + + # Get the credit card details + token = json['stripeToken'] + amount = json['amount'] + description = json['description'] + + # Create the charge on Stripe's servers - this will charge the user's card + try: + #4 + charge = stripe.Charge.create( + amount=amount, + currency="usd", + card=token, + description=description + ) + except stripe.CardError, e: + # The card has been declined + pass + + #5 + return "Success!" + +if __name__ == '__main__': + # Set as 0.0.0.0 to be accessible outside your local machine + app.run(debug=True, host= '0.0.0.0') diff --git a/BrainTree.py b/BrainTree.py new file mode 100644 index 0000000..3de8676 --- /dev/null +++ b/BrainTree.py @@ -0,0 +1,81 @@ +import braintree +import stripe +from flask import Flask +from flask import request +from flask import json + +braintree.Configuration.configure( + braintree.Environment.Sandbox, + '8vcr8hbq5yknmx7p', + '68wxydkzwpxms2vp', + '3ff43ddfcc2e2b97718917952d19c070' + ) +app = Flask(__name__) + +@app.route("/client_token", methods=["GET"]) +def client_token(): + return braintree.ClientToken.generate() +@app.route("/checkout", methods=["POST"]) +def create_purchase(): +# def f(nonce_from_the_client): +# nonce_from_the_client = request.form["sandbox_4mpg9vyr_8vcr8hbq5yknmx7p"] +# Use payment method nonce here... + json = request.get_json(force=True) + nonce = json["payment_method_nonce"] + ammount = json["amount"] + result = braintree.Transaction.sale({ + "amount": ammount, + "payment_method_nonce": nonce, + "options": { + "submit_for_settlement": True + } + }) + if result.is_success: + print("success!: " + result.transaction.id) + elif result.transaction: + print("Error processing transaction:") + print(" code: " + result.transaction.processor_response_code) + print(" text: " + result.transaction.processor_response_text) + else: + for error in result.errors.deep_errors: + print("attribute: " + error.attribute) + print(" code: " + error.code) + print(" message: " + error.message) + return "success" + +#1 +@app.route('/pay', methods=['POST']) +def pay(): + + #2 + # Set this to your Stripe secret key (use your test key!) + stripe.api_key = "sk_test_4HKKLEaGa6YweA50gknGDYEf" + + #3 + # Parse the request as JSON + json = request.get_json(force=True) + + # Get the credit card details + token = json['stripeToken'] + amount = json['amount'] + description = json['description'] + + # Create the charge on Stripe's servers - this will charge the user's card + try: + #4 + charge = stripe.Charge.create( + amount=amount, + currency="usd", + card=token, + description=description + ) + except stripe.CardError, e: + # The card has been declined + pass + + #5 + return "Success!" + +if __name__ == '__main__': + # Set as 0.0.0.0 to be accessible outside your local machine + app.run(debug=True, host= '0.0.0.0') diff --git a/Podfile b/Podfile new file mode 100644 index 0000000..bc7ab5b --- /dev/null +++ b/Podfile @@ -0,0 +1,24 @@ +# Uncomment the next line to define a global platform for your project +# platform :ios, '9.0' + +target 'e-shop' do + # Comment the next line if you're not using Swift and don't want to use dynamic frameworks + use_frameworks! +#pod 'Stripe/ApplePay' +#pod 'Stripe' +pod "SwiftSpinner" +pod 'Braintree', '~> 3.9' + + # Pods for e-shop + + target 'e-shopTests' do + inherit! :search_paths + # Pods for testing + end + + target 'e-shopUITests' do + inherit! :search_paths + # Pods for testing + end + +end diff --git a/Podfile.lock b/Podfile.lock new file mode 100644 index 0000000..9ba44d0 --- /dev/null +++ b/Podfile.lock @@ -0,0 +1,44 @@ +PODS: + - Braintree (3.9.9): + - Braintree/API (= 3.9.9) + - Braintree/Coinbase (= 3.9.9) + - Braintree/Drop-In (= 3.9.9) + - Braintree/Payments (= 3.9.9) + - Braintree/PayPal (= 3.9.9) + - Braintree/UI (= 3.9.9) + - Braintree/Venmo (= 3.9.9) + - Braintree/API (3.9.9) + - Braintree/Coinbase (3.9.9): + - Braintree/API + - Braintree/Drop-In (3.9.9): + - Braintree/API + - Braintree/Coinbase + - Braintree/Payments + - Braintree/PayPal + - Braintree/UI + - Braintree/Venmo + - Braintree/Payments (3.9.9): + - Braintree/API + - Braintree/Coinbase + - Braintree/PayPal + - Braintree/Venmo + - Braintree/PayPal (3.9.9): + - Braintree/API + - Braintree/UI + - Braintree/UI (3.9.9): + - Braintree/API + - Braintree/Venmo (3.9.9): + - Braintree/API + - SwiftSpinner (1.5.0) + +DEPENDENCIES: + - Braintree (~> 3.9) + - SwiftSpinner + +SPEC CHECKSUMS: + Braintree: a9d35b7d5a8d76267adcb5795d32c20ca5f39a99 + SwiftSpinner: 4c058c7a1d6b444dd2e1d70988ead40783097133 + +PODFILE CHECKSUM: f9c29c30105959c35827399e9176ba1f78769ee6 + +COCOAPODS: 1.3.1 diff --git a/Pods/Braintree/Braintree/API/@Public/BTAppSwitchErrors.h b/Pods/Braintree/Braintree/API/@Public/BTAppSwitchErrors.h new file mode 100644 index 0000000..e586244 --- /dev/null +++ b/Pods/Braintree/Braintree/API/@Public/BTAppSwitchErrors.h @@ -0,0 +1,38 @@ +#import + +/// App Switch NSError Domain +extern NSString *const BTAppSwitchErrorDomain; + +/// App Switch NSError Codes +typedef NS_ENUM(NSInteger, BTAppSwitchErrorCode) { + BTAppSwitchErrorUnknown = 0, + + /// A compatible version of the target app is not available on this device. + BTAppSwitchErrorAppNotAvailable = 1, + + /// App switch is not enabled. + BTAppSwitchErrorDisabled = 2, + + /// App switch is not configured appropriately. You must specify a + /// returnURLScheme via Braintree before attempting an app switch. + BTAppSwitchErrorIntegrationReturnURLScheme = 3, + + /// The merchant ID field was not valid or present in the client token. + BTAppSwitchErrorIntegrationMerchantId = 4, + + /// UIApplication failed to switch despite it being available. + /// `[UIApplication openURL:]` returned `NO` when `YES` was expected. + BTAppSwitchErrorFailed = 5, + + /// App switch completed, but the client encountered an error while attempting + /// to communicate with the Braintree server. + /// Check for a `NSUnderlyingError` value in the `userInfo` dictionary for information + /// about the underlying cause. + BTAppSwitchErrorFailureFetchingPaymentMethod = 6, + + /// Parameters used to initiate app switch are invalid + BTAppSwitchErrorIntegrationInvalidParameters = 7, + + /// Invalid CFBundleDisplayName + BTAppSwitchErrorIntegrationInvalidBundleDisplayName = 8, +}; diff --git a/Pods/Braintree/Braintree/API/@Public/BTAppSwitching.h b/Pods/Braintree/Braintree/API/@Public/BTAppSwitching.h new file mode 100644 index 0000000..e5d763b --- /dev/null +++ b/Pods/Braintree/Braintree/API/@Public/BTAppSwitching.h @@ -0,0 +1,59 @@ +#import + +#import "BTClient.h" +#import "BTAppSwitchingDelegate.h" + +NS_ASSUME_NONNULL_BEGIN + +@protocol BTAppSwitching + +/// The custom URL scheme that the authenticating app should use to return users to your app via `openURL:` (app switch). +/// +/// When `nil`, One Touch app switch will be disabled +/// +/// @note This must match the entry in your app's Info.plist, and must be prefixed +/// with your Bundle ID, e.g. com.yourcompany.Your-App.payment +@property (nonatomic, copy) NSString *returnURLScheme; + +/// A delegate that receives messages throughout the app switch cycle +@property (nonatomic, weak) iddelegate; + +/// Checks integration setup and presence of app on device to determine +/// if app switch is available for the given client. +/// +/// @param client A BTClient +/// +/// @return Whether app switch is available +- (BOOL)appSwitchAvailableForClient:(BTClient*)client; + +/// Attempt to initiate app switch +/// +/// @param client A BTClient needed for obtaining app switch configuration, +/// reporting analytics events, and performing post-switch +/// gateway operations. +/// @param delegate A delegate that will receive messags throughout the app +/// switch cycle after successful initiation. +/// +/// @param error Error encountered in attempting to app switch if applicable. +/// +/// @return whether app switch is occurring. +- (BOOL)initiateAppSwitchWithClient:(BTClient *)client delegate:(id)delegate error:(NSError * __autoreleasing *)error; + +/// Whether this instance can be used to handle this response URL. +/// +/// @param url A URL string. +/// @param sourceApplication The source application. +/// +/// @return Whether this instance can handle the given callback URL from +/// the given source application. +- (BOOL)canHandleReturnURL:(NSURL *)url sourceApplication:(nullable NSString *)sourceApplication; + +/// Handle the actual response URL that contains payment authorization, +/// indication of cancellation, or error information. +/// +/// @param url The callback response URL. +- (void)handleReturnURL:(NSURL *)url; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Braintree/Braintree/API/@Public/BTAppSwitchingDelegate.h b/Pods/Braintree/Braintree/API/@Public/BTAppSwitchingDelegate.h new file mode 100644 index 0000000..a98af6e --- /dev/null +++ b/Pods/Braintree/Braintree/API/@Public/BTAppSwitchingDelegate.h @@ -0,0 +1,29 @@ +#import + +#import "BTPaymentMethod.h" + +@protocol BTAppSwitching; + +/// Delegate protocol for receiving messages about state changes to an app switch handler +@protocol BTAppSwitchingDelegate + +@optional + +/// This message is sent when the user has authorized payment, and the payment method +/// is about to be created. +- (void)appSwitcherWillCreatePaymentMethod:(id)switcher; + +@required + +/// This message is sent when a payment method has been authorized and is available. +- (void)appSwitcher:(id)switcher didCreatePaymentMethod:(BTPaymentMethod *)paymentMethod; + +/// This message is sent when the payment method could not be created. +- (void)appSwitcher:(id)switcher didFailWithError:(NSError *)error; + +/// This message is sent when the payment was cancelled. +- (void)appSwitcherDidCancel:(id)switcher; + +@end + + diff --git a/Pods/Braintree/Braintree/API/@Public/BTApplePayPaymentMethod.h b/Pods/Braintree/Braintree/API/@Public/BTApplePayPaymentMethod.h new file mode 100644 index 0000000..2eb91d2 --- /dev/null +++ b/Pods/Braintree/Braintree/API/@Public/BTApplePayPaymentMethod.h @@ -0,0 +1,19 @@ +#if BT_ENABLE_APPLE_PAY +@import PassKit; + +#import "BTPaymentMethod.h" + +/// The server-side resource that represents a payment method created via Apple Pay. +@interface BTApplePayPaymentMethod : BTPaymentMethod + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" +@property (nonatomic, readonly) ABRecordRef billingAddress; +@property (nonatomic, readonly) ABRecordRef shippingAddress; +#pragma clang diagnostic pop +@property (nonatomic, readonly, strong) PKContact *billingContact; +@property (nonatomic, readonly, strong) PKContact *shippingContact; +@property (nonatomic, strong, readonly) PKShippingMethod *shippingMethod; + +@end +#endif diff --git a/Pods/Braintree/Braintree/API/@Public/BTCardPaymentMethod.h b/Pods/Braintree/Braintree/API/@Public/BTCardPaymentMethod.h new file mode 100644 index 0000000..c154854 --- /dev/null +++ b/Pods/Braintree/Braintree/API/@Public/BTCardPaymentMethod.h @@ -0,0 +1,37 @@ +#import + +#import "BTPaymentMethod.h" + +/// Card type +typedef NS_ENUM(NSInteger, BTCardType) { + BTCardTypeUnknown = 0, + BTCardTypeAMEX, + BTCardTypeDinersClub, + BTCardTypeDiscover, + BTCardTypeMasterCard, + BTCardTypeVisa, + BTCardTypeJCB, + BTCardTypeLaser, + BTCardTypeMaestro, + BTCardTypeUnionPay, + BTCardTypeSolo, + BTCardTypeSwitch, + BTCardTypeUKMaestro, +}; + +/// A payment method returned by the Client API that represents a Card associated with +/// a particular Braintree customer. +/// +/// See also: BTPaymentMethod and BTMutableCardPaymentMethod. +@interface BTCardPaymentMethod : BTPaymentMethod + +/// Type of card +@property (nonatomic, readonly, assign) BTCardType type; + +/// String representation of type +@property (nonatomic, readonly, copy) NSString *typeString; + +/// Last two digits of the card +@property (nonatomic, readonly, copy) NSString *lastTwo; + +@end diff --git a/Pods/Braintree/Braintree/API/@Public/BTClient+Offline.h b/Pods/Braintree/Braintree/API/@Public/BTClient+Offline.h new file mode 100644 index 0000000..efeec6d --- /dev/null +++ b/Pods/Braintree/Braintree/API/@Public/BTClient+Offline.h @@ -0,0 +1,20 @@ +#import "BTClient.h" + +/// Category for offline-only BTClient methods +/// +/// Do not use this in production. +/// +/// @see BTOfflineModeURLProtocol +@interface BTClient (Offline) + +/// Obtain a client token only for use in offline development and testing. It looks as if +/// it were generated by a server-side client library, but it causes the iOS code to run +/// offline mode with no network dependencies and faked behavior. +/// +/// @param configuration Optional additional client token parameters (useful for extensions to +/// `BTClient` that rely on the contents of the client token) +/// +/// @return client token string ++ (NSString *)offlineTestClientTokenWithAdditionalParameters:(NSDictionary *)configuration DEPRECATED_MSG_ATTRIBUTE("Offline BTClient is no longer supported. Please use a real client token by on your server. (See https://developers.braintreepayments.com/ios/sdk/overview/generate-client-token)"); + +@end diff --git a/Pods/Braintree/Braintree/API/@Public/BTClient+Testing.h b/Pods/Braintree/Braintree/API/@Public/BTClient+Testing.h new file mode 100644 index 0000000..6ad57ea --- /dev/null +++ b/Pods/Braintree/Braintree/API/@Public/BTClient+Testing.h @@ -0,0 +1,51 @@ +#import "BTClient.h" + +/// BTClient test configuration keys +/// To be used in testing and customizing Braintree configuration +extern NSString *BTClientTestConfigurationKeyMerchantIdentifier; +extern NSString *BTClientTestConfigurationKeyPublicKey; +extern NSString *BTClientTestConfigurationKeyCustomer; +extern NSString *BTClientTestConfigurationKeyNoCustomer; +extern NSString *BTClientTestConfigurationKeySharedCustomerIdentifier; +extern NSString *BTClientTestConfigurationKeySharedCustomerIdentifierType; +extern NSString *BTClientTestConfigurationKeyRevoked; +extern NSString *BTClientTestConfigurationKeyClientTokenVersion; +extern NSString *BTClientTestConfigurationKeyAnalytics; +extern NSString *BTClientTestConfigurationKeyURL; +extern NSString *BTClientTestConfigurationKeyMerchantAccountIdentifier; + +/// Block type that takes an `NSDictionary` that will contain `nonce` info. +typedef void (^BTClientNonceInfoSuccessBlock)(NSDictionary *nonceInfo); + +/// Extensions on `BTClient` for utilizing the testing endpoints in the Gateway +/// in order to perform integration tests without a dedicated merchant server. +/// +/// @warnings These methods will not work outside of Braintree. +@interface BTClient (Testing) + +/// Obtain a client for integration testing with the attributes specified by the configuration dictionary. +/// +/// This method actually makes a request against the gateway in order our integration test suite to create +/// a client without a merchant server that generates real client tokens. ++ (void)testClientWithConfiguration:(NSDictionary *)configurationDictionary async:(BOOL)async completion:(void (^)(BTClient * client))block; + +/// Invokes Success block with Nonce Info if a Nonce is found. +- (void)fetchNonceInfo:(NSString *)nonce success:(BTClientNonceInfoSuccessBlock)successBlock failure:(BTClientFailureBlock)failureBlock; + +/// Invokes Success block with Nonce Info if a Nonce is found. +- (void)fetchNonceThreeDSecureVerificationInfo:(NSString *)nonce success:(BTClientNonceInfoSuccessBlock)successBlock failure:(BTClientFailureBlock)failureBlock; + +/// Ask the gateway to revoke the current authorization fingerprint +/// +/// Available internally at Braintree for testing only +- (void)revokeAuthorizationFingerprintForTestingWithSuccess:(void (^)(void))successBlock + failure:(BTClientFailureBlock)failureBlock; + +/// Update coinbase merchant options for testing +/// +/// Available internally at Braintree for testing only +- (void)updateCoinbaseMerchantOptions:(NSDictionary *)dictionary + success:(void (^)(void))successBlock + failure:(BTClientFailureBlock)failureBlock; + +@end diff --git a/Pods/Braintree/Braintree/API/@Public/BTClient.h b/Pods/Braintree/Braintree/API/@Public/BTClient.h new file mode 100644 index 0000000..5c1643c --- /dev/null +++ b/Pods/Braintree/Braintree/API/@Public/BTClient.h @@ -0,0 +1,215 @@ +#import + +#import "BTCardPaymentMethod.h" +#import "BTPayPalPaymentMethod.h" + +#import "BTApplePayPaymentMethod.h" +#import "BTCoinbasePaymentMethod.h" + +#import "BTErrors.h" +#import "BTClientCardRequest.h" + +NS_ASSUME_NONNULL_BEGIN + +@class BTClient, BTCoinbasePaymentMethod; + +#pragma mark Types + +/// Block type that takes an `NSArray` of `BTPaymentMethod`s +#if (defined(__clang__) && __has_feature(objc_generics)) +typedef void (^BTClientPaymentMethodListSuccessBlock)(NSArray *paymentMethods); +#else +typedef void (^BTClientPaymentMethodListSuccessBlock)(NSArray *paymentMethods); +#endif + +/// Block type that takes a single `BTPaymentMethod` +typedef void (^BTClientPaymentMethodSuccessBlock)(BTPaymentMethod *paymentMethod); + +/// Block type that takes a `BTCardPaymentMethod` +typedef void (^BTClientCardSuccessBlock)(BTCardPaymentMethod *card); + +#if BT_ENABLE_APPLE_PAY +/// Success Block type for the Save Apple Pay call +typedef void (^BTClientApplePaySuccessBlock)(BTApplePayPaymentMethod *applePayPaymentMethod); +#endif + +/// Success Block type for the Save Paypal call +typedef void (^BTClientPaypalSuccessBlock)(BTPayPalPaymentMethod *paypalPaymentMethod); + +/// Success Block type for the Save Coinbase call +typedef void (^BTClientCoinbaseSuccessBlock)(BTCoinbasePaymentMethod *coinbasePaymentMethod); + +/// Success Block type for analytics events +typedef void (^BTClientAnalyticsSuccessBlock)(void); + +/// Block type for handling `BTClient` errors +typedef void (^BTClientFailureBlock)(NSError *error); + +/// A `BTClient` performs Braintree API operations and returns +/// resulting responses or errors. It is the entry-point for all +/// communication with Braintree. +@interface BTClient : NSObject + +/// Initialize and configure a `BTClient` with a client token. +/// The client token dictates the behavior of subsequent operations. +/// +/// @param clientTokenString Braintree client token +- (nullable instancetype)initWithClientToken:(NSString *)clientTokenString; + +/// The set of challenges that need to be provided to `saveCardWithNumber` +/// in order to save a card. This is dependent upon on your Gateway settings +/// (potentially among other factors). +@property (nonatomic, nullable, readonly) NSSet *challenges; + +/// The public Braintree Merchant ID for which this client +/// was initialized. +@property (nonatomic, nullable, copy, readonly) NSString *merchantId; + +/// A set of strings denoting additional scopes to use when authorizing a PayPal account. +/// See PayPalOAuthScopes.h for a list of available scopes. +#if (defined(__clang__) && __has_feature(objc_generics)) +@property (nonatomic, nullable, copy) NSSet *additionalPayPalScopes; +#else +@property (nonatomic, nullable, copy) NSSet *additionalPayPalScopes; +#endif + +#pragma mark - Fetch a Payment Method + +/// Obtain a list of payment methods saved to Braintree +/// +/// @param successBlock success callback for handling the returned list of payment methods +/// @param failureBlock failure callback for handling errors +- (void)fetchPaymentMethodsWithSuccess:(nullable BTClientPaymentMethodListSuccessBlock)successBlock + failure:(nullable BTClientFailureBlock)failureBlock; + +/// Obtain information about a payment method based on a nonce +/// +/// @param successBlock success callback for handling the retrieved payment methods +/// @param failureBlock failure callback for handling errors +- (void)fetchPaymentMethodWithNonce:(NSString *)nonce + success:(nullable BTClientPaymentMethodSuccessBlock)successBlock + failure:(nullable BTClientFailureBlock)failureBlock; + +#pragma mark Save a New Payment Method + +/// Save a card to Braintree +/// +/// @param request an object that includes the raw card details +/// @param successBlock success callback for handling the resulting new card +/// @param failureBlock failure callback for handling errors +/// +/// @see challenges +- (void)saveCardWithRequest:(BTClientCardRequest *)request + success:(nullable BTClientCardSuccessBlock)successBlock + failure:(nullable BTClientFailureBlock)failureBlock; + +#if BT_ENABLE_APPLE_PAY +/// Save a payment method created via Apple Pay +/// +/// @param payment A `PKPayment` instance +/// @param successBlock success callback for handling the resulting payment method +/// @param failureBlock failure callback for handling errors +- (void)saveApplePayPayment:(PKPayment *)payment + success:(nullable BTClientApplePaySuccessBlock)successBlock + failure:(nullable BTClientFailureBlock)failureBlock; +#endif + +/// Save a paypal payment method to Braintree +/// +/// @param authCode Authorization Code +/// @param applicationCorrelationId PayPal App Correlation Id (See `-[BTClient btPayPal_applicationCorrelationId]` and https://github.com/paypal/PayPal-iOS-SDK/blob/master/docs/future_payments_mobile.md#obtain-an-application-correlation-id.) +/// @param successBlock success callback for handling the resulting new PayPal account payment method +/// @param failureBlock failure callback for handling errors +- (void)savePaypalPaymentMethodWithAuthCode:(NSString *)authCode + applicationCorrelationID:(NSString *)applicationCorrelationId + success:(nullable BTClientPaypalSuccessBlock)successBlock + failure:(nullable BTClientFailureBlock)failureBlock; + +/// Save a paypal payment method to Braintree without a PayPal App Correlation ID +/// +/// @note This signature has been deprecated in favor of +/// savePaypalPaymentMethodWithAuthCode:applicationCorrelationID:success:failure: to encourage the submission +/// of PayPal app correlation ids. +/// +/// @param authCode Authorization Code +/// @param successBlock success callback for handling the resulting new PayPal account payment method +/// @param failureBlock failure callback for handling errors +- (void)savePaypalPaymentMethodWithAuthCode:(NSString *)authCode + success:(nullable BTClientPaypalSuccessBlock)successBlock + failure:(nullable BTClientFailureBlock)failureBlock DEPRECATED_ATTRIBUTE; + +/// Save a paypal payment method to Braintree +/// +/// @note This signature has been deprecated in favor of +/// savePaypalPaymentMethodWithAuthCode:applicationCorrelationID:success:failure: for clarity +/// +/// @param authCode Authorization Code +/// @param correlationId PayPal App Correlation ID (See `-[BTClient btPayPal_applicationCorrelationId]` and https://github.com/paypal/PayPal-iOS-SDK/blob/master/docs/future_payments_mobile.md#obtain-an-application-correlation-id.) +/// @param successBlock success callback for handling the resulting new PayPal account payment method +/// @param failureBlock failure callback for handling errors +- (void)savePaypalPaymentMethodWithAuthCode:(NSString *)authCode + correlationId:(NSString *)correlationId + success:(nullable BTClientPaypalSuccessBlock)successBlock + failure:(nullable BTClientFailureBlock)failureBlock DEPRECATED_ATTRIBUTE; + +#pragma mark - Coinbase + +/// Save a Coinbase payment method to Braintree (beta) +/// +/// @param coinbaseAuthResponse A Coinbase authorization response of type NSDictionary +/// @param successBlock success callback for handling the resulting new Coinbase account payment method +/// @param failureBlock failure callback for handling errors +- (void)saveCoinbaseAccount:(id)coinbaseAuthResponse + storeInVault:(BOOL)storeInVault + success:(nullable BTClientCoinbaseSuccessBlock)successBlock + failure:(nullable BTClientFailureBlock)failureBlock; + +#pragma mark Create a Braintree Analytics Event + +/// "Fire and forget analytics" - transmits an analytics event to the Braintree analytics service +/// +/// @param eventKind The analytics event name +- (void)postAnalyticsEvent:(NSString *)eventKind + success:(nullable BTClientAnalyticsSuccessBlock)successBlock + failure:(nullable BTClientFailureBlock)failureBlock; + +- (void)postAnalyticsEvent:(NSString *)eventKind; + +#pragma mark - Library Metadata + +/// Retrieve the current library version. +/// +/// @return A string representation of this library's current semver.org version. ++ (NSString *)libraryVersion; + +@end + +@interface BTClient (Deprecated) + +/// Save a card to Braintree +/// +/// You have two options for validation when saving a card to Braintree. You can specify +/// that only valid options should be saved. +/// +/// @param cardNumber card number (PAN) +/// @param expirationMonth card expiration month (e.g. @"01") +/// @param expirationYear card expiration year (e.g. @"2018")` +/// @param cvv card's cvv three or four digit verification code (optional, depending on your Gateway settings) +/// @param postalCode card's postal code for address verification (optional, depending on your Gateway settings) +/// @param shouldValidate whether details should be validated before creating a nonce for them +/// @param successBlock success callback for handling the resulting new card +/// @param failureBlock failure callback for handling errors +/// +/// @see challenges +- (void)saveCardWithNumber:(NSString *)cardNumber + expirationMonth:(NSString *)expirationMonth + expirationYear:(NSString *)expirationYear + cvv:(nullable NSString *)cvv + postalCode:(nullable NSString *)postalCode + validate:(BOOL)shouldValidate + success:(nullable BTClientCardSuccessBlock)successBlock + failure:(nullable BTClientFailureBlock)failureBlock DEPRECATED_MSG_ATTRIBUTE("Please use BTClientCardRequest and saveCardWithRequest:validate:success:failure:"); + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Braintree/Braintree/API/@Public/BTClientCardRequest.h b/Pods/Braintree/Braintree/API/@Public/BTClientCardRequest.h new file mode 100644 index 0000000..efa3907 --- /dev/null +++ b/Pods/Braintree/Braintree/API/@Public/BTClientCardRequest.h @@ -0,0 +1,22 @@ +#import +#import "BTClientCardTokenizationRequest.h" + +/// Representation of a card that should be uploaded to Braintree for payment method creation. +/// +/// @see BTClientCardTokenizationRequest +@interface BTClientCardRequest : BTClientCardTokenizationRequest + +/// Whether or not to return validations and/or verification results to the client +/// +/// @warning Use this flag with caution. By enabling client-side validation, certain save card requests +/// may result in adding the payment method to the Vault. These semantics are not currently +/// documented. +@property (nonatomic, readwrite, assign) BOOL shouldValidate; + +/// Initializes a request with an empty set of card details +- (instancetype)init NS_DESIGNATED_INITIALIZER; + +/// Initializes a request based on card details in a BTClientCardTokenizationRequest +- (instancetype)initWithTokenizationRequest:(BTClientCardTokenizationRequest *)tokenizationRequest; + +@end diff --git a/Pods/Braintree/Braintree/API/@Public/BTClientCardTokenizationRequest.h b/Pods/Braintree/Braintree/API/@Public/BTClientCardTokenizationRequest.h new file mode 100644 index 0000000..0cb6ac4 --- /dev/null +++ b/Pods/Braintree/Braintree/API/@Public/BTClientCardTokenizationRequest.h @@ -0,0 +1,38 @@ +#import + +/// Representation of a card that should be uploaded to Braintree for payment method tokenization. +@interface BTClientCardTokenizationRequest : NSObject + +/// The raw card number (PAN) +@property (nonatomic, copy) NSString *number; + +/// The raw expiration month (M or MM, e.g. @"01") +@property (nonatomic, copy) NSString *expirationMonth; + +/// The raw expiration year (YY or YYYY, e.g. @"2018") +@property (nonatomic, copy) NSString *expirationYear; + +/// The raw expiration date (MM/YY or MM/YYYY, e.g. @"5/17"), mutally exclusive with expirationMonth and expirationYear +@property (nonatomic, copy) NSString *expirationDate; + +/// The raw cvv three or four digit verification code (possibly required, depending on your Gateway settings) +@property (nonatomic, copy) NSString *cvv; + +/// The raw postal code (possibly required, depending on your Gateway settings) +@property (nonatomic, copy) NSString *postalCode; + +/// Specifies that the card details should be tokenized, rather than validated and fully created as +/// a Payment Method in the Vault. +/// +/// @return NO +@property (nonatomic, readonly, assign) BOOL shouldValidate; + +/// Additional card parameters. See our documentation online for information about the available fields. +@property (nonatomic, strong) NSDictionary *additionalParameters; + +/// Construct a card request parameter dictionary. +/// +/// @return The card request as a dictionary for uploading as parameters in API requests. +- (NSDictionary *)parameters; + +@end diff --git a/Pods/Braintree/Braintree/API/@Public/BTClientToken.h b/Pods/Braintree/Braintree/API/@Public/BTClientToken.h new file mode 100644 index 0000000..6d9e770 --- /dev/null +++ b/Pods/Braintree/Braintree/API/@Public/BTClientToken.h @@ -0,0 +1,24 @@ +#import +#import "BTErrors.h" + +@class BTAPIResponseParser; + +extern NSString *const BTClientTokenKeyVersion; +extern NSString *const BTClientTokenKeyAuthorizationFingerprint; +extern NSString *const BTClientTokenKeyConfigURL; + +@interface BTClientToken : NSObject + +/// Parser to digest the token data +@property (nonatomic, readonly, strong) BTAPIResponseParser *clientTokenParser; +/// The extracted authorization fingerprint +@property (nonatomic, readonly, copy) NSString *authorizationFingerprint; +/// The extracted configURL +@property (nonatomic, readonly, strong) NSURL *configURL; + +#pragma mark - + +//// Initialize a client token with a client token string generated by a Braintree Server SDK. +- (instancetype)initWithClientTokenString:(NSString *)JSONString error:(NSError **)error NS_DESIGNATED_INITIALIZER; + +@end diff --git a/Pods/Braintree/Braintree/API/@Public/BTCoinbasePaymentMethod.h b/Pods/Braintree/Braintree/API/@Public/BTCoinbasePaymentMethod.h new file mode 100644 index 0000000..e4e6f27 --- /dev/null +++ b/Pods/Braintree/Braintree/API/@Public/BTCoinbasePaymentMethod.h @@ -0,0 +1,17 @@ +#import + +#import "BTPaymentMethod.h" + +/// A payment method returned by the Client API that represents a Coinbase account associated with +/// a particular Braintree customer. +/// +/// This is a beta integration option. For details, see https://www.braintreepayments.com/features/coinbase +/// +/// @see BTPaymentMethod +/// @see BTMutablePayPalPaymentMethod +@interface BTCoinbasePaymentMethod : BTPaymentMethod + +/// The email address associated with the Coinbase account. +@property (nonatomic, readonly, copy) NSString *email; + +@end diff --git a/Pods/Braintree/Braintree/API/@Public/BTErrors.h b/Pods/Braintree/Braintree/API/@Public/BTErrors.h new file mode 100644 index 0000000..e25f6cf --- /dev/null +++ b/Pods/Braintree/Braintree/API/@Public/BTErrors.h @@ -0,0 +1,46 @@ +#import + +#pragma mark Braintree NSError Domain + +/// Braintree NSError Domain +extern NSString *const BTBraintreeAPIErrorDomain; + +#pragma mark Braintree NSError Codes + +/// Error codes found in NSError objects returned in Braintree API. +typedef NS_ENUM(NSInteger, BTErrorCode) { + /// An error occurred, but the exact cause was not determined. + BTUnknownError = 0, + /// A client error occurred for an undetermined reason. + BTCustomerInputErrorUnknown, + /// An error occurred due to invalid user input. + BTCustomerInputErrorInvalid, + /// An error occurred due to an authorization problem with SDK integration. + BTMerchantIntegrationErrorUnauthorized, + /// An error occurred due to a remove resource not found. + BTMerchantIntegrationErrorNotFound, + /// An error occurred due to a problem with the client token value. + BTMerchantIntegrationErrorInvalidClientToken, + /// The specified nonce was not found when querying information about it. + BTMerchantIntegrationErrorNonceNotFound, + /// A server-side error occurred. The result of your request is not specified. Please retry your request. + BTServerErrorUnknown, + /// A server-side error occurred due to the Gateway being unavailable. The result of your request is not specified. Please retry your request. + BTServerErrorGatewayUnavailable, + /// A server-side error occurred due to a network problem. See the underlying error for more details and retry your request. + BTServerErrorNetworkUnavailable, + /// An SSL error occurred. + BTServerErrorSSL, + /// A error occurred interpreting the server's response. Please retry your request. + BTServerErrorUnexpectedError, + /// The requested operation is not supported for this merchant or integration + BTErrorUnsupported, +}; + +#pragma mark NSError userInfo Keys + +/// NSError userInfo key for validation errors, present in errors with code BTCustomerInputErrorInvalid. +extern NSString *const BTCustomerInputBraintreeValidationErrorsKey; + +/// NSError userInfo key for 3D Secure liability shift information, present in errors related to 3D Secure +extern NSString *BTThreeDSecureInfoKey; diff --git a/Pods/Braintree/Braintree/API/@Public/BTLogger.h b/Pods/Braintree/Braintree/API/@Public/BTLogger.h new file mode 100644 index 0000000..2c3913d --- /dev/null +++ b/Pods/Braintree/Braintree/API/@Public/BTLogger.h @@ -0,0 +1,34 @@ +#import + +/// Braintree SDK Logging Levels +typedef NS_ENUM(NSUInteger, BTLogLevel) { + + /// Suppress all log output + BTLogLevelNone = 0, + + /// Only log critical issues (e.g. irrecoverable errors) + BTLogLevelCritical = 1, + + /// Log errors (e.g. expected or recoverable errors) + BTLogLevelError = 2, + + /// Log warnings (e.g. use of pre-release features) + BTLogLevelWarning = 3, + + /// Log basic information (e.g. state changes, network activity) + BTLogLevelInfo = 4, + + /// Log debugging statements (anything and everything) + BTLogLevelDebug = 5 +}; + +/// Braintree leveled logger +@interface BTLogger : NSObject + +/// The logger singleton used by the Braintree SDK ++ (instancetype)sharedLogger; + +/// The current log level, with default value BTLogLevelInfo +@property (nonatomic, assign) BTLogLevel level; + +@end diff --git a/Pods/Braintree/Braintree/API/@Public/BTPayPalPaymentMethod.h b/Pods/Braintree/Braintree/API/@Public/BTPayPalPaymentMethod.h new file mode 100644 index 0000000..bae7cf9 --- /dev/null +++ b/Pods/Braintree/Braintree/API/@Public/BTPayPalPaymentMethod.h @@ -0,0 +1,17 @@ +#import "BTPaymentMethod.h" +#import "BTPostalAddress.h" + +/// A payment method returned by the Client API that represents a PayPal account associated with +/// a particular Braintree customer. +/// +/// @see BTPaymentMethod +/// @see BTMutablePayPalPaymentMethod +@interface BTPayPalPaymentMethod : BTPaymentMethod + +/// Email address associated with the PayPal Account. +@property (nonatomic, readonly, copy) NSString *email; + +/// The billing address. +@property (nonatomic, copy) BTPostalAddress *billingAddress; + +@end diff --git a/Pods/Braintree/Braintree/API/@Public/BTPaymentMethod.h b/Pods/Braintree/Braintree/API/@Public/BTPaymentMethod.h new file mode 100644 index 0000000..06eec45 --- /dev/null +++ b/Pods/Braintree/Braintree/API/@Public/BTPaymentMethod.h @@ -0,0 +1,15 @@ +#import + +/// A payment method returned by the Client API that represents a payment method associated with +/// a particular Braintree customer. +/// +/// See also: BTCardPaymentMethod and BTPayPalPaymentMethod. +@interface BTPaymentMethod : NSObject + +/// Unique token that, if unlocked, may be used to create payments +/// +/// Pass this value to the server for use as the `payment_method_nonce` +/// argument of Braintree server-side client library methods. +@property (nonatomic, readonly, copy) NSString *nonce; + +@end diff --git a/Pods/Braintree/Braintree/API/@Public/BTPostalAddress.h b/Pods/Braintree/Braintree/API/@Public/BTPostalAddress.h new file mode 100644 index 0000000..5fdfbf8 --- /dev/null +++ b/Pods/Braintree/Braintree/API/@Public/BTPostalAddress.h @@ -0,0 +1,23 @@ +#import + +@interface BTPostalAddress : NSObject + +/// Line 1 of the Address (eg. number, street, etc). +@property (nonatomic, copy) NSString *streetAddress; + +/// Optional line 2 of the Address (eg. suite, apt #, etc.). +@property (nonatomic, copy) NSString *extendedAddress; + +/// City name. +@property (nonatomic, copy) NSString *locality; + +/// 2 letter country code. +@property (nonatomic, copy) NSString *countryCodeAlpha2; + +/// Zip code or equivalent is usually required for countries that have them. For list of countries that do not have postal codes please refer to http://en.wikipedia.org/wiki/Postal_code. +@property (nonatomic, copy) NSString *postalCode; + +/// 2 letter code for US states, and the equivalent for other countries. +@property (nonatomic, copy) NSString *region; + +@end diff --git a/Pods/Braintree/Braintree/API/@Public/Braintree-API.h b/Pods/Braintree/Braintree/API/@Public/Braintree-API.h new file mode 100644 index 0000000..6a2f618 --- /dev/null +++ b/Pods/Braintree/Braintree/API/@Public/Braintree-API.h @@ -0,0 +1,7 @@ +/// All-in-one import for the Braintree iOS SDK + +#import +#import +#import +#import +#import diff --git a/Pods/Braintree/Braintree/API/@Public/Braintree-Version.h b/Pods/Braintree/Braintree/API/@Public/Braintree-Version.h new file mode 100644 index 0000000..d6c4a1a --- /dev/null +++ b/Pods/Braintree/Braintree/API/@Public/Braintree-Version.h @@ -0,0 +1 @@ +#define BRAINTREE_VERSION (@"3.9.9") diff --git a/Pods/Braintree/Braintree/API/App Switch/BTAppSwitch.h b/Pods/Braintree/Braintree/API/App Switch/BTAppSwitch.h new file mode 100644 index 0000000..e2dc5f9 --- /dev/null +++ b/Pods/Braintree/Braintree/API/App Switch/BTAppSwitch.h @@ -0,0 +1,28 @@ +#import +#import "BTAppSwitching.h" + +/// Type of payment app +typedef NS_ENUM(NSInteger, BTAppType) { + BTAppTypePayPal = 0, + BTAppTypeVenmo, + BTAppTypeApplePay, + BTAppTypeCoinbase, +}; + +NS_ASSUME_NONNULL_BEGIN + +@interface BTAppSwitch : NSObject + +@property (nonatomic, readwrite, copy) NSString *returnURLScheme; + ++ (instancetype)sharedInstance; + +- (BOOL)handleReturnURL:(NSURL *)url sourceApplication:(nullable NSString *)sourceApplication; + +- (void)addAppSwitching:(id)appSwitching forApp:(BTAppType)type; +- (void)removeAppSwitchingForApp:(BTAppType)type; +- (id )appSwitchingForApp:(BTAppType)type; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Braintree/Braintree/API/App Switch/BTAppSwitch.m b/Pods/Braintree/Braintree/API/App Switch/BTAppSwitch.m new file mode 100644 index 0000000..195d833 --- /dev/null +++ b/Pods/Braintree/Braintree/API/App Switch/BTAppSwitch.m @@ -0,0 +1,62 @@ +#import "BTAppSwitch.h" + +@interface BTAppSwitch () + +// Dictionary of id keyed by @(BTPaymentAppSwitchType) +@property (nonatomic, strong) NSMutableDictionary *appSwitchingInstances; + +@end + +@implementation BTAppSwitch + ++ (instancetype)sharedInstance { + static BTAppSwitch *instance; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + instance = [[BTAppSwitch alloc] init]; + }); + return instance; +} + +- (instancetype)init { + self = [super init]; + if (self) { + _appSwitchingInstances = [NSMutableDictionary dictionary]; + } + return self; +} + +- (void)setReturnURLScheme:(NSString *)returnURLScheme { + _returnURLScheme = returnURLScheme; + for (id switchingInstance in [self.appSwitchingInstances allValues]) { + [switchingInstance setReturnURLScheme:returnURLScheme]; + } +} + +- (BOOL)handleReturnURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication { + for (id switcher in [self.appSwitchingInstances allValues]) { + if ([switcher canHandleReturnURL:url sourceApplication:sourceApplication]) { + if ([switcher delegate]) { + [switcher handleReturnURL:url]; + } else { + // Fallback BTSwitchingDelegate here + } + return YES; + } + } + return NO; +} + +- (void)addAppSwitching:(id)appSwitching forApp:(BTAppType)type { + self.appSwitchingInstances[@(type)] = appSwitching; +} + +- (void)removeAppSwitchingForApp:(BTAppType)type { + [self.appSwitchingInstances removeObjectForKey:@(type)]; +} + +- (id )appSwitchingForApp:(BTAppType)type { + return self.appSwitchingInstances[@(type)]; +} + +@end diff --git a/Pods/Braintree/Braintree/API/App Switch/BTAppSwitchErrors.m b/Pods/Braintree/Braintree/API/App Switch/BTAppSwitchErrors.m new file mode 100644 index 0000000..d693f96 --- /dev/null +++ b/Pods/Braintree/Braintree/API/App Switch/BTAppSwitchErrors.m @@ -0,0 +1,3 @@ +#import "BTAppSwitchErrors.h" + +NSString *const BTAppSwitchErrorDomain = @"BTAppSwitchErrorDomain"; diff --git a/Pods/Braintree/Braintree/API/Client/BTAPIResponseParser.h b/Pods/Braintree/Braintree/API/Client/BTAPIResponseParser.h new file mode 100644 index 0000000..f4aa7ab --- /dev/null +++ b/Pods/Braintree/Braintree/API/Client/BTAPIResponseParser.h @@ -0,0 +1,32 @@ +#import + +@protocol BTValueTransforming +- (id)transformedValue:(id)value; +@end + +@interface BTAPIResponseParser : NSObject + ++ (instancetype)parserWithDictionary:(NSDictionary *)dictionary; + +- (instancetype)initWithDictionary:(NSDictionary *)dictionary NS_DESIGNATED_INITIALIZER; + +#pragma mark - Accessors with Specified Types + +- (NSString *)stringForKey:(NSString *)key; +- (NSArray *)arrayForKey:(NSString *)key; +- (NSSet *)setForKey:(NSString *)key; +- (NSDictionary *)dictionaryForKey:(NSString *)key; +- (NSURL *)URLForKey:(NSString *)key; + +#pragma mark - Accessors for Nested Resources + +- (BTAPIResponseParser *)responseParserForKey:(NSString *)key; + +#pragma mark - Accessors with Transformed Values + +- (id)objectForKey:(NSString *)key withValueTransformer:(id)valueTransformer; +- (NSArray *)arrayForKey:(NSString *)key withValueTransformer:(id)valueTransformer; +- (NSInteger)integerForKey:(NSString *)key withValueTransformer:(id)valueTransformer; +- (BOOL)boolForKey:(NSString *)key withValueTransformer:(id)valueTransformer; + +@end diff --git a/Pods/Braintree/Braintree/API/Client/BTAPIResponseParser.m b/Pods/Braintree/Braintree/API/Client/BTAPIResponseParser.m new file mode 100644 index 0000000..3022ad1 --- /dev/null +++ b/Pods/Braintree/Braintree/API/Client/BTAPIResponseParser.m @@ -0,0 +1,130 @@ +@import PassKit; + +#import "BTAPIResponseParser.h" + +@interface BTAPIResponseParser () +@property (nonatomic, strong) NSDictionary *apiDictionary; +@end + +@implementation BTAPIResponseParser + ++ (instancetype)parserWithDictionary:(NSDictionary *)dictionary { + return [[self alloc] initWithDictionary:dictionary]; +} + +- (instancetype)init { + return [self initWithDictionary:@{}]; +} + +- (instancetype)initWithDictionary:(NSDictionary *)dictionary { + if (![dictionary isKindOfClass:[NSDictionary class]]) { + return nil; + } + + self = [super init]; + if (self) { + self.apiDictionary = dictionary; + } + return self; +} + +- (id)copyWithZone:(NSZone *)zone { + return [BTAPIResponseParser parserWithDictionary:[self.apiDictionary copyWithZone:zone]]; +} + +#pragma mark - + +- (NSString *)stringForKey:(NSString *)key { + NSString *value = self.apiDictionary[key]; + return [value isKindOfClass:[NSString class]] ? value : nil; +} + +- (NSArray *)arrayForKey:(NSString *)key { + NSArray *value = self.apiDictionary[key]; + return [value isKindOfClass:[NSArray class]] ? value : nil; +} + +- (NSSet *)setForKey:(NSString *)key { + NSArray *value = self.apiDictionary[key]; + return [value isKindOfClass:[NSArray class]] ? [NSSet setWithArray:value] : nil; +} + +- (NSURL *)URLForKey:(NSString *)key { + NSString *urlString = [self stringForKey:key]; + if (!urlString) { + return nil; + } + + return [NSURL URLWithString:urlString]; +} + +- (NSDictionary *)dictionaryForKey:(NSString *)key { + NSDictionary *value = self.apiDictionary[key]; + return [value isKindOfClass:[NSDictionary class]] ? value : nil; +} + +- (BTAPIResponseParser *)responseParserForKey:(NSString *)key { + return [BTAPIResponseParser parserWithDictionary:[self dictionaryForKey:key]]; +} + + +#pragma mark - Transformed Values + +- (id)objectForKey:(NSString *)key withValueTransformer:(id)valueTransformer { + id originalValue = self.apiDictionary[key]; + return [valueTransformer transformedValue:originalValue]; +} + +- (NSArray *)arrayForKey:(NSString *)key withValueTransformer:(id)valueTransformer { + NSArray *originalValue = [self arrayForKey:key]; + NSMutableArray *value = [NSMutableArray arrayWithCapacity:originalValue.count]; + for (id obj in originalValue) { + id transformedObj = [valueTransformer transformedValue:obj]; + if (transformedObj != [NSNull null]) { + [value addObject:transformedObj]; + } + } + return [value copy]; +} + +- (NSInteger)integerForKey:(NSString *)key withValueTransformer:(id)valueTransformer { + id originalValue = self.apiDictionary[key]; + id transformedValue = [valueTransformer transformedValue:originalValue]; + return [transformedValue isKindOfClass:[NSNumber class]] ? [transformedValue integerValue] : 0; +} + +- (BOOL)boolForKey:(NSString *)key withValueTransformer:(id)valueTransformer { + id originalValue = self.apiDictionary[key]; + id transformedValue = [valueTransformer transformedValue:originalValue]; + return [transformedValue isKindOfClass:[NSNumber class]] ? [transformedValue boolValue] : NO; +} + + +#pragma mark NSCoding + +- (id)initWithCoder:(NSCoder *)aDecoder { + NSDictionary *apiDictionary = [aDecoder decodeObjectForKey:@"apiDictionary"]; + return [self initWithDictionary:apiDictionary]; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:self.apiDictionary forKey:@"apiDictionary"]; +} + +#pragma mark NSObject Protocol + +- (BOOL)isEqual:(id)object { + if ([object isKindOfClass:[BTAPIResponseParser class]]) { + return (self == object) || [self.apiDictionary isEqual:[object apiDictionary]]; + } else { + return [super isEqual:object]; + } +} + +- (NSString *)debugDescription { + return [NSString stringWithFormat:@"", self, [self.apiDictionary debugDescription]]; +} + +@end + + diff --git a/Pods/Braintree/Braintree/API/Client/BTClient+Offline.m b/Pods/Braintree/Braintree/API/Client/BTClient+Offline.m new file mode 100644 index 0000000..f4984df --- /dev/null +++ b/Pods/Braintree/Braintree/API/Client/BTClient+Offline.m @@ -0,0 +1,41 @@ +#import "BTClient+Offline.h" +#import "BTClientToken.h" +#import "BTOfflineModeURLProtocol.h" +#import "BTOfflineClientBackend.h" +#import "BTConfiguration.h" + +@implementation BTClient (Offline) + ++ (NSString *)offlineTestClientTokenWithAdditionalParameters:(NSDictionary *)overrides { + NSMutableDictionary *clientTokenDataDictionary = + [NSMutableDictionary dictionaryWithDictionary:@{BTClientTokenKeyVersion: @2, + BTClientTokenKeyAuthorizationFingerprint: @"an_authorization_fingerprint", + BTClientTokenKeyConfigURL: [BTOfflineModeClientApiBaseURL stringByAppendingString:@"/configuration"], + // New BTConfiguration constants are the same as the BTClientToken ones were; + // Ensure that old behavior still works. + BTConfigurationKeyClientApiURL: BTOfflineModeClientApiBaseURL, + BTConfigurationKeyApplePay: @{ + BTConfigurationKeyStatus: @"mock", + @"countryCode": @"US", + @"currencyCode": @"USD", + @"merchantIdentifier": @"merchant-id-apple-pay", + @"supportedNetworks": @[ + @"visa", + @"mastercard", + @"amex" + ] + } + }]; + + [clientTokenDataDictionary addEntriesFromDictionary:overrides]; + + NSData *clientTokenData = [NSJSONSerialization dataWithJSONObject:clientTokenDataDictionary + options:0 + error:NULL]; + NSString *clientToken = [clientTokenData base64EncodedStringWithOptions:0]; + [BTOfflineModeURLProtocol setBackend:[BTOfflineClientBackend new]]; + + return clientToken; +} + +@end diff --git a/Pods/Braintree/Braintree/API/Client/BTClient+Testing.m b/Pods/Braintree/Braintree/API/Client/BTClient+Testing.m new file mode 100644 index 0000000..997c2dd --- /dev/null +++ b/Pods/Braintree/Braintree/API/Client/BTClient+Testing.m @@ -0,0 +1,171 @@ +#import "BTClient_Internal.h" +#import "BTClient+Testing.h" + +#import "BTHTTP.h" + +NSString *BTClientTestConfigurationKeyMerchantIdentifier = @"merchant_id"; +NSString *BTClientTestConfigurationKeyPublicKey = @"publicKey"; +NSString *BTClientTestConfigurationKeyCustomer = @"customer"; +NSString *BTClientTestConfigurationKeyNoCustomer = @"no_customer"; +NSString *BTClientTestConfigurationKeySharedCustomerIdentifier = @"sharedCustomerIdentifier"; +NSString *BTClientTestConfigurationKeySharedCustomerIdentifierType = @"sharedCustomerIdentifierType"; +NSString *BTClientTestConfigurationKeyPayPalClientId = @"paypalClientId"; +NSString *BTClientTestConfigurationKeyRevoked = @"authorizationFingerprintRevoked"; +NSString *BTClientTestConfigurationKeyClientTokenVersion = @"tokenVersion"; +NSString *BTClientTestConfigurationKeyAnalytics = @"analytics"; +NSString *BTClientTestConfigurationKeyURL = @"url"; +NSString *BTClientTestConfigurationKeyMerchantAccountIdentifier = @"merchantAccountId"; + +NSString *BTClientTestDefaultMerchantIdentifier = @"integration_merchant_id"; + +@implementation BTClient (Testing) + ++ (void)testClientWithConfiguration:(NSDictionary *)configurationDictionary async:(BOOL)async completion:(void (^)(BTClient *client))completionBlock { + NSAssert(completionBlock != nil, @"Completion is required in %s", __FUNCTION__); + + BTHTTP *http = [[BTHTTP alloc] initWithBaseURL:[[self class] testClientApiURLForMerchant:configurationDictionary[BTClientTestConfigurationKeyMerchantIdentifier]]]; + + NSMutableDictionary *overrides = [NSMutableDictionary dictionaryWithDictionary:configurationDictionary]; + NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; + NSArray *topLevelParams = @[ BTClientTestConfigurationKeyMerchantIdentifier, + BTClientTestConfigurationKeyPublicKey, + BTClientTestConfigurationKeyCustomer, + BTClientTestConfigurationKeyNoCustomer, + BTClientTestConfigurationKeyClientTokenVersion, + BTClientTestConfigurationKeyRevoked, + BTClientTestConfigurationKeySharedCustomerIdentifierType, + BTClientTestConfigurationKeySharedCustomerIdentifier, + BTClientTestConfigurationKeyMerchantAccountIdentifier, ]; + + for (NSString *topLevelParam in topLevelParams) { + if (configurationDictionary[topLevelParam]) { + parameters[topLevelParam] = configurationDictionary[topLevelParam]; + } + [overrides removeObjectForKey:topLevelParam]; + } + parameters[@"overrides"] = overrides; + + [http POST:@"testing/client_token" + parameters:parameters + completion:^(BTHTTPResponse *response, __unused NSError *error) { + if (error != nil) { + NSLog(@"testing/client_token failed or responded with an error: %@", error); + NSLog(@"\n\n====================================================================\n= ARE YOU RUNNING THE GATEWAY ON http://localhost:3000? =\n====================================================================\n\n"); + @throw [NSException exceptionWithName:NSInternalInconsistencyException reason:nil userInfo:nil]; + } + + NSString *clientTokenString = [response.object stringForKey:@"clientToken"]; + if (async) { + [BTClient setupWithClientToken:clientTokenString completion:^(BTClient *client, NSError *error) { + NSAssert(client != nil, @"BTClient setup failed with error = %@", error); + if (client == nil) { NSLog(@"BTClient setup failed with error = %@", error); } + completionBlock(client); + }]; + } else { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + completionBlock([(BTClient *)[BTClient alloc] initWithClientToken:clientTokenString]); +#pragma clang diagnostic pop + } + + }]; +} + +- (void)fetchNonceInfo:(NSString *)nonce success:(BTClientNonceInfoSuccessBlock)successBlock failure:(BTClientFailureBlock)failureBlock { + NSMutableCharacterSet *nonceParamCharacterSet = [NSMutableCharacterSet alphanumericCharacterSet]; + [nonceParamCharacterSet addCharactersInString:@"-"]; + + NSString *path = [NSString stringWithFormat:@"nonces/%@", [nonce stringByAddingPercentEncodingWithAllowedCharacters:nonceParamCharacterSet]]; + + [self.clientApiHttp GET:path parameters:[self defaultRequestParameters] completion:^(BTHTTPResponse *response, NSError *error) { + if (response.isSuccess) { + if (successBlock != nil) { + successBlock([response.object dictionaryForKey:@"nonce"]); + } + } else { + NSError *returnedError = error; + if (error.domain == BTBraintreeAPIErrorDomain && error.code == BTMerchantIntegrationErrorNotFound) { + returnedError = [NSError errorWithDomain:error.domain + code:BTMerchantIntegrationErrorNonceNotFound + userInfo:@{NSUnderlyingErrorKey: error}]; + } + if (failureBlock != nil) { + failureBlock(returnedError); + } + } + }]; +} + +- (void)fetchNonceThreeDSecureVerificationInfo:(NSString *)nonce + success:(BTClientNonceInfoSuccessBlock)successBlock + failure:(BTClientFailureBlock)failureBlock { + NSMutableCharacterSet *nonceParamCharacterSet = [NSMutableCharacterSet alphanumericCharacterSet]; + [nonceParamCharacterSet addCharactersInString:@"-"]; + + NSString *path = [NSString stringWithFormat:@"testing/three_d_secure_verifications/nonce/%@", [nonce stringByAddingPercentEncodingWithAllowedCharacters:nonceParamCharacterSet]]; + + NSDictionary *params = @{ @"public_key": @"integration_public_key", }; + [self.clientApiHttp GET:path parameters:params completion:^(BTHTTPResponse *response, NSError *error) { + if (response.isSuccess) { + if (successBlock != nil) { + successBlock([response.object dictionaryForKey:@"threeDSecureVerification"]); + } + } else { + NSError *returnedError = error; + if (error.domain == BTBraintreeAPIErrorDomain && error.code == BTMerchantIntegrationErrorNotFound) { + returnedError = [NSError errorWithDomain:error.domain + code:BTMerchantIntegrationErrorNonceNotFound + userInfo:@{NSUnderlyingErrorKey: error}]; + } + if (failureBlock != nil) { + failureBlock(returnedError); + } + } + }]; +} + +- (void)revokeAuthorizationFingerprintForTestingWithSuccess:(void (^)(void))successBlock + failure:(BTClientFailureBlock)failureBlock { + [self.clientApiHttp DELETE:@"testing/authorization_fingerprints" + parameters:[self defaultRequestParameters] + completion:^(BTHTTPResponse *response, NSError *error) { + if (response.isSuccess) { + if (successBlock) { + successBlock(); + } + } else { + if (failureBlock) { + failureBlock(error); + } + } + }]; +} + +- (void)updateCoinbaseMerchantOptions:(NSDictionary *)dictionary + success:(void (^)(void))successBlock + failure:(BTClientFailureBlock)failureBlock { + [self.clientApiHttp PUT:@"testing/mock_coinbase_merchant_options" + parameters:@{ @"authorization_fingerprint": self.clientToken.authorizationFingerprint, + @"coinbase_merchant_options": dictionary } + completion:^(BTHTTPResponse *response, NSError *error) { + if (response.isSuccess) { + if (successBlock) { + successBlock(); + } + } else { + if (failureBlock) { + failureBlock(error); + } + } + }]; +} + +- (NSDictionary *)defaultRequestParameters { + return @{ @"authorization_fingerprint": self.clientToken.authorizationFingerprint }; +} + ++ (NSURL *)testClientApiURLForMerchant:(NSString *)merchantIdentifier { + return [NSURL URLWithString:[NSString stringWithFormat:@"http://localhost:3000/merchants/%@/client_api/", merchantIdentifier ?: BTClientTestDefaultMerchantIdentifier]]; +} + +@end diff --git a/Pods/Braintree/Braintree/API/Client/BTClient.m b/Pods/Braintree/Braintree/API/Client/BTClient.m new file mode 100644 index 0000000..acda49d --- /dev/null +++ b/Pods/Braintree/Braintree/API/Client/BTClient.m @@ -0,0 +1,692 @@ +#import + +#import "BTClient_Internal.h" +#import "BTClientToken.h" +#import "BTConfiguration.h" +#import "BTLogger_Internal.h" +#import "BTMutablePaymentMethod.h" +#import "BTMutablePayPalPaymentMethod.h" +#import "BTMutableCardPaymentMethod.h" +#import "BTMutableApplePayPaymentMethod.h" +#import "BTHTTP.h" +#import "BTOfflineModeURLProtocol.h" +#import "BTAnalyticsMetadata.h" +#import "Braintree-Version.h" +#import "BTAPIResponseParser.h" +#import "BTClientPaymentMethodValueTransformer.h" +#import "BTCoinbasePaymentMethod_Internal.h" + +@interface BTClient () +- (void)setMetadata:(BTClientMetadata *)metadata; +@end + +@implementation BTClient + ++ (void)setupWithClientToken:(NSString *)clientTokenString completion:(BTClientCompletionBlock)completionBlock { + BTClient *client = [[self alloc] initSyncWithClientTokenString:clientTokenString]; + + if (client) { + [client fetchConfigurationWithCompletion:^(BTClient *client, NSError *error) { + if (client && !error) { + client.hasConfiguration = YES; + } + completionBlock(client, error); + }]; + } else { + completionBlock(nil, [NSError errorWithDomain:BTBraintreeAPIErrorDomain code:BTMerchantIntegrationErrorInvalidClientToken userInfo:@{NSLocalizedDescriptionKey: @"BTClient could not initialize because the provided clientToken was invalid"}]); + } +} + +- (instancetype)initWithClientToken:(NSString *)clientTokenString { + return [self initSyncWithClientTokenString:clientTokenString]; +} + +- (instancetype)initSyncWithClientTokenString:(NSString *)clientTokenString { + if(![clientTokenString isKindOfClass:[NSString class]]){ + NSString *reason = @"BTClient could not initialize because the provided clientToken was invalid"; + [[BTLogger sharedLogger] error:reason]; + return nil; + } + + self = [self init]; + if (self) { + NSError *error; + self.clientToken = [[BTClientToken alloc] initWithClientTokenString:clientTokenString error:&error]; + // Previously, error was ignored. Now, we at least log it + if (error) { [[BTLogger sharedLogger] error:[error localizedDescription]]; } + if (!self.clientToken) { + NSString *reason = @"BTClient could not initialize because the provided clientToken was invalid"; + [[BTLogger sharedLogger] error:reason]; + return nil; + } + + // For older integrations + self.configuration = [[BTConfiguration alloc] initWithResponseParser:[self.clientToken clientTokenParser] error:&error]; + if (error) { [[BTLogger sharedLogger] error:[error localizedDescription]]; } + + self.configHttp = [[BTHTTP alloc] initWithBaseURL:self.clientToken.configURL]; + [self.configHttp setProtocolClasses:@[[BTOfflineModeURLProtocol class]]]; + + [self prepareHttpFromConfiguration]; + + self.metadata = [[BTClientMetadata alloc] init]; + } + return self; +} + +- (void)prepareHttpFromConfiguration { + self.clientApiHttp = [[BTHTTP alloc] initWithBaseURL:self.configuration.clientApiURL]; + [self.clientApiHttp setProtocolClasses:@[[BTOfflineModeURLProtocol class]]]; + + if (self.configuration.analyticsEnabled) { + self.analyticsHttp = [[BTHTTP alloc] initWithBaseURL:self.configuration.analyticsURL]; + [self.analyticsHttp setProtocolClasses:@[[BTOfflineModeURLProtocol class]]]; + } +} + +- (void)fetchConfigurationWithCompletion:(BTClientCompletionBlock)completionBlock { + NSDictionary *parameters = @{ @"authorization_fingerprint": self.clientToken.authorizationFingerprint, @"config_version": @3 }; + [self.configHttp GET:nil + parameters:parameters + completion:^(BTHTTPResponse *response, NSError *error) { + if (response.isSuccess) { + NSError *configurationError; + self.configuration = [[BTConfiguration alloc] initWithResponseParser:response.object error:&configurationError]; + + [self prepareHttpFromConfiguration]; + + if (completionBlock) { + completionBlock(self, configurationError); + } + } else { + if (!error) { + error = [NSError errorWithDomain:BTBraintreeAPIErrorDomain + code:BTServerErrorGatewayUnavailable + userInfo:@{NSLocalizedDescriptionKey: + @"Braintree did not return a successful response, and no underlying error was provided."}]; + } + if (completionBlock) { + completionBlock(nil, error); + } + } + }]; +} + +- (id)copyWithZone:(NSZone *)zone { + BTClient *copiedClient = [[BTClient allocWithZone:zone] init]; + copiedClient.additionalPayPalScopes = [_additionalPayPalScopes copy]; + copiedClient.clientToken = [_clientToken copy]; + copiedClient.configuration = [_configuration copy]; + copiedClient.clientApiHttp = [_clientApiHttp copy]; + copiedClient.analyticsHttp = [_analyticsHttp copy]; + copiedClient.metadata = [self.metadata copy]; + copiedClient.configHttp = [_configHttp copy]; + copiedClient.hasConfiguration = _hasConfiguration; + return copiedClient; +} + +#pragma mark - Configuration + +- (NSSet *)challenges { + return self.configuration.challenges; +} + +- (NSString *)merchantId { + return self.configuration.merchantId; +} + +#pragma mark - NSCoding methods + +// NB: This is not yet used and has not been fully tested. + +- (void)encodeWithCoder:(NSCoder *)coder{ + [coder encodeObject:self.clientToken forKey:@"clientToken"]; + [coder encodeObject:self.configuration forKey:@"configuration"]; + [coder encodeObject:@(self.hasConfiguration) forKey:@"hasConfiguration"]; +} + +- (id)initWithCoder:(NSCoder *)decoder{ + self = [super init]; + if (self){ + self.clientToken = [decoder decodeObjectForKey:@"clientToken"]; + self.configuration = [decoder decodeObjectForKey:@"configuration"]; + + self.configHttp = [[BTHTTP alloc] initWithBaseURL:self.clientToken.configURL]; + [self.configHttp setProtocolClasses:@[[BTOfflineModeURLProtocol class]]]; + + self.clientApiHttp = [[BTHTTP alloc] initWithBaseURL:self.configuration.clientApiURL]; + [self.clientApiHttp setProtocolClasses:@[[BTOfflineModeURLProtocol class]]]; + + if (self.configuration.analyticsEnabled) { + self.analyticsHttp = [[BTHTTP alloc] initWithBaseURL:self.configuration.analyticsURL]; + [self.analyticsHttp setProtocolClasses:@[[BTOfflineModeURLProtocol class]]]; + } + + self.hasConfiguration = [[decoder decodeObjectForKey:@"hasConfiguration"] boolValue]; + } + return self; +} + +#pragma mark - API Methods + +- (void)fetchPaymentMethodsWithSuccess:(BTClientPaymentMethodListSuccessBlock)successBlock + failure:(BTClientFailureBlock)failureBlock { + NSDictionary *parameters = @{ + @"authorization_fingerprint": self.clientToken.authorizationFingerprint, + }; + + [self.clientApiHttp GET:@"v1/payment_methods" parameters:parameters completion:^(BTHTTPResponse *response, NSError *error) { + if (response.isSuccess) { + if (successBlock) { + NSArray *paymentMethods = [response.object arrayForKey:@"paymentMethods" + withValueTransformer:[BTClientPaymentMethodValueTransformer sharedInstance]]; + + successBlock(paymentMethods); + } + } else { + if (failureBlock) { + failureBlock(error); + } + } + }]; +} + +- (void)fetchPaymentMethodWithNonce:(NSString *)nonce + success:(BTClientPaymentMethodSuccessBlock)successBlock + failure:(BTClientFailureBlock)failureBlock { + NSDictionary *parameters = @{ + @"authorization_fingerprint": self.clientToken.authorizationFingerprint, + }; + [self.clientApiHttp GET:[NSString stringWithFormat:@"v1/payment_methods/%@", nonce] + parameters:parameters + completion:^(BTHTTPResponse *response, NSError *error) { + if (response.isSuccess) { + if (successBlock) { + NSArray *paymentMethods = [response.object arrayForKey:@"paymentMethods" withValueTransformer:[BTClientPaymentMethodValueTransformer sharedInstance]]; + + successBlock([paymentMethods firstObject]); + } + } else { + if (failureBlock) { + failureBlock(error); + } + } + }]; +} + +- (void)saveCardWithRequest:(BTClientCardRequest *)request + success:(BTClientCardSuccessBlock)successBlock + failure:(BTClientFailureBlock)failureBlock { + + NSMutableDictionary *requestParameters = [self metaPostParameters]; + NSMutableDictionary *creditCardParams = [request.parameters mutableCopy]; + + [requestParameters addEntriesFromDictionary:@{ @"credit_card": creditCardParams, + @"authorization_fingerprint": self.clientToken.authorizationFingerprint + }]; + + [self.clientApiHttp POST:@"v1/payment_methods/credit_cards" parameters:requestParameters completion:^(BTHTTPResponse *response, NSError *error) { + if (response.isSuccess) { + if (successBlock) { + NSArray *paymentMethods = [response.object arrayForKey:@"creditCards" + withValueTransformer:[BTClientPaymentMethodValueTransformer sharedInstance]]; + successBlock([paymentMethods firstObject]); + } + } else { + NSError *returnedError = error; + if (error.domain == BTBraintreeAPIErrorDomain && error.code == BTCustomerInputErrorInvalid) { + returnedError = [NSError errorWithDomain:error.domain + code:error.code + userInfo:@{BTCustomerInputBraintreeValidationErrorsKey: response.rawObject}]; + } + if (failureBlock) { + failureBlock(returnedError); + } + } + }]; +} + +// Deprecated +- (void)saveCardWithNumber:(NSString *)creditCardNumber + expirationMonth:(NSString *)expirationMonth + expirationYear:(NSString *)expirationYear + cvv:(NSString *)cvv + postalCode:(NSString *)postalCode + validate:(BOOL)shouldValidate + success:(BTClientCardSuccessBlock)successBlock + failure:(BTClientFailureBlock)failureBlock { + + BTClientCardRequest *request = [[BTClientCardRequest alloc] init]; + request.number = creditCardNumber; + request.expirationMonth = expirationMonth; + request.expirationYear = expirationYear; + request.cvv = cvv; + request.postalCode = postalCode; + request.shouldValidate = shouldValidate; + + [self saveCardWithRequest:request + success:successBlock + failure:failureBlock]; +} + +#if BT_ENABLE_APPLE_PAY +- (void)saveApplePayPayment:(PKPayment *)payment + success:(BTClientApplePaySuccessBlock)successBlock + failure:(BTClientFailureBlock)failureBlock { + + if (![PKPayment class]) { + if (failureBlock) { + failureBlock([NSError errorWithDomain:BTBraintreeAPIErrorDomain + code:BTErrorUnsupported + userInfo:@{NSLocalizedDescriptionKey: @"Apple Pay is not supported on this device"}]); + } + return; + + } + + NSString *encodedPaymentData; + NSError *error; + switch (self.configuration.applePayStatus) { + case BTClientApplePayStatusOff: + error = [NSError errorWithDomain:BTBraintreeAPIErrorDomain + code:BTErrorUnsupported + userInfo:@{ NSLocalizedDescriptionKey: @"Apple Pay is not enabled for this merchant. Please ensure that Apple Pay is enabled in the control panel and then try saving an Apple Pay payment method again." }]; + [[BTLogger sharedLogger] warning:error.localizedDescription]; + break; + case BTClientApplePayStatusMock: { + NSDictionary *mockPaymentDataDictionary = @{ + @"version": @"hello-version", + @"data": @"hello-data", + @"header": @{ + @"transactionId": @"hello-transaction-id", + @"ephemeralPublicKey": @"hello-ephemeral-public-key", + @"publicKeyHash": @"hello-public-key-hash" + }}; + NSError *error; + NSData *paymentData = [NSJSONSerialization dataWithJSONObject:mockPaymentDataDictionary options:0 error:&error]; + NSAssert(error == nil, @"Unexpected JSON serialization error: %@", error); + encodedPaymentData = [paymentData base64EncodedStringWithOptions:0]; + break; + } + + case BTClientApplePayStatusProduction: + if (!payment) { + [[BTLogger sharedLogger] warning:@"-[BTClient saveApplePayPayment:success:failure:] received nil payment."]; + NSError *error = [NSError errorWithDomain:BTBraintreeAPIErrorDomain + code:BTErrorUnsupported + userInfo:@{NSLocalizedDescriptionKey: @"A valid PKPayment is required in production"}]; + if (failureBlock) { + failureBlock(error); + } + return; + } + + encodedPaymentData = [payment.token.paymentData base64EncodedStringWithOptions:0]; + break; + default: + return; + } + + if (error) { + if (failureBlock) { + failureBlock(error); + } + return; + } + + NSMutableDictionary *tokenParameterValue = [NSMutableDictionary dictionary]; + if (encodedPaymentData) { + tokenParameterValue[@"paymentData"] = encodedPaymentData; + } + + // iOS 9 path: PKPaymentToken -paymentMethod is new in iOS 9 + if ([payment.token respondsToSelector:@selector(paymentMethod)]) { + if (payment.token.paymentMethod.network) { + tokenParameterValue[@"paymentNetwork"] = payment.token.paymentMethod.network; + } + + if (payment.token.paymentMethod.displayName) { + tokenParameterValue[@"paymentInstrumentName"] = payment.token.paymentMethod.displayName; + } + } else { + // iOS 8 path: methods were deprecated in iOS 9 +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + if (payment.token.paymentInstrumentName) { + tokenParameterValue[@"paymentInstrumentName"] = payment.token.paymentInstrumentName; + } + + if (payment.token.paymentNetwork) { + tokenParameterValue[@"paymentNetwork"] = payment.token.paymentNetwork; + } +#pragma clang diagnostic pop + } + + if (payment.token.transactionIdentifier) { + tokenParameterValue[@"transactionIdentifier"] = payment.token.transactionIdentifier; + } + + NSMutableDictionary *requestParameters = [self metaPostParameters]; + [requestParameters addEntriesFromDictionary:@{ @"applePaymentToken": tokenParameterValue, + @"authorization_fingerprint": self.clientToken.authorizationFingerprint, + }]; + + [self.clientApiHttp POST:@"v1/payment_methods/apple_payment_tokens" parameters:requestParameters completion:^(BTHTTPResponse *response, NSError *error){ + if (response.isSuccess) { + if (successBlock){ + NSArray *applePayCards = [response.object arrayForKey:@"applePayCards" withValueTransformer:[BTClientPaymentMethodValueTransformer sharedInstance]]; + + BTMutableApplePayPaymentMethod *paymentMethod = [applePayCards firstObject]; + + paymentMethod.shippingMethod = payment.shippingMethod; + + // iOS 9 path: shippingContact and billingContact are new in iOS 9 + if ([payment respondsToSelector:@selector(shippingContact)]) { + paymentMethod.shippingContact = payment.shippingContact; + paymentMethod.billingContact = payment.billingContact; + } + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + // To ensure backwards compatibility with old iOS 8 code, always pass through the deprecated addresses, even on iOS 9 devices + paymentMethod.shippingAddress = payment.shippingAddress; + paymentMethod.billingAddress = payment.billingAddress; +#pragma clang diagnostic pop + + successBlock([paymentMethod copy]); + } + } else { + if (failureBlock) { + NSDictionary *userInfo; + if (error) { + userInfo = @{NSUnderlyingErrorKey: error, + @"statusCode": @(response.statusCode)}; + } + failureBlock([NSError errorWithDomain:BTBraintreeAPIErrorDomain code:BTUnknownError userInfo:userInfo]); + } + } + }]; +} +#endif + +- (void)savePaypalPaymentMethodWithAuthCode:(NSString *)authCode + applicationCorrelationID:(NSString *)correlationId + success:(BTClientPaypalSuccessBlock)successBlock + failure:(BTClientFailureBlock)failureBlock { + return [self savePaypalPaymentMethodWithAuthCode:authCode + optionalApplicationCorrelationID:correlationId + success:successBlock + failure:failureBlock]; +} + +// Required since correlationId in the signature above is __nonnull +- (void)savePaypalPaymentMethodWithAuthCode:(NSString *)authCode + optionalApplicationCorrelationID:(NSString *)correlationId + success:(BTClientPaypalSuccessBlock)successBlock + failure:(BTClientFailureBlock)failureBlock { + NSMutableDictionary *requestParameters = [self metaPostParameters]; + // To preserve backwards compatibility - only set shouldValidate to FALSE when requesting additional scopes + BOOL shouldValidate = [self.additionalPayPalScopes count] == 0; + [requestParameters addEntriesFromDictionary:@{ @"paypal_account": @{ + @"consent_code": authCode ?: NSNull.null, + @"correlation_id": correlationId ?: NSNull.null, + @"options": @{@"validate": @(shouldValidate)} + }, + @"authorization_fingerprint": self.clientToken.authorizationFingerprint + + }]; + + [self.clientApiHttp POST:@"v1/payment_methods/paypal_accounts" parameters:requestParameters completion:^(BTHTTPResponse *response, NSError *error){ + if (response.isSuccess) { + if (successBlock){ + NSArray *payPalPaymentMethods = [response.object arrayForKey:@"paypalAccounts" withValueTransformer:[BTClientPaymentMethodValueTransformer sharedInstance]]; + BTPayPalPaymentMethod *payPalPaymentMethod = [payPalPaymentMethods firstObject]; + + successBlock(payPalPaymentMethod); + } + } else { + if (failureBlock) { + failureBlock([NSError errorWithDomain:BTBraintreeAPIErrorDomain + code:BTUnknownError // TODO - use a client error code + userInfo:@{NSUnderlyingErrorKey: error}]); + } + } + }]; +} + +// Deprecated +- (void)savePaypalPaymentMethodWithAuthCode:(NSString *)authCode + success:(BTClientPaypalSuccessBlock)successBlock + failure:(BTClientFailureBlock)failureBlock { + [self savePaypalPaymentMethodWithAuthCode:authCode + optionalApplicationCorrelationID:nil + success:successBlock + failure:failureBlock]; +} + +// Deprecated +- (void)savePaypalPaymentMethodWithAuthCode:(NSString *)authCode + correlationId:(NSString *)correlationId + success:(BTClientPaypalSuccessBlock)successBlock + failure:(BTClientFailureBlock)failureBlock { + [self savePaypalPaymentMethodWithAuthCode:authCode + applicationCorrelationID:correlationId + success:successBlock + failure:failureBlock]; +} + +- (void)postAnalyticsEvent:(NSString *)eventKind + success:(BTClientAnalyticsSuccessBlock)successBlock + failure:(BTClientFailureBlock)failureBlock { + + if (self.configuration.analyticsEnabled) { + NSMutableDictionary *requestParameters = [self metaAnalyticsParameters]; + [requestParameters addEntriesFromDictionary:@{ @"analytics": @[@{ @"kind": eventKind }], + @"authorization_fingerprint": self.clientToken.authorizationFingerprint + }]; + + [[BTLogger sharedLogger] debug:@"BTClient postAnalyticsEvent:%@ session:%@", eventKind, self.metadata.sessionId]; + + [self.analyticsHttp POST:@"/" + parameters:requestParameters + completion:^(BTHTTPResponse *response, NSError *error) { + if (response.isSuccess) { + if (successBlock) { + successBlock(); + } + } else { + if (failureBlock) { + failureBlock(error); + } + } + }]; + } else { + if (successBlock) { + successBlock(); + } + } +} + +#pragma mark 3D Secure Lookup + +- (void)lookupNonceForThreeDSecure:(NSString *)nonce + transactionAmount:(NSDecimalNumber *)amount + success:(BTClientThreeDSecureLookupSuccessBlock)successBlock + failure:(BTClientFailureBlock)failureBlock { + NSMutableDictionary *requestParameters = [@{ @"authorization_fingerprint": self.clientToken.authorizationFingerprint, + @"amount": amount } mutableCopy]; + if (self.configuration.merchantAccountId) { + requestParameters[@"merchant_account_id"] = self.configuration.merchantAccountId; + } + NSString *urlSafeNonce = [nonce stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLPathAllowedCharacterSet]]; + [self.clientApiHttp POST:[NSString stringWithFormat:@"v1/payment_methods/%@/three_d_secure/lookup", urlSafeNonce] + parameters:requestParameters + completion:^(BTHTTPResponse *response, NSError *error){ + if (response.isSuccess) { + if (successBlock) { + BTThreeDSecureLookupResult *lookup = [[BTThreeDSecureLookupResult alloc] init]; + + BTAPIResponseParser *lookupResponse = [response.object responseParserForKey:@"lookup"]; + lookup.acsURL = [lookupResponse URLForKey:@"acsUrl"]; + lookup.PAReq = [lookupResponse stringForKey:@"pareq"]; + lookup.MD = [lookupResponse stringForKey:@"md"]; + lookup.termURL = [lookupResponse URLForKey:@"termUrl"]; + BTPaymentMethod *paymentMethod = [response.object objectForKey:@"paymentMethod" + withValueTransformer:[BTClientPaymentMethodValueTransformer sharedInstance]]; + if ([paymentMethod isKindOfClass:[BTCardPaymentMethod class]]) { + lookup.card = (BTCardPaymentMethod *)paymentMethod; + } + successBlock(lookup); + } + } else { + if (failureBlock) { + if (response.statusCode == 422) { + NSString *errorMessage = [[response.object responseParserForKey:@"error"] stringForKey:@"message"]; + NSDictionary *threeDSecureInfo = [response.object dictionaryForKey:@"threeDSecureInfo"]; + NSMutableDictionary *userInfo = [NSMutableDictionary dictionary]; + if (errorMessage) { + userInfo[NSLocalizedDescriptionKey] = errorMessage; + } + if (threeDSecureInfo) { + userInfo[BTThreeDSecureInfoKey] = threeDSecureInfo; + } + NSDictionary *errors = [response.object dictionaryForKey:@"error"]; + if (errors) { + userInfo[BTCustomerInputBraintreeValidationErrorsKey] = errors; + } + failureBlock([NSError errorWithDomain:error.domain + code:error.code + userInfo:userInfo]); + } else { + failureBlock(error); + } + } + } + }]; + +} + +- (void)saveCoinbaseAccount:(id)coinbaseAuthResponse + storeInVault:(BOOL)storeInVault + success:(BTClientCoinbaseSuccessBlock)successBlock + failure:(BTClientFailureBlock)failureBlock { + if (![coinbaseAuthResponse isKindOfClass:[NSDictionary class]]) { + if (failureBlock) { + failureBlock([NSError errorWithDomain:BTBraintreeAPIErrorDomain code:BTCustomerInputErrorInvalid userInfo:@{NSLocalizedDescriptionKey: @"Received an invalid Coinbase response for tokenization, expected an NSDictionary"}]); + } + return; + } + + if (storeInVault) { + NSMutableDictionary *mutableCoinbaseAuthResponse = [coinbaseAuthResponse mutableCopy]; + mutableCoinbaseAuthResponse[@"options"] = @{ @"store_in_vault": @YES }; + coinbaseAuthResponse = mutableCoinbaseAuthResponse; + } + + NSMutableDictionary *parameters = [self metaPostParameters]; + parameters[@"coinbase_account"] = coinbaseAuthResponse; + parameters[@"authorization_fingerprint"] = self.clientToken.authorizationFingerprint; + + [self.clientApiHttp POST:@"v1/payment_methods/coinbase_accounts" + parameters:parameters + completion:^(BTHTTPResponse *response, NSError *error){ + if (response.isSuccess) { + if (successBlock) { + BTCoinbasePaymentMethod *paymentMethod = [[response.object arrayForKey:@"coinbaseAccounts" + withValueTransformer:[BTClientPaymentMethodValueTransformer sharedInstance]] firstObject]; + + successBlock(paymentMethod); + } + } else { + if (failureBlock) { + NSError *returnedError = error; + if (error.domain == BTBraintreeAPIErrorDomain && error.code == BTCustomerInputErrorInvalid) { + returnedError = [NSError errorWithDomain:error.domain + code:error.code + userInfo:@{BTCustomerInputBraintreeValidationErrorsKey: response.rawObject}]; + } + failureBlock(returnedError); + } + } + }]; +} + +#pragma mark Braintree Analytics + +- (void)postAnalyticsEvent:(NSString *)eventKind { + [self postAnalyticsEvent:eventKind success:nil failure:nil]; +} + + +#pragma mark - + +- (NSMutableDictionary *)metaPostParameters { + return [self mutableDictionaryCopyWithClientMetadata:nil]; +} + +- (NSMutableDictionary *)metaAnalyticsParameters { + return [self mutableDictionaryCopyWithClientMetadata:@{@"_meta": [BTAnalyticsMetadata metadata]}]; +} + +- (NSMutableDictionary *)mutableDictionaryCopyWithClientMetadata:(NSDictionary *)parameters { + NSMutableDictionary *result = parameters ? [parameters mutableCopy] : [NSMutableDictionary dictionary]; + NSDictionary *metaValue = result[@"_meta"]; + if (![metaValue isKindOfClass:[NSDictionary class]]) { + metaValue = @{}; + } + NSMutableDictionary *mutableMetaValue = [metaValue mutableCopy]; + mutableMetaValue[@"integration"] = self.metadata.integrationString; + mutableMetaValue[@"source"] = self.metadata.sourceString; + mutableMetaValue[@"sessionId"] = self.metadata.sessionId; + + result[@"_meta"] = mutableMetaValue; + return result; +} + + +#pragma mark - Debug + +- (NSString *)description { + return [NSString stringWithFormat:@"", self, self.clientApiHttp, self.analyticsHttp]; +} + +#pragma mark - Library Version + ++ (NSString *)libraryVersion { + return BRAINTREE_VERSION; +} + +- (BOOL)isEqualToClient:(BTClient *)client { + return ((self.clientToken == client.clientToken) || [self.clientToken isEqual:client.clientToken]) && + ((self.configuration == client.configuration) || [self.configuration isEqual:client.configuration]); +} + +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + + if ([object isKindOfClass:[BTClient class]]) { + return [self isEqualToClient:object]; + } + + return NO; +} + +#pragma mark - BTClient_Metadata + +- (void)setMetadata:(BTClientMetadata *)metadata { + _metadata = metadata; +} + +- (instancetype)copyWithMetadata:(void (^)(BTClientMutableMetadata *metadata))metadataBlock { + BTClientMutableMetadata *mutableMetadata = [self.metadata mutableCopy]; + if (metadataBlock) { + metadataBlock(mutableMetadata); + } + BTClient *copiedClient = [self copy]; + copiedClient.metadata = mutableMetadata; + return copiedClient; +} + +@end diff --git a/Pods/Braintree/Braintree/API/Client/BTClientMetadata.h b/Pods/Braintree/Braintree/API/Client/BTClientMetadata.h new file mode 100644 index 0000000..ffbfcde --- /dev/null +++ b/Pods/Braintree/Braintree/API/Client/BTClientMetadata.h @@ -0,0 +1,38 @@ +#import + +typedef NS_ENUM(NSInteger, BTClientMetadataSourceType) { + BTClientMetadataSourcePayPalSDK, + BTClientMetadataSourcePayPalApp, + BTClientMetadataSourceVenmoApp, + BTClientMetadataSourceForm, + BTClientMetadataSourceUnknown, + BTClientMetadataSourceCoinbaseApp, + BTClientMetadataSourceCoinbaseBrowser, +}; + +typedef NS_ENUM(NSInteger, BTClientMetadataIntegrationType) { + BTClientMetadataIntegrationCustom, + BTClientMetadataIntegrationDropIn, + BTClientMetadataIntegrationUnknown +}; + +@interface BTClientMetadata : NSObject + +@property (nonatomic, assign, readonly) BTClientMetadataIntegrationType integration; +@property (nonatomic, assign, readonly) BTClientMetadataSourceType source; + +@property (nonatomic, copy, readonly) NSString *integrationString; +@property (nonatomic, copy, readonly) NSString *sourceString; + +/// Auto-generated UUID +@property (nonatomic, copy, readonly) NSString *sessionId; + +@end + +@interface BTClientMutableMetadata : BTClientMetadata + +- (void)setIntegration:(BTClientMetadataIntegrationType)integration; +- (void)setSource:(BTClientMetadataSourceType)source; +- (void)setSessionId:(NSString *)sessionId; + +@end diff --git a/Pods/Braintree/Braintree/API/Client/BTClientMetadata.m b/Pods/Braintree/Braintree/API/Client/BTClientMetadata.m new file mode 100644 index 0000000..d570906 --- /dev/null +++ b/Pods/Braintree/Braintree/API/Client/BTClientMetadata.m @@ -0,0 +1,96 @@ +#import "BTClientMetadata.h" + +@interface BTClientMetadata () { + @protected + BTClientMetadataIntegrationType _integration; + BTClientMetadataSourceType _source; + NSString *_sessionId; +} +@end + +@implementation BTClientMetadata + +- (instancetype)init { + self = [super init]; + if (self) { + _integration = BTClientMetadataIntegrationCustom; + _source = BTClientMetadataSourceUnknown; + _sessionId = [[[NSUUID UUID] UUIDString] stringByReplacingOccurrencesOfString:@"-" withString:@""]; + } + return self; +} + +- (id)copyWithZone:(NSZone *)zone { + BTClientMetadata *copiedMetadata = [[BTClientMetadata allocWithZone:zone] init]; + copiedMetadata->_integration = _integration; + copiedMetadata->_source = _source; + copiedMetadata->_sessionId = [_sessionId copyWithZone:zone]; + return copiedMetadata; +} + +- (id)mutableCopyWithZone:(NSZone *)zone { + BTClientMutableMetadata *mutableMetadata = [[BTClientMutableMetadata allocWithZone:zone] init]; + mutableMetadata.integration = _integration; + mutableMetadata.source = _source; + mutableMetadata.sessionId = [_sessionId copyWithZone:zone]; + return mutableMetadata; +} + +- (NSString *)integrationString { + return [[self class] integrationToString:self.integration]; +} + +- (NSString *)sourceString { + return [[self class] sourceToString:self.source]; +} + +#pragma mark Internal helpers + ++ (NSString *)integrationToString:(BTClientMetadataIntegrationType)integration { + switch (integration) { + case BTClientMetadataIntegrationCustom: + return @"custom"; + case BTClientMetadataIntegrationDropIn: + return @"dropin"; + default: + return @"unknown"; + } +} + ++ (NSString *)sourceToString:(BTClientMetadataSourceType)source { + switch (source) { + case BTClientMetadataSourcePayPalSDK: + return @"paypal-sdk"; + case BTClientMetadataSourcePayPalApp: + return @"paypal-app"; + case BTClientMetadataSourceVenmoApp: + return @"venmo-app"; + case BTClientMetadataSourceForm: + return @"form"; + case BTClientMetadataSourceCoinbaseApp: + return @"coinbase-app"; + case BTClientMetadataSourceCoinbaseBrowser: + return @"coinbase-browser"; + default: + return @"unknown"; + } +} + +@end + + +@implementation BTClientMutableMetadata + +- (void)setIntegration:(BTClientMetadataIntegrationType)integration { + _integration = integration; +} + +- (void)setSource:(BTClientMetadataSourceType)source { + _source = source; +} + +- (void)setSessionId:(NSString *)sessionId { + _sessionId = sessionId; +} + +@end diff --git a/Pods/Braintree/Braintree/API/Client/BTClientPaymentMethodValueTransformer.h b/Pods/Braintree/Braintree/API/Client/BTClientPaymentMethodValueTransformer.h new file mode 100644 index 0000000..1a49b4d --- /dev/null +++ b/Pods/Braintree/Braintree/API/Client/BTClientPaymentMethodValueTransformer.h @@ -0,0 +1,13 @@ +#import + +#import "BTAPIResponseParser.h" +#import "BTPaymentMethod.h" +#import "BTCardPaymentMethod.h" +#import "BTPayPalPaymentMethod.h" +#import "BTApplePayPaymentMethod.h" + +@interface BTClientPaymentMethodValueTransformer : NSObject + ++ (instancetype)sharedInstance; + +@end diff --git a/Pods/Braintree/Braintree/API/Client/BTClientPaymentMethodValueTransformer.m b/Pods/Braintree/Braintree/API/Client/BTClientPaymentMethodValueTransformer.m new file mode 100644 index 0000000..4f7989c --- /dev/null +++ b/Pods/Braintree/Braintree/API/Client/BTClientPaymentMethodValueTransformer.m @@ -0,0 +1,104 @@ +#import "BTClientPaymentMethodValueTransformer.h" +#import "BTAPIResponseParser.h" +#import "BTMutablePaymentMethod.h" +#import "BTMutableCardPaymentMethod.h" +#import "BTMutablePayPalPaymentMethod.h" +#import "BTMutableApplePayPaymentMethod.h" +#import "BTCoinbasePaymentMethod_Internal.h" +#import "BTPostalAddress.h" +#import "BTPostalAddress_Internal.h" + +@implementation BTClientPaymentMethodValueTransformer + ++ (instancetype)sharedInstance { + static BTClientPaymentMethodValueTransformer *instance; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + instance = [[self alloc] init]; + }); + return instance; +} + +- (id)transformedValue:(id)value { + if (![value isKindOfClass:[NSDictionary class]]) { + return nil; + } + + BTAPIResponseParser *responseParser = [BTAPIResponseParser parserWithDictionary:value]; + + BTPaymentMethod *paymentMethod; + + NSString *type = [responseParser stringForKey:@"type"]; + if ([type isEqualToString:@"CreditCard"]) { + BTMutableCardPaymentMethod *card = [[BTMutableCardPaymentMethod alloc] init]; + + card.description = [responseParser stringForKey:@"description"]; + card.typeString = [[responseParser responseParserForKey:@"details"] stringForKey:@"cardType"]; + card.lastTwo = [[responseParser responseParserForKey:@"details"] stringForKey:@"lastTwo"]; + card.challengeQuestions = [responseParser setForKey:@"securityQuestions"]; + card.nonce = [responseParser stringForKey:@"nonce"]; + NSDictionary *threeDSecureInfoDict = [responseParser dictionaryForKey:@"threeDSecureInfo"]; + if (threeDSecureInfoDict) { + card.threeDSecureInfoDictionary = threeDSecureInfoDict; + } + paymentMethod = card; + } else if ([type isEqualToString:@"PayPalAccount"]) { + BTMutablePayPalPaymentMethod *payPal = [[BTMutablePayPalPaymentMethod alloc] init]; + + payPal.nonce = [responseParser stringForKey:@"nonce"]; + + BTAPIResponseParser *detailsParser = [responseParser responseParserForKey:@"details"]; + payPal.email = [detailsParser stringForKey:@"email"]; + NSDictionary *payerInfoDict = [detailsParser dictionaryForKey:@"payerInfo"]; + if (payerInfoDict && payerInfoDict[BTPostalAddressKeyAccountAddress]) { + NSDictionary *addressDictionary = payerInfoDict[BTPostalAddressKeyAccountAddress]; + payPal.billingAddress = [[BTPostalAddress alloc] init]; + payPal.billingAddress.streetAddress = addressDictionary[BTPostalAddressKeyStreetAddress]; + payPal.billingAddress.extendedAddress = addressDictionary[BTPostalAddressKeyExtendedAddress]; + payPal.billingAddress.locality = addressDictionary[BTPostalAddressKeyLocality]; + payPal.billingAddress.region = addressDictionary[BTPostalAddressKeyRegion]; + payPal.billingAddress.postalCode = addressDictionary[BTPostalAddressKeyPostalCode]; + payPal.billingAddress.countryCodeAlpha2 = addressDictionary[BTPostalAddressKeyCountry]; + } + + // Braintree gateway has some inconsistent behavior depending on + // the type of nonce, and sometimes returns "PayPal" for description, + // and sometimes returns a real identifying string. The former is not + // desirable for display. The latter is. + // As a workaround, we ignore descriptions that look like "PayPal". + id description = [responseParser stringForKey:@"description"]; + if (![[description lowercaseString] isEqualToString:@"paypal"]) { + payPal.description = description; + } + + paymentMethod = payPal; +#ifdef BT_ENABLE_APPLE_PAY + } else if ([type isEqualToString:@"ApplePayCard"]) { + BTMutableApplePayPaymentMethod *card = [[BTMutableApplePayPaymentMethod alloc] init]; + + card.nonce = [responseParser stringForKey:@"nonce"]; + card.description = [responseParser stringForKey:@"description"]; + card.challengeQuestions = [responseParser setForKey:@"securityQuestions"]; + + paymentMethod = card; +#endif + } else if ([type isEqualToString:@"CoinbaseAccount"]) { + BTCoinbasePaymentMethod *coinbaseAccount = [[BTCoinbasePaymentMethod alloc] init]; + coinbaseAccount.nonce = [responseParser stringForKey:@"nonce"]; + coinbaseAccount.email = [[responseParser responseParserForKey:@"details"] stringForKey:@"email"]; + coinbaseAccount.description = coinbaseAccount.email; + paymentMethod = coinbaseAccount; + } else { + BTMutablePaymentMethod *genericPaymentMethod = [[BTMutablePaymentMethod alloc] init]; + + genericPaymentMethod.nonce = [responseParser stringForKey:@"nonce"]; + genericPaymentMethod.description = [responseParser stringForKey:@"description"]; + genericPaymentMethod.challengeQuestions = [responseParser setForKey:@"securityQuestions"]; + + paymentMethod = genericPaymentMethod; + } + + return paymentMethod; +} + +@end diff --git a/Pods/Braintree/Braintree/API/Client/BTClientStore.h b/Pods/Braintree/Braintree/API/Client/BTClientStore.h new file mode 100644 index 0000000..e86b2ef --- /dev/null +++ b/Pods/Braintree/Braintree/API/Client/BTClientStore.h @@ -0,0 +1,11 @@ +#import +#import "BTClient.h" + +@interface BTClientStore : NSObject + +- (instancetype)initWithIdentifier:(NSString *)identifier; + +- (void)storeClient:(BTClient *)client; +- (BTClient *)fetchClient; + +@end diff --git a/Pods/Braintree/Braintree/API/Client/BTClientStore.m b/Pods/Braintree/Braintree/API/Client/BTClientStore.m new file mode 100644 index 0000000..7457f16 --- /dev/null +++ b/Pods/Braintree/Braintree/API/Client/BTClientStore.m @@ -0,0 +1,44 @@ +#import "BTClientStore.h" +#import "BTKeychain.h" +#import "BTClient_Internal.h" + +@interface BTClientStore () + +@property (nonatomic, copy, readonly) NSString *keychainKey; + +@end + +static NSString *const keyPrefix = @"BTAppSwitchClientStore."; + +@implementation BTClientStore + +- (instancetype)initWithIdentifier:(NSString *)identifier { + self = [self init]; + if (self) { + _keychainKey = [NSString stringWithFormat:@"%@%@", keyPrefix, identifier]; + } + return self; +} + +- (BTClient *)fetchClient { + NSData *clientData = [BTKeychain dataForKey:self.keychainKey]; + if (clientData == nil) { + return nil; + } + + NSKeyedUnarchiver *decoder = [[NSKeyedUnarchiver alloc] initForReadingWithData:clientData]; + BTClient *client = [[BTClient alloc] initWithCoder:decoder]; + [decoder finishDecoding]; + return client; +} + +- (void)storeClient:(BTClient *)client { + NSMutableData *clientData = [NSMutableData data]; + NSKeyedArchiver *coder = [[NSKeyedArchiver alloc] initForWritingWithMutableData:clientData]; + [client encodeWithCoder:coder]; + [coder finishEncoding]; + + [BTKeychain setData:clientData forKey:self.keychainKey]; +} + +@end diff --git a/Pods/Braintree/Braintree/API/Client/BTClientToken.m b/Pods/Braintree/Braintree/API/Client/BTClientToken.m new file mode 100644 index 0000000..31af9d1 --- /dev/null +++ b/Pods/Braintree/Braintree/API/Client/BTClientToken.m @@ -0,0 +1,208 @@ +#import "BTClientToken.h" +#import "BTAPIResponseParser.h" +#import "BTClientTokenApplePayStatusValueTransformer.h" +#import "BTClientTokenApplePayPaymentNetworksValueTransformer.h" +#import "BTClientTokenBooleanValueTransformer.h" + +NSString *const BTClientTokenKeyVersion = @"version"; +NSString *const BTClientTokenKeyAuthorizationFingerprint = @"authorizationFingerprint"; +NSString *const BTClientTokenKeyConfigURL = @"configUrl"; + +@interface BTClientToken () + +@property (nonatomic, readwrite, strong) BTAPIResponseParser *clientTokenParser; +@property (nonatomic, readwrite, copy) NSString *authorizationFingerprint; +@property (nonatomic, readwrite, strong) NSURL *configURL; + +/// Returns an incomplete client token for manual initialization +- (instancetype)init NS_DESIGNATED_INITIALIZER; + +@end + +@implementation BTClientToken + +- (instancetype)init { + return [super init]; +} + +- (instancetype)initWithClientTokenString:(NSString *)JSONString error:(NSError * __autoreleasing *)error { + self = [super init]; + if (self) { + // Client token must be decoded first because the other values are retrieved from it + self.clientTokenParser = [self decodeClientToken:JSONString error:error]; + self.authorizationFingerprint = [self.clientTokenParser stringForKey:BTClientTokenKeyAuthorizationFingerprint]; + self.configURL = [self.clientTokenParser URLForKey:BTClientTokenKeyConfigURL]; + + if (![self validateClientToken:error]) { + return nil; + } + } + return self; +} + +- (BOOL)validateClientToken:(NSError *__autoreleasing*)error { + if (error != NULL && *error) { + return NO; + } + + if ([self.authorizationFingerprint length] == 0) { + if (error != NULL) { + *error = [NSError errorWithDomain:BTBraintreeAPIErrorDomain + code:BTMerchantIntegrationErrorInvalidClientToken + userInfo:@{ + NSLocalizedDescriptionKey: @"Invalid client token. Please ensure your server is generating a valid Braintree ClientToken.", + NSLocalizedFailureReasonErrorKey: @"Authorization fingerprint was not present or invalid." }]; + } + return NO; + } + + if (![self.configURL isKindOfClass:[NSURL class]] || self.configURL.absoluteString.length == 0) { + if (error != NULL) { + *error = [NSError errorWithDomain:BTBraintreeAPIErrorDomain + code:BTMerchantIntegrationErrorInvalidClientToken + userInfo:@{ + NSLocalizedDescriptionKey: @"Invalid client token: config url was missing or invalid. Please ensure your server is generating a valid Braintree ClientToken." + }]; + } + return NO; + } + + return YES; +} + + +- (instancetype)copyWithZone:(NSZone *)zone { + BTClientToken *copiedClientToken = [[[self class] allocWithZone:zone] init]; + copiedClientToken.authorizationFingerprint = [_authorizationFingerprint copy]; + copiedClientToken.configURL = [_configURL copy]; + copiedClientToken.clientTokenParser = [self.clientTokenParser copy]; + return copiedClientToken; +} + + +#pragma mark JSON Parsing + +- (NSDictionary *)parseJSONString:(NSString *)rawJSONString error:(NSError * __autoreleasing *)error { + NSData *rawJSONData = [rawJSONString dataUsingEncoding:NSUTF8StringEncoding]; + + return [NSJSONSerialization JSONObjectWithData:rawJSONData options:0 error:error]; +} + + +#pragma mark NSCoding + +- (void)encodeWithCoder:(NSCoder *)coder { + [coder encodeObject:self.configURL forKey:@"configURL"]; + [coder encodeObject:self.authorizationFingerprint forKey:@"authorizationFingerprint"]; + [coder encodeObject:self.clientTokenParser forKey:@"claims"]; +} + +- (id)initWithCoder:(NSCoder *)decoder { + self = [self init]; + if (self){ + self.configURL = [decoder decodeObjectForKey:@"configURL"]; + self.authorizationFingerprint = [decoder decodeObjectForKey:@"authorizationFingerprint"]; + self.clientTokenParser = [decoder decodeObjectForKey:@"claims"]; + } + return self; +} + +#pragma mark Client Token Parsing + +- (BTAPIResponseParser *)decodeClientToken:(NSString *)rawClientTokenString error:(NSError * __autoreleasing *)error { + NSError *JSONError; + NSData *base64DecodedClientToken = [[NSData alloc] initWithBase64EncodedString:rawClientTokenString + options:0]; + + NSDictionary *rawClientToken; + if (base64DecodedClientToken) { + rawClientToken = [NSJSONSerialization JSONObjectWithData:base64DecodedClientToken options:0 error:&JSONError]; + } else { + rawClientToken = [self parseJSONString:rawClientTokenString error:&JSONError]; + } + + if (!rawClientToken) { + if (error) { + *error = [NSError errorWithDomain:BTBraintreeAPIErrorDomain + code:BTMerchantIntegrationErrorInvalidClientToken + userInfo:@{ NSUnderlyingErrorKey: JSONError, + NSLocalizedDescriptionKey: @"Invalid client token. Please ensure your server is generating a valid Braintree ClientToken.", + NSLocalizedFailureReasonErrorKey: @"Invalid JSON" }]; + } + return nil; + } + + if (![rawClientToken isKindOfClass:[NSDictionary class]]) { + if (error) { + *error = [NSError errorWithDomain:BTBraintreeAPIErrorDomain + code:BTMerchantIntegrationErrorInvalidClientToken + userInfo:@{ + NSLocalizedDescriptionKey: @"Invalid client token. Please ensure your server is generating a valid Braintree ClientToken.", + NSLocalizedFailureReasonErrorKey: @"Invalid JSON. Expected to find an object at JSON root." + }]; + } + return nil; + } + + NSError *clientTokenFormatError = [NSError errorWithDomain:BTBraintreeAPIErrorDomain + code:BTMerchantIntegrationErrorInvalidClientToken + userInfo:@{ + NSLocalizedDescriptionKey: @"Invalid client token format. Please pass the client token string directly as it is generated by the server-side SDK.", + NSLocalizedFailureReasonErrorKey: @"Unsupported client token format." + }]; + + switch ([rawClientToken[BTClientTokenKeyVersion] integerValue]) { + case 1: + if (base64DecodedClientToken) { + if (error) { + *error = clientTokenFormatError; + } + return nil; + } + break; + case 2: + /* FALLTHROUGH */ + case 3: + if (!base64DecodedClientToken) { + if (error) { + *error = clientTokenFormatError; + } + return nil; + } + break; + default: + if (error) { + *error = [NSError errorWithDomain:BTBraintreeAPIErrorDomain + code:BTMerchantIntegrationErrorInvalidClientToken + userInfo:@{ + NSLocalizedDescriptionKey: @"Invalid client token version. Please ensure your server is generating a valid Braintree ClientToken with a server-side SDK that is compatible with this version of Braintree iOS.", + NSLocalizedFailureReasonErrorKey: @"Unsupported client token version." + }]; + } + return nil; + } + + return [BTAPIResponseParser parserWithDictionary:rawClientToken]; +} + +- (NSString *)description { + return [NSString stringWithFormat:@"", self.authorizationFingerprint, self.configURL]; +} + +- (BOOL)isEqualToClientToken:(BTClientToken *)clientToken { + return (self.clientTokenParser == clientToken.clientTokenParser) || [self.clientTokenParser isEqual:clientToken.clientTokenParser]; +} + +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + + if ([object isKindOfClass:[BTClientToken class]]) { + return [self isEqualToClientToken:object]; + } + + return NO; +} + +@end diff --git a/Pods/Braintree/Braintree/API/Client/BTClientTokenApplePayPaymentNetworksValueTransformer.h b/Pods/Braintree/Braintree/API/Client/BTClientTokenApplePayPaymentNetworksValueTransformer.h new file mode 100644 index 0000000..f69434e --- /dev/null +++ b/Pods/Braintree/Braintree/API/Client/BTClientTokenApplePayPaymentNetworksValueTransformer.h @@ -0,0 +1,12 @@ +#if BT_ENABLE_APPLE_PAY +#import +@import PassKit; + +#import "BTAPIResponseParser.h" + +@interface BTClientTokenApplePayPaymentNetworksValueTransformer : NSObject + ++ (instancetype)sharedInstance; + +@end +#endif diff --git a/Pods/Braintree/Braintree/API/Client/BTClientTokenApplePayPaymentNetworksValueTransformer.m b/Pods/Braintree/Braintree/API/Client/BTClientTokenApplePayPaymentNetworksValueTransformer.m new file mode 100644 index 0000000..0686192 --- /dev/null +++ b/Pods/Braintree/Braintree/API/Client/BTClientTokenApplePayPaymentNetworksValueTransformer.m @@ -0,0 +1,33 @@ +#if BT_ENABLE_APPLE_PAY +#import "BTClientTokenApplePayPaymentNetworksValueTransformer.h" + +@implementation BTClientTokenApplePayPaymentNetworksValueTransformer + ++ (instancetype)sharedInstance { + static BTClientTokenApplePayPaymentNetworksValueTransformer *instance; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + instance = [[self alloc] init]; + }); + return instance; +} + +- (id)transformedValue:(id)value { + if ([PKPaymentRequest class]) { + if ([value isEqualToString:@"amex"]) { + return PKPaymentNetworkAmex; + } else if ([value isEqualToString:@"visa"]) { + return PKPaymentNetworkVisa; + } else if ([value isEqualToString:@"mastercard"]) { + return PKPaymentNetworkMasterCard; + } else if (&PKPaymentNetworkDiscover != NULL && [value isEqualToString:@"discover"]) { + return PKPaymentNetworkDiscover; + } + } + + return [NSNull null]; +} + +@end +#endif + diff --git a/Pods/Braintree/Braintree/API/Client/BTClientTokenApplePayStatusValueTransformer.h b/Pods/Braintree/Braintree/API/Client/BTClientTokenApplePayStatusValueTransformer.h new file mode 100644 index 0000000..5771fa3 --- /dev/null +++ b/Pods/Braintree/Braintree/API/Client/BTClientTokenApplePayStatusValueTransformer.h @@ -0,0 +1,13 @@ +#if BT_ENABLE_APPLE_PAY +#import +@import PassKit; + + +#import "BTAPIResponseParser.h" + +@interface BTClientTokenApplePayStatusValueTransformer : NSObject + ++ (instancetype)sharedInstance; + +@end +#endif diff --git a/Pods/Braintree/Braintree/API/Client/BTClientTokenApplePayStatusValueTransformer.m b/Pods/Braintree/Braintree/API/Client/BTClientTokenApplePayStatusValueTransformer.m new file mode 100644 index 0000000..68f5345 --- /dev/null +++ b/Pods/Braintree/Braintree/API/Client/BTClientTokenApplePayStatusValueTransformer.m @@ -0,0 +1,29 @@ +#if BT_ENABLE_APPLE_PAY +#import "BTClientTokenApplePayStatusValueTransformer.h" +#import "BTClientToken.h" +#import "BTConfiguration.h" // For BTClientApplePayStatus* enums + +@implementation BTClientTokenApplePayStatusValueTransformer + ++ (instancetype)sharedInstance { + static BTClientTokenApplePayStatusValueTransformer *instance; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + instance = [[self alloc] init]; + }); + return instance; +} + +- (id)transformedValue:(id)value { + if ([value isEqualToString:@"off"]) { + return @(BTClientApplePayStatusOff); + } else if ([value isEqualToString:@"mock"]) { + return @(BTClientApplePayStatusMock); + } else if ([value isEqualToString:@"production"]) { + return @(BTClientApplePayStatusProduction); + } + return [NSNull null]; +} + +@end +#endif diff --git a/Pods/Braintree/Braintree/API/Client/BTClientTokenBooleanValueTransformer.h b/Pods/Braintree/Braintree/API/Client/BTClientTokenBooleanValueTransformer.h new file mode 100644 index 0000000..67fdeea --- /dev/null +++ b/Pods/Braintree/Braintree/API/Client/BTClientTokenBooleanValueTransformer.h @@ -0,0 +1,9 @@ +#import + +#import "BTAPIResponseParser.h" + +@interface BTClientTokenBooleanValueTransformer : NSObject + ++ (instancetype)sharedInstance; + +@end diff --git a/Pods/Braintree/Braintree/API/Client/BTClientTokenBooleanValueTransformer.m b/Pods/Braintree/Braintree/API/Client/BTClientTokenBooleanValueTransformer.m new file mode 100644 index 0000000..d7c8fb1 --- /dev/null +++ b/Pods/Braintree/Braintree/API/Client/BTClientTokenBooleanValueTransformer.m @@ -0,0 +1,24 @@ +#import "BTClientTokenBooleanValueTransformer.h" + +@implementation BTClientTokenBooleanValueTransformer + ++ (instancetype)sharedInstance { + static BTClientTokenBooleanValueTransformer *instance; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + instance = [[self alloc] init]; + }); + return instance; +} + +- (id)transformedValue:(id)value { + if ([value isKindOfClass:[NSNumber class]]) { + return value; + } else if ([value isKindOfClass:[NSString class]] && [value length] > 0) { + return @YES; + } else { + return @NO; + } +} + +@end diff --git a/Pods/Braintree/Braintree/API/Client/BTClient_Internal.h b/Pods/Braintree/Braintree/API/Client/BTClient_Internal.h new file mode 100644 index 0000000..bbaf16d --- /dev/null +++ b/Pods/Braintree/Braintree/API/Client/BTClient_Internal.h @@ -0,0 +1,48 @@ +#import "BTClient.h" +#import "BTHTTP.h" +#import "BTClientToken.h" +#import "BTConfiguration.h" +#import "BTClientMetadata.h" + +#import "BTThreeDSecureLookupResult.h" + +/// Success Block type for 3D Secure lookups +typedef void (^BTClientThreeDSecureLookupSuccessBlock)(BTThreeDSecureLookupResult *threeDSecureLookup); + +/// Block type that takes a `BTClient` or an error +typedef void (^BTClientCompletionBlock)(BTClient *client, NSError *error); + +@interface BTClient () +@property (nonatomic, strong, readwrite) BTHTTP *configHttp; +@property (nonatomic, strong, readwrite) BTHTTP *clientApiHttp; +@property (nonatomic, strong, readwrite) BTHTTP *analyticsHttp; + +/// Models the contents of the client token, as it is received from the merchant server +@property (nonatomic, strong) BTClientToken *clientToken; +@property (nonatomic, strong) BTConfiguration *configuration; +@property (nonatomic) BOOL hasConfiguration; // YES if configuration was retrieved directly from Braintree, rather than from the client token + +- (void)lookupNonceForThreeDSecure:(NSString *)nonce + transactionAmount:(NSDecimalNumber *)amount + success:(BTClientThreeDSecureLookupSuccessBlock)successBlock + failure:(BTClientFailureBlock)failureBlock; + +@property (nonatomic, copy, readonly) BTClientMetadata *metadata; + +/// Copy of the instance, but with different metadata +/// +/// Useful for temporary metadata overrides. +/// +/// @param metadataBlock block for customizing metadata +- (instancetype)copyWithMetadata:(void (^)(BTClientMutableMetadata *metadata))metadataBlock; + +/// Begins the setup of `BTClient` with a client token. +/// The client token dictates the behavior of subsequent operations. +/// +/// *Not used at this time.* Use -initWithClientToken: instead. +/// +/// @param clientTokenString Braintree client token +/// @param completionBlock callback will be called exactly once asynchronously, providing either an instance of BTClient upon success or an error upon failure. ++ (void)setupWithClientToken:(NSString *)clientTokenString completion:(BTClientCompletionBlock)completionBlock; + +@end diff --git a/Pods/Braintree/Braintree/API/Client/BTConfiguration.h b/Pods/Braintree/Braintree/API/Client/BTConfiguration.h new file mode 100644 index 0000000..580d2c1 --- /dev/null +++ b/Pods/Braintree/Braintree/API/Client/BTConfiguration.h @@ -0,0 +1,128 @@ +#import + +#import "BTClientToken.h" +#import "BTAPIResponseParser.h" +#import "BTErrors.h" + +typedef NS_ENUM(NSUInteger, BTClientApplePayStatus) { + BTClientApplePayStatusOff = 0, + BTClientApplePayStatusMock = 1, + BTClientApplePayStatusProduction = 2, +}; + +extern NSString *const BTConfigurationKeyClientApiURL; +extern NSString *const BTConfigurationKeyChallenges; +extern NSString *const BTConfigurationKeyAnalytics; +extern NSString *const BTConfigurationKeyURL; +extern NSString *const BTConfigurationKeyMerchantId; +extern NSString *const BTConfigurationKeyVersion; +extern NSString *const BTConfigurationKeyApplePay; +extern NSString *const BTConfigurationKeyStatus; +extern NSString *const BTConfigurationKeyMerchantAccountId; + +extern NSString *const BTConfigurationKeyPayPal; +extern NSString *const BTConfigurationKeyPayPalClientId; +extern NSString *const BTConfigurationKeyPayPalDirectBaseUrl; +extern NSString *const BTConfigurationKeyPayPalMerchantName; +extern NSString *const BTConfigurationKeyPayPalMerchantPrivacyPolicyUrl; +extern NSString *const BTConfigurationKeyPayPalMerchantUserAgreementUrl; +extern NSString *const BTConfigurationKeyPayPalEnvironment; +extern NSString *const BTConfigurationKeyPayPalEnabled; + +extern NSString *const BTConfigurationPayPalEnvironmentCustom; +extern NSString *const BTConfigurationPayPalEnvironmentLive; +extern NSString *const BTConfigurationPayPalEnvironmentOffline; + +extern NSString *const BTConfigurationKeyPayPalDisableAppSwitch; + +extern NSString *const BTConfigurationKeyVenmo; + +// For testing +extern NSString *const BTConfigurationKeyCoinbaseEnabled; +extern NSString *const BTConfigurationKeyCoinbase; +extern NSString *const BTConfigurationKeyCoinbaseClientId; +extern NSString *const BTConfigurationKeyCoinbaseMerchantAccount; +extern NSString *const BTConfigurationKeyCoinbaseScope; +extern NSString *const BTConfigurationKeyCoinbaseRedirectUri; + +// Default PayPal merchant name in offline mode +extern NSString *const BTConfigurationPayPalNonLiveDefaultValueMerchantName; + +// Default PayPal privacy policy URL in offline mode +extern NSString *const BTConfigurationPayPalNonLiveDefaultValueMerchantPrivacyPolicyUrl; + +// Default PayPal user agreement URL in offline mode +extern NSString *const BTConfigurationPayPalNonLiveDefaultValueMerchantUserAgreementUrl; + +@interface BTConfiguration : NSObject + +#pragma mark Braintree Client API + +@property (nonatomic, readonly, strong) NSURL *clientApiURL; +@property (nonatomic, readonly, strong) NSURL *analyticsURL; +@property (nonatomic, readonly, copy) NSString *merchantId; +@property (nonatomic, readonly, copy) NSString *merchantAccountId; + +- (BOOL)analyticsEnabled; + +#pragma mark Credit Card Processing + +@property (nonatomic, readonly, strong) NSSet *challenges; + +#pragma mark PayPal + +// Returns the PayPal client id determined by Braintree that +// can be used when initializing `PayPalMobile`. +// +// `nil` if PayPal is not enabled for the merchant. +- (NSString *)btPayPal_clientId; + +// Returns a boolean if PayPal is enabled. +- (BOOL) btPayPal_isPayPalEnabled; + +// Returns the PayPal environment name +- (NSString *)btPayPal_environment; + +- (BOOL)btPayPal_isTouchDisabled; + +- (NSString *)btPayPal_merchantName; +- (NSURL *)btPayPal_merchantUserAgreementURL; +- (NSURL *)btPayPal_privacyPolicyURL; + +// Returns the base URL determined by Braintree that points +// to a PayPal stage to be used in when configuring `PayPalMobile`. +// +// @see PayPalMobile.h +// +// @return the PayPal stage URL, including a version path appropriate for the vendored PayPal mSDK, or `nil` if mock mode should be used +- (NSURL *)btPayPal_directBaseURL; + + +#pragma mark Coinbase + +- (BOOL)coinbaseEnabled; +- (NSString *)coinbaseClientId; +- (NSString *)coinbaseMerchantAccount; +- (NSString *)coinbaseScope; +- (NSString *)coinbaseEnvironment; + +#pragma mark Venmo + +- (NSString *)btVenmo_status; + +#pragma mark Apple Pay + +- (BTClientApplePayStatus)applePayStatus; +- (NSString *)applePayCountryCode; +- (NSString *)applePayCurrencyCode; +- (NSString *)applePayMerchantIdentifier; +- (NSArray *)applePaySupportedNetworks; + +#pragma mark - + +//// Initialize Configuration with a configuration response parser fetched from Braintree. +- (instancetype)initWithResponseParser:(BTAPIResponseParser *)responseParser error:(NSError **)error NS_DESIGNATED_INITIALIZER; + +- (instancetype)init __attribute__((unavailable("Please use initWithResponseParser:error: instead."))); + +@end diff --git a/Pods/Braintree/Braintree/API/Client/BTConfiguration.m b/Pods/Braintree/Braintree/API/Client/BTConfiguration.m new file mode 100644 index 0000000..e44487e --- /dev/null +++ b/Pods/Braintree/Braintree/API/Client/BTConfiguration.m @@ -0,0 +1,312 @@ +#import "BTConfiguration.h" +#import "BTAPIResponseParser.h" +#import "BTClientTokenApplePayStatusValueTransformer.h" +#import "BTClientTokenApplePayPaymentNetworksValueTransformer.h" +#import "BTClientTokenBooleanValueTransformer.h" + +NSString *const BTConfigurationKeyClientApiURL = @"clientApiUrl"; +NSString *const BTConfigurationKeyChallenges = @"challenges"; +NSString *const BTConfigurationKeyAnalytics = @"analytics"; +NSString *const BTConfigurationKeyURL = @"url"; +NSString *const BTConfigurationKeyMerchantId = @"merchantId"; + +NSString *const BTConfigurationKeyApplePay = @"applePay"; +NSString *const BTConfigurationKeyStatus = @"status"; +NSString *const BTConfigurationKeyMerchantAccountId = @"merchantAccountId"; + +NSString *const BTConfigurationKeyPayPalEnabled = @"paypalEnabled"; +NSString *const BTConfigurationKeyPayPal = @"paypal"; +NSString *const BTConfigurationKeyPayPalClientId = @"clientId"; +NSString *const BTConfigurationKeyPayPalDirectBaseUrl = @"directBaseUrl"; +NSString *const BTConfigurationKeyPayPalMerchantName = @"displayName"; +NSString *const BTConfigurationKeyPayPalMerchantPrivacyPolicyUrl = @"privacyUrl"; +NSString *const BTConfigurationKeyPayPalMerchantUserAgreementUrl = @"userAgreementUrl"; +NSString *const BTConfigurationKeyPayPalEnvironment = @"environment"; + +NSString *const BTConfigurationPayPalBraintreeProxyBasePath = @"/v1/"; +NSString *const BTConfigurationPayPalEnvironmentCustom = @"custom"; +NSString *const BTConfigurationPayPalEnvironmentLive = @"live"; +NSString *const BTConfigurationPayPalEnvironmentOffline = @"offline"; + +NSString *const BTConfigurationKeyPayPalDisableAppSwitch = @"touchDisabled"; + +NSString *const BTConfigurationKeyVenmo = @"venmo"; + +NSString *const BTConfigurationKeyCoinbaseEnabled = @"coinbaseEnabled"; +NSString *const BTConfigurationKeyCoinbase = @"coinbase"; +NSString *const BTConfigurationKeyCoinbaseClientId = @"clientId"; +NSString *const BTConfigurationKeyCoinbaseMerchantAccount = @"merchantAccount"; +NSString *const BTConfigurationKeyCoinbaseScope = @"scopes"; +NSString *const BTConfigurationKeyCoinbaseEnvironment = @"environment"; + +NSString *const BTConfigurationPayPalNonLiveDefaultValueMerchantName = @"Offline Test Merchant"; +NSString *const BTConfigurationPayPalNonLiveDefaultValueMerchantPrivacyPolicyUrl = @"http://example.com/privacy"; +NSString *const BTConfigurationPayPalNonLiveDefaultValueMerchantUserAgreementUrl = @"http://example.com/tos"; + +@interface BTConfiguration () + +@property (nonatomic, readwrite, strong) NSURL *clientApiURL; +@property (nonatomic, readwrite, strong) BTAPIResponseParser *configurationParser; + +@end + +@implementation BTConfiguration + +- (instancetype)init { + return nil; +} + +- (instancetype)initWithResponseParser:(BTAPIResponseParser *)responseParser error:(NSError **)error { + self = [super init]; + if (self) { + self.configurationParser = responseParser; + self.clientApiURL = [self.configurationParser URLForKey:BTConfigurationKeyClientApiURL]; + + if (![self validateConfiguration:error]) { + return nil; + } + } + return self; +} + +- (BOOL)validateConfiguration:(NSError *__autoreleasing*)error { + if (error != NULL && *error) { + return NO; + } + + if (![self.clientApiURL isKindOfClass:[NSURL class]] || self.clientApiURL.absoluteString.length == 0) { + if (error != NULL) { + *error = [NSError errorWithDomain:BTBraintreeAPIErrorDomain + code:BTServerErrorUnexpectedError + userInfo:@{ + NSLocalizedDescriptionKey: @"Invalid configuration: client api url was missing or invalid. Configuration request may have been intercepted. If error persists, contact Braintree support." + }]; + } + return NO; + } + + return YES; +} + +- (NSString *)merchantId { + return [self.configurationParser stringForKey:BTConfigurationKeyMerchantId]; +} + +- (NSString *)merchantAccountId { + return [self.configurationParser stringForKey:BTConfigurationKeyMerchantAccountId]; +} + +- (BTClientApplePayStatus)applePayStatus { +#if BT_ENABLE_APPLE_PAY + return [[self.configurationParser responseParserForKey:BTConfigurationKeyApplePay] integerForKey:@"status" withValueTransformer:[BTClientTokenApplePayStatusValueTransformer sharedInstance]]; +#else + return BTClientApplePayStatusOff; +#endif +} + +- (NSString *)applePayCurrencyCode { + return [[self.configurationParser responseParserForKey:BTConfigurationKeyApplePay] stringForKey:@"currencyCode"]; +} + +- (NSString *)applePayCountryCode { + return [[self.configurationParser responseParserForKey:BTConfigurationKeyApplePay] stringForKey:@"countryCode"]; +} + +- (NSString *)applePayMerchantIdentifier { + return [[self.configurationParser responseParserForKey:BTConfigurationKeyApplePay] stringForKey:@"merchantIdentifier"]; +} + +- (NSArray *)applePaySupportedNetworks { +#if BT_ENABLE_APPLE_PAY + return [[self.configurationParser responseParserForKey:BTConfigurationKeyApplePay] arrayForKey:@"supportedNetworks" + withValueTransformer:[BTClientTokenApplePayPaymentNetworksValueTransformer sharedInstance]]; +#else + return @[]; +#endif +} + +- (instancetype)copyWithZone:(NSZone *)zone { + BTConfiguration *copiedConfiguration = [[[self class] allocWithZone:zone] initWithResponseParser:[self.configurationParser copy] error:NULL]; + copiedConfiguration.clientApiURL = self.clientApiURL; + return copiedConfiguration; +} + +- (NSSet *)challenges { + return [self.configurationParser setForKey:BTConfigurationKeyChallenges]; +} + +- (BOOL)analyticsEnabled { + return self.analyticsURL != nil; +} + +- (NSURL *)analyticsURL { + return [[self.configurationParser responseParserForKey:BTConfigurationKeyAnalytics] URLForKey:BTConfigurationKeyURL]; +} + + +#pragma mark JSON Parsing + +- (NSDictionary *)parseJSONString:(NSString *)rawJSONString error:(NSError * __autoreleasing *)error { + NSData *rawJSONData = [rawJSONString dataUsingEncoding:NSUTF8StringEncoding]; + + return [NSJSONSerialization JSONObjectWithData:rawJSONData options:0 error:error]; +} + + +#pragma mark NSCoding + +- (void)encodeWithCoder:(NSCoder *)coder { + [coder encodeObject:self.clientApiURL forKey:@"clientApiURL"]; + [coder encodeObject:self.configurationParser forKey:@"claims"]; +} + +- (id)initWithCoder:(NSCoder *)decoder { + self = [self initWithResponseParser:[decoder decodeObjectForKey:@"claims"] error:NULL]; + if (self) { + self.clientApiURL = [decoder decodeObjectForKey:@"clientApiURL"]; + } + return self; +} + +#pragma mark Configuration Parsing + +- (BTAPIResponseParser *)decodeConfiguration:(NSString *)rawConfigurationString error:(NSError * __autoreleasing *)error { + NSError *JSONError; + + NSDictionary *rawConfiguration = [self parseJSONString:rawConfigurationString error:&JSONError]; + + if (!rawConfiguration || ![rawConfiguration isKindOfClass:[NSDictionary class]]) { + if (error) { + *error = [NSError errorWithDomain:BTBraintreeAPIErrorDomain + code:BTServerErrorUnexpectedError + userInfo:@{ NSUnderlyingErrorKey: JSONError, + NSLocalizedDescriptionKey: @"Invalid configuration. Configuration request may have been intercepted. If this error persists, contact Braintree support.", + NSLocalizedFailureReasonErrorKey: @"Invalid JSON" }]; + } + return nil; + } + + // Note: "version" is intentionally ignored because it doesn't matter + + return [BTAPIResponseParser parserWithDictionary:rawConfiguration]; +} + +- (NSString *)description { + return [NSString stringWithFormat:@"", self.clientApiURL, self.analyticsURL]; +} + +- (BOOL)isEqualToConfiguration:(BTConfiguration *)configuration { + return (self.configurationParser == configuration.configurationParser) || [self.configurationParser isEqual:configuration.configurationParser]; +} + +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + + if ([object isKindOfClass:[BTConfiguration class]]) { + return [self isEqualToConfiguration:object]; + } + + return NO; +} + + +#pragma mark PayPal + +- (BTAPIResponseParser *)btPayPal_claims { + return [self.configurationParser responseParserForKey:BTConfigurationKeyPayPal]; +} + +- (NSString *)btPayPal_clientId { + return [self.btPayPal_claims stringForKey:BTConfigurationKeyPayPalClientId]; +} + +- (NSString *)btPayPal_environment { + return [self.btPayPal_claims stringForKey:BTConfigurationKeyPayPalEnvironment]; +} + +- (NSURL *)btPayPal_directBaseURL { + NSString *apiUrl = [self.btPayPal_claims stringForKey:BTConfigurationKeyPayPalDirectBaseUrl]; + NSURL *directBaseURL; + if (apiUrl == nil) { + directBaseURL = nil; + } else { + NSString *urlString = [NSString stringWithFormat:@"%@%@", apiUrl, BTConfigurationPayPalBraintreeProxyBasePath]; + directBaseURL = [NSURL URLWithString:urlString]; + } + return directBaseURL; +} + +- (BOOL)btPayPal_isPayPalEnabled { + return [self.configurationParser boolForKey:BTConfigurationKeyPayPalEnabled + withValueTransformer:[BTClientTokenBooleanValueTransformer sharedInstance]]; +} + +- (BOOL)btPayPal_isTouchDisabled { + return [self.btPayPal_claims boolForKey:BTConfigurationKeyPayPalDisableAppSwitch + withValueTransformer:[BTClientTokenBooleanValueTransformer sharedInstance]]; +} + +- (BOOL)btPayPal_isLive { + return [self.btPayPal_environment isEqualToString:BTConfigurationPayPalEnvironmentLive]; +} + +- (NSString *)btPayPal_merchantName { + NSString *defaultName = self.btPayPal_isLive ? nil : BTConfigurationPayPalNonLiveDefaultValueMerchantName; + return [self.btPayPal_claims stringForKey:BTConfigurationKeyPayPalMerchantName] ?: defaultName; +} + +- (NSURL *)btPayPal_merchantUserAgreementURL { + NSURL *defaultURL = self.btPayPal_isLive ? nil : [NSURL URLWithString:BTConfigurationPayPalNonLiveDefaultValueMerchantUserAgreementUrl]; + + NSURL *url = [self.btPayPal_claims URLForKey:BTConfigurationKeyPayPalMerchantUserAgreementUrl]; + + return url ?: defaultURL; +} + +- (NSURL *)btPayPal_privacyPolicyURL { + NSURL *defaultURL = self.btPayPal_isLive ? nil : [NSURL URLWithString:BTConfigurationPayPalNonLiveDefaultValueMerchantPrivacyPolicyUrl]; + + NSURL *url = [self.btPayPal_claims URLForKey:BTConfigurationKeyPayPalMerchantPrivacyPolicyUrl]; + + return url ?: defaultURL; +} + +#pragma mark Coinbase + +- (BTAPIResponseParser *)coinbaseConfiguration { + return [self.configurationParser responseParserForKey:BTConfigurationKeyCoinbase]; +} + +- (BOOL)coinbaseEnabled { + return ([self coinbaseConfiguration] && + [self coinbaseClientId] && + [self coinbaseScope] && + [self.configurationParser boolForKey:BTConfigurationKeyCoinbaseEnabled + withValueTransformer:[BTClientTokenBooleanValueTransformer sharedInstance]]); +} + +- (NSString *)coinbaseClientId { + return [self.coinbaseConfiguration stringForKey:BTConfigurationKeyCoinbaseClientId]; +} + +- (NSString *)coinbaseMerchantAccount { + return [self.coinbaseConfiguration stringForKey:BTConfigurationKeyCoinbaseMerchantAccount]; +} + +- (NSString *)coinbaseScope { + return [self.coinbaseConfiguration stringForKey:BTConfigurationKeyCoinbaseScope]; +} + +- (NSString *)coinbaseEnvironment { + return [self.coinbaseConfiguration stringForKey:BTConfigurationKeyCoinbaseEnvironment]; +} + +#pragma mark Venmo + +- (NSString *)btVenmo_status { + return [self.configurationParser stringForKey:BTConfigurationKeyVenmo]; +} + +@end diff --git a/Pods/Braintree/Braintree/API/Models/BTApplePayPaymentMethod.m b/Pods/Braintree/Braintree/API/Models/BTApplePayPaymentMethod.m new file mode 100644 index 0000000..5087bf9 --- /dev/null +++ b/Pods/Braintree/Braintree/API/Models/BTApplePayPaymentMethod.m @@ -0,0 +1,78 @@ +#if BT_ENABLE_APPLE_PAY +#import "BTApplePayPaymentMethod_Internal.h" +#import "BTMutableApplePayPaymentMethod.h" + +@implementation BTApplePayPaymentMethod + +@synthesize nonce = _nonce; + +- (id)copyWithZone:(NSZone *)zone { + BTApplePayPaymentMethod *copy = [[BTApplePayPaymentMethod allocWithZone:zone] init]; + copy->_nonce = [self.nonce copy]; + copy->_shippingMethod = [self.shippingMethod copy]; + copy.billingAddress = self.billingAddress; + copy.shippingAddress = self.shippingAddress; + copy.billingContact = self.billingContact; + copy.shippingContact = self.shippingContact; + return copy; +} + +- (id)mutableCopyWithZone:(NSZone *)zone { + BTMutableApplePayPaymentMethod *mutableInstance = [[BTMutableApplePayPaymentMethod allocWithZone:zone] init]; + [mutableInstance setNonce:self.nonce]; + [mutableInstance setShippingMethod:self.shippingMethod]; + [mutableInstance setShippingAddress:self.shippingAddress]; + [mutableInstance setBillingAddress:self.billingAddress]; + [mutableInstance setShippingContact:self.shippingContact]; + [mutableInstance setBillingContact:self.billingContact]; + return mutableInstance; +} + +- (NSString *)description { + NSMutableString *description = [NSMutableString stringWithFormat:@""]; + + return [description copy]; +} + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + +- (void)setShippingAddress:(ABRecordRef)shippingAddress { + if (shippingAddress != NULL) { + _shippingAddress = CFRetain(shippingAddress); + } +} + +- (void)setBillingAddress:(ABRecordRef)billingAddress { + if (billingAddress != NULL) { + _billingAddress = CFRetain(billingAddress); + } +} + +#pragma clang diagnostic pop + +- (void)dealloc { + if (_shippingAddress != NULL) { + CFRelease(_shippingAddress); + } + if (_billingAddress != NULL) { + CFRelease(_billingAddress); + } +} + +@end +#endif diff --git a/Pods/Braintree/Braintree/API/Models/BTApplePayPaymentMethod_Internal.h b/Pods/Braintree/Braintree/API/Models/BTApplePayPaymentMethod_Internal.h new file mode 100644 index 0000000..498145a --- /dev/null +++ b/Pods/Braintree/Braintree/API/Models/BTApplePayPaymentMethod_Internal.h @@ -0,0 +1,17 @@ +#if BT_ENABLE_APPLE_PAY +#import "BTApplePayPaymentMethod.h" + +@interface BTApplePayPaymentMethod () +@property (nonatomic, copy, readwrite) NSString *nonce; + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" +@property (nonatomic, readwrite) ABRecordRef billingAddress; +@property (nonatomic, readwrite) ABRecordRef shippingAddress; +#pragma clang diagnostic pop +@property (nonatomic, readwrite, strong) PKContact *billingContact; +@property (nonatomic, readwrite, strong) PKContact *shippingContact; +@property (nonatomic, strong, readwrite) PKShippingMethod *shippingMethod; + +@end +#endif diff --git a/Pods/Braintree/Braintree/API/Models/BTCardPaymentMethod.m b/Pods/Braintree/Braintree/API/Models/BTCardPaymentMethod.m new file mode 100644 index 0000000..fea76bc --- /dev/null +++ b/Pods/Braintree/Braintree/API/Models/BTCardPaymentMethod.m @@ -0,0 +1,70 @@ +#import "BTCardPaymentMethod_Mutable.h" + +@implementation BTCardPaymentMethod + +- (NSString *)typeString { + switch(self.type) { + case BTCardTypeAMEX: + return @"American Express"; + case BTCardTypeUnionPay: + return @"China UnionPay"; + case BTCardTypeDinersClub: + return @"Diners Club"; + case BTCardTypeDiscover: + return @"Discover"; + case BTCardTypeJCB: + return @"JCB"; + case BTCardTypeMaestro: + return @"Maestro"; + case BTCardTypeMasterCard: + return @"MasterCard"; + case BTCardTypeSolo: + return @"Solo"; + case BTCardTypeSwitch: + return @"Switch"; + case BTCardTypeUKMaestro: + return @"UK Maestro"; + case BTCardTypeLaser: + return @"Laser"; + case BTCardTypeVisa: + return @"Visa"; + default: + return @"Card"; + } +} + +- (void)setTypeString:(NSString *)typeString { + NSString *lowercaseTypeString = [typeString lowercaseString]; + + if ([lowercaseTypeString isEqual:@"american express"]) { + self.type = BTCardTypeAMEX; + } else if ([lowercaseTypeString isEqual:@"diners club"]) { + self.type = BTCardTypeDinersClub; + } else if ([lowercaseTypeString isEqual:@"china unionpay"]) { + self.type = BTCardTypeUnionPay; + } else if ([lowercaseTypeString isEqual:@"discover"]) { + self.type = BTCardTypeDiscover; + } else if ([lowercaseTypeString isEqual:@"jcb"]) { + self.type = BTCardTypeJCB; + } else if ([lowercaseTypeString isEqual:@"maestro"]) { + self.type = BTCardTypeMaestro; + } else if ([lowercaseTypeString isEqual:@"mastercard"]) { + self.type = BTCardTypeMasterCard; + } else if ([lowercaseTypeString isEqual:@"solo"]) { + self.type = BTCardTypeSolo; + } else if ([lowercaseTypeString isEqual:@"switch"]) { + self.type = BTCardTypeSwitch; + } else if ([lowercaseTypeString isEqual:@"uk maestro"]) { + self.type = BTCardTypeUKMaestro; + } else if ([lowercaseTypeString isEqual:@"visa"]) { + self.type = BTCardTypeVisa; + } else { + self.type = BTCardTypeUnknown; + } +} + +- (NSString *)debugDescription { + return [NSString stringWithFormat:@"<%@:%p type:%@ \"%@\" nonce:%@>", NSStringFromClass([self class]), self, self.typeString, [self description], self.nonce]; +} + +@end diff --git a/Pods/Braintree/Braintree/API/Models/BTCardPaymentMethod_Mutable.h b/Pods/Braintree/Braintree/API/Models/BTCardPaymentMethod_Mutable.h new file mode 100644 index 0000000..27be0e7 --- /dev/null +++ b/Pods/Braintree/Braintree/API/Models/BTCardPaymentMethod_Mutable.h @@ -0,0 +1,10 @@ +#import "BTCardPaymentMethod.h" + +@interface BTCardPaymentMethod () + +@property (nonatomic, readwrite, assign) BTCardType type; +@property (nonatomic, readwrite, copy) NSString *typeString; +@property (nonatomic, readwrite, copy) NSString *lastTwo; +@property (nonatomic, readwrite, strong) NSDictionary *threeDSecureInfoDictionary; + +@end diff --git a/Pods/Braintree/Braintree/API/Models/BTClientCardRequest.m b/Pods/Braintree/Braintree/API/Models/BTClientCardRequest.m new file mode 100644 index 0000000..bf86919 --- /dev/null +++ b/Pods/Braintree/Braintree/API/Models/BTClientCardRequest.m @@ -0,0 +1,34 @@ +#import "BTClientCardRequest.h" + +@implementation BTClientCardRequest + +@synthesize shouldValidate = _shouldValidate; + +- (instancetype)init { + return self = [super init]; +} + +- (instancetype)initWithTokenizationRequest:(BTClientCardTokenizationRequest *)tokenizationRequest { + if (!tokenizationRequest) { + return nil; + } + + self = [self init]; + if (self) { + self.number = tokenizationRequest.number; + self.expirationYear = tokenizationRequest.expirationYear; + self.expirationMonth = tokenizationRequest.expirationMonth; + self.expirationDate = tokenizationRequest.expirationDate; + self.cvv = tokenizationRequest.cvv; + self.postalCode = tokenizationRequest.postalCode; + self.shouldValidate = tokenizationRequest.shouldValidate; + self.additionalParameters = tokenizationRequest.additionalParameters; + } + return self; +} + +- (BOOL)shouldValidate { + return _shouldValidate; +} + +@end diff --git a/Pods/Braintree/Braintree/API/Models/BTClientCardTokenizationRequest.m b/Pods/Braintree/Braintree/API/Models/BTClientCardTokenizationRequest.m new file mode 100644 index 0000000..191f15a --- /dev/null +++ b/Pods/Braintree/Braintree/API/Models/BTClientCardTokenizationRequest.m @@ -0,0 +1,40 @@ +#import "BTClientCardTokenizationRequest.h" + +@implementation BTClientCardTokenizationRequest + +- (BOOL)shouldValidate { + return NO; +} + +- (NSDictionary *)parameters { + NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; + + [self safeSetObject:self.number toDictionary:parameters forKey:@"number"]; + [self safeSetObject:self.expirationMonth toDictionary:parameters forKey:@"expiration_month"]; + [self safeSetObject:self.expirationYear toDictionary:parameters forKey:@"expiration_year"]; + [self safeSetObject:self.expirationDate toDictionary:parameters forKey:@"expiration_date"]; + [self safeSetObject:self.cvv toDictionary:parameters forKey:@"cvv"]; + + NSDictionary *options = @{ @"validate": @(self.shouldValidate) }; + [self safeSetObject:options toDictionary:parameters forKey:@"options"]; + + if (self.postalCode) { + NSDictionary *billingAddress = @{ @"postal_code": self.postalCode }; + [self safeSetObject:billingAddress toDictionary:parameters forKey:@"billing_address"]; + } + + if (self.additionalParameters) { + [parameters addEntriesFromDictionary:self.additionalParameters]; + } + + return [parameters copy]; +} + +- (void)safeSetObject:(id)object toDictionary:(NSMutableDictionary *)dictionary forKey:(NSString *)key { + if ([dictionary respondsToSelector:@selector(setObject:forKeyedSubscript:)] && key != nil && object != nil) { + dictionary[key] = object; + } +} + + +@end diff --git a/Pods/Braintree/Braintree/API/Models/BTCoinbasePaymentMethod.m b/Pods/Braintree/Braintree/API/Models/BTCoinbasePaymentMethod.m new file mode 100644 index 0000000..3f489f8 --- /dev/null +++ b/Pods/Braintree/Braintree/API/Models/BTCoinbasePaymentMethod.m @@ -0,0 +1,11 @@ +#import "BTCoinbasePaymentMethod.h" + +@implementation BTCoinbasePaymentMethod + +@synthesize email = _email; + +- (void)setEmail:(NSString *)email { + _email = email; +} + +@end diff --git a/Pods/Braintree/Braintree/API/Models/BTCoinbasePaymentMethod_Internal.h b/Pods/Braintree/Braintree/API/Models/BTCoinbasePaymentMethod_Internal.h new file mode 100644 index 0000000..ceee35a --- /dev/null +++ b/Pods/Braintree/Braintree/API/Models/BTCoinbasePaymentMethod_Internal.h @@ -0,0 +1,9 @@ +#import "BTCoinbasePaymentMethod.h" + +@interface BTCoinbasePaymentMethod () + +- (void)setNonce:(NSString *)nonce; +- (void)setDescription:(NSString *)description; +- (void)setEmail:(NSString *)email; + +@end diff --git a/Pods/Braintree/Braintree/API/Models/BTMutableApplePayPaymentMethod.h b/Pods/Braintree/Braintree/API/Models/BTMutableApplePayPaymentMethod.h new file mode 100644 index 0000000..9807b7a --- /dev/null +++ b/Pods/Braintree/Braintree/API/Models/BTMutableApplePayPaymentMethod.h @@ -0,0 +1,8 @@ +#if BT_ENABLE_APPLE_PAY +#import "BTApplePayPaymentMethod.h" +#import "BTApplePayPaymentMethod_Internal.h" + +@interface BTMutableApplePayPaymentMethod : BTApplePayPaymentMethod + +@end +#endif diff --git a/Pods/Braintree/Braintree/API/Models/BTMutableApplePayPaymentMethod.m b/Pods/Braintree/Braintree/API/Models/BTMutableApplePayPaymentMethod.m new file mode 100644 index 0000000..793aeb0 --- /dev/null +++ b/Pods/Braintree/Braintree/API/Models/BTMutableApplePayPaymentMethod.m @@ -0,0 +1,8 @@ +#if BT_ENABLE_APPLE_PAY +#import "BTMutableApplePayPaymentMethod.h" +#import "BTApplePayPaymentMethod_Internal.h" + +@implementation BTMutableApplePayPaymentMethod + +@end +#endif diff --git a/Pods/Braintree/Braintree/API/Models/BTMutableCardPaymentMethod.h b/Pods/Braintree/Braintree/API/Models/BTMutableCardPaymentMethod.h new file mode 100644 index 0000000..cbb2631 --- /dev/null +++ b/Pods/Braintree/Braintree/API/Models/BTMutableCardPaymentMethod.h @@ -0,0 +1,8 @@ +#import "BTMutablePaymentMethod.h" + +#import "BTPaymentMethod_Mutable.h" +#import "BTCardPaymentMethod_Mutable.h" + +/// Mutable version of BTCardPaymentMethod. +@interface BTMutableCardPaymentMethod : BTCardPaymentMethod +@end diff --git a/Pods/Braintree/Braintree/API/Models/BTMutableCardPaymentMethod.m b/Pods/Braintree/Braintree/API/Models/BTMutableCardPaymentMethod.m new file mode 100644 index 0000000..c2528e8 --- /dev/null +++ b/Pods/Braintree/Braintree/API/Models/BTMutableCardPaymentMethod.m @@ -0,0 +1,14 @@ +#import "BTMutableCardPaymentMethod.h" + +@implementation BTMutableCardPaymentMethod + +- (instancetype)init { + self = [super init]; + if (self) { + self.type = BTCardTypeUnknown; + } + return self; +} + + +@end diff --git a/Pods/Braintree/Braintree/API/Models/BTMutablePayPalPaymentMethod.h b/Pods/Braintree/Braintree/API/Models/BTMutablePayPalPaymentMethod.h new file mode 100644 index 0000000..0f151b8 --- /dev/null +++ b/Pods/Braintree/Braintree/API/Models/BTMutablePayPalPaymentMethod.h @@ -0,0 +1,6 @@ +#import "BTPayPalPaymentMethod.h" +#import "BTPayPalPaymentMethod_Mutable.h" + +/// Mutable version of BTPayPalPaymentMethod. +@interface BTMutablePayPalPaymentMethod : BTPayPalPaymentMethod +@end diff --git a/Pods/Braintree/Braintree/API/Models/BTMutablePayPalPaymentMethod.m b/Pods/Braintree/Braintree/API/Models/BTMutablePayPalPaymentMethod.m new file mode 100644 index 0000000..0ef98d9 --- /dev/null +++ b/Pods/Braintree/Braintree/API/Models/BTMutablePayPalPaymentMethod.m @@ -0,0 +1,4 @@ +#import "BTMutablePayPalPaymentMethod.h" + +@implementation BTMutablePayPalPaymentMethod +@end diff --git a/Pods/Braintree/Braintree/API/Models/BTMutablePaymentMethod.h b/Pods/Braintree/Braintree/API/Models/BTMutablePaymentMethod.h new file mode 100644 index 0000000..2edc8c6 --- /dev/null +++ b/Pods/Braintree/Braintree/API/Models/BTMutablePaymentMethod.h @@ -0,0 +1,5 @@ +#import "BTPaymentMethod_Mutable.h" + +@interface BTMutablePaymentMethod : BTPaymentMethod + +@end diff --git a/Pods/Braintree/Braintree/API/Models/BTMutablePaymentMethod.m b/Pods/Braintree/Braintree/API/Models/BTMutablePaymentMethod.m new file mode 100644 index 0000000..b48bfd0 --- /dev/null +++ b/Pods/Braintree/Braintree/API/Models/BTMutablePaymentMethod.m @@ -0,0 +1,5 @@ +#import "BTMutablePaymentMethod.h" + +@implementation BTMutablePaymentMethod + +@end diff --git a/Pods/Braintree/Braintree/API/Models/BTPayPalPaymentMethod.m b/Pods/Braintree/Braintree/API/Models/BTPayPalPaymentMethod.m new file mode 100644 index 0000000..8d38ee9 --- /dev/null +++ b/Pods/Braintree/Braintree/API/Models/BTPayPalPaymentMethod.m @@ -0,0 +1,22 @@ +#import "BTPayPalPaymentMethod_Mutable.h" +#import "BTMutablePayPalPaymentMethod.h" + +@implementation BTPayPalPaymentMethod + +- (id)mutableCopyWithZone:(__unused NSZone *)zone { + BTMutablePayPalPaymentMethod *mutablePayPalPaymentMethod = [[BTMutablePayPalPaymentMethod alloc] init]; + mutablePayPalPaymentMethod.billingAddress = self.billingAddress; + mutablePayPalPaymentMethod.email = self.email; + mutablePayPalPaymentMethod.locked = self.locked; + mutablePayPalPaymentMethod.nonce = self.nonce; + mutablePayPalPaymentMethod.challengeQuestions = [self.challengeQuestions copy]; + mutablePayPalPaymentMethod.description = self.description; + + return mutablePayPalPaymentMethod; +} + +- (NSString *)debugDescription { + return [NSString stringWithFormat:@"<%@:%p \"%@\" email:%@ nonce:%@ billingAddress:%@>", NSStringFromClass([self class]), self, self.email, [self description], self.nonce, self.billingAddress]; +} + +@end diff --git a/Pods/Braintree/Braintree/API/Models/BTPayPalPaymentMethod_Mutable.h b/Pods/Braintree/Braintree/API/Models/BTPayPalPaymentMethod_Mutable.h new file mode 100644 index 0000000..48af463 --- /dev/null +++ b/Pods/Braintree/Braintree/API/Models/BTPayPalPaymentMethod_Mutable.h @@ -0,0 +1,6 @@ +#import "BTPayPalPaymentMethod.h" +#import "BTPaymentMethod_Mutable.h" + +@interface BTPayPalPaymentMethod () +@property (nonatomic, readwrite, copy) NSString *email; +@end diff --git a/Pods/Braintree/Braintree/API/Models/BTPaymentMethod.m b/Pods/Braintree/Braintree/API/Models/BTPaymentMethod.m new file mode 100644 index 0000000..20d1226 --- /dev/null +++ b/Pods/Braintree/Braintree/API/Models/BTPaymentMethod.m @@ -0,0 +1,11 @@ +#import "BTPaymentMethod.h" +#import "BTPaymentMethod_Mutable.h" + +@implementation BTPaymentMethod +@synthesize description; + +- (NSString *)debugDescription { + return [NSString stringWithFormat:@"<%@:%p \"%@\" nonce:%@>", NSStringFromClass([self class]), self, [self description], self.nonce]; +} + +@end diff --git a/Pods/Braintree/Braintree/API/Models/BTPaymentMethod_Mutable.h b/Pods/Braintree/Braintree/API/Models/BTPaymentMethod_Mutable.h new file mode 100644 index 0000000..f81ecf1 --- /dev/null +++ b/Pods/Braintree/Braintree/API/Models/BTPaymentMethod_Mutable.h @@ -0,0 +1,10 @@ +#import "BTPaymentMethod.h" + +@interface BTPaymentMethod () + +@property (nonatomic, readwrite, assign, getter = isLocked) BOOL locked; +@property (nonatomic, readwrite, copy) NSString *nonce; +@property (nonatomic, readwrite, strong) NSSet *challengeQuestions; +@property (nonatomic, readwrite, copy) NSString *description; + +@end diff --git a/Pods/Braintree/Braintree/API/Models/BTPostalAddress.m b/Pods/Braintree/Braintree/API/Models/BTPostalAddress.m new file mode 100644 index 0000000..a1b344e --- /dev/null +++ b/Pods/Braintree/Braintree/API/Models/BTPostalAddress.m @@ -0,0 +1,28 @@ +#import "BTPostalAddress_Internal.h" +#import "BTPostalAddress.h" + +NSString *const BTPostalAddressKeyAccountAddress = @"accountAddress"; +NSString *const BTPostalAddressKeyLocality = @"city"; +NSString *const BTPostalAddressKeyCountry = @"country"; +NSString *const BTPostalAddressKeyPostalCode = @"postalCode"; +NSString *const BTPostalAddressKeyRegion= @"state"; +NSString *const BTPostalAddressKeyStreetAddress = @"street1"; +NSString *const BTPostalAddressKeyExtendedAddress = @"street2"; + +@implementation BTPostalAddress + +// Property names follow the `Braintree_Address` convention as documented at: +// https://developers.braintreepayments.com/ios+php/reference/response/address + +- (id)copyWithZone:(__unused NSZone *)zone { + BTPostalAddress *address = [[BTPostalAddress alloc] init]; + address.streetAddress = self.streetAddress; + address.extendedAddress = self.extendedAddress; + address.locality = self.locality; + address.countryCodeAlpha2 = self.countryCodeAlpha2; + address.postalCode = self.postalCode; + address.region = self.region; + return address; +} + +@end diff --git a/Pods/Braintree/Braintree/API/Models/BTPostalAddress_Internal.h b/Pods/Braintree/Braintree/API/Models/BTPostalAddress_Internal.h new file mode 100644 index 0000000..2e4a3fd --- /dev/null +++ b/Pods/Braintree/Braintree/API/Models/BTPostalAddress_Internal.h @@ -0,0 +1,13 @@ +#import "BTPostalAddress.h" + +extern NSString *const BTPostalAddressKeyAccountAddress; +extern NSString *const BTPostalAddressKeyLocality; +extern NSString *const BTPostalAddressKeyCountry; +extern NSString *const BTPostalAddressKeyPostalCode; +extern NSString *const BTPostalAddressKeyRegion; +extern NSString *const BTPostalAddressKeyStreetAddress; +extern NSString *const BTPostalAddressKeyExtendedAddress; + +@interface BTPostalAddress () + +@end diff --git a/Pods/Braintree/Braintree/API/Models/BTThreeDSecureLookupResult.h b/Pods/Braintree/Braintree/API/Models/BTThreeDSecureLookupResult.h new file mode 100644 index 0000000..90a541f --- /dev/null +++ b/Pods/Braintree/Braintree/API/Models/BTThreeDSecureLookupResult.h @@ -0,0 +1,16 @@ +#import + +#import "BTCardPaymentMethod.h" + +@interface BTThreeDSecureLookupResult : NSObject + +@property (nonatomic, copy) NSString *PAReq; +@property (nonatomic, copy) NSString *MD; +@property (nonatomic, copy) NSURL *acsURL; +@property (nonatomic, copy) NSURL *termURL; + +@property (nonatomic, strong) BTCardPaymentMethod *card; + +- (BOOL)requiresUserAuthentication; + +@end diff --git a/Pods/Braintree/Braintree/API/Models/BTThreeDSecureLookupResult.m b/Pods/Braintree/Braintree/API/Models/BTThreeDSecureLookupResult.m new file mode 100644 index 0000000..126e6a3 --- /dev/null +++ b/Pods/Braintree/Braintree/API/Models/BTThreeDSecureLookupResult.m @@ -0,0 +1,9 @@ +#import "BTThreeDSecureLookupResult.h" + +@implementation BTThreeDSecureLookupResult + +- (BOOL)requiresUserAuthentication { + return self.acsURL != nil; +} + +@end diff --git a/Pods/Braintree/Braintree/API/Networking/BTHTTP.h b/Pods/Braintree/Braintree/API/Networking/BTHTTP.h new file mode 100644 index 0000000..55bbb55 --- /dev/null +++ b/Pods/Braintree/Braintree/API/Networking/BTHTTP.h @@ -0,0 +1,34 @@ +#import + +#import "BTHTTPResponse.h" +#import "BTErrors.h" + +@class BTHTTPResponse; + +typedef void (^BTHTTPCompletionBlock)(BTHTTPResponse *response, NSError *error); + +@interface BTHTTP : NSObject + +/// An optional array of pinned certificates, each an NSData instance +/// consisting of DER encoded x509 certificates +@property (nonatomic, strong) NSArray *pinnedCertificates; + +- (instancetype)initWithBaseURL:(NSURL *)URL; + +/// Set an optional array of subclasses of NSURLProtocol +/// that are registered with the underlying URL handler upon initialization. +- (void)setProtocolClasses:(NSArray *)protocolClasses; + +- (void)GET:(NSString *)url completion:(BTHTTPCompletionBlock)completionBlock; +- (void)GET:(NSString *)url parameters:(NSDictionary *)parameters completion:(BTHTTPCompletionBlock)completionBlock; + +- (void)POST:(NSString *)url completion:(BTHTTPCompletionBlock)completionBlock; +- (void)POST:(NSString *)url parameters:(NSDictionary *)parameters completion:(BTHTTPCompletionBlock)completionBlock; + +- (void)PUT:(NSString *)url completion:(BTHTTPCompletionBlock)completionBlock; +- (void)PUT:(NSString *)url parameters:(NSDictionary *)parameters completion:(BTHTTPCompletionBlock)completionBlock; + +- (void)DELETE:(NSString *)url completion:(BTHTTPCompletionBlock)completionBlock; +- (void)DELETE:(NSString *)url parameters:(NSDictionary *)parameters completion:(BTHTTPCompletionBlock)completionBlock; + +@end diff --git a/Pods/Braintree/Braintree/API/Networking/BTHTTP.m b/Pods/Braintree/Braintree/API/Networking/BTHTTP.m new file mode 100644 index 0000000..25112d3 --- /dev/null +++ b/Pods/Braintree/Braintree/API/Networking/BTHTTP.m @@ -0,0 +1,410 @@ +#import "BTHTTP.h" + +#include + +#import "BTClient.h" +#import "BTAPIPinnedCertificates.h" +#import "BTURLUtils.h" +#import "BTLogger_Internal.h" + +@interface BTHTTP () + +@property (nonatomic, strong) NSURLSession *session; +@property (nonatomic, strong) NSURL *baseURL; + +- (NSDictionary *)defaultHeaders; + +@end + +@implementation BTHTTP + +- (instancetype)initWithBaseURL:(NSURL *)URL { + self = [self init]; + if (self) { + NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration ephemeralSessionConfiguration]; + configuration.HTTPAdditionalHeaders = self.defaultHeaders; + self.baseURL = URL; + + NSOperationQueue *delegateQueue = [[NSOperationQueue alloc] init]; + delegateQueue.maxConcurrentOperationCount = NSOperationQueueDefaultMaxConcurrentOperationCount; + + self.session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:delegateQueue]; + self.pinnedCertificates = [BTAPIPinnedCertificates trustedCertificates]; + } + return self; +} + +- (instancetype)copyWithZone:(NSZone *)zone { + BTHTTP *copiedHTTP = [[[self class] allocWithZone:zone] initWithBaseURL:_baseURL]; + copiedHTTP.pinnedCertificates = [_pinnedCertificates copy]; + [copiedHTTP setProtocolClasses:_session.configuration.protocolClasses]; + return copiedHTTP; +} + +#pragma mark - Getters/setters + +- (void)setProtocolClasses:(NSArray *)protocolClasses { + NSURLSessionConfiguration *configuration = self.session.configuration; + configuration.protocolClasses = protocolClasses; + self.session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:self.session.delegateQueue]; +} + +#pragma mark - HTTP Methods + +- (void)GET:(NSString *)aPath completion:(BTHTTPCompletionBlock)completionBlock { + [self GET:aPath parameters:nil completion:completionBlock]; +} + +- (void)GET:(NSString *)aPath parameters:(NSDictionary *)parameters completion:(BTHTTPCompletionBlock)completionBlock { + [self httpRequest:@"GET" path:aPath parameters:parameters completion:completionBlock]; +} + +- (void)POST:(NSString *)aPath completion:(BTHTTPCompletionBlock)completionBlock { + [self POST:aPath parameters:nil completion:completionBlock]; +} + +- (void)POST:(NSString *)aPath parameters:(NSDictionary *)parameters completion:(BTHTTPCompletionBlock)completionBlock { + [self httpRequest:@"POST" path:aPath parameters:parameters completion:completionBlock]; +} + +- (void)PUT:(NSString *)aPath completion:(BTHTTPCompletionBlock)completionBlock { + [self PUT:aPath parameters:nil completion:completionBlock]; +} + +- (void)PUT:(NSString *)aPath parameters:(NSDictionary *)parameters completion:(BTHTTPCompletionBlock)completionBlock { + [self httpRequest:@"PUT" path:aPath parameters:parameters completion:completionBlock]; +} + +- (void)DELETE:(NSString *)aPath completion:(BTHTTPCompletionBlock)completionBlock { + [self DELETE:aPath parameters:nil completion:completionBlock]; +} + +- (void)DELETE:(NSString *)aPath parameters:(NSDictionary *)parameters completion:(BTHTTPCompletionBlock)completionBlock { + [self httpRequest:@"DELETE" path:aPath parameters:parameters completion:completionBlock]; +} + +#pragma mark - Underlying HTTP + +- (void)httpRequest:(NSString *)method path:(NSString *)aPath parameters:(NSDictionary *)parameters completion:(BTHTTPCompletionBlock)completionBlock { + + BOOL isNotDataURL = ![self.baseURL.scheme isEqualToString:@"data"]; + NSURL *fullPathURL; + if (aPath && isNotDataURL) { + fullPathURL = [self.baseURL URLByAppendingPathComponent:aPath]; + } else { + fullPathURL = self.baseURL; + } + + NSURLComponents *components = [NSURLComponents componentsWithString:fullPathURL.absoluteString]; + + NSMutableDictionary *headers = [NSMutableDictionary dictionaryWithDictionary:self.defaultHeaders]; + + NSMutableURLRequest *request; + + if ([method isEqualToString:@"GET"] || [method isEqualToString:@"DELETE"]) { + if (isNotDataURL) { + NSString *encodedParametersString = [BTURLUtils queryStringWithDictionary:parameters]; + components.percentEncodedQuery = encodedParametersString; + } + request = [NSMutableURLRequest requestWithURL:components.URL]; + } else { + request = [NSMutableURLRequest requestWithURL:components.URL]; + + NSError *jsonSerializationError; + NSData *bodyData; + + if ([parameters isKindOfClass:[NSDictionary class]]) { + bodyData = [NSJSONSerialization dataWithJSONObject:parameters + options:NSJSONWritingPrettyPrinted + error:&jsonSerializationError]; + } + + if (jsonSerializationError != nil) { + completionBlock(nil, [NSError errorWithDomain:BTBraintreeAPIErrorDomain + code:BTServerErrorUnknown + userInfo:@{NSUnderlyingErrorKey: jsonSerializationError}]); + return; + } + + [request setHTTPBody:bodyData]; + headers[@"Content-Type"] = @"application/json; charset=utf-8"; + } + [request setAllHTTPHeaderFields:headers]; + + [request setHTTPMethod:method]; + + // Perform the actual request + NSURLSessionTask *task = [self.session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { + [[self class] handleRequestCompletion:data response:response error:error completionBlock:completionBlock]; + }]; + [task resume]; +} + ++ (void)handleRequestCompletion:(NSData *)data response:(NSURLResponse *)response error:(NSError *)error completionBlock:(BTHTTPCompletionBlock)completionBlock { + // Handle errors for which the response is irrelevant + // e.g. SSL, unavailable network, etc. + NSError *domainRequestError = [self domainRequestErrorForError:error]; + if (domainRequestError != nil) { + [self callCompletionBlock:completionBlock response:nil error:domainRequestError]; + return; + } + + NSInteger statusCode; + // Handle nil or non-HTTP requests, which are an unknown type of error + if ([response.URL.scheme isEqualToString:@"data"]) { + statusCode = 200; + } else if ([response isKindOfClass:[NSHTTPURLResponse class]]) { + statusCode = [(NSHTTPURLResponse *)response statusCode]; + } else { + NSDictionary *userInfoDictionary = error ? @{NSUnderlyingErrorKey: error} : nil; + NSError *returnedError = [NSError errorWithDomain:BTBraintreeAPIErrorDomain + code:BTServerErrorUnknown + userInfo:userInfoDictionary]; + [self callCompletionBlock:completionBlock response:nil error:returnedError]; + return; + } + + NSString *responseContentType = [response MIMEType]; + + if (data.length == 0) { + // Accept empty responses + BTHTTPResponse *btHTTPResponse = [[BTHTTPResponse alloc] initWithStatusCode:statusCode responseObject:nil]; + NSDictionary *userInfoDictionary = error ? @{NSUnderlyingErrorKey: error} : nil; + NSError *returnedError = [self defaultDomainErrorForStatusCode:statusCode userInfo:userInfoDictionary]; + [self callCompletionBlock:completionBlock response:btHTTPResponse error:returnedError]; + } else if ([responseContentType isEqualToString:@"application/json"]) { + // Attempt to parse json, and return an error if parsing fails + NSError *jsonParseError; + NSDictionary *responseObject = [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonParseError]; + if (jsonParseError != nil) { + NSError *returnedError = [NSError errorWithDomain:BTBraintreeAPIErrorDomain + code:BTServerErrorUnexpectedError + userInfo:@{NSUnderlyingErrorKey: jsonParseError}]; + [self callCompletionBlock:completionBlock response:nil error:returnedError]; + return; + } + + BTHTTPResponse *btHTTPResponse = [[BTHTTPResponse alloc] initWithStatusCode:statusCode responseObject:responseObject]; + NSMutableDictionary *userInfoDictionary = nil; + if ([responseObject isKindOfClass:[NSDictionary class]]) { + userInfoDictionary = [responseObject mutableCopy]; + } + if (error) { + if (userInfoDictionary) { + userInfoDictionary[NSUnderlyingErrorKey] = error; + } else { + userInfoDictionary = [@{NSUnderlyingErrorKey: error} mutableCopy]; + } + } + if (userInfoDictionary && userInfoDictionary[@"error"] && userInfoDictionary[@"error"][@"message"]) { + userInfoDictionary[NSLocalizedDescriptionKey] = userInfoDictionary[@"error"][@"message"]; + } + NSError *returnedError = [self defaultDomainErrorForStatusCode:statusCode userInfo:userInfoDictionary]; + [self callCompletionBlock:completionBlock response:btHTTPResponse error:returnedError]; + } else { + // Return error for unsupported response type + NSError *returnedError = [NSError errorWithDomain:BTBraintreeAPIErrorDomain + code:BTServerErrorUnexpectedError + userInfo:@{NSLocalizedDescriptionKey: [NSString stringWithFormat:@"BTHTTP only supports application/json responses, received Content-Type: %@", responseContentType]}]; + [self callCompletionBlock:completionBlock response:nil error:returnedError]; + return; + } +} + ++ (void)callCompletionBlock:(BTHTTPCompletionBlock)completionBlock response:(BTHTTPResponse *)response error:(NSError *)error { + if (completionBlock) { + dispatch_async(dispatch_get_main_queue(), ^{ + completionBlock(response, error); + }); + } +} + +#pragma mark - Error Classification + ++ (NSError *)domainRequestErrorForError:(NSError *)error { + NSError *returnedError; + if (error != nil) { + NSDictionary *userInfoDictionary = @{NSUnderlyingErrorKey: error}; + if ([error.domain isEqualToString:NSURLErrorDomain]) { + NSInteger returnedErrorCode; + switch (error.code) { + case NSURLErrorSecureConnectionFailed: + case NSURLErrorServerCertificateHasBadDate: + case NSURLErrorServerCertificateUntrusted: + case NSURLErrorServerCertificateHasUnknownRoot: + case NSURLErrorServerCertificateNotYetValid: + case NSURLErrorClientCertificateRejected: + case NSURLErrorClientCertificateRequired: + case NSURLErrorCannotLoadFromNetwork: + returnedErrorCode = BTServerErrorSSL; + break; + case NSURLErrorCannotConnectToHost: + case NSURLErrorTimedOut: + returnedErrorCode = BTServerErrorGatewayUnavailable; + break; + case NSURLErrorUnsupportedURL: + case NSURLErrorBadServerResponse: + returnedErrorCode = BTServerErrorUnexpectedError; + break; + case NSURLErrorNetworkConnectionLost: + case NSURLErrorInternationalRoamingOff: + case NSURLErrorCallIsActive: + case NSURLErrorDataNotAllowed: + case NSURLErrorNotConnectedToInternet: + returnedErrorCode = BTServerErrorNetworkUnavailable; + break; + default: + returnedErrorCode = BTServerErrorUnknown; + break; + } + returnedError = [NSError errorWithDomain:BTBraintreeAPIErrorDomain + code:returnedErrorCode + userInfo:userInfoDictionary]; + } else if ([error.domain isEqualToString:NSCocoaErrorDomain] && error.code == NSPropertyListReadCorruptError) { + returnedError = [NSError errorWithDomain:BTBraintreeAPIErrorDomain + code:BTServerErrorUnexpectedError + userInfo:userInfoDictionary]; + } + } + return returnedError; +} + ++ (NSError *)defaultDomainErrorForStatusCode:(NSInteger)statusCode userInfo:(NSDictionary *)userInfoDictionary { + switch (statusCode) { + case 200 ... 299: + return nil; + case 403: + return [NSError errorWithDomain:BTBraintreeAPIErrorDomain + code:BTMerchantIntegrationErrorUnauthorized + userInfo:userInfoDictionary]; + case 404: + return [NSError errorWithDomain:BTBraintreeAPIErrorDomain + code:BTMerchantIntegrationErrorNotFound + userInfo:userInfoDictionary]; + case 422: + return [NSError errorWithDomain:BTBraintreeAPIErrorDomain + code:BTCustomerInputErrorInvalid + userInfo:userInfoDictionary]; + case 400 ... 402: + case 405 ... 421: + case 423 ... 499: + return [NSError errorWithDomain:BTBraintreeAPIErrorDomain + code:BTCustomerInputErrorUnknown + userInfo:userInfoDictionary]; + case 503: + return [NSError errorWithDomain:BTBraintreeAPIErrorDomain + code:BTServerErrorGatewayUnavailable + userInfo:userInfoDictionary]; + case 500 ... 502: + case 504 ... 599: + return [NSError errorWithDomain:BTBraintreeAPIErrorDomain + code:BTServerErrorUnknown + userInfo:userInfoDictionary]; + default: + return [NSError errorWithDomain:BTBraintreeAPIErrorDomain + code:BTUnknownError + userInfo:userInfoDictionary]; + } +} + +#pragma mark - Default Headers + +- (NSDictionary *)defaultHeaders { + return @{ @"User-Agent": [self userAgentString], + @"Accept": [self acceptString], + @"Accept-Language": [self acceptLanguageString] }; +} + +- (NSString *)userAgentString { + return [NSString stringWithFormat:@"Braintree/iOS/%@", + [BTClient libraryVersion]]; +} + +- (NSString *)platformString { + size_t size = 128; + char *hwModel = alloca(size); + + if (sysctlbyname("hw.model", hwModel, &size, NULL, 0) != 0) { + return nil; + } + + NSString *hwModelString = [NSString stringWithCString:hwModel encoding:NSUTF8StringEncoding]; +#if TARGET_IPHONE_SIMULATOR + hwModelString = [hwModelString stringByAppendingString:@"(simulator)"]; +#endif + return hwModelString; +} + +- (NSString *)architectureString { + size_t size = 128; + char *hwMachine = alloca(size); + + if (sysctlbyname("hw.machine", hwMachine, &size, NULL, 0) != 0) { + return nil; + } + + return [NSString stringWithCString:hwMachine encoding:NSUTF8StringEncoding]; +} + +- (NSString *)acceptString { + return @"application/json"; +} + +- (NSString *)acceptLanguageString { + NSLocale *locale = [NSLocale currentLocale]; + return [NSString stringWithFormat:@"%@-%@", + [locale objectForKey:NSLocaleLanguageCode], + [locale objectForKey:NSLocaleCountryCode]]; +} + +#pragma mark - Helpers + +- (NSArray *)pinnedCertificateData { + NSMutableArray *pinnedCertificates = [NSMutableArray array]; + for (NSData *certificateData in self.pinnedCertificates) { + [pinnedCertificates addObject:(__bridge_transfer id)SecCertificateCreateWithData(NULL, (__bridge CFDataRef)certificateData)]; + } + return pinnedCertificates; +} + +- (void)URLSession:(__unused NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential *))completionHandler { + if ([[[challenge protectionSpace] authenticationMethod] isEqualToString:NSURLAuthenticationMethodServerTrust]) { + NSString *domain = challenge.protectionSpace.host; + SecTrustRef serverTrust = [[challenge protectionSpace] serverTrust]; + + NSArray *policies = @[(__bridge_transfer id)SecPolicyCreateSSL(true, (__bridge CFStringRef)domain)]; + SecTrustSetPolicies(serverTrust, (__bridge CFArrayRef)policies); + SecTrustSetAnchorCertificates(serverTrust, (__bridge CFArrayRef)self.pinnedCertificateData); + SecTrustResultType result; + + OSStatus errorCode = SecTrustEvaluate(serverTrust, &result); + + BOOL evaluatesAsTrusted = (result == kSecTrustResultUnspecified || result == kSecTrustResultProceed); + if (errorCode == errSecSuccess && evaluatesAsTrusted) { + NSURLCredential *credential = [NSURLCredential credentialForTrust:serverTrust]; + completionHandler(NSURLSessionAuthChallengeUseCredential, credential); + } else { + completionHandler(NSURLSessionAuthChallengeRejectProtectionSpace, NULL); + } + } else { + completionHandler(NSURLSessionAuthChallengePerformDefaultHandling, NULL); + } +} + +- (BOOL)isEqualToHTTP:(BTHTTP *)http { + return (self.baseURL == http.baseURL) || [self.baseURL isEqual:http.baseURL]; +} + +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + + if ([object isKindOfClass:[BTHTTP class]]) { + return [self isEqualToHTTP:object]; + } + + return NO; +} + +@end diff --git a/Pods/Braintree/Braintree/API/Networking/BTHTTPResponse.h b/Pods/Braintree/Braintree/API/Networking/BTHTTPResponse.h new file mode 100644 index 0000000..d212ec9 --- /dev/null +++ b/Pods/Braintree/Braintree/API/Networking/BTHTTPResponse.h @@ -0,0 +1,13 @@ +#import +#import "BTAPIResponseParser.h" + +@interface BTHTTPResponse : NSObject + +@property (nonatomic, readonly, strong) BTAPIResponseParser *object; +@property (nonatomic, readonly, strong) NSDictionary *rawObject; +@property (nonatomic, readonly, assign) NSInteger statusCode; +@property (nonatomic, readonly, assign, getter = isSuccess) BOOL success; + +- (instancetype)initWithStatusCode:(NSInteger)statusCode responseObject:(NSDictionary *)response; + +@end diff --git a/Pods/Braintree/Braintree/API/Networking/BTHTTPResponse.m b/Pods/Braintree/Braintree/API/Networking/BTHTTPResponse.m new file mode 100644 index 0000000..4eff98d --- /dev/null +++ b/Pods/Braintree/Braintree/API/Networking/BTHTTPResponse.m @@ -0,0 +1,34 @@ +#import "BTHTTPResponse.h" + +@interface BTHTTPResponse () + +@property (nonatomic, readwrite, strong) BTAPIResponseParser *object; +@property (nonatomic, readwrite, strong) NSDictionary *rawObject; +@property (nonatomic, readwrite, assign) NSInteger statusCode; +@end + +@implementation BTHTTPResponse + +- (instancetype)initWithStatusCode:(NSInteger)statusCode responseObject:(NSDictionary *)object { + self = [self init]; + if (self) { + self.statusCode = statusCode; + self.rawObject = object; + self.object = [BTAPIResponseParser parserWithDictionary:object]; + } + return self; +} + +- (BOOL)isSuccess { + return self.statusCode >= 200 && self.statusCode < 300; +} + +- (NSString *)description { + return [NSString stringWithFormat:@"", (int)self.statusCode, self.object]; +} + +- (NSString *)debugDescription { + return [NSString stringWithFormat:@"", (int)self.statusCode, [self.object debugDescription]]; +} + +@end diff --git a/Pods/Braintree/Braintree/API/Networking/BTURLUtils.h b/Pods/Braintree/Braintree/API/Networking/BTURLUtils.h new file mode 100644 index 0000000..4930ff3 --- /dev/null +++ b/Pods/Braintree/Braintree/API/Networking/BTURLUtils.h @@ -0,0 +1,9 @@ +#import + +@interface BTURLUtils : NSObject + ++ (NSURL *)URLfromURL:(NSURL *)URL withAppendedQueryDictionary:(NSDictionary *)dictionary; ++ (NSString *)queryStringWithDictionary:(NSDictionary *)dict; ++ (NSDictionary *)dictionaryForQueryString:(NSString *)queryString; + +@end diff --git a/Pods/Braintree/Braintree/API/Networking/BTURLUtils.m b/Pods/Braintree/Braintree/API/Networking/BTURLUtils.m new file mode 100644 index 0000000..2d28fdd --- /dev/null +++ b/Pods/Braintree/Braintree/API/Networking/BTURLUtils.m @@ -0,0 +1,87 @@ +#import "BTURLUtils.h" + +@implementation BTURLUtils + ++ (NSURL *)URLfromURL:(NSURL *)URL withAppendedQueryDictionary:(NSDictionary *)dictionary { + if (!URL) { + return nil; + } + + NSURLComponents *urlComponents = [NSURLComponents componentsWithURL:URL resolvingAgainstBaseURL:NO]; + urlComponents.percentEncodedQuery = [self queryStringWithDictionary:dictionary]; + return urlComponents.URL; +} + ++ (NSString *)queryStringWithDictionary:(NSDictionary *)dict { + NSMutableString *queryString = [NSMutableString string]; + for (id key in dict) { + NSString *encodedKey = [self stringByURLEncodingAllCharactersInString:[key description]]; + id value = [dict objectForKey:key]; + if([value isKindOfClass:[NSArray class]]) { + for(id obj in value) { + [queryString appendFormat:@"%@%%5B%%5D=%@&", + encodedKey, + [self stringByURLEncodingAllCharactersInString:[obj description]] + ]; + } + } else if([value isKindOfClass:[NSDictionary class]]) { + for(id subkey in value) { + [queryString appendFormat:@"%@%%5B%@%%5D=%@&", + encodedKey, + [self stringByURLEncodingAllCharactersInString:[subkey description]], + [self stringByURLEncodingAllCharactersInString:[[value objectForKey:subkey] description]] + ]; + } + } else if([value isKindOfClass:[NSNull class]]) { + [queryString appendFormat:@"%@=&", encodedKey]; + } else { + [queryString appendFormat:@"%@=%@&", + encodedKey, + [self stringByURLEncodingAllCharactersInString:[value description]] + ]; + } + } + if([queryString length] > 0) { + [queryString deleteCharactersInRange:NSMakeRange([queryString length] - 1, 1)]; // remove trailing & + } + return queryString; +} + ++ (NSString *)stringByURLEncodingAllCharactersInString:(NSString *)aString { + // See Section 2.2. http://www.ietf.org/rfc/rfc2396.txt + NSString *reservedCharacters = @";/?:@&=+$,"; + + NSMutableCharacterSet *URLQueryPartAllowedCharacterSet = [[NSCharacterSet URLQueryAllowedCharacterSet] mutableCopy]; + [URLQueryPartAllowedCharacterSet removeCharactersInString:reservedCharacters]; + + return [aString stringByAddingPercentEncodingWithAllowedCharacters:URLQueryPartAllowedCharacterSet]; +} + ++ (NSDictionary *)dictionaryForQueryString:(NSString *)queryString { + NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; + NSArray *components = [queryString componentsSeparatedByString:@"&"]; + for (NSString *keyValueString in components) { + if ([keyValueString length] == 0) { + continue; + } + + NSArray *keyValueArray = [keyValueString componentsSeparatedByString:@"="]; + NSString *key = [self percentDecodedStringForString:keyValueArray[0]]; + if (!key) { + continue; + } + if (keyValueArray.count == 2) { + NSString *value = [self percentDecodedStringForString:keyValueArray[1]]; + parameters[key] = value; + } else { + parameters[key] = [NSNull null]; + } + } + return [NSDictionary dictionaryWithDictionary:parameters]; +} + ++ (NSString *)percentDecodedStringForString:(NSString *)string { + return [[string stringByReplacingOccurrencesOfString:@"+" withString:@" "] stringByRemovingPercentEncoding]; +} + +@end diff --git a/Pods/Braintree/Braintree/API/Networking/Certificates/BTAPIPinnedCertificates.h b/Pods/Braintree/Braintree/API/Networking/Certificates/BTAPIPinnedCertificates.h new file mode 100644 index 0000000..5968976 --- /dev/null +++ b/Pods/Braintree/Braintree/API/Networking/Certificates/BTAPIPinnedCertificates.h @@ -0,0 +1,14 @@ +#import + +// :rotating_light THIS CODE IS GENERATED BY codify_certificates.sh :rotating_light: +/// Encapsualtes our trusted x509 Certificates for Secure SSL Communication with Braintree's servers. +/// +/// This class consists of code that is generated by the codify_certificates.sh script, which takes +/// a set of PEM formatted certificates and encodes them in code in order to avoid storing certificates +/// files in an NSBundle. +@interface BTAPIPinnedCertificates : NSObject +/// Returns the set of trusted root certificates based on the PEM files located in this directory. +/// +/// @return An array of trusted certificates encoded in the DER format, encapsulated in NSData objects. ++ (NSArray *)trustedCertificates; +@end diff --git a/Pods/Braintree/Braintree/API/Networking/Certificates/BTAPIPinnedCertificates.m b/Pods/Braintree/Braintree/API/Networking/Certificates/BTAPIPinnedCertificates.m new file mode 100644 index 0000000..da33f05 --- /dev/null +++ b/Pods/Braintree/Braintree/API/Networking/Certificates/BTAPIPinnedCertificates.m @@ -0,0 +1,1022 @@ +#import "BTAPIPinnedCertificates.h" + +// :rotating_light THIS CODE IS GENERATED BY codify_certificates.sh :rotating_light: +@implementation BTAPIPinnedCertificates + ++ (NSArray *)trustedCertificates { + NSMutableArray *trustedCertificates = [NSMutableArray arrayWithCapacity:15]; + { +/* subject:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA 2 */ +/* issuer :/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA 2 */ +unsigned char XXX_certificate[874]={ +0x30,0x82,0x03,0x66,0x30,0x82,0x02,0x4E,0xA0,0x03,0x02,0x01,0x02,0x02,0x01,0x01, +0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x30, +0x44,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x16, +0x30,0x14,0x06,0x03,0x55,0x04,0x0A,0x13,0x0D,0x47,0x65,0x6F,0x54,0x72,0x75,0x73, +0x74,0x20,0x49,0x6E,0x63,0x2E,0x31,0x1D,0x30,0x1B,0x06,0x03,0x55,0x04,0x03,0x13, +0x14,0x47,0x65,0x6F,0x54,0x72,0x75,0x73,0x74,0x20,0x47,0x6C,0x6F,0x62,0x61,0x6C, +0x20,0x43,0x41,0x20,0x32,0x30,0x1E,0x17,0x0D,0x30,0x34,0x30,0x33,0x30,0x34,0x30, +0x35,0x30,0x30,0x30,0x30,0x5A,0x17,0x0D,0x31,0x39,0x30,0x33,0x30,0x34,0x30,0x35, +0x30,0x30,0x30,0x30,0x5A,0x30,0x44,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06, +0x13,0x02,0x55,0x53,0x31,0x16,0x30,0x14,0x06,0x03,0x55,0x04,0x0A,0x13,0x0D,0x47, +0x65,0x6F,0x54,0x72,0x75,0x73,0x74,0x20,0x49,0x6E,0x63,0x2E,0x31,0x1D,0x30,0x1B, +0x06,0x03,0x55,0x04,0x03,0x13,0x14,0x47,0x65,0x6F,0x54,0x72,0x75,0x73,0x74,0x20, +0x47,0x6C,0x6F,0x62,0x61,0x6C,0x20,0x43,0x41,0x20,0x32,0x30,0x82,0x01,0x22,0x30, +0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x01,0x05,0x00,0x03,0x82, +0x01,0x0F,0x00,0x30,0x82,0x01,0x0A,0x02,0x82,0x01,0x01,0x00,0xEF,0x3C,0x4D,0x40, +0x3D,0x10,0xDF,0x3B,0x53,0x00,0xE1,0x67,0xFE,0x94,0x60,0x15,0x3E,0x85,0x88,0xF1, +0x89,0x0D,0x90,0xC8,0x28,0x23,0x99,0x05,0xE8,0x2B,0x20,0x9D,0xC6,0xF3,0x60,0x46, +0xD8,0xC1,0xB2,0xD5,0x8C,0x31,0xD9,0xDC,0x20,0x79,0x24,0x81,0xBF,0x35,0x32,0xFC, +0x63,0x69,0xDB,0xB1,0x2A,0x6B,0xEE,0x21,0x58,0xF2,0x08,0xE9,0x78,0xCB,0x6F,0xCB, +0xFC,0x16,0x52,0xC8,0x91,0xC4,0xFF,0x3D,0x73,0xDE,0xB1,0x3E,0xA7,0xC2,0x7D,0x66, +0xC1,0xF5,0x7E,0x52,0x24,0x1A,0xE2,0xD5,0x67,0x91,0xD0,0x82,0x10,0xD7,0x78,0x4B, +0x4F,0x2B,0x42,0x39,0xBD,0x64,0x2D,0x40,0xA0,0xB0,0x10,0xD3,0x38,0x48,0x46,0x88, +0xA1,0x0C,0xBB,0x3A,0x33,0x2A,0x62,0x98,0xFB,0x00,0x9D,0x13,0x59,0x7F,0x6F,0x3B, +0x72,0xAA,0xEE,0xA6,0x0F,0x86,0xF9,0x05,0x61,0xEA,0x67,0x7F,0x0C,0x37,0x96,0x8B, +0xE6,0x69,0x16,0x47,0x11,0xC2,0x27,0x59,0x03,0xB3,0xA6,0x60,0xC2,0x21,0x40,0x56, +0xFA,0xA0,0xC7,0x7D,0x3A,0x13,0xE3,0xEC,0x57,0xC7,0xB3,0xD6,0xAE,0x9D,0x89,0x80, +0xF7,0x01,0xE7,0x2C,0xF6,0x96,0x2B,0x13,0x0D,0x79,0x2C,0xD9,0xC0,0xE4,0x86,0x7B, +0x4B,0x8C,0x0C,0x72,0x82,0x8A,0xFB,0x17,0xCD,0x00,0x6C,0x3A,0x13,0x3C,0xB0,0x84, +0x87,0x4B,0x16,0x7A,0x29,0xB2,0x4F,0xDB,0x1D,0xD4,0x0B,0xF3,0x66,0x37,0xBD,0xD8, +0xF6,0x57,0xBB,0x5E,0x24,0x7A,0xB8,0x3C,0x8B,0xB9,0xFA,0x92,0x1A,0x1A,0x84,0x9E, +0xD8,0x74,0x8F,0xAA,0x1B,0x7F,0x5E,0xF4,0xFE,0x45,0x22,0x21,0x02,0x03,0x01,0x00, +0x01,0xA3,0x63,0x30,0x61,0x30,0x0F,0x06,0x03,0x55,0x1D,0x13,0x01,0x01,0xFF,0x04, +0x05,0x30,0x03,0x01,0x01,0xFF,0x30,0x1D,0x06,0x03,0x55,0x1D,0x0E,0x04,0x16,0x04, +0x14,0x71,0x38,0x36,0xF2,0x02,0x31,0x53,0x47,0x2B,0x6E,0xBA,0x65,0x46,0xA9,0x10, +0x15,0x58,0x20,0x05,0x09,0x30,0x1F,0x06,0x03,0x55,0x1D,0x23,0x04,0x18,0x30,0x16, +0x80,0x14,0x71,0x38,0x36,0xF2,0x02,0x31,0x53,0x47,0x2B,0x6E,0xBA,0x65,0x46,0xA9, +0x10,0x15,0x58,0x20,0x05,0x09,0x30,0x0E,0x06,0x03,0x55,0x1D,0x0F,0x01,0x01,0xFF, +0x04,0x04,0x03,0x02,0x01,0x86,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D, +0x01,0x01,0x05,0x05,0x00,0x03,0x82,0x01,0x01,0x00,0x03,0xF7,0xB5,0x2B,0xAB,0x5D, +0x10,0xFC,0x7B,0xB2,0xB2,0x5E,0xAC,0x9B,0x0E,0x7E,0x53,0x78,0x59,0x3E,0x42,0x04, +0xFE,0x75,0xA3,0xAD,0xAC,0x81,0x4E,0xD7,0x02,0x8B,0x5E,0xC4,0x2D,0xC8,0x52,0x76, +0xC7,0x2C,0x1F,0xFC,0x81,0x32,0x98,0xD1,0x4B,0xC6,0x92,0x93,0x33,0x35,0x31,0x2F, +0xFC,0xD8,0x1D,0x44,0xDD,0xE0,0x81,0x7F,0x9D,0xE9,0x8B,0xE1,0x64,0x91,0x62,0x0B, +0x39,0x08,0x8C,0xAC,0x74,0x9D,0x59,0xD9,0x7A,0x59,0x52,0x97,0x11,0xB9,0x16,0x7B, +0x6F,0x45,0xD3,0x96,0xD9,0x31,0x7D,0x02,0x36,0x0F,0x9C,0x3B,0x6E,0xCF,0x2C,0x0D, +0x03,0x46,0x45,0xEB,0xA0,0xF4,0x7F,0x48,0x44,0xC6,0x08,0x40,0xCC,0xDE,0x1B,0x70, +0xB5,0x29,0xAD,0xBA,0x8B,0x3B,0x34,0x65,0x75,0x1B,0x71,0x21,0x1D,0x2C,0x14,0x0A, +0xB0,0x96,0x95,0xB8,0xD6,0xEA,0xF2,0x65,0xFB,0x29,0xBA,0x4F,0xEA,0x91,0x93,0x74, +0x69,0xB6,0xF2,0xFF,0xE1,0x1A,0xD0,0x0C,0xD1,0x76,0x85,0xCB,0x8A,0x25,0xBD,0x97, +0x5E,0x2C,0x6F,0x15,0x99,0x26,0xE7,0xB6,0x29,0xFF,0x22,0xEC,0xC9,0x02,0xC7,0x56, +0x00,0xCD,0x49,0xB9,0xB3,0x6C,0x7B,0x53,0x04,0x1A,0xE2,0xA8,0xC9,0xAA,0x12,0x05, +0x23,0xC2,0xCE,0xE7,0xBB,0x04,0x02,0xCC,0xC0,0x47,0xA2,0xE4,0xC4,0x29,0x2F,0x5B, +0x45,0x57,0x89,0x51,0xEE,0x3C,0xEB,0x52,0x08,0xFF,0x07,0x35,0x1E,0x9F,0x35,0x6A, +0x47,0x4A,0x56,0x98,0xD1,0x5A,0x85,0x1F,0x8C,0xF5,0x22,0xBF,0xAB,0xCE,0x83,0xF3, +0xE2,0x22,0x29,0xAE,0x7D,0x83,0x40,0xA8,0xBA,0x6C, +}; + [trustedCertificates addObject:[NSData dataWithBytes:XXX_certificate length:sizeof(XXX_certificate)]]; + } + { +/* subject:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA */ +/* issuer :/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA */ +unsigned char XXX_certificate[856]={ +0x30,0x82,0x03,0x54,0x30,0x82,0x02,0x3C,0xA0,0x03,0x02,0x01,0x02,0x02,0x03,0x02, +0x34,0x56,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05, +0x00,0x30,0x42,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53, +0x31,0x16,0x30,0x14,0x06,0x03,0x55,0x04,0x0A,0x13,0x0D,0x47,0x65,0x6F,0x54,0x72, +0x75,0x73,0x74,0x20,0x49,0x6E,0x63,0x2E,0x31,0x1B,0x30,0x19,0x06,0x03,0x55,0x04, +0x03,0x13,0x12,0x47,0x65,0x6F,0x54,0x72,0x75,0x73,0x74,0x20,0x47,0x6C,0x6F,0x62, +0x61,0x6C,0x20,0x43,0x41,0x30,0x1E,0x17,0x0D,0x30,0x32,0x30,0x35,0x32,0x31,0x30, +0x34,0x30,0x30,0x30,0x30,0x5A,0x17,0x0D,0x32,0x32,0x30,0x35,0x32,0x31,0x30,0x34, +0x30,0x30,0x30,0x30,0x5A,0x30,0x42,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06, +0x13,0x02,0x55,0x53,0x31,0x16,0x30,0x14,0x06,0x03,0x55,0x04,0x0A,0x13,0x0D,0x47, +0x65,0x6F,0x54,0x72,0x75,0x73,0x74,0x20,0x49,0x6E,0x63,0x2E,0x31,0x1B,0x30,0x19, +0x06,0x03,0x55,0x04,0x03,0x13,0x12,0x47,0x65,0x6F,0x54,0x72,0x75,0x73,0x74,0x20, +0x47,0x6C,0x6F,0x62,0x61,0x6C,0x20,0x43,0x41,0x30,0x82,0x01,0x22,0x30,0x0D,0x06, +0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0F, +0x00,0x30,0x82,0x01,0x0A,0x02,0x82,0x01,0x01,0x00,0xDA,0xCC,0x18,0x63,0x30,0xFD, +0xF4,0x17,0x23,0x1A,0x56,0x7E,0x5B,0xDF,0x3C,0x6C,0x38,0xE4,0x71,0xB7,0x78,0x91, +0xD4,0xBC,0xA1,0xD8,0x4C,0xF8,0xA8,0x43,0xB6,0x03,0xE9,0x4D,0x21,0x07,0x08,0x88, +0xDA,0x58,0x2F,0x66,0x39,0x29,0xBD,0x05,0x78,0x8B,0x9D,0x38,0xE8,0x05,0xB7,0x6A, +0x7E,0x71,0xA4,0xE6,0xC4,0x60,0xA6,0xB0,0xEF,0x80,0xE4,0x89,0x28,0x0F,0x9E,0x25, +0xD6,0xED,0x83,0xF3,0xAD,0xA6,0x91,0xC7,0x98,0xC9,0x42,0x18,0x35,0x14,0x9D,0xAD, +0x98,0x46,0x92,0x2E,0x4F,0xCA,0xF1,0x87,0x43,0xC1,0x16,0x95,0x57,0x2D,0x50,0xEF, +0x89,0x2D,0x80,0x7A,0x57,0xAD,0xF2,0xEE,0x5F,0x6B,0xD2,0x00,0x8D,0xB9,0x14,0xF8, +0x14,0x15,0x35,0xD9,0xC0,0x46,0xA3,0x7B,0x72,0xC8,0x91,0xBF,0xC9,0x55,0x2B,0xCD, +0xD0,0x97,0x3E,0x9C,0x26,0x64,0xCC,0xDF,0xCE,0x83,0x19,0x71,0xCA,0x4E,0xE6,0xD4, +0xD5,0x7B,0xA9,0x19,0xCD,0x55,0xDE,0xC8,0xEC,0xD2,0x5E,0x38,0x53,0xE5,0x5C,0x4F, +0x8C,0x2D,0xFE,0x50,0x23,0x36,0xFC,0x66,0xE6,0xCB,0x8E,0xA4,0x39,0x19,0x00,0xB7, +0x95,0x02,0x39,0x91,0x0B,0x0E,0xFE,0x38,0x2E,0xD1,0x1D,0x05,0x9A,0xF6,0x4D,0x3E, +0x6F,0x0F,0x07,0x1D,0xAF,0x2C,0x1E,0x8F,0x60,0x39,0xE2,0xFA,0x36,0x53,0x13,0x39, +0xD4,0x5E,0x26,0x2B,0xDB,0x3D,0xA8,0x14,0xBD,0x32,0xEB,0x18,0x03,0x28,0x52,0x04, +0x71,0xE5,0xAB,0x33,0x3D,0xE1,0x38,0xBB,0x07,0x36,0x84,0x62,0x9C,0x79,0xEA,0x16, +0x30,0xF4,0x5F,0xC0,0x2B,0xE8,0x71,0x6B,0xE4,0xF9,0x02,0x03,0x01,0x00,0x01,0xA3, +0x53,0x30,0x51,0x30,0x0F,0x06,0x03,0x55,0x1D,0x13,0x01,0x01,0xFF,0x04,0x05,0x30, +0x03,0x01,0x01,0xFF,0x30,0x1D,0x06,0x03,0x55,0x1D,0x0E,0x04,0x16,0x04,0x14,0xC0, +0x7A,0x98,0x68,0x8D,0x89,0xFB,0xAB,0x05,0x64,0x0C,0x11,0x7D,0xAA,0x7D,0x65,0xB8, +0xCA,0xCC,0x4E,0x30,0x1F,0x06,0x03,0x55,0x1D,0x23,0x04,0x18,0x30,0x16,0x80,0x14, +0xC0,0x7A,0x98,0x68,0x8D,0x89,0xFB,0xAB,0x05,0x64,0x0C,0x11,0x7D,0xAA,0x7D,0x65, +0xB8,0xCA,0xCC,0x4E,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01, +0x05,0x05,0x00,0x03,0x82,0x01,0x01,0x00,0x35,0xE3,0x29,0x6A,0xE5,0x2F,0x5D,0x54, +0x8E,0x29,0x50,0x94,0x9F,0x99,0x1A,0x14,0xE4,0x8F,0x78,0x2A,0x62,0x94,0xA2,0x27, +0x67,0x9E,0xD0,0xCF,0x1A,0x5E,0x47,0xE9,0xC1,0xB2,0xA4,0xCF,0xDD,0x41,0x1A,0x05, +0x4E,0x9B,0x4B,0xEE,0x4A,0x6F,0x55,0x52,0xB3,0x24,0xA1,0x37,0x0A,0xEB,0x64,0x76, +0x2A,0x2E,0x2C,0xF3,0xFD,0x3B,0x75,0x90,0xBF,0xFA,0x71,0xD8,0xC7,0x3D,0x37,0xD2, +0xB5,0x05,0x95,0x62,0xB9,0xA6,0xDE,0x89,0x3D,0x36,0x7B,0x38,0x77,0x48,0x97,0xAC, +0xA6,0x20,0x8F,0x2E,0xA6,0xC9,0x0C,0xC2,0xB2,0x99,0x45,0x00,0xC7,0xCE,0x11,0x51, +0x22,0x22,0xE0,0xA5,0xEA,0xB6,0x15,0x48,0x09,0x64,0xEA,0x5E,0x4F,0x74,0xF7,0x05, +0x3E,0xC7,0x8A,0x52,0x0C,0xDB,0x15,0xB4,0xBD,0x6D,0x9B,0xE5,0xC6,0xB1,0x54,0x68, +0xA9,0xE3,0x69,0x90,0xB6,0x9A,0xA5,0x0F,0xB8,0xB9,0x3F,0x20,0x7D,0xAE,0x4A,0xB5, +0xB8,0x9C,0xE4,0x1D,0xB6,0xAB,0xE6,0x94,0xA5,0xC1,0xC7,0x83,0xAD,0xDB,0xF5,0x27, +0x87,0x0E,0x04,0x6C,0xD5,0xFF,0xDD,0xA0,0x5D,0xED,0x87,0x52,0xB7,0x2B,0x15,0x02, +0xAE,0x39,0xA6,0x6A,0x74,0xE9,0xDA,0xC4,0xE7,0xBC,0x4D,0x34,0x1E,0xA9,0x5C,0x4D, +0x33,0x5F,0x92,0x09,0x2F,0x88,0x66,0x5D,0x77,0x97,0xC7,0x1D,0x76,0x13,0xA9,0xD5, +0xE5,0xF1,0x16,0x09,0x11,0x35,0xD5,0xAC,0xDB,0x24,0x71,0x70,0x2C,0x98,0x56,0x0B, +0xD9,0x17,0xB4,0xD1,0xE3,0x51,0x2B,0x5E,0x75,0xE8,0xD5,0xD0,0xDC,0x4F,0x34,0xED, +0xC2,0x05,0x66,0x80,0xA1,0xCB,0xE6,0x33, +}; + [trustedCertificates addObject:[NSData dataWithBytes:XXX_certificate length:sizeof(XXX_certificate)]]; + } + { +/* subject:/C=US/O=GeoTrust Inc./CN=GeoTrust Universal CA 2 */ +/* issuer :/C=US/O=GeoTrust Inc./CN=GeoTrust Universal CA 2 */ +unsigned char XXX_certificate[1392]={ +0x30,0x82,0x05,0x6C,0x30,0x82,0x03,0x54,0xA0,0x03,0x02,0x01,0x02,0x02,0x01,0x01, +0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x30, +0x47,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x16, +0x30,0x14,0x06,0x03,0x55,0x04,0x0A,0x13,0x0D,0x47,0x65,0x6F,0x54,0x72,0x75,0x73, +0x74,0x20,0x49,0x6E,0x63,0x2E,0x31,0x20,0x30,0x1E,0x06,0x03,0x55,0x04,0x03,0x13, +0x17,0x47,0x65,0x6F,0x54,0x72,0x75,0x73,0x74,0x20,0x55,0x6E,0x69,0x76,0x65,0x72, +0x73,0x61,0x6C,0x20,0x43,0x41,0x20,0x32,0x30,0x1E,0x17,0x0D,0x30,0x34,0x30,0x33, +0x30,0x34,0x30,0x35,0x30,0x30,0x30,0x30,0x5A,0x17,0x0D,0x32,0x39,0x30,0x33,0x30, +0x34,0x30,0x35,0x30,0x30,0x30,0x30,0x5A,0x30,0x47,0x31,0x0B,0x30,0x09,0x06,0x03, +0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x16,0x30,0x14,0x06,0x03,0x55,0x04,0x0A, +0x13,0x0D,0x47,0x65,0x6F,0x54,0x72,0x75,0x73,0x74,0x20,0x49,0x6E,0x63,0x2E,0x31, +0x20,0x30,0x1E,0x06,0x03,0x55,0x04,0x03,0x13,0x17,0x47,0x65,0x6F,0x54,0x72,0x75, +0x73,0x74,0x20,0x55,0x6E,0x69,0x76,0x65,0x72,0x73,0x61,0x6C,0x20,0x43,0x41,0x20, +0x32,0x30,0x82,0x02,0x22,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01, +0x01,0x01,0x05,0x00,0x03,0x82,0x02,0x0F,0x00,0x30,0x82,0x02,0x0A,0x02,0x82,0x02, +0x01,0x00,0xB3,0x54,0x52,0xC1,0xC9,0x3E,0xF2,0xD9,0xDC,0xB1,0x53,0x1A,0x59,0x29, +0xE7,0xB1,0xC3,0x45,0x28,0xE5,0xD7,0xD1,0xED,0xC5,0xC5,0x4B,0xA1,0xAA,0x74,0x7B, +0x57,0xAF,0x4A,0x26,0xFC,0xD8,0xF5,0x5E,0xA7,0x6E,0x19,0xDB,0x74,0x0C,0x4F,0x35, +0x5B,0x32,0x0B,0x01,0xE3,0xDB,0xEB,0x7A,0x77,0x35,0xEA,0xAA,0x5A,0xE0,0xD6,0xE8, +0xA1,0x57,0x94,0xF0,0x90,0xA3,0x74,0x56,0x94,0x44,0x30,0x03,0x1E,0x5C,0x4E,0x2B, +0x85,0x26,0x74,0x82,0x7A,0x0C,0x76,0xA0,0x6F,0x4D,0xCE,0x41,0x2D,0xA0,0x15,0x06, +0x14,0x5F,0xB7,0x42,0xCD,0x7B,0x8F,0x58,0x61,0x34,0xDC,0x2A,0x08,0xF9,0x2E,0xC3, +0x01,0xA6,0x22,0x44,0x1C,0x4C,0x07,0x82,0xE6,0x5B,0xCE,0xD0,0x4A,0x7C,0x04,0xD3, +0x19,0x73,0x27,0xF0,0xAA,0x98,0x7F,0x2E,0xAF,0x4E,0xEB,0x87,0x1E,0x24,0x77,0x6A, +0x5D,0xB6,0xE8,0x5B,0x45,0xBA,0xDC,0xC3,0xA1,0x05,0x6F,0x56,0x8E,0x8F,0x10,0x26, +0xA5,0x49,0xC3,0x2E,0xD7,0x41,0x87,0x22,0xE0,0x4F,0x86,0xCA,0x60,0xB5,0xEA,0xA1, +0x63,0xC0,0x01,0x97,0x10,0x79,0xBD,0x00,0x3C,0x12,0x6D,0x2B,0x15,0xB1,0xAC,0x4B, +0xB1,0xEE,0x18,0xB9,0x4E,0x96,0xDC,0xDC,0x76,0xFF,0x3B,0xBE,0xCF,0x5F,0x03,0xC0, +0xFC,0x3B,0xE8,0xBE,0x46,0x1B,0xFF,0xDA,0x40,0xC2,0x52,0xF7,0xFE,0xE3,0x3A,0xF7, +0x6A,0x77,0x35,0xD0,0xDA,0x8D,0xEB,0x5E,0x18,0x6A,0x31,0xC7,0x1E,0xBA,0x3C,0x1B, +0x28,0xD6,0x6B,0x54,0xC6,0xAA,0x5B,0xD7,0xA2,0x2C,0x1B,0x19,0xCC,0xA2,0x02,0xF6, +0x9B,0x59,0xBD,0x37,0x6B,0x86,0xB5,0x6D,0x82,0xBA,0xD8,0xEA,0xC9,0x56,0xBC,0xA9, +0x36,0x58,0xFD,0x3E,0x19,0xF3,0xED,0x0C,0x26,0xA9,0x93,0x38,0xF8,0x4F,0xC1,0x5D, +0x22,0x06,0xD0,0x97,0xEA,0xE1,0xAD,0xC6,0x55,0xE0,0x81,0x2B,0x28,0x83,0x3A,0xFA, +0xF4,0x7B,0x21,0x51,0x00,0xBE,0x52,0x38,0xCE,0xCD,0x66,0x79,0xA8,0xF4,0x81,0x56, +0xE2,0xD0,0x83,0x09,0x47,0x51,0x5B,0x50,0x6A,0xCF,0xDB,0x48,0x1A,0x5D,0x3E,0xF7, +0xCB,0xF6,0x65,0xF7,0x6C,0xF1,0x95,0xF8,0x02,0x3B,0x32,0x56,0x82,0x39,0x7A,0x5B, +0xBD,0x2F,0x89,0x1B,0xBF,0xA1,0xB4,0xE8,0xFF,0x7F,0x8D,0x8C,0xDF,0x03,0xF1,0x60, +0x4E,0x58,0x11,0x4C,0xEB,0xA3,0x3F,0x10,0x2B,0x83,0x9A,0x01,0x73,0xD9,0x94,0x6D, +0x84,0x00,0x27,0x66,0xAC,0xF0,0x70,0x40,0x09,0x42,0x92,0xAD,0x4F,0x93,0x0D,0x61, +0x09,0x51,0x24,0xD8,0x92,0xD5,0x0B,0x94,0x61,0xB2,0x87,0xB2,0xED,0xFF,0x9A,0x35, +0xFF,0x85,0x54,0xCA,0xED,0x44,0x43,0xAC,0x1B,0x3C,0x16,0x6B,0x48,0x4A,0x0A,0x1C, +0x40,0x88,0x1F,0x92,0xC2,0x0B,0x00,0x05,0xFF,0xF2,0xC8,0x02,0x4A,0xA4,0xAA,0xA9, +0xCC,0x99,0x96,0x9C,0x2F,0x58,0xE0,0x7D,0xE1,0xBE,0xBB,0x07,0xDC,0x5F,0x04,0x72, +0x5C,0x31,0x34,0xC3,0xEC,0x5F,0x2D,0xE0,0x3D,0x64,0x90,0x22,0xE6,0xD1,0xEC,0xB8, +0x2E,0xDD,0x59,0xAE,0xD9,0xA1,0x37,0xBF,0x54,0x35,0xDC,0x73,0x32,0x4F,0x8C,0x04, +0x1E,0x33,0xB2,0xC9,0x46,0xF1,0xD8,0x5C,0xC8,0x55,0x50,0xC9,0x68,0xBD,0xA8,0xBA, +0x36,0x09,0x02,0x03,0x01,0x00,0x01,0xA3,0x63,0x30,0x61,0x30,0x0F,0x06,0x03,0x55, +0x1D,0x13,0x01,0x01,0xFF,0x04,0x05,0x30,0x03,0x01,0x01,0xFF,0x30,0x1D,0x06,0x03, +0x55,0x1D,0x0E,0x04,0x16,0x04,0x14,0x76,0xF3,0x55,0xE1,0xFA,0xA4,0x36,0xFB,0xF0, +0x9F,0x5C,0x62,0x71,0xED,0x3C,0xF4,0x47,0x38,0x10,0x2B,0x30,0x1F,0x06,0x03,0x55, +0x1D,0x23,0x04,0x18,0x30,0x16,0x80,0x14,0x76,0xF3,0x55,0xE1,0xFA,0xA4,0x36,0xFB, +0xF0,0x9F,0x5C,0x62,0x71,0xED,0x3C,0xF4,0x47,0x38,0x10,0x2B,0x30,0x0E,0x06,0x03, +0x55,0x1D,0x0F,0x01,0x01,0xFF,0x04,0x04,0x03,0x02,0x01,0x86,0x30,0x0D,0x06,0x09, +0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x03,0x82,0x02,0x01,0x00, +0x66,0xC1,0xC6,0x23,0xF3,0xD9,0xE0,0x2E,0x6E,0x5F,0xE8,0xCF,0xAE,0xB0,0xB0,0x25, +0x4D,0x2B,0xF8,0x3B,0x58,0x9B,0x40,0x24,0x37,0x5A,0xCB,0xAB,0x16,0x49,0xFF,0xB3, +0x75,0x79,0x33,0xA1,0x2F,0x6D,0x70,0x17,0x34,0x91,0xFE,0x67,0x7E,0x8F,0xEC,0x9B, +0xE5,0x5E,0x82,0xA9,0x55,0x1F,0x2F,0xDC,0xD4,0x51,0x07,0x12,0xFE,0xAC,0x16,0x3E, +0x2C,0x35,0xC6,0x63,0xFC,0xDC,0x10,0xEB,0x0D,0xA3,0xAA,0xD0,0x7C,0xCC,0xD1,0xD0, +0x2F,0x51,0x2E,0xC4,0x14,0x5A,0xDE,0xE8,0x19,0xE1,0x3E,0xC6,0xCC,0xA4,0x29,0xE7, +0x2E,0x84,0xAA,0x06,0x30,0x78,0x76,0x54,0x73,0x28,0x98,0x59,0x38,0xE0,0x00,0x0D, +0x62,0xD3,0x42,0x7D,0x21,0x9F,0xAE,0x3D,0x3A,0x8C,0xD5,0xFA,0x77,0x0D,0x18,0x2B, +0x16,0x0E,0x5F,0x36,0xE1,0xFC,0x2A,0xB5,0x30,0x24,0xCF,0xE0,0x63,0x0C,0x7B,0x58, +0x1A,0xFE,0x99,0xBA,0x42,0x12,0xB1,0x91,0xF4,0x7C,0x68,0xE2,0xC8,0xE8,0xAF,0x2C, +0xEA,0xC9,0x7E,0xAE,0xBB,0x2A,0x3D,0x0D,0x15,0xDC,0x34,0x95,0xB6,0x18,0x74,0xA8, +0x6A,0x0F,0xC7,0xB4,0xF4,0x13,0xC4,0xE4,0x5B,0xED,0x0A,0xD2,0xA4,0x97,0x4C,0x2A, +0xED,0x2F,0x6C,0x12,0x89,0x3D,0xF1,0x27,0x70,0xAA,0x6A,0x03,0x52,0x21,0x9F,0x40, +0xA8,0x67,0x50,0xF2,0xF3,0x5A,0x1F,0xDF,0xDF,0x23,0xF6,0xDC,0x78,0x4E,0xE6,0x98, +0x4F,0x55,0x3A,0x53,0xE3,0xEF,0xF2,0xF4,0x9F,0xC7,0x7C,0xD8,0x58,0xAF,0x29,0x22, +0x97,0xB8,0xE0,0xBD,0x91,0x2E,0xB0,0x76,0xEC,0x57,0x11,0xCF,0xEF,0x29,0x44,0xF3, +0xE9,0x85,0x7A,0x60,0x63,0xE4,0x5D,0x33,0x89,0x17,0xD9,0x31,0xAA,0xDA,0xD6,0xF3, +0x18,0x35,0x72,0xCF,0x87,0x2B,0x2F,0x63,0x23,0x84,0x5D,0x84,0x8C,0x3F,0x57,0xA0, +0x88,0xFC,0x99,0x91,0x28,0x26,0x69,0x99,0xD4,0x8F,0x97,0x44,0xBE,0x8E,0xD5,0x48, +0xB1,0xA4,0x28,0x29,0xF1,0x15,0xB4,0xE1,0xE5,0x9E,0xDD,0xF8,0x8F,0xA6,0x6F,0x26, +0xD7,0x09,0x3C,0x3A,0x1C,0x11,0x0E,0xA6,0x6C,0x37,0xF7,0xAD,0x44,0x87,0x2C,0x28, +0xC7,0xD8,0x74,0x82,0xB3,0xD0,0x6F,0x4A,0x57,0xBB,0x35,0x29,0x27,0xA0,0x8B,0xE8, +0x21,0xA7,0x87,0x64,0x36,0x5D,0xCC,0xD8,0x16,0xAC,0xC7,0xB2,0x27,0x40,0x92,0x55, +0x38,0x28,0x8D,0x51,0x6E,0xDD,0x14,0x67,0x53,0x6C,0x71,0x5C,0x26,0x84,0x4D,0x75, +0x5A,0xB6,0x7E,0x60,0x56,0xA9,0x4D,0xAD,0xFB,0x9B,0x1E,0x97,0xF3,0x0D,0xD9,0xD2, +0x97,0x54,0x77,0xDA,0x3D,0x12,0xB7,0xE0,0x1E,0xEF,0x08,0x06,0xAC,0xF9,0x85,0x87, +0xE9,0xA2,0xDC,0xAF,0x7E,0x18,0x12,0x83,0xFD,0x56,0x17,0x41,0x2E,0xD5,0x29,0x82, +0x7D,0x99,0xF4,0x31,0xF6,0x71,0xA9,0xCF,0x2C,0x01,0x27,0xA5,0x05,0xB9,0xAA,0xB2, +0x48,0x4E,0x2A,0xEF,0x9F,0x93,0x52,0x51,0x95,0x3C,0x52,0x73,0x8E,0x56,0x4C,0x17, +0x40,0xC0,0x09,0x28,0xE4,0x8B,0x6A,0x48,0x53,0xDB,0xEC,0xCD,0x55,0x55,0xF1,0xC6, +0xF8,0xE9,0xA2,0x2C,0x4C,0xA6,0xD1,0x26,0x5F,0x7E,0xAF,0x5A,0x4C,0xDA,0x1F,0xA6, +0xF2,0x1C,0x2C,0x7E,0xAE,0x02,0x16,0xD2,0x56,0xD0,0x2F,0x57,0x53,0x47,0xE8,0x92, +}; + [trustedCertificates addObject:[NSData dataWithBytes:XXX_certificate length:sizeof(XXX_certificate)]]; + } + { +/* subject:/C=US/O=GeoTrust Inc./CN=GeoTrust Universal CA */ +/* issuer :/C=US/O=GeoTrust Inc./CN=GeoTrust Universal CA */ +unsigned char XXX_certificate[1388]={ +0x30,0x82,0x05,0x68,0x30,0x82,0x03,0x50,0xA0,0x03,0x02,0x01,0x02,0x02,0x01,0x01, +0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x30, +0x45,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x16, +0x30,0x14,0x06,0x03,0x55,0x04,0x0A,0x13,0x0D,0x47,0x65,0x6F,0x54,0x72,0x75,0x73, +0x74,0x20,0x49,0x6E,0x63,0x2E,0x31,0x1E,0x30,0x1C,0x06,0x03,0x55,0x04,0x03,0x13, +0x15,0x47,0x65,0x6F,0x54,0x72,0x75,0x73,0x74,0x20,0x55,0x6E,0x69,0x76,0x65,0x72, +0x73,0x61,0x6C,0x20,0x43,0x41,0x30,0x1E,0x17,0x0D,0x30,0x34,0x30,0x33,0x30,0x34, +0x30,0x35,0x30,0x30,0x30,0x30,0x5A,0x17,0x0D,0x32,0x39,0x30,0x33,0x30,0x34,0x30, +0x35,0x30,0x30,0x30,0x30,0x5A,0x30,0x45,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04, +0x06,0x13,0x02,0x55,0x53,0x31,0x16,0x30,0x14,0x06,0x03,0x55,0x04,0x0A,0x13,0x0D, +0x47,0x65,0x6F,0x54,0x72,0x75,0x73,0x74,0x20,0x49,0x6E,0x63,0x2E,0x31,0x1E,0x30, +0x1C,0x06,0x03,0x55,0x04,0x03,0x13,0x15,0x47,0x65,0x6F,0x54,0x72,0x75,0x73,0x74, +0x20,0x55,0x6E,0x69,0x76,0x65,0x72,0x73,0x61,0x6C,0x20,0x43,0x41,0x30,0x82,0x02, +0x22,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x01,0x05,0x00, +0x03,0x82,0x02,0x0F,0x00,0x30,0x82,0x02,0x0A,0x02,0x82,0x02,0x01,0x00,0xA6,0x15, +0x55,0xA0,0xA3,0xC6,0xE0,0x1F,0x8C,0x9D,0x21,0x50,0xD7,0xC1,0xBE,0x2B,0x5B,0xB5, +0xA4,0x9E,0xA1,0xD9,0x72,0x58,0xBD,0x00,0x1B,0x4C,0xBF,0x61,0xC9,0x14,0x1D,0x45, +0x82,0xAB,0xC6,0x1D,0x80,0xD6,0x3D,0xEB,0x10,0x9C,0x3A,0xAF,0x6D,0x24,0xF8,0xBC, +0x71,0x01,0x9E,0x06,0xF5,0x7C,0x5F,0x1E,0xC1,0x0E,0x55,0xCA,0x83,0x9A,0x59,0x30, +0xAE,0x19,0xCB,0x30,0x48,0x95,0xED,0x22,0x37,0x8D,0xF4,0x4A,0x9A,0x72,0x66,0x3E, +0xAD,0x95,0xC0,0xE0,0x16,0x00,0xE0,0x10,0x1F,0x2B,0x31,0x0E,0xD7,0x94,0x54,0xD3, +0x42,0x33,0xA0,0x34,0x1D,0x1E,0x45,0x76,0xDD,0x4F,0xCA,0x18,0x37,0xEC,0x85,0x15, +0x7A,0x19,0x08,0xFC,0xD5,0xC7,0x9C,0xF0,0xF2,0xA9,0x2E,0x10,0xA9,0x92,0xE6,0x3D, +0x58,0x3D,0xA9,0x16,0x68,0x3C,0x2F,0x75,0x21,0x18,0x7F,0x28,0x77,0xA5,0xE1,0x61, +0x17,0xB7,0xA6,0xE9,0xF8,0x1E,0x99,0xDB,0x73,0x6E,0xF4,0x0A,0xA2,0x21,0x6C,0xEE, +0xDA,0xAA,0x85,0x92,0x66,0xAF,0xF6,0x7A,0x6B,0x82,0xDA,0xBA,0x22,0x08,0x35,0x0F, +0xCF,0x42,0xF1,0x35,0xFA,0x6A,0xEE,0x7E,0x2B,0x25,0xCC,0x3A,0x11,0xE4,0x6D,0xAF, +0x73,0xB2,0x76,0x1D,0xAD,0xD0,0xB2,0x78,0x67,0x1A,0xA4,0x39,0x1C,0x51,0x0B,0x67, +0x56,0x83,0xFD,0x38,0x5D,0x0D,0xCE,0xDD,0xF0,0xBB,0x2B,0x96,0x1F,0xDE,0x7B,0x32, +0x52,0xFD,0x1D,0xBB,0xB5,0x06,0xA1,0xB2,0x21,0x5E,0xA5,0xD6,0x95,0x68,0x7F,0xF0, +0x99,0x9E,0xDC,0x45,0x08,0x3E,0xE7,0xD2,0x09,0x0D,0x35,0x94,0xDD,0x80,0x4E,0x53, +0x97,0xD7,0xB5,0x09,0x44,0x20,0x64,0x16,0x17,0x03,0x02,0x4C,0x53,0x0D,0x68,0xDE, +0xD5,0xAA,0x72,0x4D,0x93,0x6D,0x82,0x0E,0xDB,0x9C,0xBD,0xCF,0xB4,0xF3,0x5C,0x5D, +0x54,0x7A,0x69,0x09,0x96,0xD6,0xDB,0x11,0xC1,0x8D,0x75,0xA8,0xB4,0xCF,0x39,0xC8, +0xCE,0x3C,0xBC,0x24,0x7C,0xE6,0x62,0xCA,0xE1,0xBD,0x7D,0xA7,0xBD,0x57,0x65,0x0B, +0xE4,0xFE,0x25,0xED,0xB6,0x69,0x10,0xDC,0x28,0x1A,0x46,0xBD,0x01,0x1D,0xD0,0x97, +0xB5,0xE1,0x98,0x3B,0xC0,0x37,0x64,0xD6,0x3D,0x94,0xEE,0x0B,0xE1,0xF5,0x28,0xAE, +0x0B,0x56,0xBF,0x71,0x8B,0x23,0x29,0x41,0x8E,0x86,0xC5,0x4B,0x52,0x7B,0xD8,0x71, +0xAB,0x1F,0x8A,0x15,0xA6,0x3B,0x83,0x5A,0xD7,0x58,0x01,0x51,0xC6,0x4C,0x41,0xD9, +0x7F,0xD8,0x41,0x67,0x72,0xA2,0x28,0xDF,0x60,0x83,0xA9,0x9E,0xC8,0x7B,0xFC,0x53, +0x73,0x72,0x59,0xF5,0x93,0x7A,0x17,0x76,0x0E,0xCE,0xF7,0xE5,0x5C,0xD9,0x0B,0x55, +0x34,0xA2,0xAA,0x5B,0xB5,0x6A,0x54,0xE7,0x13,0xCA,0x57,0xEC,0x97,0x6D,0xF4,0x5E, +0x06,0x2F,0x45,0x8B,0x58,0xD4,0x23,0x16,0x92,0xE4,0x16,0x6E,0x28,0x63,0x59,0x30, +0xDF,0x50,0x01,0x9C,0x63,0x89,0x1A,0x9F,0xDB,0x17,0x94,0x82,0x70,0x37,0xC3,0x24, +0x9E,0x9A,0x47,0xD6,0x5A,0xCA,0x4E,0xA8,0x69,0x89,0x72,0x1F,0x91,0x6C,0xDB,0x7E, +0x9E,0x1B,0xAD,0xC7,0x1F,0x73,0xDD,0x2C,0x4F,0x19,0x65,0xFD,0x7F,0x93,0x40,0x10, +0x2E,0xD2,0xF0,0xED,0x3C,0x9E,0x2E,0x28,0x3E,0x69,0x26,0x33,0xC5,0x7B,0x02,0x03, +0x01,0x00,0x01,0xA3,0x63,0x30,0x61,0x30,0x0F,0x06,0x03,0x55,0x1D,0x13,0x01,0x01, +0xFF,0x04,0x05,0x30,0x03,0x01,0x01,0xFF,0x30,0x1D,0x06,0x03,0x55,0x1D,0x0E,0x04, +0x16,0x04,0x14,0xDA,0xBB,0x2E,0xAA,0xB0,0x0C,0xB8,0x88,0x26,0x51,0x74,0x5C,0x6D, +0x03,0xD3,0xC0,0xD8,0x8F,0x7A,0xD6,0x30,0x1F,0x06,0x03,0x55,0x1D,0x23,0x04,0x18, +0x30,0x16,0x80,0x14,0xDA,0xBB,0x2E,0xAA,0xB0,0x0C,0xB8,0x88,0x26,0x51,0x74,0x5C, +0x6D,0x03,0xD3,0xC0,0xD8,0x8F,0x7A,0xD6,0x30,0x0E,0x06,0x03,0x55,0x1D,0x0F,0x01, +0x01,0xFF,0x04,0x04,0x03,0x02,0x01,0x86,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86, +0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x03,0x82,0x02,0x01,0x00,0x31,0x78,0xE6,0xC7, +0xB5,0xDF,0xB8,0x94,0x40,0xC9,0x71,0xC4,0xA8,0x35,0xEC,0x46,0x1D,0xC2,0x85,0xF3, +0x28,0x58,0x86,0xB0,0x0B,0xFC,0x8E,0xB2,0x39,0x8F,0x44,0x55,0xAB,0x64,0x84,0x5C, +0x69,0xA9,0xD0,0x9A,0x38,0x3C,0xFA,0xE5,0x1F,0x35,0xE5,0x44,0xE3,0x80,0x79,0x94, +0x68,0xA4,0xBB,0xC4,0x9F,0x3D,0xE1,0x34,0xCD,0x30,0x46,0x8B,0x54,0x2B,0x95,0xA5, +0xEF,0xF7,0x3F,0x99,0x84,0xFD,0x35,0xE6,0xCF,0x31,0xC6,0xDC,0x6A,0xBF,0xA7,0xD7, +0x23,0x08,0xE1,0x98,0x5E,0xC3,0x5A,0x08,0x76,0xA9,0xA6,0xAF,0x77,0x2F,0xB7,0x60, +0xBD,0x44,0x46,0x6A,0xEF,0x97,0xFF,0x73,0x95,0xC1,0x8E,0xE8,0x93,0xFB,0xFD,0x31, +0xB7,0xEC,0x57,0x11,0x11,0x45,0x9B,0x30,0xF1,0x1A,0x88,0x39,0xC1,0x4F,0x3C,0xA7, +0x00,0xD5,0xC7,0xFC,0xAB,0x6D,0x80,0x22,0x70,0xA5,0x0C,0xE0,0x5D,0x04,0x29,0x02, +0xFB,0xCB,0xA0,0x91,0xD1,0x7C,0xD6,0xC3,0x7E,0x50,0xD5,0x9D,0x58,0xBE,0x41,0x38, +0xEB,0xB9,0x75,0x3C,0x15,0xD9,0x9B,0xC9,0x4A,0x83,0x59,0xC0,0xDA,0x53,0xFD,0x33, +0xBB,0x36,0x18,0x9B,0x85,0x0F,0x15,0xDD,0xEE,0x2D,0xAC,0x76,0x93,0xB9,0xD9,0x01, +0x8D,0x48,0x10,0xA8,0xFB,0xF5,0x38,0x86,0xF1,0xDB,0x0A,0xC6,0xBD,0x84,0xA3,0x23, +0x41,0xDE,0xD6,0x77,0x6F,0x85,0xD4,0x85,0x1C,0x50,0xE0,0xAE,0x51,0x8A,0xBA,0x8D, +0x3E,0x76,0xE2,0xB9,0xCA,0x27,0xF2,0x5F,0x9F,0xEF,0x6E,0x59,0x0D,0x06,0xD8,0x2B, +0x17,0xA4,0xD2,0x7C,0x6B,0xBB,0x5F,0x14,0x1A,0x48,0x8F,0x1A,0x4C,0xE7,0xB3,0x47, +0x1C,0x8E,0x4C,0x45,0x2B,0x20,0xEE,0x48,0xDF,0xE7,0xDD,0x09,0x8E,0x18,0xA8,0xDA, +0x40,0x8D,0x92,0x26,0x11,0x53,0x61,0x73,0x5D,0xEB,0xBD,0xE7,0xC4,0x4D,0x29,0x37, +0x61,0xEB,0xAC,0x39,0x2D,0x67,0x2E,0x16,0xD6,0xF5,0x00,0x83,0x85,0xA1,0xCC,0x7F, +0x76,0xC4,0x7D,0xE4,0xB7,0x4B,0x66,0xEF,0x03,0x45,0x60,0x69,0xB6,0x0C,0x52,0x96, +0x92,0x84,0x5E,0xA6,0xA3,0xB5,0xA4,0x3E,0x2B,0xD9,0xCC,0xD8,0x1B,0x47,0xAA,0xF2, +0x44,0xDA,0x4F,0xF9,0x03,0xE8,0xF0,0x14,0xCB,0x3F,0xF3,0x83,0xDE,0xD0,0xC1,0x54, +0xE3,0xB7,0xE8,0x0A,0x37,0x4D,0x8B,0x20,0x59,0x03,0x30,0x19,0xA1,0x2C,0xC8,0xBD, +0x11,0x1F,0xDF,0xAE,0xC9,0x4A,0xC5,0xF3,0x27,0x66,0x66,0x86,0xAC,0x68,0x91,0xFF, +0xD9,0xE6,0x53,0x1C,0x0F,0x8B,0x5C,0x69,0x65,0x0A,0x26,0xC8,0x1E,0x34,0xC3,0x5D, +0x51,0x7B,0xD7,0xA9,0x9C,0x06,0xA1,0x36,0xDD,0xD5,0x89,0x94,0xBC,0xD9,0xE4,0x2D, +0x0C,0x5E,0x09,0x6C,0x08,0x97,0x7C,0xA3,0x3D,0x7C,0x93,0xFF,0x3F,0xA1,0x14,0xA7, +0xCF,0xB5,0x5D,0xEB,0xDB,0xDB,0x1C,0xC4,0x76,0xDF,0x88,0xB9,0xBD,0x45,0x05,0x95, +0x1B,0xAE,0xFC,0x46,0x6A,0x4C,0xAF,0x48,0xE3,0xCE,0xAE,0x0F,0xD2,0x7E,0xEB,0xE6, +0x6C,0x9C,0x4F,0x81,0x6A,0x7A,0x64,0xAC,0xBB,0x3E,0xD5,0xE7,0xCB,0x76,0x2E,0xC5, +0xA7,0x48,0xC1,0x5C,0x90,0x0F,0xCB,0xC8,0x3F,0xFA,0xE6,0x32,0xE1,0x8D,0x1B,0x6F, +0xA4,0xE6,0x8E,0xD8,0xF9,0x29,0x48,0x8A,0xCE,0x73,0xFE,0x2C, +}; + [trustedCertificates addObject:[NSData dataWithBytes:XXX_certificate length:sizeof(XXX_certificate)]]; + } + { +/* subject:/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc./CN=Go Daddy Root Certificate Authority - G2 */ +/* issuer :/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc./CN=Go Daddy Root Certificate Authority - G2 */ +unsigned char XXX_certificate[969]={ +0x30,0x82,0x03,0xC5,0x30,0x82,0x02,0xAD,0xA0,0x03,0x02,0x01,0x02,0x02,0x01,0x00, +0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x0B,0x05,0x00,0x30, +0x81,0x83,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31, +0x10,0x30,0x0E,0x06,0x03,0x55,0x04,0x08,0x13,0x07,0x41,0x72,0x69,0x7A,0x6F,0x6E, +0x61,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x07,0x13,0x0A,0x53,0x63,0x6F,0x74, +0x74,0x73,0x64,0x61,0x6C,0x65,0x31,0x1A,0x30,0x18,0x06,0x03,0x55,0x04,0x0A,0x13, +0x11,0x47,0x6F,0x44,0x61,0x64,0x64,0x79,0x2E,0x63,0x6F,0x6D,0x2C,0x20,0x49,0x6E, +0x63,0x2E,0x31,0x31,0x30,0x2F,0x06,0x03,0x55,0x04,0x03,0x13,0x28,0x47,0x6F,0x20, +0x44,0x61,0x64,0x64,0x79,0x20,0x52,0x6F,0x6F,0x74,0x20,0x43,0x65,0x72,0x74,0x69, +0x66,0x69,0x63,0x61,0x74,0x65,0x20,0x41,0x75,0x74,0x68,0x6F,0x72,0x69,0x74,0x79, +0x20,0x2D,0x20,0x47,0x32,0x30,0x1E,0x17,0x0D,0x30,0x39,0x30,0x39,0x30,0x31,0x30, +0x30,0x30,0x30,0x30,0x30,0x5A,0x17,0x0D,0x33,0x37,0x31,0x32,0x33,0x31,0x32,0x33, +0x35,0x39,0x35,0x39,0x5A,0x30,0x81,0x83,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04, +0x06,0x13,0x02,0x55,0x53,0x31,0x10,0x30,0x0E,0x06,0x03,0x55,0x04,0x08,0x13,0x07, +0x41,0x72,0x69,0x7A,0x6F,0x6E,0x61,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x07, +0x13,0x0A,0x53,0x63,0x6F,0x74,0x74,0x73,0x64,0x61,0x6C,0x65,0x31,0x1A,0x30,0x18, +0x06,0x03,0x55,0x04,0x0A,0x13,0x11,0x47,0x6F,0x44,0x61,0x64,0x64,0x79,0x2E,0x63, +0x6F,0x6D,0x2C,0x20,0x49,0x6E,0x63,0x2E,0x31,0x31,0x30,0x2F,0x06,0x03,0x55,0x04, +0x03,0x13,0x28,0x47,0x6F,0x20,0x44,0x61,0x64,0x64,0x79,0x20,0x52,0x6F,0x6F,0x74, +0x20,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x65,0x20,0x41,0x75,0x74, +0x68,0x6F,0x72,0x69,0x74,0x79,0x20,0x2D,0x20,0x47,0x32,0x30,0x82,0x01,0x22,0x30, +0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x01,0x05,0x00,0x03,0x82, +0x01,0x0F,0x00,0x30,0x82,0x01,0x0A,0x02,0x82,0x01,0x01,0x00,0xBF,0x71,0x62,0x08, +0xF1,0xFA,0x59,0x34,0xF7,0x1B,0xC9,0x18,0xA3,0xF7,0x80,0x49,0x58,0xE9,0x22,0x83, +0x13,0xA6,0xC5,0x20,0x43,0x01,0x3B,0x84,0xF1,0xE6,0x85,0x49,0x9F,0x27,0xEA,0xF6, +0x84,0x1B,0x4E,0xA0,0xB4,0xDB,0x70,0x98,0xC7,0x32,0x01,0xB1,0x05,0x3E,0x07,0x4E, +0xEE,0xF4,0xFA,0x4F,0x2F,0x59,0x30,0x22,0xE7,0xAB,0x19,0x56,0x6B,0xE2,0x80,0x07, +0xFC,0xF3,0x16,0x75,0x80,0x39,0x51,0x7B,0xE5,0xF9,0x35,0xB6,0x74,0x4E,0xA9,0x8D, +0x82,0x13,0xE4,0xB6,0x3F,0xA9,0x03,0x83,0xFA,0xA2,0xBE,0x8A,0x15,0x6A,0x7F,0xDE, +0x0B,0xC3,0xB6,0x19,0x14,0x05,0xCA,0xEA,0xC3,0xA8,0x04,0x94,0x3B,0x46,0x7C,0x32, +0x0D,0xF3,0x00,0x66,0x22,0xC8,0x8D,0x69,0x6D,0x36,0x8C,0x11,0x18,0xB7,0xD3,0xB2, +0x1C,0x60,0xB4,0x38,0xFA,0x02,0x8C,0xCE,0xD3,0xDD,0x46,0x07,0xDE,0x0A,0x3E,0xEB, +0x5D,0x7C,0xC8,0x7C,0xFB,0xB0,0x2B,0x53,0xA4,0x92,0x62,0x69,0x51,0x25,0x05,0x61, +0x1A,0x44,0x81,0x8C,0x2C,0xA9,0x43,0x96,0x23,0xDF,0xAC,0x3A,0x81,0x9A,0x0E,0x29, +0xC5,0x1C,0xA9,0xE9,0x5D,0x1E,0xB6,0x9E,0x9E,0x30,0x0A,0x39,0xCE,0xF1,0x88,0x80, +0xFB,0x4B,0x5D,0xCC,0x32,0xEC,0x85,0x62,0x43,0x25,0x34,0x02,0x56,0x27,0x01,0x91, +0xB4,0x3B,0x70,0x2A,0x3F,0x6E,0xB1,0xE8,0x9C,0x88,0x01,0x7D,0x9F,0xD4,0xF9,0xDB, +0x53,0x6D,0x60,0x9D,0xBF,0x2C,0xE7,0x58,0xAB,0xB8,0x5F,0x46,0xFC,0xCE,0xC4,0x1B, +0x03,0x3C,0x09,0xEB,0x49,0x31,0x5C,0x69,0x46,0xB3,0xE0,0x47,0x02,0x03,0x01,0x00, +0x01,0xA3,0x42,0x30,0x40,0x30,0x0F,0x06,0x03,0x55,0x1D,0x13,0x01,0x01,0xFF,0x04, +0x05,0x30,0x03,0x01,0x01,0xFF,0x30,0x0E,0x06,0x03,0x55,0x1D,0x0F,0x01,0x01,0xFF, +0x04,0x04,0x03,0x02,0x01,0x06,0x30,0x1D,0x06,0x03,0x55,0x1D,0x0E,0x04,0x16,0x04, +0x14,0x3A,0x9A,0x85,0x07,0x10,0x67,0x28,0xB6,0xEF,0xF6,0xBD,0x05,0x41,0x6E,0x20, +0xC1,0x94,0xDA,0x0F,0xDE,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01, +0x01,0x0B,0x05,0x00,0x03,0x82,0x01,0x01,0x00,0x99,0xDB,0x5D,0x79,0xD5,0xF9,0x97, +0x59,0x67,0x03,0x61,0xF1,0x7E,0x3B,0x06,0x31,0x75,0x2D,0xA1,0x20,0x8E,0x4F,0x65, +0x87,0xB4,0xF7,0xA6,0x9C,0xBC,0xD8,0xE9,0x2F,0xD0,0xDB,0x5A,0xEE,0xCF,0x74,0x8C, +0x73,0xB4,0x38,0x42,0xDA,0x05,0x7B,0xF8,0x02,0x75,0xB8,0xFD,0xA5,0xB1,0xD7,0xAE, +0xF6,0xD7,0xDE,0x13,0xCB,0x53,0x10,0x7E,0x8A,0x46,0xD1,0x97,0xFA,0xB7,0x2E,0x2B, +0x11,0xAB,0x90,0xB0,0x27,0x80,0xF9,0xE8,0x9F,0x5A,0xE9,0x37,0x9F,0xAB,0xE4,0xDF, +0x6C,0xB3,0x85,0x17,0x9D,0x3D,0xD9,0x24,0x4F,0x79,0x91,0x35,0xD6,0x5F,0x04,0xEB, +0x80,0x83,0xAB,0x9A,0x02,0x2D,0xB5,0x10,0xF4,0xD8,0x90,0xC7,0x04,0x73,0x40,0xED, +0x72,0x25,0xA0,0xA9,0x9F,0xEC,0x9E,0xAB,0x68,0x12,0x99,0x57,0xC6,0x8F,0x12,0x3A, +0x09,0xA4,0xBD,0x44,0xFD,0x06,0x15,0x37,0xC1,0x9B,0xE4,0x32,0xA3,0xED,0x38,0xE8, +0xD8,0x64,0xF3,0x2C,0x7E,0x14,0xFC,0x02,0xEA,0x9F,0xCD,0xFF,0x07,0x68,0x17,0xDB, +0x22,0x90,0x38,0x2D,0x7A,0x8D,0xD1,0x54,0xF1,0x69,0xE3,0x5F,0x33,0xCA,0x7A,0x3D, +0x7B,0x0A,0xE3,0xCA,0x7F,0x5F,0x39,0xE5,0xE2,0x75,0xBA,0xC5,0x76,0x18,0x33,0xCE, +0x2C,0xF0,0x2F,0x4C,0xAD,0xF7,0xB1,0xE7,0xCE,0x4F,0xA8,0xC4,0x9B,0x4A,0x54,0x06, +0xC5,0x7F,0x7D,0xD5,0x08,0x0F,0xE2,0x1C,0xFE,0x7E,0x17,0xB8,0xAC,0x5E,0xF6,0xD4, +0x16,0xB2,0x43,0x09,0x0C,0x4D,0xF6,0xA7,0x6B,0xB4,0x99,0x84,0x65,0xCA,0x7A,0x88, +0xE2,0xE2,0x44,0xBE,0x5C,0xF7,0xEA,0x1C,0xF5, +}; + [trustedCertificates addObject:[NSData dataWithBytes:XXX_certificate length:sizeof(XXX_certificate)]]; + } + { +/* subject:/C=US/O=SecureTrust Corporation/CN=SecureTrust CA */ +/* issuer :/C=US/O=SecureTrust Corporation/CN=SecureTrust CA */ +unsigned char XXX_certificate[956]={ +0x30,0x82,0x03,0xB8,0x30,0x82,0x02,0xA0,0xA0,0x03,0x02,0x01,0x02,0x02,0x10,0x0C, +0xF0,0x8E,0x5C,0x08,0x16,0xA5,0xAD,0x42,0x7F,0xF0,0xEB,0x27,0x18,0x59,0xD0,0x30, +0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x30,0x48, +0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x20,0x30, +0x1E,0x06,0x03,0x55,0x04,0x0A,0x13,0x17,0x53,0x65,0x63,0x75,0x72,0x65,0x54,0x72, +0x75,0x73,0x74,0x20,0x43,0x6F,0x72,0x70,0x6F,0x72,0x61,0x74,0x69,0x6F,0x6E,0x31, +0x17,0x30,0x15,0x06,0x03,0x55,0x04,0x03,0x13,0x0E,0x53,0x65,0x63,0x75,0x72,0x65, +0x54,0x72,0x75,0x73,0x74,0x20,0x43,0x41,0x30,0x1E,0x17,0x0D,0x30,0x36,0x31,0x31, +0x30,0x37,0x31,0x39,0x33,0x31,0x31,0x38,0x5A,0x17,0x0D,0x32,0x39,0x31,0x32,0x33, +0x31,0x31,0x39,0x34,0x30,0x35,0x35,0x5A,0x30,0x48,0x31,0x0B,0x30,0x09,0x06,0x03, +0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x20,0x30,0x1E,0x06,0x03,0x55,0x04,0x0A, +0x13,0x17,0x53,0x65,0x63,0x75,0x72,0x65,0x54,0x72,0x75,0x73,0x74,0x20,0x43,0x6F, +0x72,0x70,0x6F,0x72,0x61,0x74,0x69,0x6F,0x6E,0x31,0x17,0x30,0x15,0x06,0x03,0x55, +0x04,0x03,0x13,0x0E,0x53,0x65,0x63,0x75,0x72,0x65,0x54,0x72,0x75,0x73,0x74,0x20, +0x43,0x41,0x30,0x82,0x01,0x22,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D, +0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0F,0x00,0x30,0x82,0x01,0x0A,0x02,0x82, +0x01,0x01,0x00,0xAB,0xA4,0x81,0xE5,0x95,0xCD,0xF5,0xF6,0x14,0x8E,0xC2,0x4F,0xCA, +0xD4,0xE2,0x78,0x95,0x58,0x9C,0x41,0xE1,0x0D,0x99,0x40,0x24,0x17,0x39,0x91,0x33, +0x66,0xE9,0xBE,0xE1,0x83,0xAF,0x62,0x5C,0x89,0xD1,0xFC,0x24,0x5B,0x61,0xB3,0xE0, +0x11,0x11,0x41,0x1C,0x1D,0x6E,0xF0,0xB8,0xBB,0xF8,0xDE,0xA7,0x81,0xBA,0xA6,0x48, +0xC6,0x9F,0x1D,0xBD,0xBE,0x8E,0xA9,0x41,0x3E,0xB8,0x94,0xED,0x29,0x1A,0xD4,0x8E, +0xD2,0x03,0x1D,0x03,0xEF,0x6D,0x0D,0x67,0x1C,0x57,0xD7,0x06,0xAD,0xCA,0xC8,0xF5, +0xFE,0x0E,0xAF,0x66,0x25,0x48,0x04,0x96,0x0B,0x5D,0xA3,0xBA,0x16,0xC3,0x08,0x4F, +0xD1,0x46,0xF8,0x14,0x5C,0xF2,0xC8,0x5E,0x01,0x99,0x6D,0xFD,0x88,0xCC,0x86,0xA8, +0xC1,0x6F,0x31,0x42,0x6C,0x52,0x3E,0x68,0xCB,0xF3,0x19,0x34,0xDF,0xBB,0x87,0x18, +0x56,0x80,0x26,0xC4,0xD0,0xDC,0xC0,0x6F,0xDF,0xDE,0xA0,0xC2,0x91,0x16,0xA0,0x64, +0x11,0x4B,0x44,0xBC,0x1E,0xF6,0xE7,0xFA,0x63,0xDE,0x66,0xAC,0x76,0xA4,0x71,0xA3, +0xEC,0x36,0x94,0x68,0x7A,0x77,0xA4,0xB1,0xE7,0x0E,0x2F,0x81,0x7A,0xE2,0xB5,0x72, +0x86,0xEF,0xA2,0x6B,0x8B,0xF0,0x0F,0xDB,0xD3,0x59,0x3F,0xBA,0x72,0xBC,0x44,0x24, +0x9C,0xE3,0x73,0xB3,0xF7,0xAF,0x57,0x2F,0x42,0x26,0x9D,0xA9,0x74,0xBA,0x00,0x52, +0xF2,0x4B,0xCD,0x53,0x7C,0x47,0x0B,0x36,0x85,0x0E,0x66,0xA9,0x08,0x97,0x16,0x34, +0x57,0xC1,0x66,0xF7,0x80,0xE3,0xED,0x70,0x54,0xC7,0x93,0xE0,0x2E,0x28,0x15,0x59, +0x87,0xBA,0xBB,0x02,0x03,0x01,0x00,0x01,0xA3,0x81,0x9D,0x30,0x81,0x9A,0x30,0x13, +0x06,0x09,0x2B,0x06,0x01,0x04,0x01,0x82,0x37,0x14,0x02,0x04,0x06,0x1E,0x04,0x00, +0x43,0x00,0x41,0x30,0x0B,0x06,0x03,0x55,0x1D,0x0F,0x04,0x04,0x03,0x02,0x01,0x86, +0x30,0x0F,0x06,0x03,0x55,0x1D,0x13,0x01,0x01,0xFF,0x04,0x05,0x30,0x03,0x01,0x01, +0xFF,0x30,0x1D,0x06,0x03,0x55,0x1D,0x0E,0x04,0x16,0x04,0x14,0x42,0x32,0xB6,0x16, +0xFA,0x04,0xFD,0xFE,0x5D,0x4B,0x7A,0xC3,0xFD,0xF7,0x4C,0x40,0x1D,0x5A,0x43,0xAF, +0x30,0x34,0x06,0x03,0x55,0x1D,0x1F,0x04,0x2D,0x30,0x2B,0x30,0x29,0xA0,0x27,0xA0, +0x25,0x86,0x23,0x68,0x74,0x74,0x70,0x3A,0x2F,0x2F,0x63,0x72,0x6C,0x2E,0x73,0x65, +0x63,0x75,0x72,0x65,0x74,0x72,0x75,0x73,0x74,0x2E,0x63,0x6F,0x6D,0x2F,0x53,0x54, +0x43,0x41,0x2E,0x63,0x72,0x6C,0x30,0x10,0x06,0x09,0x2B,0x06,0x01,0x04,0x01,0x82, +0x37,0x15,0x01,0x04,0x03,0x02,0x01,0x00,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86, +0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x03,0x82,0x01,0x01,0x00,0x30,0xED,0x4F,0x4A, +0xE1,0x58,0x3A,0x52,0x72,0x5B,0xB5,0xA6,0xA3,0x65,0x18,0xA6,0xBB,0x51,0x3B,0x77, +0xE9,0x9D,0xEA,0xD3,0x9F,0x5C,0xE0,0x45,0x65,0x7B,0x0D,0xCA,0x5B,0xE2,0x70,0x50, +0xB2,0x94,0x05,0x14,0xAE,0x49,0xC7,0x8D,0x41,0x07,0x12,0x73,0x94,0x7E,0x0C,0x23, +0x21,0xFD,0xBC,0x10,0x7F,0x60,0x10,0x5A,0x72,0xF5,0x98,0x0E,0xAC,0xEC,0xB9,0x7F, +0xDD,0x7A,0x6F,0x5D,0xD3,0x1C,0xF4,0xFF,0x88,0x05,0x69,0x42,0xA9,0x05,0x71,0xC8, +0xB7,0xAC,0x26,0xE8,0x2E,0xB4,0x8C,0x6A,0xFF,0x71,0xDC,0xB8,0xB1,0xDF,0x99,0xBC, +0x7C,0x21,0x54,0x2B,0xE4,0x58,0xA2,0xBB,0x57,0x29,0xAE,0x9E,0xA9,0xA3,0x19,0x26, +0x0F,0x99,0x2E,0x08,0xB0,0xEF,0xFD,0x69,0xCF,0x99,0x1A,0x09,0x8D,0xE3,0xA7,0x9F, +0x2B,0xC9,0x36,0x34,0x7B,0x24,0xB3,0x78,0x4C,0x95,0x17,0xA4,0x06,0x26,0x1E,0xB6, +0x64,0x52,0x36,0x5F,0x60,0x67,0xD9,0x9C,0xC5,0x05,0x74,0x0B,0xE7,0x67,0x23,0xD2, +0x08,0xFC,0x88,0xE9,0xAE,0x8B,0x7F,0xE1,0x30,0xF4,0x37,0x7E,0xFD,0xC6,0x32,0xDA, +0x2D,0x9E,0x44,0x30,0x30,0x6C,0xEE,0x07,0xDE,0xD2,0x34,0xFC,0xD2,0xFF,0x40,0xF6, +0x4B,0xF4,0x66,0x46,0x06,0x54,0xA6,0xF2,0x32,0x0A,0x63,0x26,0x30,0x6B,0x9B,0xD1, +0xDC,0x8B,0x47,0xBA,0xE1,0xB9,0xD5,0x62,0xD0,0xA2,0xA0,0xF4,0x67,0x05,0x78,0x29, +0x63,0x1A,0x6F,0x04,0xD6,0xF8,0xC6,0x4C,0xA3,0x9A,0xB1,0x37,0xB4,0x8D,0xE5,0x28, +0x4B,0x1D,0x9E,0x2C,0xC2,0xB8,0x68,0xBC,0xED,0x02,0xEE,0x31, +}; + [trustedCertificates addObject:[NSData dataWithBytes:XXX_certificate length:sizeof(XXX_certificate)]]; + } + { +/* subject:/C=US/O=SecureTrust Corporation/CN=SecureTrust CA */ +/* issuer :/C=US/O=SecureTrust Corporation/CN=SecureTrust CA */ +unsigned char XXX_certificate[956]={ +0x30,0x82,0x03,0xB8,0x30,0x82,0x02,0xA0,0xA0,0x03,0x02,0x01,0x02,0x02,0x10,0x0C, +0xF0,0x8E,0x5C,0x08,0x16,0xA5,0xAD,0x42,0x7F,0xF0,0xEB,0x27,0x18,0x59,0xD0,0x30, +0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x30,0x48, +0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x20,0x30, +0x1E,0x06,0x03,0x55,0x04,0x0A,0x13,0x17,0x53,0x65,0x63,0x75,0x72,0x65,0x54,0x72, +0x75,0x73,0x74,0x20,0x43,0x6F,0x72,0x70,0x6F,0x72,0x61,0x74,0x69,0x6F,0x6E,0x31, +0x17,0x30,0x15,0x06,0x03,0x55,0x04,0x03,0x13,0x0E,0x53,0x65,0x63,0x75,0x72,0x65, +0x54,0x72,0x75,0x73,0x74,0x20,0x43,0x41,0x30,0x1E,0x17,0x0D,0x30,0x36,0x31,0x31, +0x30,0x37,0x31,0x39,0x33,0x31,0x31,0x38,0x5A,0x17,0x0D,0x32,0x39,0x31,0x32,0x33, +0x31,0x31,0x39,0x34,0x30,0x35,0x35,0x5A,0x30,0x48,0x31,0x0B,0x30,0x09,0x06,0x03, +0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x20,0x30,0x1E,0x06,0x03,0x55,0x04,0x0A, +0x13,0x17,0x53,0x65,0x63,0x75,0x72,0x65,0x54,0x72,0x75,0x73,0x74,0x20,0x43,0x6F, +0x72,0x70,0x6F,0x72,0x61,0x74,0x69,0x6F,0x6E,0x31,0x17,0x30,0x15,0x06,0x03,0x55, +0x04,0x03,0x13,0x0E,0x53,0x65,0x63,0x75,0x72,0x65,0x54,0x72,0x75,0x73,0x74,0x20, +0x43,0x41,0x30,0x82,0x01,0x22,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D, +0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0F,0x00,0x30,0x82,0x01,0x0A,0x02,0x82, +0x01,0x01,0x00,0xAB,0xA4,0x81,0xE5,0x95,0xCD,0xF5,0xF6,0x14,0x8E,0xC2,0x4F,0xCA, +0xD4,0xE2,0x78,0x95,0x58,0x9C,0x41,0xE1,0x0D,0x99,0x40,0x24,0x17,0x39,0x91,0x33, +0x66,0xE9,0xBE,0xE1,0x83,0xAF,0x62,0x5C,0x89,0xD1,0xFC,0x24,0x5B,0x61,0xB3,0xE0, +0x11,0x11,0x41,0x1C,0x1D,0x6E,0xF0,0xB8,0xBB,0xF8,0xDE,0xA7,0x81,0xBA,0xA6,0x48, +0xC6,0x9F,0x1D,0xBD,0xBE,0x8E,0xA9,0x41,0x3E,0xB8,0x94,0xED,0x29,0x1A,0xD4,0x8E, +0xD2,0x03,0x1D,0x03,0xEF,0x6D,0x0D,0x67,0x1C,0x57,0xD7,0x06,0xAD,0xCA,0xC8,0xF5, +0xFE,0x0E,0xAF,0x66,0x25,0x48,0x04,0x96,0x0B,0x5D,0xA3,0xBA,0x16,0xC3,0x08,0x4F, +0xD1,0x46,0xF8,0x14,0x5C,0xF2,0xC8,0x5E,0x01,0x99,0x6D,0xFD,0x88,0xCC,0x86,0xA8, +0xC1,0x6F,0x31,0x42,0x6C,0x52,0x3E,0x68,0xCB,0xF3,0x19,0x34,0xDF,0xBB,0x87,0x18, +0x56,0x80,0x26,0xC4,0xD0,0xDC,0xC0,0x6F,0xDF,0xDE,0xA0,0xC2,0x91,0x16,0xA0,0x64, +0x11,0x4B,0x44,0xBC,0x1E,0xF6,0xE7,0xFA,0x63,0xDE,0x66,0xAC,0x76,0xA4,0x71,0xA3, +0xEC,0x36,0x94,0x68,0x7A,0x77,0xA4,0xB1,0xE7,0x0E,0x2F,0x81,0x7A,0xE2,0xB5,0x72, +0x86,0xEF,0xA2,0x6B,0x8B,0xF0,0x0F,0xDB,0xD3,0x59,0x3F,0xBA,0x72,0xBC,0x44,0x24, +0x9C,0xE3,0x73,0xB3,0xF7,0xAF,0x57,0x2F,0x42,0x26,0x9D,0xA9,0x74,0xBA,0x00,0x52, +0xF2,0x4B,0xCD,0x53,0x7C,0x47,0x0B,0x36,0x85,0x0E,0x66,0xA9,0x08,0x97,0x16,0x34, +0x57,0xC1,0x66,0xF7,0x80,0xE3,0xED,0x70,0x54,0xC7,0x93,0xE0,0x2E,0x28,0x15,0x59, +0x87,0xBA,0xBB,0x02,0x03,0x01,0x00,0x01,0xA3,0x81,0x9D,0x30,0x81,0x9A,0x30,0x13, +0x06,0x09,0x2B,0x06,0x01,0x04,0x01,0x82,0x37,0x14,0x02,0x04,0x06,0x1E,0x04,0x00, +0x43,0x00,0x41,0x30,0x0B,0x06,0x03,0x55,0x1D,0x0F,0x04,0x04,0x03,0x02,0x01,0x86, +0x30,0x0F,0x06,0x03,0x55,0x1D,0x13,0x01,0x01,0xFF,0x04,0x05,0x30,0x03,0x01,0x01, +0xFF,0x30,0x1D,0x06,0x03,0x55,0x1D,0x0E,0x04,0x16,0x04,0x14,0x42,0x32,0xB6,0x16, +0xFA,0x04,0xFD,0xFE,0x5D,0x4B,0x7A,0xC3,0xFD,0xF7,0x4C,0x40,0x1D,0x5A,0x43,0xAF, +0x30,0x34,0x06,0x03,0x55,0x1D,0x1F,0x04,0x2D,0x30,0x2B,0x30,0x29,0xA0,0x27,0xA0, +0x25,0x86,0x23,0x68,0x74,0x74,0x70,0x3A,0x2F,0x2F,0x63,0x72,0x6C,0x2E,0x73,0x65, +0x63,0x75,0x72,0x65,0x74,0x72,0x75,0x73,0x74,0x2E,0x63,0x6F,0x6D,0x2F,0x53,0x54, +0x43,0x41,0x2E,0x63,0x72,0x6C,0x30,0x10,0x06,0x09,0x2B,0x06,0x01,0x04,0x01,0x82, +0x37,0x15,0x01,0x04,0x03,0x02,0x01,0x00,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86, +0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x03,0x82,0x01,0x01,0x00,0x30,0xED,0x4F,0x4A, +0xE1,0x58,0x3A,0x52,0x72,0x5B,0xB5,0xA6,0xA3,0x65,0x18,0xA6,0xBB,0x51,0x3B,0x77, +0xE9,0x9D,0xEA,0xD3,0x9F,0x5C,0xE0,0x45,0x65,0x7B,0x0D,0xCA,0x5B,0xE2,0x70,0x50, +0xB2,0x94,0x05,0x14,0xAE,0x49,0xC7,0x8D,0x41,0x07,0x12,0x73,0x94,0x7E,0x0C,0x23, +0x21,0xFD,0xBC,0x10,0x7F,0x60,0x10,0x5A,0x72,0xF5,0x98,0x0E,0xAC,0xEC,0xB9,0x7F, +0xDD,0x7A,0x6F,0x5D,0xD3,0x1C,0xF4,0xFF,0x88,0x05,0x69,0x42,0xA9,0x05,0x71,0xC8, +0xB7,0xAC,0x26,0xE8,0x2E,0xB4,0x8C,0x6A,0xFF,0x71,0xDC,0xB8,0xB1,0xDF,0x99,0xBC, +0x7C,0x21,0x54,0x2B,0xE4,0x58,0xA2,0xBB,0x57,0x29,0xAE,0x9E,0xA9,0xA3,0x19,0x26, +0x0F,0x99,0x2E,0x08,0xB0,0xEF,0xFD,0x69,0xCF,0x99,0x1A,0x09,0x8D,0xE3,0xA7,0x9F, +0x2B,0xC9,0x36,0x34,0x7B,0x24,0xB3,0x78,0x4C,0x95,0x17,0xA4,0x06,0x26,0x1E,0xB6, +0x64,0x52,0x36,0x5F,0x60,0x67,0xD9,0x9C,0xC5,0x05,0x74,0x0B,0xE7,0x67,0x23,0xD2, +0x08,0xFC,0x88,0xE9,0xAE,0x8B,0x7F,0xE1,0x30,0xF4,0x37,0x7E,0xFD,0xC6,0x32,0xDA, +0x2D,0x9E,0x44,0x30,0x30,0x6C,0xEE,0x07,0xDE,0xD2,0x34,0xFC,0xD2,0xFF,0x40,0xF6, +0x4B,0xF4,0x66,0x46,0x06,0x54,0xA6,0xF2,0x32,0x0A,0x63,0x26,0x30,0x6B,0x9B,0xD1, +0xDC,0x8B,0x47,0xBA,0xE1,0xB9,0xD5,0x62,0xD0,0xA2,0xA0,0xF4,0x67,0x05,0x78,0x29, +0x63,0x1A,0x6F,0x04,0xD6,0xF8,0xC6,0x4C,0xA3,0x9A,0xB1,0x37,0xB4,0x8D,0xE5,0x28, +0x4B,0x1D,0x9E,0x2C,0xC2,0xB8,0x68,0xBC,0xED,0x02,0xEE,0x31, +}; + [trustedCertificates addObject:[NSData dataWithBytes:XXX_certificate length:sizeof(XXX_certificate)]]; + } + { +/* subject:/C=US/O=VeriSign, Inc./OU=Class 3 Public Primary Certification Authority - G2/OU=(c) 1998 VeriSign, Inc. - For authorized use only/OU=VeriSign Trust Network */ +/* issuer :/C=US/O=VeriSign, Inc./OU=Class 3 Public Primary Certification Authority - G2/OU=(c) 1998 VeriSign, Inc. - For authorized use only/OU=VeriSign Trust Network */ +unsigned char XXX_certificate[774]={ +0x30,0x82,0x03,0x02,0x30,0x82,0x02,0x6B,0x02,0x10,0x7D,0xD9,0xFE,0x07,0xCF,0xA8, +0x1E,0xB7,0x10,0x79,0x67,0xFB,0xA7,0x89,0x34,0xC6,0x30,0x0D,0x06,0x09,0x2A,0x86, +0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x30,0x81,0xC1,0x31,0x0B,0x30,0x09, +0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x17,0x30,0x15,0x06,0x03,0x55, +0x04,0x0A,0x13,0x0E,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6E,0x2C,0x20,0x49,0x6E, +0x63,0x2E,0x31,0x3C,0x30,0x3A,0x06,0x03,0x55,0x04,0x0B,0x13,0x33,0x43,0x6C,0x61, +0x73,0x73,0x20,0x33,0x20,0x50,0x75,0x62,0x6C,0x69,0x63,0x20,0x50,0x72,0x69,0x6D, +0x61,0x72,0x79,0x20,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6F, +0x6E,0x20,0x41,0x75,0x74,0x68,0x6F,0x72,0x69,0x74,0x79,0x20,0x2D,0x20,0x47,0x32, +0x31,0x3A,0x30,0x38,0x06,0x03,0x55,0x04,0x0B,0x13,0x31,0x28,0x63,0x29,0x20,0x31, +0x39,0x39,0x38,0x20,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6E,0x2C,0x20,0x49,0x6E, +0x63,0x2E,0x20,0x2D,0x20,0x46,0x6F,0x72,0x20,0x61,0x75,0x74,0x68,0x6F,0x72,0x69, +0x7A,0x65,0x64,0x20,0x75,0x73,0x65,0x20,0x6F,0x6E,0x6C,0x79,0x31,0x1F,0x30,0x1D, +0x06,0x03,0x55,0x04,0x0B,0x13,0x16,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6E,0x20, +0x54,0x72,0x75,0x73,0x74,0x20,0x4E,0x65,0x74,0x77,0x6F,0x72,0x6B,0x30,0x1E,0x17, +0x0D,0x39,0x38,0x30,0x35,0x31,0x38,0x30,0x30,0x30,0x30,0x30,0x30,0x5A,0x17,0x0D, +0x32,0x38,0x30,0x38,0x30,0x31,0x32,0x33,0x35,0x39,0x35,0x39,0x5A,0x30,0x81,0xC1, +0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x17,0x30, +0x15,0x06,0x03,0x55,0x04,0x0A,0x13,0x0E,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6E, +0x2C,0x20,0x49,0x6E,0x63,0x2E,0x31,0x3C,0x30,0x3A,0x06,0x03,0x55,0x04,0x0B,0x13, +0x33,0x43,0x6C,0x61,0x73,0x73,0x20,0x33,0x20,0x50,0x75,0x62,0x6C,0x69,0x63,0x20, +0x50,0x72,0x69,0x6D,0x61,0x72,0x79,0x20,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63, +0x61,0x74,0x69,0x6F,0x6E,0x20,0x41,0x75,0x74,0x68,0x6F,0x72,0x69,0x74,0x79,0x20, +0x2D,0x20,0x47,0x32,0x31,0x3A,0x30,0x38,0x06,0x03,0x55,0x04,0x0B,0x13,0x31,0x28, +0x63,0x29,0x20,0x31,0x39,0x39,0x38,0x20,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6E, +0x2C,0x20,0x49,0x6E,0x63,0x2E,0x20,0x2D,0x20,0x46,0x6F,0x72,0x20,0x61,0x75,0x74, +0x68,0x6F,0x72,0x69,0x7A,0x65,0x64,0x20,0x75,0x73,0x65,0x20,0x6F,0x6E,0x6C,0x79, +0x31,0x1F,0x30,0x1D,0x06,0x03,0x55,0x04,0x0B,0x13,0x16,0x56,0x65,0x72,0x69,0x53, +0x69,0x67,0x6E,0x20,0x54,0x72,0x75,0x73,0x74,0x20,0x4E,0x65,0x74,0x77,0x6F,0x72, +0x6B,0x30,0x81,0x9F,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01, +0x01,0x05,0x00,0x03,0x81,0x8D,0x00,0x30,0x81,0x89,0x02,0x81,0x81,0x00,0xCC,0x5E, +0xD1,0x11,0x5D,0x5C,0x69,0xD0,0xAB,0xD3,0xB9,0x6A,0x4C,0x99,0x1F,0x59,0x98,0x30, +0x8E,0x16,0x85,0x20,0x46,0x6D,0x47,0x3F,0xD4,0x85,0x20,0x84,0xE1,0x6D,0xB3,0xF8, +0xA4,0xED,0x0C,0xF1,0x17,0x0F,0x3B,0xF9,0xA7,0xF9,0x25,0xD7,0xC1,0xCF,0x84,0x63, +0xF2,0x7C,0x63,0xCF,0xA2,0x47,0xF2,0xC6,0x5B,0x33,0x8E,0x64,0x40,0x04,0x68,0xC1, +0x80,0xB9,0x64,0x1C,0x45,0x77,0xC7,0xD8,0x6E,0xF5,0x95,0x29,0x3C,0x50,0xE8,0x34, +0xD7,0x78,0x1F,0xA8,0xBA,0x6D,0x43,0x91,0x95,0x8F,0x45,0x57,0x5E,0x7E,0xC5,0xFB, +0xCA,0xA4,0x04,0xEB,0xEA,0x97,0x37,0x54,0x30,0x6F,0xBB,0x01,0x47,0x32,0x33,0xCD, +0xDC,0x57,0x9B,0x64,0x69,0x61,0xF8,0x9B,0x1D,0x1C,0x89,0x4F,0x5C,0x67,0x02,0x03, +0x01,0x00,0x01,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05, +0x05,0x00,0x03,0x81,0x81,0x00,0x51,0x4D,0xCD,0xBE,0x5C,0xCB,0x98,0x19,0x9C,0x15, +0xB2,0x01,0x39,0x78,0x2E,0x4D,0x0F,0x67,0x70,0x70,0x99,0xC6,0x10,0x5A,0x94,0xA4, +0x53,0x4D,0x54,0x6D,0x2B,0xAF,0x0D,0x5D,0x40,0x8B,0x64,0xD3,0xD7,0xEE,0xDE,0x56, +0x61,0x92,0x5F,0xA6,0xC4,0x1D,0x10,0x61,0x36,0xD3,0x2C,0x27,0x3C,0xE8,0x29,0x09, +0xB9,0x11,0x64,0x74,0xCC,0xB5,0x73,0x9F,0x1C,0x48,0xA9,0xBC,0x61,0x01,0xEE,0xE2, +0x17,0xA6,0x0C,0xE3,0x40,0x08,0x3B,0x0E,0xE7,0xEB,0x44,0x73,0x2A,0x9A,0xF1,0x69, +0x92,0xEF,0x71,0x14,0xC3,0x39,0xAC,0x71,0xA7,0x91,0x09,0x6F,0xE4,0x71,0x06,0xB3, +0xBA,0x59,0x57,0x26,0x79,0x00,0xF6,0xF8,0x0D,0xA2,0x33,0x30,0x28,0xD4,0xAA,0x58, +0xA0,0x9D,0x9D,0x69,0x91,0xFD, +}; + [trustedCertificates addObject:[NSData dataWithBytes:XXX_certificate length:sizeof(XXX_certificate)]]; + } + { +/* subject:/C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=(c) 1999 VeriSign, Inc. - For authorized use only/CN=VeriSign Class 3 Public Primary Certification Authority - G3 */ +/* issuer :/C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=(c) 1999 VeriSign, Inc. - For authorized use only/CN=VeriSign Class 3 Public Primary Certification Authority - G3 */ +unsigned char XXX_certificate[1054]={ +0x30,0x82,0x04,0x1A,0x30,0x82,0x03,0x02,0x02,0x11,0x00,0x9B,0x7E,0x06,0x49,0xA3, +0x3E,0x62,0xB9,0xD5,0xEE,0x90,0x48,0x71,0x29,0xEF,0x57,0x30,0x0D,0x06,0x09,0x2A, +0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x30,0x81,0xCA,0x31,0x0B,0x30, +0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x17,0x30,0x15,0x06,0x03, +0x55,0x04,0x0A,0x13,0x0E,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6E,0x2C,0x20,0x49, +0x6E,0x63,0x2E,0x31,0x1F,0x30,0x1D,0x06,0x03,0x55,0x04,0x0B,0x13,0x16,0x56,0x65, +0x72,0x69,0x53,0x69,0x67,0x6E,0x20,0x54,0x72,0x75,0x73,0x74,0x20,0x4E,0x65,0x74, +0x77,0x6F,0x72,0x6B,0x31,0x3A,0x30,0x38,0x06,0x03,0x55,0x04,0x0B,0x13,0x31,0x28, +0x63,0x29,0x20,0x31,0x39,0x39,0x39,0x20,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6E, +0x2C,0x20,0x49,0x6E,0x63,0x2E,0x20,0x2D,0x20,0x46,0x6F,0x72,0x20,0x61,0x75,0x74, +0x68,0x6F,0x72,0x69,0x7A,0x65,0x64,0x20,0x75,0x73,0x65,0x20,0x6F,0x6E,0x6C,0x79, +0x31,0x45,0x30,0x43,0x06,0x03,0x55,0x04,0x03,0x13,0x3C,0x56,0x65,0x72,0x69,0x53, +0x69,0x67,0x6E,0x20,0x43,0x6C,0x61,0x73,0x73,0x20,0x33,0x20,0x50,0x75,0x62,0x6C, +0x69,0x63,0x20,0x50,0x72,0x69,0x6D,0x61,0x72,0x79,0x20,0x43,0x65,0x72,0x74,0x69, +0x66,0x69,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x41,0x75,0x74,0x68,0x6F,0x72,0x69, +0x74,0x79,0x20,0x2D,0x20,0x47,0x33,0x30,0x1E,0x17,0x0D,0x39,0x39,0x31,0x30,0x30, +0x31,0x30,0x30,0x30,0x30,0x30,0x30,0x5A,0x17,0x0D,0x33,0x36,0x30,0x37,0x31,0x36, +0x32,0x33,0x35,0x39,0x35,0x39,0x5A,0x30,0x81,0xCA,0x31,0x0B,0x30,0x09,0x06,0x03, +0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x17,0x30,0x15,0x06,0x03,0x55,0x04,0x0A, +0x13,0x0E,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6E,0x2C,0x20,0x49,0x6E,0x63,0x2E, +0x31,0x1F,0x30,0x1D,0x06,0x03,0x55,0x04,0x0B,0x13,0x16,0x56,0x65,0x72,0x69,0x53, +0x69,0x67,0x6E,0x20,0x54,0x72,0x75,0x73,0x74,0x20,0x4E,0x65,0x74,0x77,0x6F,0x72, +0x6B,0x31,0x3A,0x30,0x38,0x06,0x03,0x55,0x04,0x0B,0x13,0x31,0x28,0x63,0x29,0x20, +0x31,0x39,0x39,0x39,0x20,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6E,0x2C,0x20,0x49, +0x6E,0x63,0x2E,0x20,0x2D,0x20,0x46,0x6F,0x72,0x20,0x61,0x75,0x74,0x68,0x6F,0x72, +0x69,0x7A,0x65,0x64,0x20,0x75,0x73,0x65,0x20,0x6F,0x6E,0x6C,0x79,0x31,0x45,0x30, +0x43,0x06,0x03,0x55,0x04,0x03,0x13,0x3C,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6E, +0x20,0x43,0x6C,0x61,0x73,0x73,0x20,0x33,0x20,0x50,0x75,0x62,0x6C,0x69,0x63,0x20, +0x50,0x72,0x69,0x6D,0x61,0x72,0x79,0x20,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63, +0x61,0x74,0x69,0x6F,0x6E,0x20,0x41,0x75,0x74,0x68,0x6F,0x72,0x69,0x74,0x79,0x20, +0x2D,0x20,0x47,0x33,0x30,0x82,0x01,0x22,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86, +0xF7,0x0D,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0F,0x00,0x30,0x82,0x01,0x0A, +0x02,0x82,0x01,0x01,0x00,0xCB,0xBA,0x9C,0x52,0xFC,0x78,0x1F,0x1A,0x1E,0x6F,0x1B, +0x37,0x73,0xBD,0xF8,0xC9,0x6B,0x94,0x12,0x30,0x4F,0xF0,0x36,0x47,0xF5,0xD0,0x91, +0x0A,0xF5,0x17,0xC8,0xA5,0x61,0xC1,0x16,0x40,0x4D,0xFB,0x8A,0x61,0x90,0xE5,0x76, +0x20,0xC1,0x11,0x06,0x7D,0xAB,0x2C,0x6E,0xA6,0xF5,0x11,0x41,0x8E,0xFA,0x2D,0xAD, +0x2A,0x61,0x59,0xA4,0x67,0x26,0x4C,0xD0,0xE8,0xBC,0x52,0x5B,0x70,0x20,0x04,0x58, +0xD1,0x7A,0xC9,0xA4,0x69,0xBC,0x83,0x17,0x64,0xAD,0x05,0x8B,0xBC,0xD0,0x58,0xCE, +0x8D,0x8C,0xF5,0xEB,0xF0,0x42,0x49,0x0B,0x9D,0x97,0x27,0x67,0x32,0x6E,0xE1,0xAE, +0x93,0x15,0x1C,0x70,0xBC,0x20,0x4D,0x2F,0x18,0xDE,0x92,0x88,0xE8,0x6C,0x85,0x57, +0x11,0x1A,0xE9,0x7E,0xE3,0x26,0x11,0x54,0xA2,0x45,0x96,0x55,0x83,0xCA,0x30,0x89, +0xE8,0xDC,0xD8,0xA3,0xED,0x2A,0x80,0x3F,0x7F,0x79,0x65,0x57,0x3E,0x15,0x20,0x66, +0x08,0x2F,0x95,0x93,0xBF,0xAA,0x47,0x2F,0xA8,0x46,0x97,0xF0,0x12,0xE2,0xFE,0xC2, +0x0A,0x2B,0x51,0xE6,0x76,0xE6,0xB7,0x46,0xB7,0xE2,0x0D,0xA6,0xCC,0xA8,0xC3,0x4C, +0x59,0x55,0x89,0xE6,0xE8,0x53,0x5C,0x1C,0xEA,0x9D,0xF0,0x62,0x16,0x0B,0xA7,0xC9, +0x5F,0x0C,0xF0,0xDE,0xC2,0x76,0xCE,0xAF,0xF7,0x6A,0xF2,0xFA,0x41,0xA6,0xA2,0x33, +0x14,0xC9,0xE5,0x7A,0x63,0xD3,0x9E,0x62,0x37,0xD5,0x85,0x65,0x9E,0x0E,0xE6,0x53, +0x24,0x74,0x1B,0x5E,0x1D,0x12,0x53,0x5B,0xC7,0x2C,0xE7,0x83,0x49,0x3B,0x15,0xAE, +0x8A,0x68,0xB9,0x57,0x97,0x02,0x03,0x01,0x00,0x01,0x30,0x0D,0x06,0x09,0x2A,0x86, +0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x03,0x82,0x01,0x01,0x00,0x11,0x14, +0x96,0xC1,0xAB,0x92,0x08,0xF7,0x3F,0x2F,0xC9,0xB2,0xFE,0xE4,0x5A,0x9F,0x64,0xDE, +0xDB,0x21,0x4F,0x86,0x99,0x34,0x76,0x36,0x57,0xDD,0xD0,0x15,0x2F,0xC5,0xAD,0x7F, +0x15,0x1F,0x37,0x62,0x73,0x3E,0xD4,0xE7,0x5F,0xCE,0x17,0x03,0xDB,0x35,0xFA,0x2B, +0xDB,0xAE,0x60,0x09,0x5F,0x1E,0x5F,0x8F,0x6E,0xBB,0x0B,0x3D,0xEA,0x5A,0x13,0x1E, +0x0C,0x60,0x6F,0xB5,0xC0,0xB5,0x23,0x22,0x2E,0x07,0x0B,0xCB,0xA9,0x74,0xCB,0x47, +0xBB,0x1D,0xC1,0xD7,0xA5,0x6B,0xCC,0x2F,0xD2,0x42,0xFD,0x49,0xDD,0xA7,0x89,0xCF, +0x53,0xBA,0xDA,0x00,0x5A,0x28,0xBF,0x82,0xDF,0xF8,0xBA,0x13,0x1D,0x50,0x86,0x82, +0xFD,0x8E,0x30,0x8F,0x29,0x46,0xB0,0x1E,0x3D,0x35,0xDA,0x38,0x62,0x16,0x18,0x4A, +0xAD,0xE6,0xB6,0x51,0x6C,0xDE,0xAF,0x62,0xEB,0x01,0xD0,0x1E,0x24,0xFE,0x7A,0x8F, +0x12,0x1A,0x12,0x68,0xB8,0xFB,0x66,0x99,0x14,0x14,0x45,0x5C,0xAE,0xE7,0xAE,0x69, +0x17,0x81,0x2B,0x5A,0x37,0xC9,0x5E,0x2A,0xF4,0xC6,0xE2,0xA1,0x5C,0x54,0x9B,0xA6, +0x54,0x00,0xCF,0xF0,0xF1,0xC1,0xC7,0x98,0x30,0x1A,0x3B,0x36,0x16,0xDB,0xA3,0x6E, +0xEA,0xFD,0xAD,0xB2,0xC2,0xDA,0xEF,0x02,0x47,0x13,0x8A,0xC0,0xF1,0xB3,0x31,0xAD, +0x4F,0x1C,0xE1,0x4F,0x9C,0xAF,0x0F,0x0C,0x9D,0xF7,0x78,0x0D,0xD8,0xF4,0x35,0x56, +0x80,0xDA,0xB7,0x6D,0x17,0x8F,0x9D,0x1E,0x81,0x64,0xE1,0xFE,0xC5,0x45,0xBA,0xAD, +0x6B,0xB9,0x0A,0x7A,0x4E,0x4F,0x4B,0x84,0xEE,0x4B,0xF1,0x7D,0xDD,0x11, +}; + [trustedCertificates addObject:[NSData dataWithBytes:XXX_certificate length:sizeof(XXX_certificate)]]; + } + { +/* subject:/C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=(c) 2007 VeriSign, Inc. - For authorized use only/CN=VeriSign Class 3 Public Primary Certification Authority - G4 */ +/* issuer :/C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=(c) 2007 VeriSign, Inc. - For authorized use only/CN=VeriSign Class 3 Public Primary Certification Authority - G4 */ +unsigned char XXX_certificate[904]={ +0x30,0x82,0x03,0x84,0x30,0x82,0x03,0x0A,0xA0,0x03,0x02,0x01,0x02,0x02,0x10,0x2F, +0x80,0xFE,0x23,0x8C,0x0E,0x22,0x0F,0x48,0x67,0x12,0x28,0x91,0x87,0xAC,0xB3,0x30, +0x0A,0x06,0x08,0x2A,0x86,0x48,0xCE,0x3D,0x04,0x03,0x03,0x30,0x81,0xCA,0x31,0x0B, +0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x17,0x30,0x15,0x06, +0x03,0x55,0x04,0x0A,0x13,0x0E,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6E,0x2C,0x20, +0x49,0x6E,0x63,0x2E,0x31,0x1F,0x30,0x1D,0x06,0x03,0x55,0x04,0x0B,0x13,0x16,0x56, +0x65,0x72,0x69,0x53,0x69,0x67,0x6E,0x20,0x54,0x72,0x75,0x73,0x74,0x20,0x4E,0x65, +0x74,0x77,0x6F,0x72,0x6B,0x31,0x3A,0x30,0x38,0x06,0x03,0x55,0x04,0x0B,0x13,0x31, +0x28,0x63,0x29,0x20,0x32,0x30,0x30,0x37,0x20,0x56,0x65,0x72,0x69,0x53,0x69,0x67, +0x6E,0x2C,0x20,0x49,0x6E,0x63,0x2E,0x20,0x2D,0x20,0x46,0x6F,0x72,0x20,0x61,0x75, +0x74,0x68,0x6F,0x72,0x69,0x7A,0x65,0x64,0x20,0x75,0x73,0x65,0x20,0x6F,0x6E,0x6C, +0x79,0x31,0x45,0x30,0x43,0x06,0x03,0x55,0x04,0x03,0x13,0x3C,0x56,0x65,0x72,0x69, +0x53,0x69,0x67,0x6E,0x20,0x43,0x6C,0x61,0x73,0x73,0x20,0x33,0x20,0x50,0x75,0x62, +0x6C,0x69,0x63,0x20,0x50,0x72,0x69,0x6D,0x61,0x72,0x79,0x20,0x43,0x65,0x72,0x74, +0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x41,0x75,0x74,0x68,0x6F,0x72, +0x69,0x74,0x79,0x20,0x2D,0x20,0x47,0x34,0x30,0x1E,0x17,0x0D,0x30,0x37,0x31,0x31, +0x30,0x35,0x30,0x30,0x30,0x30,0x30,0x30,0x5A,0x17,0x0D,0x33,0x38,0x30,0x31,0x31, +0x38,0x32,0x33,0x35,0x39,0x35,0x39,0x5A,0x30,0x81,0xCA,0x31,0x0B,0x30,0x09,0x06, +0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x17,0x30,0x15,0x06,0x03,0x55,0x04, +0x0A,0x13,0x0E,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6E,0x2C,0x20,0x49,0x6E,0x63, +0x2E,0x31,0x1F,0x30,0x1D,0x06,0x03,0x55,0x04,0x0B,0x13,0x16,0x56,0x65,0x72,0x69, +0x53,0x69,0x67,0x6E,0x20,0x54,0x72,0x75,0x73,0x74,0x20,0x4E,0x65,0x74,0x77,0x6F, +0x72,0x6B,0x31,0x3A,0x30,0x38,0x06,0x03,0x55,0x04,0x0B,0x13,0x31,0x28,0x63,0x29, +0x20,0x32,0x30,0x30,0x37,0x20,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6E,0x2C,0x20, +0x49,0x6E,0x63,0x2E,0x20,0x2D,0x20,0x46,0x6F,0x72,0x20,0x61,0x75,0x74,0x68,0x6F, +0x72,0x69,0x7A,0x65,0x64,0x20,0x75,0x73,0x65,0x20,0x6F,0x6E,0x6C,0x79,0x31,0x45, +0x30,0x43,0x06,0x03,0x55,0x04,0x03,0x13,0x3C,0x56,0x65,0x72,0x69,0x53,0x69,0x67, +0x6E,0x20,0x43,0x6C,0x61,0x73,0x73,0x20,0x33,0x20,0x50,0x75,0x62,0x6C,0x69,0x63, +0x20,0x50,0x72,0x69,0x6D,0x61,0x72,0x79,0x20,0x43,0x65,0x72,0x74,0x69,0x66,0x69, +0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x41,0x75,0x74,0x68,0x6F,0x72,0x69,0x74,0x79, +0x20,0x2D,0x20,0x47,0x34,0x30,0x76,0x30,0x10,0x06,0x07,0x2A,0x86,0x48,0xCE,0x3D, +0x02,0x01,0x06,0x05,0x2B,0x81,0x04,0x00,0x22,0x03,0x62,0x00,0x04,0xA7,0x56,0x7A, +0x7C,0x52,0xDA,0x64,0x9B,0x0E,0x2D,0x5C,0xD8,0x5E,0xAC,0x92,0x3D,0xFE,0x01,0xE6, +0x19,0x4A,0x3D,0x14,0x03,0x4B,0xFA,0x60,0x27,0x20,0xD9,0x83,0x89,0x69,0xFA,0x54, +0xC6,0x9A,0x18,0x5E,0x55,0x2A,0x64,0xDE,0x06,0xF6,0x8D,0x4A,0x3B,0xAD,0x10,0x3C, +0x65,0x3D,0x90,0x88,0x04,0x89,0xE0,0x30,0x61,0xB3,0xAE,0x5D,0x01,0xA7,0x7B,0xDE, +0x7C,0xB2,0xBE,0xCA,0x65,0x61,0x00,0x86,0xAE,0xDA,0x8F,0x7B,0xD0,0x89,0xAD,0x4D, +0x1D,0x59,0x9A,0x41,0xB1,0xBC,0x47,0x80,0xDC,0x9E,0x62,0xC3,0xF9,0xA3,0x81,0xB2, +0x30,0x81,0xAF,0x30,0x0F,0x06,0x03,0x55,0x1D,0x13,0x01,0x01,0xFF,0x04,0x05,0x30, +0x03,0x01,0x01,0xFF,0x30,0x0E,0x06,0x03,0x55,0x1D,0x0F,0x01,0x01,0xFF,0x04,0x04, +0x03,0x02,0x01,0x06,0x30,0x6D,0x06,0x08,0x2B,0x06,0x01,0x05,0x05,0x07,0x01,0x0C, +0x04,0x61,0x30,0x5F,0xA1,0x5D,0xA0,0x5B,0x30,0x59,0x30,0x57,0x30,0x55,0x16,0x09, +0x69,0x6D,0x61,0x67,0x65,0x2F,0x67,0x69,0x66,0x30,0x21,0x30,0x1F,0x30,0x07,0x06, +0x05,0x2B,0x0E,0x03,0x02,0x1A,0x04,0x14,0x8F,0xE5,0xD3,0x1A,0x86,0xAC,0x8D,0x8E, +0x6B,0xC3,0xCF,0x80,0x6A,0xD4,0x48,0x18,0x2C,0x7B,0x19,0x2E,0x30,0x25,0x16,0x23, +0x68,0x74,0x74,0x70,0x3A,0x2F,0x2F,0x6C,0x6F,0x67,0x6F,0x2E,0x76,0x65,0x72,0x69, +0x73,0x69,0x67,0x6E,0x2E,0x63,0x6F,0x6D,0x2F,0x76,0x73,0x6C,0x6F,0x67,0x6F,0x2E, +0x67,0x69,0x66,0x30,0x1D,0x06,0x03,0x55,0x1D,0x0E,0x04,0x16,0x04,0x14,0xB3,0x16, +0x91,0xFD,0xEE,0xA6,0x6E,0xE4,0xB5,0x2E,0x49,0x8F,0x87,0x78,0x81,0x80,0xEC,0xE5, +0xB1,0xB5,0x30,0x0A,0x06,0x08,0x2A,0x86,0x48,0xCE,0x3D,0x04,0x03,0x03,0x03,0x68, +0x00,0x30,0x65,0x02,0x30,0x66,0x21,0x0C,0x18,0x26,0x60,0x5A,0x38,0x7B,0x56,0x42, +0xE0,0xA7,0xFC,0x36,0x84,0x51,0x91,0x20,0x2C,0x76,0x4D,0x43,0x3D,0xC4,0x1D,0x84, +0x23,0xD0,0xAC,0xD6,0x7C,0x35,0x06,0xCE,0xCD,0x69,0xBD,0x90,0x0D,0xDB,0x6C,0x48, +0x42,0x1D,0x0E,0xAA,0x42,0x02,0x31,0x00,0x9C,0x3D,0x48,0x39,0x23,0x39,0x58,0x1A, +0x15,0x12,0x59,0x6A,0x9E,0xEF,0xD5,0x59,0xB2,0x1D,0x52,0x2C,0x99,0x71,0xCD,0xC7, +0x29,0xDF,0x1B,0x2A,0x61,0x7B,0x71,0xD1,0xDE,0xF3,0xC0,0xE5,0x0D,0x3A,0x4A,0xAA, +0x2D,0xA7,0xD8,0x86,0x2A,0xDD,0x2E,0x10, +}; + [trustedCertificates addObject:[NSData dataWithBytes:XXX_certificate length:sizeof(XXX_certificate)]]; + } + { +/* subject:/C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=(c) 2006 VeriSign, Inc. - For authorized use only/CN=VeriSign Class 3 Public Primary Certification Authority - G5 */ +/* issuer :/C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=(c) 2006 VeriSign, Inc. - For authorized use only/CN=VeriSign Class 3 Public Primary Certification Authority - G5 */ +unsigned char XXX_certificate[1239]={ +0x30,0x82,0x04,0xD3,0x30,0x82,0x03,0xBB,0xA0,0x03,0x02,0x01,0x02,0x02,0x10,0x18, +0xDA,0xD1,0x9E,0x26,0x7D,0xE8,0xBB,0x4A,0x21,0x58,0xCD,0xCC,0x6B,0x3B,0x4A,0x30, +0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x30,0x81, +0xCA,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x17, +0x30,0x15,0x06,0x03,0x55,0x04,0x0A,0x13,0x0E,0x56,0x65,0x72,0x69,0x53,0x69,0x67, +0x6E,0x2C,0x20,0x49,0x6E,0x63,0x2E,0x31,0x1F,0x30,0x1D,0x06,0x03,0x55,0x04,0x0B, +0x13,0x16,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6E,0x20,0x54,0x72,0x75,0x73,0x74, +0x20,0x4E,0x65,0x74,0x77,0x6F,0x72,0x6B,0x31,0x3A,0x30,0x38,0x06,0x03,0x55,0x04, +0x0B,0x13,0x31,0x28,0x63,0x29,0x20,0x32,0x30,0x30,0x36,0x20,0x56,0x65,0x72,0x69, +0x53,0x69,0x67,0x6E,0x2C,0x20,0x49,0x6E,0x63,0x2E,0x20,0x2D,0x20,0x46,0x6F,0x72, +0x20,0x61,0x75,0x74,0x68,0x6F,0x72,0x69,0x7A,0x65,0x64,0x20,0x75,0x73,0x65,0x20, +0x6F,0x6E,0x6C,0x79,0x31,0x45,0x30,0x43,0x06,0x03,0x55,0x04,0x03,0x13,0x3C,0x56, +0x65,0x72,0x69,0x53,0x69,0x67,0x6E,0x20,0x43,0x6C,0x61,0x73,0x73,0x20,0x33,0x20, +0x50,0x75,0x62,0x6C,0x69,0x63,0x20,0x50,0x72,0x69,0x6D,0x61,0x72,0x79,0x20,0x43, +0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x41,0x75,0x74, +0x68,0x6F,0x72,0x69,0x74,0x79,0x20,0x2D,0x20,0x47,0x35,0x30,0x1E,0x17,0x0D,0x30, +0x36,0x31,0x31,0x30,0x38,0x30,0x30,0x30,0x30,0x30,0x30,0x5A,0x17,0x0D,0x33,0x36, +0x30,0x37,0x31,0x36,0x32,0x33,0x35,0x39,0x35,0x39,0x5A,0x30,0x81,0xCA,0x31,0x0B, +0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x17,0x30,0x15,0x06, +0x03,0x55,0x04,0x0A,0x13,0x0E,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6E,0x2C,0x20, +0x49,0x6E,0x63,0x2E,0x31,0x1F,0x30,0x1D,0x06,0x03,0x55,0x04,0x0B,0x13,0x16,0x56, +0x65,0x72,0x69,0x53,0x69,0x67,0x6E,0x20,0x54,0x72,0x75,0x73,0x74,0x20,0x4E,0x65, +0x74,0x77,0x6F,0x72,0x6B,0x31,0x3A,0x30,0x38,0x06,0x03,0x55,0x04,0x0B,0x13,0x31, +0x28,0x63,0x29,0x20,0x32,0x30,0x30,0x36,0x20,0x56,0x65,0x72,0x69,0x53,0x69,0x67, +0x6E,0x2C,0x20,0x49,0x6E,0x63,0x2E,0x20,0x2D,0x20,0x46,0x6F,0x72,0x20,0x61,0x75, +0x74,0x68,0x6F,0x72,0x69,0x7A,0x65,0x64,0x20,0x75,0x73,0x65,0x20,0x6F,0x6E,0x6C, +0x79,0x31,0x45,0x30,0x43,0x06,0x03,0x55,0x04,0x03,0x13,0x3C,0x56,0x65,0x72,0x69, +0x53,0x69,0x67,0x6E,0x20,0x43,0x6C,0x61,0x73,0x73,0x20,0x33,0x20,0x50,0x75,0x62, +0x6C,0x69,0x63,0x20,0x50,0x72,0x69,0x6D,0x61,0x72,0x79,0x20,0x43,0x65,0x72,0x74, +0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x41,0x75,0x74,0x68,0x6F,0x72, +0x69,0x74,0x79,0x20,0x2D,0x20,0x47,0x35,0x30,0x82,0x01,0x22,0x30,0x0D,0x06,0x09, +0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0F,0x00, +0x30,0x82,0x01,0x0A,0x02,0x82,0x01,0x01,0x00,0xAF,0x24,0x08,0x08,0x29,0x7A,0x35, +0x9E,0x60,0x0C,0xAA,0xE7,0x4B,0x3B,0x4E,0xDC,0x7C,0xBC,0x3C,0x45,0x1C,0xBB,0x2B, +0xE0,0xFE,0x29,0x02,0xF9,0x57,0x08,0xA3,0x64,0x85,0x15,0x27,0xF5,0xF1,0xAD,0xC8, +0x31,0x89,0x5D,0x22,0xE8,0x2A,0xAA,0xA6,0x42,0xB3,0x8F,0xF8,0xB9,0x55,0xB7,0xB1, +0xB7,0x4B,0xB3,0xFE,0x8F,0x7E,0x07,0x57,0xEC,0xEF,0x43,0xDB,0x66,0x62,0x15,0x61, +0xCF,0x60,0x0D,0xA4,0xD8,0xDE,0xF8,0xE0,0xC3,0x62,0x08,0x3D,0x54,0x13,0xEB,0x49, +0xCA,0x59,0x54,0x85,0x26,0xE5,0x2B,0x8F,0x1B,0x9F,0xEB,0xF5,0xA1,0x91,0xC2,0x33, +0x49,0xD8,0x43,0x63,0x6A,0x52,0x4B,0xD2,0x8F,0xE8,0x70,0x51,0x4D,0xD1,0x89,0x69, +0x7B,0xC7,0x70,0xF6,0xB3,0xDC,0x12,0x74,0xDB,0x7B,0x5D,0x4B,0x56,0xD3,0x96,0xBF, +0x15,0x77,0xA1,0xB0,0xF4,0xA2,0x25,0xF2,0xAF,0x1C,0x92,0x67,0x18,0xE5,0xF4,0x06, +0x04,0xEF,0x90,0xB9,0xE4,0x00,0xE4,0xDD,0x3A,0xB5,0x19,0xFF,0x02,0xBA,0xF4,0x3C, +0xEE,0xE0,0x8B,0xEB,0x37,0x8B,0xEC,0xF4,0xD7,0xAC,0xF2,0xF6,0xF0,0x3D,0xAF,0xDD, +0x75,0x91,0x33,0x19,0x1D,0x1C,0x40,0xCB,0x74,0x24,0x19,0x21,0x93,0xD9,0x14,0xFE, +0xAC,0x2A,0x52,0xC7,0x8F,0xD5,0x04,0x49,0xE4,0x8D,0x63,0x47,0x88,0x3C,0x69,0x83, +0xCB,0xFE,0x47,0xBD,0x2B,0x7E,0x4F,0xC5,0x95,0xAE,0x0E,0x9D,0xD4,0xD1,0x43,0xC0, +0x67,0x73,0xE3,0x14,0x08,0x7E,0xE5,0x3F,0x9F,0x73,0xB8,0x33,0x0A,0xCF,0x5D,0x3F, +0x34,0x87,0x96,0x8A,0xEE,0x53,0xE8,0x25,0x15,0x02,0x03,0x01,0x00,0x01,0xA3,0x81, +0xB2,0x30,0x81,0xAF,0x30,0x0F,0x06,0x03,0x55,0x1D,0x13,0x01,0x01,0xFF,0x04,0x05, +0x30,0x03,0x01,0x01,0xFF,0x30,0x0E,0x06,0x03,0x55,0x1D,0x0F,0x01,0x01,0xFF,0x04, +0x04,0x03,0x02,0x01,0x06,0x30,0x6D,0x06,0x08,0x2B,0x06,0x01,0x05,0x05,0x07,0x01, +0x0C,0x04,0x61,0x30,0x5F,0xA1,0x5D,0xA0,0x5B,0x30,0x59,0x30,0x57,0x30,0x55,0x16, +0x09,0x69,0x6D,0x61,0x67,0x65,0x2F,0x67,0x69,0x66,0x30,0x21,0x30,0x1F,0x30,0x07, +0x06,0x05,0x2B,0x0E,0x03,0x02,0x1A,0x04,0x14,0x8F,0xE5,0xD3,0x1A,0x86,0xAC,0x8D, +0x8E,0x6B,0xC3,0xCF,0x80,0x6A,0xD4,0x48,0x18,0x2C,0x7B,0x19,0x2E,0x30,0x25,0x16, +0x23,0x68,0x74,0x74,0x70,0x3A,0x2F,0x2F,0x6C,0x6F,0x67,0x6F,0x2E,0x76,0x65,0x72, +0x69,0x73,0x69,0x67,0x6E,0x2E,0x63,0x6F,0x6D,0x2F,0x76,0x73,0x6C,0x6F,0x67,0x6F, +0x2E,0x67,0x69,0x66,0x30,0x1D,0x06,0x03,0x55,0x1D,0x0E,0x04,0x16,0x04,0x14,0x7F, +0xD3,0x65,0xA7,0xC2,0xDD,0xEC,0xBB,0xF0,0x30,0x09,0xF3,0x43,0x39,0xFA,0x02,0xAF, +0x33,0x31,0x33,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05, +0x05,0x00,0x03,0x82,0x01,0x01,0x00,0x93,0x24,0x4A,0x30,0x5F,0x62,0xCF,0xD8,0x1A, +0x98,0x2F,0x3D,0xEA,0xDC,0x99,0x2D,0xBD,0x77,0xF6,0xA5,0x79,0x22,0x38,0xEC,0xC4, +0xA7,0xA0,0x78,0x12,0xAD,0x62,0x0E,0x45,0x70,0x64,0xC5,0xE7,0x97,0x66,0x2D,0x98, +0x09,0x7E,0x5F,0xAF,0xD6,0xCC,0x28,0x65,0xF2,0x01,0xAA,0x08,0x1A,0x47,0xDE,0xF9, +0xF9,0x7C,0x92,0x5A,0x08,0x69,0x20,0x0D,0xD9,0x3E,0x6D,0x6E,0x3C,0x0D,0x6E,0xD8, +0xE6,0x06,0x91,0x40,0x18,0xB9,0xF8,0xC1,0xED,0xDF,0xDB,0x41,0xAA,0xE0,0x96,0x20, +0xC9,0xCD,0x64,0x15,0x38,0x81,0xC9,0x94,0xEE,0xA2,0x84,0x29,0x0B,0x13,0x6F,0x8E, +0xDB,0x0C,0xDD,0x25,0x02,0xDB,0xA4,0x8B,0x19,0x44,0xD2,0x41,0x7A,0x05,0x69,0x4A, +0x58,0x4F,0x60,0xCA,0x7E,0x82,0x6A,0x0B,0x02,0xAA,0x25,0x17,0x39,0xB5,0xDB,0x7F, +0xE7,0x84,0x65,0x2A,0x95,0x8A,0xBD,0x86,0xDE,0x5E,0x81,0x16,0x83,0x2D,0x10,0xCC, +0xDE,0xFD,0xA8,0x82,0x2A,0x6D,0x28,0x1F,0x0D,0x0B,0xC4,0xE5,0xE7,0x1A,0x26,0x19, +0xE1,0xF4,0x11,0x6F,0x10,0xB5,0x95,0xFC,0xE7,0x42,0x05,0x32,0xDB,0xCE,0x9D,0x51, +0x5E,0x28,0xB6,0x9E,0x85,0xD3,0x5B,0xEF,0xA5,0x7D,0x45,0x40,0x72,0x8E,0xB7,0x0E, +0x6B,0x0E,0x06,0xFB,0x33,0x35,0x48,0x71,0xB8,0x9D,0x27,0x8B,0xC4,0x65,0x5F,0x0D, +0x86,0x76,0x9C,0x44,0x7A,0xF6,0x95,0x5C,0xF6,0x5D,0x32,0x08,0x33,0xA4,0x54,0xB6, +0x18,0x3F,0x68,0x5C,0xF2,0x42,0x4A,0x85,0x38,0x54,0x83,0x5F,0xD1,0xE8,0x2C,0xF2, +0xAC,0x11,0xD6,0xA8,0xED,0x63,0x6A, +}; + [trustedCertificates addObject:[NSData dataWithBytes:XXX_certificate length:sizeof(XXX_certificate)]]; + } + { +/* subject:/C=US/O=VeriSign, Inc./OU=Class 3 Public Primary Certification Authority */ +/* issuer :/C=US/O=VeriSign, Inc./OU=Class 3 Public Primary Certification Authority */ +unsigned char XXX_certificate[576]={ +0x30,0x82,0x02,0x3C,0x30,0x82,0x01,0xA5,0x02,0x10,0x3C,0x91,0x31,0xCB,0x1F,0xF6, +0xD0,0x1B,0x0E,0x9A,0xB8,0xD0,0x44,0xBF,0x12,0xBE,0x30,0x0D,0x06,0x09,0x2A,0x86, +0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x30,0x5F,0x31,0x0B,0x30,0x09,0x06, +0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x17,0x30,0x15,0x06,0x03,0x55,0x04, +0x0A,0x13,0x0E,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6E,0x2C,0x20,0x49,0x6E,0x63, +0x2E,0x31,0x37,0x30,0x35,0x06,0x03,0x55,0x04,0x0B,0x13,0x2E,0x43,0x6C,0x61,0x73, +0x73,0x20,0x33,0x20,0x50,0x75,0x62,0x6C,0x69,0x63,0x20,0x50,0x72,0x69,0x6D,0x61, +0x72,0x79,0x20,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6F,0x6E, +0x20,0x41,0x75,0x74,0x68,0x6F,0x72,0x69,0x74,0x79,0x30,0x1E,0x17,0x0D,0x39,0x36, +0x30,0x31,0x32,0x39,0x30,0x30,0x30,0x30,0x30,0x30,0x5A,0x17,0x0D,0x32,0x38,0x30, +0x38,0x30,0x32,0x32,0x33,0x35,0x39,0x35,0x39,0x5A,0x30,0x5F,0x31,0x0B,0x30,0x09, +0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x17,0x30,0x15,0x06,0x03,0x55, +0x04,0x0A,0x13,0x0E,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6E,0x2C,0x20,0x49,0x6E, +0x63,0x2E,0x31,0x37,0x30,0x35,0x06,0x03,0x55,0x04,0x0B,0x13,0x2E,0x43,0x6C,0x61, +0x73,0x73,0x20,0x33,0x20,0x50,0x75,0x62,0x6C,0x69,0x63,0x20,0x50,0x72,0x69,0x6D, +0x61,0x72,0x79,0x20,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6F, +0x6E,0x20,0x41,0x75,0x74,0x68,0x6F,0x72,0x69,0x74,0x79,0x30,0x81,0x9F,0x30,0x0D, +0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x01,0x05,0x00,0x03,0x81,0x8D, +0x00,0x30,0x81,0x89,0x02,0x81,0x81,0x00,0xC9,0x5C,0x59,0x9E,0xF2,0x1B,0x8A,0x01, +0x14,0xB4,0x10,0xDF,0x04,0x40,0xDB,0xE3,0x57,0xAF,0x6A,0x45,0x40,0x8F,0x84,0x0C, +0x0B,0xD1,0x33,0xD9,0xD9,0x11,0xCF,0xEE,0x02,0x58,0x1F,0x25,0xF7,0x2A,0xA8,0x44, +0x05,0xAA,0xEC,0x03,0x1F,0x78,0x7F,0x9E,0x93,0xB9,0x9A,0x00,0xAA,0x23,0x7D,0xD6, +0xAC,0x85,0xA2,0x63,0x45,0xC7,0x72,0x27,0xCC,0xF4,0x4C,0xC6,0x75,0x71,0xD2,0x39, +0xEF,0x4F,0x42,0xF0,0x75,0xDF,0x0A,0x90,0xC6,0x8E,0x20,0x6F,0x98,0x0F,0xF8,0xAC, +0x23,0x5F,0x70,0x29,0x36,0xA4,0xC9,0x86,0xE7,0xB1,0x9A,0x20,0xCB,0x53,0xA5,0x85, +0xE7,0x3D,0xBE,0x7D,0x9A,0xFE,0x24,0x45,0x33,0xDC,0x76,0x15,0xED,0x0F,0xA2,0x71, +0x64,0x4C,0x65,0x2E,0x81,0x68,0x45,0xA7,0x02,0x03,0x01,0x00,0x01,0x30,0x0D,0x06, +0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x03,0x81,0x81,0x00, +0x10,0x72,0x52,0xA9,0x05,0x14,0x19,0x32,0x08,0x41,0xF0,0xC5,0x6B,0x0A,0xCC,0x7E, +0x0F,0x21,0x19,0xCD,0xE4,0x67,0xDC,0x5F,0xA9,0x1B,0xE6,0xCA,0xE8,0x73,0x9D,0x22, +0xD8,0x98,0x6E,0x73,0x03,0x61,0x91,0xC5,0x7C,0xB0,0x45,0x40,0x6E,0x44,0x9D,0x8D, +0xB0,0xB1,0x96,0x74,0x61,0x2D,0x0D,0xA9,0x45,0xD2,0xA4,0x92,0x2A,0xD6,0x9A,0x75, +0x97,0x6E,0x3F,0x53,0xFD,0x45,0x99,0x60,0x1D,0xA8,0x2B,0x4C,0xF9,0x5E,0xA7,0x09, +0xD8,0x75,0x30,0xD7,0xD2,0x65,0x60,0x3D,0x67,0xD6,0x48,0x55,0x75,0x69,0x3F,0x91, +0xF5,0x48,0x0B,0x47,0x69,0x22,0x69,0x82,0x96,0xBE,0xC9,0xC8,0x38,0x86,0x4A,0x7A, +0x2C,0x73,0x19,0x48,0x69,0x4E,0x6B,0x7C,0x65,0xBF,0x0F,0xFC,0x70,0xCE,0x88,0x90, +}; + [trustedCertificates addObject:[NSData dataWithBytes:XXX_certificate length:sizeof(XXX_certificate)]]; + } + { +/* subject:/C=US/O=thawte, Inc./OU=(c) 2007 thawte, Inc. - For authorized use only/CN=thawte Primary Root CA - G2 */ +/* issuer :/C=US/O=thawte, Inc./OU=(c) 2007 thawte, Inc. - For authorized use only/CN=thawte Primary Root CA - G2 */ +unsigned char XXX_certificate[652]={ +0x30,0x82,0x02,0x88,0x30,0x82,0x02,0x0D,0xA0,0x03,0x02,0x01,0x02,0x02,0x10,0x35, +0xFC,0x26,0x5C,0xD9,0x84,0x4F,0xC9,0x3D,0x26,0x3D,0x57,0x9B,0xAE,0xD7,0x56,0x30, +0x0A,0x06,0x08,0x2A,0x86,0x48,0xCE,0x3D,0x04,0x03,0x03,0x30,0x81,0x84,0x31,0x0B, +0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x15,0x30,0x13,0x06, +0x03,0x55,0x04,0x0A,0x13,0x0C,0x74,0x68,0x61,0x77,0x74,0x65,0x2C,0x20,0x49,0x6E, +0x63,0x2E,0x31,0x38,0x30,0x36,0x06,0x03,0x55,0x04,0x0B,0x13,0x2F,0x28,0x63,0x29, +0x20,0x32,0x30,0x30,0x37,0x20,0x74,0x68,0x61,0x77,0x74,0x65,0x2C,0x20,0x49,0x6E, +0x63,0x2E,0x20,0x2D,0x20,0x46,0x6F,0x72,0x20,0x61,0x75,0x74,0x68,0x6F,0x72,0x69, +0x7A,0x65,0x64,0x20,0x75,0x73,0x65,0x20,0x6F,0x6E,0x6C,0x79,0x31,0x24,0x30,0x22, +0x06,0x03,0x55,0x04,0x03,0x13,0x1B,0x74,0x68,0x61,0x77,0x74,0x65,0x20,0x50,0x72, +0x69,0x6D,0x61,0x72,0x79,0x20,0x52,0x6F,0x6F,0x74,0x20,0x43,0x41,0x20,0x2D,0x20, +0x47,0x32,0x30,0x1E,0x17,0x0D,0x30,0x37,0x31,0x31,0x30,0x35,0x30,0x30,0x30,0x30, +0x30,0x30,0x5A,0x17,0x0D,0x33,0x38,0x30,0x31,0x31,0x38,0x32,0x33,0x35,0x39,0x35, +0x39,0x5A,0x30,0x81,0x84,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02, +0x55,0x53,0x31,0x15,0x30,0x13,0x06,0x03,0x55,0x04,0x0A,0x13,0x0C,0x74,0x68,0x61, +0x77,0x74,0x65,0x2C,0x20,0x49,0x6E,0x63,0x2E,0x31,0x38,0x30,0x36,0x06,0x03,0x55, +0x04,0x0B,0x13,0x2F,0x28,0x63,0x29,0x20,0x32,0x30,0x30,0x37,0x20,0x74,0x68,0x61, +0x77,0x74,0x65,0x2C,0x20,0x49,0x6E,0x63,0x2E,0x20,0x2D,0x20,0x46,0x6F,0x72,0x20, +0x61,0x75,0x74,0x68,0x6F,0x72,0x69,0x7A,0x65,0x64,0x20,0x75,0x73,0x65,0x20,0x6F, +0x6E,0x6C,0x79,0x31,0x24,0x30,0x22,0x06,0x03,0x55,0x04,0x03,0x13,0x1B,0x74,0x68, +0x61,0x77,0x74,0x65,0x20,0x50,0x72,0x69,0x6D,0x61,0x72,0x79,0x20,0x52,0x6F,0x6F, +0x74,0x20,0x43,0x41,0x20,0x2D,0x20,0x47,0x32,0x30,0x76,0x30,0x10,0x06,0x07,0x2A, +0x86,0x48,0xCE,0x3D,0x02,0x01,0x06,0x05,0x2B,0x81,0x04,0x00,0x22,0x03,0x62,0x00, +0x04,0xA2,0xD5,0x9C,0x82,0x7B,0x95,0x9D,0xF1,0x52,0x78,0x87,0xFE,0x8A,0x16,0xBF, +0x05,0xE6,0xDF,0xA3,0x02,0x4F,0x0D,0x07,0xC6,0x00,0x51,0xBA,0x0C,0x02,0x52,0x2D, +0x22,0xA4,0x42,0x39,0xC4,0xFE,0x8F,0xEA,0xC9,0xC1,0xBE,0xD4,0x4D,0xFF,0x9F,0x7A, +0x9E,0xE2,0xB1,0x7C,0x9A,0xAD,0xA7,0x86,0x09,0x73,0x87,0xD1,0xE7,0x9A,0xE3,0x7A, +0xA5,0xAA,0x6E,0xFB,0xBA,0xB3,0x70,0xC0,0x67,0x88,0xA2,0x35,0xD4,0xA3,0x9A,0xB1, +0xFD,0xAD,0xC2,0xEF,0x31,0xFA,0xA8,0xB9,0xF3,0xFB,0x08,0xC6,0x91,0xD1,0xFB,0x29, +0x95,0xA3,0x42,0x30,0x40,0x30,0x0F,0x06,0x03,0x55,0x1D,0x13,0x01,0x01,0xFF,0x04, +0x05,0x30,0x03,0x01,0x01,0xFF,0x30,0x0E,0x06,0x03,0x55,0x1D,0x0F,0x01,0x01,0xFF, +0x04,0x04,0x03,0x02,0x01,0x06,0x30,0x1D,0x06,0x03,0x55,0x1D,0x0E,0x04,0x16,0x04, +0x14,0x9A,0xD8,0x00,0x30,0x00,0xE7,0x6B,0x7F,0x85,0x18,0xEE,0x8B,0xB6,0xCE,0x8A, +0x0C,0xF8,0x11,0xE1,0xBB,0x30,0x0A,0x06,0x08,0x2A,0x86,0x48,0xCE,0x3D,0x04,0x03, +0x03,0x03,0x69,0x00,0x30,0x66,0x02,0x31,0x00,0xDD,0xF8,0xE0,0x57,0x47,0x5B,0xA7, +0xE6,0x0A,0xC3,0xBD,0xF5,0x80,0x8A,0x97,0x35,0x0D,0x1B,0x89,0x3C,0x54,0x86,0x77, +0x28,0xCA,0xA1,0xF4,0x79,0xDE,0xB5,0xE6,0x38,0xB0,0xF0,0x65,0x70,0x8C,0x7F,0x02, +0x54,0xC2,0xBF,0xFF,0xD8,0xA1,0x3E,0xD9,0xCF,0x02,0x31,0x00,0xC4,0x8D,0x94,0xFC, +0xDC,0x53,0xD2,0xDC,0x9D,0x78,0x16,0x1F,0x15,0x33,0x23,0x53,0x52,0xE3,0x5A,0x31, +0x5D,0x9D,0xCA,0xAE,0xBD,0x13,0x29,0x44,0x0D,0x27,0x5B,0xA8,0xE7,0x68,0x9C,0x12, +0xF7,0x58,0x3F,0x2E,0x72,0x02,0x57,0xA3,0x8F,0xA1,0x14,0x2E, +}; + [trustedCertificates addObject:[NSData dataWithBytes:XXX_certificate length:sizeof(XXX_certificate)]]; + } + { +/* subject:/C=US/O=thawte, Inc./OU=Certification Services Division/OU=(c) 2006 thawte, Inc. - For authorized use only/CN=thawte Primary Root CA */ +/* issuer :/C=US/O=thawte, Inc./OU=Certification Services Division/OU=(c) 2006 thawte, Inc. - For authorized use only/CN=thawte Primary Root CA */ +unsigned char XXX_certificate[1060]={ +0x30,0x82,0x04,0x20,0x30,0x82,0x03,0x08,0xA0,0x03,0x02,0x01,0x02,0x02,0x10,0x34, +0x4E,0xD5,0x57,0x20,0xD5,0xED,0xEC,0x49,0xF4,0x2F,0xCE,0x37,0xDB,0x2B,0x6D,0x30, +0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x30,0x81, +0xA9,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x15, +0x30,0x13,0x06,0x03,0x55,0x04,0x0A,0x13,0x0C,0x74,0x68,0x61,0x77,0x74,0x65,0x2C, +0x20,0x49,0x6E,0x63,0x2E,0x31,0x28,0x30,0x26,0x06,0x03,0x55,0x04,0x0B,0x13,0x1F, +0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x53,0x65, +0x72,0x76,0x69,0x63,0x65,0x73,0x20,0x44,0x69,0x76,0x69,0x73,0x69,0x6F,0x6E,0x31, +0x38,0x30,0x36,0x06,0x03,0x55,0x04,0x0B,0x13,0x2F,0x28,0x63,0x29,0x20,0x32,0x30, +0x30,0x36,0x20,0x74,0x68,0x61,0x77,0x74,0x65,0x2C,0x20,0x49,0x6E,0x63,0x2E,0x20, +0x2D,0x20,0x46,0x6F,0x72,0x20,0x61,0x75,0x74,0x68,0x6F,0x72,0x69,0x7A,0x65,0x64, +0x20,0x75,0x73,0x65,0x20,0x6F,0x6E,0x6C,0x79,0x31,0x1F,0x30,0x1D,0x06,0x03,0x55, +0x04,0x03,0x13,0x16,0x74,0x68,0x61,0x77,0x74,0x65,0x20,0x50,0x72,0x69,0x6D,0x61, +0x72,0x79,0x20,0x52,0x6F,0x6F,0x74,0x20,0x43,0x41,0x30,0x1E,0x17,0x0D,0x30,0x36, +0x31,0x31,0x31,0x37,0x30,0x30,0x30,0x30,0x30,0x30,0x5A,0x17,0x0D,0x33,0x36,0x30, +0x37,0x31,0x36,0x32,0x33,0x35,0x39,0x35,0x39,0x5A,0x30,0x81,0xA9,0x31,0x0B,0x30, +0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x15,0x30,0x13,0x06,0x03, +0x55,0x04,0x0A,0x13,0x0C,0x74,0x68,0x61,0x77,0x74,0x65,0x2C,0x20,0x49,0x6E,0x63, +0x2E,0x31,0x28,0x30,0x26,0x06,0x03,0x55,0x04,0x0B,0x13,0x1F,0x43,0x65,0x72,0x74, +0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x53,0x65,0x72,0x76,0x69,0x63, +0x65,0x73,0x20,0x44,0x69,0x76,0x69,0x73,0x69,0x6F,0x6E,0x31,0x38,0x30,0x36,0x06, +0x03,0x55,0x04,0x0B,0x13,0x2F,0x28,0x63,0x29,0x20,0x32,0x30,0x30,0x36,0x20,0x74, +0x68,0x61,0x77,0x74,0x65,0x2C,0x20,0x49,0x6E,0x63,0x2E,0x20,0x2D,0x20,0x46,0x6F, +0x72,0x20,0x61,0x75,0x74,0x68,0x6F,0x72,0x69,0x7A,0x65,0x64,0x20,0x75,0x73,0x65, +0x20,0x6F,0x6E,0x6C,0x79,0x31,0x1F,0x30,0x1D,0x06,0x03,0x55,0x04,0x03,0x13,0x16, +0x74,0x68,0x61,0x77,0x74,0x65,0x20,0x50,0x72,0x69,0x6D,0x61,0x72,0x79,0x20,0x52, +0x6F,0x6F,0x74,0x20,0x43,0x41,0x30,0x82,0x01,0x22,0x30,0x0D,0x06,0x09,0x2A,0x86, +0x48,0x86,0xF7,0x0D,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0F,0x00,0x30,0x82, +0x01,0x0A,0x02,0x82,0x01,0x01,0x00,0xAC,0xA0,0xF0,0xFB,0x80,0x59,0xD4,0x9C,0xC7, +0xA4,0xCF,0x9D,0xA1,0x59,0x73,0x09,0x10,0x45,0x0C,0x0D,0x2C,0x6E,0x68,0xF1,0x6C, +0x5B,0x48,0x68,0x49,0x59,0x37,0xFC,0x0B,0x33,0x19,0xC2,0x77,0x7F,0xCC,0x10,0x2D, +0x95,0x34,0x1C,0xE6,0xEB,0x4D,0x09,0xA7,0x1C,0xD2,0xB8,0xC9,0x97,0x36,0x02,0xB7, +0x89,0xD4,0x24,0x5F,0x06,0xC0,0xCC,0x44,0x94,0x94,0x8D,0x02,0x62,0x6F,0xEB,0x5A, +0xDD,0x11,0x8D,0x28,0x9A,0x5C,0x84,0x90,0x10,0x7A,0x0D,0xBD,0x74,0x66,0x2F,0x6A, +0x38,0xA0,0xE2,0xD5,0x54,0x44,0xEB,0x1D,0x07,0x9F,0x07,0xBA,0x6F,0xEE,0xE9,0xFD, +0x4E,0x0B,0x29,0xF5,0x3E,0x84,0xA0,0x01,0xF1,0x9C,0xAB,0xF8,0x1C,0x7E,0x89,0xA4, +0xE8,0xA1,0xD8,0x71,0x65,0x0D,0xA3,0x51,0x7B,0xEE,0xBC,0xD2,0x22,0x60,0x0D,0xB9, +0x5B,0x9D,0xDF,0xBA,0xFC,0x51,0x5B,0x0B,0xAF,0x98,0xB2,0xE9,0x2E,0xE9,0x04,0xE8, +0x62,0x87,0xDE,0x2B,0xC8,0xD7,0x4E,0xC1,0x4C,0x64,0x1E,0xDD,0xCF,0x87,0x58,0xBA, +0x4A,0x4F,0xCA,0x68,0x07,0x1D,0x1C,0x9D,0x4A,0xC6,0xD5,0x2F,0x91,0xCC,0x7C,0x71, +0x72,0x1C,0xC5,0xC0,0x67,0xEB,0x32,0xFD,0xC9,0x92,0x5C,0x94,0xDA,0x85,0xC0,0x9B, +0xBF,0x53,0x7D,0x2B,0x09,0xF4,0x8C,0x9D,0x91,0x1F,0x97,0x6A,0x52,0xCB,0xDE,0x09, +0x36,0xA4,0x77,0xD8,0x7B,0x87,0x50,0x44,0xD5,0x3E,0x6E,0x29,0x69,0xFB,0x39,0x49, +0x26,0x1E,0x09,0xA5,0x80,0x7B,0x40,0x2D,0xEB,0xE8,0x27,0x85,0xC9,0xFE,0x61,0xFD, +0x7E,0xE6,0x7C,0x97,0x1D,0xD5,0x9D,0x02,0x03,0x01,0x00,0x01,0xA3,0x42,0x30,0x40, +0x30,0x0F,0x06,0x03,0x55,0x1D,0x13,0x01,0x01,0xFF,0x04,0x05,0x30,0x03,0x01,0x01, +0xFF,0x30,0x0E,0x06,0x03,0x55,0x1D,0x0F,0x01,0x01,0xFF,0x04,0x04,0x03,0x02,0x01, +0x06,0x30,0x1D,0x06,0x03,0x55,0x1D,0x0E,0x04,0x16,0x04,0x14,0x7B,0x5B,0x45,0xCF, +0xAF,0xCE,0xCB,0x7A,0xFD,0x31,0x92,0x1A,0x6A,0xB6,0xF3,0x46,0xEB,0x57,0x48,0x50, +0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x03, +0x82,0x01,0x01,0x00,0x79,0x11,0xC0,0x4B,0xB3,0x91,0xB6,0xFC,0xF0,0xE9,0x67,0xD4, +0x0D,0x6E,0x45,0xBE,0x55,0xE8,0x93,0xD2,0xCE,0x03,0x3F,0xED,0xDA,0x25,0xB0,0x1D, +0x57,0xCB,0x1E,0x3A,0x76,0xA0,0x4C,0xEC,0x50,0x76,0xE8,0x64,0x72,0x0C,0xA4,0xA9, +0xF1,0xB8,0x8B,0xD6,0xD6,0x87,0x84,0xBB,0x32,0xE5,0x41,0x11,0xC0,0x77,0xD9,0xB3, +0x60,0x9D,0xEB,0x1B,0xD5,0xD1,0x6E,0x44,0x44,0xA9,0xA6,0x01,0xEC,0x55,0x62,0x1D, +0x77,0xB8,0x5C,0x8E,0x48,0x49,0x7C,0x9C,0x3B,0x57,0x11,0xAC,0xAD,0x73,0x37,0x8E, +0x2F,0x78,0x5C,0x90,0x68,0x47,0xD9,0x60,0x60,0xE6,0xFC,0x07,0x3D,0x22,0x20,0x17, +0xC4,0xF7,0x16,0xE9,0xC4,0xD8,0x72,0xF9,0xC8,0x73,0x7C,0xDF,0x16,0x2F,0x15,0xA9, +0x3E,0xFD,0x6A,0x27,0xB6,0xA1,0xEB,0x5A,0xBA,0x98,0x1F,0xD5,0xE3,0x4D,0x64,0x0A, +0x9D,0x13,0xC8,0x61,0xBA,0xF5,0x39,0x1C,0x87,0xBA,0xB8,0xBD,0x7B,0x22,0x7F,0xF6, +0xFE,0xAC,0x40,0x79,0xE5,0xAC,0x10,0x6F,0x3D,0x8F,0x1B,0x79,0x76,0x8B,0xC4,0x37, +0xB3,0x21,0x18,0x84,0xE5,0x36,0x00,0xEB,0x63,0x20,0x99,0xB9,0xE9,0xFE,0x33,0x04, +0xBB,0x41,0xC8,0xC1,0x02,0xF9,0x44,0x63,0x20,0x9E,0x81,0xCE,0x42,0xD3,0xD6,0x3F, +0x2C,0x76,0xD3,0x63,0x9C,0x59,0xDD,0x8F,0xA6,0xE1,0x0E,0xA0,0x2E,0x41,0xF7,0x2E, +0x95,0x47,0xCF,0xBC,0xFD,0x33,0xF3,0xF6,0x0B,0x61,0x7E,0x7E,0x91,0x2B,0x81,0x47, +0xC2,0x27,0x30,0xEE,0xA7,0x10,0x5D,0x37,0x8F,0x5C,0x39,0x2B,0xE4,0x04,0xF0,0x7B, +0x8D,0x56,0x8C,0x68, +}; + [trustedCertificates addObject:[NSData dataWithBytes:XXX_certificate length:sizeof(XXX_certificate)]]; + } + { +/* subject:/L=ValiCert Validation Network/O=ValiCert, Inc./OU=ValiCert Class 2 Policy Validation Authority/CN=http://www.valicert.com//emailAddress=info@valicert.com */ +/* issuer :/L=ValiCert Validation Network/O=ValiCert, Inc./OU=ValiCert Class 2 Policy Validation Authority/CN=http://www.valicert.com//emailAddress=info@valicert.com */ +unsigned char XXX_certificate[747]={ +0x30,0x82,0x02,0xE7,0x30,0x82,0x02,0x50,0x02,0x01,0x01,0x30,0x0D,0x06,0x09,0x2A, +0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x30,0x81,0xBB,0x31,0x24,0x30, +0x22,0x06,0x03,0x55,0x04,0x07,0x13,0x1B,0x56,0x61,0x6C,0x69,0x43,0x65,0x72,0x74, +0x20,0x56,0x61,0x6C,0x69,0x64,0x61,0x74,0x69,0x6F,0x6E,0x20,0x4E,0x65,0x74,0x77, +0x6F,0x72,0x6B,0x31,0x17,0x30,0x15,0x06,0x03,0x55,0x04,0x0A,0x13,0x0E,0x56,0x61, +0x6C,0x69,0x43,0x65,0x72,0x74,0x2C,0x20,0x49,0x6E,0x63,0x2E,0x31,0x35,0x30,0x33, +0x06,0x03,0x55,0x04,0x0B,0x13,0x2C,0x56,0x61,0x6C,0x69,0x43,0x65,0x72,0x74,0x20, +0x43,0x6C,0x61,0x73,0x73,0x20,0x32,0x20,0x50,0x6F,0x6C,0x69,0x63,0x79,0x20,0x56, +0x61,0x6C,0x69,0x64,0x61,0x74,0x69,0x6F,0x6E,0x20,0x41,0x75,0x74,0x68,0x6F,0x72, +0x69,0x74,0x79,0x31,0x21,0x30,0x1F,0x06,0x03,0x55,0x04,0x03,0x13,0x18,0x68,0x74, +0x74,0x70,0x3A,0x2F,0x2F,0x77,0x77,0x77,0x2E,0x76,0x61,0x6C,0x69,0x63,0x65,0x72, +0x74,0x2E,0x63,0x6F,0x6D,0x2F,0x31,0x20,0x30,0x1E,0x06,0x09,0x2A,0x86,0x48,0x86, +0xF7,0x0D,0x01,0x09,0x01,0x16,0x11,0x69,0x6E,0x66,0x6F,0x40,0x76,0x61,0x6C,0x69, +0x63,0x65,0x72,0x74,0x2E,0x63,0x6F,0x6D,0x30,0x1E,0x17,0x0D,0x39,0x39,0x30,0x36, +0x32,0x36,0x30,0x30,0x31,0x39,0x35,0x34,0x5A,0x17,0x0D,0x31,0x39,0x30,0x36,0x32, +0x36,0x30,0x30,0x31,0x39,0x35,0x34,0x5A,0x30,0x81,0xBB,0x31,0x24,0x30,0x22,0x06, +0x03,0x55,0x04,0x07,0x13,0x1B,0x56,0x61,0x6C,0x69,0x43,0x65,0x72,0x74,0x20,0x56, +0x61,0x6C,0x69,0x64,0x61,0x74,0x69,0x6F,0x6E,0x20,0x4E,0x65,0x74,0x77,0x6F,0x72, +0x6B,0x31,0x17,0x30,0x15,0x06,0x03,0x55,0x04,0x0A,0x13,0x0E,0x56,0x61,0x6C,0x69, +0x43,0x65,0x72,0x74,0x2C,0x20,0x49,0x6E,0x63,0x2E,0x31,0x35,0x30,0x33,0x06,0x03, +0x55,0x04,0x0B,0x13,0x2C,0x56,0x61,0x6C,0x69,0x43,0x65,0x72,0x74,0x20,0x43,0x6C, +0x61,0x73,0x73,0x20,0x32,0x20,0x50,0x6F,0x6C,0x69,0x63,0x79,0x20,0x56,0x61,0x6C, +0x69,0x64,0x61,0x74,0x69,0x6F,0x6E,0x20,0x41,0x75,0x74,0x68,0x6F,0x72,0x69,0x74, +0x79,0x31,0x21,0x30,0x1F,0x06,0x03,0x55,0x04,0x03,0x13,0x18,0x68,0x74,0x74,0x70, +0x3A,0x2F,0x2F,0x77,0x77,0x77,0x2E,0x76,0x61,0x6C,0x69,0x63,0x65,0x72,0x74,0x2E, +0x63,0x6F,0x6D,0x2F,0x31,0x20,0x30,0x1E,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D, +0x01,0x09,0x01,0x16,0x11,0x69,0x6E,0x66,0x6F,0x40,0x76,0x61,0x6C,0x69,0x63,0x65, +0x72,0x74,0x2E,0x63,0x6F,0x6D,0x30,0x81,0x9F,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48, +0x86,0xF7,0x0D,0x01,0x01,0x01,0x05,0x00,0x03,0x81,0x8D,0x00,0x30,0x81,0x89,0x02, +0x81,0x81,0x00,0xCE,0x3A,0x71,0xCA,0xE5,0xAB,0xC8,0x59,0x92,0x55,0xD7,0xAB,0xD8, +0x74,0x0E,0xF9,0xEE,0xD9,0xF6,0x55,0x47,0x59,0x65,0x47,0x0E,0x05,0x55,0xDC,0xEB, +0x98,0x36,0x3C,0x5C,0x53,0x5D,0xD3,0x30,0xCF,0x38,0xEC,0xBD,0x41,0x89,0xED,0x25, +0x42,0x09,0x24,0x6B,0x0A,0x5E,0xB3,0x7C,0xDD,0x52,0x2D,0x4C,0xE6,0xD4,0xD6,0x7D, +0x5A,0x59,0xA9,0x65,0xD4,0x49,0x13,0x2D,0x24,0x4D,0x1C,0x50,0x6F,0xB5,0xC1,0x85, +0x54,0x3B,0xFE,0x71,0xE4,0xD3,0x5C,0x42,0xF9,0x80,0xE0,0x91,0x1A,0x0A,0x5B,0x39, +0x36,0x67,0xF3,0x3F,0x55,0x7C,0x1B,0x3F,0xB4,0x5F,0x64,0x73,0x34,0xE3,0xB4,0x12, +0xBF,0x87,0x64,0xF8,0xDA,0x12,0xFF,0x37,0x27,0xC1,0xB3,0x43,0xBB,0xEF,0x7B,0x6E, +0x2E,0x69,0xF7,0x02,0x03,0x01,0x00,0x01,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86, +0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x03,0x81,0x81,0x00,0x3B,0x7F,0x50,0x6F,0x6F, +0x50,0x94,0x99,0x49,0x62,0x38,0x38,0x1F,0x4B,0xF8,0xA5,0xC8,0x3E,0xA7,0x82,0x81, +0xF6,0x2B,0xC7,0xE8,0xC5,0xCE,0xE8,0x3A,0x10,0x82,0xCB,0x18,0x00,0x8E,0x4D,0xBD, +0xA8,0x58,0x7F,0xA1,0x79,0x00,0xB5,0xBB,0xE9,0x8D,0xAF,0x41,0xD9,0x0F,0x34,0xEE, +0x21,0x81,0x19,0xA0,0x32,0x49,0x28,0xF4,0xC4,0x8E,0x56,0xD5,0x52,0x33,0xFD,0x50, +0xD5,0x7E,0x99,0x6C,0x03,0xE4,0xC9,0x4C,0xFC,0xCB,0x6C,0xAB,0x66,0xB3,0x4A,0x21, +0x8C,0xE5,0xB5,0x0C,0x32,0x3E,0x10,0xB2,0xCC,0x6C,0xA1,0xDC,0x9A,0x98,0x4C,0x02, +0x5B,0xF3,0xCE,0xB9,0x9E,0xA5,0x72,0x0E,0x4A,0xB7,0x3F,0x3C,0xE6,0x16,0x68,0xF8, +0xBE,0xED,0x74,0x4C,0xBC,0x5B,0xD5,0x62,0x1F,0x43,0xDD, +}; + + [trustedCertificates addObject:[NSData dataWithBytes:XXX_certificate length:sizeof(XXX_certificate)]]; + } + return [NSArray arrayWithArray:trustedCertificates]; +} + +@end diff --git a/Pods/Braintree/Braintree/API/Offline Mode/BTOfflineClientBackend.h b/Pods/Braintree/Braintree/API/Offline Mode/BTOfflineClientBackend.h new file mode 100644 index 0000000..6a27832 --- /dev/null +++ b/Pods/Braintree/Braintree/API/Offline Mode/BTOfflineClientBackend.h @@ -0,0 +1,11 @@ +#import + +@class BTPaymentMethod; + +@interface BTOfflineClientBackend : NSObject + +- (instancetype)init; +- (NSArray *)allPaymentMethods; +- (void)addPaymentMethod:(BTPaymentMethod *)card; + +@end diff --git a/Pods/Braintree/Braintree/API/Offline Mode/BTOfflineClientBackend.m b/Pods/Braintree/Braintree/API/Offline Mode/BTOfflineClientBackend.m new file mode 100644 index 0000000..4e7ef66 --- /dev/null +++ b/Pods/Braintree/Braintree/API/Offline Mode/BTOfflineClientBackend.m @@ -0,0 +1,29 @@ +#import "BTOfflineClientBackend.h" + +@interface BTOfflineClientBackend () + +@property (nonatomic, strong) NSMutableArray *paymentMethods; + +@end + +@implementation BTOfflineClientBackend + +- (instancetype)init { + self = [super init]; + if (self) { + self.paymentMethods = [NSMutableArray array]; + } + return self; +} + +- (NSArray *)allPaymentMethods { + return self.paymentMethods; +} + +- (void)addPaymentMethod:(BTPaymentMethod *)card { + if (card) { + [self.paymentMethods insertObject:card atIndex:0]; + } +} + +@end diff --git a/Pods/Braintree/Braintree/API/Offline Mode/BTOfflineModeURLProtocol.h b/Pods/Braintree/Braintree/API/Offline Mode/BTOfflineModeURLProtocol.h new file mode 100644 index 0000000..d5b5126 --- /dev/null +++ b/Pods/Braintree/Braintree/API/Offline Mode/BTOfflineModeURLProtocol.h @@ -0,0 +1,14 @@ +#import + +@class BTOfflineClientBackend; + +extern NSString *const BTOfflineModeClientApiBaseURL; + +@interface BTOfflineModeURLProtocol : NSURLProtocol + ++ (NSURL *)clientApiBaseURL; + ++ (void)setBackend:(BTOfflineClientBackend *)backend; ++ (BTOfflineClientBackend *)backend; + +@end diff --git a/Pods/Braintree/Braintree/API/Offline Mode/BTOfflineModeURLProtocol.m b/Pods/Braintree/Braintree/API/Offline Mode/BTOfflineModeURLProtocol.m new file mode 100644 index 0000000..65f9d44 --- /dev/null +++ b/Pods/Braintree/Braintree/API/Offline Mode/BTOfflineModeURLProtocol.m @@ -0,0 +1,344 @@ +#import "BTOfflineModeURLProtocol.h" +#import "BTOfflineClientBackend.h" +#import "BTMutableApplePayPaymentMethod.h" +#import "BTMutableCardPaymentMethod.h" +#import "BTMutablePayPalPaymentMethod.h" +#import + +NSString *const BTOfflineModeClientApiBaseURL = @"braintree-api-offline-http://client-api"; +NSString *const BTOfflineModeHTTPVersionString = @"HTTP/1.1"; + +void *backend_associated_object_key = &backend_associated_object_key; + +static BTOfflineClientBackend *backend; + +@implementation BTOfflineModeURLProtocol + ++ (NSURL *)clientApiBaseURL { + return [NSURL URLWithString:BTOfflineModeClientApiBaseURL]; +} + ++ (BOOL)canInitWithRequest:(NSURLRequest *)request { + NSURL *requestURL = request.URL; + + BOOL hasCorrectScheme = [requestURL.scheme isEqualToString:[[self clientApiBaseURL] scheme]]; + BOOL hasCorrectHost = [requestURL.host isEqualToString:[[self clientApiBaseURL] host]]; + + return hasCorrectScheme && hasCorrectHost; +} + ++ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request { + return request; +} + +- (void)startLoading { + id client = self.client; + NSURLRequest *request = self.request; + + __block NSHTTPURLResponse *response; + __block NSData *responseData; + + if ([request.HTTPMethod isEqualToString:@"GET"] && [request.URL.path isEqualToString:@"/v1/payment_methods"]) { + response = [[NSHTTPURLResponse alloc] initWithURL:self.request.URL + statusCode:200 + HTTPVersion:BTOfflineModeHTTPVersionString + headerFields:@{@"Content-Type": @"application/json" }]; + + NSMutableArray *responseCards = [NSMutableArray array]; + for (BTPaymentMethod *paymentMethod in [[[self class] backend] allPaymentMethods]) { + [responseCards addObject:[self responseDictionaryForPaymentMethod:paymentMethod]]; + } + + responseData = ({ + NSError *error; + NSData *data = [NSJSONSerialization dataWithJSONObject:@{@"paymentMethods": responseCards} + options:0 + error:&error]; + NSAssert(error == nil, @"Error writing offline mode JSON response: %@", error); + data; + }); + } else if ([request.HTTPMethod isEqualToString:@"POST"] && [request.URL.path isEqualToString:@"/v1/payment_methods/credit_cards"]) { + + NSDictionary *requestObject = [self queryDictionaryFromRequest:request]; + + NSString *number = requestObject[@"credit_card"][@"number"]; + NSString *lastTwo = [number substringFromIndex:([number length] - 2)]; + + BTMutableCardPaymentMethod *card = [BTMutableCardPaymentMethod new]; + card.lastTwo = lastTwo; + card.typeString = [self cardTypeStringForNumber:number]; + + if (card) { + [[[self class] backend] addPaymentMethod:card]; + + response = [[NSHTTPURLResponse alloc] initWithURL:self.request.URL + statusCode:201 + HTTPVersion:BTOfflineModeHTTPVersionString + headerFields:@{@"Content-Type": @"application/json"}]; + responseData = ({ + NSError *error; + NSData *data = [NSJSONSerialization dataWithJSONObject:@{ @"creditCards": @[ [self responseDictionaryForPaymentMethod:card] ] } + options:0 + error:&error]; + NSAssert(error == nil, @"Error writing offline mode JSON response: %@", error); + data; + }); + } else { + response = [[NSHTTPURLResponse alloc] initWithURL:self.request.URL + statusCode:501 + HTTPVersion:BTOfflineModeHTTPVersionString + headerFields:@{}]; + responseData = nil; + } + } else if ([request.HTTPMethod isEqualToString:@"POST"] && [request.URL.path isEqualToString:@"/v1/payment_methods/apple_payment_tokens"]) { + NSDictionary *requestObject = [self queryDictionaryFromRequest:request]; + NSDictionary *payment = requestObject[@"applePaymentToken"]; + if (payment) { +#if BT_ENABLE_APPLE_PAY + BTMutableApplePayPaymentMethod *apple = [[BTMutableApplePayPaymentMethod alloc] init]; + [[[self class] backend] addPaymentMethod:apple]; + + response = [[NSHTTPURLResponse alloc] initWithURL:self.request.URL + statusCode:201 + HTTPVersion:BTOfflineModeHTTPVersionString + headerFields:@{@"Content-Type": @"application/json"}]; + responseData = ({ + NSError *error; + NSData *data = [NSJSONSerialization dataWithJSONObject:@{ @"applePayCards": @[ [self responseDictionaryForApplePayPayment] ] } + options:0 + error:&error]; + NSAssert(error == nil, @"Error writing offline mode JSON response: %@", error); + data; + }); +#else + response = [[NSHTTPURLResponse alloc] initWithURL:self.request.URL + statusCode:501 + HTTPVersion:BTOfflineModeHTTPVersionString + headerFields:@{}]; + responseData = nil; +#endif + } else { + response = [[NSHTTPURLResponse alloc] initWithURL:self.request.URL + statusCode:501 + HTTPVersion:BTOfflineModeHTTPVersionString + headerFields:@{}]; + responseData = nil; + } + + } else if ([request.HTTPMethod isEqualToString:@"POST"] && [request.URL.path isEqualToString:@"/v1/payment_methods/paypal_accounts"]) { + BTMutablePayPalPaymentMethod *payPalPaymentMethod = [BTMutablePayPalPaymentMethod new]; + payPalPaymentMethod.email = @"fake.paypal.customer@example.com"; + + if (payPalPaymentMethod) { + [[[self class] backend] addPaymentMethod:payPalPaymentMethod]; + response = [[NSHTTPURLResponse alloc] initWithURL:self.request.URL + statusCode:201 + HTTPVersion:BTOfflineModeHTTPVersionString + headerFields:@{@"Content-Type": @"application/json"}]; + + responseData = ({ + NSError *error; + NSData *data = [NSJSONSerialization dataWithJSONObject:@{ @"paypalAccounts": @[ [self responseDictionaryForPaymentMethod:payPalPaymentMethod] ] } + options:0 + error:&error]; + NSAssert(error == nil, @"Error writing offline mode JSON response: %@", error); + data; + }); + } else { + response = [[NSHTTPURLResponse alloc] initWithURL:self.request.URL + statusCode:501 + HTTPVersion:BTOfflineModeHTTPVersionString + headerFields:@{}]; + responseData = nil; + } + } else if ([request.HTTPMethod isEqualToString:@"POST"] && [request.URL.path isEqualToString:@"/v1/analytics"]) { + response = [[NSHTTPURLResponse alloc] initWithURL:self.request.URL + statusCode:201 + HTTPVersion:BTOfflineModeHTTPVersionString + headerFields:@{ @"Content-Type": @"application/json" }]; + + responseData = ({ + NSError *error; + NSData *data = [NSJSONSerialization dataWithJSONObject:@{ @"message": @"created", @"amount": @2 } + options:0 + error:&error]; + NSAssert(error == nil, @"Error writing offline mode JSON response: %@", error); + data; + }); + } else if ([request.HTTPMethod isEqualToString:@"GET"] && [request.URL.path isEqualToString:@"/configuration"]) { + response = [[NSHTTPURLResponse alloc] initWithURL:self.request.URL + statusCode:200 + HTTPVersion:BTOfflineModeHTTPVersionString + headerFields:@{@"Content-Type": @"application/json" }]; + Class TestConfigurationFactoryClass = [NSClassFromString(@"BTTestClientTokenFactory") class]; + NSDictionary *testConfiguration = TestConfigurationFactoryClass ? (NSDictionary *)[TestConfigurationFactoryClass performSelector:@selector(configuration)] : + @{ + @"applePay": @{ @"status": @"mock", + @"countryCode": @"US", + @"currencyCode": @"USD", + @"supportedNetworks": @[ @"visa", @"mastercard", @"amex" ], + @"merchantIdentifier": @"offline-mode-apple-merchant-identifier" } + }; + responseData = ({ + NSError *error; + NSData *data = [NSJSONSerialization dataWithJSONObject:testConfiguration + options:0 + error:&error]; + NSAssert(error == nil, @"Error writing offline mode JSON response: %@", error); + data; + }); + } else { + response = [[NSHTTPURLResponse alloc] initWithURL:self.request.URL + statusCode:501 + HTTPVersion:BTOfflineModeHTTPVersionString + headerFields:@{}]; + responseData = nil; + } + + [client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed]; + + if (responseData) { + [client URLProtocol:self didLoadData:responseData]; + } + + [client URLProtocolDidFinishLoading:self]; +} + +- (void)stopLoading { +} + +#pragma mark Request Parsing + +- (NSDictionary *)queryDictionaryFromRequest:(NSURLRequest *)request { + + NSData *bodyData; + if (request.HTTPBodyStream) { + NSInputStream *inputStream = request.HTTPBodyStream; + [inputStream open]; + NSMutableData *mutableBodyData = [NSMutableData data]; + + while ([inputStream hasBytesAvailable]) { + uint8_t buffer[128]; + NSUInteger bytesRead = [inputStream read:buffer maxLength:128]; + [mutableBodyData appendBytes:buffer length:bytesRead]; + } + [inputStream close]; + bodyData = [mutableBodyData copy]; + } else { + bodyData = request.HTTPBody; + } + NSString *contentType = request.allHTTPHeaderFields[@"Content-Type"]; + if ([contentType rangeOfString:@"application/json"].location != NSNotFound) { + NSDictionary *result = [NSJSONSerialization JSONObjectWithData:bodyData options:kNilOptions error:nil]; + return result; + } else { + NSString *queryString = [[NSString alloc] initWithData:bodyData encoding:NSUTF8StringEncoding]; + NSMutableDictionary *result = [NSMutableDictionary dictionary]; + NSArray *parameters = [queryString componentsSeparatedByString:@"&"]; + for (NSString *parameter in parameters) { + NSArray *parts = [parameter componentsSeparatedByString:@"="]; + NSString *key = [[parts objectAtIndex:0] stringByRemovingPercentEncoding]; + if ([parts count] > 1) { + id value = [[parts objectAtIndex:1] stringByRemovingPercentEncoding]; + [result setObject:value forKey:key]; + } + } + return result; + } +} + +#pragma mark Response Generation + +- (NSDictionary *)responseDictionaryForPaymentMethod:(BTPaymentMethod *)paymentMethod { + if ([paymentMethod isKindOfClass:[BTCardPaymentMethod class]]) { + return [self responseDictionaryForCard:(BTCardPaymentMethod *)paymentMethod]; + } else if ([paymentMethod isKindOfClass:[BTPayPalPaymentMethod class]]) { + return [self responseDictionaryForPayPalPaymentMethod]; + } else { + return nil; + } +} + +- (NSDictionary *)responseDictionaryForApplePayPayment { + return @{ + @"nonce": [self generateNonce], + @"type": @"ApplePayCard" + }; +} + +- (NSDictionary *)responseDictionaryForCard:(BTCardPaymentMethod *)card { + return @{ + @"nonce": [self generateNonce], + @"details": @{ + @"lastTwo": card.lastTwo, + @"cardType": card.typeString, + }, + @"isLocked": @0, + @"securityQuestions": @[@"cvv"], + @"type": @"CreditCard" + }; +} + +- (NSDictionary *)responseDictionaryForPayPalPaymentMethod { + return @{ + @"description": @"PayPal", + @"nonce": [self generateNonce], + @"isLocked": @0, + @"details": @{ @"email": @"email@example.com" }, + @"type": @"PayPalAccount" + }; +} + +- (NSString *)generateNonce { + static unsigned int initialNonceValue = 0; + initialNonceValue++; + return [NSString stringWithFormat:@"00000000-0000-0000-0000-%012x", initialNonceValue]; +} + +#pragma mark Offline Card Data + ++ (NSDictionary *)cardNamesAndRegexes { + NSMutableDictionary *cardNamesAndRegex = [NSMutableDictionary dictionary]; + + NSDictionary *cardNamesAndRegexPatterns = @{ + @"Visa": @"^4[0-9]", + @"MasterCard": @"^5[1-5]", + @"American Express": @"^3[47]", + @"Diners Club": @"^3(?:0[0-5]|[68][0-9])", + @"Discover": @"^6(?:011|5[0-9]{2})", + @"JCB": @"^(?:2131|1800|35)" }; + + for (NSString *cardType in [cardNamesAndRegexPatterns allKeys]) { + NSError *error; + NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:cardNamesAndRegexPatterns[cardType] options:0 error:&error]; + NSAssert(error == nil, @"Could not compile card type detection regex for offline client: %@", error); + cardNamesAndRegex[cardType] = regex; + } + + return cardNamesAndRegex; +} + +- (NSString *)cardTypeStringForNumber:(NSString *)number { + NSDictionary *cardNamesAndRegex = [[self class] cardNamesAndRegexes]; + + for (NSString *cardType in [cardNamesAndRegex allKeys]) { + NSRegularExpression *regex = cardNamesAndRegex[cardType]; + if ([regex numberOfMatchesInString:number options:0 range:NSMakeRange(0, [number length])] > 0) { + return cardType; + } + } + + return nil; +} + +#pragma mark - Offline Client Backend + ++ (BTOfflineClientBackend *)backend { + return objc_getAssociatedObject(self, backend_associated_object_key); +} + ++ (void)setBackend:(BTOfflineClientBackend *)backend { + objc_setAssociatedObject(self, backend_associated_object_key, backend, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +@end diff --git a/Pods/Braintree/Braintree/API/Utility/BTAnalyticsMetadata.h b/Pods/Braintree/Braintree/API/Utility/BTAnalyticsMetadata.h new file mode 100644 index 0000000..11de62e --- /dev/null +++ b/Pods/Braintree/Braintree/API/Utility/BTAnalyticsMetadata.h @@ -0,0 +1,7 @@ +#import + +@interface BTAnalyticsMetadata : NSObject + ++ (NSDictionary *)metadata; + +@end diff --git a/Pods/Braintree/Braintree/API/Utility/BTAnalyticsMetadata.m b/Pods/Braintree/Braintree/API/Utility/BTAnalyticsMetadata.m new file mode 100644 index 0000000..09fb631 --- /dev/null +++ b/Pods/Braintree/Braintree/API/Utility/BTAnalyticsMetadata.m @@ -0,0 +1,219 @@ +#import "BTAnalyticsMetadata.h" +#import "BTClient.h" + +#import "BTKeychain.h" +@import CoreLocation; +#import +#import + +#import + +#ifdef __IPHONE_8_0 +#define kBTCLAuthorizationStatusAuthorized kCLAuthorizationStatusAuthorizedAlways +#else +#define kBTCLAuthorizationStatusAuthorized kCLAuthorizationStatusAuthorized +#endif + +@implementation BTAnalyticsMetadata + ++ (NSDictionary *)metadata { + BTAnalyticsMetadata *m = [[BTAnalyticsMetadata alloc] init]; + + NSMutableDictionary *data = [NSMutableDictionary dictionaryWithCapacity:16]; + + [self setObject:[m platform] forKey:@"platform" inDictionary:data]; + [self setObject:[m platformVersion] forKey:@"platformVersion" inDictionary:data]; + [self setObject:[m sdkVersion] forKey:@"sdkVersion" inDictionary:data]; + [self setObject:[m merchantAppId] forKey:@"merchantAppId" inDictionary:data]; + [self setObject:[m merchantAppName] forKey:@"merchantAppName" inDictionary:data]; + [self setObject:[m merchantAppVersion] forKey:@"merchantAppVersion" inDictionary:data]; +#ifndef __IPHONE_8_0 + [self setObject:@([m deviceRooted]) forKey:@"deviceRooted" inDictionary:data]; +#endif + [self setObject:[m deviceManufacturer] forKey:@"deviceManufacturer" inDictionary:data]; + [self setObject:[m deviceModel] forKey:@"deviceModel" inDictionary:data]; + if ([CLLocationManager locationServicesEnabled] && [CLLocationManager authorizationStatus] == kBTCLAuthorizationStatusAuthorized) { + [self setObject:@([m deviceLocationLatitude]) forKey:@"deviceLocationLatitude" inDictionary:data]; + [self setObject:@([m deviceLocationLongitude]) forKey:@"deviceLocationLongitude" inDictionary:data]; + } + [self setObject:[m iosDeviceName] forKey:@"iosDeviceName" inDictionary:data]; + [self setObject:[m iosSystemName] forKey:@"iosSystemName" inDictionary:data]; + [self setObject:[m iosBaseSDK] forKey:@"iosBaseSDK" inDictionary:data]; + [self setObject:[m iosDeploymentTarget] forKey:@"iosDeploymentTarget" inDictionary:data]; + [self setObject:[m iosIdentifierForVendor] forKey:@"iosIdentifierForVendor" inDictionary:data]; + [self setObject:@([m iosIsCocoapods]) forKey:@"iosIsCocoapods" inDictionary:data]; + [self setObject:[m deviceAppGeneratedPersistentUuid] forKey:@"deviceAppGeneratedPersistentUuid" inDictionary:data]; + [self setObject:@([m isSimulator]) forKey:@"isSimulator" inDictionary:data]; + [self setObject:[m deviceScreenOrientation] forKey:@"deviceScreenOrientation" inDictionary:data]; + [self setObject:[m userInterfaceOrientation] forKey:@"userInterfaceOrientation" inDictionary:data]; + + return [NSDictionary dictionaryWithDictionary:data]; +} + ++ (void)setObject:(id)object forKey:(id)aKey inDictionary:(NSMutableDictionary *)dictionary { + if (object) { + [dictionary setObject:object forKey:aKey]; + } +} + +#pragma mark Metadata Factors + +- (NSString *)platform { + return @"iOS"; +} + +- (NSString *)platformVersion { + return [[UIDevice currentDevice] systemVersion]; +} + +- (NSString *)sdkVersion { + return [BTClient libraryVersion]; +} + +- (NSString *)merchantAppId { + return [[[NSBundle mainBundle] infoDictionary] objectForKey:(__bridge NSString *)kCFBundleIdentifierKey]; +} + +- (NSString *)merchantAppVersion { + return [[[NSBundle mainBundle] infoDictionary] objectForKey:(__bridge NSString *)kCFBundleVersionKey]; +} + +- (NSString *)merchantAppName { + return [[[NSBundle mainBundle] infoDictionary] objectForKey:(__bridge NSString *)kCFBundleNameKey]; +} + +- (BOOL)deviceRooted { +#if TARGET_IPHONE_SIMULATOR || __IPHONE_8_0 + return NO; +#else + BOOL isJailbroken = system(NULL) == 1; + + return isJailbroken; +#endif +} + +- (NSString *)deviceManufacturer { + return @"Apple"; +} + +- (NSString *)deviceModel { + struct utsname systemInfo; + + uname(&systemInfo); + + NSString* code = [NSString stringWithCString:systemInfo.machine + encoding:NSUTF8StringEncoding]; + + + return code; +} + +- (CLLocationDegrees)deviceLocationLatitude { + return [[[[CLLocationManager alloc] init] location] coordinate].latitude; +} + +- (CLLocationDegrees)deviceLocationLongitude { + return [[[[CLLocationManager alloc] init] location] coordinate].longitude; +} + +- (NSString *)iosIdentifierForVendor { + return [[[UIDevice currentDevice] identifierForVendor] UUIDString]; +} + +- (NSString *)iosDeploymentTarget { + return [@(__IPHONE_OS_VERSION_MIN_REQUIRED) stringValue]; +} + +- (NSString *)iosBaseSDK { + return [@(__IPHONE_OS_VERSION_MAX_ALLOWED) stringValue]; +} + +- (NSString *)iosDeviceName { + return [[UIDevice currentDevice] name]; +} + +- (NSString *)iosSystemName { + return [[UIDevice currentDevice] systemName]; +} + +- (BOOL)iosIsCocoapods { +#ifdef COCOAPODS + return YES; +#else + return NO; +#endif +} + +- (NSString *)deviceAppGeneratedPersistentUuid { + @try { + static NSString *deviceAppGeneratedPersistentUuidKeychainKey = @"deviceAppGeneratedPersistentUuid"; + NSString *savedIdentifier = [BTKeychain stringForKey:deviceAppGeneratedPersistentUuidKeychainKey]; + if (savedIdentifier.length == 0) { + savedIdentifier = [[NSUUID UUID] UUIDString]; + BOOL setDidSucceed = [BTKeychain setString:savedIdentifier + forKey:deviceAppGeneratedPersistentUuidKeychainKey]; + if (!setDidSucceed) { + return nil; + } + } + return savedIdentifier; + } @catch (NSException *exception) { + return nil; + } +} + +- (BOOL)isSimulator { + return TARGET_IPHONE_SIMULATOR; +} + +- (NSString *)userInterfaceOrientation { +// UIViewController interface orientation methods are deprecated as of iOS 8 +#ifndef __IPHONE_8_0 + if ([UIApplication class] == nil) { + return nil; + } + + UIInterfaceOrientation deviceOrientation = [[[[UIApplication sharedApplication] keyWindow] rootViewController] interfaceOrientation]; + + switch (deviceOrientation) { + case UIInterfaceOrientationPortrait: + return @"Portrait"; + case UIInterfaceOrientationPortraitUpsideDown: + return @"PortraitUpsideDown"; + case UIInterfaceOrientationLandscapeLeft: + return @"LandscapeLeft"; + case UIInterfaceOrientationLandscapeRight: + return @"LandscapeRight"; + default: + return @"Unknown"; + } +#else + return nil; +#endif +} + +- (NSString *)deviceScreenOrientation { + if ([UIDevice class] == nil) { + return nil; + } + + switch ([[UIDevice currentDevice] orientation]) { + case UIDeviceOrientationFaceUp: + return @"FaceUp"; + case UIDeviceOrientationFaceDown: + return @"FaceDown"; + case UIDeviceOrientationPortrait: + return @"Portrait"; + case UIDeviceOrientationPortraitUpsideDown: + return @"PortraitUpsideDown"; + case UIDeviceOrientationLandscapeLeft: + return @"LandscapeLeft"; + case UIDeviceOrientationLandscapeRight: + return @"LandscapeRight"; + default: + return @"Unknown"; + } +} + + +@end diff --git a/Pods/Braintree/Braintree/API/Utility/BTErrors.m b/Pods/Braintree/Braintree/API/Utility/BTErrors.m new file mode 100644 index 0000000..33e3b9b --- /dev/null +++ b/Pods/Braintree/Braintree/API/Utility/BTErrors.m @@ -0,0 +1,11 @@ +#import "BTErrors.h" + +#pragma mark Braintree Error Domains + +NSString *const BTBraintreeAPIErrorDomain = @"BTBraintreeAPIErrorDomain"; + +#pragma mark Error userInfo Keys + +NSString *const BTCustomerInputBraintreeValidationErrorsKey = @"BTCustomerInputBraintreeValidationErrorsKey"; + +NSString *BTThreeDSecureInfoKey = @"BTThreeDSecureInfoKey"; diff --git a/Pods/Braintree/Braintree/API/Utility/BTKeychain.h b/Pods/Braintree/Braintree/API/Utility/BTKeychain.h new file mode 100644 index 0000000..99b7e12 --- /dev/null +++ b/Pods/Braintree/Braintree/API/Utility/BTKeychain.h @@ -0,0 +1,12 @@ +#import + +@interface BTKeychain : NSObject + ++ (BOOL)setString:(NSString *)string forKey:(NSString *)key; ++ (NSString *)stringForKey:(NSString *)key; + ++ (BOOL)setData:(NSData *)data forKey:(NSString *)key; ++ (NSData *)dataForKey:(NSString *)key; + + +@end diff --git a/Pods/Braintree/Braintree/API/Utility/BTKeychain.m b/Pods/Braintree/Braintree/API/Utility/BTKeychain.m new file mode 100644 index 0000000..fb631af --- /dev/null +++ b/Pods/Braintree/Braintree/API/Utility/BTKeychain.m @@ -0,0 +1,98 @@ +#import "BTKeychain.h" +@import Security; + +@implementation BTKeychain + ++ (BOOL)setString:(NSString *)string forKey:(NSString *)key { + NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding]; + return [self setData:data forKey:key]; +} + ++ (NSString *)stringForKey:(NSString *)key { + NSData *data = [self dataForKey:key]; + return data == nil ? nil : [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; +} + ++ (NSString *)keychainKeyForKey:(NSString *)key { + return [NSString stringWithFormat:@"com.braintreepayments.Braintree-API.%@", key]; +} + ++ (BOOL)setData:(NSData *)data forKey:(NSString *)key { + if(!key) { + return NO; + } + + BOOL success = YES; + + key = [self keychainKeyForKey:key]; + + // First check if it already exists, by creating a search dictionary and requesting that + // nothing be returned, and performing the search anyway. + NSMutableDictionary *existsQueryDictionary = [NSMutableDictionary dictionary]; + + [existsQueryDictionary setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id)kSecClass]; + + // Add the keys to the search dict + [existsQueryDictionary setObject:@"Service" forKey:(__bridge id)kSecAttrService]; + [existsQueryDictionary setObject:key forKey:(__bridge id)kSecAttrAccount]; + + OSStatus res = SecItemCopyMatching((__bridge CFDictionaryRef)existsQueryDictionary, NULL); + if(res == errSecItemNotFound) { + if(data) { + NSMutableDictionary *addDict = existsQueryDictionary; + [addDict setObject:data forKey:(__bridge id)kSecValueData]; + [addDict setObject:(__bridge id)kSecAttrAccessibleWhenUnlockedThisDeviceOnly forKey:(__bridge id)kSecAttrAccessible]; + + res = SecItemAdd((__bridge CFDictionaryRef)addDict, NULL); + if (res != errSecSuccess) { + success = NO; + } + } + } + else if(res == errSecSuccess) { + if(data) { + // Modify an existing one + // Actually pull it now of the keychain at this point. + NSDictionary *attributeDict = [NSDictionary dictionaryWithObject:data forKey:(__bridge id)kSecValueData]; + + res = SecItemUpdate((__bridge CFDictionaryRef)existsQueryDictionary, (__bridge CFDictionaryRef)attributeDict); + if (res != errSecSuccess) { + success = NO; + } + } else { + SecItemDelete((__bridge CFDictionaryRef)existsQueryDictionary); + } + } + else { + success = NO; + } + + return success; +} + ++ (NSData *)dataForKey:(NSString *)key { + + key = [self keychainKeyForKey:key]; + + NSMutableDictionary *existsQueryDictionary = [NSMutableDictionary dictionary]; + + [existsQueryDictionary setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id)kSecClass]; + + // Add the keys to the search dict + [existsQueryDictionary setObject:@"Service" forKey:(__bridge id)kSecAttrService]; + [existsQueryDictionary setObject:key forKey:(__bridge id)kSecAttrAccount]; + + // We want the data back! + [existsQueryDictionary setObject:(id)kCFBooleanTrue forKey:(__bridge id)kSecReturnData]; + + CFTypeRef cfData = NULL; + OSStatus res = SecItemCopyMatching((__bridge CFDictionaryRef)existsQueryDictionary, &cfData); + NSData *data = (id)CFBridgingRelease(cfData); + if(res == errSecSuccess) { + return data; + } + + return nil; +} + +@end diff --git a/Pods/Braintree/Braintree/API/Utility/BTLogger.m b/Pods/Braintree/Braintree/API/Utility/BTLogger.m new file mode 100644 index 0000000..83bbda1 --- /dev/null +++ b/Pods/Braintree/Braintree/API/Utility/BTLogger.m @@ -0,0 +1,85 @@ +#import + +#import "BTLogger_Internal.h" + +#define variadicLogLevel(level, format) \ + va_list args; \ + va_start(args, format); \ + [self logLevel:level format:format arguments:args]; \ + va_end(args); + + +@implementation BTLogger + ++ (instancetype)sharedLogger { + static BTLogger *instance; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + instance = [self new]; + }); + + return instance; +} + +- (instancetype)init { + self = [super init]; + if (self) { + _level = BTLogLevelInfo; + } + return self; +} + +- (void)log:(NSString *)format, ... { + variadicLogLevel(BTLogLevelInfo, format) +} + +- (void)critical:(NSString *)format, ... { + variadicLogLevel(BTLogLevelCritical, format) +} + +- (void)error:(NSString *)format, ... { + variadicLogLevel(BTLogLevelError, format) +} + +- (void)warning:(NSString *)format, ... { + variadicLogLevel(BTLogLevelWarning, format) +} + +- (void)info:(NSString *)format, ... { + variadicLogLevel(BTLogLevelInfo, format) +} + +- (void)debug:(NSString *)format, ... { + variadicLogLevel(BTLogLevelDebug, format) +} + +- (void)logLevel:(BTLogLevel)level format:(NSString *)format arguments:(va_list)arguments { + if (level <= self.level) { + NSString *message = [[NSString alloc] initWithFormat:format arguments:arguments]; + if (self.logBlock) { + self.logBlock(level, message); + } else { + NSString *levelString = [[self class] levelString:level]; + NSLog(@"[BraintreeSDK] %@ %@", [levelString uppercaseString], message); + } + } +} + ++ (NSString *)levelString:(BTLogLevel)level { + switch (level) { + case BTLogLevelCritical: + return @"Critical"; + case BTLogLevelError: + return @"Error"; + case BTLogLevelWarning: + return @"Warning"; + case BTLogLevelInfo: + return @"Info"; + case BTLogLevelDebug: + return @"Debug"; + default: + return nil; + } +} + +@end diff --git a/Pods/Braintree/Braintree/API/Utility/BTLogger_Internal.h b/Pods/Braintree/Braintree/API/Utility/BTLogger_Internal.h new file mode 100644 index 0000000..0ba8d92 --- /dev/null +++ b/Pods/Braintree/Braintree/API/Utility/BTLogger_Internal.h @@ -0,0 +1,17 @@ +#import + +#import "BTLogger.h" + +@interface BTLogger () + +- (void)log:(NSString *)format, ...; +- (void)critical:(NSString *)format, ...; +- (void)error:(NSString *)format, ...; +- (void)warning:(NSString *)format, ...; +- (void)info:(NSString *)format, ...; +- (void)debug:(NSString *)format, ...; + +/// Custom block for handling log messages +@property (nonatomic, copy) void (^logBlock)(BTLogLevel level, NSString *message); + +@end diff --git a/Pods/Braintree/Braintree/Braintree.h b/Pods/Braintree/Braintree/Braintree.h new file mode 100644 index 0000000..b807d90 --- /dev/null +++ b/Pods/Braintree/Braintree/Braintree.h @@ -0,0 +1,202 @@ +#import +#import + +#import +#import +#import +#import + +#import +#import +#import + +@class Braintree; +@class PKPayment; + +NS_ASSUME_NONNULL_BEGIN + +typedef void (^BraintreeCompletionBlock)(Braintree *__nullable braintree, NSError *__nullable error); + +/// The `Braintree` class is the front door to the Braintree SDK for iOS. It contains +/// everything you need to easily start accepting payments in your mobile app. +/// +/// You can use Drop-In (our own provided UI components), or Custom (your own UI with a +/// Braintree backend). +/// +/// With Drop-In, you can rely us to provide a fast, easy-to-use UI, which your users will +/// interact with in order to provide payment details. +/// +/// With Custom, you have control of your UI, but errors will be handled on the +/// server-side via multiple server-side calls to Braintree. Like Drop-In, the end result is +/// a nonce, which you may transmit to your servers. +/// +/// Regardless of how you integrate, the result, from the programmer's perspective, is a `BTPaymentMethod` +/// that has a `nonce` property. Send this nonce to your server to perform a variety of payment +/// operations, such as creating a sale. +/// +/// For advanced integrations, you can use BTClient, BTPaymentButton, BTDropInViewController, etc. directly. +@interface Braintree : NSObject + +/// Returns an instance of `Braintree`, the public interface of Braintree-iOS. +/// +/// @param clientToken value that is generated on your server using a Braintree server-side +/// client library that contains all necessary configuration to setup the client SDKs. It also +/// authenticates the application to communicate directly to Braintree. +/// +/// @see BTClient+Offline.h for offline client tokens that make it easy to test out the SDK without a +/// server-side integration. +/// +/// @note You should generate a new client token before each checkout to ensure it has not expired. +/// +/// @return An instance of the Braintree Library to perform payment operations. ++ (nullable Braintree *)braintreeWithClientToken:(NSString *)clientToken; + +#pragma mark UI + +/// Creates and returns a payment flow for accepting credit card, PayPal and Venmo based payments. +/// +/// Present this view controller in your app to prompt your user for payment info, and you will +/// receive a payment method nonce. +/// +/// @param delegate Delegate that is notified of success with a payment method containing a payment method nonce or an error. +/// +/// @return A Drop-In view controller to be presented in your app's payment flow. +- (BTDropInViewController *)dropInViewControllerWithDelegate:(id)delegate; + +/// Creates and returns a payment button for accepting PayPal and Venmo based payments. +/// +/// Payment method creation may take place via app switch or via a UI flow in a view controller. +/// +/// If available, this button will initiate One Touch Payments for PayPal or Venmo. +/// To enable One Touch, you should use setReturnURLSchemes: and handleOpenURL:sourceApplication: (see below). +/// +/// @note The payment button touch handlers may initiate view controllers and/or app switching. For fine-grained control, you may use BTPaymentProvider directly. +/// +/// @param delegate a delegate that receives lifecycle updates about the payment method authorization +/// +/// @return A button you can add to your checkout flow. +- (BTPaymentButton *)paymentButtonWithDelegate:(id)delegate; + +/// Creates and returns a payment button for accepting PayPal and/or Venmo based payments. +/// +/// This method has identical behavior to paymentButtonWithDelegate: but allows you to specify the +/// payment provider types and their display order. +/// +/// @param delegate a delegate that receives lifecycle updates about the payment method authorization +/// @param types payment method types to enable from BTPaymentProviderType. If nil, the button may expose any available payment authorization types. +/// +/// @return A button you can add to your checkout flow. +- (BTPaymentButton *)paymentButtonWithDelegate:(id)delegate paymentProviderTypes:(nullable NSOrderedSet *)types; + + +#pragma mark Custom + +/// Creates and returns a payment method nonce for the given credit card details. +/// +/// @note The credit card details provided are neither validated nor added to the Vault until you +/// perform a server-side operation with the nonce, such as `Transaction.create`, is performed. +/// +/// @see BTClientCardRequest +/// +/// @param cardDetails a tokenization request object containing the raw card details +/// @param completionBlock Completion block that is called exactly once asynchronously, providing either a nonce upon success or an error upon failure. +- (void)tokenizeCard:(BTClientCardTokenizationRequest *)cardDetails + completion:(void (^)(NSString * __nullable nonce, NSError * __nullable error))completionBlock; + +/// Creates and returns a payment method nonce for the given Apple Pay payment details +/// +/// @note You should use this method if you have implemented Apple Pay directly with PassKit (PKPaymentRequest, +/// PKPaymentAuthorizationViewController, etc.). Alternatively, you can use paymentProviderWithDelegate:. +/// +/// @param applePayPayment a PKPayment you receive from a PKPaymentAuthorizationViewControllerDelegate +/// @param completionBlock Completion block that is called exactly once asynchronously, providing either a nonce upon success or an error upon failure. +- (void)tokenizeApplePayPayment:(PKPayment *)applePayPayment + completion:(void (^)(NSString * __nullable nonce, NSError * __nullable error))completionBlock; + +/// Initializes a provider that can initiate various payment method creation flows. +/// +/// You should send `createPaymentMethod:` to the returned BTPaymentProvider after some user interaction takes place (for example, when the user taps your "Pay with PayPal" button.) +/// +/// In order to receive delegate methods, the caller is responsible for retaining this Braintree +/// instance or the returned BTPaymentProvider object! +/// +/// Payment method authorization may take place via app switch or via a UI flow in a view controller. +/// +/// If available, this method may initiate One Touch Payments for PayPal or Venmo. +/// To enable One Touch, you should use setReturnURLSchemes: and handleOpenURL:sourceApplication: (see below). +/// +/// @note If you do not wish to implement your own UI, see also dropInViewControllerWithDelegate: and paymentButtonWithDelegate:paymentProviderTypes:. +/// +/// @note The payment button touch handlers may initiate view controllers and/or app switching. For fine-grained control, you may use BTPaymentProvider directly. +/// +/// @see BTDropInViewController +/// @see BTPaymentButton +/// @param delegate a delegate that receives lifecycle updates about the payment method authorization +- (BTPaymentProvider *)paymentProviderWithDelegate:(id)delegate; + +#pragma mark - One Touch Payments + +/// The custom URL scheme that the authenticating app should use to return users to your app via `openURL:` (app switch). +/// +/// When `nil` or when invalid, One Touch app switch will be disabled +/// +/// @note This must match the entry in your app's Info.plist, and must be prefixed +/// with your Bundle ID, e.g. com.yourcompany.Your-App.payment ++ (void)setReturnURLScheme:(NSString *)scheme; + +/// Handle app switch URL requests for the Braintree SDK +/// +/// @param url The URL received by the application delegate `openURL` method +/// @param sourceApplication The source application received by the application delegate `openURL` method +/// +/// @return Whether Braintree was able to handle the URL and source application ++ (BOOL)handleOpenURL:(NSURL *)url sourceApplication:(nullable NSString *)sourceApplication; + + +#pragma mark Advanced Integrations + +/// A pre-configured BTClient based on your client token. +/// +/// You can use this client to initialize various SDK objects, such as BTDropInViewController, BTPaymentButton, BTPaymentProvider, etc. +@property (nonatomic, readonly) BTClient *client; + + +#pragma mark - Library Metadata + +/// Returns the current library version. +/// +/// @return A string representation of this library's current semver.org version (if integrating with CocoaPods). ++ (NSString *)libraryVersion; + +@end + +@interface Braintree (Deprecated) + +/// Creates and returns a nonce for the given credit card details. +/// +/// This signature has been deprecated in favor of the more flexible `tokenizeCard:completion:`. +/// +/// @note The credit card details provided are not validated until a +/// Braintree operation, such as `Transaction.Create` is performed on +/// your server. +/// +/// @param cardNumber Card number to tokenize +/// @param expirationMonth Card's expiration month +/// @param expirationYear Card's expiration year +/// @param completionBlock Completion block that is called exactly once asynchronously, providing either a nonce upon success or an error upon failure. +- (void)tokenizeCardWithNumber:(NSString *)cardNumber + expirationMonth:(NSString *)expirationMonth + expirationYear:(NSString *)expirationYear + completion:(void (^)(NSString * __nullable nonce, NSError * __nullable error))completionBlock DEPRECATED_MSG_ATTRIBUTE("Please use -[Braintree tokenizeCardWithComponents:completion:]"); + + +/// Creates and returns a PayPal button that can be added to the UI. When tapped, this button will initiate the PayPal authorization flow. +/// +/// @param delegate Delegate that is notified of completion, receiving either a payment method with a nonce (upon user agreement and success) or an error (upon failure). +/// +/// @return A PayPal button to be added as a subview in your UI. +- (nullable BTPayPalButton *)payPalButtonWithDelegate:(id)delegate DEPRECATED_MSG_ATTRIBUTE("Please use -[Braintree paymentButtonWithDelegate:]"); + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/Braintree/Braintree/Braintree.m b/Pods/Braintree/Braintree/Braintree.m new file mode 100644 index 0000000..c93b7f3 --- /dev/null +++ b/Pods/Braintree/Braintree/Braintree.m @@ -0,0 +1,203 @@ +#import "Braintree_Internal.h" + +#import "BTClient.h" +#import "BTClient+BTPayPal.h" +#import "BTClient_Internal.h" +#import "BTLogger_Internal.h" + +#import "BTPayPalButton.h" +#import "BTPaymentProvider.h" + +#import "BTDropInViewController.h" + +#import "BTAppSwitch.h" + +@interface Braintree () +@property (nonatomic, strong) BTClient *client; + +@property (nonatomic, strong) NSMutableSet *retainedPaymentProviders; +@end + +@implementation Braintree + ++ (Braintree *)braintreeWithClientToken:(NSString *)clientToken { + return [[self alloc] initWithClientToken:clientToken]; +} + ++ (void)setupWithClientToken:(NSString *)clientToken + completion:(BraintreeCompletionBlock)completionBlock { + + [BTClient setupWithClientToken:clientToken + completion:^(BTClient *client, NSError *error) + { + Braintree *braintree = [[self alloc] initWithClient:client]; + completionBlock(braintree, error); + }]; +} + +- (id)init { + self = [super init]; + if (self) { + self.retainedPaymentProviders = [NSMutableSet set]; + } + return self; +} + +- (instancetype)initWithClientToken:(NSString *)clientToken { + return [self initWithClient:[[BTClient alloc] initWithClientToken:clientToken]]; +} + +- (instancetype)initWithClient:(BTClient *)client { + self = [self init]; + if (self) { + self.client = client; + [self.client postAnalyticsEvent:@"sdk.ios.braintree.init"]; + } + return self; +} + +#pragma mark UI + +- (BTDropInViewController *)dropInViewControllerWithDelegate:(id)delegate { + [self.client postAnalyticsEvent:@"custom.ios.dropin.init" + success:nil + failure:nil]; + + BTDropInViewController *dropInViewController = [[BTDropInViewController alloc] initWithClient:self.client]; + + dropInViewController.delegate = delegate; + [dropInViewController fetchPaymentMethods]; + return dropInViewController; +} + + +- (BTPaymentButton *)paymentButtonWithDelegate:(id)delegate { + return [self paymentButtonWithDelegate:delegate paymentProviderTypes:nil]; +} + +- (BTPaymentButton *)paymentButtonWithDelegate:(id)delegate paymentProviderTypes:(NSOrderedSet *)types { + BTPaymentButton *button = [[BTPaymentButton alloc] initWithPaymentProviderTypes:types]; + button.client = self.client; + button.delegate = delegate; + return button; +} + +#pragma mark Custom + +- (void)tokenizeCard:(BTClientCardTokenizationRequest *)tokenizationRequest + completion:(void (^)(NSString *, NSError *))completionBlock { + [self.client postAnalyticsEvent:@"custom.ios.tokenize.call" + success:nil + failure:nil]; + + BTClientCardRequest *cardRequest = [[BTClientCardRequest alloc] initWithTokenizationRequest:tokenizationRequest]; + + [self.client saveCardWithRequest:cardRequest + success:^(BTCardPaymentMethod *card) { + if (completionBlock) { + completionBlock(card.nonce, nil); + } + } + failure:^(NSError *error) { + if (completionBlock) { + completionBlock(nil, error); + } + }]; + return; +} + +- (void)tokenizeCardWithNumber:(NSString *)cardNumber + expirationMonth:(NSString *)expirationMonth + expirationYear:(NSString *)expirationYear + completion:(void (^)(NSString *nonce, NSError *error))completionBlock { + BTClientCardRequest *request = [[BTClientCardRequest alloc] init]; + request.number = cardNumber; + request.expirationMonth = expirationMonth; + request.expirationYear = expirationYear; + + [self tokenizeCard:request + completion:completionBlock]; +} + +#if BT_ENABLE_APPLE_PAY +- (void)tokenizeApplePayPayment:(PKPayment *)payment + completion:(void (^)(NSString *, NSError *))completionBlock { + [self.client postAnalyticsEvent:@"custom.ios.tokenize.apple-pay"]; + + [self.client saveApplePayPayment:payment + success:^(BTApplePayPaymentMethod *applePayPaymentMethod) { + if (completionBlock) { + completionBlock(applePayPaymentMethod.nonce, nil); + } + } + failure:^(NSError *error) { + if (completionBlock) { + completionBlock(nil, error); + } + }]; +} +#else +- (void)tokenizeApplePayPayment:(__unused id)payment + completion:(__unused void (^)(NSString *, NSError *))completionBlock { + NSString *message = @"Apple Pay is not compiled into this integration of Braintree. Please ensure that BT_ENABLE_APPLE_PAY=1 in your framework and app targets."; + [[BTLogger sharedLogger] warning:message]; +#if DEBUG + @throw [NSException exceptionWithName:NSInternalInconsistencyException + reason:message + userInfo:nil]; +#endif +} +#endif + +- (BTPaymentProvider *)paymentProviderWithDelegate:(id)delegate { + BTPaymentProvider *paymentProvider = [[BTPaymentProvider alloc] initWithClient:self.client]; + paymentProvider.delegate = delegate; + + [self.retainedPaymentProviders addObject:paymentProvider]; + + return paymentProvider; +} + +#pragma mark Deprecated + +- (BTPayPalButton *)payPalButtonWithDelegate:(id)delegate { + [self.client postAnalyticsEvent:@"custom.ios.paypal.init" + success:nil + failure:nil]; + + if (!self.client.btPayPal_isPayPalEnabled){ + return nil; + } + + BTPayPalButton *button = [self payPalButton]; + button.client = self.client; + button.delegate = delegate; + + return button; +} + +- (BTPayPalButton *)payPalButton { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + _payPalButton = _payPalButton ?: [[BTPayPalButton alloc] init]; +#pragma clang diagnostic pop + return _payPalButton; +} + +#pragma mark Library + ++ (NSString *)libraryVersion { + return [BTClient libraryVersion]; +} + +#pragma mark App Switching + ++ (void)setReturnURLScheme:(NSString *)scheme { + [BTAppSwitch sharedInstance].returnURLScheme = scheme; +} + ++ (BOOL)handleOpenURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication { + return [[BTAppSwitch sharedInstance] handleReturnURL:url sourceApplication:sourceApplication]; +} + +@end diff --git a/Pods/Braintree/Braintree/Braintree_Internal.h b/Pods/Braintree/Braintree/Braintree_Internal.h new file mode 100644 index 0000000..075edef --- /dev/null +++ b/Pods/Braintree/Braintree/Braintree_Internal.h @@ -0,0 +1,26 @@ +#import "Braintree.h" +#import "BTPayPalButton.h" + +/// Private header +@interface Braintree () + +// For increasing testability +@property (nonatomic, strong) BTPayPalButton *payPalButton; + +/// Begins the setup of Braintree-iOS. Once setup is complete, the supplied completionBlock +/// will be called with either an instance of Braintree or an error. +/// +/// *Not used at this time.* Use +braintreeWithClientToken: instead. +/// +/// @param clientToken value that is generated on your server using a Braintree server-side +/// client library that authenticates this application to communicate directly to Braintree. +/// +/// @see BTClient+Offline.h for offline client tokens that make it easy to test out the SDK without a +/// server-side integration. This is for testing only; production always requires a +/// server-side integration. +/// +/// @note You should generate a new client token before each checkout to ensure it has not expired. ++ (void)setupWithClientToken:(NSString *)clientToken + completion:(BraintreeCompletionBlock)completionBlock; + +@end diff --git a/Pods/Braintree/Braintree/Coinbase/@Public/BTCoinbase.h b/Pods/Braintree/Braintree/Coinbase/@Public/BTCoinbase.h new file mode 100644 index 0000000..002c833 --- /dev/null +++ b/Pods/Braintree/Braintree/Coinbase/@Public/BTCoinbase.h @@ -0,0 +1,46 @@ +#import + +#import "BTAppSwitching.h" +#import "BTAppSwitchErrors.h" + +/// Manages the communication with the Coinbase app or browser for authorization +/// +/// This is a beta integration option. For details, see https://www.braintreepayments.com/features/coinbase +/// +/// @see BTAppSwitching +@interface BTCoinbase : NSObject + +@property (nonatomic, assign) BOOL storeInVault; + +/// Dynamically disable Coinbase support on the client-side, +/// e.g. for certain customers, geographies, devices, etc. +/// +/// Example: +/// `[BTCoinbase sharedCoinbase].disabled = [CoinbaseOAuth isAppOAuthAuthenticationAvailable] ? NO : YES;` +@property (nonatomic, assign) BOOL disabled; + +/// +/// Returns `YES` if the Coinbase iOS app is installed on the device. +/// +/// @note This flag does not consider cases where `BTCoinbase` has been +/// disabled, or the gateway configuration has not enabled Coinbase as a +/// payment option, or when `returnURLScheme` is invalid. To check for those +/// conditions, use `providerAppSwitchAvailableForClient:`. +/// +/// @see `providerAppSwitchAvailableForClient:` +@property (nonatomic, assign, readonly) BOOL isProviderAppInstalled; + ++ (instancetype)sharedCoinbase; + +/// Checks whether the Coinbase app is installed (and accepting app switch authorization) +/// and Braintree is configured for Coinbase app switch. This requires a returnURLScheme +/// to be set and for Coinbase to be enabled in your Braintree Control Panel. +/// +/// @param client A BTClient +/// +/// @return YES if the Coinbase native app is available for app switch. +/// +/// @see `+[Braintree setReturnURLScheme:]` +- (BOOL)providerAppSwitchAvailableForClient:(BTClient *)client; + +@end diff --git a/Pods/Braintree/Braintree/Coinbase/@Public/Braintree-Coinbase.h b/Pods/Braintree/Braintree/Coinbase/@Public/Braintree-Coinbase.h new file mode 100644 index 0000000..30359ac --- /dev/null +++ b/Pods/Braintree/Braintree/Coinbase/@Public/Braintree-Coinbase.h @@ -0,0 +1,3 @@ +// All-in-one import for Braintree Coinbase + +#import "BTCoinbase.h" diff --git a/Pods/Braintree/Braintree/Coinbase/BTCoinbase.m b/Pods/Braintree/Braintree/Coinbase/BTCoinbase.m new file mode 100644 index 0000000..4dcefe7 --- /dev/null +++ b/Pods/Braintree/Braintree/Coinbase/BTCoinbase.m @@ -0,0 +1,215 @@ +#import "BTAppSwitch.h" +#import "BTCoinbase.h" +#import "BTClient_Internal.h" +#import "BTAppSwitchErrors.h" +#import "BTCoinbaseOAuth.h" + +@interface BTCoinbase () +@property (nonatomic, strong) BTClient *client; +@property (nonatomic, assign) BTCoinbaseOAuthAuthenticationMechanism authenticationMechanism; +@end + +@implementation BTCoinbase + +@synthesize returnURLScheme = _returnURLScheme; +@synthesize delegate = _delegate; + ++ (void)load { + if (self == [BTCoinbase class]) { + [[BTAppSwitch sharedInstance] addAppSwitching:[BTCoinbase sharedCoinbase] forApp:BTAppTypeCoinbase]; + } +} + ++ (instancetype)sharedCoinbase { + static BTCoinbase *coinbase; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + coinbase = [[self alloc] init]; + }); + return coinbase; +} + +- (BOOL)providerAppSwitchAvailableForClient:(BTClient *)client { + return self.returnURLScheme && [self appSwitchAvailableForClient:client] && [BTCoinbaseOAuth isAppOAuthAuthenticationAvailable]; +} + +- (BOOL)isProviderAppInstalled { + return [BTCoinbaseOAuth isAppOAuthAuthenticationAvailable]; +} + +#pragma mark Helpers + +- (NSURL *)redirectUri { + NSURLComponents *components = [[NSURLComponents alloc] init]; + components.scheme = [self returnURLScheme]; + components.path = @"/vzero/auth/coinbase/redirect"; + components.host = @"x-callback-url"; + return [components URL]; +} + + +#pragma mark BTAppSwitching + +- (BOOL)appSwitchAvailableForClient:(BTClient *)client { + return client.configuration.coinbaseEnabled == YES && self.disabled == NO; +} + +// In this context, "AppSwitch" includes both browser switch and provider app switch +- (BOOL)initiateAppSwitchWithClient:(BTClient *)client delegate:(id)delegate error:(NSError *__autoreleasing *)error { + self.client = client; + self.delegate = delegate; + + [self.client postAnalyticsEvent:@"ios.coinbase.initiate.started"]; + + if (!self.returnURLScheme) { + [self.client postAnalyticsEvent:@"ios.coinbase.initiate.invalid-return-url-scheme"]; + if (error != NULL) { + *error = [NSError errorWithDomain:BTAppSwitchErrorDomain code:BTAppSwitchErrorIntegrationReturnURLScheme + userInfo:@{NSLocalizedDescriptionKey: @"Coinbase is not available", + NSLocalizedFailureReasonErrorKey: @"Invalid return URL scheme", + NSLocalizedRecoverySuggestionErrorKey: @"Add scheme to Info.plist and use +[Braintree setReturnURLScheme:]"}]; + } + return NO; + } + + if (![self appSwitchAvailableForClient:client]) { + [self.client postAnalyticsEvent:@"ios.coinbase.initiate.unavailable"]; + if (error != NULL) { + *error = [NSError errorWithDomain:BTAppSwitchErrorDomain code:BTAppSwitchErrorDisabled + userInfo:@{NSLocalizedDescriptionKey: @"Coinbase is not available", + NSLocalizedFailureReasonErrorKey: @"Configuration does not enable Coinbase", + NSLocalizedRecoverySuggestionErrorKey: @"Enable Coinbase in your Braintree Control Panel"}]; + } + return NO; + } + + self.authenticationMechanism = [BTCoinbaseOAuth startOAuthAuthenticationWithClientId:client.configuration.coinbaseClientId + scope:client.configuration.coinbaseScope + redirectUri:[self.redirectUri absoluteString] + meta:(client.configuration.coinbaseMerchantAccount ? @{ @"authorizations_merchant_account": client.configuration.coinbaseMerchantAccount } : nil)]; + + switch (self.authenticationMechanism) { + case BTCoinbaseOAuthMechanismNone: + [self.client postAnalyticsEvent:@"ios.coinbase.initiate.failed"]; + if (error != NULL) { + *error = [NSError errorWithDomain:BTAppSwitchErrorDomain code:BTAppSwitchErrorFailed + userInfo:@{NSLocalizedDescriptionKey: @"Coinbase is not available", + NSLocalizedFailureReasonErrorKey: @"Unable to perform app switch"}]; + } + break; + case BTCoinbaseOAuthMechanismApp: + [self.client postAnalyticsEvent:@"ios.coinbase.appswitch.started"]; + break; + case BTCoinbaseOAuthMechanismBrowser: + [self.client postAnalyticsEvent:@"ios.coinbase.webswitch.started"]; + break; + } + + return self.authenticationMechanism != BTCoinbaseOAuthMechanismNone; +} + +- (BOOL)canHandleReturnURL:(NSURL *)url sourceApplication:(__unused NSString *)sourceApplication { + NSURL *redirectURL = self.redirectUri; + BOOL schemeMatches = [[url.scheme lowercaseString] isEqualToString:[redirectURL.scheme lowercaseString]]; + BOOL hostMatches = [url.host isEqualToString:redirectURL.host]; + BOOL pathMatches = [url.path isEqualToString:redirectURL.path]; + return schemeMatches && hostMatches && pathMatches; +} + +- (void)handleReturnURL:(NSURL *)url { + if (![self canHandleReturnURL:url sourceApplication:nil]) { + return; + } + + [BTCoinbaseOAuth finishOAuthAuthenticationForUrl:url + clientId:self.client.configuration.coinbaseClientId + clientSecret:nil + completion:^(id response, NSError *error) + { + BTCoinbaseOAuthAuthenticationMechanism mechanism = self.authenticationMechanism; + if (error) { + if ([error.domain isEqualToString:BTCoinbaseErrorDomain] && error.code == BTCoinbaseOAuthError && [error.userInfo[BTCoinbaseOAuthErrorUserInfoKey] isEqual:@"access_denied"]) { + switch(mechanism) { + case BTCoinbaseOAuthMechanismApp: [self.client postAnalyticsEvent:@"ios.coinbase.appswitch.denied"]; break; + case BTCoinbaseOAuthMechanismBrowser: [self.client postAnalyticsEvent:@"ios.coinbase.webswitch.denied"]; break; + case BTCoinbaseOAuthMechanismNone: [self.client postAnalyticsEvent:@"ios.coinbase.unknown.denied"]; break; + } + [self informDelegateDidCancel]; + } else { + switch(mechanism) { + case BTCoinbaseOAuthMechanismApp: [self.client postAnalyticsEvent:@"ios.coinbase.appswitch.failed"]; break; + case BTCoinbaseOAuthMechanismBrowser: [self.client postAnalyticsEvent:@"ios.coinbase.webswitch.failed"]; break; + case BTCoinbaseOAuthMechanismNone: [self.client postAnalyticsEvent:@"ios.coinbase.unknown.failed"]; break; + } + [self informDelegateDidFailWithError:error]; + } + } else { + switch(mechanism) { + case BTCoinbaseOAuthMechanismApp: [self.client postAnalyticsEvent:@"ios.coinbase.appswitch.authorized"]; break; + case BTCoinbaseOAuthMechanismBrowser: [self.client postAnalyticsEvent:@"ios.coinbase.webswitch.authorized"]; break; + case BTCoinbaseOAuthMechanismNone: [self.client postAnalyticsEvent:@"ios.coinbase.unknown.authorized"]; break; + } + [self informDelegateWillCreatePaymentMethod]; + + NSMutableDictionary *mutableResponse = [response mutableCopy]; + mutableResponse[@"redirect_uri"] = [self.redirectUri absoluteString]; + response = mutableResponse; + [[self clientWithMetadataForAuthenticationMechanism:mechanism] saveCoinbaseAccount:response + storeInVault:self.storeInVault + success:^(BTCoinbasePaymentMethod *coinbasePaymentMethod) { + [self.client postAnalyticsEvent:@"ios.coinbase.tokenize.succeeded"]; + [self informDelegateDidCreatePaymentMethod:coinbasePaymentMethod]; + } failure:^(NSError *error) { + [self.client postAnalyticsEvent:@"ios.coinbase.tokenize.failed"]; + [self informDelegateDidFailWithError:error]; + }]; + } + }]; +} + + +#pragma mark Delegate Informers + +- (void)informDelegateWillCreatePaymentMethod { + if ([self.delegate respondsToSelector:@selector(appSwitcherWillCreatePaymentMethod:)]) { + [self.delegate appSwitcherWillCreatePaymentMethod:self]; + } +} + +- (void)informDelegateDidFailWithError:(NSError *)error { + if ([self.delegate respondsToSelector:@selector(appSwitcher:didFailWithError:)]) { + [self.delegate appSwitcher:self didFailWithError:error]; + } +} + +- (void)informDelegateDidCancel { + if ([self.delegate respondsToSelector:@selector(appSwitcherDidCancel:)]) { + [self.delegate appSwitcherDidCancel:self]; + } +} + +- (void)informDelegateDidCreatePaymentMethod:(BTCoinbasePaymentMethod *)paymentMethod { + if ([self.delegate respondsToSelector:@selector(appSwitcher:didCreatePaymentMethod:)]) { + [self.delegate appSwitcher:self didCreatePaymentMethod:paymentMethod]; + } +} + +#pragma mark Helpers + +- (BTClient *)clientWithMetadataForAuthenticationMechanism:(BTCoinbaseOAuthAuthenticationMechanism)authenticationMechanism { + return [self.client copyWithMetadata:^(BTClientMutableMetadata *metadata) { + switch (authenticationMechanism) { + case BTCoinbaseOAuthMechanismApp: + metadata.source = BTClientMetadataSourceCoinbaseApp; + break; + case BTCoinbaseOAuthMechanismBrowser: + metadata.source = BTClientMetadataSourceCoinbaseBrowser; + break; + default: + metadata.source = BTClientMetadataSourceUnknown; + break; + } + }]; +} + +@end diff --git a/Pods/Braintree/Braintree/Coinbase/Vendor/BTCoinbaseDefines.h b/Pods/Braintree/Braintree/Coinbase/Vendor/BTCoinbaseDefines.h new file mode 100644 index 0000000..81561c3 --- /dev/null +++ b/Pods/Braintree/Braintree/Coinbase/Vendor/BTCoinbaseDefines.h @@ -0,0 +1,23 @@ +// +// BTCoinbaseDefines.h +// +// Vendored from the official Coinbase iOS SDK version 3.0: +// https://github.com/coinbase/coinbase-ios-sdk +// + +#import + +/// If the API request is successful, `response` will be either a NSDictionary or NSArray, and `error` will be nil. +/// Otherwise, `error` will be non-nil. +typedef void (^BTCoinbaseCompletionBlock)(id response, NSError *error); + +/// NSError domain for Coinbase errors. +extern NSString *const BTCoinbaseErrorDomain; + +/// NSError codes for Coinbase errors. +typedef NS_ENUM(NSInteger, BTCoinbaseErrorCode) { + BTCoinbaseOAuthError, + BTCoinbaseServerErrorUnknown, + BTCoinbaseServerErrorWithMessage +}; + diff --git a/Pods/Braintree/Braintree/Coinbase/Vendor/BTCoinbaseDefines.m b/Pods/Braintree/Braintree/Coinbase/Vendor/BTCoinbaseDefines.m new file mode 100644 index 0000000..8e1dd85 --- /dev/null +++ b/Pods/Braintree/Braintree/Coinbase/Vendor/BTCoinbaseDefines.m @@ -0,0 +1,11 @@ +// +// BTCoinbaseDefines.m +// +// Vendored from the official Coinbase iOS SDK version 3.0: +// https://github.com/coinbase/coinbase-ios-sdk +// + +#import "BTCoinbaseDefines.h" + +NSString *const BTCoinbaseErrorDomain = @"CoinbaseErrorDomain"; + diff --git a/Pods/Braintree/Braintree/Coinbase/Vendor/BTCoinbaseOAuth.h b/Pods/Braintree/Braintree/Coinbase/Vendor/BTCoinbaseOAuth.h new file mode 100644 index 0000000..3afeb30 --- /dev/null +++ b/Pods/Braintree/Braintree/Coinbase/Vendor/BTCoinbaseOAuth.h @@ -0,0 +1,83 @@ +// +// BTCoinbaseOAuth.h +// +// Vendored from the official Coinbase iOS SDK version 3.0: +// https://github.com/coinbase/coinbase-ios-sdk +// + +#import +#import "BTCoinbaseDefines.h" + +/// Indicates where user authentication takes place +typedef NS_ENUM(NSInteger, BTCoinbaseOAuthAuthenticationMechanism){ + /// Neither app switch nor authentication occured + BTCoinbaseOAuthMechanismNone = NO, + /// The user authenticated with Coinbase in Mobile Safari + BTCoinbaseOAuthMechanismBrowser, + /// The user authenticated with Coinbase in the Coinbase app + BTCoinbaseOAuthMechanismApp, +}; + +/// The key in an NSError userInfo dictionary where the coinbase specific error code is returned. +/// +/// For example, when the return URL contains error=acccess_denied, the error you receive in +/// finishOAuthAuthenticationForUrl:clientId:clientSecret:completion: will contain @"access_denied" +/// in the userInfo dictionary. +extern NSString *const BTCoinbaseOAuthErrorUserInfoKey; + +/// `CoinbaseOAuth` contains methods to authenticate users through OAuth2. After obtaining an +/// access token using this class, you can call Coinbase API methods +/// using `[Coinbase coinbaseWithOAuthAccessToken:]`. +@interface BTCoinbaseOAuth : NSObject + +/// Test if the Coinbase app is installed and if the OAuth authentication process will use the Coinbase +/// app to offer an easier authentication process. Can be used to make the Coinbase OAuth sign in action +/// more prominent if the app is installed (thus indicating the user has an interest in Coinbase). +/// +/// @returns True if the app switch was successful ++ (BOOL)isAppOAuthAuthenticationAvailable; + +/// Start the OAuth authentication process. This will open a different application to complete the +/// authentication flow. +/// +/// @return the mechanism of authentication. Example: CoinbaseOAuthMechanismApp ++ (BTCoinbaseOAuthAuthenticationMechanism)startOAuthAuthenticationWithClientId:(NSString *)clientId + scope:(NSString *)scope + redirectUri:(NSString *)redirectUri + meta:(NSDictionary *)meta; + +/// Finish the OAuth authentication process. This should be called when your application is opened +/// for a Coinbase OAuth URI. +/// +/// If you pass your client secret to `clientSecret`, the OAuth access grant will be exchanged for tokens +/// on the device and returned to your in the `success` callback. If you pass nil to `clientSecret`, the +/// OAuth authorization code will be returned to your `success` callback, so you can send it to your server and +/// exchange it for tokens there. If your application has a server side component, the second approach is recommended, +/// as it prevents disclosure of the client secret to the client side. ++ (void)finishOAuthAuthenticationForUrl:(NSURL *)url + clientId:(NSString *)clientId + clientSecret:(NSString *)clientSecret + completion:(BTCoinbaseCompletionBlock)completion; + +/// Get new tokens using a refresh token. ++ (void)getOAuthTokensForRefreshToken:(NSString *)refreshToken + clientId:(NSString *)clientId + clientSecret:(NSString *)clientSecret + completion:(BTCoinbaseCompletionBlock)completion; + +/// Get new tokens using an authorization code. ++ (void)getOAuthTokensForCode:(NSString *)code + redirectUri:(NSString *)redirectUri + clientId:(NSString *)clientId + clientSecret:(NSString *)clientSecret + completion:(BTCoinbaseCompletionBlock)completion; + +/// Make a request to a Coinbase OAuth API. ++ (void)doOAuthPostToPath:(NSString *)path + withParams:(NSDictionary *)params + completion:(BTCoinbaseCompletionBlock)completion; + +/// Set the base URL that will be used when making API requests. Defaults to "https://api.coinbase.com/" ++ (void)setBaseURL:(NSURL *)URL; + +@end diff --git a/Pods/Braintree/Braintree/Coinbase/Vendor/BTCoinbaseOAuth.m b/Pods/Braintree/Braintree/Coinbase/Vendor/BTCoinbaseOAuth.m new file mode 100644 index 0000000..c3391b5 --- /dev/null +++ b/Pods/Braintree/Braintree/Coinbase/Vendor/BTCoinbaseOAuth.m @@ -0,0 +1,202 @@ +// +// BTCoinbaseOAuth.m +// Pods +// +// Created by Isaac Waller on 10/28/14. +// +// +// Vendored from the official Coinbase iOS SDK version 3.0: +// https://github.com/coinbase/coinbase-ios-sdk +// + +#import "BTCoinbaseOAuth.h" + +NSString *const BTCoinbaseOAuthErrorUserInfoKey = @"CoinbaseOAuthError"; + +@implementation BTCoinbaseOAuth + +static NSURL * __strong baseURL; + ++ (BOOL)isAppOAuthAuthenticationAvailable { + return [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"com.coinbase.oauth-authorize://authorize"]]; +} + ++ (BTCoinbaseOAuthAuthenticationMechanism)startOAuthAuthenticationWithClientId:(NSString *)clientId + scope:(NSString *)scope + redirectUri:(NSString *)redirectUri + meta:(NSDictionary *)meta { + NSString *path = [NSString stringWithFormat: @"/oauth/authorize?response_type=code&client_id=%@", clientId]; + if (scope) { + path = [path stringByAppendingFormat:@"&scope=%@", [self URLEncodedStringFromString:scope]]; + } + if (redirectUri) { + path = [path stringByAppendingFormat:@"&redirect_uri=%@", [self URLEncodedStringFromString:redirectUri]]; + } + if (meta) { + for (NSString *key in meta) { + path = [path stringByAppendingFormat:@"&meta[%@]=%@", [self URLEncodedStringFromString:key], [self URLEncodedStringFromString:meta[key]]]; + } + } + + BTCoinbaseOAuthAuthenticationMechanism mechanism = BTCoinbaseOAuthMechanismNone; + NSURL *coinbaseAppUrl = [NSURL URLWithString:[NSString stringWithFormat:@"com.coinbase.oauth-authorize:%@", path]]; + BOOL appSwitchSuccessful = NO; + if ([[UIApplication sharedApplication] canOpenURL:coinbaseAppUrl] && baseURL == nil) { + appSwitchSuccessful = [[UIApplication sharedApplication] openURL:coinbaseAppUrl]; + if (appSwitchSuccessful) { + mechanism = BTCoinbaseOAuthMechanismApp; + } + } + + if (!appSwitchSuccessful) { + NSURL *base = [NSURL URLWithString:path relativeToURL:(baseURL == nil ? [NSURL URLWithString:@"https://www.coinbase.com/"] : baseURL)]; + NSURL *webUrl = [[NSURL URLWithString:path relativeToURL:base] absoluteURL]; + BOOL browserSwitchSuccessful = [[UIApplication sharedApplication] openURL:webUrl]; + if (browserSwitchSuccessful) { + mechanism = BTCoinbaseOAuthMechanismBrowser; + } + } + + return mechanism; +} + ++ (void)finishOAuthAuthenticationForUrl:(NSURL *)url + clientId:(NSString *)clientId + clientSecret:(NSString *)clientSecret + completion:(BTCoinbaseCompletionBlock)completion { + // Parse params from URL's query string + NSMutableDictionary *params = [NSMutableDictionary dictionary]; + for (NSString *param in [url.query componentsSeparatedByString:@"&"]) { + NSArray *elts = [param componentsSeparatedByString:@"="]; + NSString *key = [elts objectAtIndex:0]; + NSString *value = [elts objectAtIndex:1]; + + params[key] = value; + } + + // Get code from URL and check for error. + NSString *code = params[@"code"]; + + if (params[@"error_description"] != nil) { + NSString *errorDescription = [[params[@"error_description"] stringByReplacingOccurrencesOfString:@"+" withString:@" "] + stringByRemovingPercentEncoding]; + NSDictionary *userInfo = @{ NSLocalizedDescriptionKey: errorDescription, BTCoinbaseOAuthErrorUserInfoKey: (params[@"error"] ?: [NSNull null]) }; + NSError *error = [NSError errorWithDomain:BTCoinbaseErrorDomain + code:BTCoinbaseOAuthError + userInfo:userInfo]; + completion(nil, error); + return; + } else if (!code) { + NSDictionary *userInfo = @{ NSLocalizedDescriptionKey: @"Malformed URL." }; + NSError *error = [NSError errorWithDomain:BTCoinbaseErrorDomain + code:BTCoinbaseOAuthError + userInfo:userInfo]; + completion(nil, error); + return; + } else if (!clientSecret) { + // Do not make token request on client side + completion(@{@"code": code}, nil); + return; + } + + // Make token request + // Obtain original redirect URI by removing 'code' parameter from URI + NSString *redirectUri = [[url absoluteString] stringByReplacingOccurrencesOfString:[url query] withString:@""]; + redirectUri = [redirectUri substringToIndex:redirectUri.length - 1]; // Strip off trailing '?' + [BTCoinbaseOAuth getOAuthTokensForCode:code + redirectUri:redirectUri + clientId:clientId + clientSecret:clientSecret + completion:completion]; + return; +} + ++ (void)getOAuthTokensForCode:(NSString *)code + redirectUri:(NSString *)redirectUri + clientId:(NSString *)clientId + clientSecret:(NSString *)clientSecret + completion:(BTCoinbaseCompletionBlock)completion { + NSDictionary *params = @{ @"grant_type": @"authorization_code", + @"code": code, + @"redirect_uri": redirectUri, + @"client_id": clientId, + @"client_secret": clientSecret }; + [BTCoinbaseOAuth doOAuthPostToPath:@"token" withParams:params completion:completion]; +} + ++ (void)getOAuthTokensForRefreshToken:(NSString *)refreshToken + clientId:(NSString *)clientId + clientSecret:(NSString *)clientSecret + completion:(BTCoinbaseCompletionBlock)completion { + NSDictionary *params = @{ @"grant_type": @"refresh_token", + @"refresh_token": refreshToken, + @"client_id": clientId, + @"client_secret": clientSecret }; + [BTCoinbaseOAuth doOAuthPostToPath:@"token" withParams:params completion:completion]; +} + ++ (void)doOAuthPostToPath:(NSString *)path + withParams:(NSDictionary *)params + completion:(BTCoinbaseCompletionBlock)completion { + + NSURL *base = [NSURL URLWithString:@"oauth/" relativeToURL:(baseURL == nil ? [NSURL URLWithString:@"https://www.coinbase.com/"] : baseURL)]; + NSURL *url = [[NSURL URLWithString:path relativeToURL:base] absoluteURL]; + NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; + NSURLSession *session = [NSURLSession sessionWithConfiguration:config]; + + // Create POST data (OAuth APIs only accept standard URL-format data, not JSON) + NSMutableArray *components = [NSMutableArray new]; + NSString *encodedKey, *encodedValue; + for (NSString *key in params) { + encodedKey = [BTCoinbaseOAuth URLEncodedStringFromString:key]; + encodedValue = [BTCoinbaseOAuth URLEncodedStringFromString:[params objectForKey:key]]; + [components addObject:[NSString stringWithFormat:@"%@=%@", encodedKey, encodedValue]]; + } + + NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url]; + request.HTTPMethod = @"POST"; + NSError *error = nil; + NSData *data = [[components componentsJoinedByString:@"&"] dataUsingEncoding:NSUTF8StringEncoding]; + if (error) { + completion(nil, error); + return; + } + NSURLSessionUploadTask *task; + task = [session uploadTaskWithRequest:request + fromData:data + completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { + if (!error) { + NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*)response; + NSDictionary *parsedBody = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error]; + if (!error) { + if ([parsedBody objectForKey:@"error"] || [httpResponse statusCode] > 300) { + NSDictionary *userInfo = @{ NSLocalizedDescriptionKey: [parsedBody objectForKey:@"error"] }; + error = [NSError errorWithDomain:BTCoinbaseErrorDomain + code:BTCoinbaseOAuthError + userInfo:userInfo]; + } else { + dispatch_async(dispatch_get_main_queue(), ^{ + completion(parsedBody, nil); + }); + return; + } + } + } + + dispatch_async(dispatch_get_main_queue(), ^{ + completion(nil, error); + }); + }]; + [task resume]; +} + ++ (NSString *)URLEncodedStringFromString:(NSString *)string +{ + return [string stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]; +} + ++ (void)setBaseURL:(NSURL *)URL { + baseURL = URL; +} + +@end diff --git a/Pods/Braintree/Braintree/Drop-In/BTDropInContentView.h b/Pods/Braintree/Braintree/Drop-In/BTDropInContentView.h new file mode 100644 index 0000000..6c685e5 --- /dev/null +++ b/Pods/Braintree/Braintree/Drop-In/BTDropInContentView.h @@ -0,0 +1,40 @@ +#import "BTUIThemedView.h" + +#import "Braintree-Payments-UI.h" +#import "Braintree-PayPal.h" + +#import "BTPaymentButton.h" + +typedef NS_ENUM(NSUInteger, BTDropInContentViewStateType) { + BTDropInContentViewStateForm = 0, + BTDropInContentViewStatePaymentMethodsOnFile, + BTDropInContentViewStateActivity +}; + +/// A thin view layer that manages Drop In subviews and their layout. +@interface BTDropInContentView : BTUIThemedView + +@property (nonatomic, strong) BTUISummaryView *summaryView; +@property (nonatomic, strong) BTUICTAControl *ctaControl; +@property (nonatomic, strong) BTPaymentButton *paymentButton; +@property (nonatomic, strong) UILabel *cardFormSectionHeader; +@property (nonatomic, strong) BTUICardFormView *cardForm; + +@property (nonatomic, strong) BTUIPaymentMethodView *selectedPaymentMethodView; +@property (nonatomic, strong) UIButton *changeSelectedPaymentMethodButton; + +/// Whether to hide the call to action +@property (nonatomic, assign) BOOL hideCTA; + +/// Whether to hide the summary banner view +@property (nonatomic, assign) BOOL hideSummary; + +/// The current state +@property (nonatomic, assign) BTDropInContentViewStateType state; + +/// Whether the paymentButton control is hidden +@property (nonatomic, assign) BOOL hidePaymentButton; + +- (void)setState:(BTDropInContentViewStateType)newState animate:(BOOL)animate; + +@end diff --git a/Pods/Braintree/Braintree/Drop-In/BTDropInContentView.m b/Pods/Braintree/Braintree/Drop-In/BTDropInContentView.m new file mode 100644 index 0000000..ffc2ee8 --- /dev/null +++ b/Pods/Braintree/Braintree/Drop-In/BTDropInContentView.m @@ -0,0 +1,292 @@ +#import "BTDropInContentView.h" +#import "BTDropInLocalizedString.h" + +@interface BTDropInContentView () +@property (nonatomic, strong) NSArray *verticalLayoutConstraints; +@property (nonatomic, strong) UIActivityIndicatorView *activityView; +@property (nonatomic, strong) NSLayoutConstraint *heightConstraint; +@end + +@implementation BTDropInContentView + +- (id)initWithFrame:(CGRect)frame +{ + self = [super initWithFrame:frame]; + if (self) { + // Initialize Subviews + + self.activityView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; + self.activityView.translatesAutoresizingMaskIntoConstraints = NO; + self.activityView.hidden = YES; + [self addSubview:self.activityView]; + [self addConstraint:[NSLayoutConstraint constraintWithItem:self.activityView attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterX multiplier:1.0f constant:0.0f]]; + + self.summaryView = [[BTUISummaryView alloc] init]; + + UIView *summaryBorderBottom = [[UIView alloc] init]; + summaryBorderBottom.backgroundColor = self.theme.borderColor; + summaryBorderBottom.translatesAutoresizingMaskIntoConstraints = NO; + [self.summaryView addSubview:summaryBorderBottom]; + [self.summaryView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[border]|" + options:0 + metrics:nil + views:@{@"border": summaryBorderBottom}]]; + [self.summaryView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[border(==borderWidth)]|" + options:0 + metrics:@{@"borderWidth": @(self.theme.borderWidth)} + views:@{@"border": summaryBorderBottom}]]; + + self.paymentButton = [[BTPaymentButton alloc] init]; + + self.cardFormSectionHeader = [[UILabel alloc] init]; + + self.cardForm = [[BTUICardFormView alloc] init]; + [self.cardForm setContentHuggingPriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisVertical]; + + self.selectedPaymentMethodView = [[BTUIPaymentMethodView alloc] init]; + + self.changeSelectedPaymentMethodButton = [UIButton buttonWithType:UIButtonTypeSystem]; + [self.changeSelectedPaymentMethodButton setTitle:BTDropInLocalizedString(DROP_IN_CHANGE_PAYMENT_METHOD_BUTTON_TEXT) + forState:UIControlStateNormal]; + + self.ctaControl = [[BTUICTAControl alloc] init]; + + // Add Constraints & Subviews + + // Full-Width Views + for (UIView *view in @[self.paymentButton, self.selectedPaymentMethodView, self.summaryView, self.ctaControl, self.cardForm]) { + [self addSubview:view]; + view.translatesAutoresizingMaskIntoConstraints = NO; + [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[view]|" + options:0 + metrics:nil + views:@{@"view": view}]]; + } + + // Not quite full-width views + for (UIView *view in @[self.cardFormSectionHeader, self.changeSelectedPaymentMethodButton]) { + [self addSubview:view]; + view.translatesAutoresizingMaskIntoConstraints = NO; + [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(horizontalMargin)-[view]-(horizontalMargin)-|" + options:0 + metrics:@{@"horizontalMargin": @(self.theme.horizontalMargin)} + views:@{@"view": view}]]; + } + + + self.state = BTDropInContentViewStateForm; + + // Keyboard dismissal when tapping outside text field + UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapped)]; + tapGesture.delegate = self; + [self addGestureRecognizer:tapGesture]; + + } + return self; +} + +- (void)updateConstraints { + + if (self.verticalLayoutConstraints != nil) { + [self removeConstraints:self.verticalLayoutConstraints]; + } + + NSDictionary *viewBindings = @{ + @"activityView": self.activityView, + @"summaryView": self.summaryView, + @"paymentButton": self.paymentButton, + @"cardFormSectionHeader": self.cardFormSectionHeader, + @"cardForm": self.cardForm, + @"ctaControl": self.ctaControl, + @"selectedPaymentMethodView": self.selectedPaymentMethodView, + @"changeSelectedPaymentMethodButton": self.changeSelectedPaymentMethodButton + }; + + NSMutableArray *newConstraints = [NSMutableArray array]; + for (NSString *visualFormat in [self evaluateVisualFormat]) { + [newConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:visualFormat + options:0 + metrics:nil + views:viewBindings]]; + } + + if(self.heightConstraint != nil) { + [self.superview removeConstraint:self.heightConstraint]; + } + + if (self.state != BTDropInContentViewStateForm) { + + self.heightConstraint = [NSLayoutConstraint constraintWithItem:self + attribute:NSLayoutAttributeHeight + relatedBy:NSLayoutRelationGreaterThanOrEqual + toItem:self.superview + attribute:NSLayoutAttributeHeight + multiplier:1.0f + constant:0]; + [self.superview addConstraint:self.heightConstraint]; + } + [self.superview setNeedsLayout]; + + [self addConstraints:newConstraints]; + self.verticalLayoutConstraints = newConstraints; + + [super updateConstraints]; + +} +- (void)setHideSummary:(BOOL)hideSummary { + _hideSummary = hideSummary; + [self updateLayout]; +} + +- (void)setHideCTA:(BOOL)hideCTA { + _hideCTA = hideCTA; + [self updateLayout]; +} + +- (void)setState:(BTDropInContentViewStateType)state { + _state = state; + [self updateLayout]; +} + +- (void)setState:(BTDropInContentViewStateType)newState animate:(BOOL)animate { + if (!animate) { + [self setState:newState]; + } else { + BTDropInContentViewStateType oldState = self.state; + CGFloat duration = 0.2f; + if (oldState == BTDropInContentViewStateActivity) { + if (newState == BTDropInContentViewStateForm) { + [UIView animateWithDuration:duration animations:^{ + self.activityView.alpha = 0.0f; + } completion:^(__unused BOOL finished) { + [self setState:newState]; + self.paymentButton.alpha = 0.0f; + self.cardForm.alpha = 0.0f; + self.cardFormSectionHeader.alpha = 0.0f; + self.ctaControl.alpha = 0.0f; + [self setNeedsUpdateConstraints]; + [self layoutIfNeeded]; + [UIView animateWithDuration:duration animations:^{ + self.paymentButton.alpha = 1.0f; + self.cardForm.alpha = 1.0f; + self.cardFormSectionHeader.alpha = 1.0f; + self.ctaControl.alpha = 1.0f; + }]; + }]; + return; + } + + if (newState == BTDropInContentViewStatePaymentMethodsOnFile) { + self.activityView.alpha = 1.0f; + [UIView animateWithDuration:duration animations:^{ + self.activityView.alpha = 0.0f; + } completion:^(__unused BOOL finished) { + [self setState:newState]; + self.selectedPaymentMethodView.alpha = 0.0f; + self.changeSelectedPaymentMethodButton.alpha = 0.0f; + self.ctaControl.alpha = 0.0f; + [self setNeedsUpdateConstraints]; + [self layoutIfNeeded]; + [UIView animateWithDuration:duration animations:^{ + self.selectedPaymentMethodView.alpha = 1.0f; + self.changeSelectedPaymentMethodButton.alpha = 1.0f; + self.ctaControl.alpha = 1.0f; + }]; + }]; + return; + } + } + [self setState:newState]; + } +} + +- (void)setHidePaymentButton:(BOOL)hidePaymentButton { + _hidePaymentButton = hidePaymentButton; + self.paymentButton.hidden = hidePaymentButton; + [self updateLayout]; +} + +- (void)updateLayout { + + // Reset all to hidden, just for clarity + self.activityView.hidden = YES; + self.summaryView.hidden = self.hideSummary; + self.paymentButton.hidden = YES; + self.cardFormSectionHeader.hidden = YES; + self.cardForm.hidden = YES; + self.selectedPaymentMethodView.hidden = YES; + self.changeSelectedPaymentMethodButton.hidden = YES; + self.ctaControl.hidden = YES; + + switch (self.state) { + case BTDropInContentViewStateForm: + self.activityView.hidden = YES; + [self.activityView stopAnimating]; + self.ctaControl.hidden = self.hideCTA; + self.paymentButton.hidden = self.hidePaymentButton; + self.cardFormSectionHeader.hidden = NO; + self.cardForm.hidden = NO; + break; + case BTDropInContentViewStatePaymentMethodsOnFile: + self.activityView.hidden = YES; + [self.activityView stopAnimating]; + self.ctaControl.hidden = self.hideCTA; + self.selectedPaymentMethodView.hidden = NO; + self.changeSelectedPaymentMethodButton.hidden = NO; + break; + case BTDropInContentViewStateActivity: + self.activityView.hidden = NO; + self.activityView.alpha = 1.0f; + [self.activityView startAnimating]; + break; + default: + break; + } + [self setNeedsUpdateConstraints]; +} + + +#pragma mark Tap Gesture Delegate + +- (BOOL)gestureRecognizer:(__unused UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { + // Disallow recognition of tap gestures on UIControls (like, say, buttons) + if ([touch.view isKindOfClass:[UIControl class]] || [touch.view isDescendantOfView:self.paymentButton]) { + return NO; + } + return YES; +} + + +- (void)tapped { + [self.cardForm endEditing:YES]; +} + +- (NSArray*) evaluateVisualFormat{ + NSString *summaryViewVisualFormat = self.summaryView.hidden ? @"" : @"[summaryView(>=60)]"; + NSString *ctaControlVisualFormat = self.ctaControl.hidden ? @"" : @"[ctaControl(==50)]"; + + if (self.state == BTDropInContentViewStateActivity) { + return @[[NSString stringWithFormat:@"V:|%@-(40)-[activityView]-(>=40)-%@|", summaryViewVisualFormat, ctaControlVisualFormat]]; + + } else if (self.state != BTDropInContentViewStatePaymentMethodsOnFile) { + if (!self.ctaControl.hidden) { + ctaControlVisualFormat = [NSString stringWithFormat:@"-(15)-%@-(>=0)-", ctaControlVisualFormat]; + } + if (self.hidePaymentButton){ + return @[[NSString stringWithFormat:@"V:|%@-(35)-[cardFormSectionHeader]-(7)-[cardForm]%@|", summaryViewVisualFormat, ctaControlVisualFormat]]; + } else { + summaryViewVisualFormat = [NSString stringWithFormat:@"%@-(35)-", summaryViewVisualFormat]; + return @[[NSString stringWithFormat:@"V:|%@[paymentButton(==44)]-(18)-[cardFormSectionHeader]-(7)-[cardForm]%@|", summaryViewVisualFormat, ctaControlVisualFormat]]; + } + + } else { + NSString *primaryLayout = [NSString stringWithFormat:@"V:|%@-(15)-[selectedPaymentMethodView(==45)]-(15)-[changeSelectedPaymentMethodButton]-(>=15)-%@|", summaryViewVisualFormat, ctaControlVisualFormat]; + NSMutableArray *visualLayouts = [NSMutableArray arrayWithObject:primaryLayout]; + if (!self.ctaControl.hidden) { + [visualLayouts addObject:@"V:[ctaControl]|"]; + } + return visualLayouts; + } +} + +@end diff --git a/Pods/Braintree/Braintree/Drop-In/BTDropInErrorAlert.h b/Pods/Braintree/Braintree/Drop-In/BTDropInErrorAlert.h new file mode 100644 index 0000000..e2d372a --- /dev/null +++ b/Pods/Braintree/Braintree/Drop-In/BTDropInErrorAlert.h @@ -0,0 +1,12 @@ +#import + +@interface BTDropInErrorAlert : NSObject + +@property (nonatomic, copy) NSString *title; +@property (nonatomic, copy) NSString *message; + +- (instancetype)initWithCancel:(void (^)(void))cancelBlock retry:(void (^)(void))retryBlock; + +- (void)show; + +@end diff --git a/Pods/Braintree/Braintree/Drop-In/BTDropInErrorAlert.m b/Pods/Braintree/Braintree/Drop-In/BTDropInErrorAlert.m new file mode 100644 index 0000000..ce7848e --- /dev/null +++ b/Pods/Braintree/Braintree/Drop-In/BTDropInErrorAlert.m @@ -0,0 +1,87 @@ +#import + +#import "BTDropInErrorAlert.h" +#import "BTDropInLocalizedString.h" +#import "BTUIUtil.h" + +@interface BTDropInErrorAlert () + +@property (nonatomic, copy) void (^retryBlock)(void); + +@property (nonatomic, copy) void (^cancelBlock)(void); + +@end + +@implementation BTDropInErrorAlert + +- (instancetype)initWithCancel:(void (^)(void))cancelBlock retry:(void (^)(void))retryBlock { + self = [super init]; + if (self) { + self.retryBlock = retryBlock; + self.cancelBlock = cancelBlock; + } + return self; +} + +- (void)show { + NSString *localizedOK = BTDropInLocalizedString(ERROR_ALERT_OK_BUTTON_TEXT); + NSString *localizedCancel = BTDropInLocalizedString(ERROR_ALERT_CANCEL_BUTTON_TEXT); + + if ([UIAlertController class]) { + UIAlertController *alert = [UIAlertController alertControllerWithTitle:self.title + message:self.message + preferredStyle:UIAlertControllerStyleAlert]; + [alert addAction:[UIAlertAction actionWithTitle:self.retryBlock ? localizedCancel : localizedOK + style:UIAlertActionStyleCancel + handler:^(UIAlertAction * __nonnull __unused action) { + if (self.cancelBlock) { + self.cancelBlock(); + } + }]]; + if (self.retryBlock) { + NSString *localizedTryAgain = BTDropInLocalizedString(ERROR_ALERT_TRY_AGAIN_BUTTON_TEXT); + [alert addAction:[UIAlertAction actionWithTitle:localizedTryAgain + style:UIAlertActionStyleDefault + handler:^(UIAlertAction * __nonnull __unused action) { + if (self.retryBlock) { + self.retryBlock(); + } + }]]; + } + UIViewController *visibleViewController = [[UIApplication sharedApplication].delegate.window.rootViewController BTUI_visibleViewController]; + [visibleViewController presentViewController:alert animated:YES completion:nil]; + } else { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:self.title + message:self.message + delegate:self + cancelButtonTitle:self.retryBlock ? localizedCancel : localizedOK + otherButtonTitles:nil]; + if (self.retryBlock) { + NSString *localizedTryAgain = BTDropInLocalizedString(ERROR_ALERT_TRY_AGAIN_BUTTON_TEXT); + [alertView addButtonWithTitle:localizedTryAgain]; + } + [alertView show]; +#pragma clang diagnostic pop + } +} + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" +- (void)alertView:(__unused UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { +#pragma clang diagnostic pop + if (buttonIndex == 0 && self.cancelBlock) { + self.cancelBlock(); + } else if (buttonIndex == 1 && self.retryBlock) { + self.retryBlock(); + } +} + +- (NSString *)title { + NSString *localizedConnectionError = BTDropInLocalizedString(ERROR_ALERT_CONNECTION_ERROR); + + return _title ?: localizedConnectionError; +} + +@end diff --git a/Pods/Braintree/Braintree/Drop-In/BTDropInErrorState.h b/Pods/Braintree/Braintree/Drop-In/BTDropInErrorState.h new file mode 100644 index 0000000..b90ebc8 --- /dev/null +++ b/Pods/Braintree/Braintree/Drop-In/BTDropInErrorState.h @@ -0,0 +1,21 @@ +#import + +/// Interprets NSError objects of domainBTBraintreeAPIErrorDomain, code +/// BTCustomerInputErrorInvalid for Drop-In UI Components. +@interface BTDropInErrorState : NSObject + +/// Initializes a new error state object returned by +/// saveCardWithNumber:expirationMonth:expirationYear:cvv:postalCode:validate:success:failure:. +/// +/// @param error The error to interpret +/// +/// @return a new error state instance +- (instancetype)initWithError:(NSError *)error; + +/// Top-level description of error +@property (nonatomic, copy, readonly) NSString *errorTitle; + +/// Set of invalid fields to highlight, each represented as a boxed BTUICardFormField +@property (nonatomic, strong, readonly) NSSet *highlightedFields; + +@end diff --git a/Pods/Braintree/Braintree/Drop-In/BTDropInErrorState.m b/Pods/Braintree/Braintree/Drop-In/BTDropInErrorState.m new file mode 100644 index 0000000..cea46b7 --- /dev/null +++ b/Pods/Braintree/Braintree/Drop-In/BTDropInErrorState.m @@ -0,0 +1,63 @@ +#import "BTDropInErrorState.h" +#import "BTUICardFormView.h" +#import "BTErrors.h" + +@interface BTDropInErrorState () +@property (nonatomic, strong) NSError *error; +@end + +@implementation BTDropInErrorState + +- (instancetype)initWithError:(__unused NSError *)error{ + self = [super init]; + if (self != nil) { + self.error = error; + } + return self; +} + +- (NSString *)errorTitle { + return self.validationErrors[@"error"][@"message"]; +} + +- (NSDictionary *)validationErrors { + return self.error.userInfo[BTCustomerInputBraintreeValidationErrorsKey]; +} + +- (NSSet *)highlightedFields{ + NSMutableSet *fieldsToHighlight = [[NSMutableSet alloc] init]; + NSArray *fieldErrors = self.validationErrors[@"fieldErrors"]; + + NSArray *creditCardFieldErrors = @[]; + for (NSDictionary *fieldError in fieldErrors) { + if ([fieldError[@"field"] isEqualToString:@"creditCard"]) { + creditCardFieldErrors = fieldError[@"fieldErrors"]; + break; + } + } + + for (NSDictionary *creditCardFieldError in creditCardFieldErrors) { + NSString *field = creditCardFieldError[@"field"]; + if([field isEqualToString:@"cvv"]){ + [fieldsToHighlight addObject:@(BTUICardFormFieldCvv)]; + } else if ([field isEqualToString:@"billingAddress"]) { + for (NSDictionary *billingAddressFieldError in creditCardFieldError[@"fieldErrors"]) { + NSString *billingAddressField = billingAddressFieldError[@"field"]; + if ([billingAddressField isEqualToString:@"postalCode"]) { + [fieldsToHighlight addObject:@(BTUICardFormFieldPostalCode)]; + } + } + } else if ([field isEqualToString:@"number"]) { + [fieldsToHighlight addObject:@(BTUICardFormFieldNumber)]; + } else if ([field isEqualToString:@"expirationDate"] || [field isEqualToString:@"expirationMonth"] || [field isEqualToString:@"expirationYear"]) { + [fieldsToHighlight addObject:@(BTUICardFormFieldExpiration)]; + } + } + return fieldsToHighlight; +} + +- (NSString *)description { + return [NSString stringWithFormat:@"", self, self.errorTitle, self.highlightedFields]; +} + +@end diff --git a/Pods/Braintree/Braintree/Drop-In/BTDropInSelectPaymentMethodViewController.h b/Pods/Braintree/Braintree/Drop-In/BTDropInSelectPaymentMethodViewController.h new file mode 100644 index 0000000..30ff031 --- /dev/null +++ b/Pods/Braintree/Braintree/Drop-In/BTDropInSelectPaymentMethodViewController.h @@ -0,0 +1,28 @@ +#import + +#import "Braintree-API.h" + +#import "BTUI.h" + +@protocol BTDropInSelectPaymentMethodViewControllerDelegate; + +/// Drop In's payment method selection flow. +@interface BTDropInSelectPaymentMethodViewController : UITableViewController + +@property (nonatomic, strong) BTClient *client; +@property (nonatomic, weak) id delegate; +@property (nonatomic, strong) NSArray *paymentMethods; +@property (nonatomic, assign) NSInteger selectedPaymentMethodIndex; + +@property (nonatomic, strong) BTUI *theme; + +@end + +@protocol BTDropInSelectPaymentMethodViewControllerDelegate + +- (void)selectPaymentMethodViewController:(BTDropInSelectPaymentMethodViewController *)viewController + didSelectPaymentMethodAtIndex:(NSUInteger)index; + +- (void)selectPaymentMethodViewControllerDidRequestNew:(BTDropInSelectPaymentMethodViewController *)viewController; + +@end diff --git a/Pods/Braintree/Braintree/Drop-In/BTDropInSelectPaymentMethodViewController.m b/Pods/Braintree/Braintree/Drop-In/BTDropInSelectPaymentMethodViewController.m new file mode 100644 index 0000000..bef3d39 --- /dev/null +++ b/Pods/Braintree/Braintree/Drop-In/BTDropInSelectPaymentMethodViewController.m @@ -0,0 +1,119 @@ +#import "BTDropInSelectPaymentMethodViewController.h" +#import "BTDropInUtil.h" +#import "BTUIViewUtil.h" +#import "BTUI.h" +#import "BTDropInViewController.h" +#import "BTDropInLocalizedString.h" +#import "BTUILocalizedString.h" + +@interface BTDropInSelectPaymentMethodViewController () + +@end + +@implementation BTDropInSelectPaymentMethodViewController + +- (instancetype)init { + return [self initWithStyle:UITableViewStyleGrouped]; +} + +- (id)initWithStyle:(UITableViewStyle)style +{ + self = [super initWithStyle:style]; + if (self) { + self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(didTapAdd)]; + self.tableView.accessibilityIdentifier = @"Payment Methods Table"; + } + return self; +} + +- (void)viewDidAppear:(BOOL)animated { + [super viewDidAppear:animated]; + [self.tableView reloadData]; +} + +#pragma mark - + +- (void)didTapAdd { + [self.delegate selectPaymentMethodViewControllerDidRequestNew:self]; +} + +#pragma mark - Table view data source + +- (NSInteger)tableView:(__unused UITableView *)tableView numberOfRowsInSection:(__unused NSInteger)section +{ + return [self.paymentMethods count] ?: 0; +} + + +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath +{ + static NSString *paymentMethodCellIdentifier = @"paymentMethodCell"; + UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:paymentMethodCellIdentifier]; + if (cell == nil) { + cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:paymentMethodCellIdentifier]; + } + + BTPaymentMethod *paymentMethod = [self.paymentMethods objectAtIndex:indexPath.row]; + if ([paymentMethod isKindOfClass:[BTPayPalPaymentMethod class]]) { + BTPayPalPaymentMethod *payPalPaymentMethod = (BTPayPalPaymentMethod *)paymentMethod; + NSString *typeString = BTUILocalizedString(PAYPAL_CARD_BRAND); + NSMutableAttributedString *typeWithDescription = [[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@"%@ %@", typeString, (payPalPaymentMethod.description ?: @"")]]; + [typeWithDescription addAttribute:NSFontAttributeName value:self.theme.controlTitleFont range:NSMakeRange(0, [typeString length])]; + [typeWithDescription addAttribute:NSFontAttributeName value:self.theme.controlDetailFont range:NSMakeRange([typeString length], [payPalPaymentMethod.description length])]; + cell.textLabel.attributedText = typeWithDescription; + + + BTUIVectorArtView *iconArt = [[BTUI braintreeTheme] vectorArtViewForPaymentMethodType:BTUIPaymentMethodTypePayPal]; + UIImage *icon = [iconArt imageOfSize:CGSizeMake(42, 23)]; + cell.imageView.contentMode = UIViewContentModeCenter; + cell.imageView.image = icon; + + } else if([paymentMethod isKindOfClass:[BTCardPaymentMethod class]]) { + BTCardPaymentMethod *card = (BTCardPaymentMethod *)paymentMethod; + + + BTUIPaymentMethodType uiPaymentMethodType = [BTDropInUtil uiForCardType:card.type]; + NSString *typeString = [BTUIViewUtil nameForPaymentMethodType:uiPaymentMethodType]; + + NSMutableAttributedString *typeWithDescription = [[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@"%@ %@", typeString, card.description]]; + [typeWithDescription addAttribute:NSFontAttributeName value:self.theme.controlTitleFont range:NSMakeRange(0, [typeString length])]; + [typeWithDescription addAttribute:NSFontAttributeName value:self.theme.controlDetailFont range:NSMakeRange([typeString length], [card.description length])]; + cell.textLabel.attributedText = typeWithDescription; + + BTUIPaymentMethodType uiType = [BTDropInUtil uiForCardType:card.type]; + BTUIVectorArtView *iconArt = [[BTUI braintreeTheme] vectorArtViewForPaymentMethodType:uiType]; + UIImage *icon = [iconArt imageOfSize:CGSizeMake(42, 23)]; + cell.imageView.contentMode = UIViewContentModeCenter; + cell.imageView.image = icon; + } else if ([paymentMethod isKindOfClass:[BTCoinbasePaymentMethod class]]) { + BTCoinbasePaymentMethod *coinbasePaymentMethod = (BTCoinbasePaymentMethod *)paymentMethod; + NSString *typeString = BTUILocalizedString(PAYMENT_METHOD_TYPE_COINBASE); + NSMutableAttributedString *typeWithDescription = [[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@"%@ %@", typeString, (coinbasePaymentMethod.description ?: @"")]]; + [typeWithDescription addAttribute:NSFontAttributeName value:self.theme.controlTitleFont range:NSMakeRange(0, [typeString length])]; + [typeWithDescription addAttribute:NSFontAttributeName value:self.theme.controlDetailFont range:NSMakeRange([typeString length], [coinbasePaymentMethod.description length])]; + cell.textLabel.attributedText = typeWithDescription; + + + BTUIVectorArtView *iconArt = [[BTUI braintreeTheme] vectorArtViewForPaymentMethodType:BTUIPaymentMethodTypeCoinbase]; + UIImage *icon = [iconArt imageOfSize:CGSizeMake(42, 23)]; + cell.imageView.contentMode = UIViewContentModeCenter; + cell.imageView.image = icon; + + } else { + cell.textLabel.text = [paymentMethod description]; + cell.imageView.image = nil; + } + + + cell.accessoryType = (indexPath.row == self.selectedPaymentMethodIndex) ? UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone; + + return cell; +} + +- (void)tableView:(__unused UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { + self.selectedPaymentMethodIndex = indexPath.row; + [self.tableView reloadData]; + [self.delegate selectPaymentMethodViewController:self didSelectPaymentMethodAtIndex:indexPath.row]; +} + +@end diff --git a/Pods/Braintree/Braintree/Drop-In/BTDropInUtil.h b/Pods/Braintree/Braintree/Drop-In/BTDropInUtil.h new file mode 100644 index 0000000..181710c --- /dev/null +++ b/Pods/Braintree/Braintree/Drop-In/BTDropInUtil.h @@ -0,0 +1,8 @@ +#import "BTCardPaymentMethod.h" +#import "BTUIPaymentMethodType.h" + +@interface BTDropInUtil : NSObject + ++ (BTUIPaymentMethodType)uiForCardType:(BTCardType)cardType; + +@end diff --git a/Pods/Braintree/Braintree/Drop-In/BTDropInUtil.m b/Pods/Braintree/Braintree/Drop-In/BTDropInUtil.m new file mode 100644 index 0000000..30dcc05 --- /dev/null +++ b/Pods/Braintree/Braintree/Drop-In/BTDropInUtil.m @@ -0,0 +1,24 @@ +#import "BTDropInUtil.h" + +@implementation BTDropInUtil + ++ (BTUIPaymentMethodType)uiForCardType:(BTCardType)cardType { + switch (cardType) { + case BTCardTypeUnknown: return BTUIPaymentMethodTypeUnknown; + case BTCardTypeAMEX: return BTUIPaymentMethodTypeAMEX; + case BTCardTypeDinersClub: return BTUIPaymentMethodTypeDinersClub; + case BTCardTypeDiscover: return BTUIPaymentMethodTypeDiscover; + case BTCardTypeMasterCard: return BTUIPaymentMethodTypeMasterCard; + case BTCardTypeVisa: return BTUIPaymentMethodTypeVisa; + case BTCardTypeJCB: return BTUIPaymentMethodTypeJCB; + case BTCardTypeLaser: return BTUIPaymentMethodTypeLaser; + case BTCardTypeMaestro: return BTUIPaymentMethodTypeMaestro; + case BTCardTypeUnionPay: return BTUIPaymentMethodTypeUnionPay; + case BTCardTypeSolo: return BTUIPaymentMethodTypeSolo; + case BTCardTypeSwitch: return BTUIPaymentMethodTypeSwitch; + case BTCardTypeUKMaestro: return BTUIPaymentMethodTypeUKMaestro; + default: return BTUIPaymentMethodTypeUnknown; + } +} + +@end diff --git a/Pods/Braintree/Braintree/Drop-In/BTDropInViewController.h b/Pods/Braintree/Braintree/Drop-In/BTDropInViewController.h new file mode 100644 index 0000000..94780d8 --- /dev/null +++ b/Pods/Braintree/Braintree/Drop-In/BTDropInViewController.h @@ -0,0 +1,125 @@ +#import +#import "Braintree-API.h" + +@class BTUI; +@protocol BTDropInViewControllerDelegate; + +/// A view controller that provides a quick and easy payment experience. +/// +/// When initialized with a Braintree client, the Drop In will prompt a user for payment details, +/// based on your Gatweay configuration. The Drop In payment form supports cards and PayPal. When +/// using Drop In, you don't need to worry about which methods are already on file with Braintree; +/// newly created methods are saved as part of the Drop In flow as needed. +/// +/// Upon successful form submission, you will receive a payment method nonce, which you can +/// transact with on your server. Client and validation errors are handled internally by Drop In; +/// other types of Errors are rare and generally irrecoverable. +/// +/// The Drop In view controller delegates presentation and dismissal to the developer. It has been +/// most thoroughly tested in the context of a UINavigationController. +/// +/// The Drop In can send success and cancelation messages to the developer via the +/// delegate. See `delegate` and `BTDropInViewControllerDelegate`. +/// +/// You can customize Drop In in various ways, for example, you can change the primary Call To +/// Action button text. For visual customzation options see `theme` and `BTUI`. Like any +/// UIViewController, you can setup properties like `title` or `navigationBar.rightBarButtonItem`. +@interface BTDropInViewController : UIViewController + +/// Initialize a new Drop In. +/// +/// @param client a client token that has been initialized with a client token +/// +/// @return A new Drop In view controller that is ready to be presented. +- (instancetype)initWithClient:(BTClient *)client; + +/// The Braintree client used internally for communication with the Gateway. This property is exposed +/// to enable the use of other UIViewController initializers, for example, when using Storyboards. +/// +/// @see BTClient +@property (nonatomic, strong) BTClient *client; + +/// The array of `BTPaymentMethod *` payment methods on file. These payment methods may be in the Vault. +/// Most payment methods are automatically Vaulted if the client token was generated with a customer ID. +@property (nonatomic, strong) NSArray *paymentMethods; + +#pragma mark State Change Notifications + +/// The delegate that, if set, is notified of success or failure. +@property (nonatomic, weak) id delegate; + +#pragma mark Customization + +/// The presentation theme to use for the Drop In. +@property (nonatomic, strong) BTUI *theme; + +/// Primary text to display in the summary view. +/// +/// Intended to provide a name the overall transaction taking place. For example, "1 Item", "1 Year Subscription", "Yellow T-Shirt", etc. +/// +/// If summaryTitle or summaryDescription are nil, then the summary view is not shown. +@property (nonatomic, copy) NSString *summaryTitle; + +/// Detail text to display in the summary view. +/// +/// Intended to provide a few words of detail. For example, "Ships in Five Days", "15 feet by 12 feet" or "We know you'll love it" +/// +/// If summaryTitle or summaryDescription are nil, then the summary view is not shown. +@property (nonatomic, copy) NSString *summaryDescription; + +/// A string representation of the grand total amount +/// +/// For example, "$12.95" +@property (nonatomic, copy) NSString *displayAmount; + +/// The text to display in the primary call-to-action button. For example: "$19 - Purchase" or "Subscribe Now". +@property (nonatomic, copy) NSString *callToActionText; + +/// Whether to hide the call to action control. +/// +/// When true, a submit button will be added as a bar button item (which +/// relies on the drop-in view controller being embedded in a navigation controller. +/// +/// Defaults to `NO`. +/// +/// @see callToAction +/// @see callToActionAmount +@property (nonatomic, assign) BOOL shouldHideCallToAction; + +/// Fetches the customer's saved payment methods and populates Drop In with them. +/// +/// @note For the best user experience, you should call this method as early as +/// possible (after initializing BTDropInViewController, before presenting it) +/// in order to avoid a loading spinner. +- (void)fetchPaymentMethods; + + +@end + +/// A protocol for BTDropInViewController completion notifications. +@protocol BTDropInViewControllerDelegate + +/// Informs the delegate when the user has successfully provided a payment method. +/// +/// Upon receiving this message, you should dismiss Drop In. +/// +/// @param viewController The Drop In view controller informing its delegate of success +/// @param paymentMethod The selected (and possibly newly created) payment method. +- (void)dropInViewController:(BTDropInViewController *)viewController didSucceedWithPaymentMethod:(BTPaymentMethod *)paymentMethod; + +/// Informs the delegate when the user has decided to cancel out of the Drop In payment form. +/// +/// Drop In handles its own error cases, so this cancelation is user initiated and +/// irreversable. Upon receiving this message, you should dismiss Drop In. +/// +/// @param viewController The Drop In view controller informing its delegate of failure. +- (void)dropInViewControllerDidCancel:(BTDropInViewController *)viewController; + +@optional + +/// Informs the delegate when the user has entered or selected payment information. +/// +/// @param viewController The Drop In view controller informing its delegate +- (void)dropInViewControllerWillComplete:(BTDropInViewController *)viewController; + +@end diff --git a/Pods/Braintree/Braintree/Drop-In/BTDropInViewController.m b/Pods/Braintree/Braintree/Drop-In/BTDropInViewController.m new file mode 100644 index 0000000..d2d5193 --- /dev/null +++ b/Pods/Braintree/Braintree/Drop-In/BTDropInViewController.m @@ -0,0 +1,669 @@ +#import "BTDropInViewController.h" +#import "BTDropInContentView.h" +#import "BTDropInSelectPaymentMethodViewController.h" +#import "BTUICardFormView.h" +#import "BTUIScrollView.h" +#import "BTDropInUtil.h" +#import "Braintree-API.h" +#import "BTClient+BTPayPal.h" +#import "BTDropInErrorState.h" +#import "BTDropInErrorAlert.h" +#import "BTDropInLocalizedString.h" +#import "BTPaymentMethodCreationDelegate.h" +#import "BTClient_Internal.h" +#import "BTLogger_Internal.h" +#import "BTCoinbase.h" + +@interface BTDropInViewController () < BTDropInSelectPaymentMethodViewControllerDelegate, BTUIScrollViewScrollRectToVisibleDelegate, BTUICardFormViewDelegate, BTPaymentMethodCreationDelegate, BTDropInViewControllerDelegate> + +@property (nonatomic, strong) BTDropInContentView *dropInContentView; +@property (nonatomic, strong) BTDropInViewController *addPaymentMethodDropInViewController; +@property (nonatomic, strong) BTUIScrollView *scrollView; +@property (nonatomic, assign) NSInteger selectedPaymentMethodIndex; +@property (nonatomic, strong) UIBarButtonItem *submitBarButtonItem; + +/// Whether currently visible. +@property (nonatomic, assign) BOOL visible; +@property (nonatomic, assign) NSTimeInterval visibleStartTime; + +/// If YES, fetch and display payment methods on file, summary view, CTA control. +/// If NO, do not fetch payment methods, and just show UI to add a new method. +/// +/// Defaults to `YES`. +@property (nonatomic, assign) BOOL fullForm; + +/// Strong reference to a BTDropInErrorAlert. Reference is needed to +/// handle user input from UIAlertView. +@property (nonatomic, strong) BTDropInErrorAlert *fetchPaymentMethodsErrorAlert; + +/// Strong reference to BTDropInErrorAlert. Reference is needed to +/// handle user input from UIAlertView. +@property (nonatomic, strong) BTDropInErrorAlert *saveAccountErrorAlert; + +@property (nonatomic, assign) BOOL cardEntryDidBegin; + +@property (nonatomic, assign) BOOL originalCoinbaseStoreInVault; + +@end + +@implementation BTDropInViewController + +- (instancetype)initWithClient:(BTClient *)client { + self = [self init]; + if (self) { + self.theme = [BTUI braintreeTheme]; + self.dropInContentView = [[BTDropInContentView alloc] init]; + + self.client = [client copyWithMetadata:^(BTClientMutableMetadata *metadata) { + metadata.integration = BTClientMetadataIntegrationDropIn; + }]; + self.dropInContentView.paymentButton.client = self.client; + self.dropInContentView.paymentButton.delegate = self; + + self.dropInContentView.hidePaymentButton = !self.dropInContentView.paymentButton.hasAvailablePaymentMethod; + + self.selectedPaymentMethodIndex = NSNotFound; + self.dropInContentView.state = BTDropInContentViewStateActivity; + self.fullForm = YES; + _callToActionText = BTDropInLocalizedString(DEFAULT_CALL_TO_ACTION); + } + return self; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + self.edgesForExtendedLayout = UIRectEdgeNone; + + self.view.backgroundColor = self.theme.viewBackgroundColor; + + // Configure Subviews + self.scrollView = [[BTUIScrollView alloc] init]; + self.scrollView.scrollRectToVisibleDelegate = self; + self.scrollView.bounces = YES; + self.scrollView.scrollsToTop = YES; + self.scrollView.alwaysBounceVertical = YES; + self.scrollView.translatesAutoresizingMaskIntoConstraints = NO; + self.scrollView.delaysContentTouches = NO; + self.scrollView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive; + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(keyboardWillHide:) + name:UIKeyboardWillHideNotification + object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(keyboardWillShow:) + name:UIKeyboardWillShowNotification + object:nil]; + + self.dropInContentView.translatesAutoresizingMaskIntoConstraints = NO; + + self.dropInContentView.cardForm.delegate = self; + self.dropInContentView.cardForm.alphaNumericPostalCode = YES; + self.dropInContentView.cardForm.optionalFields = self.optionalFieldsFromClientToken; + + [self.dropInContentView.changeSelectedPaymentMethodButton addTarget:self + action:@selector(tappedChangePaymentMethod) + forControlEvents:UIControlEventTouchUpInside]; + + [self.dropInContentView.ctaControl addTarget:self + action:@selector(tappedSubmitForm) + forControlEvents:UIControlEventTouchUpInside]; + + self.dropInContentView.cardFormSectionHeader.textColor = self.theme.sectionHeaderTextColor; + self.dropInContentView.cardFormSectionHeader.font = self.theme.sectionHeaderFont; + self.dropInContentView.cardFormSectionHeader.text = BTDropInLocalizedString(CARD_FORM_SECTION_HEADER); + + + // Call the setters explicitly + [self setCallToActionText:_callToActionText]; + [self setSummaryDescription:_summaryDescription]; + [self setSummaryTitle:_summaryTitle]; + [self setDisplayAmount:_displayAmount]; + [self setShouldHideCallToAction:_shouldHideCallToAction]; + + [self.dropInContentView setNeedsUpdateConstraints]; + + // Add Subviews + [self.view addSubview:self.scrollView]; + [self.scrollView addSubview:self.dropInContentView]; + + // Add initial constraints + [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[scrollView]|" + options:0 + metrics:nil + views:@{@"scrollView": self.scrollView}]]; + [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[scrollView]|" + options:0 + metrics:nil + views:@{@"scrollView": self.scrollView}]]; + + [self.scrollView addConstraint:[NSLayoutConstraint constraintWithItem:self.dropInContentView + attribute:NSLayoutAttributeWidth + relatedBy:NSLayoutRelationEqual + toItem:self.scrollView + attribute:NSLayoutAttributeWidth + multiplier:1 + constant:0]]; + + [self.scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[dropInContentView]|" + options:0 + metrics:nil + views:@{@"dropInContentView": self.dropInContentView}]]; + + [self.scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[dropInContentView]|" + options:0 + metrics:nil + views:@{@"dropInContentView": self.dropInContentView}]]; + + if (!self.fullForm) { + self.dropInContentView.state = BTDropInContentViewStateForm; + } + + [self updateValidity]; +} + +- (void)viewWillAppear:(BOOL)animated { + [super viewWillAppear:animated]; + self.visible = YES; + self.visibleStartTime = [NSDate timeIntervalSinceReferenceDate]; + + // Ensure dropInContentView is visible. See viewWillDisappear below + self.dropInContentView.alpha = 1.0f; + + if (self.fullForm) { + [self.client postAnalyticsEvent:@"dropin.ios.appear"]; + } +} + +- (void)viewWillDisappear:(BOOL)animated { + [super viewWillDisappear:animated]; + + // Quickly fade out the content view to prevent a jarring effect + // as keyboard dimisses. + [UIView animateWithDuration:self.theme.quickTransitionDuration animations:^{ + self.dropInContentView.alpha = 0.0f; + }]; + if (self.fullForm) { + [self.client postAnalyticsEvent:@"dropin.ios.disappear"]; + } +} + +- (void)viewDidDisappear:(BOOL)animated { + [super viewDidDisappear:animated]; + self.visible = NO; +} + +#pragma mark - BTUIScrollViewScrollRectToVisibleDelegate implementation + +// Delegate implementation to handle "custom" autoscrolling via the BTUIScrollView class +// +// Scroll priorities are: +// 1. Attempt to display the submit button, even if it means the card form title is not visible. +// 2. If that isn't possible, at least attempt to show the card form title. +// 3. If that fails, fail just do the default behavior (relevant in landscape). +// +// Some cleanup here could attempt to parameterize or make sane some of the magic number pixel nudging. +- (void)scrollView:(BTUIScrollView *)scrollView requestsScrollRectToVisible:(CGRect)rect animated:(BOOL)animated { + + CGRect targetRect = rect; + + CGRect desiredVisibleTopRect = [self.scrollView convertRect:self.dropInContentView.cardFormSectionHeader.frame fromView:self.dropInContentView]; + desiredVisibleTopRect.origin.y -= 7; + CGRect desiredVisibleBottomRect; + if (self.dropInContentView.ctaControl.hidden) { + desiredVisibleBottomRect = desiredVisibleTopRect; + } else { + desiredVisibleBottomRect = [self.scrollView convertRect:self.dropInContentView.ctaControl.frame fromView:self.dropInContentView]; + } + + CGFloat visibleAreaHeight = self.scrollView.frame.size.height - self.scrollView.contentInset.bottom - self.scrollView.contentInset.top; + + CGRect weightedBottomRect = CGRectUnion(targetRect, desiredVisibleBottomRect); + if (weightedBottomRect.size.height <= visibleAreaHeight) { + targetRect = weightedBottomRect; + } + + CGRect weightedTopRect = CGRectUnion(targetRect, desiredVisibleTopRect); + + if (weightedTopRect.size.height <= visibleAreaHeight) { + targetRect = weightedTopRect; + targetRect.size.height = MIN(visibleAreaHeight, CGRectGetMaxY(weightedBottomRect) - CGRectGetMinY(targetRect)); + } + + [scrollView defaultScrollRectToVisible:targetRect animated:animated]; +} + +#pragma mark - Keyboard behavior + +- (void)keyboardWillHide:(__unused NSNotification *)inputViewNotification { + UIEdgeInsets ei = UIEdgeInsetsMake(0.0, 0.0, 0.0, 0.0); + [UIView animateWithDuration:self.theme.transitionDuration animations:^{ + self.scrollView.scrollIndicatorInsets = ei; + self.scrollView.contentInset = ei; + }]; +} + +- (void)keyboardWillShow:(__unused NSNotification *)inputViewNotification { + CGRect inputViewFrame = [[[inputViewNotification userInfo] valueForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]; + CGRect inputViewFrameInView = [self.view convertRect:inputViewFrame fromView:nil]; + CGRect intersection = CGRectIntersection(self.scrollView.frame, inputViewFrameInView); + UIEdgeInsets ei = UIEdgeInsetsMake(0.0, 0.0, intersection.size.height, 0.0); + self.scrollView.scrollIndicatorInsets = ei; + self.scrollView.contentInset = ei; +} + +#pragma mark - Handlers + +- (void)tappedChangePaymentMethod { + UIViewController *rootViewController; + if (self.paymentMethods.count == 1) { + rootViewController = self.addPaymentMethodDropInViewController; + } else { + BTDropInSelectPaymentMethodViewController *selectPaymentMethod = [[BTDropInSelectPaymentMethodViewController alloc] init]; + selectPaymentMethod.title = BTDropInLocalizedString(SELECT_PAYMENT_METHOD_TITLE); + selectPaymentMethod.theme = self.theme; + selectPaymentMethod.paymentMethods = self.paymentMethods; + selectPaymentMethod.selectedPaymentMethodIndex = self.selectedPaymentMethodIndex; + selectPaymentMethod.delegate = self; + selectPaymentMethod.client = self.client; + rootViewController = selectPaymentMethod; + } + rootViewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel + target:self + action:@selector(didCancelChangePaymentMethod)]; + + UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:rootViewController]; + [self presentViewController:navController animated:YES completion:nil]; +} + +- (void)tappedSubmitForm { + [self showLoadingState:YES]; + + BTPaymentMethod *paymentMethod = [self selectedPaymentMethod]; + if (paymentMethod != nil) { + [self showLoadingState:NO]; + [self informDelegateWillComplete]; + [self informDelegateDidAddPaymentMethod:paymentMethod]; + } else if (!self.dropInContentView.cardForm.hidden) { + BTUICardFormView *cardForm = self.dropInContentView.cardForm; + + BTClient *client = [self.client copyWithMetadata:^(BTClientMutableMetadata *metadata) { + metadata.source = BTClientMetadataSourceForm; + }]; + + if (cardForm.valid) { + [self informDelegateWillComplete]; + + BTClientCardRequest *request = [[BTClientCardRequest alloc] init]; + request.number = cardForm.number; + request.expirationMonth = cardForm.expirationMonth; + request.expirationYear = cardForm.expirationYear; + request.cvv = cardForm.cvv; + request.postalCode = cardForm.postalCode; + request.shouldValidate = YES; + + [client postAnalyticsEvent:@"dropin.ios.add-card.save"]; + [client saveCardWithRequest:request + success:^(BTCardPaymentMethod *card) { + [client postAnalyticsEvent:@"dropin.ios.add-card.success"]; + [self showLoadingState:NO]; + [self informDelegateDidAddPaymentMethod:card]; + } + failure:^(NSError *error) { + [self showLoadingState:NO]; + [client postAnalyticsEvent:@"dropin.ios.add-card.failed"]; + if ([error.domain isEqualToString:BTBraintreeAPIErrorDomain] && error.code == BTCustomerInputErrorInvalid) { + [self informUserDidFailWithError:error]; + } + }]; + } else { + NSString *localizedAlertTitle = BTDropInLocalizedString(ERROR_SAVING_CARD_ALERT_TITLE); + NSString *localizedAlertMessage = BTDropInLocalizedString(ERROR_SAVING_CARD_MESSAGE); + BTDropInErrorAlert *alert = [[BTDropInErrorAlert alloc] initWithCancel:nil retry:nil]; + alert.title = localizedAlertTitle; + alert.message = localizedAlertMessage; + [alert show]; + } + } +} + +- (void)didCancelChangePaymentMethod { + [self dismissViewControllerAnimated:YES completion:nil]; +} + +#pragma mark Progress UI + +- (void)showLoadingState:(BOOL)loadingState { + [self.dropInContentView.ctaControl showLoadingState:loadingState]; + self.submitBarButtonItem.enabled = !loadingState; + if (self.submitBarButtonItem != nil) { + [BTUI activityIndicatorViewStyleForBarTintColor:self.navigationController.navigationBar.barTintColor]; + UIActivityIndicatorView *submitInProgressActivityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite]; + [submitInProgressActivityIndicator startAnimating]; + UIBarButtonItem *submitInProgressActivityIndicatorBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:submitInProgressActivityIndicator]; + [self.navigationItem setRightBarButtonItem:(loadingState ? submitInProgressActivityIndicatorBarButtonItem : self.submitBarButtonItem) animated:YES]; + } +} + +#pragma mark Error UI + +- (void)informUserDidFailWithError:(__unused NSError *)error { + BTDropInErrorState *state = [[BTDropInErrorState alloc] initWithError:error]; + + [self.dropInContentView.cardForm showTopLevelError:state.errorTitle]; + for (NSNumber *fieldNumber in state.highlightedFields) { + BTUICardFormField field = [fieldNumber unsignedIntegerValue]; + [self.dropInContentView.cardForm showErrorForField:field]; + } +} + +#pragma mark Card Form Delegate methods + +- (void)cardFormViewDidChange:(__unused BTUICardFormView *)cardFormView { + + if (!self.cardEntryDidBegin) { + [self.client postAnalyticsEvent:@"dropin.ios.add-card.start"]; + self.cardEntryDidBegin = YES; + } + + [self updateValidity]; +} + +#pragma mark Drop In Select Payment Method Table View Controller Delegate methods + +- (void)selectPaymentMethodViewController:(BTDropInSelectPaymentMethodViewController *)viewController + didSelectPaymentMethodAtIndex:(NSUInteger)index { + self.selectedPaymentMethodIndex = index; + [viewController.navigationController dismissViewControllerAnimated:YES completion:nil]; +} + +- (void)selectPaymentMethodViewControllerDidRequestNew:(BTDropInSelectPaymentMethodViewController *)viewController { + [viewController.navigationController pushViewController:self.addPaymentMethodDropInViewController animated:YES]; +} + +#pragma mark BTDropInViewControllerDelegate implementation + +- (void)dropInViewController:(BTDropInViewController *)viewController didSucceedWithPaymentMethod:(BTPaymentMethod *)paymentMethod { + [viewController.navigationController dismissViewControllerAnimated:YES completion:nil]; + + NSMutableArray *newPaymentMethods = [NSMutableArray arrayWithArray:self.paymentMethods]; + [newPaymentMethods insertObject:paymentMethod atIndex:0]; + self.paymentMethods = newPaymentMethods; +} + +- (void)dropInViewControllerDidCancel:(BTDropInViewController *)viewController { + [viewController.navigationController dismissViewControllerAnimated:YES completion:nil]; +} + +#pragma mark BTPaymentMethodCreationDelegate + +- (void)paymentMethodCreator:(__unused id)sender requestsPresentationOfViewController:(UIViewController *)viewController { + // In order to modally present PayPal on top of a nested Drop In, we need to first dismiss the + // nested Drop In. Canceling will return to the outer Drop In. + if ([self presentedViewController]) { + BTDropInContentViewStateType originalState = self.dropInContentView.state; + self.dropInContentView.state = BTDropInContentViewStateActivity; + [self dismissViewControllerAnimated:YES completion:^{ + [self presentViewController:viewController animated:YES completion:^{ + self.dropInContentView.state = originalState; + }]; + }]; + } else { + [self presentViewController:viewController animated:YES completion:nil]; + } +} + +- (void)paymentMethodCreator:(__unused id)sender requestsDismissalOfViewController:(__unused UIViewController *)viewController { + [self dismissViewControllerAnimated:YES completion:nil]; +} + +- (void)paymentMethodCreatorWillPerformAppSwitch:(__unused id)sender { + // If there is a presented view controller, dismiss it before app switch + // so that the result of the app switch can be shown in this view controller. + if ([self presentedViewController]) { + [self dismissViewControllerAnimated:YES completion:nil]; + } +} + +- (void)paymentMethodCreatorWillProcess:(__unused id)sender { + self.dropInContentView.state = BTDropInContentViewStateActivity; + + self.originalCoinbaseStoreInVault = [[BTCoinbase sharedCoinbase] storeInVault]; + [[BTCoinbase sharedCoinbase] setStoreInVault:YES]; +} + +- (void)paymentMethodCreator:(__unused id)sender didCreatePaymentMethod:(BTPaymentMethod *)paymentMethod { + [[BTCoinbase sharedCoinbase] setStoreInVault:self.originalCoinbaseStoreInVault]; + + NSMutableArray *newPaymentMethods = [NSMutableArray arrayWithArray:self.paymentMethods]; + [newPaymentMethods insertObject:paymentMethod atIndex:0]; + self.paymentMethods = newPaymentMethods; + + // Let the addPaymentMethodDropInViewController release + self.addPaymentMethodDropInViewController = nil; +} + +- (void)paymentMethodCreator:(id)sender didFailWithError:(NSError *)error { + [[BTCoinbase sharedCoinbase] setStoreInVault:self.originalCoinbaseStoreInVault]; + + NSString *savePaymentMethodErrorAlertTitle; + if ([error localizedDescription]) { + savePaymentMethodErrorAlertTitle = [error localizedDescription]; + } else { + savePaymentMethodErrorAlertTitle = BTDropInLocalizedString(ERROR_ALERT_CONNECTION_ERROR); + } + + if (sender != self.dropInContentView.paymentButton) { + + self.saveAccountErrorAlert = [[BTDropInErrorAlert alloc] initWithCancel:^{ + // Use the paymentMethods setter to update state + [self setPaymentMethods:_paymentMethods]; + self.saveAccountErrorAlert = nil; + } retry:nil]; + self.saveAccountErrorAlert.title = savePaymentMethodErrorAlertTitle; + [self.saveAccountErrorAlert show]; + } else { + self.saveAccountErrorAlert = [[BTDropInErrorAlert alloc] initWithCancel:^{ + // Use the paymentMethods setter to update state + [self setPaymentMethods:_paymentMethods]; + self.saveAccountErrorAlert = nil; + } retry:nil]; + self.saveAccountErrorAlert.title = savePaymentMethodErrorAlertTitle; + [self.saveAccountErrorAlert show]; + } + + // Let the addPaymentMethodDropInViewController release + self.addPaymentMethodDropInViewController = nil; +} + +- (void)paymentMethodCreatorDidCancel:(__unused id)sender { + [[BTCoinbase sharedCoinbase] setStoreInVault:self.originalCoinbaseStoreInVault]; + + // Refresh payment methods display + self.paymentMethods = self.paymentMethods; + + // Let the addPaymentMethodDropInViewController release + self.addPaymentMethodDropInViewController = nil; +} + +#pragma mark Delegate Notifications + +- (void)informDelegateWillComplete { + if ([self.delegate respondsToSelector:@selector(dropInViewControllerWillComplete:)]) { + [self.delegate dropInViewControllerWillComplete:self]; + } +} + +- (void)informDelegateDidAddPaymentMethod:(BTPaymentMethod *)paymentMethod { + if ([self.delegate respondsToSelector:@selector(dropInViewController:didSucceedWithPaymentMethod:)]) { + [self.delegate dropInViewController:self + didSucceedWithPaymentMethod:paymentMethod]; + } +} + +- (void)informDelegateDidCancel { + if ([self.delegate respondsToSelector:@selector(dropInViewControllerDidCancel:)]) { + [self.delegate dropInViewControllerDidCancel:self]; + } +} + +#pragma mark User Supplied Parameters + +- (void)setFullForm:(BOOL)fullForm { + _fullForm = fullForm; + if (!self.fullForm) { + self.dropInContentView.state = BTDropInContentViewStateForm; + + } +} + +- (void)setShouldHideCallToAction:(BOOL)shouldHideCallToAction { + _shouldHideCallToAction = shouldHideCallToAction; + self.dropInContentView.hideCTA = shouldHideCallToAction; + + self.submitBarButtonItem = shouldHideCallToAction ? [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemSave + target:self + action:@selector(tappedSubmitForm)] : nil; + self.submitBarButtonItem.style = UIBarButtonItemStyleDone; + self.navigationItem.rightBarButtonItem = self.submitBarButtonItem; +} + +- (void)setSummaryTitle:(NSString *)summaryTitle { + _summaryTitle = summaryTitle; + self.dropInContentView.summaryView.slug = summaryTitle; + self.dropInContentView.hideSummary = (self.summaryTitle == nil || self.summaryDescription == nil); +} + +- (void)setSummaryDescription:(__unused NSString *)summaryDescription { + _summaryDescription = summaryDescription; + self.dropInContentView.summaryView.summary = summaryDescription; + self.dropInContentView.hideSummary = (self.summaryTitle == nil || self.summaryDescription == nil); +} + +- (void)setDisplayAmount:(__unused NSString *)displayAmount { + _displayAmount = displayAmount; + self.dropInContentView.summaryView.amount = displayAmount; +} + +- (void)setCallToActionText:(__unused NSString *)callToActionText { + _callToActionText = callToActionText; + self.dropInContentView.ctaControl.callToAction = callToActionText; +} + +#pragma mark Data + +- (void)setPaymentMethods:(NSArray *)paymentMethods { + _paymentMethods = paymentMethods; + BTDropInContentViewStateType newState; + + if ([self.paymentMethods count] == 0) { + self.selectedPaymentMethodIndex = NSNotFound; + newState = BTDropInContentViewStateForm; + } else { + self.selectedPaymentMethodIndex = 0; + newState = BTDropInContentViewStatePaymentMethodsOnFile; + } + if (self.visible) { + NSTimeInterval elapsed = [NSDate timeIntervalSinceReferenceDate] - self.visibleStartTime; + if (elapsed < self.theme.minimumVisibilityTime) { + NSTimeInterval delay = self.theme.minimumVisibilityTime - elapsed; + + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delay * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + [self.dropInContentView setState:newState animate:YES]; + [self updateValidity]; + }); + return; + } + } + [self.dropInContentView setState:newState animate:self.visible]; + [self updateValidity]; +} + +- (void)setSelectedPaymentMethodIndex:(NSInteger)selectedPaymentMethodIndex { + _selectedPaymentMethodIndex = selectedPaymentMethodIndex; + if (selectedPaymentMethodIndex != NSNotFound) { + BTPaymentMethod *defaultPaymentMethod = [self selectedPaymentMethod]; + if ([defaultPaymentMethod isKindOfClass:[BTCardPaymentMethod class]]) { + BTUIPaymentMethodType uiPaymentMethodType = [BTDropInUtil uiForCardType:((BTCardPaymentMethod *)defaultPaymentMethod).type]; + self.dropInContentView.selectedPaymentMethodView.type = uiPaymentMethodType; + } else if ([defaultPaymentMethod isKindOfClass:[BTPayPalPaymentMethod class]]) { + self.dropInContentView.selectedPaymentMethodView.type = BTUIPaymentMethodTypePayPal; + } else if ([defaultPaymentMethod isKindOfClass:[BTCoinbasePaymentMethod class]]) { + self.dropInContentView.selectedPaymentMethodView.type = BTUIPaymentMethodTypeCoinbase; + } else { + self.dropInContentView.selectedPaymentMethodView.type = BTUIPaymentMethodTypeUnknown; + } + self.dropInContentView.selectedPaymentMethodView.detailDescription = defaultPaymentMethod.description; + } + [self updateValidity]; +} + +- (BTPaymentMethod *)selectedPaymentMethod { + return self.selectedPaymentMethodIndex != NSNotFound ? self.paymentMethods[self.selectedPaymentMethodIndex] : nil; +} + +- (void)updateValidity { + BTPaymentMethod *paymentMethod = [self selectedPaymentMethod]; + BOOL valid = (paymentMethod != nil) || (!self.dropInContentView.cardForm.hidden && self.dropInContentView.cardForm.valid); + + [self.navigationItem.rightBarButtonItem setEnabled:valid]; + [UIView animateWithDuration:self.theme.quickTransitionDuration animations:^{ + self.dropInContentView.ctaControl.enabled = valid; + }]; +} + +- (BTUICardFormOptionalFields)optionalFieldsFromClientToken { + NSSet *challenges = self.client.challenges; + + static NSString *cvvChallenge = @"cvv"; + static NSString *postalCodeChallenge = @"postal_code"; + + if ([challenges containsObject:cvvChallenge] && [challenges containsObject:postalCodeChallenge]) { + return BTUICardFormOptionalFieldsAll; + } else if ([challenges containsObject:cvvChallenge]) { + return BTUICardFormOptionalFieldsCvv; + } else if ([challenges containsObject:postalCodeChallenge]) { + return BTUICardFormOptionalFieldsPostalCode; + } else { + return BTUICardFormOptionalFieldsNone; + } +} + +- (void)fetchPaymentMethods { + BOOL networkActivityIndicatorState = [[UIApplication sharedApplication] isNetworkActivityIndicatorVisible]; + [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES]; + + [self.client fetchPaymentMethodsWithSuccess:^(NSArray *paymentMethods) { + [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:networkActivityIndicatorState]; + self.paymentMethods = paymentMethods; + } failure:^(__unused NSError *error) { + [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:networkActivityIndicatorState]; + + self.fetchPaymentMethodsErrorAlert = [[BTDropInErrorAlert alloc] initWithCancel:^{ + [self informDelegateDidCancel]; + self.fetchPaymentMethodsErrorAlert = nil; + } retry:^{ + [self fetchPaymentMethods]; + self.fetchPaymentMethodsErrorAlert = nil; + }]; + + [self.fetchPaymentMethodsErrorAlert show]; + }]; +} + +#pragma mark - Helpers + +- (BTDropInViewController *)addPaymentMethodDropInViewController { + if (!_addPaymentMethodDropInViewController) { + _addPaymentMethodDropInViewController = [[BTDropInViewController alloc] initWithClient:self.client]; + + _addPaymentMethodDropInViewController.title = BTDropInLocalizedString(ADD_PAYMENT_METHOD_VIEW_CONTROLLER_TITLE); + _addPaymentMethodDropInViewController.fullForm = NO; + _addPaymentMethodDropInViewController.shouldHideCallToAction = YES; + _addPaymentMethodDropInViewController.delegate = self; + _addPaymentMethodDropInViewController.dropInContentView.paymentButton.delegate = self; + } + return _addPaymentMethodDropInViewController; +} + +@end diff --git a/Pods/Braintree/Braintree/Drop-In/BTPaymentButton.h b/Pods/Braintree/Braintree/Drop-In/BTPaymentButton.h new file mode 100644 index 0000000..a927961 --- /dev/null +++ b/Pods/Braintree/Braintree/Drop-In/BTPaymentButton.h @@ -0,0 +1,22 @@ +#import + +#import "BTUIThemedView.h" + +@class BTClient, BTPaymentMethod; +@protocol BTPaymentMethodCreationDelegate; + +@interface BTPaymentButton : BTUIThemedView + +- (instancetype)initWithPaymentProviderTypes:(NSOrderedSet *)paymentAuthorizationTypes; +- (id)initWithFrame:(CGRect)frame; +- (id)initWithCoder:(NSCoder *)aDecoder; +- (id)init; + +@property (nonatomic, strong) NSOrderedSet *enabledPaymentProviderTypes; + +@property (nonatomic, strong) BTClient *client; +@property (nonatomic, weak) id delegate; + +@property (nonatomic, readonly) BOOL hasAvailablePaymentMethod; + +@end diff --git a/Pods/Braintree/Braintree/Drop-In/BTPaymentButton.m b/Pods/Braintree/Braintree/Drop-In/BTPaymentButton.m new file mode 100644 index 0000000..23eeee6 --- /dev/null +++ b/Pods/Braintree/Braintree/Drop-In/BTPaymentButton.m @@ -0,0 +1,330 @@ +#import "BTPaymentButton.h" + +#import "BTClient.h" +#import "BTLogger_Internal.h" +#import "BTUIVenmoButton.h" +#import "BTUIPayPalButton.h" +#import "BTUICoinbaseButton.h" + +#import "BTPaymentProvider.h" +#import "BTUIHorizontalButtonStackCollectionViewFlowLayout.h" +#import "BTUIPaymentButtonCollectionViewCell.h" + +NSString *BTPaymentButtonPaymentButtonCellIdentifier = @"BTPaymentButtonPaymentButtonCellIdentifier"; + +@interface BTPaymentButton () +@property (nonatomic, strong) UICollectionView *paymentButtonsCollectionView; +@property (nonatomic, strong) BTPaymentProvider *paymentProvider; + +@property (nonatomic, strong) UIView *topBorder; +@property (nonatomic, strong) UIView *bottomBorder; +@property (nonatomic, strong) NSOrderedSet *filteredEnabledPaymentProviderTypes; + +@end + +@implementation BTPaymentButton + +- (id)init { + self = [super init]; + return self; +} + +- (instancetype)initWithPaymentProviderTypes:(NSOrderedSet *)enabledPaymentProviderTypes { + self = [self init]; + if (self) { + [self setupViews]; + if (enabledPaymentProviderTypes) { + self.enabledPaymentProviderTypes = enabledPaymentProviderTypes; + } + } + return self; +} + +- (id)initWithFrame:(CGRect)frame +{ + self = [super initWithFrame:frame]; + if (self) { + [self setupViews]; + } + return self; +} + +- (id)initWithCoder:(NSCoder *)aDecoder { + self = [super initWithCoder:aDecoder]; + if (self) { + [self setupViews]; + } + return self; +} + +- (void)setupViews { + self.clipsToBounds = YES; + self.enabledPaymentProviderTypes = [NSOrderedSet orderedSetWithObjects: + @(BTPaymentProviderTypePayPal), + @(BTPaymentProviderTypeVenmo), + @(BTPaymentProviderTypeCoinbase), + nil]; + + BTUIHorizontalButtonStackCollectionViewFlowLayout *layout = [[BTUIHorizontalButtonStackCollectionViewFlowLayout alloc] init]; + layout.minimumInteritemSpacing = 0.0f; + + self.paymentButtonsCollectionView = [[UICollectionView alloc] initWithFrame:self.bounds + collectionViewLayout:layout]; + self.paymentButtonsCollectionView.accessibilityIdentifier = @"Payment Options"; + self.paymentButtonsCollectionView.translatesAutoresizingMaskIntoConstraints = NO; + self.paymentButtonsCollectionView.allowsSelection = YES; + self.paymentButtonsCollectionView.delaysContentTouches = NO; + self.paymentButtonsCollectionView.delegate = self; + self.paymentButtonsCollectionView.dataSource = self; + self.paymentButtonsCollectionView.backgroundColor = [UIColor grayColor]; + [self.paymentButtonsCollectionView registerClass:[BTUIPaymentButtonCollectionViewCell class] forCellWithReuseIdentifier:BTPaymentButtonPaymentButtonCellIdentifier]; + + self.topBorder = [[UIView alloc] init]; + self.topBorder.backgroundColor = [self.theme borderColor]; + self.topBorder.translatesAutoresizingMaskIntoConstraints = NO; + + self.bottomBorder = [[UIView alloc] init]; + self.bottomBorder.backgroundColor = [self.theme borderColor]; + self.bottomBorder.translatesAutoresizingMaskIntoConstraints = NO; + + [self addSubview:self.paymentButtonsCollectionView]; + [self addSubview:self.topBorder]; + [self addSubview:self.bottomBorder]; + + self.paymentProvider = [[BTPaymentProvider alloc] initWithClient:self.client]; + self.paymentProvider.delegate = self; +} + +- (CGSize)intrinsicContentSize { + CGFloat height = self.filteredEnabledPaymentProviderTypes.count > 0 ? 44 : 0; + + return CGSizeMake(UIViewNoIntrinsicMetric, height); +} + +- (void)layoutSubviews { + [super layoutSubviews]; + [self.paymentButtonsCollectionView.collectionViewLayout invalidateLayout]; +} + +- (void)updateConstraints { + NSDictionary *views = @{ @"paymentButtonsCollectionView": self.paymentButtonsCollectionView, + @"topBorder": self.topBorder, + @"bottomBorder": self.bottomBorder }; + NSDictionary *metrics = @{ @"borderWidth": @(self.theme.borderWidth) }; + + [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[paymentButtonsCollectionView]|" + options:0 + metrics:metrics + views:views]]; + [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[paymentButtonsCollectionView]|" + options:0 + metrics:metrics + views:views]]; + + [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[topBorder]|" + options:0 + metrics:metrics + views:views]]; + [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[topBorder(==borderWidth)]" + options:0 + metrics:metrics + views:views]]; + + [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[bottomBorder]|" + options:0 + metrics:metrics + views:views]]; + [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[bottomBorder(==borderWidth)]|" + options:0 + metrics:metrics + views:views]]; + + [super updateConstraints]; +} + +#pragma mark PaymentButton State + +- (void)setClient:(BTClient *)client { + _client = client; + self.paymentProvider.client = client; +} + +- (void)setEnabledPaymentProviderTypes:(NSOrderedSet *)enabledPaymentProviderTypes { + _enabledPaymentProviderTypes = enabledPaymentProviderTypes; + + [self invalidateIntrinsicContentSize]; + [self.paymentButtonsCollectionView reloadData]; +} + +- (NSOrderedSet *)filteredEnabledPaymentProviderTypes { + if (!_filteredEnabledPaymentProviderTypes) { + NSMutableOrderedSet *mutableProviderTypes = [self.enabledPaymentProviderTypes mutableCopy]; + + if (![self.paymentProvider canCreatePaymentMethodWithProviderType:BTPaymentProviderTypeVenmo]) { + [mutableProviderTypes removeObject:@(BTPaymentProviderTypeVenmo)]; + } + if (![self.paymentProvider canCreatePaymentMethodWithProviderType:BTPaymentProviderTypePayPal]) { + [mutableProviderTypes removeObject:@(BTPaymentProviderTypePayPal)]; + } + if (![self.paymentProvider canCreatePaymentMethodWithProviderType:BTPaymentProviderTypeCoinbase]) { + [mutableProviderTypes removeObject:@(BTPaymentProviderTypeCoinbase)]; + } + _filteredEnabledPaymentProviderTypes = [mutableProviderTypes copy]; + } + + return _filteredEnabledPaymentProviderTypes; +} + +- (BOOL)hasAvailablePaymentMethod { + return [self filteredEnabledPaymentProviderTypes].count > 0 ? YES : NO; +} + +- (BTPaymentProviderType)paymentProviderForIndexPath:(NSIndexPath *)indexPath { + NSInteger index = indexPath.row; + NSNumber *paymentProviderTypeNumber = self.filteredEnabledPaymentProviderTypes[index]; + return (BTPaymentProviderType)[paymentProviderTypeNumber integerValue]; +} + +#pragma mark UICollectionViewDataSource methods + +- (NSInteger)collectionView:(__unused UICollectionView *)collectionView numberOfItemsInSection:(__unused NSInteger)section { + NSParameterAssert(section == 0); + return [self.filteredEnabledPaymentProviderTypes count]; +} + +- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { + NSParameterAssert(indexPath.section == 0); + + BTUIPaymentButtonCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:BTPaymentButtonPaymentButtonCellIdentifier + forIndexPath:indexPath]; + BTPaymentProviderType paymentMethod = [self paymentProviderForIndexPath:indexPath]; + + UIControl *paymentButton; + switch (paymentMethod) { + case BTPaymentProviderTypePayPal: + paymentButton = [[BTUIPayPalButton alloc] initWithFrame:cell.bounds]; + break; + case BTPaymentProviderTypeVenmo: + paymentButton = [[BTUIVenmoButton alloc] initWithFrame:cell.bounds]; + break; + case BTPaymentProviderTypeCoinbase: + paymentButton = [[BTUICoinbaseButton alloc] initWithFrame:cell.bounds]; + break; + default: + [[BTLogger sharedLogger] warning:@"BTPaymentButton encountered an unexpected BTPaymentProviderType value: %@", @(paymentMethod)]; + return cell; + } + paymentButton.translatesAutoresizingMaskIntoConstraints = NO; + + cell.paymentButton = paymentButton; + + [cell.contentView addSubview:paymentButton]; + + NSDictionary *views = @{ @"paymentButton": paymentButton }; + [cell.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[paymentButton]|" + options:0 + metrics:nil + views:views]]; + [cell.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[paymentButton]|" + options:0 + metrics:nil + views:views]]; + return cell; +} + +- (void)collectionView:(__unused UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { + NSAssert(self.client, @"BTPaymentButton tapped without a BTClient instance. Please set a client on this payment button: myPaymentButton.client = (BTClient *)myClient;"); + + BTPaymentProviderType paymentMethod = [self paymentProviderForIndexPath:indexPath]; + + switch (paymentMethod) { + case BTPaymentProviderTypePayPal: + [self.paymentProvider createPaymentMethod:BTPaymentProviderTypePayPal]; + break; + case BTPaymentProviderTypeVenmo: + [self.paymentProvider createPaymentMethod:BTPaymentProviderTypeVenmo]; + break; + case BTPaymentProviderTypeCoinbase: + [self.paymentProvider createPaymentMethod:BTPaymentProviderTypeCoinbase]; + break; + default: + NSLog(@"BTPaymentButton collection view received didSelectItemAtIndexPath for unknown indexPath. This should never happen."); + break; + } +} + +#pragma mark Delegate informers + +- (void)informDelegateWillPerformAppSwitch { + if ([self.delegate respondsToSelector:@selector(paymentMethodCreatorWillPerformAppSwitch:)]) { + [self.delegate paymentMethodCreatorWillPerformAppSwitch:self]; + } +} + +- (void)informDelegateWillProcess { + if ([self.delegate respondsToSelector:@selector(paymentMethodCreatorWillProcess:)]) { + [self.delegate paymentMethodCreatorWillProcess:self]; + } +} + +- (void)informDelegateRequestsPresentationOfViewController:(UIViewController *)viewController { + if ([self.delegate respondsToSelector:@selector(paymentMethodCreator:requestsPresentationOfViewController:)]) { + [self.delegate paymentMethodCreator:self requestsPresentationOfViewController:viewController]; + } +} + +- (void)informDelegateRequestsDismissalOfViewController:(UIViewController *)viewController { + if ([self.delegate respondsToSelector:@selector(paymentMethodCreator:requestsDismissalOfViewController:)]) { + [self.delegate paymentMethodCreator:self requestsDismissalOfViewController:viewController]; + } +} + +- (void)informDelegateDidCreatePaymentMethod:(BTPaymentMethod *)paymentMethod { + if ([self.delegate respondsToSelector:@selector(paymentMethodCreator:didCreatePaymentMethod:)]) { + [self.delegate paymentMethodCreator:self didCreatePaymentMethod:paymentMethod]; + } +} + +- (void)informDelegateDidFailWithError:(NSError *)error { + if ([self.delegate respondsToSelector:@selector(paymentMethodCreator:didFailWithError:)]) { + [self.delegate paymentMethodCreator:self didFailWithError:error]; + } +} + +- (void)informDelegateDidCancel { + if ([self.delegate respondsToSelector:@selector(paymentMethodCreatorDidCancel:)]) { + [self.delegate paymentMethodCreatorDidCancel:self]; + } +} + +#pragma mark - BTPaymentProvider Delegate + +- (void)paymentMethodCreator:(__unused id)sender requestsPresentationOfViewController:(UIViewController *)viewController { + [self informDelegateRequestsPresentationOfViewController:viewController]; +} + +- (void)paymentMethodCreator:(__unused id)sender requestsDismissalOfViewController:(UIViewController *)viewController { + [self informDelegateRequestsDismissalOfViewController:viewController]; +} + +- (void)paymentMethodCreatorWillPerformAppSwitch:(__unused id)sender { + [self informDelegateWillPerformAppSwitch]; +} + +- (void)paymentMethodCreatorWillProcess:(__unused id)sender { + [self informDelegateWillProcess]; +} + +- (void)paymentMethodCreatorDidCancel:(__unused id)sender { + [self informDelegateDidCancel]; +} + +- (void)paymentMethodCreator:(__unused id)sender didCreatePaymentMethod:(BTPaymentMethod *)paymentMethod { + [self informDelegateDidCreatePaymentMethod:paymentMethod]; +} + +- (void)paymentMethodCreator:(__unused id)sender didFailWithError:(NSError *)error { + [self informDelegateDidFailWithError:error]; +} + +@end diff --git a/Pods/Braintree/Braintree/Drop-In/Localization/BTDropInLocalizedString.h b/Pods/Braintree/Braintree/Drop-In/Localization/BTDropInLocalizedString.h new file mode 100644 index 0000000..e06d103 --- /dev/null +++ b/Pods/Braintree/Braintree/Drop-In/Localization/BTDropInLocalizedString.h @@ -0,0 +1,21 @@ +#import + +#define BTDropInLocalizedString(KEY) [BTDropInLocalizedString KEY] + +@interface BTDropInLocalizedString : NSObject + ++ (NSString *)DROP_IN_CHANGE_PAYMENT_METHOD_BUTTON_TEXT; ++ (NSString *)ERROR_ALERT_OK_BUTTON_TEXT; ++ (NSString *)ERROR_ALERT_CANCEL_BUTTON_TEXT; ++ (NSString *)ERROR_ALERT_TRY_AGAIN_BUTTON_TEXT; ++ (NSString *)ERROR_ALERT_CONNECTION_ERROR; ++ (NSString *)DEFAULT_CALL_TO_ACTION; ++ (NSString *)CARD_FORM_SECTION_HEADER; ++ (NSString *)SELECT_PAYMENT_METHOD_TITLE; ++ (NSString *)ERROR_SAVING_CARD_ALERT_TITLE; ++ (NSString *)ERROR_SAVING_CARD_MESSAGE; ++ (NSString *)ERROR_SAVING_PAYMENT_METHOD_ALERT_TITLE; ++ (NSString *)ERROR_SAVING_PAYPAL_ACCOUNT_ALERT_MESSAGE; ++ (NSString *)ADD_PAYMENT_METHOD_VIEW_CONTROLLER_TITLE; + +@end diff --git a/Pods/Braintree/Braintree/Drop-In/Localization/BTDropInLocalizedString.m b/Pods/Braintree/Braintree/Drop-In/Localization/BTDropInLocalizedString.m new file mode 100644 index 0000000..83b1646 --- /dev/null +++ b/Pods/Braintree/Braintree/Drop-In/Localization/BTDropInLocalizedString.m @@ -0,0 +1,74 @@ +#import "BTDropInLocalizedString.h" + +@implementation BTDropInLocalizedString + ++ (NSBundle *)localizationBundle { + + static NSString * bundleName = @"Braintree-Drop-In-Localization"; + NSString *localizationBundlePath = [[NSBundle mainBundle] pathForResource:bundleName ofType:@"bundle"]; + if (!localizationBundlePath) { + localizationBundlePath = [[NSBundle bundleForClass:[self class]] pathForResource:bundleName ofType:@"bundle"]; + } + + return localizationBundlePath ? [NSBundle bundleWithPath:localizationBundlePath] : [NSBundle mainBundle]; +} + ++ (NSString *)localizationTable { + return @"Drop-In"; +} + ++ (NSString *)DROP_IN_CHANGE_PAYMENT_METHOD_BUTTON_TEXT { + return NSLocalizedStringWithDefaultValue(@"DROP_IN_CHANGE_PAYMENT_METHOD_BUTTON_TEXT", [self localizationTable], [self localizationBundle], @"Change payment method", @"Title text for button on Drop In with a selected payment method that allows user to choose a different payment method on file"); +} + ++ (NSString *)ERROR_ALERT_OK_BUTTON_TEXT { + return NSLocalizedStringWithDefaultValue(@"ERROR_ALERT_OK_BUTTON_TEXT", [self localizationTable], [self localizationBundle], @"OK", @"Button text to indicate acceptance of an alert condition"); +} + + ++ (NSString *)ERROR_ALERT_CANCEL_BUTTON_TEXT { + return NSLocalizedStringWithDefaultValue(@"ERROR_ALERT_CANCEL_BUTTON_TEXT", [self localizationTable], [self localizationBundle], @"Cancel", @"Button text to indicate acceptance of an alert condition"); +} + ++ (NSString *)ERROR_ALERT_TRY_AGAIN_BUTTON_TEXT { + return NSLocalizedStringWithDefaultValue(@"ERROR_ALERT_TRY_AGAIN_BUTTON_TEXT", [self localizationTable], [self localizationBundle], @"Try Again", @"Button text to request that an failed operation should be restarted and to try again"); +} + ++ (NSString *)ERROR_ALERT_CONNECTION_ERROR { + return NSLocalizedStringWithDefaultValue(@"ERROR_ALERT_CONNECTION_ERROR", [self localizationTable], [self localizationBundle], @"Connection Error", @"Vague title for alert view that ambiguously indicates an unspecified failure"); +} + ++ (NSString *)DEFAULT_CALL_TO_ACTION { + return NSLocalizedStringWithDefaultValue(@"DEFAULT_CALL_TO_ACTION", [self localizationTable], [self localizationBundle], @"Pay", @"Default text to display in Drop In view controller call to action (Submit button)"); +} + ++ (NSString *)CARD_FORM_SECTION_HEADER { + return NSLocalizedStringWithDefaultValue(@"CARD_FORM_SECTION_HEADER", [self localizationTable], [self localizationBundle], @"Pay with a card", @"Section header above card form in Drop In view controller"); +} + ++ (NSString *)SELECT_PAYMENT_METHOD_TITLE { + return NSLocalizedStringWithDefaultValue(@"SELECT_PAYMENT_METHOD_TITLE", [self localizationTable], [self localizationBundle], @"Payment Method", @"Title for select payment method view controller"); +} + ++ (NSString *)ERROR_SAVING_CARD_ALERT_TITLE{ + return NSLocalizedStringWithDefaultValue(@"ERROR_SAVING_CARD_ALERT_TITLE", [self localizationTable], [self localizationBundle], @"Error Saving Card", @"Title for alert view that is displayed when Drop In submission fails because there was an error saving the card"); +} + ++ (NSString *)ERROR_SAVING_CARD_MESSAGE { + return NSLocalizedStringWithDefaultValue(@"ERROR_SAVING_CARD_MESSAGE", [self localizationTable], [self localizationBundle], @"Please try again.", @"Message for alert view that is displayed when Drop In submission fails because there was an error saving the card"); +} + ++ (NSString *)ERROR_SAVING_PAYMENT_METHOD_ALERT_TITLE { + return NSLocalizedStringWithDefaultValue(@"ERROR_SAVING_PAYMENT_METHOD_ALERT_TITLE", [self localizationTable], [self localizationBundle], @"PayPal Error", @"Title for alert view that is displayed when Drop In submission fails because there was an error saving the PayPal account"); +} + + ++ (NSString *)ERROR_SAVING_PAYPAL_ACCOUNT_ALERT_MESSAGE { + return NSLocalizedStringWithDefaultValue(@"ERROR_SAVING_PAYPAL_ACCOUNT_ALERT_MESSAGE", [self localizationTable], [self localizationBundle], @"Please try again.", @"Message for alert view that is displayed when Drop In submission fails because there was an error saving the PayPal account"); +} + ++ (NSString *)ADD_PAYMENT_METHOD_VIEW_CONTROLLER_TITLE { + return NSLocalizedStringWithDefaultValue(@"ADD_PAYMENT_METHOD_VIEW_CONTROLLER_TITLE", [self localizationTable], [self localizationBundle], @"Add Payment Method", @"Title for view controller presented by Drop In to collect a new payment method when payment methods are already on file"); +} + +@end diff --git a/Pods/Braintree/Braintree/Drop-In/Localization/da.lproj/Drop-In.strings b/Pods/Braintree/Braintree/Drop-In/Localization/da.lproj/Drop-In.strings new file mode 100644 index 0000000..4c29707 Binary files /dev/null and b/Pods/Braintree/Braintree/Drop-In/Localization/da.lproj/Drop-In.strings differ diff --git a/Pods/Braintree/Braintree/Drop-In/Localization/de.lproj/Drop-In.strings b/Pods/Braintree/Braintree/Drop-In/Localization/de.lproj/Drop-In.strings new file mode 100644 index 0000000..fb374e0 Binary files /dev/null and b/Pods/Braintree/Braintree/Drop-In/Localization/de.lproj/Drop-In.strings differ diff --git a/Pods/Braintree/Braintree/Drop-In/Localization/en.lproj/Drop-In.strings b/Pods/Braintree/Braintree/Drop-In/Localization/en.lproj/Drop-In.strings new file mode 100644 index 0000000..9f87bef Binary files /dev/null and b/Pods/Braintree/Braintree/Drop-In/Localization/en.lproj/Drop-In.strings differ diff --git a/Pods/Braintree/Braintree/Drop-In/Localization/en_AU.lproj/Drop-In.strings b/Pods/Braintree/Braintree/Drop-In/Localization/en_AU.lproj/Drop-In.strings new file mode 100644 index 0000000..6831369 Binary files /dev/null and b/Pods/Braintree/Braintree/Drop-In/Localization/en_AU.lproj/Drop-In.strings differ diff --git a/Pods/Braintree/Braintree/Drop-In/Localization/en_CA.lproj/Drop-In.strings b/Pods/Braintree/Braintree/Drop-In/Localization/en_CA.lproj/Drop-In.strings new file mode 100644 index 0000000..9f87bef Binary files /dev/null and b/Pods/Braintree/Braintree/Drop-In/Localization/en_CA.lproj/Drop-In.strings differ diff --git a/Pods/Braintree/Braintree/Drop-In/Localization/en_GB.lproj/Drop-In.strings b/Pods/Braintree/Braintree/Drop-In/Localization/en_GB.lproj/Drop-In.strings new file mode 100644 index 0000000..66af1ca Binary files /dev/null and b/Pods/Braintree/Braintree/Drop-In/Localization/en_GB.lproj/Drop-In.strings differ diff --git a/Pods/Braintree/Braintree/Drop-In/Localization/es.lproj/Drop-In.strings b/Pods/Braintree/Braintree/Drop-In/Localization/es.lproj/Drop-In.strings new file mode 100644 index 0000000..d22ffec Binary files /dev/null and b/Pods/Braintree/Braintree/Drop-In/Localization/es.lproj/Drop-In.strings differ diff --git a/Pods/Braintree/Braintree/Drop-In/Localization/es_ES.lproj/Drop-In.strings b/Pods/Braintree/Braintree/Drop-In/Localization/es_ES.lproj/Drop-In.strings new file mode 100644 index 0000000..ef39242 Binary files /dev/null and b/Pods/Braintree/Braintree/Drop-In/Localization/es_ES.lproj/Drop-In.strings differ diff --git a/Pods/Braintree/Braintree/Drop-In/Localization/fr.lproj/Drop-In.strings b/Pods/Braintree/Braintree/Drop-In/Localization/fr.lproj/Drop-In.strings new file mode 100644 index 0000000..35a6078 Binary files /dev/null and b/Pods/Braintree/Braintree/Drop-In/Localization/fr.lproj/Drop-In.strings differ diff --git a/Pods/Braintree/Braintree/Drop-In/Localization/fr_CA.lproj/Drop-In.strings b/Pods/Braintree/Braintree/Drop-In/Localization/fr_CA.lproj/Drop-In.strings new file mode 100644 index 0000000..940077d Binary files /dev/null and b/Pods/Braintree/Braintree/Drop-In/Localization/fr_CA.lproj/Drop-In.strings differ diff --git a/Pods/Braintree/Braintree/Drop-In/Localization/fr_FR.lproj/Drop-In.strings b/Pods/Braintree/Braintree/Drop-In/Localization/fr_FR.lproj/Drop-In.strings new file mode 100644 index 0000000..f829499 Binary files /dev/null and b/Pods/Braintree/Braintree/Drop-In/Localization/fr_FR.lproj/Drop-In.strings differ diff --git a/Pods/Braintree/Braintree/Drop-In/Localization/he.lproj/Drop-In.strings b/Pods/Braintree/Braintree/Drop-In/Localization/he.lproj/Drop-In.strings new file mode 100644 index 0000000..da09d22 Binary files /dev/null and b/Pods/Braintree/Braintree/Drop-In/Localization/he.lproj/Drop-In.strings differ diff --git a/Pods/Braintree/Braintree/Drop-In/Localization/it.lproj/Drop-In.strings b/Pods/Braintree/Braintree/Drop-In/Localization/it.lproj/Drop-In.strings new file mode 100644 index 0000000..a95735c Binary files /dev/null and b/Pods/Braintree/Braintree/Drop-In/Localization/it.lproj/Drop-In.strings differ diff --git a/Pods/Braintree/Braintree/Drop-In/Localization/nb.lproj/Drop-In.strings b/Pods/Braintree/Braintree/Drop-In/Localization/nb.lproj/Drop-In.strings new file mode 100644 index 0000000..59665fb Binary files /dev/null and b/Pods/Braintree/Braintree/Drop-In/Localization/nb.lproj/Drop-In.strings differ diff --git a/Pods/Braintree/Braintree/Drop-In/Localization/nl.lproj/Drop-In.strings b/Pods/Braintree/Braintree/Drop-In/Localization/nl.lproj/Drop-In.strings new file mode 100644 index 0000000..cbfe53f Binary files /dev/null and b/Pods/Braintree/Braintree/Drop-In/Localization/nl.lproj/Drop-In.strings differ diff --git a/Pods/Braintree/Braintree/Drop-In/Localization/pl.lproj/Drop-In.strings b/Pods/Braintree/Braintree/Drop-In/Localization/pl.lproj/Drop-In.strings new file mode 100644 index 0000000..5c1c930 Binary files /dev/null and b/Pods/Braintree/Braintree/Drop-In/Localization/pl.lproj/Drop-In.strings differ diff --git a/Pods/Braintree/Braintree/Drop-In/Localization/pt.lproj/Drop-In.strings b/Pods/Braintree/Braintree/Drop-In/Localization/pt.lproj/Drop-In.strings new file mode 100644 index 0000000..b0d7302 Binary files /dev/null and b/Pods/Braintree/Braintree/Drop-In/Localization/pt.lproj/Drop-In.strings differ diff --git a/Pods/Braintree/Braintree/Drop-In/Localization/ru.lproj/Drop-In.strings b/Pods/Braintree/Braintree/Drop-In/Localization/ru.lproj/Drop-In.strings new file mode 100644 index 0000000..cfaf5d0 Binary files /dev/null and b/Pods/Braintree/Braintree/Drop-In/Localization/ru.lproj/Drop-In.strings differ diff --git a/Pods/Braintree/Braintree/Drop-In/Localization/sv.lproj/Drop-In.strings b/Pods/Braintree/Braintree/Drop-In/Localization/sv.lproj/Drop-In.strings new file mode 100644 index 0000000..0a6c7d7 Binary files /dev/null and b/Pods/Braintree/Braintree/Drop-In/Localization/sv.lproj/Drop-In.strings differ diff --git a/Pods/Braintree/Braintree/Drop-In/Localization/tr.lproj/Drop-In.strings b/Pods/Braintree/Braintree/Drop-In/Localization/tr.lproj/Drop-In.strings new file mode 100644 index 0000000..0a70112 Binary files /dev/null and b/Pods/Braintree/Braintree/Drop-In/Localization/tr.lproj/Drop-In.strings differ diff --git a/Pods/Braintree/Braintree/Drop-In/Localization/zh-Hans.lproj/Drop-In.strings b/Pods/Braintree/Braintree/Drop-In/Localization/zh-Hans.lproj/Drop-In.strings new file mode 100644 index 0000000..0527d28 Binary files /dev/null and b/Pods/Braintree/Braintree/Drop-In/Localization/zh-Hans.lproj/Drop-In.strings differ diff --git a/Pods/Braintree/Braintree/PayPal/@Public/BTClient+BTPayPal.h b/Pods/Braintree/Braintree/PayPal/@Public/BTClient+BTPayPal.h new file mode 100644 index 0000000..d2cf6be --- /dev/null +++ b/Pods/Braintree/Braintree/PayPal/@Public/BTClient+BTPayPal.h @@ -0,0 +1,25 @@ +#import "BTClient.h" + +@class PayPalProfileSharingViewController; +@class PayPalConfiguration; + +@protocol PayPalProfileSharingDelegate; + +extern NSString *const BTClientPayPalMobileEnvironmentName; + +/// Specify this additional scope in order to get the customer's billing address. +/// If this scope is set, the billingAddress property of the returned BTPayPalPaymentMethod should be populated with a BTPostalAddress. +extern NSString *const BTPayPalScopeAddress; + +@interface BTClient (BTPayPal) + ++ (NSString *)btPayPal_offlineTestClientToken; +- (BOOL)btPayPal_preparePayPalMobileWithError:(NSError * __autoreleasing *)error; +- (BOOL)btPayPal_isPayPalEnabled; +- (PayPalProfileSharingViewController *)btPayPal_profileSharingViewControllerWithDelegate:(id)delegate; +- (NSString *)btPayPal_applicationCorrelationId; +- (PayPalConfiguration *)btPayPal_configuration; +- (NSString *)btPayPal_environment; +- (BOOL)btPayPal_isTouchDisabled; +- (NSSet *)btPayPal_scopes; +@end diff --git a/Pods/Braintree/Braintree/PayPal/@Public/BTErrors+BTPayPal.h b/Pods/Braintree/Braintree/PayPal/@Public/BTErrors+BTPayPal.h new file mode 100644 index 0000000..377d0d4 --- /dev/null +++ b/Pods/Braintree/Braintree/PayPal/@Public/BTErrors+BTPayPal.h @@ -0,0 +1,15 @@ +#import "BTErrors.h" + +/// Braintree+PayPal NSError Domain +extern NSString *const BTBraintreePayPalErrorDomain; + +/// Errors codes +typedef NS_ENUM(NSInteger, BTPayPalErrorCode) { + BTPayPalUnknownError = 0, + BTMerchantIntegrationErrorPayPalConfiguration = 1, + + /// PayPal is disabled + BTPayPalErrorPayPalDisabled = 2, + + +}; diff --git a/Pods/Braintree/Braintree/PayPal/@Public/BTPayPalButton.h b/Pods/Braintree/Braintree/PayPal/@Public/BTPayPalButton.h new file mode 100644 index 0000000..91496e0 --- /dev/null +++ b/Pods/Braintree/Braintree/PayPal/@Public/BTPayPalButton.h @@ -0,0 +1,88 @@ +#import + +#import "Braintree-API.h" +#import "Braintree-Payments-UI.h" + +@protocol BTPayPalButtonDelegate; +@protocol BTPayPalButtonViewControllerPresenterDelegate; + +#pragma mark - + +/// A UIControl subclass for initiating a PayPal auth flow, and displaying the state of the user's PayPal auth. This view +/// is appropriate for adding to your checkout form as a *full-width* button. +/// +/// By default, tapping on this button will result in a `BTPayPalViewController` being presented by a heuristically +/// determined ViewController. If you need to customize this behavior, you can specify your own `BTPayPalButtonViewControllerPresenterDelegate`. +@interface BTPayPalButton : UIControl + +- (id)init DEPRECATED_MSG_ATTRIBUTE("Please use BTUIPayPalButton or BTPaymentButton. BTPayPalButton is deprecated."); +- (id)initWithFrame:(CGRect)frame DEPRECATED_MSG_ATTRIBUTE("Please use BTUIPayPalButton or BTPaymentButton. BTPayPalButton is deprecated."); +- (id)initWithCoder:(NSCoder *)aDecoder DEPRECATED_MSG_ATTRIBUTE("Please use BTUIPayPalButton or BTPaymentButton. BTPayPalButton is deprecated."); + +/// A delegate that is notified as the PayPal consent flow triggered by this button changes state. +@property (nonatomic, weak) id delegate; + +/// An optional delegate that is notified when the `BTPayPalButton` is requesting presentation of +/// a view controller that will manage PayPal authentication flow. +@property (nonatomic, weak) id presentationDelegate; + +/// Your initialized Braintree client. +/// +/// @see Braintree-API-iOS +@property (nonatomic, strong) BTClient *client; + +@property (nonatomic, strong) BTUI *theme; + +@end + +#pragma mark - + +/// Delegate protocol for receiving messages about state changes to a `BTPayPalButton` +/// +/// @see BTPayPalButton +@protocol BTPayPalButtonDelegate + +/// This message is sent when a payment method has been authorized and is available. +/// +/// @param button The requesting `BTPayPalButton` +/// @param paymentMethod The nonce representing proof of an authorized payment method +- (void)payPalButton:(BTPayPalButton *)button didCreatePayPalPaymentMethod:(BTPayPalPaymentMethod *)paymentMethod; + +/// This message is sent when the payment method could not be created. +/// +/// @param button The requesting `BTPayPalButton` +- (void)payPalButton:(BTPayPalButton *)button didFailWithError:(NSError *)error; + +@optional + +/// This message is sent when the user has authorized PayPal, and the payment method +/// is about to be created. +/// +/// @param button The requesting `BTPayPalButton` +- (void)payPalButtonWillCreatePayPalPaymentMethod:(BTPayPalButton *)button; + +- (void)payPalButtonDidCancel:(BTPayPalButton *)button; + +@end + +/// Delegate protocol for receiving request to present a view controller when the user taps the `BTPayPalButton` instance. +/// +/// @note Providing a custom implementation of this protocol to your `BTPayPalButton` is not required. +/// +/// @see BTPayPalButton +@protocol BTPayPalButtonViewControllerPresenterDelegate + +/// The button sends the delegate this message when it has prepared a `BTPayPalViewController`, which your implementation +/// should present to initiate the PayPal UI flow. +/// +/// @param button The requesting `BTPayPalButton` +/// @param viewController A configured view controller to be presented +- (void)payPalButton:(BTPayPalButton *)button requestsPresentationOfViewController:(UIViewController *)viewController; + +/// The button sends the delegate this message when its view controller is ready to be dismissed. +/// +/// @param button The requesting `BTPayPalButton` +/// @param viewController A configured view controller to be presented +- (void)payPalButton:(BTPayPalButton *)button requestsDismissalOfViewController:(UIViewController *)viewController; + +@end diff --git a/Pods/Braintree/Braintree/PayPal/@Public/BTPayPalViewController.h b/Pods/Braintree/Braintree/PayPal/@Public/BTPayPalViewController.h new file mode 100644 index 0000000..dceff4d --- /dev/null +++ b/Pods/Braintree/Braintree/PayPal/@Public/BTPayPalViewController.h @@ -0,0 +1,65 @@ +#import + +#import "Braintree-API.h" + +@protocol BTPayPalViewControllerDelegate; + +/// A View Controller that encapsulates the PayPal user authentication and consent flows +/// in order to obtain a Braintree payment method nonce. +/// +/// In the simple case, you should use BTPayPalButton, which will initialize and manage its own +/// BTPayPalViewController instance. This class is only necessary if you want to implement +/// your own button to trigger the Braintree PayPal flow. +@interface BTPayPalViewController : UIViewController + +/// A delegate that should be notified as the PayPal consent flow changes state. +@property (nonatomic, weak) id delegate; + +/// Your initialized Braintree client. +/// +/// @see Braintree-API-iOS +@property (nonatomic, strong) BTClient *client; + +/// Initialize a `BTPayPalViewController` with a preset BTClient +/// +/// @param client Client to retain as the new instance's client +/// @see client +/// +/// @return A new BTPayPalViewController instance +- (instancetype)initWithClient:(BTClient *)client; + +@end + +/// Delegate protocol for receiving results from a BTPayPalViewController +@protocol BTPayPalViewControllerDelegate + +@optional + +/// The user has completed his or her interaction with the PayPal UI. The View Controller will now attempt +/// to create a PayPal account payment method with a nonce. +/// +/// You can implement this in order to dismiss the PayPal View Controller before a definitive +/// success (i.e. nonce) or error (i.e. failure to create a nonce) occurs. +/// +/// @param viewController The `BTPayPalViewController` that will create the nonce. +- (void)payPalViewControllerWillCreatePayPalPaymentMethod:(BTPayPalViewController *)viewController; + +/// The PayPal View Controller will send this message when the PayPal consent flow is complete and a payment method +/// has been created. You can send its nonce value to your server for creating a transaction, subscription, etc. +/// +/// @param viewController The `BTPayPalViewController` that did create the nonce +/// @param payPalPaymentMethod PayPal account payment method that contains a nonce +- (void)payPalViewController:(BTPayPalViewController *)viewController didCreatePayPalPaymentMethod:(BTPayPalPaymentMethod *)payPalPaymentMethod; + +/// The PayPal View Controller will send this message when a nonce could not be created. +/// +/// @param viewController The `BTPayPalViewController` that failed +/// @param error The `BTClient` error that caused the failure. +- (void)payPalViewController:(BTPayPalViewController *)viewController didFailWithError:(NSError *)error; + +/// The user requested to cancel the PayPal consent flow. +/// +/// @param viewController The `BTPayPalViewController` that was cancelled +- (void)payPalViewControllerDidCancel:(BTPayPalViewController *)viewController; + +@end diff --git a/Pods/Braintree/Braintree/PayPal/@Public/Braintree-PayPal.h b/Pods/Braintree/Braintree/PayPal/@Public/Braintree-PayPal.h new file mode 100644 index 0000000..0827a63 --- /dev/null +++ b/Pods/Braintree/Braintree/PayPal/@Public/Braintree-PayPal.h @@ -0,0 +1,6 @@ +/// All-in-one import for the Braintree PayPal SDK + +#import +#import +#import +#import diff --git a/Pods/Braintree/Braintree/PayPal/BTErrors+BTPayPal.m b/Pods/Braintree/Braintree/PayPal/BTErrors+BTPayPal.m new file mode 100644 index 0000000..1692df9 --- /dev/null +++ b/Pods/Braintree/Braintree/PayPal/BTErrors+BTPayPal.m @@ -0,0 +1,3 @@ +#import "BTErrors+BTPayPal.h" + +NSString *const BTBraintreePayPalErrorDomain = @"BTBraintreePaypalErrorDomain"; diff --git a/Pods/Braintree/Braintree/PayPal/BTPayPalAppSwitchHandler.h b/Pods/Braintree/Braintree/PayPal/BTPayPalAppSwitchHandler.h new file mode 100644 index 0000000..19816d8 --- /dev/null +++ b/Pods/Braintree/Braintree/PayPal/BTPayPalAppSwitchHandler.h @@ -0,0 +1,10 @@ +#import +#import "BTAppSwitching.h" +#import "BTAppSwitchErrors.h" +#import "BTErrors+BTPayPal.h" + +@interface BTPayPalAppSwitchHandler : NSObject + ++ (instancetype)sharedHandler; + +@end diff --git a/Pods/Braintree/Braintree/PayPal/BTPayPalAppSwitchHandler.m b/Pods/Braintree/Braintree/PayPal/BTPayPalAppSwitchHandler.m new file mode 100644 index 0000000..dc8e8f8 --- /dev/null +++ b/Pods/Braintree/Braintree/PayPal/BTPayPalAppSwitchHandler.m @@ -0,0 +1,238 @@ +#import "BTPayPalAppSwitchHandler_Internal.h" + +#import "BTAppSwitch.h" +#import "BTClient_Internal.h" +#import "BTClient+BTPayPal.h" +#import "BTMutablePayPalPaymentMethod.h" +#import "BTLogger_Internal.h" +#import "BTErrors+BTPayPal.h" + +#import "PayPalMobile.h" +#import "PayPalTouch.h" + +@implementation BTPayPalAppSwitchHandler + +@synthesize returnURLScheme; +@synthesize delegate; + ++ (void)load { + if (self == [BTPayPalAppSwitchHandler class]) { + [[BTAppSwitch sharedInstance] addAppSwitching:[BTPayPalAppSwitchHandler sharedHandler] forApp:BTAppTypePayPal]; + } +} + ++ (instancetype)sharedHandler { + static BTPayPalAppSwitchHandler *instance; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + instance = [[BTPayPalAppSwitchHandler alloc] init]; + }); + return instance; +} + +- (BOOL)canHandleReturnURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication { + if (self.client == nil || self.delegate == nil) { + [self.client postAnalyticsEvent:@"ios.paypal.appswitch.can-handle.invalid"]; + return NO; + } + + if (![url.scheme isEqualToString:self.returnURLScheme]) { + [self.client postAnalyticsEvent:@"ios.paypal.appswitch.can-handle.different-scheme"]; + return NO; + } + + if (![PayPalTouch canHandleURL:url sourceApplication:sourceApplication]) { + [self.client postAnalyticsEvent:@"ios.paypal.appswitch.can-handle.paypal-cannot-handle"]; + return NO; + } + return YES; +} + +- (void)handleReturnURL:(NSURL *)url { + PayPalTouchResult *result = [PayPalTouch parseAppSwitchURL:url]; + NSString *code; + switch (result.resultType) { + case PayPalTouchResultTypeError: { + [self.client postAnalyticsEvent:@"ios.paypal.appswitch.handle.error"]; + NSError *error = [NSError errorWithDomain:BTBraintreePayPalErrorDomain code:BTPayPalUnknownError userInfo:nil]; + [self informDelegateDidFailWithError:error]; + return; + } + case PayPalTouchResultTypeCancel: + [self.client postAnalyticsEvent:@"ios.paypal.appswitch.handle.cancel"]; + if (result.error) { + [self.client postAnalyticsEvent:@"ios.paypal.appswitch.handle.cancel-error"]; + [[BTLogger sharedLogger] error:@"PayPal Wallet error: %@", result.error]; + } + [self informDelegateDidCancel]; + return; + case PayPalTouchResultTypeSuccess: + code = result.authorization[@"response"][@"code"]; + break; + } + + if (!code) { + NSError *error = [NSError errorWithDomain:BTBraintreePayPalErrorDomain code:BTPayPalUnknownError userInfo:@{NSLocalizedDescriptionKey: @"Auth code not found in PayPal Touch app switch response" }]; + [self.client postAnalyticsEvent:@"ios.paypal.appswitch.handle.code-error"]; + [self informDelegateDidFailWithError:error]; + return; + } + + [self.client postAnalyticsEvent:@"ios.paypal.appswitch.handle.authorized"]; + + [self informDelegateWillCreatePayPalPaymentMethod]; + + [self.client savePaypalPaymentMethodWithAuthCode:code + applicationCorrelationID:[self.client btPayPal_applicationCorrelationId] + success:^(BTPayPalPaymentMethod *paypalPaymentMethod) { + NSString *userDisplayStringFromAppSwitchResponse = result.authorization[@"user"][@"display_string"]; + if (paypalPaymentMethod.email == nil && [userDisplayStringFromAppSwitchResponse isKindOfClass:[NSString class]]) { + BTMutablePayPalPaymentMethod *mutablePayPalPaymentMethod = [paypalPaymentMethod mutableCopy]; + mutablePayPalPaymentMethod.email = userDisplayStringFromAppSwitchResponse; + paypalPaymentMethod = mutablePayPalPaymentMethod; + } + [self.client postAnalyticsEvent:@"ios.paypal.appswitch.handle.success"]; + [self informDelegateDidCreatePayPalPaymentMethod:paypalPaymentMethod]; + } failure:^(NSError *error) { + [self.client postAnalyticsEvent:@"ios.paypal.appswitch.handle.client-failure"]; + [self informDelegateDidFailWithError:error]; + }]; + +} + +- (BOOL)initiateAppSwitchWithClient:(BTClient *)client delegate:(id)theDelegate error:(NSError *__autoreleasing *)error { + + client = [client copyWithMetadata:^(BTClientMutableMetadata *metadata) { + metadata.source = BTClientMetadataSourcePayPalApp; + }]; + + NSError *appSwitchError = [self appSwitchErrorForClient:client delegate:theDelegate]; + if (appSwitchError) { + BOOL analyticsEventPosted = NO; + if ([appSwitchError.domain isEqualToString:BTAppSwitchErrorDomain]) { + analyticsEventPosted = YES; + switch (appSwitchError.code) { + case BTAppSwitchErrorDisabled: + [client postAnalyticsEvent:@"ios.paypal.appswitch.initiate.error.app-switch-disabled"]; + break; + case BTAppSwitchErrorAppNotAvailable: + [client postAnalyticsEvent:@"ios.paypal.appswitch.initiate.error.unavailable"]; + break; + case BTAppSwitchErrorIntegrationReturnURLScheme: + [client postAnalyticsEvent:@"ios.paypal.appswitch.initiate.error.invalid.return-url-scheme"]; + break; + case BTAppSwitchErrorIntegrationInvalidParameters: + [client postAnalyticsEvent:@"ios.paypal.appswitch.initiate.error.invalid.parameters"]; + break; + default: + analyticsEventPosted = NO; + break; + } + } else if ([appSwitchError.domain isEqualToString:BTBraintreePayPalErrorDomain] && appSwitchError.code == BTPayPalErrorPayPalDisabled) { + [client postAnalyticsEvent:@"ios.paypal.appswitch.initiate.error.disabled"]; + analyticsEventPosted = YES; + } + if (!analyticsEventPosted) { + [client postAnalyticsEvent:@"ios.paypal.appswitch.initiate.error.unrecognized-error"]; + } + if (error) { + *error = appSwitchError; + } + return NO; + } + + self.delegate = theDelegate; + self.client = client; + + PayPalConfiguration *configuration = client.btPayPal_configuration; + configuration.callbackURLScheme = self.returnURLScheme; + + BOOL payPalTouchDidAuthorize = [PayPalTouch authorizeScopeValues:self.client.btPayPal_scopes configuration:configuration]; + if (payPalTouchDidAuthorize) { + [self.client postAnalyticsEvent:@"ios.paypal.appswitch.initiate.success"]; + } else { + // Until 3.8.2, this event was "ios.paypal.appswitch.initiate.error.failed" and returned NO + [self.client postAnalyticsEvent:@"ios.paypal.appswitch.initiate.possible-error"]; + } + // Work around an iOS bug that causes -openURL: to return NO after a new app is installed + return YES; +} + +- (BOOL)appSwitchAvailableForClient:(BTClient *)client { + return [self appSwitchErrorForClient:client] == nil; +} + +- (NSError *)appSwitchErrorForClient:(BTClient *)client delegate:(id)theDelegate { + if (theDelegate == nil) { + return [NSError errorWithDomain:BTAppSwitchErrorDomain + code:BTAppSwitchErrorIntegrationInvalidParameters + userInfo:@{ NSLocalizedDescriptionKey: @"PayPal app switch is missing a delegate." }]; + } + return [self appSwitchErrorForClient:client]; +} + +- (NSError *)appSwitchErrorForClient:(BTClient *)client { + if (client == nil) { + return [NSError errorWithDomain:BTAppSwitchErrorDomain + code:BTAppSwitchErrorIntegrationInvalidParameters + userInfo:@{ NSLocalizedDescriptionKey: @"PayPal app switch is missing a BTClient." }]; + } + + if (![client btPayPal_isPayPalEnabled]){ + return [NSError errorWithDomain:BTBraintreePayPalErrorDomain + code:BTPayPalErrorPayPalDisabled + userInfo:@{NSLocalizedDescriptionKey: @"PayPal is not enabled for this merchant."}]; + } + + if ([client btPayPal_isTouchDisabled]){ + return [NSError errorWithDomain:BTAppSwitchErrorDomain + code:BTAppSwitchErrorDisabled + userInfo:@{NSLocalizedDescriptionKey: @"PayPal app switch is not enabled."}]; + } + + if (self.returnURLScheme == nil) { + return [NSError errorWithDomain:BTAppSwitchErrorDomain + code:BTAppSwitchErrorIntegrationReturnURLScheme + userInfo:@{ NSLocalizedDescriptionKey: @"PayPal app switch is missing a returnURLScheme. See +[Braintree setReturnURLScheme:]." }]; + } + + if (![PayPalTouch canAppSwitchForUrlScheme:self.returnURLScheme]) { + NSString *errorMessage = [NSString stringWithFormat:@"Can not app switch to PayPal. Verify that the return URL scheme (%@) starts with this app's bundle id, and that the PayPal app is installed.", self.returnURLScheme]; + return [NSError errorWithDomain:BTAppSwitchErrorDomain + code:BTAppSwitchErrorAppNotAvailable + userInfo:@{ NSLocalizedDescriptionKey: errorMessage }]; + } + + + return nil; +} + + +#pragma mark Delegate Method Invocations + +- (void)informDelegateWillCreatePayPalPaymentMethod { + if ([self.delegate respondsToSelector:@selector(appSwitcherWillCreatePaymentMethod:)]) { + [self.delegate appSwitcherWillCreatePaymentMethod:self]; + } +} + +- (void)informDelegateDidCreatePayPalPaymentMethod:(BTPaymentMethod *)paymentMethod { + [self.delegate appSwitcher:self didCreatePaymentMethod:paymentMethod]; +} + +- (void)informDelegateDidFailWithError:(NSError *)error { + [self.delegate appSwitcher:self didFailWithError:error]; +} + +- (void)informDelegateDidFailWithErrorCode:(NSInteger)code localizedDescription:(NSString *)localizedDescription { + NSError *error = [NSError errorWithDomain:BTBraintreePayPalErrorDomain + code:code + userInfo:@{ NSLocalizedDescriptionKey:localizedDescription }]; + [self informDelegateDidFailWithError:error]; +} + +- (void)informDelegateDidCancel { + [self.delegate appSwitcherDidCancel:self]; +} + +@end diff --git a/Pods/Braintree/Braintree/PayPal/BTPayPalAppSwitchHandler_Internal.h b/Pods/Braintree/Braintree/PayPal/BTPayPalAppSwitchHandler_Internal.h new file mode 100644 index 0000000..66d4af8 --- /dev/null +++ b/Pods/Braintree/Braintree/PayPal/BTPayPalAppSwitchHandler_Internal.h @@ -0,0 +1,8 @@ +#import "BTPayPalAppSwitchHandler.h" +#import "BTAppSwitchErrors.h" + +@interface BTPayPalAppSwitchHandler () + +@property (nonatomic, strong, readwrite) BTClient *client; + +@end diff --git a/Pods/Braintree/Braintree/PayPal/BTPayPalButton.m b/Pods/Braintree/Braintree/PayPal/BTPayPalButton.m new file mode 100644 index 0000000..fe50077 --- /dev/null +++ b/Pods/Braintree/Braintree/PayPal/BTPayPalButton.m @@ -0,0 +1,237 @@ +#import "BTPayPalButton.h" + +#import "BTUIPaymentMethodView.h" +#import "BTPayPalViewController.h" +#import "BTPayPalHorizontalSignatureWhiteView.h" +#import "BTUI.h" +#import "BTLogger_Internal.h" + +@interface BTPayPalButton () +@property (nonatomic, strong) BTPayPalHorizontalSignatureWhiteView *payPalHorizontalSignatureView; +@property (nonatomic, strong) BTPayPalViewController *braintreePayPalViewController; +@end + +@implementation BTPayPalButton + +- (instancetype)init { + self = [super init]; + if (self != nil) { + [self setupViews]; + } + return self; +} + +- (instancetype)initWithFrame:(CGRect)frame { + self = [super initWithFrame:frame]; + if (self != nil) { + [self setupViews]; + } + return self; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder { + self = [super initWithCoder:aDecoder]; + if (self != nil) { + [self setupViews]; + } + return self; +} + +- (void)setupViews { + self.accessibilityLabel = @"PayPal"; + self.userInteractionEnabled = YES; + self.clipsToBounds = YES; + self.opaque = NO; + self.backgroundColor = [UIColor clearColor]; + + self.layer.borderWidth = 0.5f; + + self.payPalHorizontalSignatureView = [[BTPayPalHorizontalSignatureWhiteView alloc] init]; + [self.payPalHorizontalSignatureView setTranslatesAutoresizingMaskIntoConstraints:NO]; + self.payPalHorizontalSignatureView.userInteractionEnabled = NO; + + [self addSubview:self.payPalHorizontalSignatureView]; + + self.backgroundColor = [[BTUI braintreeTheme] payPalButtonBlue]; + self.layer.borderColor = [UIColor clearColor].CGColor; + + [self addConstraints:[self defaultConstraints]]; + + [self addTarget:self action:@selector(didReceiveTouch) forControlEvents:UIControlEventTouchUpInside]; +} + +- (void)didReceiveTouch { + if (self.client == nil) { + [[BTLogger sharedLogger] warning:@"BTPayPalButton tapped without a client. You must assign a BTClient to the the BTPayPalButton before it requests presents presentation of the PayPal view controller."]; + return; + } + + // Only allow presentation of one braintreePayPalViewController at a time. + if (self.braintreePayPalViewController == nil) { + self.userInteractionEnabled = NO; + self.braintreePayPalViewController = [[BTPayPalViewController alloc] initWithClient:self.client]; + self.braintreePayPalViewController.delegate = self; + [self requestPresentationOfViewController:self.braintreePayPalViewController]; + } +} + +- (id)presentationDelegate { + return _presentationDelegate ?: self; +} + +#pragma mark State Change Messages + +- (void)informDelegateDidCreatePayPalPaymentMethod:(BTPayPalPaymentMethod *)payPalPaymentMethod { + if ([self.delegate respondsToSelector:@selector(payPalButton:didCreatePayPalPaymentMethod:)]) { + [self.delegate payPalButton:self didCreatePayPalPaymentMethod:payPalPaymentMethod]; + } +} +- (void)informDelegateDidFailWithError:(NSError *)error { + if ([self.delegate respondsToSelector:@selector(payPalButton:didFailWithError:)]) { + [self.delegate payPalButton:self didFailWithError:error]; + } +} + +- (void)informDelegateWillCreatePayPalPaymentMethod { + if ([self.delegate respondsToSelector:@selector(payPalButtonWillCreatePayPalPaymentMethod:)]) { + [self.delegate payPalButtonWillCreatePayPalPaymentMethod:self]; + } +} + +#pragma mark Presentation Delegate Messages + +- (void)requestDismissalOfViewController:(UIViewController *)viewController { + if ([self.presentationDelegate respondsToSelector:@selector(payPalButton:requestsDismissalOfViewController:)]) { + [self.presentationDelegate payPalButton:self requestsDismissalOfViewController:viewController]; + } +} + +- (void)requestPresentationOfViewController:(UIViewController *)viewController { + if ([self.presentationDelegate respondsToSelector:@selector(payPalButton:requestsPresentationOfViewController:)]) { + [self.presentationDelegate payPalButton:self requestsPresentationOfViewController:viewController]; + } +} + +#pragma mark - UIControl methods + +- (void)setHighlighted:(BOOL)highlighted { + [UIView animateWithDuration:0.08f animations:^{ + self.backgroundColor = highlighted ? [[BTUI braintreeTheme] payPalButtonActiveBlue] : [[BTUI braintreeTheme] payPalButtonBlue]; + }]; +} + + +#pragma mark - BTPayPalViewControllerDelegate implementation + +- (void)payPalViewControllerWillCreatePayPalPaymentMethod:(BTPayPalViewController *)viewController { + [self requestDismissalOfViewController:viewController]; + [self informDelegateWillCreatePayPalPaymentMethod]; +} + +- (void)payPalViewController:(__unused BTPayPalViewController *)viewController didCreatePayPalPaymentMethod:(BTPayPalPaymentMethod *)payPalPaymentMethod { + self.userInteractionEnabled = YES; + self.braintreePayPalViewController = nil; + [self informDelegateDidCreatePayPalPaymentMethod:payPalPaymentMethod]; +} + +- (void)payPalViewController:(BTPayPalViewController *)viewController didFailWithError:(NSError *)error { + self.userInteractionEnabled = YES; + NSLog(@"PayPal view controller failed with error: %@", error); + self.braintreePayPalViewController = nil; + [self requestDismissalOfViewController:viewController]; + [self informDelegateDidFailWithError:error]; +} + +- (void)payPalViewControllerDidCancel:(BTPayPalViewController *)viewController { + self.userInteractionEnabled = YES; + self.braintreePayPalViewController = nil; + [self requestDismissalOfViewController:viewController]; +} + +#pragma mark - BTPayPalButtonViewControllerPresenterDelegate default implementation + +- (void)payPalButton:(__unused BTPayPalButton *)button requestsPresentationOfViewController:(UIViewController *)viewController { + [self.window.rootViewController presentViewController:viewController animated:YES completion:nil]; +} + +- (void)payPalButton:(__unused BTPayPalButton *)button requestsDismissalOfViewController:(UIViewController *)viewController { + [viewController dismissViewControllerAnimated:YES completion:nil]; +} + +#pragma mark Auto Layout Constraints + +- (NSArray *)defaultConstraints { + CGFloat BTPayPalButtonHorizontalSignatureWidth = 95.0f; + CGFloat BTPayPalButtonHorizontalSignatureHeight = 23.0f; + CGFloat BTPayPalButtonMinHeight = 40.0f; + CGFloat BTPayPalButtonMaxHeight = 60.0f; + CGFloat BTPayPalButtonMinWidth = 240.0f; + + NSDictionary *metrics = @{ @"minHeight": @(BTPayPalButtonMinHeight), + @"maxHeight": @(BTPayPalButtonMaxHeight), + @"required": @(UILayoutPriorityRequired), + @"minWidth": @(BTPayPalButtonMinWidth) }; + NSDictionary *views = @{ @"self": self, + @"payPalHorizontalSignatureView": self.payPalHorizontalSignatureView }; + + + NSMutableArray *constraints = [NSMutableArray arrayWithCapacity:6]; + // Signature centerY + [constraints addObject: + [NSLayoutConstraint constraintWithItem:self.payPalHorizontalSignatureView + attribute:NSLayoutAttributeCenterY + relatedBy:NSLayoutRelationEqual + toItem:self + attribute:NSLayoutAttributeCenterY + multiplier:1.0f + constant:0.0f]]; + + // Signature centerX + [constraints addObject: + [NSLayoutConstraint constraintWithItem:self.payPalHorizontalSignatureView + attribute:NSLayoutAttributeCenterX + relatedBy:NSLayoutRelationEqual + toItem:self + attribute:NSLayoutAttributeCenterX + multiplier:1.0f + constant:0.0f]]; + + // Signature width + [constraints addObject: + [NSLayoutConstraint constraintWithItem:self.payPalHorizontalSignatureView + attribute:NSLayoutAttributeWidth + relatedBy:NSLayoutRelationEqual + toItem:nil + attribute:NSLayoutAttributeNotAnAttribute + multiplier:1.0f + constant:BTPayPalButtonHorizontalSignatureWidth]]; + + // Signature height + [constraints addObject: + [NSLayoutConstraint constraintWithItem:self.payPalHorizontalSignatureView + attribute:NSLayoutAttributeHeight + relatedBy:NSLayoutRelationEqual + toItem:nil + attribute:NSLayoutAttributeNotAnAttribute + multiplier:1.0f + constant:BTPayPalButtonHorizontalSignatureHeight]]; + + [constraints addObjectsFromArray: + [NSLayoutConstraint constraintsWithVisualFormat:@"V:[self(>=minHeight@required,<=maxHeight@required)]" + options:0 + metrics:metrics + views:views]]; + + [constraints addObjectsFromArray: + [NSLayoutConstraint constraintsWithVisualFormat:@"H:[self(>=260@required)]" + options:0 + metrics:metrics + views:views]]; + return constraints; +} + +- (CGSize)intrinsicContentSize { + return CGSizeMake(320, UIViewNoIntrinsicMetric); +} + +@end diff --git a/Pods/Braintree/Braintree/PayPal/BTPayPalViewController.m b/Pods/Braintree/Braintree/PayPal/BTPayPalViewController.m new file mode 100644 index 0000000..a6527cb --- /dev/null +++ b/Pods/Braintree/Braintree/PayPal/BTPayPalViewController.m @@ -0,0 +1,132 @@ +#import "BTPayPalViewController_Internal.h" + +#import "BTClient+BTPayPal.h" +#import "BTClient_Internal.h" +#import "BTErrors+BTPayPal.h" + +#import "BTMutablePayPalPaymentMethod.h" + +@interface BTPayPalViewController () +@property (nonatomic, strong) NSError *failureError; +@property (nonatomic, strong) BTPayPalPaymentMethod *paymentMethod; +@end + +@implementation BTPayPalViewController + +- (instancetype)initWithClient:(BTClient *)client +{ + self = [self init]; + if (self) { + self.client = client; + } + return self; +} + +- (void)viewDidLoad +{ + [super viewDidLoad]; + + if (!self.payPalProfileSharingViewController) { + NSError *error; + [self.client btPayPal_preparePayPalMobileWithError:&error]; + if (error) { + if ([self.delegate respondsToSelector:@selector(payPalViewController:didFailWithError:)]) { + [self.delegate payPalViewController:self didFailWithError:error]; + } + self.view = nil; + return; + } + + self.payPalProfileSharingViewController = [self.client btPayPal_profileSharingViewControllerWithDelegate:self]; + if (!self.payPalProfileSharingViewController) { + if ([self.delegate respondsToSelector:@selector(payPalViewController:didFailWithError:)]) { + NSError *error = [NSError errorWithDomain:BTBraintreePayPalErrorDomain + code:BTMerchantIntegrationErrorPayPalConfiguration + userInfo:@{ NSLocalizedDescriptionKey: @"PayPalProfileSharingViewController could not be initialized. Perhaps client token did not contain a valid PayPal configuration. Please ensure that you have PayPal enabled and are including the configuration in your client token." }]; + [self.delegate payPalViewController:self didFailWithError:error]; + } + self.view = nil; + return; + } + } + + if (self.payPalProfileSharingViewController) { + [self addChildViewController:self.payPalProfileSharingViewController]; + [self.payPalProfileSharingViewController willMoveToParentViewController:self]; + [self.view addSubview:self.payPalProfileSharingViewController.view]; + [self.payPalProfileSharingViewController didMoveToParentViewController:self]; + } +} + +- (void)viewWillAppear:(BOOL)animated { + [super viewWillAppear:animated]; + [self.client postAnalyticsEvent:@"ios.paypal.viewcontroller.will-appear"]; +} + +#pragma mark - PayPalProfileSharingDelegate implementation + + +- (void)userDidCancelPayPalProfileSharingViewController:(__unused PayPalProfileSharingViewController *)profileSharingViewController { + [self.client postAnalyticsEvent:@"ios.paypal.viewcontroller.did-cancel"]; + if ([self.delegate respondsToSelector:@selector(payPalViewControllerDidCancel:)]) { + [self.delegate payPalViewControllerDidCancel:self]; + } +} + +- (void)payPalProfileSharingViewController:(__unused PayPalProfileSharingViewController *)profileSharingViewController + userWillLogInWithAuthorization:(NSDictionary *)profileSharingAuthorization + completionBlock:(PayPalProfileSharingDelegateCompletionBlock)completionBlock { + NSString *authCode = profileSharingAuthorization[@"response"][@"code"]; + + [self.client postAnalyticsEvent:@"ios.paypal.viewcontroller.will-log-in"]; + if (authCode == nil) { + self.failureError = [NSError errorWithDomain:BTBraintreePayPalErrorDomain code:BTPayPalUnknownError userInfo:@{NSLocalizedDescriptionKey: @"PayPal flow failed to generate an auth code" }]; + completionBlock(); + } else { + if ([self.delegate respondsToSelector:@selector(payPalViewControllerWillCreatePayPalPaymentMethod:)]) { + [self.delegate payPalViewControllerWillCreatePayPalPaymentMethod:self]; + } + + BTClient *client = [self.client copyWithMetadata:^(BTClientMutableMetadata *metadata) { + metadata.source = BTClientMetadataSourcePayPalSDK; + }]; + + [client savePaypalPaymentMethodWithAuthCode:authCode + applicationCorrelationID:[client btPayPal_applicationCorrelationId] + success:^(BTPayPalPaymentMethod *paypalPaymentMethod) { + NSString *userDisplayStringFromPayPalSDK = profileSharingAuthorization[@"user"][@"display_string"]; + if (paypalPaymentMethod.email == nil && [userDisplayStringFromPayPalSDK isKindOfClass:[NSString class]]) { + BTMutablePayPalPaymentMethod *mutablePayPalPaymentMethod = [paypalPaymentMethod mutableCopy]; + mutablePayPalPaymentMethod.email = userDisplayStringFromPayPalSDK; + if (!mutablePayPalPaymentMethod.description) { + mutablePayPalPaymentMethod.description = userDisplayStringFromPayPalSDK; + } + paypalPaymentMethod = mutablePayPalPaymentMethod; + } + self.paymentMethod = paypalPaymentMethod; + completionBlock(); + } failure:^(NSError *error) { + self.failureError = error; + completionBlock(); + }]; + } +} + +- (void)payPalProfileSharingViewController:(__unused PayPalProfileSharingViewController *)profileSharingViewController + userDidLogInWithAuthorization:(__unused NSDictionary *)profileSharingAuthorization { + + if (self.paymentMethod && !self.failureError) { + [self.client postAnalyticsEvent:@"ios.paypal.viewcontroller.success"]; + if ([self.delegate respondsToSelector:@selector(payPalViewController:didCreatePayPalPaymentMethod:)]) { + [self.delegate payPalViewController:self didCreatePayPalPaymentMethod:self.paymentMethod]; + } + } else { + [self.client postAnalyticsEvent:@"ios.paypal.viewcontroller.error"]; + if ([self.delegate respondsToSelector:@selector(payPalViewController:didFailWithError:)]) { + [self.delegate payPalViewController:self didFailWithError:self.failureError]; + } + } +} + + +@end diff --git a/Pods/Braintree/Braintree/PayPal/BTPayPalViewController_Internal.h b/Pods/Braintree/Braintree/PayPal/BTPayPalViewController_Internal.h new file mode 100644 index 0000000..ab159be --- /dev/null +++ b/Pods/Braintree/Braintree/PayPal/BTPayPalViewController_Internal.h @@ -0,0 +1,6 @@ +#import "BTPayPalViewController.h" +#import "PayPalMobile.h" + +@interface BTPayPalViewController () +@property (nonatomic, readwrite, strong) PayPalProfileSharingViewController *payPalProfileSharingViewController; +@end diff --git a/Pods/Braintree/Braintree/PayPal/Models/BTClient+BTPayPal.m b/Pods/Braintree/Braintree/PayPal/Models/BTClient+BTPayPal.m new file mode 100644 index 0000000..1f1ebe7 --- /dev/null +++ b/Pods/Braintree/Braintree/PayPal/Models/BTClient+BTPayPal.m @@ -0,0 +1,115 @@ +#import "BTClient+BTPayPal.h" +#import "BTErrors+BTPayPal.h" + +#import +#import "BTClient_Internal.h" +#import "BTClient+Offline.h" + +NSString *const BTClientPayPalMobileEnvironmentName = @"Braintree"; +NSString *const BTPayPalScopeAddress = @"address"; + +NSString *const BTClientPayPalConfigurationError = @"The PayPal SDK could not be initialized. Perhaps client token did not contain a valid PayPal configuration."; + +@implementation BTClient (BTPayPal) + ++ (NSString *)btPayPal_offlineTestClientToken { + NSDictionary *payPalClientTokenData = @{ BTConfigurationKeyPayPal: @{ + BTConfigurationKeyPayPalMerchantName: @"Offline Test Merchant", + BTConfigurationKeyPayPalClientId: @"paypal-client-id", + BTConfigurationKeyPayPalMerchantPrivacyPolicyUrl: @"http://example.com/privacy", + BTConfigurationKeyPayPalEnvironment: BTConfigurationPayPalEnvironmentOffline, + BTConfigurationKeyPayPalMerchantUserAgreementUrl: @"http://example.com/tos" } + }; + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + return [self offlineTestClientTokenWithAdditionalParameters:payPalClientTokenData]; +#pragma clang diagnostic pop +} + +- (BOOL)btPayPal_preparePayPalMobileWithError:(NSError * __autoreleasing *)error { + + if ([self.configuration.btPayPal_environment isEqualToString:BTConfigurationPayPalEnvironmentOffline]) { + [PayPalMobile initializeWithClientIdsForEnvironments:@{@"": @""}]; + [PayPalMobile preconnectWithEnvironment:PayPalEnvironmentNoNetwork]; + } else if ([self.configuration.btPayPal_environment isEqualToString: BTConfigurationPayPalEnvironmentLive]) { + [PayPalMobile initializeWithClientIdsForEnvironments:@{PayPalEnvironmentProduction: self.configuration.btPayPal_clientId}]; + [PayPalMobile preconnectWithEnvironment:PayPalEnvironmentProduction]; + } else if ([self.configuration.btPayPal_environment isEqualToString: BTConfigurationPayPalEnvironmentCustom]) { + if (self.configuration.btPayPal_directBaseURL == nil || self.configuration.btPayPal_clientId == nil) { + if (error) { + *error = [NSError errorWithDomain:BTBraintreePayPalErrorDomain + code:BTMerchantIntegrationErrorPayPalConfiguration + userInfo:@{ NSLocalizedDescriptionKey: BTClientPayPalConfigurationError }]; + return NO; + } + } else { + [PayPalMobile addEnvironments:@{ BTClientPayPalMobileEnvironmentName:@{ + @"api": [self.configuration.btPayPal_directBaseURL absoluteString] } }]; + [PayPalMobile initializeWithClientIdsForEnvironments:@{BTClientPayPalMobileEnvironmentName: self.configuration.btPayPal_clientId}]; + [PayPalMobile preconnectWithEnvironment:BTClientPayPalMobileEnvironmentName]; + } + } else { + if (error){ + *error = [NSError errorWithDomain:BTBraintreePayPalErrorDomain + code:BTMerchantIntegrationErrorPayPalConfiguration + userInfo:@{ NSLocalizedDescriptionKey: BTClientPayPalConfigurationError}]; + return NO; + } + } + + return YES; +} + +- (NSSet *)btPayPal_scopes { + NSSet *defaultScopes = [NSSet setWithObjects:kPayPalOAuth2ScopeFuturePayments, kPayPalOAuth2ScopeEmail, nil]; + if (self.additionalPayPalScopes != nil) { + return [self.additionalPayPalScopes setByAddingObjectsFromSet:defaultScopes]; + } + return defaultScopes; +} + +- (PayPalProfileSharingViewController *)btPayPal_profileSharingViewControllerWithDelegate:(id)delegate { + return [[PayPalProfileSharingViewController alloc] initWithScopeValues:self.btPayPal_scopes + configuration:self.btPayPal_configuration + delegate:delegate]; +} + +- (BOOL)btPayPal_isPayPalEnabled { + return self.configuration.btPayPal_isPayPalEnabled; +} + +- (NSString *)btPayPal_applicationCorrelationId { + NSString *payPalEnvironment = self.configuration.btPayPal_environment; + if (![payPalEnvironment isEqualToString:PayPalEnvironmentProduction] && ![payPalEnvironment isEqualToString:PayPalEnvironmentSandbox]) { + return nil; + } + + return [PayPalMobile clientMetadataID]; +} + +- (PayPalConfiguration *)btPayPal_configuration { + PayPalConfiguration *configuration = [PayPalConfiguration new]; + + if ([self.configuration.btPayPal_environment isEqualToString: BTConfigurationPayPalEnvironmentLive]) { + configuration.merchantName = self.configuration.btPayPal_merchantName; + configuration.merchantPrivacyPolicyURL = self.configuration.btPayPal_privacyPolicyURL; + configuration.merchantUserAgreementURL = self.configuration.btPayPal_merchantUserAgreementURL; + } else { + configuration.merchantName = self.configuration.btPayPal_merchantName ?: BTConfigurationPayPalNonLiveDefaultValueMerchantName; + configuration.merchantPrivacyPolicyURL = self.configuration.btPayPal_privacyPolicyURL ?: [NSURL URLWithString:BTConfigurationPayPalNonLiveDefaultValueMerchantPrivacyPolicyUrl]; + configuration.merchantUserAgreementURL = self.configuration.btPayPal_merchantUserAgreementURL ?: [NSURL URLWithString:BTConfigurationPayPalNonLiveDefaultValueMerchantUserAgreementUrl]; + } + + return configuration; +} + +- (NSString *)btPayPal_environment { + return [self.configuration.btPayPal_environment isEqualToString:BTConfigurationPayPalEnvironmentLive] ? PayPalEnvironmentProduction : BTClientPayPalMobileEnvironmentName; +} + +- (BOOL)btPayPal_isTouchDisabled { + return self.configuration.btPayPal_isTouchDisabled; +} + +@end diff --git a/Pods/Braintree/Braintree/PayPal/Views/BTPayPalHorizontalSignatureWhiteView.h b/Pods/Braintree/Braintree/PayPal/Views/BTPayPalHorizontalSignatureWhiteView.h new file mode 100644 index 0000000..36fb9f0 --- /dev/null +++ b/Pods/Braintree/Braintree/PayPal/Views/BTPayPalHorizontalSignatureWhiteView.h @@ -0,0 +1,6 @@ +#import +#import "BTUIVectorArtView.h" + +@interface BTPayPalHorizontalSignatureWhiteView : BTUIVectorArtView + +@end diff --git a/Pods/Braintree/Braintree/PayPal/Views/BTPayPalHorizontalSignatureWhiteView.m b/Pods/Braintree/Braintree/PayPal/Views/BTPayPalHorizontalSignatureWhiteView.m new file mode 100644 index 0000000..96196b8 --- /dev/null +++ b/Pods/Braintree/Braintree/PayPal/Views/BTPayPalHorizontalSignatureWhiteView.m @@ -0,0 +1,252 @@ +#import "BTPayPalHorizontalSignatureWhiteView.h" + +@implementation BTPayPalHorizontalSignatureWhiteView + +- (instancetype)init { + self = [super init]; + if (self) { + self.artDimensions = CGSizeMake(405, 99); + self.opaque = NO; + } + return self; +} + +- (void)drawArt +{ + //// Color Declarations + UIColor* color0 = [UIColor colorWithRed: 1 green: 1 blue: 1 alpha: 1]; + + //// Group + { + //// Group 2 + { + //// Group 3 + { + //// Bezier Drawing + UIBezierPath* bezierPath = [UIBezierPath bezierPath]; + [bezierPath moveToPoint: CGPointMake(311.63, 21.95)]; + [bezierPath addLineToPoint: CGPointMake(289.38, 21.95)]; + [bezierPath addCurveToPoint: CGPointMake(286.33, 24.56) controlPoint1: CGPointMake(287.86, 21.95) controlPoint2: CGPointMake(286.56, 23.06)]; + [bezierPath addLineToPoint: CGPointMake(277.33, 81.62)]; + [bezierPath addCurveToPoint: CGPointMake(279.16, 83.76) controlPoint1: CGPointMake(277.15, 82.74) controlPoint2: CGPointMake(278.02, 83.76)]; + [bezierPath addLineToPoint: CGPointMake(290.58, 83.76)]; + [bezierPath addCurveToPoint: CGPointMake(292.71, 81.93) controlPoint1: CGPointMake(291.64, 83.76) controlPoint2: CGPointMake(292.55, 82.99)]; + [bezierPath addLineToPoint: CGPointMake(295.27, 65.76)]; + [bezierPath addCurveToPoint: CGPointMake(298.32, 63.15) controlPoint1: CGPointMake(295.5, 64.26) controlPoint2: CGPointMake(296.8, 63.15)]; + [bezierPath addLineToPoint: CGPointMake(305.36, 63.15)]; + [bezierPath addCurveToPoint: CGPointMake(330.68, 42) controlPoint1: CGPointMake(320.01, 63.15) controlPoint2: CGPointMake(328.47, 56.06)]; + [bezierPath addCurveToPoint: CGPointMake(327.85, 27.64) controlPoint1: CGPointMake(331.68, 35.85) controlPoint2: CGPointMake(330.72, 31.02)]; + [bezierPath addCurveToPoint: CGPointMake(311.63, 21.95) controlPoint1: CGPointMake(324.68, 23.92) controlPoint2: CGPointMake(319.07, 21.95)]; + [bezierPath closePath]; + [bezierPath moveToPoint: CGPointMake(314.2, 42.79)]; + [bezierPath addCurveToPoint: CGPointMake(300.98, 50.78) controlPoint1: CGPointMake(312.98, 50.78) controlPoint2: CGPointMake(306.88, 50.78)]; + [bezierPath addLineToPoint: CGPointMake(297.62, 50.78)]; + [bezierPath addLineToPoint: CGPointMake(299.98, 35.87)]; + [bezierPath addCurveToPoint: CGPointMake(301.81, 34.3) controlPoint1: CGPointMake(300.12, 34.97) controlPoint2: CGPointMake(300.9, 34.3)]; + [bezierPath addLineToPoint: CGPointMake(303.35, 34.3)]; + [bezierPath addCurveToPoint: CGPointMake(313.11, 36.59) controlPoint1: CGPointMake(307.37, 34.3) controlPoint2: CGPointMake(311.16, 34.3)]; + [bezierPath addCurveToPoint: CGPointMake(314.2, 42.79) controlPoint1: CGPointMake(314.29, 37.96) controlPoint2: CGPointMake(314.64, 39.99)]; + [bezierPath closePath]; + bezierPath.miterLimit = 4; + + [color0 setFill]; + [bezierPath fill]; + + + //// Bezier 2 Drawing + UIBezierPath* bezier2Path = [UIBezierPath bezierPath]; + [bezier2Path moveToPoint: CGPointMake(152.93, 21.95)]; + [bezier2Path addLineToPoint: CGPointMake(130.68, 21.95)]; + [bezier2Path addCurveToPoint: CGPointMake(127.63, 24.56) controlPoint1: CGPointMake(129.16, 21.95) controlPoint2: CGPointMake(127.87, 23.06)]; + [bezier2Path addLineToPoint: CGPointMake(118.63, 81.62)]; + [bezier2Path addCurveToPoint: CGPointMake(120.46, 83.76) controlPoint1: CGPointMake(118.45, 82.74) controlPoint2: CGPointMake(119.32, 83.76)]; + [bezier2Path addLineToPoint: CGPointMake(131.09, 83.76)]; + [bezier2Path addCurveToPoint: CGPointMake(134.14, 81.15) controlPoint1: CGPointMake(132.61, 83.76) controlPoint2: CGPointMake(133.9, 82.65)]; + [bezier2Path addLineToPoint: CGPointMake(136.57, 65.76)]; + [bezier2Path addCurveToPoint: CGPointMake(139.62, 63.15) controlPoint1: CGPointMake(136.81, 64.26) controlPoint2: CGPointMake(138.1, 63.15)]; + [bezier2Path addLineToPoint: CGPointMake(146.66, 63.15)]; + [bezier2Path addCurveToPoint: CGPointMake(171.99, 42) controlPoint1: CGPointMake(161.32, 63.15) controlPoint2: CGPointMake(169.78, 56.06)]; + [bezier2Path addCurveToPoint: CGPointMake(169.15, 27.64) controlPoint1: CGPointMake(172.98, 35.85) controlPoint2: CGPointMake(172.03, 31.02)]; + [bezier2Path addCurveToPoint: CGPointMake(152.93, 21.95) controlPoint1: CGPointMake(165.98, 23.92) controlPoint2: CGPointMake(160.38, 21.95)]; + [bezier2Path closePath]; + [bezier2Path moveToPoint: CGPointMake(155.5, 42.79)]; + [bezier2Path addCurveToPoint: CGPointMake(142.28, 50.78) controlPoint1: CGPointMake(154.28, 50.78) controlPoint2: CGPointMake(148.18, 50.78)]; + [bezier2Path addLineToPoint: CGPointMake(138.93, 50.78)]; + [bezier2Path addLineToPoint: CGPointMake(141.28, 35.87)]; + [bezier2Path addCurveToPoint: CGPointMake(143.11, 34.3) controlPoint1: CGPointMake(141.43, 34.97) controlPoint2: CGPointMake(142.2, 34.3)]; + [bezier2Path addLineToPoint: CGPointMake(144.65, 34.3)]; + [bezier2Path addCurveToPoint: CGPointMake(154.42, 36.59) controlPoint1: CGPointMake(148.67, 34.3) controlPoint2: CGPointMake(152.46, 34.3)]; + [bezier2Path addCurveToPoint: CGPointMake(155.5, 42.79) controlPoint1: CGPointMake(155.59, 37.96) controlPoint2: CGPointMake(155.94, 39.99)]; + [bezier2Path closePath]; + bezier2Path.miterLimit = 4; + + [color0 setFill]; + [bezier2Path fill]; + + + //// Bezier 3 Drawing + UIBezierPath* bezier3Path = [UIBezierPath bezierPath]; + [bezier3Path moveToPoint: CGPointMake(219.44, 42.54)]; + [bezier3Path addLineToPoint: CGPointMake(208.78, 42.54)]; + [bezier3Path addCurveToPoint: CGPointMake(206.95, 44.1) controlPoint1: CGPointMake(207.87, 42.54) controlPoint2: CGPointMake(207.09, 43.2)]; + [bezier3Path addLineToPoint: CGPointMake(206.48, 47.08)]; + [bezier3Path addLineToPoint: CGPointMake(205.74, 46)]; + [bezier3Path addCurveToPoint: CGPointMake(193.15, 41.53) controlPoint1: CGPointMake(203.43, 42.65) controlPoint2: CGPointMake(198.29, 41.53)]; + [bezier3Path addCurveToPoint: CGPointMake(169.37, 62.97) controlPoint1: CGPointMake(181.38, 41.53) controlPoint2: CGPointMake(171.33, 50.45)]; + [bezier3Path addCurveToPoint: CGPointMake(173.34, 79.33) controlPoint1: CGPointMake(168.35, 69.21) controlPoint2: CGPointMake(169.8, 75.17)]; + [bezier3Path addCurveToPoint: CGPointMake(186.75, 84.75) controlPoint1: CGPointMake(176.59, 83.16) controlPoint2: CGPointMake(181.23, 84.75)]; + [bezier3Path addCurveToPoint: CGPointMake(201.5, 78.65) controlPoint1: CGPointMake(196.24, 84.75) controlPoint2: CGPointMake(201.5, 78.65)]; + [bezier3Path addLineToPoint: CGPointMake(201.03, 81.62)]; + [bezier3Path addCurveToPoint: CGPointMake(202.86, 83.76) controlPoint1: CGPointMake(200.85, 82.74) controlPoint2: CGPointMake(201.72, 83.76)]; + [bezier3Path addLineToPoint: CGPointMake(212.46, 83.76)]; + [bezier3Path addCurveToPoint: CGPointMake(215.51, 81.15) controlPoint1: CGPointMake(213.98, 83.76) controlPoint2: CGPointMake(215.27, 82.66)]; + [bezier3Path addLineToPoint: CGPointMake(221.27, 44.68)]; + [bezier3Path addCurveToPoint: CGPointMake(219.44, 42.54) controlPoint1: CGPointMake(221.44, 43.55) controlPoint2: CGPointMake(220.57, 42.54)]; + [bezier3Path closePath]; + [bezier3Path moveToPoint: CGPointMake(204.59, 63.27)]; + [bezier3Path addCurveToPoint: CGPointMake(192.56, 73.45) controlPoint1: CGPointMake(203.56, 69.36) controlPoint2: CGPointMake(198.73, 73.45)]; + [bezier3Path addCurveToPoint: CGPointMake(185.41, 70.57) controlPoint1: CGPointMake(189.47, 73.45) controlPoint2: CGPointMake(187, 72.45)]; + [bezier3Path addCurveToPoint: CGPointMake(183.74, 63.09) controlPoint1: CGPointMake(183.83, 68.71) controlPoint2: CGPointMake(183.24, 66.05)]; + [bezier3Path addCurveToPoint: CGPointMake(195.68, 52.84) controlPoint1: CGPointMake(184.7, 57.06) controlPoint2: CGPointMake(189.61, 52.84)]; + [bezier3Path addCurveToPoint: CGPointMake(202.78, 55.74) controlPoint1: CGPointMake(198.7, 52.84) controlPoint2: CGPointMake(201.16, 53.84)]; + [bezier3Path addCurveToPoint: CGPointMake(204.59, 63.27) controlPoint1: CGPointMake(204.41, 57.65) controlPoint2: CGPointMake(205.06, 60.33)]; + [bezier3Path closePath]; + bezier3Path.miterLimit = 4; + + [color0 setFill]; + [bezier3Path fill]; + + + //// Bezier 4 Drawing + UIBezierPath* bezier4Path = [UIBezierPath bezierPath]; + [bezier4Path moveToPoint: CGPointMake(378.13, 42.54)]; + [bezier4Path addLineToPoint: CGPointMake(367.48, 42.54)]; + [bezier4Path addCurveToPoint: CGPointMake(365.65, 44.1) controlPoint1: CGPointMake(366.57, 42.54) controlPoint2: CGPointMake(365.79, 43.2)]; + [bezier4Path addLineToPoint: CGPointMake(365.18, 47.08)]; + [bezier4Path addLineToPoint: CGPointMake(364.43, 46)]; + [bezier4Path addCurveToPoint: CGPointMake(351.85, 41.53) controlPoint1: CGPointMake(362.12, 42.65) controlPoint2: CGPointMake(356.98, 41.53)]; + [bezier4Path addCurveToPoint: CGPointMake(328.07, 62.97) controlPoint1: CGPointMake(340.08, 41.53) controlPoint2: CGPointMake(330.02, 50.45)]; + [bezier4Path addCurveToPoint: CGPointMake(332.03, 79.33) controlPoint1: CGPointMake(327.05, 69.21) controlPoint2: CGPointMake(328.49, 75.17)]; + [bezier4Path addCurveToPoint: CGPointMake(345.45, 84.75) controlPoint1: CGPointMake(335.28, 83.16) controlPoint2: CGPointMake(339.92, 84.75)]; + [bezier4Path addCurveToPoint: CGPointMake(360.2, 78.65) controlPoint1: CGPointMake(354.94, 84.75) controlPoint2: CGPointMake(360.2, 78.65)]; + [bezier4Path addLineToPoint: CGPointMake(359.73, 81.62)]; + [bezier4Path addCurveToPoint: CGPointMake(361.56, 83.76) controlPoint1: CGPointMake(359.55, 82.74) controlPoint2: CGPointMake(360.42, 83.76)]; + [bezier4Path addLineToPoint: CGPointMake(371.15, 83.76)]; + [bezier4Path addCurveToPoint: CGPointMake(374.21, 81.15) controlPoint1: CGPointMake(372.67, 83.76) controlPoint2: CGPointMake(373.97, 82.66)]; + [bezier4Path addLineToPoint: CGPointMake(379.97, 44.68)]; + [bezier4Path addCurveToPoint: CGPointMake(378.13, 42.54) controlPoint1: CGPointMake(380.14, 43.55) controlPoint2: CGPointMake(379.27, 42.54)]; + [bezier4Path closePath]; + [bezier4Path moveToPoint: CGPointMake(363.28, 63.27)]; + [bezier4Path addCurveToPoint: CGPointMake(351.26, 73.45) controlPoint1: CGPointMake(362.25, 69.36) controlPoint2: CGPointMake(357.42, 73.45)]; + [bezier4Path addCurveToPoint: CGPointMake(344.1, 70.57) controlPoint1: CGPointMake(348.17, 73.45) controlPoint2: CGPointMake(345.69, 72.45)]; + [bezier4Path addCurveToPoint: CGPointMake(342.44, 63.09) controlPoint1: CGPointMake(342.53, 68.71) controlPoint2: CGPointMake(341.94, 66.05)]; + [bezier4Path addCurveToPoint: CGPointMake(354.37, 52.84) controlPoint1: CGPointMake(343.4, 57.06) controlPoint2: CGPointMake(348.3, 52.84)]; + [bezier4Path addCurveToPoint: CGPointMake(361.48, 55.74) controlPoint1: CGPointMake(357.4, 52.84) controlPoint2: CGPointMake(359.86, 53.84)]; + [bezier4Path addCurveToPoint: CGPointMake(363.28, 63.27) controlPoint1: CGPointMake(363.11, 57.65) controlPoint2: CGPointMake(363.75, 60.33)]; + [bezier4Path closePath]; + bezier4Path.miterLimit = 4; + + [color0 setFill]; + [bezier4Path fill]; + + + //// Bezier 5 Drawing + UIBezierPath* bezier5Path = [UIBezierPath bezierPath]; + [bezier5Path moveToPoint: CGPointMake(276.18, 42.54)]; + [bezier5Path addLineToPoint: CGPointMake(265.47, 42.54)]; + [bezier5Path addCurveToPoint: CGPointMake(262.92, 43.89) controlPoint1: CGPointMake(264.45, 42.54) controlPoint2: CGPointMake(263.49, 43.05)]; + [bezier5Path addLineToPoint: CGPointMake(248.14, 65.65)]; + [bezier5Path addLineToPoint: CGPointMake(241.88, 44.74)]; + [bezier5Path addCurveToPoint: CGPointMake(238.92, 42.54) controlPoint1: CGPointMake(241.49, 43.43) controlPoint2: CGPointMake(240.29, 42.54)]; + [bezier5Path addLineToPoint: CGPointMake(228.39, 42.54)]; + [bezier5Path addCurveToPoint: CGPointMake(226.64, 44.99) controlPoint1: CGPointMake(227.12, 42.54) controlPoint2: CGPointMake(226.23, 43.79)]; + [bezier5Path addLineToPoint: CGPointMake(238.43, 79.6)]; + [bezier5Path addLineToPoint: CGPointMake(227.34, 95.25)]; + [bezier5Path addCurveToPoint: CGPointMake(228.85, 98.18) controlPoint1: CGPointMake(226.47, 96.48) controlPoint2: CGPointMake(227.35, 98.18)]; + [bezier5Path addLineToPoint: CGPointMake(239.55, 98.18)]; + [bezier5Path addCurveToPoint: CGPointMake(242.09, 96.85) controlPoint1: CGPointMake(240.57, 98.18) controlPoint2: CGPointMake(241.51, 97.68)]; + [bezier5Path addLineToPoint: CGPointMake(277.71, 45.45)]; + [bezier5Path addCurveToPoint: CGPointMake(276.18, 42.54) controlPoint1: CGPointMake(278.56, 44.22) controlPoint2: CGPointMake(277.68, 42.54)]; + [bezier5Path closePath]; + bezier5Path.miterLimit = 4; + + [color0 setFill]; + [bezier5Path fill]; + + + //// Bezier 6 Drawing + UIBezierPath* bezier6Path = [UIBezierPath bezierPath]; + [bezier6Path moveToPoint: CGPointMake(390.69, 23.52)]; + [bezier6Path addLineToPoint: CGPointMake(381.56, 81.62)]; + [bezier6Path addCurveToPoint: CGPointMake(383.39, 83.76) controlPoint1: CGPointMake(381.38, 82.74) controlPoint2: CGPointMake(382.25, 83.76)]; + [bezier6Path addLineToPoint: CGPointMake(392.57, 83.76)]; + [bezier6Path addCurveToPoint: CGPointMake(395.63, 81.15) controlPoint1: CGPointMake(394.1, 83.76) controlPoint2: CGPointMake(395.39, 82.66)]; + [bezier6Path addLineToPoint: CGPointMake(404.63, 24.1)]; + [bezier6Path addCurveToPoint: CGPointMake(402.8, 21.96) controlPoint1: CGPointMake(404.81, 22.97) controlPoint2: CGPointMake(403.94, 21.96)]; + [bezier6Path addLineToPoint: CGPointMake(392.52, 21.96)]; + [bezier6Path addCurveToPoint: CGPointMake(390.69, 23.52) controlPoint1: CGPointMake(391.61, 21.95) controlPoint2: CGPointMake(390.83, 22.62)]; + [bezier6Path closePath]; + bezier6Path.miterLimit = 4; + + [color0 setFill]; + [bezier6Path fill]; + } + } + } + + + //// Group 4 + { + //// Group 5 + { + //// Bezier 7 Drawing + UIBezierPath* bezier7Path = [UIBezierPath bezierPath]; + [bezier7Path moveToPoint: CGPointMake(39.01, 56.64)]; + [bezier7Path addCurveToPoint: CGPointMake(32.16, 56.64) controlPoint1: CGPointMake(34.76, 56.64) controlPoint2: CGPointMake(32.16, 56.64)]; + [bezier7Path addLineToPoint: CGPointMake(30.34, 56.64)]; + [bezier7Path addCurveToPoint: CGPointMake(28.12, 58.55) controlPoint1: CGPointMake(29.23, 56.64) controlPoint2: CGPointMake(28.3, 57.44)]; + [bezier7Path addCurveToPoint: CGPointMake(22.25, 95.65) controlPoint1: CGPointMake(28.12, 58.55) controlPoint2: CGPointMake(22.59, 93.36)]; + [bezier7Path addCurveToPoint: CGPointMake(24.52, 98.18) controlPoint1: CGPointMake(22.05, 97.04) controlPoint2: CGPointMake(23.25, 98.18)]; + [bezier7Path addLineToPoint: CGPointMake(38.3, 98.18)]; + [bezier7Path addCurveToPoint: CGPointMake(42.07, 94.95) controlPoint1: CGPointMake(40.18, 98.18) controlPoint2: CGPointMake(41.78, 96.81)]; + [bezier7Path addLineToPoint: CGPointMake(45.41, 74.13)]; + [bezier7Path addCurveToPoint: CGPointMake(49.18, 70.91) controlPoint1: CGPointMake(45.7, 72.28) controlPoint2: CGPointMake(47.3, 70.91)]; + [bezier7Path addLineToPoint: CGPointMake(51.56, 70.91)]; + [bezier7Path addCurveToPoint: CGPointMake(82.51, 46.58) controlPoint1: CGPointMake(66.94, 70.91) controlPoint2: CGPointMake(78.99, 64.66)]; + [bezier7Path addCurveToPoint: CGPointMake(76.86, 26.21) controlPoint1: CGPointMake(83.98, 39.03) controlPoint2: CGPointMake(83.51, 30.63)]; + [bezier7Path addCurveToPoint: CGPointMake(39.01, 56.64) controlPoint1: CGPointMake(74.71, 38.22) controlPoint2: CGPointMake(67.94, 56.64)]; + [bezier7Path closePath]; + bezier7Path.miterLimit = 4; + + [color0 setFill]; + [bezier7Path fill]; + } + + + //// Bezier 8 Drawing + UIBezierPath* bezier8Path = [UIBezierPath bezierPath]; + [bezier8Path moveToPoint: CGPointMake(30.34, 52.43)]; + [bezier8Path addCurveToPoint: CGPointMake(39.29, 52.43) controlPoint1: CGPointMake(35.71, 52.43) controlPoint2: CGPointMake(39.29, 52.43)]; + [bezier8Path addCurveToPoint: CGPointMake(52.03, 50.82) controlPoint1: CGPointMake(44.04, 52.43) controlPoint2: CGPointMake(48.28, 51.9)]; + [bezier8Path addCurveToPoint: CGPointMake(71.08, 32.13) controlPoint1: CGPointMake(61.51, 48.1) controlPoint2: CGPointMake(67.88, 41.93)]; + [bezier8Path addCurveToPoint: CGPointMake(68.74, 7.4) controlPoint1: CGPointMake(75.1, 19.78) controlPoint2: CGPointMake(73.32, 12.47)]; + [bezier8Path addCurveToPoint: CGPointMake(45.46, 0) controlPoint1: CGPointMake(64.12, 2.29) controlPoint2: CGPointMake(55.98, 0)]; + [bezier8Path addLineToPoint: CGPointMake(17.05, 0)]; + [bezier8Path addCurveToPoint: CGPointMake(12.74, 3.69) controlPoint1: CGPointMake(14.9, 0) controlPoint2: CGPointMake(13.07, 1.56)]; + [bezier8Path addLineToPoint: CGPointMake(0.03, 84.26)]; + [bezier8Path addCurveToPoint: CGPointMake(2.62, 87.28) controlPoint1: CGPointMake(-0.22, 85.85) controlPoint2: CGPointMake(1.01, 87.28)]; + [bezier8Path addLineToPoint: CGPointMake(19.36, 87.28)]; + [bezier8Path addCurveToPoint: CGPointMake(23.98, 58.19) controlPoint1: CGPointMake(19.36, 87.28) controlPoint2: CGPointMake(23.86, 59.01)]; + [bezier8Path addCurveToPoint: CGPointMake(30.34, 52.43) controlPoint1: CGPointMake(24.41, 55.44) controlPoint2: CGPointMake(26.15, 52.43)]; + [bezier8Path closePath]; + bezier8Path.miterLimit = 4; + + [color0 setFill]; + [bezier8Path fill]; + } + + +} + + +@end diff --git a/Pods/Braintree/Braintree/PayPal/mSDK/PayPalConfiguration.h b/Pods/Braintree/Braintree/PayPal/mSDK/PayPalConfiguration.h new file mode 100644 index 0000000..105b6c9 --- /dev/null +++ b/Pods/Braintree/Braintree/PayPal/mSDK/PayPalConfiguration.h @@ -0,0 +1,133 @@ +// +// PayPalConfiguration.h +// +// Version 2.14.1-bt1 +// +// Copyright (c) 2014-2016 PayPal, Inc. All rights reserved. +// All rights reserved. +// + +#import + +typedef NS_ENUM(NSInteger, PayPalShippingAddressOption) { + PayPalShippingAddressOptionNone = 0, + PayPalShippingAddressOptionProvided = 1, + PayPalShippingAddressOptionPayPal = 2, + PayPalShippingAddressOptionBoth = 3, +}; + +/// You use a PayPalConfiguration object to configure many aspects of how the SDK behaves. +@interface PayPalConfiguration : NSObject + +/// Optional default user email address to be shown on the PayPal login view. +/// Will be overridden by email used in most recent PayPal login. +/// @see forceDefaultsInSandbox +@property(nullable, nonatomic, copy, readwrite) NSString *defaultUserEmail; +/// Optional default user phone country code used in the PayPal login view. +/// The input to this method is expected to be a digit string. +/// For example: `@"1"` for North America, `@"44"` for UK +/// Will be overridden by phone country code used in most recent PayPal login. +/// @see forceDefaultsInSandbox +@property(nullable, nonatomic, copy, readwrite) NSString *defaultUserPhoneCountryCode; +/// Optional default user phone number to be shown in the PayPal login view. +/// Will be overridden by phone number used in most recent PayPal login. +/// @note If you set defaultUserPhoneNumber, be sure to also set defaultUserPhoneCountryCode. +/// @see forceDefaultsInSandbox +@property(nullable, nonatomic, copy, readwrite) NSString *defaultUserPhoneNumber; + +/// Your company name, as it should be displayed to the user +/// when requesting consent via a PayPalFuturePaymentViewController or a PayPalProfileSharingViewController. +@property(nullable, nonatomic, copy, readwrite) NSString *merchantName; +/// URL of your company's privacy policy, which will be offered to the user +/// when requesting consent via a PayPalFuturePaymentViewController or a PayPalProfileSharingViewController. +@property(nullable, nonatomic, copy, readwrite) NSURL *merchantPrivacyPolicyURL; +/// URL of your company's user agreement, which will be offered to the user +/// when requesting consent via a PayPalFuturePaymentViewController or a PayPalProfileSharingViewController. +@property(nullable, nonatomic, copy, readwrite) NSURL *merchantUserAgreementURL; + +/// If set to NO, the SDK will only support paying with PayPal, not with credit cards. +/// This applies only to single payments (via PayPalPaymentViewController). +/// Future payments (via PayPalFuturePaymentViewController) always use PayPal. +/// Defaults to YES. +@property(nonatomic, assign, readwrite) BOOL acceptCreditCards; + +/// Scheme defined in application's plist to perform app switch +@property(nullable, nonatomic, copy, readwrite) NSString *callbackURLScheme; + +/// For single payments, options for the shipping address. +/// - PayPalShippingAddressOptionNone: no shipping address applies. +/// - PayPalShippingAddressOptionProvided: shipping address will be provided by your app, +/// in the shippingAddress property of PayPalPayment. +/// - PayPalShippingAddressOptionPayPal: user will choose from shipping addresses on file +/// for their PayPal account. +/// - PayPalShippingAddressOptionBoth: user will choose from the shipping address provided by your app, +/// in the shippingAddress property of PayPalPayment, plus the shipping addresses on file for the user's PayPal account. +/// Defaults to PayPalShippingAddressOptionNone. +@property(nonatomic, assign, readwrite) PayPalShippingAddressOption payPalShippingAddressOption; + +/// If set to YES, then if the user pays via their PayPal account, +/// the SDK will remember the user's PayPal username or phone number; +/// if the user pays via their credit card, then the SDK will remember +/// the PayPal Vault token representing the user's credit card. +/// +/// If set to NO, then any previously-remembered username, phone number, or +/// credit card token will be erased, and subsequent payment information will +/// not be remembered. +/// +/// Defaults to YES. +/// +/// @see PayPalMobile +(void)clearAllUserData +@property(nonatomic, assign, readwrite) BOOL rememberUser; + +/// If not set, or if set to nil, defaults to the device's current language setting. +/// +/// Can be specified as a language code ("en", "fr", "zh-Hans", etc.) or as a locale ("en_AU", "fr_FR", "zh-Hant_HK", etc.). +/// If the library does not contain localized strings for a specified locale, then will fall back to the language. E.g., "es_CO" -> "es". +/// If the library does not contain localized strings for a specified language, then will fall back to American English. +/// +/// If you specify only a language code, and that code matches the device's currently preferred language, +/// then the library will attempt to use the device's current region as well. +/// E.g., specifying "en" on a device set to "English" and "United Kingdom" will result in "en_GB". +/// +/// These localizations are currently included: +/// ar,da,de,en,en_AU,en_GB,es,es_MX,fr,he,it,ja,ko,ms,nb,nl,pl,pt,pt_BR,ru,sv,th,tr,zh-Hans,zh-Hant,zh-Hant_TW. +@property(nullable, nonatomic, copy, readwrite) NSString *languageOrLocale; + +/// If set to YES, then all displayed payment amounts will include a currency code (e.g., "USD") +/// in addition to the standard currency symbol (e.g., "$"). +/// +/// Even if set to NO, currency codes will still be displayed in the case where a user's PayPal account +/// includes any funding source whose currency differs from that of the current payment. +/// For example, if the current payment is in US Dollars but the user's PayPal account includes a +/// credit card in Canadian Dollars, then all displayed amounts will be labeled as either USD or CAD. +/// +/// Defaults to NO. +@property(nonatomic, assign, readwrite) BOOL alwaysDisplayCurrencyCodes; + +/// Normally, the SDK blurs the screen when the app is backgrounded, +/// to obscure credit card or PayPal account details in the iOS-saved screenshot. +/// If your app already does its own blurring upon backgrounding, you might choose to disable this. +/// Defaults to NO. +@property(nonatomic, assign, readwrite) BOOL disableBlurWhenBackgrounding; + +/// If you will present the SDK's view controller within a popover, then set this property to YES. +/// Defaults to NO. +@property(nonatomic, assign, readwrite) BOOL presentingInPopover; + +/// Sandbox credentials can be difficult to type on a mobile device. Setting this flag to YES will +/// cause the sandboxUserPassword and sandboxUserPin to always be pre-populated into login fields. +/// +/// Defaults to NO. +/// +/// This setting will have no effect if the environment is PayPalEnvironmentProduction. +/// +/// @note: Use defaultUserEmail, defaultUserPhoneCountryCode, and defaultUserPhoneNumber to +/// pre-populate the email and phone fields as well. +@property (nonatomic, assign, readwrite) BOOL forceDefaultsInSandbox; + +/// Password to use for sandbox if 'forceDefaultsInSandbox' is set. +@property (nullable, nonatomic, copy, readwrite) NSString* sandboxUserPassword; +/// PIN to use for sandbox if 'forceDefaultsInSandbox' is set. +@property (nullable, nonatomic, copy, readwrite) NSString* sandboxUserPin; + +@end diff --git a/Pods/Braintree/Braintree/PayPal/mSDK/PayPalFuturePaymentViewController.h b/Pods/Braintree/Braintree/PayPal/mSDK/PayPalFuturePaymentViewController.h new file mode 100644 index 0000000..aaa8edb --- /dev/null +++ b/Pods/Braintree/Braintree/PayPal/mSDK/PayPalFuturePaymentViewController.h @@ -0,0 +1,67 @@ +// +// PayPalFuturePaymentViewController.h +// +// Version 2.14.1-bt1 +// +// Copyright (c) 2014-2016 PayPal, Inc. All rights reserved. +// All rights reserved. +// + +#import +#import "PayPalConfiguration.h" + +@class PayPalFuturePaymentViewController; +typedef void (^PayPalFuturePaymentDelegateCompletionBlock)(void); + +#pragma mark - PayPalFuturePaymentDelegate + +/// Exactly one of these two required delegate methods will get called when the UI completes. +/// You MUST dismiss the modal view controller from these required delegate methods. +@protocol PayPalFuturePaymentDelegate +@required + +/// User canceled the future payment process. +/// Your code MUST dismiss the PayPalFuturePaymentViewController. +/// @param futurePaymentViewController The PayPalFuturePaymentViewController that the user canceled without agreement. +- (void)payPalFuturePaymentDidCancel:(nonnull PayPalFuturePaymentViewController *)futurePaymentViewController; + +/// User successfully completed the future payment authorization. +/// The PayPalFuturePaymentViewController's activity indicator has been dismissed. +/// Your code MAY deal with the futurePaymentAuthorization, if it did not already do so within your optional +/// payPalFuturePaymentViewController:willAuthorizeFuturePayment:completionBlock: method. +/// Your code MUST dismiss the PayPalFuturePaymentViewController. +/// @param futurePaymentViewController The PayPalFuturePaymentViewController where the user successfullly authorized. +/// @param futurePaymentAuthorization A dictionary containing information that your server will need to process the payment. +- (void)payPalFuturePaymentViewController:(nonnull PayPalFuturePaymentViewController *)futurePaymentViewController + didAuthorizeFuturePayment:(nonnull NSDictionary *)futurePaymentAuthorization; + +@optional +/// User successfully completed the future payment authorization. +/// The PayPalFuturePaymentViewController's activity indicator is still visible. +/// Your code MAY deal with the futurePaymentAuthorization; e.g., send it to your server and await confirmation. +/// Your code MUST finish by calling the completionBlock. +/// Your code must NOT dismiss the PayPalFuturePaymentViewController. +/// @param futurePaymentViewController The PayPalFuturePaymentViewController where the user successfullly authorized. +/// @param futurePaymentAuthorization A dictionary containing information that your server will need to process the payment. +/// @param completionBlock Block to execute when your processing is done. +- (void)payPalFuturePaymentViewController:(nonnull PayPalFuturePaymentViewController *)futurePaymentViewController + willAuthorizeFuturePayment:(nonnull NSDictionary *)futurePaymentAuthorization + completionBlock:(nonnull PayPalFuturePaymentDelegateCompletionBlock)completionBlock; +@end + + +#pragma mark - PayPalFuturePaymentViewController + +@interface PayPalFuturePaymentViewController : UINavigationController + +/// The designated initalizer. A new view controller MUST be initialized for each use. +/// @param configuration The configuration to be used for the lifetime of the controller. +/// The configuration properties merchantName, merchantPrivacyPolicyURL, and merchantUserAgreementURL must be provided. +/// @param delegate The delegate you want to receive updates about the future payment authorization. +- (nullable instancetype)initWithConfiguration:(nonnull PayPalConfiguration *)configuration + delegate:(nullable id)delegate; + +/// Delegate access +@property (nonatomic, weak, readonly, nullable) id futurePaymentDelegate; + +@end diff --git a/Pods/Braintree/Braintree/PayPal/mSDK/PayPalMobile.h b/Pods/Braintree/Braintree/PayPal/mSDK/PayPalMobile.h new file mode 100644 index 0000000..931e49c --- /dev/null +++ b/Pods/Braintree/Braintree/PayPal/mSDK/PayPalMobile.h @@ -0,0 +1,96 @@ +// +// PayPalMobile.h +// +// Version 2.14.1-bt1 +// +// Copyright (c) 2014-2016 PayPal, Inc. All rights reserved. +// All rights reserved. +// + +// All-in-one import for the PayPal Mobile SDK + +#import "PayPalConfiguration.h" +#import "PayPalFuturePaymentViewController.h" +#import "PayPalOAuthScopes.h" +#import "PayPalPayment.h" +#import "PayPalPaymentViewController.h" +#import "PayPalProfileSharingViewController.h" +#import "PayPalTouch.h" + +/// Production (default): Normal, live environment. Real money gets moved. +/// This environment MUST be used for App Store submissions. +extern NSString * _Nonnull const PayPalEnvironmentProduction; +/// Sandbox: Uses the PayPal sandbox for transactions. Useful for development. +extern NSString * _Nonnull const PayPalEnvironmentSandbox; +/// NoNetwork: Mock mode. Does not submit transactions to PayPal. Fakes successful responses. Useful for unit tests. +extern NSString * _Nonnull const PayPalEnvironmentNoNetwork; + +@interface PayPalMobile : NSObject + +/// You MUST call this method to initialize the PayPal Mobile SDK. +/// +/// The PayPal Mobile SDK can operate in different environments to facilitate development and testing. +/// See PayPalEnvironmentProduction, PayPalEnvironmentSandbox, PayPalEnvironmentNoNetwork for more details. +/// @param clientIdsForEnvironments Your client id for each relevant environment, as obtained from developer.paypal.com. +/// You do not need to provide a client id for PayPalEnvironmentNoNetwork. +/// For example, +/// @{PayPalEnvironmentProduction : @"my-client-id-for-Production", +/// PayPalEnvironmentSandbox : @"my-client-id-for-Sandbox"} ++ (void)initializeWithClientIdsForEnvironments:(nonnull NSDictionary *)clientIdsForEnvironments; + +/// You MUST preconnect to PayPal to prepare the device for processing payments. +/// This improves the user experience because it allows the PayPal Mobile SDK to make its +/// setup request early and in the background. +/// +/// The preconnect is valid for a limited time, so the recommended time to preconnect +/// is when you present the UI in which users *might* choose to initiate payment. +/// +/// Calling this method a second time, with a different value, will change the environment used +/// by subsequently allocated PayPal Mobile SDK viewcontrollers. Existing viewcontrollers +/// will be unaffected. +/// +/// @param environment +/// The PayPal Mobile SDK can operate in different environments to facilitate development and testing. +/// See PayPalEnvironmentProduction, PayPalEnvironmentSandbox, PayPalEnvironmentNoNetwork for more details. ++ (void)preconnectWithEnvironment:(nonnull NSString *)environment; + +/// Once a user has consented to future payments, when the user subsequently initiates a PayPal payment +/// from their device to be completed by your server, PayPal uses a Client Metadata ID to verify that the +/// payment is originating from a valid, user-consented device+application. +/// This helps reduce fraud and decrease declines. +/// This method MUST be called prior to initiating a pre-consented payment (a "future payment") from a mobile device. +/// Pass the result to your server, to include in the payment request sent to PayPal. +/// Do not otherwise cache or store this value. +/// @return clientMetadataID Your server will send this to PayPal in a 'PayPal-Client-Metadata-Id' header. ++ (nonnull NSString *)clientMetadataID; + +/// Method deprecated. Use clientMetadataID instead ++ (nonnull NSString *)applicationCorrelationIDForEnvironment:(nonnull NSString *)environment __attribute__((deprecated("Use clientMetadataID instead."))); + +/// Delete all previously remembered user data (credit card, email, phone, PayPal account), +/// for all environments. (See PayPalEnvironmentProduction, PayPalEnvironmentSandbox, PayPalEnvironmentNoNetwork.) +/// +/// You might choose to call this method, for example, when a user logs out of your app. +/// +/// @note Do NOT call this method while any PayPal Mobile SDK viewcontroller is active. +/// @see PayPalConfiguration rememberUser. ++ (void)clearAllUserData; + +/// @return The version of the PayPal Mobile SDK in use. Version numbering follows http://semver.org/. +/// @note Please be sure to include this library version in tech support requests. ++ (nonnull NSString *)libraryVersion; + +#pragma mark - Internal environment setup + +/// Add a custom-defined environment to the list of available environments. +/// @param environments Custom environments to add. ++ (void)addEnvironments:(nonnull NSDictionary *)environments; + +/// @return a dictionary of currently available environments (each of which +/// is a dictionary). You may pass any key from this dictionary to setEnvironment. ++ (nonnull NSDictionary *)availableEnvironments; + +// @note For changing the clientId at runtime; currently used only by the Demo app. ++ (void)setClientId:(nonnull NSString *)clientId forEnvironment:(nonnull NSString *)environment; + +@end diff --git a/Pods/Braintree/Braintree/PayPal/mSDK/PayPalOAuthScopes.h b/Pods/Braintree/Braintree/PayPal/mSDK/PayPalOAuthScopes.h new file mode 100644 index 0000000..5ee7bcc --- /dev/null +++ b/Pods/Braintree/Braintree/PayPal/mSDK/PayPalOAuthScopes.h @@ -0,0 +1,27 @@ +// +// PayPalOAuthScopes.h +// +// Version 2.14.1-bt1 +// +// Copyright (c) 2014-2016 PayPal, Inc. All rights reserved. +// All rights reserved. +// + +// Currently available scope-values to which the user can be asked to consent. +// @see https://developer.paypal.com/docs/integration/direct/identity/attributes/ for more details + +/// Authorize charges for future purchases paid for with PayPal. +extern NSString * _Nonnull const kPayPalOAuth2ScopeFuturePayments; +/// Share basic account information. +extern NSString * _Nonnull const kPayPalOAuth2ScopeProfile; +/// Basic Authentication. +extern NSString * _Nonnull const kPayPalOAuth2ScopeOpenId; +/// Share your personal and account information. +extern NSString * _Nonnull const kPayPalOAuth2ScopePayPalAttributes; +/// Share your email address. +extern NSString * _Nonnull const kPayPalOAuth2ScopeEmail; +/// Share your account address. +extern NSString * _Nonnull const kPayPalOAuth2ScopeAddress; +/// Share your phone number. +extern NSString * _Nonnull const kPayPalOAuth2ScopePhone; + diff --git a/Pods/Braintree/Braintree/PayPal/mSDK/PayPalPayment.h b/Pods/Braintree/Braintree/PayPal/mSDK/PayPalPayment.h new file mode 100644 index 0000000..d978a22 --- /dev/null +++ b/Pods/Braintree/Braintree/PayPal/mSDK/PayPalPayment.h @@ -0,0 +1,240 @@ +// +// PayPalPayment.h +// +// Version 2.14.1-bt1 +// +// Copyright (c) 2014-2016 PayPal, Inc. All rights reserved. +// All rights reserved. +// + +#import + +#pragma mark - PayPalPaymentIntent + +typedef NS_ENUM(NSInteger, PayPalPaymentIntent) { + PayPalPaymentIntentSale = 0, + PayPalPaymentIntentAuthorize = 1, + PayPalPaymentIntentOrder = 2, + }; + + +#pragma mark - PayPalPaymentDetails + +/// The PayPalPaymentDetails class defines optional amount details. +/// @see https://developer.paypal.com/webapps/developer/docs/api/#details-object for more details. +@interface PayPalPaymentDetails : NSObject + +/// Convenience constructor. +/// See the documentation of the individual properties for more detail. +/// @param subtotal Sum of amounts for all items in this transaction. +/// @param shipping Shipping and handling amount for the overall transaction. +/// @param tax Tax amount for the overall transaction. ++ (nonnull PayPalPaymentDetails *)paymentDetailsWithSubtotal:(nullable NSDecimalNumber *)subtotal + withShipping:(nullable NSDecimalNumber *)shipping + withTax:(nullable NSDecimalNumber *)tax; + +/// Sub-total (amount) of items being paid for. 10 characters max with support for 2 decimal places. +@property(nullable, nonatomic, copy, readwrite) NSDecimalNumber *subtotal; + +/// Amount charged for shipping. 10 characters max with support for 2 decimal places. +@property(nullable, nonatomic, copy, readwrite) NSDecimalNumber *shipping; + +/// Amount charged for tax. 10 characters max with support for 2 decimal places. +@property(nullable, nonatomic, copy, readwrite) NSDecimalNumber *tax; + +@end + + +#pragma mark - PayPalItem + +/// The PayPalItem class defines an optional itemization for a payment. +/// @see https://developer.paypal.com/docs/api/#item-object for more details. +@interface PayPalItem : NSObject + +/// Convenience constructor. +/// See the documentation of the individual properties for more detail. +/// @param name Name of the item. +/// @param quantity Number of units. +/// @param price Unit price for this item. +/// @param currency ISO standard currency code. +/// @param sku The stock keeping unit for this item. ++ (nonnull PayPalItem *)itemWithName:(nonnull NSString *)name + withQuantity:(NSUInteger)quantity + withPrice:(nonnull NSDecimalNumber *)price + withCurrency:(nonnull NSString *)currency + withSku:(nullable NSString *)sku; + +/// Convenience utility. +/// Returns the total of (quantity * price) for all of the items. +/// @param items Array of PayPalItem objects. ++ (nonnull NSDecimalNumber *)totalPriceForItems:(nonnull NSArray *)items; + +/// Item name. 127 characters max. Required. +@property(nonnull, nonatomic, copy, readwrite) NSString *name; + +/// Number of a particular item. 10 characters max. Required. +@property(nonatomic, assign, readwrite) NSUInteger quantity; + +/// Item cost. 10 characters max. May be negative for "coupon" etc. Required. +@property(nonnull, nonatomic, copy, readwrite) NSDecimalNumber *price; + +/// ISO standard currency code (http://en.wikipedia.org/wiki/ISO_4217). Required. +@property(nonnull, nonatomic, copy, readwrite) NSString *currency; + +/// Stock keeping unit corresponding (SKU) to item. 50 characters max. +@property(nullable, nonatomic, copy, readwrite) NSString *sku; + +@end + + +#pragma mark - PayPalShippingAddress + +/// The PayPalShippingAddress class defines an optional customer shipping address. +/// @see https://developer.paypal.com/webapps/developer/docs/api/#shippingaddress-object for more details +@interface PayPalShippingAddress : NSObject + +/// Convenience constructor. +/// See the documentation of the individual properties for more detail. +/// @param recipientName Name of recipient. +/// @param line1 First line of address. +/// @param line2 Second line of address, if any. +/// @param city City. +/// @param state State, county, etc., as appropriate. +/// @param postalCode Appropriate ZIP or postal code. +/// @param countryCode 2-letter country code. ++ (nonnull PayPalShippingAddress *)shippingAddressWithRecipientName:(nonnull NSString *)recipientName + withLine1:(nonnull NSString *)line1 + withLine2:(nullable NSString *)line2 + withCity:(nonnull NSString *)city + withState:(nullable NSString *)state + withPostalCode:(nullable NSString *)postalCode + withCountryCode:(nonnull NSString *)countryCode; + +/// Name of the recipient at this address. 50 characters max. Required. +@property(nonnull, nonatomic, copy, readwrite) NSString *recipientName; + +/// Line 1 of the address (e.g., Number, street, etc). 100 characters max. Required. +@property(nonnull, nonatomic, copy, readwrite) NSString *line1; + +/// Line 2 of the address (e.g., Suite, apt #, etc). 100 characters max. +@property(nullable, nonatomic, copy, readwrite) NSString *line2; + +/// City name. 50 characters max. Required. +@property(nonnull, nonatomic, copy, readwrite) NSString *city; + +/// 2-letter code for US states, and the equivalent for other countries. 100 characters max. Required in certain countries. +@property(nullable, nonatomic, copy, readwrite) NSString *state; + +/// ZIP code or equivalent is usually required for countries that have them. 20 characters max. Required in certain countries. +@property(nullable, nonatomic, copy, readwrite) NSString *postalCode; + +/// 2-letter country code. 2 characters max. Required. +@property(nonnull, nonatomic, copy, readwrite) NSString *countryCode; + +@end + + +#pragma mark - PayPalPayment + +@interface PayPalPayment : NSObject + +/// Convenience constructor. +/// See the documentation of the individual properties for more detail. +/// @param amount The amount of the payment. +/// @param currencyCode The ISO 4217 currency for the payment. +/// @param shortDescription A short descripton of the payment. +/// @param intent PayPalPaymentIntentSale for an immediate payment; +/// PayPalPaymentIntentAuthorize for payment authorization only, to be captured separately at a later time; +/// PayPalPaymentIntentOrder for taking an order, with authorization and capture to be done separately at a later time. ++ (nonnull PayPalPayment *)paymentWithAmount:(nonnull NSDecimalNumber *)amount + currencyCode:(nonnull NSString *)currencyCode + shortDescription:(nonnull NSString *)shortDescription + intent:(PayPalPaymentIntent)intent; + + +#pragma mark Required properties + +/// ISO standard currency code (http://en.wikipedia.org/wiki/ISO_4217). +@property(nonnull, nonatomic, copy, readwrite) NSString *currencyCode; + +/// Amount in the given currency to process. Must be positive. +@property(nonnull, nonatomic, copy, readwrite) NSDecimalNumber *amount; + +/// A short description of the transaction, for display to the user. +/// The description will be truncated for display, if necessary; +/// limiting it to about 20 characters should prevent truncation in most cases. +@property(nonnull, nonatomic, copy, readwrite) NSString *shortDescription; + +/// The intent of this payment: +/// +/// - PayPalPaymentIntentSale for an immediate payment +/// +/// - PayPalPaymentIntentAuthorize for payment authorization only, +/// to be captured separately at a later time. +/// +/// - PayPalPaymentIntentOrder for taking an order, with authorization +/// and capture to be done separately at a later time. +/// +/// (PayPalPaymentIntentOrder is valid only for PayPal payments, +/// not credit card payments.) +/// +/// Defaults to PayPalPaymentIntentSale. +@property(nonatomic, assign, readwrite) PayPalPaymentIntent intent; + + +#pragma mark Optional properties + +/// Optional payment details @see PayPalPaymentDetails properties. +/// @note If you provide payment details, be sure that `subtotal`, `shipping`, and `tax` +/// sum exactly to the payment `amount`. +@property (nullable, nonatomic, copy, readwrite) PayPalPaymentDetails *paymentDetails; + +/// Optional array of PayPalItem objects. @see PayPalItem +/// @note If you provide one or more items, be sure that the various prices correctly +/// sum to the payment `amount` or to `paymentDetails.subtotal`. +@property (nullable, nonatomic, copy, readwrite) NSArray *items; + +/// Optional customer shipping address, if your app wishes to provide this to the SDK. +@property (nullable, nonatomic, copy, readwrite) PayPalShippingAddress *shippingAddress; + +/// Optional invoice number, for your tracking purposes. (up to 256 characters) +@property (nullable, nonatomic, copy, readwrite) NSString *invoiceNumber; + +/// Optional text, for your tracking purposes. (up to 256 characters) +@property (nullable, nonatomic, copy, readwrite) NSString *custom; + +/// Optional text which will appear on the customer's credit card statement. (up to 22 characters) +@property (nullable, nonatomic, copy, readwrite) NSString *softDescriptor; + +/// Optional Build Notation code ("BN code"), obtained from partnerprogram@paypal.com, +/// for your tracking purposes. +@property(nullable, nonatomic, copy, readwrite) NSString *bnCode; + + +#pragma mark Convenience getters + +/// Can this payment be processed? +/// A payment might not be processable if, for example: +/// - the amount is non-positive, +/// - the currency is invalid, +/// - the amount includes more decimal fraction digits than the currency allows, +/// - there's no description, or +/// - the payment has already been processed. +@property(nonatomic, assign, readonly) BOOL processable; + +/// The payment amount rendered with the appropriate currency symbol. +@property(nonnull, nonatomic, copy, readonly) NSString *localizedAmountForDisplay; + + +#pragma mark Properties available on completed purchases + +/// Full payment confirmation, with lots of details including the proof +/// of payment token. You should send the entire confirmation +/// dictionary to your servers and process it there, for maximum flexibility. +/// See https://developer.paypal.com/webapps/developer/docs/integration/mobile/verify-mobile-payment/ +/// and https://developer.paypal.com/webapps/developer/docs/integration/direct/capture-payment/ +/// for more details. +@property(nonnull, nonatomic, readonly, copy) NSDictionary *confirmation; + + +@end diff --git a/Pods/Braintree/Braintree/PayPal/mSDK/PayPalPaymentViewController.h b/Pods/Braintree/Braintree/PayPal/mSDK/PayPalPaymentViewController.h new file mode 100644 index 0000000..6a36bd0 --- /dev/null +++ b/Pods/Braintree/Braintree/PayPal/mSDK/PayPalPaymentViewController.h @@ -0,0 +1,109 @@ +// +// PayPalPaymentViewController.h +// +// Version 2.14.1-bt1 +// +// Copyright (c) 2014-2016 PayPal, Inc. All rights reserved. +// All rights reserved. +// + +#import +#import "PayPalConfiguration.h" +#import "PayPalPayment.h" + +// Important note: +// +// This is a proof of payment system. You MUST verify all transactions +// via a call from your servers (not your app) to PayPal's servers, to +// ensure that the transaction was genuine and successful. +// See https://developer.paypal.com/webapps/developer/docs/integration/mobile/verify-mobile-payment/ +// for details. + +#pragma mark - Delegates and notifications + +@class PayPalPaymentViewController; +typedef void (^PayPalPaymentDelegateCompletionBlock)(void); + +/// Exactly one of these two required delegate methods will get called when the UI completes. +/// You MUST dismiss the modal view controller from these required delegate methods. +@protocol PayPalPaymentDelegate +@required + +/// User canceled the payment process. +/// Your code MUST dismiss the PayPalPaymentViewController. +/// @param paymentViewController The PayPalPaymentViewController that the user canceled without making a payment. +- (void)payPalPaymentDidCancel:(nonnull PayPalPaymentViewController *)paymentViewController; + +/// User successfully completed the payment. +/// The PayPalPaymentViewController's activity indicator has been dismissed. +/// Your code MAY deal with the completedPayment, if it did not already do so within your optional +/// payPalPaymentViewController:willCompletePayment:completionBlock: method. +/// Your code MUST dismiss the PayPalPaymentViewController. +/// See https://developer.paypal.com/webapps/developer/docs/integration/mobile/verify-mobile-payment/ for +/// information about payment verification. +/// @param paymentViewController The PayPalPaymentViewController where the user successfullly made a payment. +/// @param completedPayment completedPayment.confirmation contains information your server will need to verify the payment. +- (void)payPalPaymentViewController:(nonnull PayPalPaymentViewController *)paymentViewController + didCompletePayment:(nonnull PayPalPayment *)completedPayment; + +@optional +/// User successfully completed the payment. +/// The PayPalPaymentViewController's activity indicator is still visible. +/// Your code MAY deal with the completedPayment; e.g., send it to your server and await confirmation. +/// Your code MUST finish by calling the completionBlock. +/// Your code must NOT dismiss the PayPalPaymentViewController. +/// See https://developer.paypal.com/webapps/developer/docs/integration/mobile/verify-mobile-payment/ for +/// information about payment verification. +/// @param paymentViewController The PayPalPaymentViewController where the user successfullly made a payment. +/// @param completedPayment completedPayment.confirmation contains information your server will need to verify the payment. +/// @param completionBlock Block to execute when your processing is done. +- (void)payPalPaymentViewController:(nonnull PayPalPaymentViewController *)paymentViewController + willCompletePayment:(nonnull PayPalPayment *)completedPayment + completionBlock:(nonnull PayPalPaymentDelegateCompletionBlock)completionBlock; + +@end + + +#pragma mark - PayPalPaymentViewController + +@interface PayPalPaymentViewController : UINavigationController + +/// The designated initalizer. A new view controller MUST be initialized for each use. +/// @param payment The payment to be processed. +/// @param configuration The configuration to be used for the lifetime of the controller +/// (e.g., default email address or hideCreditCard); can be nil. +/// @param delegate The delegate you want to receive updates about the payment. +- (nullable instancetype)initWithPayment:(nonnull PayPalPayment *)payment + configuration:(nullable PayPalConfiguration *)configuration + delegate:(nonnull id)delegate; + +/// Delegate access +@property(nonatomic, weak, readonly, nullable) id paymentDelegate; + +/// PayPalPaymentViewControllerState See the state property for context. +typedef NS_ENUM(NSInteger, PayPalPaymentViewControllerState) { + /// The payment has not been sent. You MAY safely dismiss the PayPalPaymentViewController. + PayPalPaymentViewControllerStateUnsent = 0, + /// The payment is in progress. You MUST NOT dismiss the PayPalPaymentViewController. + PayPalPaymentViewControllerStateInProgress = 1, +}; + +/// Although irrelevant to most apps, if your app needs to know where the user is within +/// the payment flow, you can check this property. +/// (You can use key-value observing to watch for changes.) +/// +/// For example, perhaps your app would like to dismiss the PayPalPaymentViewController +/// if the user is taking so long to complete the payment flow that the item they +/// ordered has gone out of stock. +/// +/// - The state is initially set to PayPalPaymentViewControllerStateUnsent. +/// - When the user taps the final payment confirmation button, the state changes to +/// PayPalPaymentViewControllerStateInProgress. +/// - If the payment goes through successfully, the state remains at +/// PayPalPaymentViewControllerStateInProgress, and your app's +/// payPalPaymentViewController:didCompletePayment: method is called. +/// - If the payment fails, the state changes back to PayPalPaymentViewControllerStateUnsent. +/// (Also, an appropriate error message is displayed to the user). +@property(nonatomic, assign, readonly) PayPalPaymentViewControllerState state; + +@end diff --git a/Pods/Braintree/Braintree/PayPal/mSDK/PayPalProfileSharingViewController.h b/Pods/Braintree/Braintree/PayPal/mSDK/PayPalProfileSharingViewController.h new file mode 100644 index 0000000..238c2fb --- /dev/null +++ b/Pods/Braintree/Braintree/PayPal/mSDK/PayPalProfileSharingViewController.h @@ -0,0 +1,70 @@ +// +// PayPalProfileSharingViewController.h +// +// Version 2.14.1-bt1 +// +// Copyright (c) 2014-2016 PayPal, Inc. All rights reserved. +// All rights reserved. +// + +#import +#import "PayPalConfiguration.h" +#import "PayPalOAuthScopes.h" + +@class PayPalProfileSharingViewController; +typedef void (^PayPalProfileSharingDelegateCompletionBlock)(void); + +#pragma mark - PayPalProfileSharingDelegate + +/// Exactly one of these two required delegate methods will get called when the UI completes. +/// You MUST dismiss the modal view controller from these required delegate methods. +@protocol PayPalProfileSharingDelegate +@required + +/// User canceled without consenting. +/// Your code MUST dismiss the PayPalProfileSharingViewController. +/// @param profileSharingViewController The PayPalProfileSharingViewController that the user canceled without consenting. +- (void)userDidCancelPayPalProfileSharingViewController:(nonnull PayPalProfileSharingViewController *)profileSharingViewController; + +/// User successfully logged in and consented. +/// The PayPalProfileSharingViewController's activity indicator has been dismissed. +/// Your code MAY deal with the profileSharingAuthorization, if it did not already do so within your optional +/// PayPalProfileSharingViewController:userWillLogInWithAuthorization:completionBlock: method. +/// Your code MUST dismiss the PayPalProfileSharingViewController. +/// @param profileSharingViewController The PayPalProfileSharingViewController where the user successfully consented. +/// @param profileSharingAuthorization The authorization response, which you will return to your server. +- (void)payPalProfileSharingViewController:(nonnull PayPalProfileSharingViewController *)profileSharingViewController + userDidLogInWithAuthorization:(nonnull NSDictionary *)profileSharingAuthorization; + +@optional +/// User successfully logged in and consented. +/// The PayPalProfileSharingViewController's activity indicator is still visible. +/// Your code MAY deal with the profileSharingAuthorization; e.g., send it to your server and await confirmation. +/// Your code MUST finish by calling the completionBlock. +/// Your code must NOT dismiss the PayPalProfileSharingViewController. +/// @param profileSharingViewController The PayPalProfileSharingViewController where the user successfully consented. +/// @param profileSharingAuthorization The authorization response, which you will return to your server. +/// @param completionBlock Block to execute when your processing is done. +- (void)payPalProfileSharingViewController:(nonnull PayPalProfileSharingViewController *)profileSharingViewController + userWillLogInWithAuthorization:(nonnull NSDictionary *)profileSharingAuthorization + completionBlock:(nonnull PayPalProfileSharingDelegateCompletionBlock)completionBlock; +@end + + +#pragma mark - PayPalProfileSharingViewController + +@interface PayPalProfileSharingViewController : UINavigationController + +/// The designated initalizer. A new view controller MUST be initialized for each use. +/// @param scopeValues Set of requested scope-values. Each scope-value is defined in PayPalOAuthScopes.h. +/// @param configuration The configuration to be used for the lifetime of the controller +/// The configuration properties merchantName, merchantPrivacyPolicyURL, and merchantUserAgreementURL must be provided. +/// @param delegate The delegate you want to receive updates about the profile-sharing authorization. +- (nullable instancetype)initWithScopeValues:(nonnull NSSet *)scopeValues + configuration:(nonnull PayPalConfiguration *)configuration + delegate:(nullable id)delegate; + +/// Delegate access +@property (nonatomic, weak, readonly, nullable) id profileSharingDelegate; + +@end diff --git a/Pods/Braintree/Braintree/PayPal/mSDK/PayPalTouch.h b/Pods/Braintree/Braintree/PayPal/mSDK/PayPalTouch.h new file mode 100644 index 0000000..3ed5c6b --- /dev/null +++ b/Pods/Braintree/Braintree/PayPal/mSDK/PayPalTouch.h @@ -0,0 +1,92 @@ +// +// PayPalTouch.h +// +// Version 2.14.1-bt1 +// +// Copyright (c) 2014-2016 PayPal, Inc. All rights reserved. +// All rights reserved. +// + +#import +#import "PayPalConfiguration.h" + +typedef NS_ENUM(NSUInteger, PayPalTouchResultType) { + PayPalTouchResultTypeError, + PayPalTouchResultTypeCancel, + PayPalTouchResultTypeSuccess, +}; + +/// This class represents the result of the App Switch. +@interface PayPalTouchResult : NSObject +/// resultType can be success, cancel or some sort of an error +@property (nonatomic, readonly, assign) PayPalTouchResultType resultType; +/// When App Switch is successful the authorization dictionary +/// containing information that your server will need to process the payment. +@property (nullable, nonatomic, readonly, copy) NSDictionary *authorization; +/// This dictionary is always present when resultType is PayPalTouchResultTypeError. +/// This dictionary is sometimes present when resultType is PayPalTouchResultTypeCancel. +/// The "message" and "debug_id" are for developer integaration to help analyze a problem, +/// and never for user display. +@property (nullable, nonatomic, readonly, copy) NSDictionary *error; + +@end + +@class PayPalTouch; + +/// This class checks availability of auth via app switch, handles the app switch +/// and provides methods for use to handle results of auth via app switch. +/// +/// This class is offered for integrations that initiate app switch without +/// the PayPal UI, and thus must obtain and handle results directly. +/// For more typical drop-in handling +@interface PayPalTouch : NSObject + +#pragma mark - Direct PayPal Touch Auth + +/// Whether the authorizer is available on the device +/// and the current app is set up to receive the callback. +/// +/// @return YES if the authorization method is available ++ (BOOL)canAppSwitchForUrlScheme:(nonnull NSString*) scheme; + +/// Obtain future payments authorization via app switch. +/// +/// Available for backward compatibility. +/// Same functionality can be achieved using `authorizeScopeValues:configuration:` using required scopes. +/// +/// @param configuration The configuration to be used for the app switch +/// @return YES if app switch was successful ++ (BOOL)authorizeFuturePayments:(nonnull PayPalConfiguration *)configuration __attribute__((deprecated("Please use authorizeScopeValues:configuration: instead"))); + +/// @param scopeValues Set of requested scope-values. Each scope-value is defined in PayPalOAuthScopes.h. +/// @param configuration The configuration to be used for the app switch +/// @return YES if app switch was successful +/// @note Given limitations in the Wallet app, the only scopes allowed are: https://uri.../futurepayments, email, address, phone, openid ++ (BOOL)authorizeScopeValues:(nonnull NSSet *)scopeValues configuration:(nonnull PayPalConfiguration *)configuration; + +/// Process a URL request. +/// +/// This method is exposed for integrations that initiate app switch without +/// the PayPal UI, and thus must obtain and handle results directly. +/// +/// @param url The url to handle +/// @return PayPalTouchResult containing result of the App Switch. +/// ++ (nonnull PayPalTouchResult *)parseAppSwitchURL:(nonnull NSURL *)url; + +#pragma mark - Custom URL handling + +/// Whether the URL and source application are recognized and valid +/// for PayPal Touch. +/// +/// This method is exposed for integrations that initiate app switch without +/// the PayPal UI, and thus must obtain and handle results directly. +/// For more typical drop-in handling +/// +/// @param url The URL of the app switch request +/// @param sourceApplication The bundle ID of the source application +/// +/// @return Whether the application that made the request is valid. ++ (BOOL)canHandleURL:(nonnull NSURL *)url sourceApplication:(nonnull NSString *)sourceApplication; + +@end diff --git a/Pods/Braintree/Braintree/PayPal/mSDK/libPayPalMobile-BT.a b/Pods/Braintree/Braintree/PayPal/mSDK/libPayPalMobile-BT.a new file mode 100644 index 0000000..dd7e2b4 Binary files /dev/null and b/Pods/Braintree/Braintree/PayPal/mSDK/libPayPalMobile-BT.a differ diff --git a/Pods/Braintree/Braintree/Payments/@Public/BTPaymentMethodCreationDelegate.h b/Pods/Braintree/Braintree/Payments/@Public/BTPaymentMethodCreationDelegate.h new file mode 100644 index 0000000..73f9c68 --- /dev/null +++ b/Pods/Braintree/Braintree/Payments/@Public/BTPaymentMethodCreationDelegate.h @@ -0,0 +1,77 @@ +#import +#import + +#import "BTPaymentMethod.h" + +/// Protocol for receiving payment method creation lifecycle messages from +/// an object creating a payment method, such as BTPaymentButton, BTPaymentProvider and BTThreeDSecure. +@protocol BTPaymentMethodCreationDelegate + +/// The payment method creator requires presentation of a view controller in order to +/// proceed. +/// +/// Your implementation should present the viewController modally, e.g. via +/// `presentViewController:animated:completion:` +/// +/// @param sender The payment method creator +/// @param viewController The view controller to be presented +- (void)paymentMethodCreator:(id)sender requestsPresentationOfViewController:(UIViewController *)viewController; + +/// The payment method creator requires dismissal of a view controller. +/// +/// Your implementation should dismiss the viewController, e.g. via +/// `dismissViewControllerAnimated:completion:` +/// +/// @param sender The payment method creator +/// @param viewController The view controller to be dismissed +- (void)paymentMethodCreator:(id)sender requestsDismissalOfViewController:(UIViewController *)viewController; + +/// The payment method creator will perform an app switch in order to obtain user +/// payment authorization. +/// +/// Your implementation of this method should set your app to the state +/// it should be in if the user manually app-switches back to your app. +/// For example, re-enable any controls that are disabled. +/// +/// @param sender The payment method creator +- (void)paymentMethodCreatorWillPerformAppSwitch:(id)sender; + +/// The payment method creator, having obtained user payment details and/or user +/// authorization, will now process the results. +/// +/// This typically indicates asynchronous network activity. +/// When you receive this message, your UI should indicate activity. +/// +/// In the case of an app switch, this message indicates that the user has returned to this app. +/// +/// @param sender The payment method creator +- (void)paymentMethodCreatorWillProcess:(id)sender; + +/// The payment method creator has cancelled. +/// +/// @param sender The payment method creator +- (void)paymentMethodCreatorDidCancel:(id)sender; + +/// Payment method creation is complete with success. +/// +/// Typically, an implementation will convey this paymentMethod to your own server +/// for further use or to the user for final confirmation. +/// +/// @param sender The payment method creator +/// @param paymentMethod The resulting payment method +- (void)paymentMethodCreator:(id)sender didCreatePaymentMethod:(BTPaymentMethod *)paymentMethod; + +/// The payment method creator failed to create a payment method. +/// +/// A failure may occur at any point during payment method creation, such as: +/// - Payment authorization is initiated with an incompatible configuration (e.g. no authorization +/// mechanism possible for specified provider) +/// - An authorization provider (e.g. Venmo or PayPal) encounters an error +/// - A network or gateway error occurs +/// - The user-provided credentials led to a non-transactable payment method. +/// +/// @param sender The payment method creator +/// @param error An error that characterizes the failure +- (void)paymentMethodCreator:(id)sender didFailWithError:(NSError *)error; + +@end diff --git a/Pods/Braintree/Braintree/Payments/@Public/BTPaymentProvider.h b/Pods/Braintree/Braintree/Payments/@Public/BTPaymentProvider.h new file mode 100644 index 0000000..1cca7ee --- /dev/null +++ b/Pods/Braintree/Braintree/Payments/@Public/BTPaymentProvider.h @@ -0,0 +1,192 @@ +#import +#import + +#import "BTPaymentProviderErrors.h" +#import "BTClient.h" +#import "BTPaymentMethod.h" +#import "BTPaymentMethodCreationDelegate.h" + +/// Type of payment method creation +typedef NS_ENUM(NSInteger, BTPaymentProviderType) { + /// Authorize via PayPal + /// + /// Supports BTPaymentAuthorizationOptionMechanismAppSwitch and BTPaymentAuthorizationOptionMechanismViewController. + BTPaymentProviderTypePayPal = 0, + + /// Authorize via Venmo + /// + /// Supports BTPaymentAuthorizationOptionMechanismAppSwitch only. + BTPaymentProviderTypeVenmo, + + /// Authorize via Apple Pay + /// + /// Supports BTPaymentAuthorizationOptionMechanismViewController only. + BTPaymentProviderTypeApplePay, + + /// Authorize via Coinbase (beta) + /// + /// Supports BTPaymentAuthorizationOptionMechanismBrowserSwitch and BTPaymentAuthorizationOptionMechanismViewController. + BTPaymentProviderTypeCoinbase, +}; + + +/// Options for payment method creation +/// +/// These options designate how to authorize the user for the given payment option (BTPaymentProviderType). Each payment option supports a subset of these, as specified above. +typedef NS_OPTIONS(NSInteger, BTPaymentMethodCreationOptions) { + + /// Authorize via an app-switch to the provider's app if the app is already installed. + /// + /// If the target app is not installed, this mechanism will fail. + BTPaymentAuthorizationOptionMechanismAppSwitch = 1 << 0, + + /// Authorize via in-app view controller presentation. + BTPaymentAuthorizationOptionMechanismViewController = 1 << 1, + + /// Authorize via the best possible mechanism. + BTPaymentAuthorizationOptionMechanismAny = BTPaymentAuthorizationOptionMechanismAppSwitch | BTPaymentAuthorizationOptionMechanismViewController +}; + +/// Status of the last (or ongoing) payment method creation +typedef NS_ENUM(NSInteger, BTPaymentProviderStatus) { + /// The payment method was not created yet (default status) + BTPaymentProviderStatusUninitialized = 0, + + /// Payment method created (either PayPal, Venmo or ApplePay) + BTPaymentProviderStatusInitialized, + + /// The payment method creator, having obtained user payment details and/or user + /// authorization, is now processing the results + BTPaymentProviderStatusProcessing, + + /// Payment method failed with error + BTPaymentProviderStatusError, + + /// Payment method creation is complete with success + BTPaymentProviderStatusSuccess, + + /// The payment method creator has canceled + BTPaymentProviderStatusCanceled +}; + +/// The BTPaymentProvider enables you to collect payment information from the user. +/// +/// This class abstracts the various payment payment providers and authorization +/// techniques. After initialization, you must set a client and delegate before +/// calling `createPaymentMethod:`. The authorization may request (via the delegate) +/// that you present a view controller, e.g., a PayPal login screen. createPaymentMethod: may also +/// initiate an app switch if One Touch is available. (See also +[Braintree setReturnURLScheme:] and +/// +[Braintree handleOpenURL:sourceApplication:]) +/// +@interface BTPaymentProvider : NSObject + +/// Initializes a payment provider +/// +/// @param client The BTClient that is used for communicating with Braintree during payment method creation +/// +/// @return An initialized payment provider +- (instancetype)initWithClient:(BTClient *)client; + +- (id)init __attribute__((unavailable("Please use initWithClient:"))); + +/// BTClient to use during authorization +@property (nonatomic, strong) BTClient *client; + +/// Delegate to receive messages during payment authorization process +@property (nonatomic, weak) id delegate; + +/// Asynchronously create a payment method for the given payment type. +/// +/// Shorthand for `[authorize:type options:BTPaymentAuthorizationOptionMechanismAny]` +/// +/// When you invoke this method, a payment authorization flow will be initiated in order to +/// create a Venmo or PayPal payment methods. It may use One Touch (app switch) or accept identity +/// credentials in a view controller. +/// +/// In the happy path, the delegate will receive lifecycle notifications, culminating with +/// paymentMethodCreator:didCreatePaymentMethod:. The payment method will include a payment method +/// nonce and any available metadata for your checkout confirmation UI. +/// +/// The delegate's paymentAuthorizer:didFailWithError: will be invoked if +/// authorization cannot be initiated. +/// +/// @see createPaymentMethod:options: +/// +/// @param type The type of authorization to perform +- (void)createPaymentMethod:(BTPaymentProviderType)type; + +/// Asynchronously create a payment method for the given payment type and options. +/// +/// Use this method to alter the mechanisms used to create a payment method. +/// +/// @see createPaymentMethod: +/// +/// @param type The type of authorization to perform +/// @param options Authorization options +- (void)createPaymentMethod:(BTPaymentProviderType)type options:(BTPaymentMethodCreationOptions)options; + +/// Query whether it will be possible to create a payment method of the specified type. +/// +/// @return YES if this payment provider could create a payment method of the specified type +- (BOOL)canCreatePaymentMethodWithProviderType:(BTPaymentProviderType)type; + +/// Status of the last (or ongoing) payment method creation +@property (nonatomic, assign) BTPaymentProviderStatus status; + +#if BT_ENABLE_APPLE_PAY + +#pragma mark Payment Request Details + +/// An array of PKPaymentSummaryItems +/// +/// Currently only affects Apple Pay payments. +@property (nonatomic, strong) NSArray *paymentSummaryItems; + +/// The set of required billing address fields (defaults to none) +/// +/// Currently only affects Apple Pay payments. +@property (nonatomic, assign) PKAddressField requiredBillingAddressFields; + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + +/// The customer's billing address for pre-populating the checkout form +/// +/// Currently only affects Apple Pay payments. +@property (nonatomic, assign) ABRecordRef billingAddress; + +/// The customer's billing address for pre-populating the checkout form +/// +/// Currently only affects Apple Pay payments. +@property (nonatomic, assign) ABRecordRef shippingAddress; + +#pragma clang diagnostic pop + +/// The billing contact for pre-populating the checkout form +/// +/// Currently only affects Apple Pay payments. +@property (nonatomic, strong) PKContact *billingContact; + +/// The shipping contact for pre-populating the checkout form +/// +/// Currently only affects Apple Pay payments. +@property (nonatomic, strong) PKContact *shippingContact; + +/// The set of required billing address fields (defaults to none) +/// +/// Currently only affects Apple Pay payments. +@property (nonatomic, assign) PKAddressField requiredShippingAddressFields; + +/// Available shipping methods +/// +/// Currently only affects Apple Pay payments. +@property (nonatomic, copy) NSArray *shippingMethods; + +/// Supported payment networks +/// +/// Currently only affects Apple Pay payments. +@property (nonatomic, copy) NSArray *supportedNetworks; + +#endif + +@end diff --git a/Pods/Braintree/Braintree/Payments/@Public/BTPaymentProviderErrors.h b/Pods/Braintree/Braintree/Payments/@Public/BTPaymentProviderErrors.h new file mode 100644 index 0000000..cc9173a --- /dev/null +++ b/Pods/Braintree/Braintree/Payments/@Public/BTPaymentProviderErrors.h @@ -0,0 +1,21 @@ +#import + +#pragma mark Braintree-Payments Errors + +/// BTPaymentAuthorization NSError Domain +extern NSString *const BTPaymentProviderErrorDomain; + +/// BTPaymentAuthorization NSError Codes +typedef NS_ENUM(NSInteger, BTPaymentProviderErrorCode) { + /// An unknown error related to creatingi a Braintree Payment Method + BTPaymentProviderErrorUnknown = 0, + + /// An incompatible payment type and option was specified (e.g. Venmo via View Controller) + BTPaymentProviderErrorOptionNotSupported, + + /// An error occured starting the user-facing payment method creation flow (e.g. App switch failed) + BTPaymentProviderErrorInitialization, + + /// An error occured creating a Braintree Payment Method from the Apple Pay token + BTPaymentProviderErrorPaymentMethodCreation, +}; diff --git a/Pods/Braintree/Braintree/Payments/@Public/Braintree-Payments.h b/Pods/Braintree/Braintree/Payments/@Public/Braintree-Payments.h new file mode 100644 index 0000000..c43c472 --- /dev/null +++ b/Pods/Braintree/Braintree/Payments/@Public/Braintree-Payments.h @@ -0,0 +1,3 @@ +/// All-in-one import for the Braintree iOS SDK + +#import "BTPaymentProvider.h" diff --git a/Pods/Braintree/Braintree/Payments/BTPaymentApplePayProvider.h b/Pods/Braintree/Braintree/Payments/BTPaymentApplePayProvider.h new file mode 100644 index 0000000..72b47be --- /dev/null +++ b/Pods/Braintree/Braintree/Payments/BTPaymentApplePayProvider.h @@ -0,0 +1,60 @@ +#import + +@class BTClient; +#import "BTPaymentMethodCreationDelegate.h" + +/// A service class that provides a v.zero-specific wrapper around Apple Pay +/// +/// Like BTPaymentProvider, this class facilities payment via +/// the BTPaymentMethodCreationDelegate protocol. Rather than requesting or creating a +/// view controller, you should call `authorizeApplePay`. When requested to do so, you +/// should present a view controller. +/// +/// The view controller you receive may be a real PKPaymentAuthorizationViewController or +/// a mock view controller for sandbox testing. +@interface BTPaymentApplePayProvider : NSObject + +/// Initializes an Apple Pay Provider +/// +/// @param client a BTClient that is used to upload the encrypted payment data to Braintree +/// +/// @return An initialized Apple Pay provider +- (instancetype)initWithClient:(BTClient *)client NS_DESIGNATED_INITIALIZER; + +/// A required delegate that should receive notifications about the payment method +/// creation lifecycle. +/// +/// @note You must set this delegate before calling `authorizeApplePay`. +@property (nonatomic, weak) id delegate; + +#if BT_ENABLE_APPLE_PAY +@property (nonatomic, strong) NSArray *paymentSummaryItems; +@property (nonatomic, assign) PKAddressField requiredBillingAddressFields; +@property (nonatomic, assign) PKAddressField requiredShippingAddressFields; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" +@property (nonatomic, assign) ABRecordRef billingAddress; +@property (nonatomic, assign) ABRecordRef shippingAddress; +#pragma clang diagnostic pop +@property (nonatomic, strong) PKContact *billingContact; +@property (nonatomic, strong) PKContact *shippingContact; + +@property (nonatomic, strong) NSArray *shippingMethods; +@property (nonatomic, strong) NSArray *supportedNetworks; +#endif + +/// Checks whether Apple Pay is possible, considering the current environment, simulator status, +/// device, OS, etc. +/// +/// This method is useful for determining whether to present UI related to Apple Pay to your user. +/// You should avoid displaying Apple Pay as a payment option when it is unavailable. +/// +/// @return `NO` if `authorizeApplePay` will definitely result in an error, `YES` otherwise +- (BOOL)canAuthorizeApplePayPayment; + +/// Initialize Apple Pay. +/// +/// @note You must set a delegate before calling this method. +- (void)authorizeApplePay; + +@end diff --git a/Pods/Braintree/Braintree/Payments/BTPaymentApplePayProvider.m b/Pods/Braintree/Braintree/Payments/BTPaymentApplePayProvider.m new file mode 100644 index 0000000..05f03c9 --- /dev/null +++ b/Pods/Braintree/Braintree/Payments/BTPaymentApplePayProvider.m @@ -0,0 +1,381 @@ +@import PassKit; + +#import "BTPaymentApplePayProvider_Internal.h" +#import "BTClient_Internal.h" +#import "BTMockApplePayPaymentAuthorizationViewController.h" +#import "BTPaymentMethodCreationDelegate.h" +#import "BTPaymentProviderErrors.h" +#import "BTLogger_Internal.h" +#import "BTAPIResponseParser.h" +#import "BTClientTokenApplePayStatusValueTransformer.h" + +#if BT_ENABLE_APPLE_PAY +@interface BTPaymentApplePayProvider () +#else +@interface BTPaymentApplePayProvider () +#endif + +@property (nonatomic, strong) BTClient *client; +@property (nonatomic, strong) NSError *applePayError; +@property (nonatomic, strong) BTPaymentMethod *applePayPaymentMethod; + +- (instancetype)init NS_DESIGNATED_INITIALIZER DEPRECATED_ATTRIBUTE; + +@end + +@implementation BTPaymentApplePayProvider + +- (instancetype)init { + return [super init]; +} + +- (instancetype)initWithClient:(BTClient *)client { + self = [super init]; + if (self) { + self.client = client; + } + return self; +} + +- (BOOL)canAuthorizeApplePayPayment { + static NSString *const failureEvent = @"ios.apple-pay-provider.check.fail"; + static NSString *const successEvent = @"ios.apple-pay-provider.check.succeed"; + + BOOL result = [self canAuthorizeApplePayPaymentWithoutAnalytics]; + [self.client postAnalyticsEvent:result ? successEvent : failureEvent]; + return result; +} + +- (BOOL)canAuthorizeApplePayPaymentWithoutAnalytics { +#if BT_ENABLE_APPLE_PAY + if (![PKPayment class]) { + return NO; + } + + if (self.client.configuration.applePayStatus == BTClientApplePayStatusOff) { + return NO; + } + + if (![self paymentAuthorizationViewControllerCanMakePayments]) { + return NO; + } + + return YES; +#else + return NO; +#endif +} + +- (void)authorizeApplePay { +#if BT_ENABLE_APPLE_PAY + if (![PKPayment class]) { + NSError *error = [NSError errorWithDomain:BTPaymentProviderErrorDomain + code:BTPaymentProviderErrorOptionNotSupported + userInfo:@{ NSLocalizedDescriptionKey: @"Apple Pay is not supported in this version of the iOS SDK" }]; + [self informDelegateDidFailWithError:error]; + return; + } + + if (!self.delegate) { + NSError *error = [NSError errorWithDomain:BTPaymentProviderErrorDomain + code:BTPaymentProviderErrorInitialization + userInfo:@{ NSLocalizedDescriptionKey: @"Delegate must not be nil to start Apple Pay authorization" }]; + [self informDelegateDidFailWithError:error]; + return; + } + + if (self.client.configuration.applePayStatus == BTClientApplePayStatusOff) { + NSError *error = [NSError errorWithDomain:BTPaymentProviderErrorDomain + code:BTPaymentProviderErrorOptionNotSupported + userInfo:@{ NSLocalizedDescriptionKey: @"Apple Pay is not enabled for this merchant account" }]; + [self informDelegateDidFailWithError:error]; + return; + } + + if (![self canAuthorizeApplePayPaymentWithoutAnalytics]) { + NSError *error = [NSError errorWithDomain:BTPaymentProviderErrorDomain + code:BTPaymentProviderErrorInitialization + userInfo:@{ NSLocalizedDescriptionKey: @"Failed to initialize a Apple Pay authorization view controller. Check device, OS version, cards in Passbook and configuration." }]; + [self informDelegateDidFailWithError:error]; + return; + } + + PKPaymentRequest *paymentRequest = self.paymentRequest; + + if (!paymentRequest) { + NSError *error = [NSError errorWithDomain:BTPaymentProviderErrorDomain + code:BTPaymentProviderErrorInitialization + userInfo:@{ NSLocalizedDescriptionKey: @"Failed to initialize an Apple Pay PKPaymentRequest based on the client token configuration." }]; + [self informDelegateDidFailWithError:error]; + return; + } + + if (![paymentRequest.paymentSummaryItems count]) { + NSError *error = [NSError errorWithDomain:BTPaymentProviderErrorDomain + code:BTPaymentProviderErrorInitialization + userInfo:@{ NSLocalizedDescriptionKey: @"Apple Pay cannot be initialized because paymentSummaryItems are not set. Please set them via the BTPaymentProvider paymentSummaryItems" }]; + [self informDelegateDidFailWithError:error]; + return; + } + + + UIViewController *paymentAuthorizationViewController = [self paymentAuthorizationViewControllerWithPaymentRequest:paymentRequest]; + if (paymentAuthorizationViewController == nil) { + NSError *error = [NSError errorWithDomain:BTPaymentProviderErrorDomain + code:BTPaymentProviderErrorInitialization + userInfo:@{ NSLocalizedDescriptionKey: @"Failed to initialize a Apple Pay authorization view controller. Check device, OS version, cards in Passbook and configuration." }]; + [self informDelegateDidFailWithError:error]; + return; + } + + [self informDelegateRequestsPresentationOfViewController:paymentAuthorizationViewController]; +#else + NSError *error = [NSError errorWithDomain:BTPaymentProviderErrorDomain + code:BTPaymentProviderErrorInitialization + userInfo:@{ NSLocalizedDescriptionKey: @"Apple Pay is not enabled in this build. Please use the Braintree/Apple-Pay CocoaPod subspec and ensure you have a BT_ENABLE_APPLE_PAY=1 preprocessor macro in your build settings." }]; + [self informDelegateDidFailWithError:error]; +#if DEBUG + @throw [NSException exceptionWithName:@"Apple Pay not enabled" reason:error.localizedDescription userInfo:nil]; +#else + [[BTLogger sharedLogger] error:error.localizedDescription]; +#endif +#endif +} + +#if BT_ENABLE_APPLE_PAY + +- (UIViewController *)paymentAuthorizationViewControllerWithPaymentRequest:(PKPaymentRequest *)paymentRequest { + UIViewController *paymentAuthorizationViewController; + + if ([[self class] isSimulator]) { + paymentAuthorizationViewController = ({ + BTMockApplePayPaymentAuthorizationViewController *mockVC = [[BTMockApplePayPaymentAuthorizationViewController alloc] initWithPaymentRequest:paymentRequest]; + mockVC.delegate = self; + mockVC; + }); + } else { + paymentAuthorizationViewController = ({ + PKPaymentAuthorizationViewController *realVC = [[PKPaymentAuthorizationViewController alloc] initWithPaymentRequest:paymentRequest]; + realVC.delegate = self; + realVC; + }); + } + return paymentAuthorizationViewController; +} + +- (PKPaymentRequest *)paymentRequest { + if (![PKPaymentRequest class]) { + return nil; + } + + PKPaymentRequest *paymentRequest = [[PKPaymentRequest alloc] init]; + paymentRequest.merchantCapabilities = PKMerchantCapability3DS; + paymentRequest.currencyCode = self.client.configuration.applePayCurrencyCode; + paymentRequest.countryCode = self.client.configuration.applePayCountryCode; + paymentRequest.merchantIdentifier = self.client.configuration.applePayMerchantIdentifier; + paymentRequest.supportedNetworks = self.client.configuration.applePaySupportedNetworks; + + if (self.paymentSummaryItems) { + paymentRequest.paymentSummaryItems = self.paymentSummaryItems; + } + + if (self.requiredBillingAddressFields) { + paymentRequest.requiredBillingAddressFields = self.requiredBillingAddressFields; + } + + if (self.requiredShippingAddressFields) { + paymentRequest.requiredShippingAddressFields = self.requiredShippingAddressFields; + } + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + if (self.shippingAddress) { + paymentRequest.shippingAddress = self.shippingAddress; + } + + if (self.billingAddress) { + paymentRequest.billingAddress = self.billingAddress; + } +#pragma clang diagnostic pop + + if (self.shippingContact) { + paymentRequest.shippingContact = self.shippingContact; + } + + if (self.billingContact) { + paymentRequest.billingContact = self.billingContact; + } + + if (self.shippingMethods) { + paymentRequest.shippingMethods = self.shippingMethods; + } + + if (self.supportedNetworks) { + paymentRequest.supportedNetworks = self.supportedNetworks; + } + + return paymentRequest; +} + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + +- (void)setBillingAddress:(ABRecordRef)billingAddress { + _billingAddress = CFRetain(billingAddress); +} + +- (void)setShippingAddress:(ABRecordRef)shippingAddress { + _shippingAddress = CFRetain(shippingAddress); +} + +#pragma clang diagnostic pop + +- (void)dealloc { + if (_billingAddress) { + CFRelease(_billingAddress); + } + + if (_shippingAddress) { + CFRelease(_shippingAddress); + } +} +#endif + +#pragma mark Internal Helpers - Exposed for Testing + ++ (BOOL)isSimulator { +#if TARGET_IPHONE_SIMULATOR + return YES; +#else + return NO; +#endif +} + +- (BOOL)paymentAuthorizationViewControllerCanMakePayments { +#if BT_ENABLE_APPLE_PAY + if (![PKPaymentAuthorizationViewController class]) { + return NO; + } + if ([[self class] isSimulator]) { + return [BTMockApplePayPaymentAuthorizationViewController canMakePayments]; + } else { + return [PKPaymentAuthorizationViewController canMakePaymentsUsingNetworks:self.paymentRequest.supportedNetworks]; + } +#else + return NO; +#endif +} + +#pragma mark PKPaymentAuthorizationViewController Delegate + +#if BT_ENABLE_APPLE_PAY +- (void)paymentAuthorizationViewController:(__unused PKPaymentAuthorizationViewController *)controller + didAuthorizePayment:(PKPayment *)payment + completion:(void (^)(PKPaymentAuthorizationStatus))completion { + [self applePayPaymentAuthorizationViewControllerDidAuthorizePayment:payment + completion:completion]; +} + +- (void)paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller { + [self applePayPaymentAuthorizationViewControllerDidFinish:controller]; +} +#endif + +#pragma mark MockApplePayPaymentAuthorizationViewController Delegate + +#if BT_ENABLE_APPLE_PAY +- (void)mockApplePayPaymentAuthorizationViewController:(__unused BTMockApplePayPaymentAuthorizationViewController *)viewController + didAuthorizePayment:(PKPayment *)payment + completion:(void (^)(PKPaymentAuthorizationStatus))completion { + [self applePayPaymentAuthorizationViewControllerDidAuthorizePayment:payment + completion:completion]; +} + +- (void)mockApplePayPaymentAuthorizationViewControllerDidFinish:(BTMockApplePayPaymentAuthorizationViewController *)viewController { + [self applePayPaymentAuthorizationViewControllerDidFinish:viewController]; +} +#endif + +#pragma mark Payment Authorization + +#if BT_ENABLE_APPLE_PAY +- (void)applePayPaymentAuthorizationViewControllerDidAuthorizePayment:(PKPayment *)payment completion:(void (^)(PKPaymentAuthorizationStatus))completion { + [self.client saveApplePayPayment:payment + success:^(BTApplePayPaymentMethod *applePayPaymentMethod) { + self.applePayPaymentMethod = applePayPaymentMethod; + completion(PKPaymentAuthorizationStatusSuccess); + } failure:^(NSError *error) { + self.applePayError = [NSError errorWithDomain:BTPaymentProviderErrorDomain + code:BTPaymentProviderErrorPaymentMethodCreation + userInfo:@{NSLocalizedDescriptionKey: @"Error processing Apple Payment with Braintree", + NSUnderlyingErrorKey: error}]; + completion(PKPaymentAuthorizationStatusFailure); + }]; +} +#endif + +- (void)applePayPaymentAuthorizationViewControllerDidFinish:(UIViewController *)viewController { + if (self.applePayError) { + [self informDelegateDidFailWithError:self.applePayError]; + } else if (self.applePayPaymentMethod) { + [self informDelegateDidCreatePaymentMethod:self.applePayPaymentMethod]; + } else { + [self informDelegateDidCancel]; + } + + self.applePayError = nil; + self.applePayPaymentMethod = nil; + + [self informDelegateRequestsDismissalOfAuthorizationViewController:viewController]; +} + +#pragma mark Delegate Informers + +- (void)informDelegateWillPerformAppSwitch { + if ([self.delegate respondsToSelector:@selector(paymentMethodCreatorWillPerformAppSwitch:)]) { + [self.delegate paymentMethodCreatorWillPerformAppSwitch:self]; + } +} + +- (void)informDelegateWillProcess { + [self.client postAnalyticsEvent:@"ios.apple-pay-provider.will-process"]; + if ([self.delegate respondsToSelector:@selector(paymentMethodCreatorWillProcess:)]) { + [self.delegate paymentMethodCreatorWillProcess:self]; + } +} + +- (void)informDelegateRequestsPresentationOfViewController:(UIViewController *)viewController { + [self.client postAnalyticsEvent:@"ios.apple-pay-provider.start"]; + if ([self.delegate respondsToSelector:@selector(paymentMethodCreator:requestsPresentationOfViewController:)]) { + [self.delegate paymentMethodCreator:self requestsPresentationOfViewController:viewController]; + } +} + +- (void)informDelegateRequestsDismissalOfAuthorizationViewController:(UIViewController *)viewController { + if ([self.delegate respondsToSelector:@selector(paymentMethodCreator:requestsDismissalOfViewController:)]) { + [self.delegate paymentMethodCreator:self requestsDismissalOfViewController:viewController]; + } +} + +- (void)informDelegateDidCreatePaymentMethod:(BTPaymentMethod *)paymentMethod { + [self.client postAnalyticsEvent:@"ios.apple-pay-provider.completion.succeed"]; + if ([self.delegate respondsToSelector:@selector(paymentMethodCreator:didCreatePaymentMethod:)]) { + [self.delegate paymentMethodCreator:self didCreatePaymentMethod:paymentMethod]; + } +} + +- (void)informDelegateDidFailWithError:(NSError *)error { + [self.client postAnalyticsEvent:@"ios.apple-pay-provider.completion.fail"]; + if ([self.delegate respondsToSelector:@selector(paymentMethodCreator:didFailWithError:)]) { + [self.delegate paymentMethodCreator:self didFailWithError:error]; + } +} + +- (void)informDelegateDidCancel { + [self.client postAnalyticsEvent:@"ios.apple-pay-provider.completion.cancel"]; + if ([self.delegate respondsToSelector:@selector(paymentMethodCreatorDidCancel:)]) { + [self.delegate paymentMethodCreatorDidCancel:self]; + } +} + +@end diff --git a/Pods/Braintree/Braintree/Payments/BTPaymentApplePayProvider_Internal.h b/Pods/Braintree/Braintree/Payments/BTPaymentApplePayProvider_Internal.h new file mode 100644 index 0000000..369976b --- /dev/null +++ b/Pods/Braintree/Braintree/Payments/BTPaymentApplePayProvider_Internal.h @@ -0,0 +1,12 @@ +#import "BTPaymentApplePayProvider.h" + +@interface BTPaymentApplePayProvider () + ++ (BOOL)isSimulator; +- (BOOL)paymentAuthorizationViewControllerCanMakePayments; + +#if BT_ENABLE_APPLE_PAY +- (UIViewController *)paymentAuthorizationViewControllerWithPaymentRequest:(PKPaymentRequest *)paymentRequest; +#endif + +@end diff --git a/Pods/Braintree/Braintree/Payments/BTPaymentProvider.m b/Pods/Braintree/Braintree/Payments/BTPaymentProvider.m new file mode 100644 index 0000000..24ecb62 --- /dev/null +++ b/Pods/Braintree/Braintree/Payments/BTPaymentProvider.m @@ -0,0 +1,403 @@ +@import PassKit; + +#import "BTPaymentProvider.h" +#import "BTClient_Internal.h" +#import "BTAppSwitch.h" +#import "BTAppSwitching.h" + +#import "BTPayPalViewController.h" +#import "BTClient+BTPayPal.h" +#import "BTPaymentApplePayProvider.h" +#import "BTLogger_Internal.h" + + +@interface BTPaymentProvider () +@property (nonatomic, strong) BTPaymentApplePayProvider *applePayPaymentProvider; +@end + +@implementation BTPaymentProvider + +- (instancetype)initWithClient:(BTClient *)client { + self = [super init]; + if (self) { + self.client = client; + } + return self; +} + +- (BTPaymentApplePayProvider *)applePayPaymentProvider { + if (!_applePayPaymentProvider) { + _applePayPaymentProvider = [[BTPaymentApplePayProvider alloc] initWithClient:self.client]; + _applePayPaymentProvider.delegate = self; + } + return _applePayPaymentProvider; +} + +- (void)createPaymentMethod:(BTPaymentProviderType)type { + [self createPaymentMethod:type options:BTPaymentAuthorizationOptionMechanismAny]; +} + +- (void)createPaymentMethod:(BTPaymentProviderType)type options:(BTPaymentMethodCreationOptions)options { + [self setStatus:BTPaymentProviderStatusInitialized]; + + switch (type) { + case BTPaymentProviderTypePayPal: + [self authorizePayPal:options]; + break; + case BTPaymentProviderTypeVenmo: + [self authorizeVenmo:options]; + break; + case BTPaymentProviderTypeApplePay: + [self authorizeApplePay:options]; + break; + case BTPaymentProviderTypeCoinbase: + [self authorizeCoinbase]; + break; + default: + break; + } +} + +- (void)setClient:(BTClient *)client { + _client = client; + + // If PayPal is a possibility with this client, prepare. + if ([self.client btPayPal_isPayPalEnabled]) { + NSError *error; + [self.client btPayPal_preparePayPalMobileWithError:&error]; + if (error) { + [self.client postAnalyticsEvent:@"ios.authorizer.init.paypal-error"]; + [[BTLogger sharedLogger] error:@"PayPal is unavailable: %@", [error localizedDescription]]; + } + } +} + +- (BOOL)canCreatePaymentMethodWithProviderType:(BTPaymentProviderType)type { + switch (type) { + case BTPaymentProviderTypeApplePay: + return [self.applePayPaymentProvider canAuthorizeApplePayPayment]; + case BTPaymentProviderTypePayPal: + return [self.client btPayPal_isPayPalEnabled]; + case BTPaymentProviderTypeVenmo: { + id appSwitching = [[BTAppSwitch sharedInstance] appSwitchingForApp:BTAppTypeVenmo]; + return [appSwitching appSwitchAvailableForClient:self.client]; + } + case BTPaymentProviderTypeCoinbase: { + id appSwitching = [[BTAppSwitch sharedInstance] appSwitchingForApp:BTAppTypeCoinbase]; + return [appSwitching appSwitchAvailableForClient:self.client]; + } + default: return NO; + } +} + + +#pragma mark Apple Pay + +- (void)authorizeApplePay:(BTPaymentMethodCreationOptions)options { + if ((options & BTPaymentAuthorizationOptionMechanismViewController) == 0) { + NSError *error = [NSError errorWithDomain:BTPaymentProviderErrorDomain + code:BTPaymentProviderErrorOptionNotSupported + userInfo:@{NSLocalizedDescriptionKey: @"Apple Pay requires option BTPaymentAuthorizationOptionMechanismViewController"}]; + [self informDelegateDidFailWithError:error andPostAnalyticsEvent:NO]; + return; + } + + [self.applePayPaymentProvider authorizeApplePay]; +} + +#pragma mark Venmo + +- (void)authorizeVenmo:(BTPaymentMethodCreationOptions)options { + + if ((options & BTPaymentAuthorizationOptionMechanismAppSwitch) == 0) { + NSError *error = [NSError errorWithDomain:BTPaymentProviderErrorDomain code:BTPaymentProviderErrorOptionNotSupported userInfo:nil]; + [self informDelegateDidFailWithError:error andPostAnalyticsEvent:NO]; + return; + } + + NSError *error; + BOOL appSwitchSuccess = [[[BTAppSwitch sharedInstance] appSwitchingForApp:BTAppTypeVenmo] initiateAppSwitchWithClient:self.client delegate:self error:&error]; + if (appSwitchSuccess) { + [self informDelegateWillPerformAppSwitch]; + } else { + if (!error) { + error = [NSError errorWithDomain:BTPaymentProviderErrorDomain code:BTPaymentProviderErrorUnknown userInfo:@{NSLocalizedDescriptionKey: @"App Switch did not initiate, but did not return an error"}]; + } + [self informDelegateDidFailWithError:error andPostAnalyticsEvent:YES]; + } +} + +#pragma mark PayPal + +- (void)authorizePayPal:(BTPaymentMethodCreationOptions)options { + + BOOL appSwitchOptionEnabled = (options & BTPaymentAuthorizationOptionMechanismAppSwitch) == BTPaymentAuthorizationOptionMechanismAppSwitch; + BOOL viewControllerOptionEnabled = (options & BTPaymentAuthorizationOptionMechanismViewController) == BTPaymentAuthorizationOptionMechanismViewController; + + if (!appSwitchOptionEnabled && !viewControllerOptionEnabled) { + NSError *error = [NSError errorWithDomain:BTPaymentProviderErrorDomain code:BTPaymentProviderErrorOptionNotSupported userInfo:@{ NSLocalizedDescriptionKey: @"At least one of BTPaymentAuthorizationOptionMechanismAppSwitch or BTPaymentAuthorizationOptionMechanismViewController must be enabled in options" }]; + [self informDelegateDidFailWithError:error andPostAnalyticsEvent:NO]; + return; + } + + NSError *error; + BOOL initiated = NO; + if (appSwitchOptionEnabled) { + + BOOL appSwitchSuccess = [[[BTAppSwitch sharedInstance] appSwitchingForApp:BTAppTypePayPal] initiateAppSwitchWithClient:self.client delegate:self error:&error]; + if (appSwitchSuccess) { + initiated = YES; + [self informDelegateWillPerformAppSwitch]; + } else { + NSMutableString *message = [@"PayPal Touch is not available." mutableCopy]; + if (error.userInfo[NSLocalizedDescriptionKey]) { + [message appendFormat:@" Reason: \"%@\"", error.userInfo[NSLocalizedDescriptionKey]]; + } + [[BTLogger sharedLogger] log:message]; + } + } + + if(!initiated && viewControllerOptionEnabled) { + + BTPayPalViewController *braintreePayPalViewController = [[BTPayPalViewController alloc] initWithClient:self.client]; + if (braintreePayPalViewController) { + braintreePayPalViewController.delegate = self; + [self informDelegateRequestsPresentationOfViewController:braintreePayPalViewController]; + initiated = YES; + } else { + NSError *error = [NSError errorWithDomain:BTPaymentProviderErrorDomain + code:BTPaymentProviderErrorInitialization + userInfo:@{ NSLocalizedDescriptionKey: @"Failed to initialize BTPayPalViewController" }]; + [self informDelegateDidFailWithError:error andPostAnalyticsEvent:YES]; + } + } + + if (!initiated) { + NSMutableDictionary *userInfo = [@{ NSLocalizedDescriptionKey: @"PayPal authorization failed" } mutableCopy]; + if (error != nil) { + userInfo[NSUnderlyingErrorKey] = error; + } + [NSError errorWithDomain:BTPaymentProviderErrorDomain code:BTPaymentProviderErrorUnknown userInfo:userInfo]; + [self informDelegateDidFailWithError:error andPostAnalyticsEvent:YES]; + } +} + + +#pragma mark Coinbase + +- (void)authorizeCoinbase { + NSError *error; + BOOL appSwitchSuccess = [[[BTAppSwitch sharedInstance] appSwitchingForApp:BTAppTypeCoinbase] initiateAppSwitchWithClient:self.client delegate:self error:&error]; + if (appSwitchSuccess) { + [self informDelegateWillPerformAppSwitch]; + } else { + [self informDelegateDidFailWithError:error andPostAnalyticsEvent:YES]; + } +} + + +#pragma mark Inform Delegate + +- (void)informDelegateWillPerformAppSwitch { + [self.client postAnalyticsEvent:@"ios.authorizer.will-app-switch"]; + if ([self.delegate respondsToSelector:@selector(paymentMethodCreatorWillPerformAppSwitch:)]) { + [self.delegate paymentMethodCreatorWillPerformAppSwitch:self]; + } +} + +- (void)informDelegateWillProcess { + [self setStatus:BTPaymentProviderStatusProcessing]; + + [self.client postAnalyticsEvent:@"ios.authorizer.will-process-authorization-response"]; + if ([self.delegate respondsToSelector:@selector(paymentMethodCreatorWillProcess:)]) { + [self.delegate paymentMethodCreatorWillProcess:self]; + } +} + +- (void)informDelegateRequestsPresentationOfViewController:(UIViewController *)viewController { + [self.client postAnalyticsEvent:@"ios.authorizer.requests-authorization-with-view-controller"]; + if ([self.delegate respondsToSelector:@selector(paymentMethodCreator:requestsPresentationOfViewController:)]) { + [self.delegate paymentMethodCreator:self requestsPresentationOfViewController:viewController]; + } +} + +- (void)informDelegateRequestsDismissalOfAuthorizationViewController:(UIViewController *)viewController { + [self.client postAnalyticsEvent:@"ios.authorizer.requests-dismissal-of-authorization-view-controller"]; + if ([self.delegate respondsToSelector:@selector(paymentMethodCreator:requestsDismissalOfViewController:)]) { + [self.delegate paymentMethodCreator:self requestsDismissalOfViewController:viewController]; + } +} + +- (void)informDelegateDidCreatePaymentMethod:(BTPaymentMethod *)paymentMethod { + [self setStatus:BTPaymentProviderStatusSuccess]; + + [self.client postAnalyticsEvent:@"ios.authorizer.did-create-payment-method"]; + if ([self.delegate respondsToSelector:@selector(paymentMethodCreator:didCreatePaymentMethod:)]) { + [self.delegate paymentMethodCreator:self didCreatePaymentMethod:paymentMethod]; + } +} + +- (void)informDelegateDidFailWithError:(NSError *)error andPostAnalyticsEvent:(BOOL)postAnalyticsEvent { + [self setStatus:BTPaymentProviderStatusError]; + + if (postAnalyticsEvent) { + [self.client postAnalyticsEvent:@"ios.authorizer.did-fail-with-error"]; + } + + if ([self.delegate respondsToSelector:@selector(paymentMethodCreator:didFailWithError:)]) { + [self.delegate paymentMethodCreator:self didFailWithError:error]; + } +} + +- (void)informDelegateDidCancel { + [self setStatus:BTPaymentProviderStatusCanceled]; + + [self.client postAnalyticsEvent:@"ios.authorizer.did-cancel"]; + if ([self.delegate respondsToSelector:@selector(paymentMethodCreatorDidCancel:)]) { + [self.delegate paymentMethodCreatorDidCancel:self]; + } +} + +#pragma mark BTPayPalViewControllerDelegate + +- (void)payPalViewControllerWillCreatePayPalPaymentMethod:(__unused BTPayPalViewController *)viewController { + [self informDelegateWillProcess]; +} + +- (void)payPalViewController:(BTPayPalViewController *)viewController didCreatePayPalPaymentMethod:(BTPayPalPaymentMethod *)payPalPaymentMethod { + [self setStatus:BTPaymentProviderStatusSuccess]; + + [self informDelegateRequestsDismissalOfAuthorizationViewController:viewController]; + [self informDelegateDidCreatePaymentMethod:payPalPaymentMethod]; +} + +- (void)payPalViewController:(__unused BTPayPalViewController *)viewController didFailWithError:(NSError *)error { + [self setStatus:BTPaymentProviderStatusError]; + + [self informDelegateRequestsDismissalOfAuthorizationViewController:viewController]; + [self informDelegateDidFailWithError:error andPostAnalyticsEvent:YES]; +} + +- (void)payPalViewControllerDidCancel:(BTPayPalViewController *)viewController { + [self setStatus:BTPaymentProviderStatusCanceled]; + + [self informDelegateRequestsDismissalOfAuthorizationViewController:viewController]; + [self informDelegateDidCancel]; +} + +#pragma mark BTAppSwitchingDelegate + +- (void)appSwitcherWillCreatePaymentMethod:(__unused id)switcher { + [self informDelegateWillProcess]; +} + +- (void)appSwitcher:(__unused id)switcher didCreatePaymentMethod:(BTPaymentMethod *)paymentMethod { + [self informDelegateDidCreatePaymentMethod:paymentMethod]; +} + +- (void)appSwitcher:(__unused id)switcher didFailWithError:(NSError *)error { + [self informDelegateDidFailWithError:error andPostAnalyticsEvent:YES]; +} + +- (void)appSwitcherDidCancel:(__unused id)switcher { + [self informDelegateDidCancel]; +} + +#pragma mark BTPaymentMethodCreationDelegate + +- (void)paymentMethodCreator:(__unused id)sender requestsPresentationOfViewController:(UIViewController *)viewController { + [self informDelegateRequestsPresentationOfViewController:viewController]; +} + +- (void)paymentMethodCreator:(__unused id)sender requestsDismissalOfViewController:(UIViewController *)viewController { + [self informDelegateRequestsDismissalOfAuthorizationViewController:viewController]; +} + +- (void)paymentMethodCreatorWillPerformAppSwitch:(__unused id)sender { + [self informDelegateWillPerformAppSwitch]; +} + +- (void)paymentMethodCreatorWillProcess:(__unused id)sender { + [self informDelegateWillProcess]; +} + +- (void)paymentMethodCreatorDidCancel:(__unused id)sender { + [self informDelegateDidCancel]; +} + +- (void)paymentMethodCreator:(__unused id)sender didCreatePaymentMethod:(BTPaymentMethod *)paymentMethod { + [self informDelegateDidCreatePaymentMethod:paymentMethod]; +} + +- (void)paymentMethodCreator:(__unused id)sender didFailWithError:(NSError *)error { + [self informDelegateDidFailWithError:error andPostAnalyticsEvent:YES]; +} + +#if BT_ENABLE_APPLE_PAY + +#pragma mark Payment Request Details + +- (void)setPaymentSummaryItems:(NSArray *)paymentSummaryItems { + _paymentSummaryItems = paymentSummaryItems; + self.applePayPaymentProvider.paymentSummaryItems = paymentSummaryItems; +} + +- (void)setRequiredBillingAddressFields:(PKAddressField)requiredBillingAddressFields { + _requiredBillingAddressFields = requiredBillingAddressFields; + self.applePayPaymentProvider.requiredBillingAddressFields = requiredBillingAddressFields; +} + +- (void)setRequiredShippingAddressFields:(PKAddressField)requiredShippingAddressFields { + _requiredShippingAddressFields = requiredShippingAddressFields; + self.applePayPaymentProvider.requiredShippingAddressFields = requiredShippingAddressFields; + ; +} + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + +- (void)setBillingAddress:(ABRecordRef)billingAddress { + _billingAddress = CFRetain(billingAddress); + self.applePayPaymentProvider.billingAddress = billingAddress; +} + +- (void)setShippingAddress:(ABRecordRef)shippingAddress { + _shippingAddress = CFRetain(shippingAddress); + self.applePayPaymentProvider.shippingAddress = shippingAddress; +} + +#pragma clang diagnostic pop + +- (void)setBillingContact:(PKContact *)billingContact { + _billingContact = billingContact; + self.applePayPaymentProvider.billingContact = billingContact; +} + +- (void)setShippingContact:(PKContact *)shippingContact { + _shippingContact = shippingContact; + self.applePayPaymentProvider.shippingContact = shippingContact; +} + +- (void)setShippingMethods:(NSArray *)shippingMethods { + _shippingMethods = shippingMethods; + self.applePayPaymentProvider.shippingMethods = shippingMethods; +} + +- (void)setSupportedNetworks:(NSArray *)supportedNetworks { + _supportedNetworks = supportedNetworks; + self.applePayPaymentProvider.supportedNetworks = supportedNetworks; +} + +- (void)dealloc { + if (_shippingAddress) { + CFRelease(_shippingAddress); + } + + if (_billingAddress) { + CFRelease(_billingAddress); + } +} + +#endif + +@end diff --git a/Pods/Braintree/Braintree/Payments/BTPaymentProviderErrors.m b/Pods/Braintree/Braintree/Payments/BTPaymentProviderErrors.m new file mode 100644 index 0000000..28985d6 --- /dev/null +++ b/Pods/Braintree/Braintree/Payments/BTPaymentProviderErrors.m @@ -0,0 +1,3 @@ +#import "BTPaymentProviderErrors.h" + +NSString *const BTPaymentProviderErrorDomain = @"BTPaymentProviderErrorDomain"; diff --git a/Pods/Braintree/Braintree/UI/BTUIPaymentMethodType.h b/Pods/Braintree/Braintree/UI/BTUIPaymentMethodType.h new file mode 100644 index 0000000..4289a68 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/BTUIPaymentMethodType.h @@ -0,0 +1,18 @@ +/// Credit card types +typedef NS_ENUM(NSInteger, BTUIPaymentMethodType) { + BTUIPaymentMethodTypeUnknown = 0, + BTUIPaymentMethodTypeAMEX, + BTUIPaymentMethodTypeDinersClub, + BTUIPaymentMethodTypeDiscover, + BTUIPaymentMethodTypeMasterCard, + BTUIPaymentMethodTypeVisa, + BTUIPaymentMethodTypeJCB, + BTUIPaymentMethodTypeLaser, + BTUIPaymentMethodTypeMaestro, + BTUIPaymentMethodTypeUnionPay, + BTUIPaymentMethodTypeSolo, + BTUIPaymentMethodTypeSwitch, + BTUIPaymentMethodTypeUKMaestro, + BTUIPaymentMethodTypePayPal, + BTUIPaymentMethodTypeCoinbase, +}; diff --git a/Pods/Braintree/Braintree/UI/Braintree-Payments-UI.h b/Pods/Braintree/Braintree/UI/Braintree-Payments-UI.h new file mode 100644 index 0000000..3c58261 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Braintree-Payments-UI.h @@ -0,0 +1,9 @@ +/// All-in-one import for Braintree Payments UI Components + +#import +#import +#import +#import +#import +#import +#import diff --git a/Pods/Braintree/Braintree/UI/Localization/BTUILocalizedString.h b/Pods/Braintree/Braintree/UI/Localization/BTUILocalizedString.h new file mode 100644 index 0000000..9239989 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Localization/BTUILocalizedString.h @@ -0,0 +1,32 @@ +#import + +#define BTUILocalizedString(KEY) [BTUILocalizedString KEY] + +@interface BTUILocalizedString : NSObject + ++ (NSString *)CARD_NUMBER_PLACEHOLDER; ++ (NSString *)CVV_FIELD_PLACEHOLDER; ++ (NSString *)EXPIRY_PLACEHOLDER_FOUR_DIGIT_YEAR; ++ (NSString *)EXPIRY_PLACEHOLDER_TWO_DIGIT_YEAR; ++ (NSString *)PAYPAL_CARD_BRAND; ++ (NSString *)POSTAL_CODE_PLACEHOLDER; ++ (NSString *)TOP_LEVEL_ERROR_ALERT_VIEW_OK_BUTTON_TEXT; + + +#pragma mark Card Brands + ++ (NSString *)CARD_TYPE_AMERICAN_EXPRESS; ++ (NSString *)CARD_TYPE_DISCOVER; ++ (NSString *)CARD_TYPE_DINERS_CLUB; ++ (NSString *)CARD_TYPE_MASTER_CARD; ++ (NSString *)CARD_TYPE_VISA; ++ (NSString *)CARD_TYPE_JCB; ++ (NSString *)CARD_TYPE_MAESTRO; ++ (NSString *)CARD_TYPE_UNION_PAY; ++ (NSString *)CARD_TYPE_SWITCH; ++ (NSString *)CARD_TYPE_SOLO; ++ (NSString *)CARD_TYPE_LASER; ++ (NSString *)PAYMENT_METHOD_TYPE_PAYPAL; ++ (NSString *)PAYMENT_METHOD_TYPE_COINBASE; + +@end diff --git a/Pods/Braintree/Braintree/UI/Localization/BTUILocalizedString.m b/Pods/Braintree/Braintree/UI/Localization/BTUILocalizedString.m new file mode 100644 index 0000000..4a26d7d --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Localization/BTUILocalizedString.m @@ -0,0 +1,100 @@ +#import "BTUILocalizedString.h" + +@implementation BTUILocalizedString + ++ (NSBundle *)localizationBundle { + + static NSString * bundleName = @"Braintree-UI-Localization"; + NSString *localizationBundlePath = [[NSBundle mainBundle] pathForResource:bundleName ofType:@"bundle"]; + if (!localizationBundlePath) { + localizationBundlePath = [[NSBundle bundleForClass:[self class]] pathForResource:bundleName ofType:@"bundle"]; + } + + return localizationBundlePath ? [NSBundle bundleWithPath:localizationBundlePath] : [NSBundle mainBundle]; +} + ++ (NSString *)localizationTable { + return @"UI"; +} + ++ (NSString *)CVV_FIELD_PLACEHOLDER { + return NSLocalizedStringWithDefaultValue(@"CVV_FIELD_PLACEHOLDER", [self localizationTable], [self localizationBundle], @"CVV", @"CVV (credit card security code) field placeholder"); +} + ++ (NSString *)CARD_NUMBER_PLACEHOLDER { + return NSLocalizedStringWithDefaultValue(@"CARD_NUMBER_PLACEHOLDER", [self localizationTable], [self localizationBundle], @"Card Number", @"Credit card number field placeholder"); +} + ++ (NSString *)EXPIRY_PLACEHOLDER_FOUR_DIGIT_YEAR { + return NSLocalizedStringWithDefaultValue(@"EXPIRY_PLACEHOLDER_FOUR_DIGIT_YEAR", [self localizationTable], [self localizationBundle], @"MM/YYYY", @"Credit card expiration date field placeholder (MM/YYYY format)"); +} + ++ (NSString *)EXPIRY_PLACEHOLDER_TWO_DIGIT_YEAR { + return NSLocalizedStringWithDefaultValue(@"EXPIRY_PLACEHOLDER_TWO_DIGIT_YEAR", [self localizationTable], [self localizationBundle], @"MM/YY", @"Credit card expiration date field placeholder (MM/YY format)"); +} + ++ (NSString *)PAYPAL_CARD_BRAND { + return NSLocalizedStringWithDefaultValue(@"PAYPAL_CARD_BRAND", [self localizationTable], [self localizationBundle], @"PayPal", @"PayPal payment method name"); +} + ++ (NSString *)POSTAL_CODE_PLACEHOLDER { + return NSLocalizedStringWithDefaultValue(@"POSTAL_CODE_PLACEHOLDER", [self localizationTable], [self localizationBundle], @"Postal Code", @"Credit card billing postal code field placeholder"); +} + ++ (NSString *)TOP_LEVEL_ERROR_ALERT_VIEW_OK_BUTTON_TEXT { + return NSLocalizedStringWithDefaultValue(@"TOP_LEVEL_ERROR_ALERT_VIEW_OK_BUTTON_TEXT", [self localizationTable], [self localizationBundle], @"OK", @"OK Button on card form alert view for top level errors"); +} + ++ (NSString *)CARD_TYPE_AMERICAN_EXPRESS { + return NSLocalizedStringWithDefaultValue(@"CARD_TYPE_AMERICAN_EXPRESS", [self localizationTable], [self localizationBundle], @"American Express", @"American Express card brand"); +} + ++ (NSString *)CARD_TYPE_DINERS_CLUB { + return NSLocalizedStringWithDefaultValue(@"CARD_TYPE_DINERS_CLUB", [self localizationTable], [self localizationBundle], @"Diners Club", @"Diners Club card brand"); +} + ++ (NSString *)CARD_TYPE_DISCOVER { + return NSLocalizedStringWithDefaultValue(@"CARD_TYPE_DISCOVER", [self localizationTable], [self localizationBundle], @"Discover", @"Discover card brand"); +} + ++ (NSString *)CARD_TYPE_MASTER_CARD { + return NSLocalizedStringWithDefaultValue(@"CARD_TYPE_MASTER_CARD", [self localizationTable], [self localizationBundle], @"MasterCard", @"MasterCard card brand"); +} + ++ (NSString *)CARD_TYPE_VISA { + return NSLocalizedStringWithDefaultValue(@"CARD_TYPE_VISA", [self localizationTable], [self localizationBundle], @"Visa", @"Visa card brand"); +} + ++ (NSString *)CARD_TYPE_JCB { + return NSLocalizedStringWithDefaultValue(@"CARD_TYPE_JCB", [self localizationTable], [self localizationBundle], @"JCB", @"JCB card brand"); +} + ++ (NSString *)CARD_TYPE_MAESTRO { + return NSLocalizedStringWithDefaultValue(@"CARD_TYPE_MAESTRO", [self localizationTable], [self localizationBundle], @"Maestro", @"Maestro card brand"); +} + ++ (NSString *)CARD_TYPE_UNION_PAY { + return NSLocalizedStringWithDefaultValue(@"CARD_TYPE_UNION_PAY", [self localizationTable], [self localizationBundle], @"UnionPay", @"UnionPay card brand"); +} + ++ (NSString *)CARD_TYPE_LASER { + return NSLocalizedStringWithDefaultValue(@"CARD_TYPE_LASER", [self localizationTable], [self localizationBundle], @"Laser", @"Laser card brand"); +} + ++ (NSString *)CARD_TYPE_SOLO { + return NSLocalizedStringWithDefaultValue(@"CARD_TYPE_SOLO", [self localizationTable], [self localizationBundle], @"Solo", @"Solo card brand"); +} + ++ (NSString *)CARD_TYPE_SWITCH { + return NSLocalizedStringWithDefaultValue(@"CARD_TYPE_SWITCH", [self localizationTable], [self localizationBundle], @"Switch", @"Switch card brand"); +} + ++ (NSString *)PAYMENT_METHOD_TYPE_PAYPAL { + return NSLocalizedStringWithDefaultValue(@"PAYPAL", [self localizationTable], [self localizationBundle], @"PayPal", @"PayPal (as a standalone term, referring to the payment method type, analogous to Visa or Discover)"); +} + ++ (NSString *)PAYMENT_METHOD_TYPE_COINBASE { + return NSLocalizedStringWithDefaultValue(@"COINBASE", [self localizationTable], [self localizationBundle], @"Coinbase", @"Coinbase (as a standalone term, referring to the bitcoin wallet company)"); +} + +@end diff --git a/Pods/Braintree/Braintree/UI/Localization/da.lproj/UI.strings b/Pods/Braintree/Braintree/UI/Localization/da.lproj/UI.strings new file mode 100644 index 0000000..18bb418 Binary files /dev/null and b/Pods/Braintree/Braintree/UI/Localization/da.lproj/UI.strings differ diff --git a/Pods/Braintree/Braintree/UI/Localization/de.lproj/UI.strings b/Pods/Braintree/Braintree/UI/Localization/de.lproj/UI.strings new file mode 100644 index 0000000..d0b59e0 Binary files /dev/null and b/Pods/Braintree/Braintree/UI/Localization/de.lproj/UI.strings differ diff --git a/Pods/Braintree/Braintree/UI/Localization/en.lproj/UI.strings b/Pods/Braintree/Braintree/UI/Localization/en.lproj/UI.strings new file mode 100644 index 0000000..ef2558a Binary files /dev/null and b/Pods/Braintree/Braintree/UI/Localization/en.lproj/UI.strings differ diff --git a/Pods/Braintree/Braintree/UI/Localization/en_AU.lproj/UI.strings b/Pods/Braintree/Braintree/UI/Localization/en_AU.lproj/UI.strings new file mode 100644 index 0000000..889ba70 Binary files /dev/null and b/Pods/Braintree/Braintree/UI/Localization/en_AU.lproj/UI.strings differ diff --git a/Pods/Braintree/Braintree/UI/Localization/en_CA.lproj/UI.strings b/Pods/Braintree/Braintree/UI/Localization/en_CA.lproj/UI.strings new file mode 100644 index 0000000..ef2558a Binary files /dev/null and b/Pods/Braintree/Braintree/UI/Localization/en_CA.lproj/UI.strings differ diff --git a/Pods/Braintree/Braintree/UI/Localization/en_GB.lproj/UI.strings b/Pods/Braintree/Braintree/UI/Localization/en_GB.lproj/UI.strings new file mode 100644 index 0000000..e70ece8 Binary files /dev/null and b/Pods/Braintree/Braintree/UI/Localization/en_GB.lproj/UI.strings differ diff --git a/Pods/Braintree/Braintree/UI/Localization/es.lproj/UI.strings b/Pods/Braintree/Braintree/UI/Localization/es.lproj/UI.strings new file mode 100644 index 0000000..270e1a7 Binary files /dev/null and b/Pods/Braintree/Braintree/UI/Localization/es.lproj/UI.strings differ diff --git a/Pods/Braintree/Braintree/UI/Localization/es_ES.lproj/UI.strings b/Pods/Braintree/Braintree/UI/Localization/es_ES.lproj/UI.strings new file mode 100644 index 0000000..338fcf7 Binary files /dev/null and b/Pods/Braintree/Braintree/UI/Localization/es_ES.lproj/UI.strings differ diff --git a/Pods/Braintree/Braintree/UI/Localization/fr.lproj/UI.strings b/Pods/Braintree/Braintree/UI/Localization/fr.lproj/UI.strings new file mode 100644 index 0000000..c45a8a0 Binary files /dev/null and b/Pods/Braintree/Braintree/UI/Localization/fr.lproj/UI.strings differ diff --git a/Pods/Braintree/Braintree/UI/Localization/fr_CA.lproj/UI.strings b/Pods/Braintree/Braintree/UI/Localization/fr_CA.lproj/UI.strings new file mode 100644 index 0000000..7927651 Binary files /dev/null and b/Pods/Braintree/Braintree/UI/Localization/fr_CA.lproj/UI.strings differ diff --git a/Pods/Braintree/Braintree/UI/Localization/fr_FR.lproj/UI.strings b/Pods/Braintree/Braintree/UI/Localization/fr_FR.lproj/UI.strings new file mode 100644 index 0000000..df933d9 Binary files /dev/null and b/Pods/Braintree/Braintree/UI/Localization/fr_FR.lproj/UI.strings differ diff --git a/Pods/Braintree/Braintree/UI/Localization/he.lproj/UI.strings b/Pods/Braintree/Braintree/UI/Localization/he.lproj/UI.strings new file mode 100644 index 0000000..dad0e4f Binary files /dev/null and b/Pods/Braintree/Braintree/UI/Localization/he.lproj/UI.strings differ diff --git a/Pods/Braintree/Braintree/UI/Localization/it.lproj/UI.strings b/Pods/Braintree/Braintree/UI/Localization/it.lproj/UI.strings new file mode 100644 index 0000000..9ee4a22 Binary files /dev/null and b/Pods/Braintree/Braintree/UI/Localization/it.lproj/UI.strings differ diff --git a/Pods/Braintree/Braintree/UI/Localization/nb.lproj/UI.strings b/Pods/Braintree/Braintree/UI/Localization/nb.lproj/UI.strings new file mode 100644 index 0000000..449ddb5 Binary files /dev/null and b/Pods/Braintree/Braintree/UI/Localization/nb.lproj/UI.strings differ diff --git a/Pods/Braintree/Braintree/UI/Localization/nl.lproj/UI.strings b/Pods/Braintree/Braintree/UI/Localization/nl.lproj/UI.strings new file mode 100644 index 0000000..12ff373 Binary files /dev/null and b/Pods/Braintree/Braintree/UI/Localization/nl.lproj/UI.strings differ diff --git a/Pods/Braintree/Braintree/UI/Localization/pl.lproj/UI.strings b/Pods/Braintree/Braintree/UI/Localization/pl.lproj/UI.strings new file mode 100644 index 0000000..36683db Binary files /dev/null and b/Pods/Braintree/Braintree/UI/Localization/pl.lproj/UI.strings differ diff --git a/Pods/Braintree/Braintree/UI/Localization/pt.lproj/UI.strings b/Pods/Braintree/Braintree/UI/Localization/pt.lproj/UI.strings new file mode 100644 index 0000000..2baa2a5 Binary files /dev/null and b/Pods/Braintree/Braintree/UI/Localization/pt.lproj/UI.strings differ diff --git a/Pods/Braintree/Braintree/UI/Localization/ru.lproj/UI.strings b/Pods/Braintree/Braintree/UI/Localization/ru.lproj/UI.strings new file mode 100644 index 0000000..f90bf3f Binary files /dev/null and b/Pods/Braintree/Braintree/UI/Localization/ru.lproj/UI.strings differ diff --git a/Pods/Braintree/Braintree/UI/Localization/sv.lproj/UI.strings b/Pods/Braintree/Braintree/UI/Localization/sv.lproj/UI.strings new file mode 100644 index 0000000..449ddb5 Binary files /dev/null and b/Pods/Braintree/Braintree/UI/Localization/sv.lproj/UI.strings differ diff --git a/Pods/Braintree/Braintree/UI/Localization/tr.lproj/UI.strings b/Pods/Braintree/Braintree/UI/Localization/tr.lproj/UI.strings new file mode 100644 index 0000000..bf4f400 Binary files /dev/null and b/Pods/Braintree/Braintree/UI/Localization/tr.lproj/UI.strings differ diff --git a/Pods/Braintree/Braintree/UI/Localization/zh-Hans.lproj/UI.strings b/Pods/Braintree/Braintree/UI/Localization/zh-Hans.lproj/UI.strings new file mode 100644 index 0000000..6de374b Binary files /dev/null and b/Pods/Braintree/Braintree/UI/Localization/zh-Hans.lproj/UI.strings differ diff --git a/Pods/Braintree/Braintree/UI/Models/BTUICardExpirationValidator.h b/Pods/Braintree/Braintree/UI/Models/BTUICardExpirationValidator.h new file mode 100644 index 0000000..9268fd3 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Models/BTUICardExpirationValidator.h @@ -0,0 +1,9 @@ +#import + +#define kBTUICardExpirationValidatorFarFutureYears 20 + +@interface BTUICardExpirationValidator : NSObject + ++ (BOOL)month:(NSUInteger)month year:(NSUInteger)year validForDate:(NSDate *)date; + +@end diff --git a/Pods/Braintree/Braintree/UI/Models/BTUICardExpirationValidator.m b/Pods/Braintree/Braintree/UI/Models/BTUICardExpirationValidator.m new file mode 100644 index 0000000..dbad65a --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Models/BTUICardExpirationValidator.m @@ -0,0 +1,38 @@ +#import "BTUICardExpirationValidator.h" + +#ifdef __IPHONE_8_0 +#define kBTNSGregorianCalendarIdentifier NSCalendarIdentifierGregorian +#else +#define kBTNSGregorianCalendarIdentifier NSGregorianCalendar +#endif + +@implementation BTUICardExpirationValidator + ++ (BOOL)month:(NSUInteger)month year:(NSUInteger)year validForDate:(NSDate *)date { + + NSDateComponents *dateComponents = [[NSDateComponents alloc] init]; + dateComponents.calendar = [[NSCalendar alloc] initWithCalendarIdentifier:kBTNSGregorianCalendarIdentifier]; + dateComponents.year = ((year % 2000) + 2000) ; + dateComponents.month = month; + NSInteger newMonth = (dateComponents.month + 1); + if (newMonth > 12) { + dateComponents.month = newMonth % 12; + dateComponents.year += 1; + } else { + dateComponents.month = newMonth; + } + BOOL expired = [date compare:dateComponents.date] != NSOrderedAscending; + if (expired) { + return NO; + } + + NSDate *farFuture = [date dateByAddingTimeInterval:3600 * 24 * 365.25 * kBTUICardExpirationValidatorFarFutureYears]; // roughly years in the future + BOOL tooFarInTheFuture = [farFuture compare:dateComponents.date] != NSOrderedDescending; + + return !tooFarInTheFuture; +} + + + + +@end diff --git a/Pods/Braintree/Braintree/UI/Models/BTUICardExpiryFormat.h b/Pods/Braintree/Braintree/UI/Models/BTUICardExpiryFormat.h new file mode 100644 index 0000000..7d8c646 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Models/BTUICardExpiryFormat.h @@ -0,0 +1,10 @@ +#import + +@interface BTUICardExpiryFormat : NSObject +@property (nonatomic, copy) NSString *value; +@property (nonatomic, assign) NSUInteger cursorLocation; +@property (nonatomic, assign) BOOL backspace; + +- (void)formattedValue:(NSString * __autoreleasing *)value cursorLocation:(NSUInteger *)cursorLocation; + +@end diff --git a/Pods/Braintree/Braintree/UI/Models/BTUICardExpiryFormat.m b/Pods/Braintree/Braintree/UI/Models/BTUICardExpiryFormat.m new file mode 100644 index 0000000..36efc56 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Models/BTUICardExpiryFormat.m @@ -0,0 +1,51 @@ +#import "BTUICardExpiryFormat.h" +#import "BTUIUtil.h" + +@implementation BTUICardExpiryFormat + +- (void)formattedValue:(NSString *__autoreleasing *)value cursorLocation:(NSUInteger *)cursorLocation { + if (value == NULL || cursorLocation == NULL) { + return; + } + + NSMutableString *s = [NSMutableString stringWithString:self.value]; + *cursorLocation = self.cursorLocation; + + if (s.length == 0) { + *value = s; + return; + } + + if (*cursorLocation == 1 && s.length == 1 && [s characterAtIndex:0] > '1' && [s characterAtIndex:0] <= '9') { + [s insertString:@"0" atIndex:0]; + *cursorLocation += 1; + } + + if (self.backspace) { + if (*cursorLocation == 2 && s.length == 2) { + [s deleteCharactersInRange:NSMakeRange(1, 1)]; + *cursorLocation -= 1; + } + } else { + + NSUInteger slashLocation = [s rangeOfString:@"/"].location; + if (slashLocation != NSNotFound) { + if (slashLocation > 2) { + s = [NSMutableString stringWithString:[BTUIUtil stripNonDigits:s]]; + [s insertString:@"/" atIndex:2]; + *cursorLocation += 1; + } + } else { + if (s.length >= 2) { + [s insertString:@"/" atIndex:2]; + if (*cursorLocation >= 2) { + *cursorLocation += 1; + } + } + } + } + + *value = s; +} + +@end diff --git a/Pods/Braintree/Braintree/UI/Models/BTUICardType.h b/Pods/Braintree/Braintree/UI/Models/BTUICardType.h new file mode 100644 index 0000000..ef73546 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Models/BTUICardType.h @@ -0,0 +1,45 @@ +#import + +#import "BTUILocalizedString.h" + +/// Immutable card type +@interface BTUICardType : NSObject + +/// Obtain the `BTCardType` for the given brand, or nil if none is found ++ (instancetype)cardTypeForBrand:(NSString *)brand; + +/// Obtain the `BTCardType` for the given number, or nil if none is found ++ (instancetype)cardTypeForNumber:(NSString *)number; + +/// Return all possible card types for a number ++ (NSArray *)possibleCardTypesForNumber:(NSString *)number; + +/// Check if a number is valid +- (BOOL)validNumber:(NSString *)number; + +/// Check if a number is complete +- (BOOL)completeNumber:(NSString *)number; + +/// Check is a number is valid and necessarily complete +/// (i.e. it can't get any longer) +- (BOOL)validAndNecessarilyCompleteNumber:(NSString *)number; + +/// Check if the CVV is valid for a `BTCardType` +- (BOOL)validCvv:(NSString *)cvv; + +/// Format a number based on type +/// Does NOT validate +- (NSAttributedString *)formatNumber:(NSString *)input; +- (NSAttributedString *)formatNumber:(NSString *)input kerning:(CGFloat)kerning; + ++ (NSUInteger)maxNumberLength; + +@property (nonatomic, copy, readonly) NSString *brand; +@property (nonatomic, strong, readonly) NSArray *validNumberPrefixes; +@property (nonatomic, strong, readonly) NSIndexSet *validNumberLengths; +@property (nonatomic, assign, readonly) NSUInteger validCvvLength; + +@property (nonatomic, strong, readonly) NSArray *formatSpaces; +@property (nonatomic, assign, readonly) NSUInteger maxNumberLength; + +@end diff --git a/Pods/Braintree/Braintree/UI/Models/BTUICardType.m b/Pods/Braintree/Braintree/UI/Models/BTUICardType.m new file mode 100644 index 0000000..bde8d50 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Models/BTUICardType.m @@ -0,0 +1,225 @@ +#import + +#import "BTUICardType.h" +#import "BTUIUtil.h" + +#define kDefaultFormatSpaceIndices @[@4, @8, @12, @16] +#define kDefaultCvvLength 3 +#define kDefaultValidNumberLengths [NSIndexSet indexSetWithIndex:16] +#define kInvalidCvvCharacterSet [[NSCharacterSet characterSetWithCharactersInString:@"0123456789"] invertedSet] + + +@implementation BTUICardType + +#pragma mark - Private initializers + +- (instancetype)initWithBrand:(NSString *)brand + prefixes:(NSArray *)prefixes +{ + return [self initWithBrand:brand + prefixes:prefixes + validNumberLengths:kDefaultValidNumberLengths + validCvvLength:kDefaultCvvLength + formatSpaces:kDefaultFormatSpaceIndices]; +} + +- (instancetype)initWithBrand:(NSString *)brand + prefixes:(NSArray *)prefixes + validNumberLengths:(NSIndexSet *)validLengths + validCvvLength:(NSUInteger)cvvLength + formatSpaces:(NSArray *)formatSpaces +{ + self = [super init]; + if (self != nil) { + _brand = brand; + NSError *error; + + _validNumberPrefixes = prefixes; + if (error != nil) { + NSLog(@"Braintree-Payments-UI: %@", error); + } + _validNumberLengths = validLengths; + _validCvvLength = cvvLength; + + NSArray *sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"self" ascending:YES]]; + _formatSpaces = [formatSpaces sortedArrayUsingDescriptors:sortDescriptors] ?: kDefaultFormatSpaceIndices; + _maxNumberLength = [validLengths lastIndex]; + } + return self; +} + +#pragma mark - Finders + ++ (instancetype)cardTypeForBrand:(NSString *)rename { + return [[self class] cardsByBrand][rename]; +} + ++ (instancetype)cardTypeForNumber:(NSString *)number { + if (number.length == 0) { + return nil; + } + for (BTUICardType *cardType in [[self class] allCards]) { + for (NSString *prefix in cardType.validNumberPrefixes) { + if (number.length >= prefix.length) { + NSUInteger compareLength = MIN(prefix.length, number.length); + NSString *sizedNumber = [number substringToIndex:compareLength]; + if ([sizedNumber isEqualToString:prefix]) { + return cardType; + } + } + } + } + return nil; +} + +// Since each card type has a list of acceptable card prefixes, we +// can determine which card types may match a given number ++ (NSArray *)possibleCardTypesForNumber:(NSString *)number { + number = [BTUIUtil stripNonDigits:number]; + if (number.length == 0) { + return [[self class] allCards]; + } + NSMutableSet *possibleCardTypes = [NSMutableSet set]; + for (BTUICardType *cardType in [[self class] allCards]) { + for (NSString *prefix in cardType.validNumberPrefixes) { + NSUInteger compareLength = MIN(prefix.length, number.length); + + NSString *sizedPrefix = [prefix substringToIndex:compareLength]; + NSString *sizedNumber = [number substringToIndex:compareLength]; + if ([sizedNumber isEqualToString:sizedPrefix]) { + [possibleCardTypes addObject:cardType]; + break; + } + } + } + return [possibleCardTypes allObjects]; +} + +#pragma mark - Instance methods + +- (BOOL)validCvv:(NSString *)cvv { + if (cvv.length != self.validCvvLength) { + return NO; + } + return ([cvv rangeOfCharacterFromSet:kInvalidCvvCharacterSet].location == NSNotFound); +} + +- (NSString *)description { + return [NSString stringWithFormat:@"BTUICardType %@", self.brand]; +} + +#pragma mark - Immutable singletons + ++ (NSUInteger)maxNumberLength { + static dispatch_once_t p = 0; + static NSUInteger _maxNumberLength = 0; + dispatch_once(&p, ^{ + for (BTUICardType *t in [self allCards]) { + _maxNumberLength = MAX(_maxNumberLength, t.maxNumberLength); + } + }); + return _maxNumberLength; +} + ++ (NSArray *)allCards +{ + static dispatch_once_t p = 0; + static NSArray *_allCards = nil; + + dispatch_once(&p, ^{ + + BTUICardType *visa = [[BTUICardType alloc] initWithBrand:BTUILocalizedString(CARD_TYPE_VISA) prefixes:@[@"4"]]; + BTUICardType *mastercard = [[BTUICardType alloc] initWithBrand:BTUILocalizedString(CARD_TYPE_MASTER_CARD) + prefixes:@[@"51", @"52", @"53", @"54", @"55"]]; + BTUICardType *discover = [[BTUICardType alloc] initWithBrand:BTUILocalizedString(CARD_TYPE_DISCOVER) prefixes:@[@"6011", @"65", @"644", @"645", @"646", @"647", @"648", @"649", @"622"]]; + BTUICardType *jcb = [[BTUICardType alloc] initWithBrand:BTUILocalizedString(CARD_TYPE_JCB) prefixes:@[@"35"]]; + + BTUICardType *amex = [[BTUICardType alloc] initWithBrand:BTUILocalizedString(CARD_TYPE_AMERICAN_EXPRESS) + prefixes:@[@"34", @"37"] + validNumberLengths:[NSIndexSet indexSetWithIndex:15] + validCvvLength:4 + formatSpaces:@[@4, @10]]; + + BTUICardType *dinersClub = [[BTUICardType alloc] initWithBrand:BTUILocalizedString(CARD_TYPE_DINERS_CLUB) + prefixes:@[@"36", @"38", @"300", @"301", @"302", @"303", @"304", @"305"] + validNumberLengths:[NSIndexSet indexSetWithIndex:14] + validCvvLength:3 + formatSpaces:nil]; + + BTUICardType *maestro = [[BTUICardType alloc] initWithBrand:BTUILocalizedString(CARD_TYPE_MAESTRO) + prefixes:@[@"5018", @"5020", @"5038", @"6304", @"6759", @"6761", @"6762", @"6763"] + validNumberLengths:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(12, 8)] + validCvvLength:3 + formatSpaces:nil]; + + BTUICardType *unionPay = [[BTUICardType alloc] initWithBrand:BTUILocalizedString(CARD_TYPE_UNION_PAY) + prefixes:@[@"62"] + validNumberLengths:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(16, 4)] + validCvvLength:3 + formatSpaces:nil]; + + _allCards = @[visa, mastercard, discover, amex, dinersClub, jcb, mastercard, maestro, unionPay]; + }); + + // returns the same object each time + return _allCards; +} + ++ (NSDictionary *)cardsByBrand { + + static dispatch_once_t p = 0; + static NSDictionary *_cardsByBrand = nil; + + dispatch_once(&p, ^{ + NSMutableDictionary *d = [NSMutableDictionary dictionary]; + for (BTUICardType *cardType in [self allCards]) { + d[cardType.brand] = cardType; + } + _cardsByBrand = d; + }); + return _cardsByBrand; +} + +#pragma mark - Formatting + +- (NSAttributedString *)formatNumber:(NSString *)input kerning:(CGFloat)kerning{ + + input = [BTUIUtil stripNonDigits:input]; + + NSMutableAttributedString *result = [[NSMutableAttributedString alloc] initWithString:input]; + + if (input.length > self.maxNumberLength) { + return result; + } + + for (NSNumber *indexNumber in self.formatSpaces) { + NSUInteger index = [indexNumber unsignedIntegerValue]; + if (index >= result.length) { + break; + } + [result setAttributes:@{NSKernAttributeName: @(kerning)} range:NSMakeRange(index-1, 1)]; + } + return result; +} + +- (NSAttributedString *)formatNumber:(NSString *)input { + return [self formatNumber:input kerning:8.0f]; +} + +#pragma mark - Validation + +- (BOOL)validAndNecessarilyCompleteNumber:(NSString *)number { + return (number.length == self.validNumberLengths.lastIndex && [BTUIUtil luhnValid:number]); +} + +- (BOOL)validNumber:(NSString *)number { + return ([self completeNumber:number] && [BTUIUtil luhnValid:number]); +} + +- (BOOL)completeNumber:(NSString *)number { + return [self.validNumberLengths containsIndex:number.length]; +} + + + +@end diff --git a/Pods/Braintree/Braintree/UI/Models/BTUIUtil.h b/Pods/Braintree/Braintree/UI/Models/BTUIUtil.h new file mode 100644 index 0000000..e644f96 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Models/BTUIUtil.h @@ -0,0 +1,21 @@ +#import + +@interface BTUIUtil : NSObject + ++ (BOOL)luhnValid:(NSString *)cardNumber; + +/// Strips non-digit characters from a string. +/// +/// @param input The string to strip. +/// +/// @return The string stripped of non-digit characters, or `nil` if `input` is +/// `nil` ++ (NSString *)stripNonDigits:(NSString *)input; + ++ (NSString *)stripNonExpiry:(NSString *)input; + +@end + +@interface UIViewController (BTUI_visibleViewController) +- (UIViewController *)BTUI_visibleViewController; +@end diff --git a/Pods/Braintree/Braintree/UI/Models/BTUIUtil.m b/Pods/Braintree/Braintree/UI/Models/BTUIUtil.m new file mode 100644 index 0000000..c367849 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Models/BTUIUtil.m @@ -0,0 +1,66 @@ +#import "BTUIUtil.h" + +@implementation BTUIUtil + +#pragma mark - Class Method Utils + ++ (BOOL)luhnValid:(NSString *)cardNumber { + // http://rosettacode.org/wiki/Luhn_test_of_credit_card_numbers#Objective-C + const char *digitChars = [cardNumber UTF8String]; + BOOL isOdd = YES; + NSInteger oddSum = 0; + NSInteger evenSum = 0; + for (NSInteger i = [cardNumber length] - 1; i >= 0; i--) { + NSInteger digit = digitChars[i] - '0'; + if (isOdd) { + oddSum += digit; + } else { + evenSum += digit/5 + (2*digit) % 10; + } + isOdd = !isOdd; + } + + return ((oddSum + evenSum) % 10 == 0); +} + ++ (NSString *)stripNonDigits:(NSString *)input { + return [self stripPattern:@"[^0-9]" input:input]; +} + ++ (NSString *)stripNonExpiry:(NSString *)input { + return [self stripPattern:@"[^0-9/]" input:input]; +} + ++ (NSString *)stripPattern:(NSString *)pattern input:(NSString *)input { + if (!input) return nil; + + NSError *error; + NSRegularExpression *re = [NSRegularExpression regularExpressionWithPattern:pattern + options:0 + error:&error]; + + return [re stringByReplacingMatchesInString:input + options:0 + range:NSMakeRange(0, input.length) + withTemplate:@""]; +} + +@end + +@implementation UIViewController (BTUI_visibleViewController) + +- (UIViewController *)BTUI_visibleViewController { + if ([self isKindOfClass:[UINavigationController class]]) { + // Do not use [UINavigationController visibleViewController] because it could be BeingDismissed + return [[(UINavigationController *)self topViewController] BTUI_visibleViewController]; + } + if ([self isKindOfClass:[UITabBarController class]]) { + return [[(UITabBarController *)self selectedViewController] BTUI_visibleViewController]; + } + if (self.presentedViewController == nil || self.presentedViewController.isBeingDismissed) { + return self; + } + return [self.presentedViewController BTUI_visibleViewController]; +} + +@end diff --git a/Pods/Braintree/Braintree/UI/Theme/BTUI.h b/Pods/Braintree/Braintree/UI/Theme/BTUI.h new file mode 100644 index 0000000..8aeb2fb --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Theme/BTUI.h @@ -0,0 +1,102 @@ +#import + +#import "BTUIPaymentMethodType.h" +#import "BTUIVectorArtView.h" + +/// BTUI represents a visual theme and can be applied to any `BTUIThemedView`. +@interface BTUI : NSObject + +/// Returns a default Braintree theme. +/// +/// @return the default Braintree theme. ++ (BTUI *)braintreeTheme; + +#pragma mark - Palette + +- (UIColor *)idealGray; + +#pragma mark - Colors + +// Tint color if none is set. Defaults to nil. +- (UIColor *)defaultTintColor; + +- (UIColor *)viewBackgroundColor; +- (UIColor *)callToActionColor; +- (UIColor *)callToActionColorHighlighted; +- (UIColor *)disabledButtonColor; + +- (UIColor *)titleColor; +- (UIColor *)detailColor; +- (UIColor *)borderColor; + +- (UIColor *)textFieldTextColor; +- (UIColor *)textFieldPlaceholderColor; + +- (UIColor *)sectionHeaderTextColor; +- (UIColor *)textFieldFloatLabelTextColor; + +- (UIColor *)cardHintBorderColor; + +- (UIColor *)errorBackgroundColor; +- (UIColor *)errorForegroundColor; + +#pragma mark Adjustments + +- (CGFloat) highlightedBrightnessAdjustment; + +#pragma mark PayPal Colors + +- (UIColor *)payBlue; +- (UIColor *)palBlue; +- (UIColor *)payPalButtonBlue; +- (UIColor *)payPalButtonActiveBlue; + +#pragma mark Venmo Color + +- (UIColor *)venmoPrimaryBlue; + +#pragma mark Coinbase Color + +- (UIColor *)coinbasePrimaryBlue; + +#pragma mark Typography + +- (UIFont *)controlFont; +- (UIFont *)controlTitleFont; +- (UIFont *)controlDetailFont; +- (UIFont *)textFieldFont; +- (UIFont *)textFieldFloatLabelFont; +- (UIFont *)sectionHeaderFont; + +#pragma mark Attributes + +- (NSDictionary *)textFieldTextAttributes; +- (NSDictionary *)textFieldPlaceholderAttributes; + +#pragma mark Visuals + +- (CGFloat)borderWidth; +- (CGFloat)cornerRadius; +- (CGFloat)formattedEntryKerning; +- (CGFloat)horizontalMargin; +- (CGFloat)paymentButtonMinHeight; +- (CGFloat)paymentButtonMaxHeight; +- (CGFloat)paymentButtonWordMarkHeight DEPRECATED_ATTRIBUTE; + +#pragma mark Transitions + +- (CGFloat)quickTransitionDuration; +- (CGFloat)transitionDuration; +- (CGFloat)minimumVisibilityTime; + + + +#pragma mark Icons + +- (BTUIVectorArtView *)vectorArtViewForPaymentMethodType:(BTUIPaymentMethodType)type; + +#pragma mark Utilities + ++ (UIActivityIndicatorViewStyle)activityIndicatorViewStyleForBarTintColor:(UIColor *)color; + +@end diff --git a/Pods/Braintree/Braintree/UI/Theme/BTUI.m b/Pods/Braintree/Braintree/UI/Theme/BTUI.m new file mode 100644 index 0000000..0fb5e1e --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Theme/BTUI.m @@ -0,0 +1,254 @@ +#import "BTUI.h" +#import "BTUIUtil.h" +#import "UIColor+BTUI.h" + +#import "BTUIMasterCardVectorArtView.h" +#import "BTUIJCBVectorArtView.h" +#import "BTUIMaestroVectorArtView.h" +#import "BTUIVisaVectorArtView.h" +#import "BTUIDiscoverVectorArtView.h" +#import "BTUIUnknownCardVectorArtView.h" +#import "BTUIDinersClubVectorArtView.h" +#import "BTUIAmExVectorArtView.h" +#import "BTUIPayPalMonogramCardView.h" +#import "BTUICoinbaseMonogramCardView.h" + +@implementation BTUI + ++ (BTUI *)braintreeTheme { + static BTUI *_sharedBraintreeTheme; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + _sharedBraintreeTheme = [[BTUI alloc] init]; + }); + return _sharedBraintreeTheme; +} + +- (UIColor *)idealGray { + return [UIColor bt_colorWithBytesR:128 G:128 B:128]; +} + +- (UIColor *)viewBackgroundColor { + return [UIColor bt_colorFromHex:@"f3f4f6" alpha:1.0f]; +} + +- (UIColor *)callToActionColor { + return [UIColor bt_colorWithBytesR:7 G:158 B:222]; +} + +- (UIColor *)callToActionColorHighlighted { + return [UIColor colorWithRed:0.375 green:0.635 blue:0.984 alpha:1.000]; +} + +- (UIColor *)disabledButtonColor { + return [UIColor bt_colorFromHex:@"#BCBFC4" alpha:1.0f]; +} + +- (UIColor *)titleColor { + return [UIColor bt_colorWithBytesR:46 G:51 B:58]; +} + +- (UIColor *)detailColor { + return [UIColor bt_colorWithBytesR:98 G:102 B:105]; +} + +- (UIColor *)borderColor { + return [UIColor bt_colorWithBytesR:216 G:216 B:216]; +} + +- (UIColor *)textFieldTextColor { + return [UIColor bt_colorWithBytesR:26 G:26 B:26]; +} + +- (UIColor *)textFieldPlaceholderColor { + return [self idealGray]; +} + +- (UIColor *)sectionHeaderTextColor { + return [self idealGray]; +} + +- (UIColor *)textFieldFloatLabelTextColor { + return [self sectionHeaderTextColor]; +} + +- (UIColor *)defaultTintColor { + return [self palBlue]; +} + +- (UIColor *)cardHintBorderColor { + return [UIColor bt_colorWithBytesR:0 G:0 B:0 A:20]; +} + +- (UIColor *)errorBackgroundColor { + return [UIColor bt_colorWithBytesR:250 G:229 B:232]; +} + +- (UIColor *)errorForegroundColor { + return [UIColor bt_colorWithBytesR:208 G:2 B:27]; +} + +#pragma mark PayPal Colors + +- (UIColor *)payBlue { + return [UIColor bt_colorFromHex:@"003087" alpha:1.0f]; +} + +- (UIColor *)palBlue { + return [UIColor bt_colorFromHex:@"009CDE" alpha:1.0f]; +} + +- (UIColor *)payPalButtonBlue { + return [UIColor bt_colorWithBytesR:12 G:141 B:196]; +} + +- (UIColor *)payPalButtonActiveBlue { + return [UIColor bt_colorWithBytesR:1 G:156 B:222]; +} + +#pragma mark Venmo Color + +- (UIColor *)venmoPrimaryBlue { + return [UIColor bt_colorFromHex:@"3D95CE" alpha:1.0f]; +} + +#pragma mark Coinbase Color + +- (UIColor *)coinbasePrimaryBlue { + return [UIColor colorWithRed: 0.053 green: 0.433 blue: 0.7 alpha: 1]; +} + +#pragma mark Adjustments + +- (CGFloat)highlightedBrightnessAdjustment { + return 0.6; +} + +#pragma mark - Appearance + +- (CGFloat)cornerRadius { + return 4.0f; +} + +- (CGFloat)borderWidth { + return 0.5f; +} + +- (CGFloat)formattedEntryKerning { + return 8.0f; +} + +- (CGFloat)horizontalMargin { + return 17.0f; +} + +- (CGFloat)paymentButtonMinHeight { + return 44.0f; +} + +- (CGFloat)paymentButtonMaxHeight { + return 60.0f; +} + +- (CGFloat)paymentButtonWordMarkHeight { + return 18.0f; +} + + +#pragma mark - Type + +- (UIFont *)controlFont { + return [UIFont fontWithName:@"HelveticaNeue-Light" size:14.0f]; +} + +- (UIFont *)controlTitleFont { + return [UIFont fontWithName:@"HelveticaNeue-Bold" size:17.0f]; +} + +- (UIFont *)controlDetailFont { + return [UIFont fontWithName:@"HelveticaNeue" size:17.0f]; +} + +- (UIFont *)textFieldFont { + return [UIFont fontWithName:@"HelveticaNeue" size:17.0f]; +} + +- (UIFont *)textFieldFloatLabelFont { + return [UIFont fontWithName:@"HelveticaNeue" size:12.0f]; +} + +- (UIFont *)sectionHeaderFont { + return [UIFont fontWithName:@"HelveticaNeue" size:14.0f]; +} + +#pragma mark - String Attributes + +- (NSDictionary *)textFieldTextAttributes { + return @{NSFontAttributeName: self.textFieldFont, + NSForegroundColorAttributeName: self.textFieldTextColor}; +} + +- (NSDictionary *)textFieldPlaceholderAttributes { + return @{NSFontAttributeName: self.textFieldFont, + NSForegroundColorAttributeName: self.textFieldPlaceholderColor}; +} + +#pragma mark Transitions + +- (CGFloat)quickTransitionDuration { + return 0.1f; +} + +- (CGFloat)transitionDuration { + return 0.2f; +} + +- (CGFloat)minimumVisibilityTime { + return 0.5f; +} + +#pragma mark Icons + +- (BTUIVectorArtView *)vectorArtViewForPaymentMethodType:(BTUIPaymentMethodType)type { + switch (type) { + case BTUIPaymentMethodTypeVisa: + return [BTUIVisaVectorArtView new]; + case BTUIPaymentMethodTypeMasterCard: + return [BTUIMasterCardVectorArtView new]; + case BTUIPaymentMethodTypeCoinbase: + return [BTUICoinbaseMonogramCardView new]; + case BTUIPaymentMethodTypePayPal: + return [BTUIPayPalMonogramCardView new]; + case BTUIPaymentMethodTypeDinersClub: + return [BTUIDinersClubVectorArtView new]; + case BTUIPaymentMethodTypeJCB: + return [BTUIJCBVectorArtView new]; + case BTUIPaymentMethodTypeMaestro: + return [BTUIMaestroVectorArtView new]; + case BTUIPaymentMethodTypeDiscover: + return [BTUIDiscoverVectorArtView new]; + case BTUIPaymentMethodTypeUKMaestro: + return [BTUIMaestroVectorArtView new]; + case BTUIPaymentMethodTypeAMEX: + return [BTUIAmExVectorArtView new]; + case BTUIPaymentMethodTypeSolo: + case BTUIPaymentMethodTypeLaser: + case BTUIPaymentMethodTypeSwitch: + case BTUIPaymentMethodTypeUnionPay: + case BTUIPaymentMethodTypeUnknown: + return [BTUIUnknownCardVectorArtView new]; + } +} + +#pragma mark Utilties + ++ (UIActivityIndicatorViewStyle)activityIndicatorViewStyleForBarTintColor:(UIColor *)color { + CGFloat r, g, b; + [color getRed:&r green:&g blue:&b alpha:NULL]; + CGFloat perceivedBrightnessBasedOnWeightedDistanceIn3DRGBSpace = sqrtf(r * r * .241 + g * g * .691 + b * b * .068); + + return perceivedBrightnessBasedOnWeightedDistanceIn3DRGBSpace > 0.5 ? UIActivityIndicatorViewStyleGray : UIActivityIndicatorViewStyleWhite; +} + +@end + diff --git a/Pods/Braintree/Braintree/UI/Theme/UIColor+BTUI.h b/Pods/Braintree/Braintree/UI/Theme/UIColor+BTUI.h new file mode 100644 index 0000000..427fb6e --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Theme/UIColor+BTUI.h @@ -0,0 +1,11 @@ +#import + +@interface UIColor (BTUI) + ++ (instancetype)bt_colorWithBytesR:(NSInteger)r G:(NSInteger)g B:(NSInteger)b A:(NSInteger)a; ++ (instancetype)bt_colorWithBytesR:(NSInteger)r G:(NSInteger)g B:(NSInteger)b; ++ (instancetype)bt_colorFromHex:(NSString *)hex alpha:(CGFloat)alpha; + +- (instancetype)bt_adjustedBrightness:(CGFloat)adjustment; + +@end diff --git a/Pods/Braintree/Braintree/UI/Theme/UIColor+BTUI.m b/Pods/Braintree/Braintree/UI/Theme/UIColor+BTUI.m new file mode 100644 index 0000000..df64f4f --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Theme/UIColor+BTUI.m @@ -0,0 +1,34 @@ +#import "UIColor+BTUI.h" + +@implementation UIColor (BTUI) + ++ (instancetype)bt_colorWithBytesR:(NSInteger)r G:(NSInteger)g B:(NSInteger)b A:(NSInteger)a { + return [[self class] colorWithRed:r/255.0f green:g/255.0f blue:b/255.0f alpha:a/255.0f]; +} + ++ (instancetype)bt_colorWithBytesR:(NSInteger)r G:(NSInteger)g B:(NSInteger)b { + return [[self class] bt_colorWithBytesR:r G:g B:b A:255.0f]; +} + +- (instancetype)bt_adjustedBrightness:(CGFloat)adjustment { + CGFloat h, s, b, a; + if ([self getHue:&h saturation:&s brightness:&b alpha:&a]) { + CGFloat newB = MAX(0.0f, MIN(1.0f, adjustment * b)); + return [[self class] colorWithHue:h saturation:s brightness:newB alpha:a]; + } else { + return nil; + } +} + ++ (instancetype)bt_colorFromHex:(NSString *)hex alpha:(CGFloat)alpha { + uint value = 0; + NSScanner *scanner = [NSScanner scannerWithString:hex]; + [scanner setCharactersToBeSkipped:[NSCharacterSet characterSetWithCharactersInString:@"#"]]; + [scanner scanHexInt:&value]; + return [UIColor colorWithRed:((value >> 16) & 255) / 255.0f + green:((value >> 8) & 255) / 255.0f + blue:(value & 255) / 255.0f + alpha:alpha]; +} + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Apple Pay/BTMockApplePayPaymentAuthorizationView.h b/Pods/Braintree/Braintree/UI/Views/Apple Pay/BTMockApplePayPaymentAuthorizationView.h new file mode 100644 index 0000000..750a593 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Apple Pay/BTMockApplePayPaymentAuthorizationView.h @@ -0,0 +1,18 @@ +#if BT_ENABLE_APPLE_PAY +#import + +@protocol BTMockApplePayPaymentAuthorizationViewDelegate; + +@interface BTMockApplePayPaymentAuthorizationView : UIView + +- (instancetype)initWithDelegate:(id)delegate NS_DESIGNATED_INITIALIZER; + +@end + +@protocol BTMockApplePayPaymentAuthorizationViewDelegate + +- (void)mockApplePayPaymentAuthorizationViewDidSucceed:(BTMockApplePayPaymentAuthorizationView *)view; +- (void)mockApplePayPaymentAuthorizationViewDidCancel:(BTMockApplePayPaymentAuthorizationView *)view; + +@end +#endif diff --git a/Pods/Braintree/Braintree/UI/Views/Apple Pay/BTMockApplePayPaymentAuthorizationView.m b/Pods/Braintree/Braintree/UI/Views/Apple Pay/BTMockApplePayPaymentAuthorizationView.m new file mode 100644 index 0000000..6705f51 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Apple Pay/BTMockApplePayPaymentAuthorizationView.m @@ -0,0 +1,109 @@ +#if BT_ENABLE_APPLE_PAY +#import "BTMockApplePayPaymentAuthorizationView.h" + +@interface BTMockApplePayPaymentAuthorizationView () +@property (nonatomic, weak) id delegate; +@property (nonatomic, strong) UITableView *tableView; + +@end + +NSString *const BTMockApplePayPaymentAuthorizationControlCell = @"BTMockApplePayPaymentAuthorizationControlCell"; + +@implementation BTMockApplePayPaymentAuthorizationView + +- (instancetype)initWithCoder:(nonnull __unused NSCoder *)aDecoder { + return [self initWithDelegate:nil]; +} + +- (nonnull instancetype)initWithFrame:(__unused CGRect)frame { + return [self initWithDelegate:nil]; +} + +- (instancetype)initWithDelegate:(id)delegate { + self = [super initWithFrame:CGRectNull]; + if (self) { + self.delegate = delegate; + + self.tableView = [[UITableView alloc] initWithFrame:self.frame + style:UITableViewStyleGrouped]; + self.tableView.translatesAutoresizingMaskIntoConstraints = NO; + [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:BTMockApplePayPaymentAuthorizationControlCell]; + self.tableView.dataSource = self; + self.tableView.delegate = self; + + [self addSubview:self.tableView]; + + NSDictionary *views = @{ @"tableView": self.tableView }; + [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[tableView]|" + options:0 + metrics:nil + views:views]]; + [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[tableView]|" + options:0 + metrics:nil + views:views]]; + } + return self; +} + +#pragma mark Table View Data Source + +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { + NSParameterAssert(indexPath.section == 0); + NSParameterAssert(indexPath.row < 2); + + UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:BTMockApplePayPaymentAuthorizationControlCell forIndexPath:indexPath]; + + if (!cell) { + cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:BTMockApplePayPaymentAuthorizationControlCell]; + } + + cell.selectionStyle = UITableViewCellSelectionStyleBlue; + + switch (indexPath.row) { + case 0: + cell.textLabel.text = @"💳 Succeed (4111111111111111)"; + break; + case 1: + cell.textLabel.text = @"⛔️ Cancel"; + break; + + default: + break; + } + + return cell; +} + +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { + NSParameterAssert(indexPath.section == 0); + [tableView deselectRowAtIndexPath:indexPath animated:YES]; + + switch (indexPath.row) { + case 0: + [self.delegate mockApplePayPaymentAuthorizationViewDidSucceed:self]; + break; + case 1: + [self.delegate mockApplePayPaymentAuthorizationViewDidCancel:self]; + default: + break; + } +} + +- (NSString *)tableView:(__unused UITableView *)tableView titleForHeaderInSection:(__unused NSInteger)section { + NSParameterAssert(section == 0); + + return @"Apple Pay - Mock Mode"; +} + +- (NSInteger)tableView:(__unused UITableView *)tableView numberOfRowsInSection:(__unused NSInteger)section { + NSParameterAssert(section == 0); + return 2; +} + +- (NSInteger)numberOfSectionsInTableView:(__unused UITableView *)tableView { + return 1; +} + +@end +#endif diff --git a/Pods/Braintree/Braintree/UI/Views/Apple Pay/BTMockApplePayPaymentAuthorizationViewController.h b/Pods/Braintree/Braintree/UI/Views/Apple Pay/BTMockApplePayPaymentAuthorizationViewController.h new file mode 100644 index 0000000..4fc4ccf --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Apple Pay/BTMockApplePayPaymentAuthorizationViewController.h @@ -0,0 +1,26 @@ +#if BT_ENABLE_APPLE_PAY +#import +@import PassKit; + +@protocol BTMockApplePayPaymentAuthorizationViewControllerDelegate; + +@interface BTMockApplePayPaymentAuthorizationViewController : UIViewController + +@property (nonatomic, weak) id delegate; + +- (instancetype)initWithPaymentRequest:(PKPaymentRequest *)request NS_DESIGNATED_INITIALIZER; + ++ (BOOL)canMakePayments; + +@end + +@protocol BTMockApplePayPaymentAuthorizationViewControllerDelegate + +- (void)mockApplePayPaymentAuthorizationViewController:(BTMockApplePayPaymentAuthorizationViewController *)viewController + didAuthorizePayment:(PKPayment *)payment + completion:(void (^)(PKPaymentAuthorizationStatus status))completion; + +- (void)mockApplePayPaymentAuthorizationViewControllerDidFinish:(BTMockApplePayPaymentAuthorizationViewController *)viewController; + +@end +#endif diff --git a/Pods/Braintree/Braintree/UI/Views/Apple Pay/BTMockApplePayPaymentAuthorizationViewController.m b/Pods/Braintree/Braintree/UI/Views/Apple Pay/BTMockApplePayPaymentAuthorizationViewController.m new file mode 100644 index 0000000..7090680 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Apple Pay/BTMockApplePayPaymentAuthorizationViewController.m @@ -0,0 +1,79 @@ +#if BT_ENABLE_APPLE_PAY +#import "BTMockApplePayPaymentAuthorizationViewController.h" + +#import "BTMockApplePayPaymentAuthorizationView.h" +#import "BTLogger_Internal.h" + +@interface BTMockApplePayPaymentAuthorizationViewController () + +- (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil bundle:(nullable NSBundle *)nibBundleOrNil NS_DESIGNATED_INITIALIZER; +- (instancetype)initWithCoder:(NSCoder *)aDecoder NS_DESIGNATED_INITIALIZER; + +@end + +@implementation BTMockApplePayPaymentAuthorizationViewController + +- (instancetype)initWithPaymentRequest:(PKPaymentRequest *)request { + self = [super initWithNibName:nil bundle:nil]; + if (self) { + [[BTLogger sharedLogger] debug:@"Initializing BTMockApplePayPaymentAuthorizationViewController with PKRequest merchantIdentifier: %@; items: %@", request.merchantIdentifier, request.paymentSummaryItems ]; + } + return self; +} + +- (instancetype)initWithCoder:(__unused NSCoder *)aDecoder { + return [super initWithCoder:aDecoder]; +} + +- (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil bundle:(nullable NSBundle *)nibBundleOrNil { + return [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; +} + +- (void)viewDidLoad +{ + [super viewDidLoad]; + + BTMockApplePayPaymentAuthorizationView *authorizationView = [[BTMockApplePayPaymentAuthorizationView alloc] initWithDelegate:self]; + authorizationView.translatesAutoresizingMaskIntoConstraints = NO; + + [self.view addSubview:authorizationView]; + + NSDictionary *views = @{ @"authorizationView": authorizationView }; + [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[authorizationView]|" + options:0 + metrics:nil + views:views]]; + [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[authorizationView]|" + options:0 + metrics:nil + views:views]]; +} + ++ (BOOL)canMakePayments { + NSOperatingSystemVersion v; + v.majorVersion = 8; + v.minorVersion = 1; + v.patchVersion = 0; + return [[NSProcessInfo processInfo] respondsToSelector:@selector(operatingSystemVersion)] && [[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion:v]; +} + +- (void)cancel:(__unused id)sender { + [self.delegate mockApplePayPaymentAuthorizationViewControllerDidFinish:self]; +} + +#pragma mark Mock Payment Authorization View Delegate + +- (void)mockApplePayPaymentAuthorizationViewDidCancel:(__unused BTMockApplePayPaymentAuthorizationView *)view { + [self.delegate mockApplePayPaymentAuthorizationViewControllerDidFinish:self]; +} + +- (void)mockApplePayPaymentAuthorizationViewDidSucceed:(__unused BTMockApplePayPaymentAuthorizationView *)view { + [self.delegate mockApplePayPaymentAuthorizationViewController:self + didAuthorizePayment:nil + completion:^(__unused PKPaymentAuthorizationStatus status) { + [self.delegate mockApplePayPaymentAuthorizationViewControllerDidFinish:self]; + }]; +} + +@end +#endif diff --git a/Pods/Braintree/Braintree/UI/Views/BTUIViewUtil.h b/Pods/Braintree/Braintree/UI/Views/BTUIViewUtil.h new file mode 100644 index 0000000..79e20d0 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/BTUIViewUtil.h @@ -0,0 +1,14 @@ +#import + +#import "BTUICardType.h" +#import "BTUIPaymentMethodType.h" + +/// Utilities used by other views +@interface BTUIViewUtil : NSObject + ++ (BTUIPaymentMethodType)paymentMethodTypeForCardType:(BTUICardType *)cardType; ++ (NSString *)nameForPaymentMethodType:(BTUIPaymentMethodType)paymentMethodType; + ++ (void)vibrate; + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/BTUIViewUtil.m b/Pods/Braintree/Braintree/UI/Views/BTUIViewUtil.m new file mode 100644 index 0000000..d98f757 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/BTUIViewUtil.m @@ -0,0 +1,72 @@ +#import "BTUIViewUtil.h" +@import AudioToolbox; + +@implementation BTUIViewUtil + ++ (BTUIPaymentMethodType)paymentMethodTypeForCardType:(BTUICardType *)cardType { + + if (cardType == nil) { + return BTUIPaymentMethodTypeUnknown; + } + + if ([cardType.brand isEqualToString:BTUILocalizedString(CARD_TYPE_AMERICAN_EXPRESS)]) { + return BTUIPaymentMethodTypeAMEX; + } else if ([cardType.brand isEqualToString:BTUILocalizedString(CARD_TYPE_VISA)]) { + return BTUIPaymentMethodTypeVisa; + } else if ([cardType.brand isEqualToString:BTUILocalizedString(CARD_TYPE_MASTER_CARD)]) { + return BTUIPaymentMethodTypeMasterCard; + } else if ([cardType.brand isEqualToString:BTUILocalizedString(CARD_TYPE_DISCOVER)]) { + return BTUIPaymentMethodTypeDiscover; + } else if ([cardType.brand isEqualToString:BTUILocalizedString(CARD_TYPE_JCB)]) { + return BTUIPaymentMethodTypeJCB; + } else if ([cardType.brand isEqualToString:BTUILocalizedString(CARD_TYPE_MAESTRO)]) { + return BTUIPaymentMethodTypeMaestro; + } else if ([cardType.brand isEqualToString:BTUILocalizedString(CARD_TYPE_DINERS_CLUB)]) { + return BTUIPaymentMethodTypeDinersClub; + } else { + return BTUIPaymentMethodTypeUnknown; + } +} + + ++ (NSString *)nameForPaymentMethodType:(BTUIPaymentMethodType)paymentMethodType { + switch (paymentMethodType) { + case BTUIPaymentMethodTypeUnknown: + return @"Card"; + case BTUIPaymentMethodTypeAMEX: + return BTUILocalizedString(CARD_TYPE_AMERICAN_EXPRESS); + case BTUIPaymentMethodTypeDinersClub: + return BTUILocalizedString(CARD_TYPE_DINERS_CLUB); + case BTUIPaymentMethodTypeDiscover: + return BTUILocalizedString(CARD_TYPE_DISCOVER); + case BTUIPaymentMethodTypeMasterCard: + return BTUILocalizedString(CARD_TYPE_MASTER_CARD); + case BTUIPaymentMethodTypeVisa: + return BTUILocalizedString(CARD_TYPE_VISA); + case BTUIPaymentMethodTypeJCB: + return BTUILocalizedString(CARD_TYPE_JCB); + case BTUIPaymentMethodTypeLaser: + return BTUILocalizedString(CARD_TYPE_LASER); + case BTUIPaymentMethodTypeMaestro: + return BTUILocalizedString(CARD_TYPE_MAESTRO); + case BTUIPaymentMethodTypeUnionPay: + return BTUILocalizedString(CARD_TYPE_UNION_PAY); + case BTUIPaymentMethodTypeSolo: + return BTUILocalizedString(CARD_TYPE_SOLO); + case BTUIPaymentMethodTypeSwitch: + return BTUILocalizedString(CARD_TYPE_SWITCH); + case BTUIPaymentMethodTypeUKMaestro: + return BTUILocalizedString(CARD_TYPE_MAESTRO); + case BTUIPaymentMethodTypePayPal: + return BTUILocalizedString(PAYPAL_CARD_BRAND); + case BTUIPaymentMethodTypeCoinbase: + return BTUILocalizedString(PAYMENT_METHOD_TYPE_COINBASE); + } + +} + ++ (void)vibrate { + AudioServicesPlayAlertSound(kSystemSoundID_Vibrate); +} + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Collection Views/BTUIHorizontalButtonStackCollectionViewFlowLayout.h b/Pods/Braintree/Braintree/UI/Views/Collection Views/BTUIHorizontalButtonStackCollectionViewFlowLayout.h new file mode 100644 index 0000000..509f3be --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Collection Views/BTUIHorizontalButtonStackCollectionViewFlowLayout.h @@ -0,0 +1,5 @@ +#import + +@interface BTUIHorizontalButtonStackCollectionViewFlowLayout : UICollectionViewFlowLayout + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Collection Views/BTUIHorizontalButtonStackCollectionViewFlowLayout.m b/Pods/Braintree/Braintree/UI/Views/Collection Views/BTUIHorizontalButtonStackCollectionViewFlowLayout.m new file mode 100644 index 0000000..c55b250 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Collection Views/BTUIHorizontalButtonStackCollectionViewFlowLayout.m @@ -0,0 +1,52 @@ +#import "BTUIHorizontalButtonStackCollectionViewFlowLayout.h" +#import "BTUIHorizontalButtonStackSeparatorLineView.h" + + +NSString *BTHorizontalButtonStackCollectionViewFlowLayoutLineSeparatorDecoratorViewKind = @"BTHorizontalButtonStackCollectionViewFlowLayoutLineSeparatorDecoratorViewKind"; + +@interface BTUIHorizontalButtonStackCollectionViewFlowLayout () +@end + +@implementation BTUIHorizontalButtonStackCollectionViewFlowLayout + +- (id)init { + self = [super init]; + if (self) { + [self registerClass:[BTUIHorizontalButtonStackSeparatorLineView class] forDecorationViewOfKind:BTHorizontalButtonStackCollectionViewFlowLayoutLineSeparatorDecoratorViewKind]; + } + return self; +} + +- (void)prepareLayout { + [super prepareLayout]; + + NSParameterAssert(self.collectionView.numberOfSections == 1); + NSInteger numberOfItems = [self.collectionView numberOfItemsInSection:0]; + CGFloat totalWidth = self.collectionView.frame.size.width; + + if (numberOfItems == 0) { + return; + } + + self.itemSize = CGSizeMake(totalWidth/numberOfItems, self.collectionView.frame.size.height); +} + +- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect { + NSMutableArray *layoutAttributes = [[super layoutAttributesForElementsInRect:rect] mutableCopy]; + + NSInteger numberOfItems = [self.collectionView numberOfItemsInSection:0]; + if (numberOfItems == 0) { + return layoutAttributes; + } + + for (UICollectionViewLayoutAttributes *attributes in [layoutAttributes subarrayWithRange:NSMakeRange(0, [layoutAttributes count] - 1)]) { + UICollectionViewLayoutAttributes *separatorAttributes = [UICollectionViewLayoutAttributes layoutAttributesForDecorationViewOfKind:BTHorizontalButtonStackCollectionViewFlowLayoutLineSeparatorDecoratorViewKind + withIndexPath:attributes.indexPath]; + separatorAttributes.frame = CGRectMake(attributes.frame.origin.x + attributes.frame.size.width, attributes.frame.origin.y, 1/2.0f, attributes.frame.size.height); + [layoutAttributes addObject:separatorAttributes]; + } + + return layoutAttributes; +} + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Collection Views/BTUIHorizontalButtonStackSeparatorLineView.h b/Pods/Braintree/Braintree/UI/Views/Collection Views/BTUIHorizontalButtonStackSeparatorLineView.h new file mode 100644 index 0000000..3e2c93a --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Collection Views/BTUIHorizontalButtonStackSeparatorLineView.h @@ -0,0 +1,7 @@ +#import + +#import "BTUI.h" + +@interface BTUIHorizontalButtonStackSeparatorLineView : UICollectionReusableView +@property (nonatomic, strong) BTUI *theme; +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Collection Views/BTUIHorizontalButtonStackSeparatorLineView.m b/Pods/Braintree/Braintree/UI/Views/Collection Views/BTUIHorizontalButtonStackSeparatorLineView.m new file mode 100644 index 0000000..ae5c83a --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Collection Views/BTUIHorizontalButtonStackSeparatorLineView.m @@ -0,0 +1,59 @@ +#import "BTUIHorizontalButtonStackSeparatorLineView.h" + +@interface BTUIHorizontalButtonStackSeparatorLineView () +@property (nonatomic, strong) UIView *line; +@end + +@implementation BTUIHorizontalButtonStackSeparatorLineView + +- (id)initWithFrame:(CGRect)frame { + self = [super initWithFrame:frame]; + if (self) { + self.theme = [BTUI braintreeTheme]; + self.opaque = NO; + self.backgroundColor = [UIColor clearColor]; + + self.line = [[UIView alloc] initWithFrame:CGRectZero]; + self.line.translatesAutoresizingMaskIntoConstraints = NO; + [self updateThemeAttributes]; + [self addSubview:self.line]; + } + return self; +} + +- (void)updateThemeAttributes { + self.line.backgroundColor = self.theme.borderColor; +} + +- (void)setTheme:(BTUI *)theme { + _theme = theme; + [self updateThemeAttributes]; +} + +- (void)updateConstraints { + NSDictionary *views = @{ @"line": self.line }; + [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[line]|" + options:0 + metrics:nil + views:views]]; + + [self addConstraint:[NSLayoutConstraint constraintWithItem:self + attribute:NSLayoutAttributeHeight + relatedBy:NSLayoutRelationEqual + toItem:self.line + attribute:NSLayoutAttributeHeight + multiplier:2.0f + constant:0.0f]]; + + [self addConstraint:[NSLayoutConstraint constraintWithItem:self + attribute:NSLayoutAttributeCenterY + relatedBy:NSLayoutRelationEqual + toItem:self.line + attribute:NSLayoutAttributeCenterY + multiplier:1.0f + constant:0.0f]]; + + [super updateConstraints]; +} + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Collection Views/BTUIPaymentButtonCollectionViewCell.h b/Pods/Braintree/Braintree/UI/Views/Collection Views/BTUIPaymentButtonCollectionViewCell.h new file mode 100644 index 0000000..d59de8d --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Collection Views/BTUIPaymentButtonCollectionViewCell.h @@ -0,0 +1,5 @@ +#import + +@interface BTUIPaymentButtonCollectionViewCell : UICollectionViewCell +@property (nonatomic, strong) UIControl *paymentButton; +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Collection Views/BTUIPaymentButtonCollectionViewCell.m b/Pods/Braintree/Braintree/UI/Views/Collection Views/BTUIPaymentButtonCollectionViewCell.m new file mode 100644 index 0000000..7c831db --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Collection Views/BTUIPaymentButtonCollectionViewCell.m @@ -0,0 +1,62 @@ +#import "BTUIPaymentButtonCollectionViewCell.h" + +@interface BTUIPaymentButtonCollectionViewCell () +@property (nonatomic, strong) NSMutableArray *paymentButtonConstraints; +@end + +@implementation BTUIPaymentButtonCollectionViewCell + +- (id)initWithFrame:(CGRect)frame { + self = [super initWithFrame:frame]; + if (self) { + self.contentView.userInteractionEnabled = NO; + self.paymentButtonConstraints = [NSMutableArray array]; + } + return self; +} + +- (void)setPaymentButton:(UIControl *)paymentButton { + if (self.paymentButtonConstraints) { + [self removeConstraints:self.paymentButtonConstraints]; + [self.paymentButtonConstraints removeAllObjects]; + } + [self.paymentButton removeFromSuperview]; + + _paymentButton = paymentButton; + [self.contentView addSubview:paymentButton]; + + paymentButton.userInteractionEnabled = NO; + + [self setNeedsUpdateConstraints]; +} + +- (void)updateConstraints { + if (self.paymentButton) { + NSDictionary *views = @{ @"paymentButton": self.paymentButton }; + [self.paymentButtonConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[paymentButton]|" + options:0 + metrics:nil + views:views]]; + [self.paymentButtonConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[paymentButton]|" + options:0 + metrics:nil + views:views]]; + [self addConstraints:self.paymentButtonConstraints]; + } + [super updateConstraints]; +} + +- (void)setHighlighted:(BOOL)highlighted { + [super setHighlighted:highlighted]; + + [self.paymentButton setHighlighted:highlighted]; +} + +- (void)setSelected:(BOOL)selected { + [super setSelected:selected]; + + [self.paymentButton setSelected:selected]; +} + +@end + diff --git a/Pods/Braintree/Braintree/UI/Views/Custom Views/BTUIFloatLabel.h b/Pods/Braintree/Braintree/UI/Views/Custom Views/BTUIFloatLabel.h new file mode 100644 index 0000000..aa515d0 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Custom Views/BTUIFloatLabel.h @@ -0,0 +1,10 @@ +#import "BTUIThemedView.h" + +@interface BTUIFloatLabel : BTUIThemedView + +@property (nonatomic, readonly, strong) UILabel *label; + +- (void)showWithAnimation:(BOOL)shouldAnimate; +- (void)hideWithAnimation:(BOOL)shouldAnimate; + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Custom Views/BTUIFloatLabel.m b/Pods/Braintree/Braintree/UI/Views/Custom Views/BTUIFloatLabel.m new file mode 100644 index 0000000..31a9b8d --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Custom Views/BTUIFloatLabel.m @@ -0,0 +1,116 @@ +#import "BTUIFloatLabel.h" + +@interface BTUIFloatLabel () +@property (nonatomic, readwrite, strong) UILabel *label; +@property (nonatomic, strong) NSArray *verticalConstraints; +@end + +@implementation BTUIFloatLabel + +- (id)init { + self = [super init]; + if (self) { + [self setupSubviews]; + } + return self; +} + +- (id)initWithFrame:(CGRect)frame { + self = [super initWithFrame:frame]; + if (self) { + [self setupSubviews]; + } + return self; +} + +- (id)initWithCoder:(NSCoder *)aDecoder { + self = [super initWithCoder:aDecoder]; + if (self) { + [self setupSubviews]; + } + return self; +} + +- (void)setupSubviews { + self.label = [[UILabel alloc] init]; + self.label.translatesAutoresizingMaskIntoConstraints = NO; + self.label.font = self.theme.textFieldFloatLabelFont; + self.label.textColor = self.theme.textFieldFloatLabelTextColor; + self.label.backgroundColor = [UIColor clearColor]; + self.label.opaque = NO; + self.label.numberOfLines = 1; + self.label.adjustsFontSizeToFitWidth = YES; + [self addSubview:self.label]; + + self.verticalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[label]|" + options:0 + metrics:nil + views:[self viewBindings]]; +} + +- (void)updateConstraints { + [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[label]|" + options:0 + metrics:nil + views:[self viewBindings]]]; + [self addConstraints:self.verticalConstraints]; + + [super updateConstraints]; +} + +- (void)showWithAnimation:(BOOL)shouldAnimate { + void (^animations)(void) = ^{ + self.label.alpha = 1.0f; + [self layoutIfNeeded]; + }; + + [self removeConstraints:self.verticalConstraints]; + self.verticalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[label]|" + options:0 + metrics:nil + views:[self viewBindings]]; + [self setNeedsUpdateConstraints]; + + if (shouldAnimate) { + [UIView animateWithDuration:self.theme.quickTransitionDuration + delay:0.0f + options:UIViewAnimationOptionCurveEaseOut + animations:animations + completion:nil]; + } else { + animations(); + } +} + +- (void)hideWithAnimation:(BOOL)shouldAnimate { + void (^animations)(void) = ^{ + self.label.alpha = 0.0f; + [self setNeedsUpdateConstraints]; + [self layoutIfNeeded]; + }; + + [self removeConstraints:self.verticalConstraints]; + self.verticalConstraints = @[ [NSLayoutConstraint constraintWithItem:self.label + attribute:NSLayoutAttributeTop + relatedBy:NSLayoutRelationEqual + toItem:self + attribute:NSLayoutAttributeCenterY + multiplier:1.0f + constant:0.0f] ]; + [self setNeedsUpdateConstraints]; + if (shouldAnimate) { + [UIView animateWithDuration:self.theme.quickTransitionDuration + delay:0.0f + options:UIViewAnimationOptionCurveEaseOut + animations:animations + completion:nil]; + } else { + animations(); + } +} + +- (NSDictionary *)viewBindings { + return @{ @"label": self.label }; +} + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Custom Views/BTUIFormField.h b/Pods/Braintree/Braintree/UI/Views/Custom Views/BTUIFormField.h new file mode 100644 index 0000000..4ad33c9 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Custom Views/BTUIFormField.h @@ -0,0 +1,39 @@ +#import +#import "BTUIThemedView.h" + +@protocol BTUIFormFieldDelegate; + +/// A form field is a UI component for entering a text value +/// +/// This is the parent class of all card form fields, +/// and handles display but not formatting, validation, or +/// relaying of events +/// +/// @see BTUIFormField() +@interface BTUIFormField : BTUIThemedView + +- (void)updateAppearance; + +@property (nonatomic, weak) id delegate; +@property (nonatomic, assign) BOOL vibrateOnInvalidInput; +@property (nonatomic, assign, readonly) BOOL valid; +@property (nonatomic, assign, readonly) BOOL entryComplete; +@property (nonatomic, assign) BOOL displayAsValid; +@property (nonatomic, assign) BOOL bottomBorder; +@property (nonatomic, assign, readwrite) BOOL backspace; + +/// The text displayed by the field +@property (nonatomic, copy) NSString *text; + +@end + + +@protocol BTUIFormFieldDelegate + +- (void)formFieldDidChange:(BTUIFormField *)formField; +- (void)formFieldDidDeleteWhileEmpty:(BTUIFormField *)formField; + +@optional +- (BOOL)formFieldShouldReturn:(BTUIFormField *)formField; + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Custom Views/BTUIFormField.m b/Pods/Braintree/Braintree/UI/Views/Custom Views/BTUIFormField.m new file mode 100644 index 0000000..92106f9 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Custom Views/BTUIFormField.m @@ -0,0 +1,395 @@ +#import "BTUIFormField_Protected.h" +#import "BTUIViewUtil.h" +#import "BTUITextField.h" +#import "BTUIFloatLabel.h" + +@import QuartzCore; + +const CGFloat formFieldTopMargin = 7; +const CGFloat formFieldLabelHeight = 15; +const CGFloat formFieldVerticalSpace = 1; +const CGFloat formFieldTextFieldHeight = 20; +const CGFloat formFieldBottomMargin = 11; + +@interface BTUIFormField () + +@property (nonatomic, strong) BTUIFloatLabel *floatLabel; +@property (nonatomic, copy) NSString *previousTextFieldText; +@property (nonatomic, strong) NSMutableArray *layoutConstraints; + +@end + +@implementation BTUIFormField + +- (instancetype)initWithFrame:(CGRect)frame { + self = [super initWithFrame:frame]; + if (self) { + self.displayAsValid = YES; + BTUITextField *textField = [BTUITextField new]; + textField.editDelegate = self; + _textField = textField; + self.textField.translatesAutoresizingMaskIntoConstraints = NO; + self.textField.borderStyle = UITextBorderStyleNone; + self.textField.backgroundColor = [UIColor clearColor]; + self.textField.opaque = NO; + self.textField.adjustsFontSizeToFitWidth = YES; + self.textField.returnKeyType = UIReturnKeyNext; + + self.floatLabel = [[BTUIFloatLabel alloc] init]; + self.floatLabel.translatesAutoresizingMaskIntoConstraints = NO; + [self.floatLabel hideWithAnimation:NO]; + + self.accessoryView = [[UIView alloc] init]; + self.accessoryView.backgroundColor = [UIColor clearColor]; + self.accessoryView.hidden = YES; + + [self.textField addTarget:self action:@selector(fieldContentDidChange) forControlEvents:UIControlEventEditingChanged]; + [self.textField addTarget:self action:@selector(editingDidBegin) forControlEvents:UIControlEventEditingDidBegin]; + [self.textField addTarget:self action:@selector(editingDidEnd) forControlEvents:UIControlEventEditingDidEnd]; + + self.textField.delegate = self; + + [self addSubview:self.textField]; + [self addSubview:self.floatLabel]; + [self addSubview:self.accessoryView]; + + [self addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tappedField)]]; + + [self setContentHuggingPriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisVertical]; + self.opaque = NO; + + [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(orientationChange) + name:UIDeviceOrientationDidChangeNotification + object:nil]; + } + return self; +} + +- (CGSize)intrinsicContentSize { + CGFloat height = formFieldTopMargin + formFieldLabelHeight + formFieldVerticalSpace + formFieldTextFieldHeight + formFieldBottomMargin; + return CGSizeMake(UIViewNoIntrinsicMetric, height); +} + +- (void)setAccessoryView:(UIView *)accessoryView { + _accessoryView = accessoryView; + self.accessoryView.userInteractionEnabled = NO; + self.accessoryView.translatesAutoresizingMaskIntoConstraints = NO; +} + +- (void)setDisplayAsValid:(BOOL)displayAsValid { + if (self.vibrateOnInvalidInput && self.textField.isFirstResponder && _displayAsValid && !displayAsValid) { + [BTUIViewUtil vibrate]; + } + + _displayAsValid = displayAsValid; + [self updateAppearance]; + [self setNeedsDisplay]; +} + +- (void)orientationChange { + [self setNeedsDisplay]; +} + +- (void)dealloc { + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +#pragma mark - Validity "abstract" methods + +- (BOOL)valid { + return YES; +} + +- (BOOL)entryComplete { + NSUInteger index = [self.textField offsetFromPosition:self.textField.beginningOfDocument toPosition:self.textField.selectedTextRange.start]; + return index == self.textField.text.length && self.valid; +} + +- (BOOL)becomeFirstResponder { + return [self.textField becomeFirstResponder]; +} + +- (BOOL)resignFirstResponder { + return [super resignFirstResponder] || [self.textField resignFirstResponder]; +} + +#pragma mark - Theme + +- (void)setTheme:(BTUI *)theme { + [super setTheme:theme]; + NSMutableDictionary *d = [NSMutableDictionary dictionaryWithDictionary:self.theme.textFieldTextAttributes]; + d[NSKernAttributeName] = @0; + self.textField.defaultTextAttributes = self.theme.textFieldTextAttributes; + self.floatLabel.theme = theme; +} + +- (void)setThemedPlaceholder:(NSString *)placeholder { + self.floatLabel.label.text = placeholder; + self.textField.attributedPlaceholder = [[NSAttributedString alloc] initWithString:placeholder ?: @"" + attributes:self.theme.textFieldPlaceholderAttributes]; +} + +- (void)setThemedAttributedPlaceholder:(NSAttributedString *)placeholder { + NSMutableAttributedString *mutableFloatLabel = [[NSMutableAttributedString alloc] initWithAttributedString:placeholder]; + [mutableFloatLabel beginEditing]; + [mutableFloatLabel removeAttribute:NSForegroundColorAttributeName range:NSMakeRange(0, [mutableFloatLabel length])]; + [mutableFloatLabel removeAttribute:NSBackgroundColorAttributeName range:NSMakeRange(0, [mutableFloatLabel length])]; + [mutableFloatLabel removeAttribute:NSFontAttributeName range:NSMakeRange(0, [mutableFloatLabel length])]; + [mutableFloatLabel endEditing]; + self.floatLabel.label.attributedText = mutableFloatLabel; + + NSMutableAttributedString *mutablePlaceholder = [[NSMutableAttributedString alloc] initWithAttributedString:placeholder]; + [mutablePlaceholder beginEditing]; + [mutablePlaceholder addAttributes:self.theme.textFieldPlaceholderAttributes range:NSMakeRange(0, [mutablePlaceholder length])]; + [mutablePlaceholder endEditing]; + + self.textField.attributedPlaceholder = mutablePlaceholder; +} + +#pragma mark - Drawing + +- (void)updateAppearance { + UIColor *textColor; + if (!self.displayAsValid){ + textColor = self.theme.errorForegroundColor; + self.backgroundColor = self.theme.errorBackgroundColor; + } else { + textColor = self.theme.textFieldTextColor; + self.backgroundColor = [UIColor clearColor]; + } + + NSMutableAttributedString *mutableText = [[NSMutableAttributedString alloc] initWithAttributedString:self.textField.attributedText]; + [mutableText addAttributes:@{NSForegroundColorAttributeName: textColor} range:NSMakeRange(0, mutableText.length)]; + + UITextRange *currentRange = self.textField.selectedTextRange; + + self.textField.attributedText = mutableText; + + // Reassign current selection range, since it gets cleared after attributedText assignment + self.textField.selectedTextRange = currentRange; +} + +- (void)drawRect:(CGRect)rect { + + // Draw borders + + CGContextRef context = UIGraphicsGetCurrentContext(); + if (!self.displayAsValid) { + [self.theme.errorForegroundColor setFill]; + + CGPathRef path = CGPathCreateWithRect(CGRectMake(rect.origin.x, CGRectGetMaxY(rect) - 0.5f, rect.size.width, 0.5f), NULL); + CGContextAddPath(context, path); + CGPathRelease(path); + + path = CGPathCreateWithRect(CGRectMake(rect.origin.x, 0, rect.size.width, 0.5f), NULL); + CGContextAddPath(context, path); + + CGContextDrawPath(context, kCGPathFill); + CGPathRelease(path); + } else if (self.bottomBorder) { + CGFloat horizontalMargin = [self.theme horizontalMargin]; + CGPathRef path = CGPathCreateWithRect(CGRectMake(rect.origin.x + horizontalMargin, CGRectGetMaxY(rect) - 0.5f, rect.size.width - horizontalMargin, 0.5f), NULL); + CGContextAddPath(context, path); + [self.theme.borderColor setFill]; + CGContextDrawPath(context, kCGPathFill); + CGPathRelease(path); + } +} + +- (void)setBottomBorder:(BOOL)bottomBorder { + _bottomBorder = bottomBorder; + [self setNeedsDisplay]; +} + +- (void)updateConstraints { + + NSDictionary *metrics = @{@"horizontalMargin": @([self.theme horizontalMargin]), + @"accessoryViewWidth": @44, + @"formFieldTopMargin": @(formFieldTopMargin), + @"formFieldLabelHeight": @(formFieldLabelHeight), + @"formFieldVerticalSpace": @(formFieldVerticalSpace), + @"formFieldTextFieldHeight": @(formFieldTextFieldHeight), + @"formFieldBottomMargin": @(formFieldBottomMargin) + }; + NSDictionary *views = @{ @"textField": self.textField, + @"floatLabel": self.floatLabel, + @"accessoryView": self.accessoryView }; + + if (self.layoutConstraints != nil) { + [self removeConstraints:self.layoutConstraints]; + } + self.layoutConstraints = [NSMutableArray array]; + + // Pin accessory view to right with constant width + + [self.layoutConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[accessoryView]-(horizontalMargin)-|" + options:NSLayoutFormatAlignAllCenterY + metrics:metrics + views:views]]; + + + // Horizontally Pin Float Label and accessory view + [self.layoutConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(horizontalMargin)-[floatLabel]-(horizontalMargin)-[accessoryView]-(horizontalMargin)-|" options:0 metrics:metrics views:views]]; + + // Horizontally Pin text field and accessory view + [self.layoutConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(horizontalMargin)-[textField]-(horizontalMargin)-[accessoryView]-(horizontalMargin)-|" options:0 metrics:metrics views:views]]; + + [self.layoutConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[accessoryView(==accessoryViewWidth)]" options:0 metrics:metrics views:views]]; + + [self.layoutConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(formFieldTopMargin)-[floatLabel(==formFieldLabelHeight)]-(formFieldVerticalSpace)-[textField(==formFieldTextFieldHeight)]-(formFieldBottomMargin)-|" options:0 metrics:metrics views:views]]; + [self.layoutConstraints addObject:[NSLayoutConstraint constraintWithItem:self.accessoryView + attribute:NSLayoutAttributeCenterY + relatedBy:NSLayoutRelationEqual + toItem:self + attribute:NSLayoutAttributeCenterY + multiplier:1.0f + constant:0]]; + NSArray *contraintsToAdd = [self.layoutConstraints copy]; + [self addConstraints:contraintsToAdd]; + [super updateConstraints]; + +} + +- (void)didDeleteBackward { + if (self.previousTextFieldText.length == 0 && self.textField.text.length == 0) { + [self.delegate formFieldDidDeleteWhileEmpty:self]; + } +} + + +- (void)updateFloatLabelTextColor { + if ([self.textField isFirstResponder]) { + self.floatLabel.label.textColor = self.tintColor; + } else { + self.floatLabel.label.textColor = self.theme.textFieldFloatLabelTextColor; + } +} + +- (void)tintColorDidChange { + [self updateFloatLabelTextColor]; +} + +#pragma mark - UITextFieldDelegate methods + +- (void)textFieldDidBeginEditing:(__unused UITextField *)textField { + [self updateFloatLabelTextColor]; +} + +- (void)textFieldDidEndEditing:(__unused UITextField *)textField { + [self updateFloatLabelTextColor]; +} + +#pragma mark - BTUITextFieldEditDelegate methods + +- (void)textFieldWillDeleteBackward:(__unused BTUITextField *)textField { + // _backspace indicates that the backspace key was typed. + _backspace = YES; + +} + +- (void)textFieldDidDeleteBackward:(BTUITextField *)textField originalText:(__unused NSString *)originalText { + if (originalText.length == 0) { + [self.delegate formFieldDidDeleteWhileEmpty:self]; + } + + if (textField.text.length == 0) { + [self.floatLabel hideWithAnimation:YES]; + } +} + +- (void)textField:(__unused BTUITextField *)textField willInsertText:(__unused NSString *)text { + _backspace = NO; +} + +- (void)textField:(BTUITextField *)textField didInsertText:(__unused NSString *)text { + if (textField.text.length > 0) { + [self.floatLabel showWithAnimation:YES]; + } +} + +- (void)setAccessoryHighlighted:(BOOL)highlight { + if (self.accessoryView) { + if ([self.accessoryView respondsToSelector:@selector(setHighlighted:animated:)]) { + SEL selector = @selector(setHighlighted:animated:); + BOOL animated = YES; + NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[self.accessoryView methodSignatureForSelector:selector]]; + [invocation setSelector:selector]; + [invocation setTarget:self.accessoryView]; + [invocation setArgument:&highlight atIndex:2]; + [invocation setArgument:&animated atIndex:3]; + [invocation invoke]; + } + } +} + +#pragma mark - Custom accessors + +- (void)setText:(NSString *)text { + BOOL shouldChange = [self.textField.delegate textField:self.textField + shouldChangeCharactersInRange:NSMakeRange(0, self.textField.text.length) + replacementString:text]; + if (shouldChange) { + [self.textField.delegate textFieldDidBeginEditing:self.textField]; + [self.textField.editDelegate textField:self.textField willInsertText:text]; + self.textField.text = text; + [self fieldContentDidChange]; + [self.textField.editDelegate textField:self.textField didInsertText:text]; + [self.textField.delegate textFieldDidEndEditing:self.textField]; + + } +} + +- (NSString *)text { + return self.textField.text; +} + +#pragma mark - Delegate methods and handlers + +- (void)fieldContentDidChange { + // To be implemented by subclass +} + +- (void)editingDidBegin { + [self setAccessoryHighlighted:YES]; +} + +- (void)editingDidEnd { + [self setAccessoryHighlighted:NO]; +} + + +- (BOOL)textField:(__unused UITextField *)textField shouldChangeCharactersInRange:(__unused NSRange)range replacementString:(__unused NSString *)newText { + // To be implemented by subclass + return YES; +} + +- (BOOL)textFieldShouldReturn:(__unused UITextField *)textField { + if ([self.delegate respondsToSelector:@selector(formFieldShouldReturn:)]) { + return [self.delegate formFieldShouldReturn:self]; + } else { + return YES; + } +} + +- (void)tappedField { + [self.textField becomeFirstResponder]; +} + +#pragma mark UIKeyInput + +- (void)insertText:(NSString *)text { + [self.textField insertText:text]; +} + +- (void)deleteBackward { + [self.textField deleteBackward]; +} + +- (BOOL)hasText { + return [self.textField hasText]; +} + +@end + diff --git a/Pods/Braintree/Braintree/UI/Views/Custom Views/BTUIFormField_Protected.h b/Pods/Braintree/Braintree/UI/Views/Custom Views/BTUIFormField_Protected.h new file mode 100644 index 0000000..746c474 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Custom Views/BTUIFormField_Protected.h @@ -0,0 +1,21 @@ +#import +#import "BTUIFormField.h" +#import "BTUITextField.h" + +/// Private class extension for implementors of BTUIFormField subclasses. +@interface BTUIFormField () + +@property (nonatomic, strong, readonly) BTUITextField *textField; + +@property (nonatomic, strong) UIView *accessoryView; + +/// Override in your subclass to implement behavior +/// on content change +- (void)fieldContentDidChange; + +/// Sets placeholder text with the appropriate theme style +- (void)setThemedPlaceholder:(NSString *)placeholder; +- (void)setThemedAttributedPlaceholder:(NSAttributedString *)placeholder; + +@end + diff --git a/Pods/Braintree/Braintree/UI/Views/Custom Views/BTUIScrollView.h b/Pods/Braintree/Braintree/UI/Views/Custom Views/BTUIScrollView.h new file mode 100644 index 0000000..506126f --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Custom Views/BTUIScrollView.h @@ -0,0 +1,23 @@ +#import + +@protocol BTUIScrollViewScrollRectToVisibleDelegate; + +/// Subclass of UIScrollView that disables default iOS "autoscrolling" to text fields +/// by overriding the scrollRectToVisible method with a call to a delegate. +@interface BTUIScrollView : UIScrollView + +/// Delegate that, if set, receives messages when scrollRectToVisible is called +/// If nil, scrollRectToVisible is simply a no-op. +@property (nonatomic, weak) id scrollRectToVisibleDelegate; + +/// The "default" scrollRectToVisible implementation +- (void)defaultScrollRectToVisible:(CGRect)rect animated:(BOOL)animated; + +@end + + +@protocol BTUIScrollViewScrollRectToVisibleDelegate + +- (void)scrollView:(BTUIScrollView *)scrollView requestsScrollRectToVisible:(__unused CGRect)rect animated:(__unused BOOL)animated; + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Custom Views/BTUIScrollView.m b/Pods/Braintree/Braintree/UI/Views/Custom Views/BTUIScrollView.m new file mode 100644 index 0000000..8a508de --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Custom Views/BTUIScrollView.m @@ -0,0 +1,21 @@ +#import "BTUIScrollView.h" + +@implementation BTUIScrollView + +- (void)defaultScrollRectToVisible:(CGRect)rect animated:(BOOL)animated +{ + [super scrollRectToVisible:rect animated:animated]; +} + +- (void)scrollRectToVisible:(CGRect)rect animated:(BOOL)animated +{ + if (self.scrollRectToVisibleDelegate != nil) { + [self.scrollRectToVisibleDelegate scrollView:self requestsScrollRectToVisible:rect animated:animated]; + } +} + +- (BOOL)touchesShouldCancelInContentView:(__unused UIView *)view { + return YES; +} + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Custom Views/BTUITextField.h b/Pods/Braintree/Braintree/UI/Views/Custom Views/BTUITextField.h new file mode 100644 index 0000000..725d740 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Custom Views/BTUITextField.h @@ -0,0 +1,45 @@ +#import + +@protocol BTUITextFieldEditDelegate; + +/// @class A specialized text field that provides more granular callbacks than a standard +/// UITextField as the user edits text +@interface BTUITextField : UITextField + +/// The specialized delegate for receiving callbacks about editing +@property (nonatomic, weak) id editDelegate; + +@end + +/// A protocol for receiving callbacks when a user edits text in a `BTUITextField` +@protocol BTUITextFieldEditDelegate + +@optional + +/// The editDelegate receives this message when the user deletes a character, but before the deletion +/// is applied to the `text` +/// +/// @param textField The text field +- (void)textFieldWillDeleteBackward:(BTUITextField *)textField; + +/// The editDelegate receives this message after the user deletes a character +/// +/// @param textField The text field +/// @param originalText The `text` of the text field before applying the deletion +- (void)textFieldDidDeleteBackward:(BTUITextField *)textField + originalText:(NSString *)originalText; + +/// The editDelegate receives this message when the user enters text, but +/// before the text is inserted +/// +/// @param textField The text field +/// @param text The text that will be inserted +- (void)textField:(BTUITextField *)textField willInsertText:(NSString *)text; + +/// The editDelegate receives this message after the user enters text +/// +/// @param textField The text field +/// @param text The text that was inserted +- (void)textField:(BTUITextField *)textField didInsertText:(NSString *)text; + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Custom Views/BTUITextField.m b/Pods/Braintree/Braintree/UI/Views/Custom Views/BTUITextField.m new file mode 100644 index 0000000..0bf8aa6 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Custom Views/BTUITextField.m @@ -0,0 +1,100 @@ +#import "BTUITextField.h" + +@interface BTUITextField () +@property (nonatomic, copy) NSString *previousText; +@end + +@implementation BTUITextField + +- (instancetype)init { + if (self = [super init]) { + if ([UIDevice currentDevice].systemVersion.intValue >= 9) { + [self addTarget:self action:@selector(iOS9AndAbove_changed) forControlEvents:UIControlEventEditingChanged]; + self.delegate = self; + } + } + return self; +} + +- (void)iOS9AndAbove_changed { + // We only want to notify when this text field's text length has increased + if (self.previousText.length >= self.text.length) { + self.previousText = self.text; + return; + } + self.previousText = self.text; + + NSString *insertedText = [self.text substringWithRange:NSMakeRange(self.previousText.length, self.text.length - self.previousText.length)]; + + if ([self.editDelegate respondsToSelector:@selector(textField:willInsertText:)]) { + // Sets _backspace = NO; in the BTUIFormField or BTUIFormField subclass + [self.editDelegate textField:self willInsertText:insertedText]; + } + + self.previousText = self.text; + + if ([self.editDelegate respondsToSelector:@selector(textField:didInsertText:)]) { + [self.editDelegate textField:self didInsertText:insertedText]; + } +} + +- (BOOL)keyboardInputShouldDelete:(__unused UITextField *)textField { + if ([self.editDelegate respondsToSelector:@selector(textFieldWillDeleteBackward:)]) { + [self.editDelegate textFieldWillDeleteBackward:self]; + } + + BOOL shouldDelete = YES; + + if ([UITextField instancesRespondToSelector:_cmd]) { + BOOL (*keyboardInputShouldDelete)(id, SEL, UITextField *) = (BOOL (*)(id, SEL, UITextField *))[UITextField instanceMethodForSelector:_cmd]; + + if (keyboardInputShouldDelete) { + shouldDelete = keyboardInputShouldDelete(self, _cmd, textField); + } + } + + BOOL isIos8 = ([[[UIDevice currentDevice] systemVersion] intValue] == 8); + BOOL isLessThanIos8_3 = ([[[UIDevice currentDevice] systemVersion] floatValue] < 8.3f); + + // iOS 8.0-8.2 has a bug where deleteBackward is not called even when this method returns YES and the character is deleted + // As a result, we do so manually but return NO in order to prevent UITextField from double-calling the delegate method + // (textFieldDidDeleteBackwards:originalText:) + if (isIos8 && isLessThanIos8_3) { + [self deleteBackward]; + shouldDelete = NO; + } + + return shouldDelete; +} + +- (void)deleteBackward +{ + BOOL shouldDismiss = [self.text length] == 0; + NSString *originalText = self.text; + + [super deleteBackward]; + + if (shouldDismiss) { + if ([self.delegate respondsToSelector:@selector(textField:shouldChangeCharactersInRange:replacementString:)]) { + [self.delegate textField:self shouldChangeCharactersInRange:NSMakeRange(0, 0) replacementString:@""]; + } + } + + if ([self.editDelegate respondsToSelector:@selector(textFieldDidDeleteBackward:originalText:)]) { + [self.editDelegate textFieldDidDeleteBackward:self originalText:originalText]; + } +} + +- (void)insertText:(NSString *)text { + if ([self.editDelegate respondsToSelector:@selector(textField:willInsertText:)]) { + [self.editDelegate textField:self willInsertText:text]; + } + + [super insertText:text]; + + if ([self.editDelegate respondsToSelector:@selector(textField:didInsertText:)]) { + [self.editDelegate textField:self didInsertText:text]; + } +} + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Custom Views/BTUIThemedView.h b/Pods/Braintree/Braintree/UI/Views/Custom Views/BTUIThemedView.h new file mode 100644 index 0000000..9498186 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Custom Views/BTUIThemedView.h @@ -0,0 +1,6 @@ +#import +#import "BTUI.h" + +@interface BTUIThemedView : UIView +@property (nonatomic, strong) BTUI *theme; +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Custom Views/BTUIThemedView.m b/Pods/Braintree/Braintree/UI/Views/Custom Views/BTUIThemedView.m new file mode 100644 index 0000000..dd9a343 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Custom Views/BTUIThemedView.m @@ -0,0 +1,30 @@ +#import "BTUIThemedView.h" + +@implementation BTUIThemedView + +- (id)init { + self = [super init]; + if (self) { + _theme = [BTUI braintreeTheme]; + } + return self; +} + +- (id)initWithFrame:(CGRect)frame +{ + self = [super initWithFrame:frame]; + if (self) { + _theme = [BTUI braintreeTheme]; + } + return self; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder { + self = [super initWithCoder:aDecoder]; + if (self) { + _theme = [BTUI braintreeTheme]; + } + return self; +} + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Custom Views/BTUIVectorArtView.h b/Pods/Braintree/Braintree/UI/Views/Custom Views/BTUIVectorArtView.h new file mode 100644 index 0000000..41eda48 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Custom Views/BTUIVectorArtView.h @@ -0,0 +1,18 @@ +#import + +/// Subclassed to easily draw vector art into a scaled UIView. +/// Useful for using generated UIBezierPath code from +/// [PaintCode](http://www.paintcodeapp.com/) verbatim. +@interface BTUIVectorArtView : UIView + +/// Subclass and implement this method to draw within a context pre-scaled to the +/// view's size. +- (void)drawArt; + +/// This property informs the BTVectorArtView drawRect method of the dimensions +/// of the artwork. +@property (nonatomic, assign) CGSize artDimensions; + +- (UIImage *)imageOfSize:(CGSize)size; + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Custom Views/BTUIVectorArtView.m b/Pods/Braintree/Braintree/UI/Views/Custom Views/BTUIVectorArtView.m new file mode 100644 index 0000000..01d0949 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Custom Views/BTUIVectorArtView.m @@ -0,0 +1,32 @@ +#import "BTUIVectorArtView.h" +@import QuartzCore; + +@implementation BTUIVectorArtView + +- (void)drawRect:(CGRect)rect +{ + CGContextRef ctx = UIGraphicsGetCurrentContext(); + CGContextSaveGState(ctx); + CGFloat scaleFactor = MIN(rect.size.width/self.artDimensions.width, rect.size.height/self.artDimensions.height); + CGContextScaleCTM(ctx, scaleFactor, scaleFactor); + CGContextTranslateCTM(ctx, rect.origin.x, rect.origin.y); + + [self drawArt]; + + CGContextRestoreGState(ctx); +} + +- (void)drawArt { + // Subclass overrides this +} + + +- (UIImage *)imageOfSize:(CGSize)size { + UIGraphicsBeginImageContextWithOptions(size, NO, 0); + [self drawRect:CGRectMake(0, 0, size.width, size.height)]; + UIImage *img = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + return img; +} + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Form Fields/BTUICardCvvField.h b/Pods/Braintree/Braintree/UI/Views/Form Fields/BTUICardCvvField.h new file mode 100644 index 0000000..f840642 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Form Fields/BTUICardCvvField.h @@ -0,0 +1,10 @@ +#import "BTUIFormField.h" +#import "BTUICardType.h" + +@interface BTUICardCvvField : BTUIFormField + +@property (nonatomic, strong) BTUICardType *cardType; + +@property (nonatomic, copy) NSString *cvv; + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Form Fields/BTUICardCvvField.m b/Pods/Braintree/Braintree/UI/Views/Form Fields/BTUICardCvvField.m new file mode 100644 index 0000000..75ab63e --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Form Fields/BTUICardCvvField.m @@ -0,0 +1,94 @@ +#import "BTUICardCvvField.h" +#import "BTUIFormField_Protected.h" +#import "BTUICardHint.h" +#import "BTUIUtil.h" +#import "BTUIViewUtil.h" +#import "BTUILocalizedString.h" + +#define kMinimumCvvLength 3 +#define kMaximumCvvLength 4 + +@interface BTUICardCvvField () +@property (nonatomic, readonly) NSUInteger validLength; +@property (nonatomic, strong) BTUICardHint *hint; +@end + +@implementation BTUICardCvvField + +- (instancetype)initWithFrame:(CGRect)frame { + self = [super initWithFrame:frame]; + if (self) { + [self setThemedPlaceholder:BTUILocalizedString(CVV_FIELD_PLACEHOLDER)]; + self.textField.accessibilityLabel = BTUILocalizedString(CVV_FIELD_PLACEHOLDER); + self.textField.keyboardType = UIKeyboardTypeNumberPad; + self.textField.delegate = self; + + self.hint = [BTUICardHint new]; + self.hint.displayMode = BTCardHintDisplayModeCVVHint; + self.accessoryView = self.hint; + self.accessoryView.translatesAutoresizingMaskIntoConstraints = NO; + [self addSubview:self.accessoryView]; + } + return self; +} + +- (void)setCardType:(BTUICardType *)cardType { + _cardType = cardType; + self.displayAsValid = [self.textField isFirstResponder] || self.textField.text.length == 0 || self.valid; + [self.hint setCardType:[BTUIViewUtil paymentMethodTypeForCardType:cardType] animated:YES]; + [self updateAppearance]; +} + +- (BOOL)valid { + BOOL noCardTypeOKLength = (self.cardType == nil && self.cvv.length <= kMaximumCvvLength && self.cvv.length >= kMinimumCvvLength); + BOOL validLengthForCardType = (self.cardType != nil && self.cvv.length == self.cardType.validCvvLength); + return noCardTypeOKLength || validLengthForCardType; +} + + +- (BOOL)entryComplete { + NSUInteger index = [self.textField offsetFromPosition:self.textField.beginningOfDocument toPosition:self.textField.selectedTextRange.start]; + BOOL cursorAtEnd = (index == self.textField.text.length); + + if (self.cardType == nil) { + return cursorAtEnd && self.cvv.length == kMaximumCvvLength; + } else { + return self.valid; + } +} + +- (BOOL)textField:(__unused UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { + return string.length + range.location <= self.validLength; +} + +- (NSUInteger)validLength { + return self.cardType == nil ? kMaximumCvvLength : self.cardType.validCvvLength; +} + +- (void)setCvv:(NSString *)cvv { + _cvv = cvv; + self.text = cvv; +} + +#pragma mark - Handlers + +- (void)fieldContentDidChange { + self.displayAsValid = YES; + _cvv = [BTUIUtil stripNonDigits:self.textField.text]; + [self.delegate formFieldDidChange:self]; +} + +- (void)textFieldDidBeginEditing:(UITextField *)textField { + [super textFieldDidBeginEditing:textField]; + self.displayAsValid = YES; + [self.hint setHighlighted:YES animated:YES]; +} + +- (void)textFieldDidEndEditing:(UITextField *)textField { + [super textFieldDidEndEditing:textField]; + self.displayAsValid = self.textField.text.length == 0 || self.valid; + [self.hint setHighlighted:NO animated:YES]; +} + + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Form Fields/BTUICardExpiryField.h b/Pods/Braintree/Braintree/UI/Views/Form Fields/BTUICardExpiryField.h new file mode 100644 index 0000000..8239139 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Form Fields/BTUICardExpiryField.h @@ -0,0 +1,12 @@ +#import "BTUIFormField.h" + +@interface BTUICardExpiryField : BTUIFormField + +@property (nonatomic, strong, readonly) NSString *expirationMonth; +@property (nonatomic, strong, readonly) NSString *expirationYear; + +/// The expiration date in MMYYYY format. +@property (nonatomic, copy) NSString *expirationDate; + +@end + diff --git a/Pods/Braintree/Braintree/UI/Views/Form Fields/BTUICardExpiryField.m b/Pods/Braintree/Braintree/UI/Views/Form Fields/BTUICardExpiryField.m new file mode 100644 index 0000000..74831cb --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Form Fields/BTUICardExpiryField.m @@ -0,0 +1,188 @@ +#import "BTUICardExpiryField.h" +#import "BTUIFormField_Protected.h" +#import "BTUIUtil.h" +#import "BTUICardExpirationValidator.h" +#import "BTUICardExpiryFormat.h" +#import "BTUILocalizedString.h" + +#define BTUICardExpiryFieldYYYYPrefix @"20" +#define BTUICardExpiryFieldComponentSeparator @"/" + +#define BTUICardExpiryPlaceholderFourDigitYear BTUILocalizedString(EXPIRY_PLACEHOLDER_FOUR_DIGIT_YEAR) +#define BTUICardExpiryPlaceholderTwoDigitYear BTUILocalizedString(EXPIRY_PLACEHOLDER_TWO_DIGIT_YEAR) + +@interface BTUICardExpiryField () +@end + +@implementation BTUICardExpiryField + +- (instancetype)initWithFrame:(CGRect)frame { + self = [super initWithFrame:frame]; + if (self) { + [self updatePlaceholder]; + self.textField.keyboardType = UIKeyboardTypeNumberPad; + self.textField.delegate = self; + } + return self; +} + +- (BOOL)valid { + if (!self.expirationYear || !self.expirationMonth) { + return NO; + } + return [BTUICardExpirationValidator month:self.expirationMonth.intValue year:self.expirationYear.intValue validForDate:[NSDate date]]; +} + +- (void)setExpirationDate:(NSString *)expirationDate { + [self setText:expirationDate]; + } + +- (NSString *)expirationDate { + if (!self.expirationMonth || !self.expirationYear) return nil; + + return [NSString stringWithFormat:@"%@%@", self.expirationMonth, self.expirationYear]; +} + +#pragma mark - Handlers + +- (void)fieldContentDidChange { + _expirationMonth = nil; + _expirationYear = nil; + + NSString *formattedValue; + NSUInteger formattedCursorLocation; + + BTUICardExpiryFormat *format = [[BTUICardExpiryFormat alloc] init]; + format.value = self.textField.text; + format.cursorLocation = [self.textField offsetFromPosition:self.textField.beginningOfDocument toPosition:self.textField.selectedTextRange.start]; + format.backspace = self.backspace; + [format formattedValue:&formattedValue cursorLocation:&formattedCursorLocation]; + + // Important: Reset the state of self.backspace. + // Otherwise, the user won't be able to do the following: + // Enter "11/16", then backspace to + // "1", and then type e.g. "2". Instead of showing: + // "12/" (as it should), the form would instead remain stuck at + // "1". + self.backspace = NO; + // This is because UIControlEventEditingChanged is *not* sent after the "/" is removed. + // We can't trigger UIControlEventEditingChanged here (after removing a "/") because that would cause an infinite loop. + + NSMutableAttributedString *result = [[NSMutableAttributedString alloc] initWithString:formattedValue attributes:self.theme.textFieldTextAttributes]; + [self kernExpiration:result]; + self.textField.attributedText = result; + + UITextPosition *newPosition = [self.textField positionFromPosition:self.textField.beginningOfDocument offset:formattedCursorLocation]; + UITextRange *newRange = [self.textField textRangeFromPosition:newPosition toPosition:newPosition]; + self.textField.selectedTextRange = newRange; + + NSArray *expirationComponents = [self expirationComponents:self.textField.text]; + if(expirationComponents.count == 2 && (self.textField.text.length == 5 || self.textField.text.length == 7)) { + _expirationMonth = expirationComponents[0]; + _expirationYear = expirationComponents[1]; + } + + [self updatePlaceholder]; + + self.displayAsValid = ((self.textField.text.length != 5 && self.textField.text.length != 7) || self.valid); + + [self.delegate formFieldDidChange:self]; +} + +- (void)textFieldDidBeginEditing:(UITextField *)textField { + [super textFieldDidBeginEditing:textField]; + self.displayAsValid = YES; +} + +- (void)textFieldDidEndEditing:(UITextField *)textField { + [super textFieldDidEndEditing:textField]; + self.displayAsValid = self.textField.text.length == 0 || self.valid; +} + +- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)newText { + NSString *numericNewText = [BTUIUtil stripNonDigits:newText]; + if (![numericNewText isEqualToString:newText]) { + return NO; + } + NSString *updatedText = [textField.text stringByReplacingCharactersInRange:range withString:numericNewText]; + + return [self dateIsValid:updatedText]; +} + +- (BOOL)entryComplete { + return [super entryComplete] && ![self.expirationYear isEqualToString:BTUICardExpiryFieldYYYYPrefix]; +} + +#pragma mark Helper + +- (void)updatePlaceholder { + NSString *placeholder = [self dateCouldEndWithFourDigitYear:self.textField.text] ? BTUILocalizedString(EXPIRY_PLACEHOLDER_FOUR_DIGIT_YEAR) : BTUILocalizedString(EXPIRY_PLACEHOLDER_TWO_DIGIT_YEAR); + [self setThemedPlaceholder:placeholder]; + self.textField.accessibilityLabel = placeholder; +} + +- (void)setThemedPlaceholder:(NSString *)placeholder { + NSMutableAttributedString *attributedPlaceholder = [[NSMutableAttributedString alloc] initWithString:placeholder ?: @"" + attributes:self.theme.textFieldPlaceholderAttributes]; + [self kernExpiration:attributedPlaceholder]; + [self setThemedAttributedPlaceholder:attributedPlaceholder]; +} + +- (BOOL)dateCouldEndWithFourDigitYear:(NSString *)expirationDate { + NSArray *expirationComponents = [self expirationComponents:expirationDate]; + NSString *yearComponent = [expirationComponents count] >= 2 ? expirationComponents[1] : nil; + return (yearComponent && yearComponent.length >= 2 && [[yearComponent substringToIndex:2] isEqualToString:BTUICardExpiryFieldYYYYPrefix]); +} + +- (NSArray *)expirationComponents:(NSString *)expirationDate { + return [expirationDate componentsSeparatedByString:BTUICardExpiryFieldComponentSeparator]; +} + +- (void)kernExpiration:(NSMutableAttributedString *)input { + [input removeAttribute:NSKernAttributeName range:NSMakeRange(0, input.length)]; + + [input beginEditing]; + if (input.length > 2) { + [input addAttribute:NSKernAttributeName value:@(self.theme.formattedEntryKerning/2) range:NSMakeRange(1, 1)]; + if (input.length > 3) { + [input addAttribute:NSKernAttributeName value:@(self.theme.formattedEntryKerning/2) range:NSMakeRange(2, 1)]; + } + } + [input endEditing]; +} + +// Returns YES if date is either a valid date or can have digits appended to make one. It does not contain any expiration +// date validation. +- (BOOL)dateIsValid:(NSString *)date { + NSArray *dateComponents = [date componentsSeparatedByString:BTUICardExpiryFieldComponentSeparator]; + + NSString *yearComponent; + if (dateComponents.count >= 2) { + yearComponent = dateComponents[1]; + } else { + yearComponent = date.length >= 4 ? [date substringWithRange:NSMakeRange(2, date.length - 2)] : nil; + } + + BOOL couldEndWithFourDigitYear = yearComponent && yearComponent.length >= 2 && [[yearComponent substringToIndex:2] isEqualToString:BTUICardExpiryFieldYYYYPrefix]; + if (couldEndWithFourDigitYear ? date.length > 7 : date.length > 5) { + return NO; + } + + NSString *updatedNumberText = [BTUIUtil stripNonDigits:date]; + + NSString *monthStr = [updatedNumberText substringToIndex:MIN((NSUInteger)2, updatedNumberText.length)]; + if (monthStr.length > 0) { + NSInteger month = [monthStr integerValue]; + if(month < 0 || 12 < month) { + return NO; + } + if(monthStr.length >= 2 && month == 0) { + return NO; + } + } + + return YES; +} + + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Form Fields/BTUICardNumberField.h b/Pods/Braintree/Braintree/UI/Views/Form Fields/BTUICardNumberField.h new file mode 100644 index 0000000..1c156bd --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Form Fields/BTUICardNumberField.h @@ -0,0 +1,9 @@ +#import "BTUIFormField.h" +#import "BTUICardType.h" + +@interface BTUICardNumberField : BTUIFormField + +@property (nonatomic, strong, readonly) BTUICardType *cardType; +@property (nonatomic, strong) NSString *number; + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Form Fields/BTUICardNumberField.m b/Pods/Braintree/Braintree/UI/Views/Form Fields/BTUICardNumberField.m new file mode 100644 index 0000000..b4c2e85 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Form Fields/BTUICardNumberField.m @@ -0,0 +1,105 @@ +#import "BTUICardNumberField.h" +#import "BTUIFormField_Protected.h" +#import "BTUIUtil.h" +#import "BTUICardHint.h" +#import "BTUIViewUtil.h" +#import "BTUILocalizedString.h" + +@implementation BTUICardNumberField + +@synthesize number = _number; + +- (instancetype)initWithFrame:(CGRect)frame { + self = [super initWithFrame:frame]; + if (self) { + [self setThemedPlaceholder:BTUILocalizedString(CARD_NUMBER_PLACEHOLDER)]; + self.textField.accessibilityLabel = BTUILocalizedString(CARD_NUMBER_PLACEHOLDER); + self.textField.keyboardType = UIKeyboardTypeNumberPad; + _number = @""; + + BTUICardHint *hint = [BTUICardHint new]; + [hint setCardType:BTUIPaymentMethodTypeUnknown]; + self.accessoryView = hint; + self.accessoryView.translatesAutoresizingMaskIntoConstraints = NO; + [self addSubview:self.accessoryView]; + } + return self; +} + +- (BOOL)valid { + return [self.cardType validNumber:self.number]; +} + +- (BOOL)entryComplete { + return [super entryComplete] && [self.cardType validAndNecessarilyCompleteNumber:self.number]; +} + +- (void)setNumber:(NSString *)number { + self.text = number; + _number = self.textField.text; +} + +- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { + NSUInteger newLength = textField.text.length - range.length + string.length; + NSUInteger maxLength = self.cardType == nil ? [BTUICardType maxNumberLength] : self.cardType.maxNumberLength; + return newLength <= maxLength; +} + +- (void)fieldContentDidChange { + _number = [BTUIUtil stripNonDigits:self.textField.text]; + BTUICardType *oldCardType = _cardType; + _cardType = [BTUICardType cardTypeForNumber:_number]; + if (self.cardType != nil) { + UITextRange *r = self.textField.selectedTextRange; + NSMutableAttributedString *text = [[NSMutableAttributedString alloc] initWithAttributedString:[self.cardType formatNumber:_number kerning:self.theme.formattedEntryKerning]]; + [text addAttributes:self.theme.textFieldTextAttributes range:NSMakeRange(0, text.length)]; + self.textField.attributedText = text; + self.textField.selectedTextRange = r; + } + if (self.cardType != oldCardType) { + [self updateCardHint]; + } + + self.displayAsValid = self.valid || (!self.isValidLength && self.isPotentiallyValid); + + [self updateAppearance]; + [self setNeedsDisplay]; + + [self.delegate formFieldDidChange:self]; +} + +- (void)textFieldDidBeginEditing:(UITextField *)textField { + [super textFieldDidBeginEditing:textField]; + self.displayAsValid = self.valid || (!self.isValidLength && self.isPotentiallyValid); + [self updateAppearance]; +} + +- (void)textFieldDidEndEditing:(UITextField *)textField { + [super textFieldDidEndEditing:textField]; + self.displayAsValid = _number.length == 0 || (_cardType != nil && [_cardType validNumber:_number]); + [self updateAppearance]; +} + +#pragma mark - Private Helpers + +- (BOOL)isValidCardType { + return self.cardType != nil || _number.length == 0; +} + +- (BOOL)isPotentiallyValid { + return [BTUICardType possibleCardTypesForNumber:self.number].count > 0; +} + +- (BOOL)isValidLength { + return self.cardType != nil && [self.cardType completeNumber:_number]; +} + +- (void)updateCardHint { + BTUIPaymentMethodType paymentMethodType = [BTUIViewUtil paymentMethodTypeForCardType:self.cardType]; + BTUICardHint *hint =(BTUICardHint *)self.accessoryView; + [hint setCardType:paymentMethodType animated:YES]; +} + + + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Form Fields/BTUICardPostalCodeField.h b/Pods/Braintree/Braintree/UI/Views/Form Fields/BTUICardPostalCodeField.h new file mode 100644 index 0000000..6f02d9c --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Form Fields/BTUICardPostalCodeField.h @@ -0,0 +1,8 @@ +#import "BTUIFormField.h" + +@interface BTUICardPostalCodeField : BTUIFormField + +@property (nonatomic, strong) NSString *postalCode; +@property (nonatomic, assign) BOOL nonDigitsSupported; + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Form Fields/BTUICardPostalCodeField.m b/Pods/Braintree/Braintree/UI/Views/Form Fields/BTUICardPostalCodeField.m new file mode 100644 index 0000000..e8104e9 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Form Fields/BTUICardPostalCodeField.m @@ -0,0 +1,64 @@ +#import "BTUICardPostalCodeField.h" +#import "BTUIFormField_Protected.h" +#import "BTUILocalizedString.h" +#import "BTUIUtil.h" + +@implementation BTUICardPostalCodeField + +- (instancetype)initWithFrame:(CGRect)frame { + self = [super initWithFrame:frame]; + if (self) { + [self setThemedPlaceholder:BTUILocalizedString(POSTAL_CODE_PLACEHOLDER)]; + self.textField.accessibilityLabel = BTUILocalizedString(POSTAL_CODE_PLACEHOLDER); + self.nonDigitsSupported = NO; + self.textField.autocorrectionType = UITextAutocorrectionTypeNo; + self.textField.autocapitalizationType = UITextAutocapitalizationTypeAllCharacters; + self.textField.returnKeyType = UIReturnKeyDone; + } + return self; +} + +- (void)setPostalCode:(NSString *)postalCode { + if (!self.nonDigitsSupported) { + NSString *numericPostalCode = [BTUIUtil stripNonDigits:postalCode]; + if (![numericPostalCode isEqualToString:postalCode]) return; + } + _postalCode = postalCode; + self.text = postalCode; +} + +- (void)setNonDigitsSupported:(BOOL)nonDigitsSupported { + _nonDigitsSupported = nonDigitsSupported; + self.textField.autocorrectionType = UITextAutocorrectionTypeNo; + self.textField.autocapitalizationType = UITextAutocapitalizationTypeAllCharacters; + self.textField.keyboardType = _nonDigitsSupported ? UIKeyboardTypeNumbersAndPunctuation : UIKeyboardTypeNumberPad; +} + +- (BOOL)entryComplete { + // Never allow auto-advancing out of postal code field since there is no way to know that the + // input value constitutes a complete postal code. + return NO; +} + +- (BOOL)valid { + return self.postalCode.length > 0; +} + +- (void)fieldContentDidChange { + _postalCode = [self.textField.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; + self.displayAsValid = YES; + [super fieldContentDidChange]; + [self.delegate formFieldDidChange:self]; +} + +- (void)textFieldDidBeginEditing:(UITextField *)textField { + self.displayAsValid = YES; + [super textFieldDidBeginEditing:textField]; +} + +- (void)textFieldDidEndEditing:(UITextField *)textField { + self.displayAsValid = YES; + [super textFieldDidEndEditing:textField]; +} + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Forms/BTUICardFormView.h b/Pods/Braintree/Braintree/UI/Views/Forms/BTUICardFormView.h new file mode 100644 index 0000000..f9adc40 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Forms/BTUICardFormView.h @@ -0,0 +1,87 @@ +#import "BTUIThemedView.h" + +typedef NS_OPTIONS(NSUInteger, BTUICardFormOptionalFields) { + BTUICardFormOptionalFieldsNone = 0, + BTUICardFormOptionalFieldsCvv = 1 << 0, + BTUICardFormOptionalFieldsPostalCode = 1 << 1, + BTUICardFormOptionalFieldsAll = BTUICardFormOptionalFieldsCvv | BTUICardFormOptionalFieldsPostalCode +}; + +typedef NS_ENUM(NSUInteger, BTUICardFormField) { + BTUICardFormFieldNumber = 0, + BTUICardFormFieldExpiration, + BTUICardFormFieldCvv, + BTUICardFormFieldPostalCode +}; + +@protocol BTUICardFormViewDelegate; + +@interface BTUICardFormView : BTUIThemedView + +@property (nonatomic, weak) IBOutlet id delegate; + +@property (nonatomic, assign, readonly) BOOL valid; + +/// The card number. +/// +/// If you set a card number longer than is allowed by the card type, +/// it will not be set. +@property (nonatomic, copy) NSString *number; + +/// The card CVV +/// +/// @note this field is only visible when specified in `optionalFields` +@property (nonatomic, copy) NSString *cvv; + +/// The card billing address postal code for AVS verifications +/// +/// @note this field is only visible when specified in `optionalFields` +@property (nonatomic, copy) NSString *postalCode; + +@property (nonatomic, copy, readonly) NSString *expirationMonth; +@property (nonatomic, copy, readonly) NSString *expirationYear; + +/// Sets the card form view's expiration date +/// +/// @param expirationDate The expiration date. Passing in `nil` will clear the +/// card form's expiry field. +- (void)setExpirationDate:(NSDate *)expirationDate; + +/// Immediately present a top level error message to the user. +/// +/// @param message An error message. +- (void)showTopLevelError:(NSString *)message; + +/// Immediately present a field-level error to the user. +/// +/// @note We do not support field-level error descriptions. This method highlights the field to indicate invalidity. +/// @param field The invalid field +- (void)showErrorForField:(BTUICardFormField)field; + +/// Configure whether to support complete alphanumeric postal codes. +/// +/// If NO, allows only digit entry. +/// +/// Defaults to YES +@property (nonatomic, assign) BOOL alphaNumericPostalCode; + +/// Which fields should be included. +/// +/// Defaults to BTUICardFormOptionalFieldsAll +@property (nonatomic, assign) BTUICardFormOptionalFields optionalFields; + +/// Whether to provide feedback to the user via vibration +/// +/// Defaults to YES +@property (nonatomic, assign) BOOL vibrate; + + +@end + +/// Delegate protocol for receiving updates about the card form +@protocol BTUICardFormViewDelegate + +/// The card form data has updated. +- (void)cardFormViewDidChange:(BTUICardFormView *)cardFormView; + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Forms/BTUICardFormView.m b/Pods/Braintree/Braintree/UI/Views/Forms/BTUICardFormView.m new file mode 100644 index 0000000..b42ccd7 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Forms/BTUICardFormView.m @@ -0,0 +1,317 @@ +#import "BTUICardFormView.h" +#import "BTUICardNumberField.h" +#import "BTUICardExpiryField.h" +#import "BTUICardCvvField.h" +#import "BTUICardPostalCodeField.h" +#import "BTUI.h" +#import "BTUILocalizedString.h" +#import "BTUIUtil.h" + +@interface BTUICardFormView () + +@property (nonatomic, strong) BTUICardNumberField *numberField; +@property (nonatomic, strong) BTUICardExpiryField *expiryField; +@property (nonatomic, strong) BTUICardCvvField *cvvField; +@property (nonatomic, strong) BTUICardPostalCodeField *postalCodeField; + +@property (nonatomic, strong) NSArray *fields; +@property (nonatomic, strong) NSArray *dynamicConstraints; + +@end + +@implementation BTUICardFormView + +- (instancetype)initWithFrame:(CGRect)frame { + self = [super initWithFrame:frame]; + if (self) { + [self setup]; + } + return self; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder { + self = [super initWithCoder:aDecoder]; + if (self) { + [self setup]; + } + return self; +} + +- (CGSize)intrinsicContentSize { + CGFloat height = 0; + for (BTUIFormField *field in self.fields) { + height += field.intrinsicContentSize.height; + } + // subtract (number of field adjacencies) * (number of pixels overlap per adjacency) + height -= (self.fields.count - 1) * 1; + + return CGSizeMake(UIViewNoIntrinsicMetric, height); +} + +#pragma mark - Getters/setters + +- (void)showErrorForField:(__unused BTUICardFormField)field { + switch (field) { + case BTUICardFormFieldNumber: + self.numberField.displayAsValid = NO; + break; + case BTUICardFormFieldExpiration: + self.expiryField.displayAsValid = NO; + break; + case BTUICardFormFieldCvv: + self.cvvField.displayAsValid = NO; + break; + case BTUICardFormFieldPostalCode: + self.postalCodeField.displayAsValid = NO; + break; + } +} + +- (void)showTopLevelError:(NSString *)message { + NSString *localizedOK = BTUILocalizedString(TOP_LEVEL_ERROR_ALERT_VIEW_OK_BUTTON_TEXT); + if ([UIAlertController class]) { + UIAlertController *alert = [UIAlertController alertControllerWithTitle:message message:nil preferredStyle:UIAlertControllerStyleAlert]; + [alert addAction:[UIAlertAction actionWithTitle:localizedOK style:UIAlertActionStyleCancel handler:nil]]; + UIViewController *visibleViewController = [[UIApplication sharedApplication].delegate.window.rootViewController BTUI_visibleViewController]; + [visibleViewController presentViewController:alert animated:YES completion:nil]; + } else { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + [[[UIAlertView alloc] initWithTitle:message + message:nil + delegate:nil + cancelButtonTitle:localizedOK + otherButtonTitles:nil] show]; +#pragma clang diagnostic pop + } +} + +- (void)setAlphaNumericPostalCode:(BOOL)alphaNumericPostalCode { + _alphaNumericPostalCode = alphaNumericPostalCode; + self.postalCodeField.nonDigitsSupported = alphaNumericPostalCode; +} + +- (void)setOptionalFields:(BTUICardFormOptionalFields)optionalFields { + _optionalFields = optionalFields; + NSMutableArray *fields = [NSMutableArray arrayWithObjects:self.numberField, self.expiryField, nil]; + + self.cvvField.hidden = self.postalCodeField.hidden = YES; + if (optionalFields & BTUICardFormOptionalFieldsCvv) { + [fields addObject:self.cvvField]; + self.cvvField.hidden = NO; + } + if (optionalFields & BTUICardFormOptionalFieldsPostalCode) { + [fields addObject:self.postalCodeField]; + self.postalCodeField.hidden = NO; + } + + // Set bottom border for fields + for (NSUInteger i = 0; i < fields.count - 1; i++) { + [fields[i] setBottomBorder:YES]; + } + [[fields lastObject] setBottomBorder:NO]; + + self.fields = fields; + + [self invalidateIntrinsicContentSize]; +} + +- (void)setExpirationDate:(NSDate *)expirationDate { + static NSDateFormatter *dateFormatter; + if (!dateFormatter) { + dateFormatter = [[NSDateFormatter alloc] init]; + // The expiry field only allows digit chars to be entered + dateFormatter.dateFormat = @"MMyyyy"; + } + + NSString *expirationDateString = [dateFormatter stringFromDate:expirationDate]; + [self.expiryField setText:expirationDateString]; +} + +- (void)setup { + self.opaque = NO; + self.backgroundColor = [UIColor whiteColor]; + + self.dynamicConstraints = @[]; + + _numberField = [[BTUICardNumberField alloc] init]; + self.numberField.translatesAutoresizingMaskIntoConstraints = NO; + self.numberField.delegate = self; + [self addSubview:self.numberField]; + + _expiryField = [[BTUICardExpiryField alloc] init]; + self.expiryField.translatesAutoresizingMaskIntoConstraints = NO; + self.expiryField.delegate = self; + [self addSubview:self.expiryField]; + + _cvvField = [[BTUICardCvvField alloc] init]; + self.cvvField.translatesAutoresizingMaskIntoConstraints = NO; + self.cvvField.delegate = self; + [self addSubview:self.cvvField]; + + _postalCodeField = [[BTUICardPostalCodeField alloc] init]; + self.postalCodeField.translatesAutoresizingMaskIntoConstraints = NO; + self.postalCodeField.delegate = self; + [self addSubview:self.postalCodeField]; + [self setAlphaNumericPostalCode:YES]; + + self.vibrate = YES; + self.optionalFields = BTUICardFormOptionalFieldsAll; + + for (UIView *v in self.fields) { + [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[v]|" options:0 metrics:@{} views:@{@"v": v}]]; + } + + + [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[v]" + options:0 + metrics:0 + views:@{@"v": self.numberField}]]; + +} + +- (void)updateConstraints { + [self removeConstraints:self.dynamicConstraints]; + + NSMutableArray *newContraints = [NSMutableArray array]; + for (NSUInteger i = 0; i < self.fields.count - 1; i++) { + BTUIFormField *fieldAbove = self.fields[i]; + BTUIFormField *fieldBelow = self.fields[i+1]; + [newContraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[v]-(-1)-[v2]" + options:0 + metrics:0 + views:@{@"v": fieldAbove, @"v2": fieldBelow }]]; + } + + self.dynamicConstraints = newContraints; + [self addConstraints:self.dynamicConstraints]; + + [super updateConstraints]; + +} + +#pragma mark - Drawing + +- (void)drawRect:(CGRect)rect { + CGContextRef context = UIGraphicsGetCurrentContext(); + [self.theme.borderColor setFill]; + + // Top + CGPathRef path = CGPathCreateWithRect(CGRectMake(rect.origin.x, 0, rect.size.width, 0.5f), NULL); + CGContextAddPath(context, path); + CGPathRelease(path); + + // Bottom + path = CGPathCreateWithRect(CGRectMake(rect.origin.x, CGRectGetMaxY(rect) - 0.5f, rect.size.width, 0.5f), NULL); + CGContextAddPath(context, path); + + CGContextDrawPath(context, kCGPathFill); + CGPathRelease(path); +} + +#pragma mark - Validity + +- (BOOL)valid { + for (BTUIFormField *f in self.fields) { + if (!f.valid) { + return NO; + } + } + return YES; +} + +- (void)setVibrate:(BOOL)vibrate { + _vibrate = vibrate; + for (BTUIFormField *f in self.fields) { + f.vibrateOnInvalidInput = vibrate; + } +} + +#pragma mark - Value getters + +- (NSString *)number { + return self.numberField.number; +} + +- (void)setNumber:(NSString *)number { + self.numberField.number = number; +} + +- (NSString *)expirationMonth { + return self.expiryField.expirationMonth; +} + +- (NSString *)expirationYear { + return self.expiryField.expirationYear; +} + +- (NSString *)cvv { + return self.optionalFields & BTUICardFormOptionalFieldsCvv ? self.cvvField.cvv : nil; +} + +- (void)setCvv:(NSString *)cvv { + self.cvvField.cvv = cvv; +} + +- (NSString *)postalCode { + return self.optionalFields & BTUICardFormOptionalFieldsPostalCode ? self.postalCodeField.postalCode : nil; +} + +- (void)setPostalCode:(NSString *)postalCode { + self.postalCodeField.postalCode = postalCode; +} + +#pragma mark - Field delegate implementations + +- (void)formFieldDidChange:(BTUIFormField *)field { + if (field == self.numberField) { + self.cvvField.cardType = self.numberField.cardType; + } + [self advanceToNextInvalidFieldFrom:field]; + [self.delegate cardFormViewDidChange:self]; +} + +- (void)formFieldDidDeleteWhileEmpty:(BTUIFormField *)formField { + [self switchToPreviousField:formField]; +} + +- (BOOL)formFieldShouldReturn:(BTUIFormField *)formField { + [formField resignFirstResponder]; + return NO; +} + +#pragma mark - Auto-advancing + +- (void)advanceToNextInvalidFieldFrom:(BTUIFormField *)field { + if (field.entryComplete) { + NSUInteger fieldIndex = [self.fields indexOfObject:field]; + NSUInteger startIndex = (fieldIndex + 1) % self.fields.count; + + for (NSUInteger i = startIndex ; i != fieldIndex; i = (i + 1) % self.fields.count) { + BTUIFormField *ithField = self.fields[i]; + if (!ithField.valid) { + [ithField becomeFirstResponder]; + break; + } + } + } +} + +- (void)switchToPreviousField:(BTUIFormField *)field { + NSUInteger fieldIndex = [self.fields indexOfObject:field]; + if (fieldIndex == 0) { + return; + } + NSInteger previousIndex = (fieldIndex - 1); + if (previousIndex < 0) { + return; + } + BTUIFormField *previousField = self.fields[previousIndex]; + [previousField becomeFirstResponder]; + if (previousField.text.length > 0) { + [previousField deleteBackward]; + } +} + + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Payments Components/BTUICTAControl.h b/Pods/Braintree/Braintree/UI/Views/Payments Components/BTUICTAControl.h new file mode 100644 index 0000000..f613d49 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Payments Components/BTUICTAControl.h @@ -0,0 +1,19 @@ +#import +#import "BTUI.h" + +/// The Call To Action control is A button that is intended to be used as the submit button +/// on the bottom of a payment form. As a UIControl subclass, typical target-action event +/// listeners are available. +@interface BTUICTAControl : UIControl + +/// The amount, including a currency symbol, to be displayed. May be nil. +@property (nonatomic, copy) NSString *amount; + +/// The call to action verb, such as "Subscribe" or "Buy". Must be non-nil. +@property (nonatomic, copy) NSString *callToAction; + +- (void)showLoadingState:(BOOL)loadingState; + +@property (nonatomic, strong) BTUI *theme; + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Payments Components/BTUICTAControl.m b/Pods/Braintree/Braintree/UI/Views/Payments Components/BTUICTAControl.m new file mode 100644 index 0000000..c87437b --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Payments Components/BTUICTAControl.m @@ -0,0 +1,151 @@ +#import "BTUICTAControl.h" +#import "BTUI.h" +#import "UIColor+BTUI.h" + +@interface BTUICTAControl() +@property (nonatomic, strong) UILabel *label; +@property (nonatomic, strong) UIActivityIndicatorView *activityIndicator; +@end + +@implementation BTUICTAControl + +- (id)initWithFrame:(CGRect)frame { + self = [super initWithFrame:frame]; + if (self) { + [self setupView]; + } + return self; +} + +- (id)initWithCoder:(NSCoder *)aDecoder { + self = [super initWithCoder:aDecoder]; + if (self) { + [self setupView]; + } + return self; +} + +#pragma mark View Lifecycle + +- (void)setupView { + self.theme = [BTUI braintreeTheme]; + self.backgroundColor = self.tintColor; + + self.label = [[UILabel alloc] init]; + [self.label setTranslatesAutoresizingMaskIntoConstraints:NO]; + + self.label.textColor = [UIColor whiteColor]; + self.label.font = [UIFont systemFontOfSize:17.0f]; + self.label.textAlignment = NSTextAlignmentCenter; + + [self addSubview:self.label]; + + self.activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite]; + self.activityIndicator.translatesAutoresizingMaskIntoConstraints = NO; + [self addSubview:self.activityIndicator]; + + [self addConstraint:[NSLayoutConstraint constraintWithItem:self.activityIndicator attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterX multiplier:1.0f constant:0.0f]]; + [self addConstraint:[NSLayoutConstraint constraintWithItem:self.activityIndicator attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterY multiplier:1.0f constant:0.0f]]; + + self.isAccessibilityElement = YES; + self.accessibilityTraits = UIAccessibilityTraitButton; + + [self updateText]; +} + +- (void)showLoadingState: (__unused BOOL)loadingState{ + if (loadingState) { + self.label.hidden = YES; + [self.activityIndicator startAnimating]; + } else { + self.label.hidden = NO; + [self.activityIndicator stopAnimating]; + } +} + +- (void)updateConstraints { + [self addConstraints:@[[NSLayoutConstraint constraintWithItem:self + attribute:NSLayoutAttributeCenterX + relatedBy:NSLayoutRelationEqual + toItem:self.label + attribute:NSLayoutAttributeCenterX + multiplier:1.0f + constant:0.0f], + + [NSLayoutConstraint constraintWithItem:self + attribute:NSLayoutAttributeCenterY + relatedBy:NSLayoutRelationEqual + toItem:self.label + attribute:NSLayoutAttributeCenterY + multiplier:1.0f + constant:0.0f], + + [NSLayoutConstraint constraintWithItem:self + attribute:NSLayoutAttributeWidth + relatedBy:NSLayoutRelationEqual + toItem:self.label + attribute:NSLayoutAttributeWidth + multiplier:1.0f + constant:0.0f], + + [NSLayoutConstraint constraintWithItem:self + attribute:NSLayoutAttributeHeight + relatedBy:NSLayoutRelationEqual + toItem:self.label + attribute:NSLayoutAttributeHeight + multiplier:1.0f + constant:0.0f], + ]]; + [super updateConstraints]; +} + +#pragma mark Highlight Presentation + +- (void)setHighlighted:(BOOL)highlighted { + [super setHighlighted:highlighted]; + UIColor *newColor = highlighted ? [self.tintColor bt_adjustedBrightness:self.theme.highlightedBrightnessAdjustment] : self.tintColor; + [UIView animateWithDuration:self.theme.quickTransitionDuration animations:^{ + [self setBackgroundColor:newColor]; + }]; +} + +- (void)setEnabled:(BOOL)enabled { + [super setEnabled:enabled]; + UIColor *newColor = enabled ? self.tintColor : self.theme.disabledButtonColor; + [UIView animateWithDuration:self.theme.quickTransitionDuration animations:^{ + [self setBackgroundColor:newColor]; + }]; +} + + +#pragma mark Public Parameters + +- (void)setAmount:(NSString *)amount { + _amount = amount; + [self updateText]; +} + +- (void)setCallToAction:(NSString *)callToAction { + _callToAction = callToAction; + [self updateText]; +} + +#pragma mark State Management + +- (void)updateText { + if (self.amount) { + self.label.text = [NSString stringWithFormat:@"%@ - %@", self.amount, self.callToAction]; + } else { + self.label.text = [NSString stringWithFormat:@"%@", self.callToAction]; + } + self.accessibilityLabel = self.label.text; +} + +#pragma mark - Theme + +- (void)tintColorDidChange { + self.highlighted = self.highlighted; + self.enabled = self.enabled; +} + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Payments Components/BTUICardHint.h b/Pods/Braintree/Braintree/UI/Views/Payments Components/BTUICardHint.h new file mode 100644 index 0000000..2ec7271 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Payments Components/BTUICardHint.h @@ -0,0 +1,37 @@ +#import +#import "BTUIPaymentMethodType.h" +#import "BTUIThemedView.h" + +/// `BTCardHint` has two display modes: one emphasizes the card type, and the second emphasizes the CVV location. +typedef NS_ENUM(NSInteger, BTCardHintDisplayMode) { + /// Emphasize the card's type. + BTCardHintDisplayModeCardType, + /// Emphasize the CVV's location. + BTCardHintDisplayModeCVVHint, +}; + +/// A View that displays a card icon in order to provide users with a hint as to what card type +/// has been detected or where the CVV can be found on that card. +@interface BTUICardHint : BTUIThemedView + +/// The card type to display. +@property (nonatomic, assign) BTUIPaymentMethodType cardType; + +/// Whether to emphasize the card type or the CVV. +@property (nonatomic, assign) BTCardHintDisplayMode displayMode; + +/// Whether it is highlighted with the tint color +@property (nonatomic, assign) BOOL highlighted; + +/// Set highlight with animation +- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated; + +/// Update the current cardType with an optional visual animation +/// @see cardType +- (void)setCardType:(BTUIPaymentMethodType)cardType animated:(BOOL)animated; + +/// Update the current displayMode with an optional visual animation +/// @see displayMode +- (void)setDisplayMode:(BTCardHintDisplayMode)displayMode animated:(BOOL)animated; + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Payments Components/BTUICardHint.m b/Pods/Braintree/Braintree/UI/Views/Payments Components/BTUICardHint.m new file mode 100644 index 0000000..6b706ac --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Payments Components/BTUICardHint.m @@ -0,0 +1,185 @@ +#import "BTUICardHint.h" + +#import "BTUI.h" + +#import "BTUICVVFrontVectorArtView.h" +#import "BTUICVVBackVectorArtView.h" + +@interface BTUICardHint () +@property (nonatomic, strong) UIView *hintVectorArtView; +@property (nonatomic, strong) NSArray *hintVectorArtViewConstraints; +@end + +@implementation BTUICardHint + +- (id)initWithFrame:(CGRect)frame { + self = [super initWithFrame:frame]; + if (self) { + [self setupView]; + } + return self; +} + +- (id)initWithCoder:(NSCoder *)aDecoder { + self = [super initWithCoder:aDecoder]; + if (self) { + [self setupView]; + } + return self; +} + +- (void)setupView { + self.layer.borderColor = self.theme.cardHintBorderColor.CGColor; + self.layer.borderWidth = 1.0f; + self.layer.cornerRadius = 2.0f; + + self.hintVectorArtView = [[BTUI braintreeTheme] vectorArtViewForPaymentMethodType:BTUIPaymentMethodTypeUnknown]; + [self.hintVectorArtView setTranslatesAutoresizingMaskIntoConstraints:NO]; + [self addSubview:self.hintVectorArtView]; + + [self addConstraint:[NSLayoutConstraint constraintWithItem:self + attribute:NSLayoutAttributeWidth + relatedBy:NSLayoutRelationEqual + toItem:self + attribute:NSLayoutAttributeHeight + multiplier:87.0f/55.0f + constant:0.0f]]; + + [self setNeedsLayout]; +} + +- (void)updateConstraints { + if (self.hintVectorArtViewConstraints) { + [self removeConstraints:self.hintVectorArtViewConstraints]; + } + + self.hintVectorArtViewConstraints = @[[NSLayoutConstraint constraintWithItem:self + attribute:NSLayoutAttributeWidth + relatedBy:NSLayoutRelationEqual + toItem:self.hintVectorArtView + attribute:NSLayoutAttributeWidth + multiplier:1.0f + constant:1.0f], + + [NSLayoutConstraint constraintWithItem:self + attribute:NSLayoutAttributeCenterX + relatedBy:NSLayoutRelationEqual + toItem:self.hintVectorArtView + attribute:NSLayoutAttributeCenterX + multiplier:1.0f + constant:0.0f], + + [NSLayoutConstraint constraintWithItem:self + attribute:NSLayoutAttributeCenterY + relatedBy:NSLayoutRelationEqual + toItem:self.hintVectorArtView + attribute:NSLayoutAttributeCenterY + multiplier:1.0f + constant:0.0f] ]; + + [self addConstraints:self.hintVectorArtViewConstraints]; + + [super updateConstraints]; +} + +- (void)updateViews { + UIView *cardVectorArtView; + switch (self.displayMode) { + case BTCardHintDisplayModeCardType: + cardVectorArtView = [[BTUI braintreeTheme] vectorArtViewForPaymentMethodType:self.cardType]; + break; + case BTCardHintDisplayModeCVVHint: + if (self.cardType == BTUIPaymentMethodTypeAMEX) { + cardVectorArtView = [BTUICVVFrontVectorArtView new]; + } else { + cardVectorArtView = [BTUICVVBackVectorArtView new]; + } + break; + } + + [self.hintVectorArtView removeFromSuperview]; + self.hintVectorArtView = cardVectorArtView; + [self.hintVectorArtView setTranslatesAutoresizingMaskIntoConstraints:NO]; + [self addSubview:self.hintVectorArtView]; + [self setHighlighted:self.highlighted]; + + [self setNeedsUpdateConstraints]; + [self setNeedsLayout]; +} + +- (void)setCardType:(BTUIPaymentMethodType)cardType { + _cardType = cardType; + [self updateViews]; +} + +- (void)setCardType:(BTUIPaymentMethodType)cardType animated:(BOOL)animated { + if (cardType == self.cardType) { + return; + } + if (animated) { + [UIView transitionWithView:self + duration:0.2f + options:UIViewAnimationOptionTransitionCrossDissolve + animations:^{ + [self setCardType:cardType]; + } completion:nil]; + } else { + [self setCardType:cardType]; + } +} + +- (void)setDisplayMode:(BTCardHintDisplayMode)displayMode { + _displayMode = displayMode; + [self updateViews]; +} + +- (void)setDisplayMode:(BTCardHintDisplayMode)displayMode animated:(BOOL)animated { + if (animated) { + [UIView transitionWithView:self + duration:0.2f + options:UIViewAnimationOptionTransitionFlipFromLeft + animations:^{ + [self setDisplayMode:displayMode]; + } completion:nil]; + } else { + [self updateViews]; + } +} + +#pragma mark - Highlighting + +- (void)setHighlighted:(BOOL)highlighted { + [self setHighlighted:highlighted animated:NO]; +} + +- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated { + _highlighted = highlighted; + UIColor *c = highlighted ? self.tintColor : nil; + [self setHighlightColor:c animated:animated]; +} + +- (void)setHighlightColor:(UIColor *)color animated:(BOOL)animated { + if (![self.hintVectorArtView respondsToSelector:@selector(setHighlightColor:)]) { + return; + } + if (animated) { + [UIView transitionWithView:self.hintVectorArtView + duration:self.theme.quickTransitionDuration + options:UIViewAnimationOptionTransitionCrossDissolve + animations:^{ + [self.hintVectorArtView performSelector:@selector(setHighlightColor:) withObject:color]; + [self.hintVectorArtView setNeedsDisplay]; + } + completion:nil + ]; + } else { + [self.hintVectorArtView performSelector:@selector(setHighlightColor:) withObject:color]; + [self.hintVectorArtView setNeedsDisplay]; + } +} + +- (void)tintColorDidChange { + [self setHighlighted:self.highlighted animated:YES]; +} + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Payments Components/BTUICoinbaseButton.h b/Pods/Braintree/Braintree/UI/Views/Payments Components/BTUICoinbaseButton.h new file mode 100644 index 0000000..a933787 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Payments Components/BTUICoinbaseButton.h @@ -0,0 +1,9 @@ +#import + +@class BTUI; + +@interface BTUICoinbaseButton : UIControl + +@property (nonatomic, strong) BTUI *theme; + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Payments Components/BTUICoinbaseButton.m b/Pods/Braintree/Braintree/UI/Views/Payments Components/BTUICoinbaseButton.m new file mode 100644 index 0000000..d27a938 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Payments Components/BTUICoinbaseButton.m @@ -0,0 +1,87 @@ +#import "BTUICoinbaseButton.h" + +#import "BTUI.h" +#import "UIColor+BTUI.h" + +#import "BTUICoinbaseWordmarkVectorArtView.h" +#import "BTUILocalizedString.h" + +@interface BTUICoinbaseButton () +@property (nonatomic, strong) BTUICoinbaseWordmarkVectorArtView *coinbaseWordmark; +@end + +@implementation BTUICoinbaseButton + +- (id)initWithFrame:(CGRect)frame +{ + self = [super initWithFrame:frame]; + if (self) { + [self setupView]; + } + return self; +} + +- (id)initWithCoder:(NSCoder *)aDecoder { + self = [super initWithCoder:aDecoder]; + if (self) { + [self setupView]; + } + return self; +} + +- (void)setupView { + self.theme = [BTUI braintreeTheme]; + self.userInteractionEnabled = YES; + self.clipsToBounds = YES; + self.opaque = NO; + self.backgroundColor = [UIColor whiteColor]; + self.accessibilityLabel = [BTUILocalizedString PAYMENT_METHOD_TYPE_COINBASE]; + + self.coinbaseWordmark = [[BTUICoinbaseWordmarkVectorArtView alloc] init]; + self.coinbaseWordmark.userInteractionEnabled = NO; + self.coinbaseWordmark.translatesAutoresizingMaskIntoConstraints = NO; + self.coinbaseWordmark.color = [self.theme coinbasePrimaryBlue]; + + [self addSubview:self.coinbaseWordmark]; +} + +- (void)updateConstraints { + NSDictionary *metrics = @{ @"minHeight": @([self.theme paymentButtonMinHeight]), + @"maxHeight": @([self.theme paymentButtonMaxHeight]), + @"minWidth": @(200), + @"required": @(UILayoutPriorityRequired), + @"high": @(UILayoutPriorityDefaultHigh), + @"breathingRoom": @(10) }; + NSDictionary *views = @{ @"self": self , + @"coinbaseWordmark": self.coinbaseWordmark }; + + [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[coinbaseWordmark]|" + options:0 + metrics:metrics + views:views]]; + + [self addConstraint:[NSLayoutConstraint constraintWithItem:self + attribute:NSLayoutAttributeCenterX + relatedBy:NSLayoutRelationEqual + toItem:self.coinbaseWordmark + attribute:NSLayoutAttributeCenterX + multiplier:1.0f + constant:0.0f]]; + + [super updateConstraints]; +} + +- (void)setHighlighted:(BOOL)highlighted { + [UIView animateWithDuration:0.08f + delay:0.0f + options:UIViewAnimationOptionBeginFromCurrentState animations:^{ + if (highlighted) { + self.backgroundColor = [UIColor colorWithWhite:0.92f alpha:1.0f]; + } else { + self.backgroundColor = [UIColor whiteColor]; + } + } + completion:nil]; +} + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Payments Components/BTUIPayPalButton.h b/Pods/Braintree/Braintree/UI/Views/Payments Components/BTUIPayPalButton.h new file mode 100644 index 0000000..566f0a0 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Payments Components/BTUIPayPalButton.h @@ -0,0 +1,9 @@ +#import + +@class BTUI; + +@interface BTUIPayPalButton : UIControl + +@property (nonatomic, strong) BTUI *theme; + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Payments Components/BTUIPayPalButton.m b/Pods/Braintree/Braintree/UI/Views/Payments Components/BTUIPayPalButton.m new file mode 100644 index 0000000..ec0eb76 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Payments Components/BTUIPayPalButton.m @@ -0,0 +1,87 @@ +#import "BTUIPayPalButton.h" + +#import "BTUIPayPalWordmarkVectorArtView.h" + +#import "BTUI.h" + +@interface BTUIPayPalButton () +@property (nonatomic, strong) BTUIPayPalWordmarkVectorArtView *payPalWordmark; +@end + +@implementation BTUIPayPalButton + +- (id)initWithFrame:(CGRect)frame +{ + self = [super initWithFrame:frame]; + if (self) { + [self setupView]; + } + return self; +} + +- (id)initWithCoder:(NSCoder *)aDecoder { + self = [super initWithCoder:aDecoder]; + if (self) { + [self setupView]; + } + return self; +} + +- (void)setupView { + self.theme = [BTUI braintreeTheme]; + self.userInteractionEnabled = YES; + self.clipsToBounds = YES; + self.opaque = NO; + self.backgroundColor = [UIColor whiteColor]; + + self.payPalWordmark = [[BTUIPayPalWordmarkVectorArtView alloc] initWithPadding]; + self.payPalWordmark.userInteractionEnabled = NO; + self.payPalWordmark.translatesAutoresizingMaskIntoConstraints = NO; + + [self addSubview:self.payPalWordmark]; +} + +- (void)updateConstraints { + NSDictionary *metrics = @{ @"minHeight": @([self.theme paymentButtonMinHeight]), + @"maxHeight": @([self.theme paymentButtonMaxHeight]), + @"minWidth": @(200), + @"required": @(UILayoutPriorityRequired), + @"high": @(UILayoutPriorityDefaultHigh), + @"breathingRoom": @(10) }; + NSDictionary *views = @{ @"self": self , + @"payPalWordmark": self.payPalWordmark }; + + [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[payPalWordmark]|" + options:0 + metrics:metrics + views:views]]; + + [self addConstraint:[NSLayoutConstraint constraintWithItem:self + attribute:NSLayoutAttributeCenterX + relatedBy:NSLayoutRelationEqual + toItem:self.payPalWordmark + attribute:NSLayoutAttributeCenterX + multiplier:1.0f + constant:0.0f]]; + + [super updateConstraints]; +} + +- (CGSize)intrinsicContentSize { + return CGSizeMake(UIViewNoIntrinsicMetric, 44); +} + +- (void)setHighlighted:(BOOL)highlighted { + [UIView animateWithDuration:0.08f + delay:0.0f + options:UIViewAnimationOptionBeginFromCurrentState animations:^{ + if (highlighted) { + self.backgroundColor = [UIColor colorWithWhite:0.92f alpha:1.0f]; + } else { + self.backgroundColor = [UIColor whiteColor]; + } + } + completion:nil]; +} + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Payments Components/BTUIPaymentMethodView.h b/Pods/Braintree/Braintree/UI/Views/Payments Components/BTUIPaymentMethodView.h new file mode 100644 index 0000000..5601e82 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Payments Components/BTUIPaymentMethodView.h @@ -0,0 +1,19 @@ +#import +#import "BTUIPaymentMethodType.h" +#import "BTUIThemedView.h" + +/// A view that indicates the currently selected payment method, be it a credit card or a PayPal account. +@interface BTUIPaymentMethodView : BTUIThemedView + +/// The type of payment method to display. +@property (nonatomic, assign) BTUIPaymentMethodType type; + +/// An optional string description of the payment method. +/// +/// For example, you could say "ending in 02" for a credit card. +@property (nonatomic, copy) NSString *detailDescription; + +/// When true, all content is hidden and a loading spinner is displayed. +@property (nonatomic, assign, getter = isProcessing) BOOL processing; + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Payments Components/BTUIPaymentMethodView.m b/Pods/Braintree/Braintree/UI/Views/Payments Components/BTUIPaymentMethodView.m new file mode 100644 index 0000000..62cee7e --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Payments Components/BTUIPaymentMethodView.m @@ -0,0 +1,232 @@ +#import "BTUIPaymentMethodView.h" +#import "BTUI.h" +#import "BTUICardType.h" +#import "BTUIViewUtil.h" + +#import "BTUIUnknownCardVectorArtView.h" + +typedef NS_ENUM(NSInteger, BTPaymentMethodViewState) { + BTPaymentMethodViewStateNormal, + BTPaymentMethodViewStateProcessing, +}; + +@interface BTUIPaymentMethodView () + +@property (nonatomic, assign) BTPaymentMethodViewState contentState; + +@property (nonatomic, strong) UIView *iconView; +@property (nonatomic, strong) UILabel *typeLabel; +@property (nonatomic, strong) UILabel *detailDescriptionLabel; +@property (nonatomic, strong) UIActivityIndicatorView *activityIndicatorView; + +@property (nonatomic, strong) UIView *topBorder; +@property (nonatomic, strong) UIView *bottomBorder; + +@property (nonatomic, strong) NSArray *centeredLogoConstraints; +@property (nonatomic, strong) NSArray *logoEmailConstraints; + +@end + +@implementation BTUIPaymentMethodView + +- (instancetype)init { + self = [self initWithFrame:CGRectZero]; + return self; +} + +- (instancetype)initWithFrame:(CGRect)frame { + self = [super initWithFrame:frame]; + if (self) { + [self setupViews]; + } + return self; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder { + self = [super initWithCoder:aDecoder]; + if (self) { + [self setupViews]; + } + return self; +} + ++ (BOOL)requiresConstraintBasedLayout { + return YES; +} + +- (void)setupViews { + + self.clipsToBounds = YES; + + self.iconView = [BTUIUnknownCardVectorArtView new]; + [self.iconView setTranslatesAutoresizingMaskIntoConstraints:NO]; + + self.typeLabel = [[UILabel alloc] init]; + [self.typeLabel setTranslatesAutoresizingMaskIntoConstraints:NO]; + self.typeLabel.font = [self.theme controlTitleFont]; + [self.typeLabel setTextColor:[self.theme titleColor]]; + [self.typeLabel setContentCompressionResistancePriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisHorizontal]; + [self.typeLabel setContentHuggingPriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisHorizontal]; + + self.detailDescriptionLabel = [[UILabel alloc] init]; + [self.detailDescriptionLabel setTranslatesAutoresizingMaskIntoConstraints:NO]; + self.detailDescriptionLabel.lineBreakMode = NSLineBreakByTruncatingMiddle; // TODO - use attributed string for line break + self.detailDescriptionLabel.font = [self.theme controlDetailFont]; + [self.detailDescriptionLabel setTextColor:[self.theme detailColor]]; + + // Activity Indicators + self.activityIndicatorView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; + self.activityIndicatorView.hidden = YES; + [self.activityIndicatorView setTranslatesAutoresizingMaskIntoConstraints:NO]; + + self.topBorder = [[UIView alloc] init]; + self.topBorder.backgroundColor = [self.theme borderColor]; + self.topBorder.translatesAutoresizingMaskIntoConstraints = NO; + + self.bottomBorder = [[UIView alloc] init]; + self.bottomBorder.backgroundColor = [self.theme borderColor]; + self.bottomBorder.translatesAutoresizingMaskIntoConstraints = NO; + + [self addSubview:self.iconView]; + [self addSubview:self.typeLabel]; + [self addSubview:self.detailDescriptionLabel]; + [self addSubview:self.activityIndicatorView]; + [self addSubview:self.topBorder]; + [self addSubview:self.bottomBorder]; + + // Setup initial state + self.contentState = BTPaymentMethodViewStateNormal; + + // Setup views based on initial state + [self updateSubviews]; +} + +- (void)updateConstraints { + [self removeConstraints:self.constraints]; + + NSDictionary *views = @{ @"topBorder": self.topBorder, + @"bottomBorder": self.bottomBorder, + @"methodTypeView": self.typeLabel, + @"emailView": self.detailDescriptionLabel, + @"activityIndicatorView": self.activityIndicatorView, + @"iconView": self.iconView }; + NSDictionary *metrics = @{ @"logoWidth": @30, + @"pad": @12, + @"sp": @5, + @"activityIndicatorViewSize": @60, + @"iconViewHeight": @21, + @"borderWidth": @(self.theme.borderWidth * 1) }; + + NSLayoutConstraint *constraint; + + // Minimum height + constraint = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationGreaterThanOrEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0f constant:40.0f]; + constraint.priority = UILayoutPriorityRequired; + [self addConstraint:constraint]; + + // Maximum height + constraint = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationLessThanOrEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0f constant:60.0f]; + constraint.priority = UILayoutPriorityRequired; + [self addConstraint:constraint]; + + // Minimum width + constraint = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationGreaterThanOrEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0f constant:260.0f]; + constraint.priority = UILayoutPriorityRequired; + [self addConstraint:constraint]; + + // Centered activity indicator + [self addConstraint:[NSLayoutConstraint constraintWithItem:self.activityIndicatorView attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterY multiplier:1.0f constant:0.0f]]; + [self addConstraint:[NSLayoutConstraint constraintWithItem:self.activityIndicatorView attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterX multiplier:1.0f constant:0.0f]]; + + [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[activityIndicatorView(==activityIndicatorViewSize)]" options:0 metrics:metrics views:views]]; + [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[activityIndicatorView(==activityIndicatorViewSize)]" options:0 metrics:metrics views:views]]; + + // Full Width Borders + [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[topBorder]|" options:0 metrics:metrics views:views]]; + [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[topBorder(==borderWidth)]" options:0 metrics:metrics views:views]]; + + [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[bottomBorder]|" options:0 metrics:metrics views:views]]; + [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[bottomBorder(==borderWidth)]|" options:0 metrics:metrics views:views]]; + + // Icon & type + [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[iconView(==iconViewHeight)]" + options:0 + metrics:metrics + views:views]]; + [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(pad)-[iconView]-sp-[methodTypeView]" + options:NSLayoutFormatAlignAllCenterY + metrics:metrics + views:views]]; + + [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[methodTypeView]-sp-[emailView]" + options:NSLayoutFormatAlignAllBaseline + metrics:metrics + views:views]]; + [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[emailView]-(pad)-|" + options:NSLayoutFormatAlignAllBaseline + metrics:metrics + views:views]]; + [self addConstraint:[NSLayoutConstraint constraintWithItem:self.iconView attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterY multiplier:1 constant:0.0f]]; + + [super updateConstraints]; +} + +- (void)updateSubviews { + switch (self.contentState) { + case BTPaymentMethodViewStateNormal: + self.typeLabel.text = [BTUIViewUtil nameForPaymentMethodType:self.type]; + + self.detailDescriptionLabel.text = self.detailDescription; + + [self.iconView removeFromSuperview]; + self.iconView = [self.theme vectorArtViewForPaymentMethodType:self.type]; + [self.iconView setTranslatesAutoresizingMaskIntoConstraints:NO]; + [self addSubview:self.iconView]; + + self.backgroundColor = [UIColor whiteColor]; + self.layer.borderColor = [self.theme borderColor].CGColor; + self.iconView.alpha = 1.0f; + self.typeLabel.alpha = 1.0f; + self.detailDescriptionLabel.alpha = 1.0f; + self.activityIndicatorView.alpha = 0.0f; + [self.activityIndicatorView stopAnimating]; + break; + case BTPaymentMethodViewStateProcessing: + self.backgroundColor = [UIColor whiteColor]; + self.layer.borderColor = [self.theme borderColor].CGColor; + self.iconView.alpha = 0.0f; + self.typeLabel.alpha = 0.0f; + self.detailDescriptionLabel.alpha = 0.0f; + self.activityIndicatorView.alpha = 1.0f; + [self.activityIndicatorView startAnimating]; + break; + default: + break; + } + + [self setNeedsUpdateConstraints]; + [self setNeedsLayout]; +} + +#pragma mark - + +- (void)setDetailDescription:(NSString *)paymentMethodDescription { + _detailDescription = paymentMethodDescription; + [self updateSubviews]; +} + +- (void)setType:(BTUIPaymentMethodType)type { + _type = type; + [self updateSubviews]; +} + +- (void)setProcessing:(BOOL)processing { + _processing = processing; + + self.contentState = processing ? BTPaymentMethodViewStateProcessing : BTPaymentMethodViewStateNormal; + [UIView animateWithDuration:0.3f animations:^{ + [self updateSubviews]; + }]; +} + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Payments Components/BTUISummaryView.h b/Pods/Braintree/Braintree/UI/Views/Payments Components/BTUISummaryView.h new file mode 100644 index 0000000..08ce0e2 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Payments Components/BTUISummaryView.h @@ -0,0 +1,17 @@ +#import +#import "BTUIThemedView.h" + +/// Informational view that displays a summary of the shopping cart or other relevant data for +/// checkout experience that user is agreing too. +@interface BTUISummaryView : BTUIThemedView + +/// The text to display as the primary description of the purchase. +@property (nonatomic, copy) NSString *slug; + +/// The text to display as the secondary summary of the purchase. +@property (nonatomic, copy) NSString *summary; + +/// The textual representation of the dollar amount for the purchase including the currency symbol +@property (nonatomic, copy) NSString *amount; + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Payments Components/BTUISummaryView.m b/Pods/Braintree/Braintree/UI/Views/Payments Components/BTUISummaryView.m new file mode 100644 index 0000000..f6a42cb --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Payments Components/BTUISummaryView.m @@ -0,0 +1,130 @@ +#import "BTUISummaryView.h" +#import "BTUI.h" + +@interface BTUISummaryView () +@property (nonatomic, strong) UILabel *slugLabel; +@property (nonatomic, strong) UILabel *summaryLabel; +@property (nonatomic, strong) UILabel *amountLabel; +@end + +@implementation BTUISummaryView + +- (id)initWithFrame:(CGRect)frame { + self = [super initWithFrame:frame]; + if (self) { + [self setupView]; + } + return self; +} + +- (id)initWithCoder:(NSCoder *)aDecoder { + self = [super initWithCoder:aDecoder]; + if (self) { + [self setupView]; + } + return self; +} + +- (void)setupView { + self.backgroundColor = [UIColor whiteColor]; + + // Create subviews + self.slugLabel = [[UILabel alloc] init]; + self.slugLabel.lineBreakMode = NSLineBreakByWordWrapping; + self.slugLabel.numberOfLines = 0; + + self.summaryLabel = [[UILabel alloc] init]; + self.summaryLabel.lineBreakMode = NSLineBreakByWordWrapping; + self.summaryLabel.numberOfLines = 0; + + self.amountLabel = [[UILabel alloc] init]; + [self.amountLabel setContentCompressionResistancePriority:1000 forAxis:UILayoutConstraintAxisHorizontal]; + [self.amountLabel setContentHuggingPriority:1000 forAxis:UILayoutConstraintAxisHorizontal]; + + [self setTheme:self.theme]; + + // Configure subviews + [self.slugLabel setTranslatesAutoresizingMaskIntoConstraints:NO]; + [self.summaryLabel setTranslatesAutoresizingMaskIntoConstraints:NO]; + [self.amountLabel setTranslatesAutoresizingMaskIntoConstraints:NO]; + + // Add subviews + [self addSubview:self.slugLabel]; + [self addSubview:self.summaryLabel]; + [self addSubview:self.amountLabel]; + + // Set content + [self updateText]; +} + +- (void)setTheme:(BTUI *)theme { + [super setTheme:theme]; + self.slugLabel.font = self.theme.controlTitleFont; + self.summaryLabel.font = self.theme.controlFont; + self.amountLabel.font = self.theme.controlTitleFont; +} + +- (void)updateConstraints { + NSDictionary *views = @{@"view": self, + @"slugLabel": self.slugLabel, + @"summaryLabel": self.summaryLabel, + @"amountLabel": self.amountLabel }; + NSDictionary *metrics = @{@"height": @65.0f, + @"topPadding": @10.0f, + @"middlePadding": @2, + @"horizontalMargin": @(self.theme.horizontalMargin)}; + + // View Constraints + [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[view(>=height)]" + options:0 + metrics:metrics + views:views]]; + + // Slug and Amount Label Constraints + [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(horizontalMargin)-[slugLabel]-[amountLabel]-(horizontalMargin)-|" + options:0 + metrics:metrics + views:views]]; + + // Summary Label Constraints + [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(horizontalMargin)-[summaryLabel]-(horizontalMargin)-|" + options:0 + metrics:metrics + views:views]]; + + // Vertical Constraints + [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(topPadding)-[slugLabel]-(middlePadding)-[summaryLabel]-(topPadding)-|" + options:0 + metrics:metrics + views:views]]; + + [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(topPadding)-[amountLabel]" + options:0 + metrics:metrics + views:views]]; + + [super updateConstraints]; +} + +- (void)setSlug:(NSString *)slug { + _slug = slug; + [self updateText]; +} + +- (void)setSummary:(NSString *)summary { + _summary = summary; + [self updateText]; +} + +- (void)setAmount:(NSString *)amount { + _amount = amount; + [self updateText]; +} + +- (void)updateText { + self.slugLabel.text = self.slug; + self.summaryLabel.text = self.summary; + self.amountLabel.text = self.amount; +} + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Payments Components/BTUIVenmoButton.h b/Pods/Braintree/Braintree/UI/Views/Payments Components/BTUIVenmoButton.h new file mode 100644 index 0000000..515bd4b --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Payments Components/BTUIVenmoButton.h @@ -0,0 +1,9 @@ +#import + +@class BTUI; + +@interface BTUIVenmoButton : UIControl + +@property (nonatomic, strong) BTUI *theme; + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Payments Components/BTUIVenmoButton.m b/Pods/Braintree/Braintree/UI/Views/Payments Components/BTUIVenmoButton.m new file mode 100644 index 0000000..5286710 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Payments Components/BTUIVenmoButton.m @@ -0,0 +1,85 @@ +#import "BTUIVenmoButton.h" + +#import "BTUI.h" +#import "UIColor+BTUI.h" + +#import "BTUIVenmoWordmarkVectorArtView.h" + +@interface BTUIVenmoButton () +@property (nonatomic, strong) BTUIVenmoWordmarkVectorArtView *venmoWordmark; +@end + +@implementation BTUIVenmoButton + +- (id)initWithFrame:(CGRect)frame +{ + self = [super initWithFrame:frame]; + if (self) { + [self setupView]; + } + return self; +} + +- (id)initWithCoder:(NSCoder *)aDecoder { + self = [super initWithCoder:aDecoder]; + if (self) { + [self setupView]; + } + return self; +} + +- (void)setupView { + self.theme = [BTUI braintreeTheme]; + self.userInteractionEnabled = YES; + self.clipsToBounds = YES; + self.opaque = NO; + self.backgroundColor = [UIColor whiteColor]; + + self.venmoWordmark = [[BTUIVenmoWordmarkVectorArtView alloc] init]; + self.venmoWordmark.userInteractionEnabled = NO; + self.venmoWordmark.translatesAutoresizingMaskIntoConstraints = NO; + self.venmoWordmark.color = [self.theme venmoPrimaryBlue]; + + [self addSubview:self.venmoWordmark]; +} + +- (void)updateConstraints { + NSDictionary *metrics = @{ @"minHeight": @([self.theme paymentButtonMinHeight]), + @"maxHeight": @([self.theme paymentButtonMaxHeight]), + @"minWidth": @(200), + @"required": @(UILayoutPriorityRequired), + @"high": @(UILayoutPriorityDefaultHigh), + @"breathingRoom": @(10) }; + NSDictionary *views = @{ @"self": self , + @"venmoWordmark": self.venmoWordmark }; + + [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[venmoWordmark]|" + options:0 + metrics:metrics + views:views]]; + + [self addConstraint:[NSLayoutConstraint constraintWithItem:self + attribute:NSLayoutAttributeCenterX + relatedBy:NSLayoutRelationEqual + toItem:self.venmoWordmark + attribute:NSLayoutAttributeCenterX + multiplier:1.0f + constant:0.0f]]; + + [super updateConstraints]; +} + +- (void)setHighlighted:(BOOL)highlighted { + [UIView animateWithDuration:0.08f + delay:0.0f + options:UIViewAnimationOptionBeginFromCurrentState animations:^{ + if (highlighted) { + self.backgroundColor = [UIColor colorWithWhite:0.92f alpha:1.0f]; + } else { + self.backgroundColor = [UIColor whiteColor]; + } + } + completion:nil]; +} + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIAmExVectorArtView.h b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIAmExVectorArtView.h new file mode 100644 index 0000000..14cc7c4 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIAmExVectorArtView.h @@ -0,0 +1,5 @@ +#import "BTUICardVectorArtView.h" + +@interface BTUIAmExVectorArtView : BTUICardVectorArtView + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIAmExVectorArtView.m b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIAmExVectorArtView.m new file mode 100644 index 0000000..1e8976d --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIAmExVectorArtView.m @@ -0,0 +1,343 @@ +#import "BTUIAmExVectorArtView.h" + +@implementation BTUIAmExVectorArtView + +- (void)drawArt { + //// Color Declarations + UIColor* color1 = [UIColor colorWithRed: 0.059 green: 0.469 blue: 0.655 alpha: 1]; + + //// Page-1 + { + //// AmEx + { + //// amex + { + //// _x34__x5F_COL_x5F_SQ + { + //// Express + { + //// Bezier Drawing + UIBezierPath* bezierPath = [UIBezierPath bezierPath]; + [bezierPath moveToPoint: CGPointMake(54.98, 38.33)]; + [bezierPath addLineToPoint: CGPointMake(54.98, 36.35)]; + [bezierPath addCurveToPoint: CGPointMake(53.19, 34.8) controlPoint1: CGPointMake(54.98, 36.35) controlPoint2: CGPointMake(54.87, 34.8)]; + [bezierPath addLineToPoint: CGPointMake(50.58, 34.8)]; + [bezierPath addLineToPoint: CGPointMake(50.58, 38.33)]; + [bezierPath addLineToPoint: CGPointMake(47.9, 38.33)]; + [bezierPath addLineToPoint: CGPointMake(47.9, 28.14)]; + [bezierPath addLineToPoint: CGPointMake(54.4, 28.14)]; + [bezierPath addCurveToPoint: CGPointMake(57.8, 31.12) controlPoint1: CGPointMake(54.4, 28.14) controlPoint2: CGPointMake(57.8, 27.74)]; + [bezierPath addCurveToPoint: CGPointMake(56.3, 33.5) controlPoint1: CGPointMake(57.8, 32.88) controlPoint2: CGPointMake(56.3, 33.5)]; + [bezierPath addCurveToPoint: CGPointMake(57.58, 35.81) controlPoint1: CGPointMake(56.3, 33.5) controlPoint2: CGPointMake(57.58, 34.09)]; + [bezierPath addLineToPoint: CGPointMake(57.58, 38.33)]; + [bezierPath addLineToPoint: CGPointMake(54.98, 38.33)]; + [bezierPath moveToPoint: CGPointMake(50.58, 32.4)]; + [bezierPath addLineToPoint: CGPointMake(53.35, 32.4)]; + [bezierPath addCurveToPoint: CGPointMake(54.82, 31.43) controlPoint1: CGPointMake(54.15, 32.4) controlPoint2: CGPointMake(54.82, 31.97)]; + [bezierPath addCurveToPoint: CGPointMake(53.35, 30.47) controlPoint1: CGPointMake(54.82, 30.9) controlPoint2: CGPointMake(54.15, 30.47)]; + [bezierPath addLineToPoint: CGPointMake(50.58, 30.47)]; + [bezierPath addLineToPoint: CGPointMake(50.58, 32.4)]; + [bezierPath closePath]; + bezierPath.miterLimit = 4; + + bezierPath.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezierPath fill]; + + + //// Bezier 2 Drawing + UIBezierPath* bezier2Path = [UIBezierPath bezierPath]; + [bezier2Path moveToPoint: CGPointMake(37.11, 38.35)]; + [bezier2Path addLineToPoint: CGPointMake(34.77, 38.35)]; + [bezier2Path addLineToPoint: CGPointMake(31.93, 35.33)]; + [bezier2Path addLineToPoint: CGPointMake(29.08, 38.35)]; + [bezier2Path addLineToPoint: CGPointMake(27.45, 38.35)]; + [bezier2Path addLineToPoint: CGPointMake(19.11, 38.35)]; + [bezier2Path addLineToPoint: CGPointMake(19.11, 28.13)]; + [bezier2Path addLineToPoint: CGPointMake(27.45, 28.13)]; + [bezier2Path addLineToPoint: CGPointMake(28.86, 28.13)]; + [bezier2Path addLineToPoint: CGPointMake(31.93, 31.38)]; + [bezier2Path addLineToPoint: CGPointMake(35.02, 28.15)]; + [bezier2Path addLineToPoint: CGPointMake(37.08, 28.15)]; + [bezier2Path addLineToPoint: CGPointMake(37.08, 28.13)]; + [bezier2Path addLineToPoint: CGPointMake(43.58, 28.13)]; + [bezier2Path addCurveToPoint: CGPointMake(46.97, 31.13) controlPoint1: CGPointMake(43.58, 28.13) controlPoint2: CGPointMake(46.97, 27.77)]; + [bezier2Path addCurveToPoint: CGPointMake(42.38, 35.07) controlPoint1: CGPointMake(46.97, 34.14) controlPoint2: CGPointMake(45.85, 35.07)]; + [bezier2Path addLineToPoint: CGPointMake(39.76, 35.07)]; + [bezier2Path addLineToPoint: CGPointMake(39.76, 38.35)]; + [bezier2Path addLineToPoint: CGPointMake(37.11, 38.35)]; + [bezier2Path closePath]; + [bezier2Path moveToPoint: CGPointMake(33.76, 33.33)]; + [bezier2Path addLineToPoint: CGPointMake(37.08, 36.88)]; + [bezier2Path addLineToPoint: CGPointMake(37.08, 29.79)]; + [bezier2Path addLineToPoint: CGPointMake(33.76, 33.33)]; + [bezier2Path closePath]; + [bezier2Path moveToPoint: CGPointMake(21.81, 36.14)]; + [bezier2Path addLineToPoint: CGPointMake(27.45, 36.14)]; + [bezier2Path addLineToPoint: CGPointMake(30.1, 33.33)]; + [bezier2Path addLineToPoint: CGPointMake(27.45, 30.53)]; + [bezier2Path addLineToPoint: CGPointMake(21.81, 30.53)]; + [bezier2Path addLineToPoint: CGPointMake(21.81, 32.1)]; + [bezier2Path addLineToPoint: CGPointMake(27.31, 32.1)]; + [bezier2Path addLineToPoint: CGPointMake(27.31, 34.41)]; + [bezier2Path addLineToPoint: CGPointMake(21.81, 34.41)]; + [bezier2Path addLineToPoint: CGPointMake(21.81, 36.14)]; + [bezier2Path closePath]; + [bezier2Path moveToPoint: CGPointMake(39.76, 32.41)]; + [bezier2Path addLineToPoint: CGPointMake(42.53, 32.41)]; + [bezier2Path addCurveToPoint: CGPointMake(43.99, 31.45) controlPoint1: CGPointMake(43.33, 32.41) controlPoint2: CGPointMake(43.99, 31.98)]; + [bezier2Path addCurveToPoint: CGPointMake(42.53, 30.48) controlPoint1: CGPointMake(43.99, 30.91) controlPoint2: CGPointMake(43.33, 30.48)]; + [bezier2Path addLineToPoint: CGPointMake(39.76, 30.48)]; + [bezier2Path addLineToPoint: CGPointMake(39.76, 32.41)]; + [bezier2Path closePath]; + bezier2Path.miterLimit = 4; + + bezier2Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier2Path fill]; + + + //// Bezier 3 Drawing + UIBezierPath* bezier3Path = [UIBezierPath bezierPath]; + [bezier3Path moveToPoint: CGPointMake(73.25, 38.3)]; + [bezier3Path addLineToPoint: CGPointMake(68.48, 38.3)]; + [bezier3Path addLineToPoint: CGPointMake(68.48, 35.96)]; + [bezier3Path addLineToPoint: CGPointMake(72.66, 35.96)]; + [bezier3Path addCurveToPoint: CGPointMake(74.16, 35.15) controlPoint1: CGPointMake(72.66, 35.96) controlPoint2: CGPointMake(74.16, 36.13)]; + [bezier3Path addCurveToPoint: CGPointMake(71.89, 34.3) controlPoint1: CGPointMake(74.16, 34.23) controlPoint2: CGPointMake(71.89, 34.3)]; + [bezier3Path addCurveToPoint: CGPointMake(68.19, 31.26) controlPoint1: CGPointMake(71.89, 34.3) controlPoint2: CGPointMake(68.19, 34.61)]; + [bezier3Path addCurveToPoint: CGPointMake(71.53, 28.12) controlPoint1: CGPointMake(68.19, 27.93) controlPoint2: CGPointMake(71.53, 28.12)]; + [bezier3Path addLineToPoint: CGPointMake(76.68, 28.12)]; + [bezier3Path addLineToPoint: CGPointMake(76.68, 30.5)]; + [bezier3Path addLineToPoint: CGPointMake(72.54, 30.5)]; + [bezier3Path addCurveToPoint: CGPointMake(71.11, 31.23) controlPoint1: CGPointMake(72.54, 30.5) controlPoint2: CGPointMake(71.11, 30.23)]; + [bezier3Path addCurveToPoint: CGPointMake(73.05, 31.95) controlPoint1: CGPointMake(71.11, 32.07) controlPoint2: CGPointMake(73.05, 31.95)]; + [bezier3Path addCurveToPoint: CGPointMake(77.14, 34.73) controlPoint1: CGPointMake(73.05, 31.95) controlPoint2: CGPointMake(77.14, 31.66)]; + [bezier3Path addCurveToPoint: CGPointMake(73.57, 38.32) controlPoint1: CGPointMake(77.14, 38.03) controlPoint2: CGPointMake(74.51, 38.32)]; + [bezier3Path addCurveToPoint: CGPointMake(73.25, 38.3) controlPoint1: CGPointMake(73.37, 38.32) controlPoint2: CGPointMake(73.25, 38.3)]; + [bezier3Path closePath]; + bezier3Path.miterLimit = 4; + + bezier3Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier3Path fill]; + + + //// Bezier 4 Drawing + UIBezierPath* bezier4Path = [UIBezierPath bezierPath]; + [bezier4Path moveToPoint: CGPointMake(58.91, 38.3)]; + [bezier4Path addLineToPoint: CGPointMake(58.91, 28.12)]; + [bezier4Path addLineToPoint: CGPointMake(67.26, 28.12)]; + [bezier4Path addLineToPoint: CGPointMake(67.26, 30.49)]; + [bezier4Path addLineToPoint: CGPointMake(61.6, 30.49)]; + [bezier4Path addLineToPoint: CGPointMake(61.6, 32.06)]; + [bezier4Path addLineToPoint: CGPointMake(67.12, 32.06)]; + [bezier4Path addLineToPoint: CGPointMake(67.12, 34.37)]; + [bezier4Path addLineToPoint: CGPointMake(61.6, 34.37)]; + [bezier4Path addLineToPoint: CGPointMake(61.6, 36.1)]; + [bezier4Path addLineToPoint: CGPointMake(67.26, 36.1)]; + [bezier4Path addLineToPoint: CGPointMake(67.26, 38.3)]; + [bezier4Path addLineToPoint: CGPointMake(58.91, 38.3)]; + [bezier4Path closePath]; + bezier4Path.miterLimit = 4; + + bezier4Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier4Path fill]; + + + //// Bezier 5 Drawing + UIBezierPath* bezier5Path = [UIBezierPath bezierPath]; + [bezier5Path moveToPoint: CGPointMake(82.7, 38.3)]; + [bezier5Path addLineToPoint: CGPointMake(77.93, 38.3)]; + [bezier5Path addLineToPoint: CGPointMake(77.93, 35.96)]; + [bezier5Path addLineToPoint: CGPointMake(82.09, 35.96)]; + [bezier5Path addCurveToPoint: CGPointMake(83.61, 35.15) controlPoint1: CGPointMake(82.09, 35.96) controlPoint2: CGPointMake(83.61, 36.13)]; + [bezier5Path addCurveToPoint: CGPointMake(81.34, 34.3) controlPoint1: CGPointMake(83.61, 34.23) controlPoint2: CGPointMake(81.34, 34.3)]; + [bezier5Path addCurveToPoint: CGPointMake(77.64, 31.26) controlPoint1: CGPointMake(81.34, 34.3) controlPoint2: CGPointMake(77.64, 34.61)]; + [bezier5Path addCurveToPoint: CGPointMake(80.98, 28.12) controlPoint1: CGPointMake(77.64, 27.93) controlPoint2: CGPointMake(80.98, 28.12)]; + [bezier5Path addLineToPoint: CGPointMake(86.11, 28.12)]; + [bezier5Path addLineToPoint: CGPointMake(86.11, 30.5)]; + [bezier5Path addLineToPoint: CGPointMake(81.98, 30.5)]; + [bezier5Path addCurveToPoint: CGPointMake(80.56, 31.23) controlPoint1: CGPointMake(81.98, 30.5) controlPoint2: CGPointMake(80.56, 30.23)]; + [bezier5Path addCurveToPoint: CGPointMake(82.5, 31.95) controlPoint1: CGPointMake(80.56, 32.07) controlPoint2: CGPointMake(82.5, 31.95)]; + [bezier5Path addCurveToPoint: CGPointMake(86.59, 34.73) controlPoint1: CGPointMake(82.5, 31.95) controlPoint2: CGPointMake(86.59, 31.66)]; + [bezier5Path addCurveToPoint: CGPointMake(83.02, 38.32) controlPoint1: CGPointMake(86.59, 38.03) controlPoint2: CGPointMake(83.96, 38.32)]; + [bezier5Path addCurveToPoint: CGPointMake(82.7, 38.3) controlPoint1: CGPointMake(82.82, 38.32) controlPoint2: CGPointMake(82.7, 38.3)]; + [bezier5Path closePath]; + bezier5Path.miterLimit = 4; + + bezier5Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier5Path fill]; + } + + + //// American + { + //// Bezier 6 Drawing + UIBezierPath* bezier6Path = [UIBezierPath bezierPath]; + [bezier6Path moveToPoint: CGPointMake(45.31, 27.39)]; + [bezier6Path addLineToPoint: CGPointMake(45.31, 25.41)]; + [bezier6Path addCurveToPoint: CGPointMake(43.53, 23.85) controlPoint1: CGPointMake(45.31, 25.41) controlPoint2: CGPointMake(45.2, 23.85)]; + [bezier6Path addLineToPoint: CGPointMake(40.92, 23.85)]; + [bezier6Path addLineToPoint: CGPointMake(40.92, 27.39)]; + [bezier6Path addLineToPoint: CGPointMake(38.24, 27.39)]; + [bezier6Path addLineToPoint: CGPointMake(38.24, 17.19)]; + [bezier6Path addLineToPoint: CGPointMake(44.74, 17.19)]; + [bezier6Path addCurveToPoint: CGPointMake(48.14, 20.18) controlPoint1: CGPointMake(44.74, 17.19) controlPoint2: CGPointMake(48.14, 16.8)]; + [bezier6Path addCurveToPoint: CGPointMake(46.63, 22.56) controlPoint1: CGPointMake(48.14, 21.94) controlPoint2: CGPointMake(46.63, 22.56)]; + [bezier6Path addCurveToPoint: CGPointMake(47.94, 24.87) controlPoint1: CGPointMake(46.63, 22.56) controlPoint2: CGPointMake(47.94, 23.15)]; + [bezier6Path addLineToPoint: CGPointMake(47.94, 27.39)]; + [bezier6Path addLineToPoint: CGPointMake(45.31, 27.39)]; + [bezier6Path moveToPoint: CGPointMake(40.92, 21.45)]; + [bezier6Path addLineToPoint: CGPointMake(43.69, 21.45)]; + [bezier6Path addCurveToPoint: CGPointMake(45.15, 20.49) controlPoint1: CGPointMake(44.49, 21.45) controlPoint2: CGPointMake(45.15, 21.02)]; + [bezier6Path addCurveToPoint: CGPointMake(43.69, 19.52) controlPoint1: CGPointMake(45.15, 19.95) controlPoint2: CGPointMake(44.49, 19.52)]; + [bezier6Path addLineToPoint: CGPointMake(40.92, 19.52)]; + [bezier6Path addLineToPoint: CGPointMake(40.92, 21.45)]; + [bezier6Path closePath]; + bezier6Path.miterLimit = 4; + + bezier6Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier6Path fill]; + + + //// Bezier 7 Drawing + UIBezierPath* bezier7Path = [UIBezierPath bezierPath]; + [bezier7Path moveToPoint: CGPointMake(76.93, 27.39)]; + [bezier7Path addLineToPoint: CGPointMake(72.68, 20.57)]; + [bezier7Path addLineToPoint: CGPointMake(72.68, 27.39)]; + [bezier7Path addLineToPoint: CGPointMake(70.37, 27.39)]; + [bezier7Path addLineToPoint: CGPointMake(69.94, 27.39)]; + [bezier7Path addLineToPoint: CGPointMake(67.43, 27.39)]; + [bezier7Path addLineToPoint: CGPointMake(66.48, 25.25)]; + [bezier7Path addLineToPoint: CGPointMake(61.58, 25.25)]; + [bezier7Path addLineToPoint: CGPointMake(60.65, 27.39)]; + [bezier7Path addLineToPoint: CGPointMake(58.19, 27.39)]; + [bezier7Path addLineToPoint: CGPointMake(57.74, 27.39)]; + [bezier7Path addLineToPoint: CGPointMake(56.45, 27.39)]; + [bezier7Path addCurveToPoint: CGPointMake(52.85, 22.58) controlPoint1: CGPointMake(56.45, 27.39) controlPoint2: CGPointMake(52.85, 26.89)]; + [bezier7Path addCurveToPoint: CGPointMake(57.08, 17.11) controlPoint1: CGPointMake(52.85, 16.92) controlPoint2: CGPointMake(56.94, 17.14)]; + [bezier7Path addLineToPoint: CGPointMake(60.39, 17.19)]; + [bezier7Path addLineToPoint: CGPointMake(60.39, 19.49)]; + [bezier7Path addLineToPoint: CGPointMake(57.67, 19.52)]; + [bezier7Path addCurveToPoint: CGPointMake(55.69, 21.75) controlPoint1: CGPointMake(57.67, 19.52) controlPoint2: CGPointMake(55.9, 19.52)]; + [bezier7Path addCurveToPoint: CGPointMake(55.65, 22.46) controlPoint1: CGPointMake(55.66, 22) controlPoint2: CGPointMake(55.65, 22.24)]; + [bezier7Path addCurveToPoint: CGPointMake(58.85, 24.8) controlPoint1: CGPointMake(55.66, 25.91) controlPoint2: CGPointMake(58.75, 24.84)]; + [bezier7Path addLineToPoint: CGPointMake(62.17, 17.19)]; + [bezier7Path addLineToPoint: CGPointMake(65.92, 17.19)]; + [bezier7Path addLineToPoint: CGPointMake(69.94, 26.44)]; + [bezier7Path addLineToPoint: CGPointMake(69.94, 17.19)]; + [bezier7Path addLineToPoint: CGPointMake(73.73, 17.19)]; + [bezier7Path addLineToPoint: CGPointMake(77.92, 23.91)]; + [bezier7Path addLineToPoint: CGPointMake(77.92, 17.19)]; + [bezier7Path addLineToPoint: CGPointMake(80.62, 17.19)]; + [bezier7Path addLineToPoint: CGPointMake(80.62, 27.39)]; + [bezier7Path addLineToPoint: CGPointMake(76.93, 27.39)]; + [bezier7Path closePath]; + [bezier7Path moveToPoint: CGPointMake(62.73, 22.65)]; + [bezier7Path addLineToPoint: CGPointMake(65.33, 22.65)]; + [bezier7Path addLineToPoint: CGPointMake(64.05, 19.61)]; + [bezier7Path addLineToPoint: CGPointMake(62.73, 22.65)]; + [bezier7Path closePath]; + bezier7Path.miterLimit = 4; + + bezier7Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier7Path fill]; + + + //// Bezier 8 Drawing + UIBezierPath* bezier8Path = [UIBezierPath bezierPath]; + [bezier8Path moveToPoint: CGPointMake(23.92, 27.44)]; + [bezier8Path addLineToPoint: CGPointMake(23.92, 20.4)]; + [bezier8Path addLineToPoint: CGPointMake(20.56, 27.44)]; + [bezier8Path addLineToPoint: CGPointMake(18.36, 27.44)]; + [bezier8Path addLineToPoint: CGPointMake(14.99, 20.43)]; + [bezier8Path addLineToPoint: CGPointMake(14.99, 27.44)]; + [bezier8Path addLineToPoint: CGPointMake(12.65, 27.44)]; + [bezier8Path addLineToPoint: CGPointMake(12.29, 27.44)]; + [bezier8Path addLineToPoint: CGPointMake(9.7, 27.44)]; + [bezier8Path addLineToPoint: CGPointMake(8.77, 25.3)]; + [bezier8Path addLineToPoint: CGPointMake(3.88, 25.3)]; + [bezier8Path addLineToPoint: CGPointMake(2.93, 27.44)]; + [bezier8Path addLineToPoint: CGPointMake(0, 27.44)]; + [bezier8Path addLineToPoint: CGPointMake(4.45, 17.24)]; + [bezier8Path addLineToPoint: CGPointMake(8.22, 17.24)]; + [bezier8Path addLineToPoint: CGPointMake(12.29, 26.61)]; + [bezier8Path addLineToPoint: CGPointMake(12.29, 17.24)]; + [bezier8Path addLineToPoint: CGPointMake(16.52, 17.24)]; + [bezier8Path addLineToPoint: CGPointMake(19.47, 23.58)]; + [bezier8Path addLineToPoint: CGPointMake(22.4, 17.24)]; + [bezier8Path addLineToPoint: CGPointMake(26.63, 17.24)]; + [bezier8Path addLineToPoint: CGPointMake(26.63, 27.44)]; + [bezier8Path addLineToPoint: CGPointMake(23.92, 27.44)]; + [bezier8Path closePath]; + [bezier8Path moveToPoint: CGPointMake(5.02, 22.69)]; + [bezier8Path addLineToPoint: CGPointMake(7.63, 22.69)]; + [bezier8Path addLineToPoint: CGPointMake(6.32, 19.66)]; + [bezier8Path addLineToPoint: CGPointMake(5.02, 22.69)]; + [bezier8Path closePath]; + bezier8Path.miterLimit = 4; + + bezier8Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier8Path fill]; + + + //// Bezier 9 Drawing + UIBezierPath* bezier9Path = [UIBezierPath bezierPath]; + [bezier9Path moveToPoint: CGPointMake(28.49, 27.39)]; + [bezier9Path addLineToPoint: CGPointMake(28.49, 17.19)]; + [bezier9Path addLineToPoint: CGPointMake(36.85, 17.19)]; + [bezier9Path addLineToPoint: CGPointMake(36.85, 19.57)]; + [bezier9Path addLineToPoint: CGPointMake(31.18, 19.57)]; + [bezier9Path addLineToPoint: CGPointMake(31.18, 21.14)]; + [bezier9Path addLineToPoint: CGPointMake(36.7, 21.14)]; + [bezier9Path addLineToPoint: CGPointMake(36.7, 23.46)]; + [bezier9Path addLineToPoint: CGPointMake(31.18, 23.46)]; + [bezier9Path addLineToPoint: CGPointMake(31.18, 25.18)]; + [bezier9Path addLineToPoint: CGPointMake(36.85, 25.18)]; + [bezier9Path addLineToPoint: CGPointMake(36.85, 27.39)]; + [bezier9Path addLineToPoint: CGPointMake(28.49, 27.39)]; + [bezier9Path closePath]; + bezier9Path.miterLimit = 4; + + bezier9Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier9Path fill]; + + + //// Bezier 10 Drawing + UIBezierPath* bezier10Path = [UIBezierPath bezierPath]; + [bezier10Path moveToPoint: CGPointMake(49.24, 27.42)]; + [bezier10Path addLineToPoint: CGPointMake(49.24, 17.19)]; + [bezier10Path addLineToPoint: CGPointMake(51.94, 17.19)]; + [bezier10Path addLineToPoint: CGPointMake(51.94, 27.42)]; + [bezier10Path addLineToPoint: CGPointMake(49.24, 27.42)]; + [bezier10Path closePath]; + bezier10Path.miterLimit = 4; + + bezier10Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier10Path fill]; + } + } + } + } + } +} + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUICVVBackVectorArtView.h b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUICVVBackVectorArtView.h new file mode 100644 index 0000000..7ae91bd --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUICVVBackVectorArtView.h @@ -0,0 +1,5 @@ +#import "BTUICardVectorArtView.h" + +@interface BTUICVVBackVectorArtView : BTUICardVectorArtView + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUICVVBackVectorArtView.m b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUICVVBackVectorArtView.m new file mode 100644 index 0000000..a54b825 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUICVVBackVectorArtView.m @@ -0,0 +1,48 @@ +#import "BTUICVVBackVectorArtView.h" + +@implementation BTUICVVBackVectorArtView + +- (void)drawArt { + + //// Color Declarations + UIColor* color1 = [UIColor colorWithRed: 0.124 green: 0.132 blue: 0.138 alpha: 0.1]; + UIColor* color2 = self.highlightColor ?: color1; + UIColor* color3 = [UIColor colorWithRed: 1 green: 1 blue: 1 alpha: 1]; + + //// Page-1 + { + //// CVV-Back + { + //// Rectangle Drawing + UIBezierPath* rectanglePath = [UIBezierPath bezierPathWithRect: CGRectMake(0, 8, 87, 12)]; + [color1 setFill]; + [rectanglePath fill]; + + + //// Rounded Rectangle Drawing + UIBezierPath* roundedRectanglePath = [UIBezierPath bezierPathWithRoundedRect: CGRectMake(53, 30, 26, 18) cornerRadius: 9]; + [color2 setFill]; + [roundedRectanglePath fill]; + + + //// Rectangle 2 Drawing + UIBezierPath* rectangle2Path = [UIBezierPath bezierPathWithRect: CGRectMake(61, 36, 2, 6)]; + [color3 setFill]; + [rectangle2Path fill]; + + + //// Rectangle 3 Drawing + UIBezierPath* rectangle3Path = [UIBezierPath bezierPathWithRect: CGRectMake(65, 36, 2, 6)]; + [color3 setFill]; + [rectangle3Path fill]; + + + //// Rectangle 4 Drawing + UIBezierPath* rectangle4Path = [UIBezierPath bezierPathWithRect: CGRectMake(69, 36, 2, 6)]; + [color3 setFill]; + [rectangle4Path fill]; + } + } +} + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUICVVFrontVectorArtView.h b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUICVVFrontVectorArtView.h new file mode 100644 index 0000000..79f85f8 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUICVVFrontVectorArtView.h @@ -0,0 +1,5 @@ +#import "BTUICardVectorArtView.h" + +@interface BTUICVVFrontVectorArtView : BTUICardVectorArtView + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUICVVFrontVectorArtView.m b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUICVVFrontVectorArtView.m new file mode 100644 index 0000000..4e1f435 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUICVVFrontVectorArtView.m @@ -0,0 +1,341 @@ +#import "BTUICVVFrontVectorArtView.h" + +@implementation BTUICVVFrontVectorArtView + +- (void)drawArt { + + + //// Color Declarations + UIColor* color1 = [UIColor colorWithRed: 0.765 green: 0.77 blue: 0.756 alpha: 1]; + UIColor* color3 = self.highlightColor ?: color1; + UIColor* color2 = [UIColor colorWithRed: 0 green: 0 blue: 0 alpha: 0.105]; + UIColor* color4 = [UIColor colorWithRed: 1 green: 1 blue: 1 alpha: 1]; + + //// Page-1 + { + //// CVV-Front + { + //// Card-#-2 + { + //// CC-numbers + { + //// CC-number + { + //// Bezier Drawing + UIBezierPath* bezierPath = [UIBezierPath bezierPath]; + [bezierPath moveToPoint: CGPointMake(6, 31)]; + [bezierPath addLineToPoint: CGPointMake(8, 31)]; + [bezierPath addLineToPoint: CGPointMake(8, 37)]; + [bezierPath addLineToPoint: CGPointMake(6, 37)]; + [bezierPath addLineToPoint: CGPointMake(6, 31)]; + [bezierPath closePath]; + bezierPath.miterLimit = 4; + + bezierPath.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezierPath fill]; + + + //// Bezier 2 Drawing + UIBezierPath* bezier2Path = [UIBezierPath bezierPath]; + [bezier2Path moveToPoint: CGPointMake(10, 31)]; + [bezier2Path addLineToPoint: CGPointMake(12, 31)]; + [bezier2Path addLineToPoint: CGPointMake(12, 37)]; + [bezier2Path addLineToPoint: CGPointMake(10, 37)]; + [bezier2Path addLineToPoint: CGPointMake(10, 31)]; + [bezier2Path closePath]; + bezier2Path.miterLimit = 4; + + bezier2Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier2Path fill]; + + + //// Bezier 3 Drawing + UIBezierPath* bezier3Path = [UIBezierPath bezierPath]; + [bezier3Path moveToPoint: CGPointMake(14, 31)]; + [bezier3Path addLineToPoint: CGPointMake(16, 31)]; + [bezier3Path addLineToPoint: CGPointMake(16, 37)]; + [bezier3Path addLineToPoint: CGPointMake(14, 37)]; + [bezier3Path addLineToPoint: CGPointMake(14, 31)]; + [bezier3Path closePath]; + bezier3Path.miterLimit = 4; + + bezier3Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier3Path fill]; + + + //// Bezier 4 Drawing + UIBezierPath* bezier4Path = [UIBezierPath bezierPath]; + [bezier4Path moveToPoint: CGPointMake(18, 31)]; + [bezier4Path addLineToPoint: CGPointMake(20, 31)]; + [bezier4Path addLineToPoint: CGPointMake(20, 37)]; + [bezier4Path addLineToPoint: CGPointMake(18, 37)]; + [bezier4Path addLineToPoint: CGPointMake(18, 31)]; + [bezier4Path closePath]; + bezier4Path.miterLimit = 4; + + bezier4Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier4Path fill]; + + + //// Bezier 5 Drawing + UIBezierPath* bezier5Path = [UIBezierPath bezierPath]; + [bezier5Path moveToPoint: CGPointMake(26, 31)]; + [bezier5Path addLineToPoint: CGPointMake(28, 31)]; + [bezier5Path addLineToPoint: CGPointMake(28, 37)]; + [bezier5Path addLineToPoint: CGPointMake(26, 37)]; + [bezier5Path addLineToPoint: CGPointMake(26, 31)]; + [bezier5Path closePath]; + bezier5Path.miterLimit = 4; + + bezier5Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier5Path fill]; + + + //// Bezier 6 Drawing + UIBezierPath* bezier6Path = [UIBezierPath bezierPath]; + [bezier6Path moveToPoint: CGPointMake(30, 31)]; + [bezier6Path addLineToPoint: CGPointMake(32, 31)]; + [bezier6Path addLineToPoint: CGPointMake(32, 37)]; + [bezier6Path addLineToPoint: CGPointMake(30, 37)]; + [bezier6Path addLineToPoint: CGPointMake(30, 31)]; + [bezier6Path closePath]; + bezier6Path.miterLimit = 4; + + bezier6Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier6Path fill]; + + + //// Bezier 7 Drawing + UIBezierPath* bezier7Path = [UIBezierPath bezierPath]; + [bezier7Path moveToPoint: CGPointMake(34, 31)]; + [bezier7Path addLineToPoint: CGPointMake(36, 31)]; + [bezier7Path addLineToPoint: CGPointMake(36, 37)]; + [bezier7Path addLineToPoint: CGPointMake(34, 37)]; + [bezier7Path addLineToPoint: CGPointMake(34, 31)]; + [bezier7Path closePath]; + bezier7Path.miterLimit = 4; + + bezier7Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier7Path fill]; + + + //// Bezier 8 Drawing + UIBezierPath* bezier8Path = [UIBezierPath bezierPath]; + [bezier8Path moveToPoint: CGPointMake(38, 31)]; + [bezier8Path addLineToPoint: CGPointMake(40, 31)]; + [bezier8Path addLineToPoint: CGPointMake(40, 37)]; + [bezier8Path addLineToPoint: CGPointMake(38, 37)]; + [bezier8Path addLineToPoint: CGPointMake(38, 31)]; + [bezier8Path closePath]; + bezier8Path.miterLimit = 4; + + bezier8Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier8Path fill]; + + + //// Bezier 9 Drawing + UIBezierPath* bezier9Path = [UIBezierPath bezierPath]; + [bezier9Path moveToPoint: CGPointMake(46, 31)]; + [bezier9Path addLineToPoint: CGPointMake(48, 31)]; + [bezier9Path addLineToPoint: CGPointMake(48, 37)]; + [bezier9Path addLineToPoint: CGPointMake(46, 37)]; + [bezier9Path addLineToPoint: CGPointMake(46, 31)]; + [bezier9Path closePath]; + bezier9Path.miterLimit = 4; + + bezier9Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier9Path fill]; + + + //// Bezier 10 Drawing + UIBezierPath* bezier10Path = [UIBezierPath bezierPath]; + [bezier10Path moveToPoint: CGPointMake(50, 31)]; + [bezier10Path addLineToPoint: CGPointMake(52, 31)]; + [bezier10Path addLineToPoint: CGPointMake(52, 37)]; + [bezier10Path addLineToPoint: CGPointMake(50, 37)]; + [bezier10Path addLineToPoint: CGPointMake(50, 31)]; + [bezier10Path closePath]; + bezier10Path.miterLimit = 4; + + bezier10Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier10Path fill]; + + + //// Bezier 11 Drawing + UIBezierPath* bezier11Path = [UIBezierPath bezierPath]; + [bezier11Path moveToPoint: CGPointMake(54, 31)]; + [bezier11Path addLineToPoint: CGPointMake(56, 31)]; + [bezier11Path addLineToPoint: CGPointMake(56, 37)]; + [bezier11Path addLineToPoint: CGPointMake(54, 37)]; + [bezier11Path addLineToPoint: CGPointMake(54, 31)]; + [bezier11Path closePath]; + bezier11Path.miterLimit = 4; + + bezier11Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier11Path fill]; + + + //// Bezier 12 Drawing + UIBezierPath* bezier12Path = [UIBezierPath bezierPath]; + [bezier12Path moveToPoint: CGPointMake(58, 31)]; + [bezier12Path addLineToPoint: CGPointMake(60, 31)]; + [bezier12Path addLineToPoint: CGPointMake(60, 37)]; + [bezier12Path addLineToPoint: CGPointMake(58, 37)]; + [bezier12Path addLineToPoint: CGPointMake(58, 31)]; + [bezier12Path closePath]; + bezier12Path.miterLimit = 4; + + bezier12Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier12Path fill]; + + + //// Bezier 13 Drawing + UIBezierPath* bezier13Path = [UIBezierPath bezierPath]; + [bezier13Path moveToPoint: CGPointMake(66, 31)]; + [bezier13Path addLineToPoint: CGPointMake(68, 31)]; + [bezier13Path addLineToPoint: CGPointMake(68, 37)]; + [bezier13Path addLineToPoint: CGPointMake(66, 37)]; + [bezier13Path addLineToPoint: CGPointMake(66, 31)]; + [bezier13Path closePath]; + bezier13Path.miterLimit = 4; + + bezier13Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier13Path fill]; + + + //// Bezier 14 Drawing + UIBezierPath* bezier14Path = [UIBezierPath bezierPath]; + [bezier14Path moveToPoint: CGPointMake(70, 31)]; + [bezier14Path addLineToPoint: CGPointMake(72, 31)]; + [bezier14Path addLineToPoint: CGPointMake(72, 37)]; + [bezier14Path addLineToPoint: CGPointMake(70, 37)]; + [bezier14Path addLineToPoint: CGPointMake(70, 31)]; + [bezier14Path closePath]; + bezier14Path.miterLimit = 4; + + bezier14Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier14Path fill]; + + + //// Bezier 15 Drawing + UIBezierPath* bezier15Path = [UIBezierPath bezierPath]; + [bezier15Path moveToPoint: CGPointMake(74, 31)]; + [bezier15Path addLineToPoint: CGPointMake(76, 31)]; + [bezier15Path addLineToPoint: CGPointMake(76, 37)]; + [bezier15Path addLineToPoint: CGPointMake(74, 37)]; + [bezier15Path addLineToPoint: CGPointMake(74, 31)]; + [bezier15Path closePath]; + bezier15Path.miterLimit = 4; + + bezier15Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier15Path fill]; + + + //// Bezier 16 Drawing + UIBezierPath* bezier16Path = [UIBezierPath bezierPath]; + [bezier16Path moveToPoint: CGPointMake(78, 31)]; + [bezier16Path addLineToPoint: CGPointMake(80, 31)]; + [bezier16Path addLineToPoint: CGPointMake(80, 37)]; + [bezier16Path addLineToPoint: CGPointMake(78, 37)]; + [bezier16Path addLineToPoint: CGPointMake(78, 31)]; + [bezier16Path closePath]; + bezier16Path.miterLimit = 4; + + bezier16Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier16Path fill]; + } + + + //// Rectangle Drawing + UIBezierPath* rectanglePath = [UIBezierPath bezierPathWithRect: CGRectMake(26, 43, 14, 2)]; + [color2 setFill]; + [rectanglePath fill]; + + + //// Rectangle 2 Drawing + UIBezierPath* rectangle2Path = [UIBezierPath bezierPathWithRect: CGRectMake(6, 47, 34, 2)]; + [color2 setFill]; + [rectangle2Path fill]; + + + //// Rounded Rectangle Drawing + UIBezierPath* roundedRectanglePath = [UIBezierPath bezierPathWithRoundedRect: CGRectMake(56, 5, 26, 18) cornerRadius: 9]; + [color3 setFill]; + [roundedRectanglePath fill]; + + + //// Rectangle 3 Drawing + UIBezierPath* rectangle3Path = [UIBezierPath bezierPathWithRect: CGRectMake(62, 11, 2, 6)]; + [color4 setFill]; + [rectangle3Path fill]; + + + //// Rectangle 4 Drawing + UIBezierPath* rectangle4Path = [UIBezierPath bezierPathWithRect: CGRectMake(66, 11, 2, 6)]; + [color4 setFill]; + [rectangle4Path fill]; + + + //// Rectangle 5 Drawing + UIBezierPath* rectangle5Path = [UIBezierPath bezierPathWithRect: CGRectMake(70, 11, 2, 6)]; + [color4 setFill]; + [rectangle5Path fill]; + + + //// Rectangle 6 Drawing + UIBezierPath* rectangle6Path = [UIBezierPath bezierPathWithRect: CGRectMake(74, 11, 2, 6)]; + [color4 setFill]; + [rectangle6Path fill]; + } + + + //// Rounded Rectangle 2 Drawing + UIBezierPath* roundedRectangle2Path = [UIBezierPath bezierPathWithRoundedRect: CGRectMake(6, 7, 14, 14) cornerRadius: 0.75]; + [color2 setFill]; + [roundedRectangle2Path fill]; + + + //// Rounded Rectangle 3 Drawing + UIBezierPath* roundedRectangle3Path = [UIBezierPath bezierPathWithRoundedRect: CGRectMake(72, 41, 8, 8) cornerRadius: 0.75]; + [color2 setFill]; + [roundedRectangle3Path fill]; + } + } + } + + +} + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUICardVectorArtView.h b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUICardVectorArtView.h new file mode 100644 index 0000000..5bb8874 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUICardVectorArtView.h @@ -0,0 +1,7 @@ +#import "BTUIVectorArtView.h" + +@interface BTUICardVectorArtView : BTUIVectorArtView + +@property (nonatomic, strong) UIColor *highlightColor; + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUICardVectorArtView.m b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUICardVectorArtView.m new file mode 100644 index 0000000..204eb0f --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUICardVectorArtView.m @@ -0,0 +1,25 @@ +#import "BTUICardVectorArtView.h" + +@implementation BTUICardVectorArtView + +- (id)init { + self = [super init]; + if (self) { + self.artDimensions = CGSizeMake(87.0f, 55.0f); + self.opaque = NO; + } + return self; +} + +- (void)updateConstraints { + [self addConstraint:[NSLayoutConstraint constraintWithItem:self + attribute:NSLayoutAttributeWidth + relatedBy:NSLayoutRelationEqual + toItem:self + attribute:NSLayoutAttributeHeight + multiplier:87.0f/55.0f + constant:0]]; + [super updateConstraints]; +} + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUICoinbaseMonogramCardView.h b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUICoinbaseMonogramCardView.h new file mode 100644 index 0000000..b300082 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUICoinbaseMonogramCardView.h @@ -0,0 +1,5 @@ +#import "BTUICardVectorArtView.h" + +@interface BTUICoinbaseMonogramCardView : BTUICardVectorArtView + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUICoinbaseMonogramCardView.m b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUICoinbaseMonogramCardView.m new file mode 100644 index 0000000..eb52ffd --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUICoinbaseMonogramCardView.m @@ -0,0 +1,43 @@ +#import "BTUICoinbaseMonogramCardView.h" + +@implementation BTUICoinbaseMonogramCardView + +- (void)drawArt { + //// Color Declarations + UIColor* color1 = [UIColor colorWithRed: 0.053 green: 0.433 blue: 0.7 alpha: 1]; + + //// Assets + { + //// icon-coinbase + { + //// Rectangle Drawing + + + //// logo/coinbase-2 + { + //// Bezier Drawing + UIBezierPath* bezierPath = [UIBezierPath bezierPath]; + [bezierPath moveToPoint: CGPointMake(24, 27.45)]; + [bezierPath addCurveToPoint: CGPointMake(47.38, 0) controlPoint1: CGPointMake(24, 8.33) controlPoint2: CGPointMake(35.54, 0)]; + [bezierPath addCurveToPoint: CGPointMake(61, 3.63) controlPoint1: CGPointMake(53.21, 0) controlPoint2: CGPointMake(57.74, 1.47)]; + [bezierPath addLineToPoint: CGPointMake(57.45, 11.37)]; + [bezierPath addCurveToPoint: CGPointMake(48.77, 8.82) controlPoint1: CGPointMake(55.28, 9.8) controlPoint2: CGPointMake(52.02, 8.82)]; + [bezierPath addCurveToPoint: CGPointMake(34.57, 27.45) controlPoint1: CGPointMake(41.66, 8.82) controlPoint2: CGPointMake(34.57, 14.51)]; + [bezierPath addCurveToPoint: CGPointMake(48.77, 45.98) controlPoint1: CGPointMake(34.57, 40.39) controlPoint2: CGPointMake(41.86, 45.98)]; + [bezierPath addCurveToPoint: CGPointMake(57.45, 43.43) controlPoint1: CGPointMake(52.02, 45.98) controlPoint2: CGPointMake(55.28, 45)]; + [bezierPath addLineToPoint: CGPointMake(61, 51.37)]; + [bezierPath addCurveToPoint: CGPointMake(47.38, 55) controlPoint1: CGPointMake(57.65, 53.63) controlPoint2: CGPointMake(53.21, 55)]; + [bezierPath addCurveToPoint: CGPointMake(24, 27.45) controlPoint1: CGPointMake(35.54, 55) controlPoint2: CGPointMake(24, 46.57)]; + [bezierPath closePath]; + bezierPath.miterLimit = 4; + + bezierPath.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezierPath fill]; + } + } + } +} + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUICoinbaseWordmarkVectorArtView.h b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUICoinbaseWordmarkVectorArtView.h new file mode 100644 index 0000000..84da317 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUICoinbaseWordmarkVectorArtView.h @@ -0,0 +1,7 @@ +#import "BTUIVectorArtView.h" + +@interface BTUICoinbaseWordmarkVectorArtView : BTUIVectorArtView + +@property (nonatomic, strong) UIColor *color; + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUICoinbaseWordmarkVectorArtView.m b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUICoinbaseWordmarkVectorArtView.m new file mode 100644 index 0000000..d9f828c --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUICoinbaseWordmarkVectorArtView.m @@ -0,0 +1,191 @@ +#import "BTUICoinbaseWordmarkVectorArtView.h" + +@implementation BTUICoinbaseWordmarkVectorArtView + +- (instancetype)initWithCoder:(NSCoder *)coder +{ + self = [super initWithCoder:coder]; + if (self) { + [self doSetup]; + } + return self; +} + +- (id)init { + self = [super init]; + if (self) { + [self doSetup]; + } + return self; +} + +- (void)doSetup { + self.artDimensions = CGSizeMake(162, 88); + self.opaque = NO; + self.color = [UIColor colorWithRed: 0.053 green: 0.433 blue: 0.7 alpha: 1]; // Default color +} + +- (void)setColor:(UIColor *)color { + _color = color; + [self setNeedsDisplay]; +} + +- (void)drawArt { + //// Assets + { + //// button-coinbase + { + //// Rectangle Drawing + + + //// logo/coinbase-2 + { + //// Bezier Drawing + UIBezierPath* bezierPath = [UIBezierPath bezierPath]; + [bezierPath moveToPoint: CGPointMake(20.22, 54)]; + [bezierPath addCurveToPoint: CGPointMake(12, 43.98) controlPoint1: CGPointMake(16.06, 54) controlPoint2: CGPointMake(12, 50.93)]; + [bezierPath addCurveToPoint: CGPointMake(20.22, 34) controlPoint1: CGPointMake(12, 37.03) controlPoint2: CGPointMake(16.06, 34)]; + [bezierPath addCurveToPoint: CGPointMake(25, 35.32) controlPoint1: CGPointMake(22.26, 34) controlPoint2: CGPointMake(23.86, 34.53)]; + [bezierPath addLineToPoint: CGPointMake(23.75, 38.14)]; + [bezierPath addCurveToPoint: CGPointMake(20.7, 37.21) controlPoint1: CGPointMake(22.99, 37.56) controlPoint2: CGPointMake(21.85, 37.21)]; + [bezierPath addCurveToPoint: CGPointMake(15.92, 43.95) controlPoint1: CGPointMake(18.21, 37.21) controlPoint2: CGPointMake(15.92, 39.24)]; + [bezierPath addCurveToPoint: CGPointMake(20.7, 50.72) controlPoint1: CGPointMake(15.92, 48.65) controlPoint2: CGPointMake(18.27, 50.72)]; + [bezierPath addCurveToPoint: CGPointMake(23.75, 49.79) controlPoint1: CGPointMake(21.85, 50.72) controlPoint2: CGPointMake(22.99, 50.36)]; + [bezierPath addLineToPoint: CGPointMake(25, 52.68)]; + [bezierPath addCurveToPoint: CGPointMake(20.22, 54) controlPoint1: CGPointMake(23.82, 53.5) controlPoint2: CGPointMake(22.26, 54)]; + [bezierPath closePath]; + [bezierPath moveToPoint: CGPointMake(36.07, 54)]; + [bezierPath addCurveToPoint: CGPointMake(27.62, 44.12) controlPoint1: CGPointMake(30.61, 54) controlPoint2: CGPointMake(27.62, 49.74)]; + [bezierPath addCurveToPoint: CGPointMake(36.07, 34.27) controlPoint1: CGPointMake(27.62, 38.49) controlPoint2: CGPointMake(30.61, 34.27)]; + [bezierPath addCurveToPoint: CGPointMake(44.52, 44.12) controlPoint1: CGPointMake(41.53, 34.27) controlPoint2: CGPointMake(44.52, 38.49)]; + [bezierPath addCurveToPoint: CGPointMake(36.07, 54) controlPoint1: CGPointMake(44.52, 49.74) controlPoint2: CGPointMake(41.53, 54)]; + [bezierPath closePath]; + [bezierPath moveToPoint: CGPointMake(31, 44)]; + [bezierPath addCurveToPoint: CGPointMake(36, 51) controlPoint1: CGPointMake(31, 48.08) controlPoint2: CGPointMake(32.97, 51)]; + [bezierPath addCurveToPoint: CGPointMake(41, 44) controlPoint1: CGPointMake(39.03, 51) controlPoint2: CGPointMake(41, 48.08)]; + [bezierPath addCurveToPoint: CGPointMake(36, 37) controlPoint1: CGPointMake(41, 39.92) controlPoint2: CGPointMake(39.03, 37)]; + [bezierPath addCurveToPoint: CGPointMake(31, 44) controlPoint1: CGPointMake(32.97, 37) controlPoint2: CGPointMake(31, 39.92)]; + [bezierPath closePath]; + [bezierPath moveToPoint: CGPointMake(51, 32)]; + [bezierPath addCurveToPoint: CGPointMake(49, 30) controlPoint1: CGPointMake(49.89, 32) controlPoint2: CGPointMake(49, 31.1)]; + [bezierPath addCurveToPoint: CGPointMake(51, 28) controlPoint1: CGPointMake(49, 28.9) controlPoint2: CGPointMake(49.89, 28)]; + [bezierPath addCurveToPoint: CGPointMake(53, 30) controlPoint1: CGPointMake(52.11, 28) controlPoint2: CGPointMake(53, 28.9)]; + [bezierPath addCurveToPoint: CGPointMake(51, 32) controlPoint1: CGPointMake(53, 31.1) controlPoint2: CGPointMake(52.11, 32)]; + [bezierPath closePath]; + [bezierPath moveToPoint: CGPointMake(49, 54)]; + [bezierPath addLineToPoint: CGPointMake(49, 35)]; + [bezierPath addLineToPoint: CGPointMake(53, 35)]; + [bezierPath addLineToPoint: CGPointMake(53, 54)]; + [bezierPath addLineToPoint: CGPointMake(49, 54)]; + [bezierPath addLineToPoint: CGPointMake(49, 54)]; + [bezierPath closePath]; + [bezierPath moveToPoint: CGPointMake(70, 41)]; + [bezierPath addCurveToPoint: CGPointMake(65.5, 37) controlPoint1: CGPointMake(70, 38.71) controlPoint2: CGPointMake(68.28, 37)]; + [bezierPath addCurveToPoint: CGPointMake(62, 38) controlPoint1: CGPointMake(64.01, 37) controlPoint2: CGPointMake(62.82, 37.67)]; + [bezierPath addLineToPoint: CGPointMake(62, 54)]; + [bezierPath addLineToPoint: CGPointMake(58, 54)]; + [bezierPath addLineToPoint: CGPointMake(58, 35.38)]; + [bezierPath addCurveToPoint: CGPointMake(65.5, 34) controlPoint1: CGPointMake(60, 34.58) controlPoint2: CGPointMake(62.38, 34)]; + [bezierPath addCurveToPoint: CGPointMake(74, 40.55) controlPoint1: CGPointMake(71.11, 34) controlPoint2: CGPointMake(74, 36.4)]; + [bezierPath addLineToPoint: CGPointMake(74, 54)]; + [bezierPath addLineToPoint: CGPointMake(70, 54)]; + [bezierPath addLineToPoint: CGPointMake(70, 41)]; + [bezierPath closePath]; + [bezierPath moveToPoint: CGPointMake(78, 52.66)]; + [bezierPath addLineToPoint: CGPointMake(78, 26)]; + [bezierPath addLineToPoint: CGPointMake(81.9, 26)]; + [bezierPath addLineToPoint: CGPointMake(81.9, 35.15)]; + [bezierPath addCurveToPoint: CGPointMake(85.5, 34) controlPoint1: CGPointMake(82.83, 34.72) controlPoint2: CGPointMake(84.18, 34)]; + [bezierPath addCurveToPoint: CGPointMake(94, 43.69) controlPoint1: CGPointMake(90.48, 34) controlPoint2: CGPointMake(94, 37.89)]; + [bezierPath addCurveToPoint: CGPointMake(84.48, 54) controlPoint1: CGPointMake(94, 50.83) controlPoint2: CGPointMake(90.24, 54)]; + [bezierPath addCurveToPoint: CGPointMake(78, 52.66) controlPoint1: CGPointMake(81.97, 54) controlPoint2: CGPointMake(79.5, 53.4)]; + [bezierPath closePath]; + [bezierPath moveToPoint: CGPointMake(85, 37)]; + [bezierPath addCurveToPoint: CGPointMake(82, 37.65) controlPoint1: CGPointMake(83.96, 37) controlPoint2: CGPointMake(82.73, 37.25)]; + [bezierPath addLineToPoint: CGPointMake(82, 50.49)]; + [bezierPath addCurveToPoint: CGPointMake(84.72, 51) controlPoint1: CGPointMake(82.56, 50.75) controlPoint2: CGPointMake(83.64, 51)]; + [bezierPath addCurveToPoint: CGPointMake(90, 43.82) controlPoint1: CGPointMake(87.76, 51) controlPoint2: CGPointMake(90, 48.82)]; + [bezierPath addCurveToPoint: CGPointMake(85, 37) controlPoint1: CGPointMake(90, 39.54) controlPoint2: CGPointMake(88.04, 37)]; + [bezierPath closePath]; + [bezierPath moveToPoint: CGPointMake(97, 48)]; + [bezierPath addCurveToPoint: CGPointMake(108, 41.5) controlPoint1: CGPointMake(97, 42.72) controlPoint2: CGPointMake(102.19, 41.82)]; + [bezierPath addLineToPoint: CGPointMake(108, 40)]; + [bezierPath addCurveToPoint: CGPointMake(104.5, 37) controlPoint1: CGPointMake(108, 37.61) controlPoint2: CGPointMake(106.96, 37)]; + [bezierPath addCurveToPoint: CGPointMake(98.9, 38.24) controlPoint1: CGPointMake(102.68, 37) controlPoint2: CGPointMake(100.18, 37.64)]; + [bezierPath addLineToPoint: CGPointMake(97.9, 35.6)]; + [bezierPath addCurveToPoint: CGPointMake(104.5, 34) controlPoint1: CGPointMake(99.43, 34.93) controlPoint2: CGPointMake(101.93, 34)]; + [bezierPath addCurveToPoint: CGPointMake(111.99, 40.7) controlPoint1: CGPointMake(109.1, 34) controlPoint2: CGPointMake(111.99, 36.03)]; + [bezierPath addLineToPoint: CGPointMake(111.99, 52.66)]; + [bezierPath addCurveToPoint: CGPointMake(105.07, 54) controlPoint1: CGPointMake(110.6, 53.4) controlPoint2: CGPointMake(107.78, 54)]; + [bezierPath addCurveToPoint: CGPointMake(97, 48) controlPoint1: CGPointMake(99.54, 54) controlPoint2: CGPointMake(97, 51.73)]; + [bezierPath closePath]; + [bezierPath moveToPoint: CGPointMake(100.5, 48)]; + [bezierPath addCurveToPoint: CGPointMake(105, 51) controlPoint1: CGPointMake(100.5, 50.01) controlPoint2: CGPointMake(102.04, 51)]; + [bezierPath addLineToPoint: CGPointMake(108, 51)]; + [bezierPath addLineToPoint: CGPointMake(108, 44)]; + [bezierPath addCurveToPoint: CGPointMake(100.5, 48) controlPoint1: CGPointMake(104.08, 44.21) controlPoint2: CGPointMake(100.5, 44.62)]; + [bezierPath closePath]; + [bezierPath moveToPoint: CGPointMake(121.79, 54)]; + [bezierPath addCurveToPoint: CGPointMake(116, 52.65) controlPoint1: CGPointMake(119.62, 54) controlPoint2: CGPointMake(117.35, 53.39)]; + [bezierPath addLineToPoint: CGPointMake(117.28, 49.65)]; + [bezierPath addCurveToPoint: CGPointMake(121.69, 50.9) controlPoint1: CGPointMake(118.24, 50.26) controlPoint2: CGPointMake(120.28, 50.9)]; + [bezierPath addCurveToPoint: CGPointMake(125.07, 48.26) controlPoint1: CGPointMake(123.72, 50.9) controlPoint2: CGPointMake(125.07, 49.86)]; + [bezierPath addCurveToPoint: CGPointMake(121.76, 45.12) controlPoint1: CGPointMake(125.07, 46.51) controlPoint2: CGPointMake(123.66, 45.84)]; + [bezierPath addCurveToPoint: CGPointMake(116.48, 39.38) controlPoint1: CGPointMake(119.28, 44.16) controlPoint2: CGPointMake(116.48, 42.98)]; + [bezierPath addCurveToPoint: CGPointMake(123, 34) controlPoint1: CGPointMake(116.48, 36.21) controlPoint2: CGPointMake(118.86, 34)]; + [bezierPath addCurveToPoint: CGPointMake(128.41, 35.35) controlPoint1: CGPointMake(125.24, 34) controlPoint2: CGPointMake(127.1, 34.57)]; + [bezierPath addLineToPoint: CGPointMake(127.24, 38.06)]; + [bezierPath addCurveToPoint: CGPointMake(123.41, 36.92) controlPoint1: CGPointMake(126.41, 37.53) controlPoint2: CGPointMake(124.76, 36.92)]; + [bezierPath addCurveToPoint: CGPointMake(120.34, 39.38) controlPoint1: CGPointMake(121.45, 36.92) controlPoint2: CGPointMake(120.34, 37.99)]; + [bezierPath addCurveToPoint: CGPointMake(123.55, 42.45) controlPoint1: CGPointMake(120.34, 41.13) controlPoint2: CGPointMake(121.72, 41.74)]; + [bezierPath addCurveToPoint: CGPointMake(129, 48.3) controlPoint1: CGPointMake(126.14, 43.45) controlPoint2: CGPointMake(129, 44.55)]; + [bezierPath addCurveToPoint: CGPointMake(121.79, 54) controlPoint1: CGPointMake(129, 51.75) controlPoint2: CGPointMake(126.45, 54)]; + [bezierPath closePath]; + [bezierPath moveToPoint: CGPointMake(136, 46)]; + [bezierPath addCurveToPoint: CGPointMake(142.08, 50.94) controlPoint1: CGPointMake(136.39, 49.41) controlPoint2: CGPointMake(138.84, 50.94)]; + [bezierPath addCurveToPoint: CGPointMake(147.39, 49.78) controlPoint1: CGPointMake(144.01, 50.94) controlPoint2: CGPointMake(146.08, 50.48)]; + [bezierPath addLineToPoint: CGPointMake(148.54, 52.66)]; + [bezierPath addCurveToPoint: CGPointMake(141.83, 54) controlPoint1: CGPointMake(147.04, 53.44) controlPoint2: CGPointMake(144.47, 54)]; + [bezierPath addCurveToPoint: CGPointMake(132, 44.04) controlPoint1: CGPointMake(135.77, 54) controlPoint2: CGPointMake(132, 50.1)]; + [bezierPath addCurveToPoint: CGPointMake(141, 34) controlPoint1: CGPointMake(132, 38.24) controlPoint2: CGPointMake(135.62, 34)]; + [bezierPath addCurveToPoint: CGPointMake(149, 42.6) controlPoint1: CGPointMake(145.99, 34) controlPoint2: CGPointMake(149, 37.5)]; + [bezierPath addCurveToPoint: CGPointMake(148.96, 44.04) controlPoint1: CGPointMake(149, 43.06) controlPoint2: CGPointMake(149, 43.55)]; + [bezierPath addLineToPoint: CGPointMake(136, 46)]; + [bezierPath closePath]; + [bezierPath moveToPoint: CGPointMake(140.98, 37.08)]; + [bezierPath addCurveToPoint: CGPointMake(135.95, 43.27) controlPoint1: CGPointMake(137.98, 37.08) controlPoint2: CGPointMake(136.02, 39.33)]; + [bezierPath addLineToPoint: CGPointMake(145.26, 42)]; + [bezierPath addCurveToPoint: CGPointMake(140.98, 37.08) controlPoint1: CGPointMake(145.22, 38.7) controlPoint2: CGPointMake(143.54, 37.08)]; + [bezierPath addLineToPoint: CGPointMake(140.98, 37.08)]; + [bezierPath closePath]; + bezierPath.miterLimit = 4; + + bezierPath.usesEvenOddFillRule = YES; + + [self.color setFill]; + [bezierPath fill]; + } + } + } +} + +- (void)updateConstraints { + NSLayoutConstraint *aspectRatioConstraint = [NSLayoutConstraint constraintWithItem:self + attribute:NSLayoutAttributeWidth + relatedBy:NSLayoutRelationEqual + toItem:self + attribute:NSLayoutAttributeHeight + multiplier:(self.artDimensions.width / self.artDimensions.height) + constant:0.0f]; + aspectRatioConstraint.priority = UILayoutPriorityRequired; + + [self addConstraints:@[aspectRatioConstraint]]; + + [super updateConstraints]; +} + +- (UILayoutPriority)contentCompressionResistancePriorityForAxis:(__unused UILayoutConstraintAxis)axis { + return UILayoutPriorityRequired; +} + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIDinersClubVectorArtView.h b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIDinersClubVectorArtView.h new file mode 100644 index 0000000..aa2251d --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIDinersClubVectorArtView.h @@ -0,0 +1,5 @@ +#import "BTUICardVectorArtView.h" + +@interface BTUIDinersClubVectorArtView : BTUICardVectorArtView + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIDinersClubVectorArtView.m b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIDinersClubVectorArtView.m new file mode 100644 index 0000000..8dbc16d --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIDinersClubVectorArtView.m @@ -0,0 +1,66 @@ +#import "BTUIDinersClubVectorArtView.h" + +@implementation BTUIDinersClubVectorArtView + +- (void)drawArt { + //// Color Declarations + UIColor* color1 = [UIColor colorWithRed: 0.019 green: 0.213 blue: 0.52 alpha: 1]; + UIColor* color2 = [UIColor colorWithRed: 1 green: 1 blue: 1 alpha: 1]; + + //// Page-1 + { + //// Diners-Club + { + //// Shape + { + //// Bezier Drawing + UIBezierPath* bezierPath = [UIBezierPath bezierPath]; + [bezierPath moveToPoint: CGPointMake(46, 44)]; + [bezierPath addCurveToPoint: CGPointMake(64, 28) controlPoint1: CGPointMake(55.5, 44.04) controlPoint2: CGPointMake(64, 36.64)]; + [bezierPath addCurveToPoint: CGPointMake(46, 11) controlPoint1: CGPointMake(64, 17.8) controlPoint2: CGPointMake(55.5, 11)]; + [bezierPath addLineToPoint: CGPointMake(38, 11)]; + [bezierPath addCurveToPoint: CGPointMake(21, 28) controlPoint1: CGPointMake(28.76, 11) controlPoint2: CGPointMake(21, 17.8)]; + [bezierPath addCurveToPoint: CGPointMake(38, 44) controlPoint1: CGPointMake(21, 36.65) controlPoint2: CGPointMake(28.76, 44.04)]; + [bezierPath addLineToPoint: CGPointMake(46, 44)]; + [bezierPath addLineToPoint: CGPointMake(46, 44)]; + [bezierPath addLineToPoint: CGPointMake(46, 44)]; + [bezierPath addLineToPoint: CGPointMake(46, 44)]; + [bezierPath closePath]; + bezierPath.miterLimit = 4; + + bezierPath.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezierPath fill]; + + + //// Bezier 2 Drawing + UIBezierPath* bezier2Path = [UIBezierPath bezierPath]; + [bezier2Path moveToPoint: CGPointMake(40.6, 36.8)]; + [bezier2Path addLineToPoint: CGPointMake(40.6, 18.2)]; + [bezier2Path addCurveToPoint: CGPointMake(46.8, 27.5) controlPoint1: CGPointMake(44.22, 19.63) controlPoint2: CGPointMake(46.79, 23.25)]; + [bezier2Path addCurveToPoint: CGPointMake(40.6, 36.8) controlPoint1: CGPointMake(46.79, 31.75) controlPoint2: CGPointMake(44.22, 35.36)]; + [bezier2Path closePath]; + [bezier2Path moveToPoint: CGPointMake(27.17, 27.5)]; + [bezier2Path addCurveToPoint: CGPointMake(33.37, 18.2) controlPoint1: CGPointMake(27.18, 23.26) controlPoint2: CGPointMake(29.74, 19.64)]; + [bezier2Path addLineToPoint: CGPointMake(33.37, 36.8)]; + [bezier2Path addCurveToPoint: CGPointMake(27.17, 27.5) controlPoint1: CGPointMake(29.74, 35.36) controlPoint2: CGPointMake(27.18, 31.75)]; + [bezier2Path closePath]; + [bezier2Path moveToPoint: CGPointMake(37.5, 12)]; + [bezier2Path addCurveToPoint: CGPointMake(22, 27.5) controlPoint1: CGPointMake(28.94, 12) controlPoint2: CGPointMake(22, 18.94)]; + [bezier2Path addCurveToPoint: CGPointMake(37.5, 43) controlPoint1: CGPointMake(22, 36.06) controlPoint2: CGPointMake(28.94, 43)]; + [bezier2Path addCurveToPoint: CGPointMake(53, 27.5) controlPoint1: CGPointMake(46.06, 43) controlPoint2: CGPointMake(53, 36.06)]; + [bezier2Path addCurveToPoint: CGPointMake(37.5, 12) controlPoint1: CGPointMake(53, 18.94) controlPoint2: CGPointMake(46.06, 12)]; + [bezier2Path closePath]; + bezier2Path.miterLimit = 4; + + bezier2Path.usesEvenOddFillRule = YES; + + [color2 setFill]; + [bezier2Path fill]; + } + } + } +} + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIDiscoverVectorArtView.h b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIDiscoverVectorArtView.h new file mode 100644 index 0000000..ba9aa79 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIDiscoverVectorArtView.h @@ -0,0 +1,5 @@ +#import "BTUICardVectorArtView.h" + +@interface BTUIDiscoverVectorArtView : BTUICardVectorArtView + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIDiscoverVectorArtView.m b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIDiscoverVectorArtView.m new file mode 100644 index 0000000..c4d3f3d --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIDiscoverVectorArtView.m @@ -0,0 +1,213 @@ +#import "BTUIDiscoverVectorArtView.h" + +@implementation BTUIDiscoverVectorArtView + +- (void)drawArt { + //// Color Declarations + UIColor* color2 = [UIColor colorWithRed: 0.879 green: 0.425 blue: 0.167 alpha: 1]; + UIColor* color1 = [UIColor colorWithRed: 0.042 green: 0.053 blue: 0.066 alpha: 1]; + + //// Page-1 + { + //// Discover + { + //// Group 4 + { + //// Group 5 + { + //// Bezier Drawing + UIBezierPath* bezierPath = [UIBezierPath bezierPath]; + [bezierPath moveToPoint: CGPointMake(13.13, 22)]; + [bezierPath addLineToPoint: CGPointMake(10, 22)]; + [bezierPath addLineToPoint: CGPointMake(10, 33)]; + [bezierPath addLineToPoint: CGPointMake(13.12, 33)]; + [bezierPath addCurveToPoint: CGPointMake(17.02, 31.73) controlPoint1: CGPointMake(14.77, 33) controlPoint2: CGPointMake(15.97, 32.61)]; + [bezierPath addCurveToPoint: CGPointMake(19, 27.51) controlPoint1: CGPointMake(18.26, 30.69) controlPoint2: CGPointMake(19, 29.12)]; + [bezierPath addCurveToPoint: CGPointMake(13.13, 22) controlPoint1: CGPointMake(19, 24.26) controlPoint2: CGPointMake(16.59, 22)]; + [bezierPath addLineToPoint: CGPointMake(13.13, 22)]; + [bezierPath addLineToPoint: CGPointMake(13.13, 22)]; + [bezierPath addLineToPoint: CGPointMake(13.13, 22)]; + [bezierPath closePath]; + [bezierPath moveToPoint: CGPointMake(15.74, 30.16)]; + [bezierPath addCurveToPoint: CGPointMake(12.61, 31) controlPoint1: CGPointMake(15.02, 30.75) controlPoint2: CGPointMake(14.09, 31)]; + [bezierPath addLineToPoint: CGPointMake(12, 31)]; + [bezierPath addLineToPoint: CGPointMake(12, 24)]; + [bezierPath addLineToPoint: CGPointMake(12.61, 24)]; + [bezierPath addCurveToPoint: CGPointMake(15.74, 24.86) controlPoint1: CGPointMake(14.09, 24) controlPoint2: CGPointMake(14.98, 24.24)]; + [bezierPath addCurveToPoint: CGPointMake(17, 27.49) controlPoint1: CGPointMake(16.53, 25.49) controlPoint2: CGPointMake(17, 26.47)]; + [bezierPath addCurveToPoint: CGPointMake(15.74, 30.16) controlPoint1: CGPointMake(17, 28.51) controlPoint2: CGPointMake(16.53, 29.52)]; + [bezierPath addLineToPoint: CGPointMake(15.74, 30.16)]; + [bezierPath closePath]; + bezierPath.miterLimit = 4; + + bezierPath.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezierPath fill]; + + + //// Bezier 2 Drawing + UIBezierPath* bezier2Path = [UIBezierPath bezierPath]; + [bezier2Path moveToPoint: CGPointMake(20, 22)]; + [bezier2Path addLineToPoint: CGPointMake(22, 22)]; + [bezier2Path addLineToPoint: CGPointMake(22, 33)]; + [bezier2Path addLineToPoint: CGPointMake(20, 33)]; + [bezier2Path addLineToPoint: CGPointMake(20, 33)]; + [bezier2Path addLineToPoint: CGPointMake(20, 22)]; + [bezier2Path addLineToPoint: CGPointMake(20, 22)]; + [bezier2Path closePath]; + bezier2Path.miterLimit = 4; + + bezier2Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier2Path fill]; + + + //// Bezier 3 Drawing + UIBezierPath* bezier3Path = [UIBezierPath bezierPath]; + [bezier3Path moveToPoint: CGPointMake(27.09, 26.23)]; + [bezier3Path addCurveToPoint: CGPointMake(25.55, 24.9) controlPoint1: CGPointMake(25.9, 25.77) controlPoint2: CGPointMake(25.55, 25.47)]; + [bezier3Path addCurveToPoint: CGPointMake(27.02, 23.73) controlPoint1: CGPointMake(25.55, 24.23) controlPoint2: CGPointMake(26.17, 23.73)]; + [bezier3Path addCurveToPoint: CGPointMake(28.62, 24.58) controlPoint1: CGPointMake(27.62, 23.73) controlPoint2: CGPointMake(28.1, 23.98)]; + [bezier3Path addLineToPoint: CGPointMake(29.65, 23.17)]; + [bezier3Path addCurveToPoint: CGPointMake(26.67, 22) controlPoint1: CGPointMake(28.8, 22.4) controlPoint2: CGPointMake(27.78, 22)]; + [bezier3Path addCurveToPoint: CGPointMake(23.52, 25.03) controlPoint1: CGPointMake(24.88, 22) controlPoint2: CGPointMake(23.52, 23.3)]; + [bezier3Path addCurveToPoint: CGPointMake(26.01, 27.93) controlPoint1: CGPointMake(23.52, 26.48) controlPoint2: CGPointMake(24.15, 27.23)]; + [bezier3Path addCurveToPoint: CGPointMake(27.37, 28.53) controlPoint1: CGPointMake(26.78, 28.21) controlPoint2: CGPointMake(27.17, 28.4)]; + [bezier3Path addCurveToPoint: CGPointMake(27.97, 29.62) controlPoint1: CGPointMake(27.77, 28.8) controlPoint2: CGPointMake(27.97, 29.18)]; + [bezier3Path addCurveToPoint: CGPointMake(26.43, 31.11) controlPoint1: CGPointMake(27.97, 30.48) controlPoint2: CGPointMake(27.31, 31.11)]; + [bezier3Path addCurveToPoint: CGPointMake(24.27, 29.7) controlPoint1: CGPointMake(25.49, 31.11) controlPoint2: CGPointMake(24.73, 30.62)]; + [bezier3Path addLineToPoint: CGPointMake(23, 30.99)]; + [bezier3Path addCurveToPoint: CGPointMake(26.51, 33) controlPoint1: CGPointMake(23.91, 32.38) controlPoint2: CGPointMake(25, 33)]; + [bezier3Path addCurveToPoint: CGPointMake(30, 29.53) controlPoint1: CGPointMake(28.56, 33) controlPoint2: CGPointMake(30, 31.57)]; + [bezier3Path addCurveToPoint: CGPointMake(27.09, 26.23) controlPoint1: CGPointMake(30, 27.85) controlPoint2: CGPointMake(29.33, 27.09)]; + [bezier3Path closePath]; + bezier3Path.miterLimit = 4; + + bezier3Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier3Path fill]; + + + //// Bezier 4 Drawing + UIBezierPath* bezier4Path = [UIBezierPath bezierPath]; + [bezier4Path moveToPoint: CGPointMake(31, 27.51)]; + [bezier4Path addCurveToPoint: CGPointMake(36.47, 33) controlPoint1: CGPointMake(31, 30.6) controlPoint2: CGPointMake(33.39, 33)]; + [bezier4Path addCurveToPoint: CGPointMake(39, 32.39) controlPoint1: CGPointMake(37.34, 33) controlPoint2: CGPointMake(38.08, 32.83)]; + [bezier4Path addLineToPoint: CGPointMake(39, 29.97)]; + [bezier4Path addCurveToPoint: CGPointMake(36.56, 31.12) controlPoint1: CGPointMake(38.19, 30.79) controlPoint2: CGPointMake(37.48, 31.12)]; + [bezier4Path addCurveToPoint: CGPointMake(33.08, 27.49) controlPoint1: CGPointMake(34.53, 31.12) controlPoint2: CGPointMake(33.08, 29.62)]; + [bezier4Path addCurveToPoint: CGPointMake(36.47, 23.88) controlPoint1: CGPointMake(33.08, 25.47) controlPoint2: CGPointMake(34.57, 23.88)]; + [bezier4Path addCurveToPoint: CGPointMake(39, 25.06) controlPoint1: CGPointMake(37.43, 23.88) controlPoint2: CGPointMake(38.16, 24.22)]; + [bezier4Path addLineToPoint: CGPointMake(39, 22.64)]; + [bezier4Path addCurveToPoint: CGPointMake(36.51, 22) controlPoint1: CGPointMake(38.11, 22.19) controlPoint2: CGPointMake(37.38, 22)]; + [bezier4Path addCurveToPoint: CGPointMake(31, 27.51) controlPoint1: CGPointMake(33.45, 22) controlPoint2: CGPointMake(31, 24.45)]; + [bezier4Path closePath]; + bezier4Path.miterLimit = 4; + + bezier4Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier4Path fill]; + + + //// Bezier 5 Drawing + UIBezierPath* bezier5Path = [UIBezierPath bezierPath]; + [bezier5Path moveToPoint: CGPointMake(55.99, 29.2)]; + [bezier5Path addLineToPoint: CGPointMake(53.22, 22)]; + [bezier5Path addLineToPoint: CGPointMake(51, 22)]; + [bezier5Path addLineToPoint: CGPointMake(55.42, 33)]; + [bezier5Path addLineToPoint: CGPointMake(56.51, 33)]; + [bezier5Path addLineToPoint: CGPointMake(61, 22)]; + [bezier5Path addLineToPoint: CGPointMake(58.8, 22)]; + [bezier5Path addLineToPoint: CGPointMake(55.99, 29.2)]; + [bezier5Path closePath]; + bezier5Path.miterLimit = 4; + + bezier5Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier5Path fill]; + + + //// Bezier 6 Drawing + UIBezierPath* bezier6Path = [UIBezierPath bezierPath]; + [bezier6Path moveToPoint: CGPointMake(62, 33)]; + [bezier6Path addLineToPoint: CGPointMake(68, 33)]; + [bezier6Path addLineToPoint: CGPointMake(68, 31.14)]; + [bezier6Path addLineToPoint: CGPointMake(64.11, 31.14)]; + [bezier6Path addLineToPoint: CGPointMake(64.11, 28.17)]; + [bezier6Path addLineToPoint: CGPointMake(67.85, 28.17)]; + [bezier6Path addLineToPoint: CGPointMake(67.85, 26.3)]; + [bezier6Path addLineToPoint: CGPointMake(64.11, 26.3)]; + [bezier6Path addLineToPoint: CGPointMake(64.11, 23.86)]; + [bezier6Path addLineToPoint: CGPointMake(68, 23.86)]; + [bezier6Path addLineToPoint: CGPointMake(68, 22)]; + [bezier6Path addLineToPoint: CGPointMake(62, 22)]; + [bezier6Path addLineToPoint: CGPointMake(62, 33)]; + [bezier6Path closePath]; + bezier6Path.miterLimit = 4; + + bezier6Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier6Path fill]; + + + //// Bezier 7 Drawing + UIBezierPath* bezier7Path = [UIBezierPath bezierPath]; + [bezier7Path moveToPoint: CGPointMake(77.05, 25.25)]; + [bezier7Path addCurveToPoint: CGPointMake(73.17, 22) controlPoint1: CGPointMake(77.05, 23.19) controlPoint2: CGPointMake(75.64, 22)]; + [bezier7Path addLineToPoint: CGPointMake(70, 22)]; + [bezier7Path addLineToPoint: CGPointMake(70, 33)]; + [bezier7Path addLineToPoint: CGPointMake(72.14, 33)]; + [bezier7Path addLineToPoint: CGPointMake(72.14, 28.58)]; + [bezier7Path addLineToPoint: CGPointMake(72.42, 28.58)]; + [bezier7Path addLineToPoint: CGPointMake(75.37, 33)]; + [bezier7Path addLineToPoint: CGPointMake(78, 33)]; + [bezier7Path addLineToPoint: CGPointMake(74.55, 28.37)]; + [bezier7Path addCurveToPoint: CGPointMake(77.05, 25.25) controlPoint1: CGPointMake(76.16, 28.04) controlPoint2: CGPointMake(77.05, 26.93)]; + [bezier7Path addCurveToPoint: CGPointMake(77.05, 25.25) controlPoint1: CGPointMake(77.05, 25.25) controlPoint2: CGPointMake(77.05, 26.93)]; + [bezier7Path addLineToPoint: CGPointMake(77.05, 25.25)]; + [bezier7Path addLineToPoint: CGPointMake(77.05, 25.25)]; + [bezier7Path closePath]; + [bezier7Path moveToPoint: CGPointMake(72.69, 27)]; + [bezier7Path addLineToPoint: CGPointMake(72, 27)]; + [bezier7Path addLineToPoint: CGPointMake(72, 24)]; + [bezier7Path addLineToPoint: CGPointMake(72.73, 24)]; + [bezier7Path addCurveToPoint: CGPointMake(75, 25.47) controlPoint1: CGPointMake(74.2, 24) controlPoint2: CGPointMake(75, 24.51)]; + [bezier7Path addCurveToPoint: CGPointMake(72.69, 27) controlPoint1: CGPointMake(75, 26.46) controlPoint2: CGPointMake(74.2, 27)]; + [bezier7Path addLineToPoint: CGPointMake(72.69, 27)]; + [bezier7Path closePath]; + bezier7Path.miterLimit = 4; + + bezier7Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier7Path fill]; + + + //// Bezier 8 Drawing + UIBezierPath* bezier8Path = [UIBezierPath bezierPath]; + [bezier8Path moveToPoint: CGPointMake(45.5, 33)]; + [bezier8Path addCurveToPoint: CGPointMake(51, 27.5) controlPoint1: CGPointMake(48.54, 33) controlPoint2: CGPointMake(51, 30.54)]; + [bezier8Path addCurveToPoint: CGPointMake(45.5, 22) controlPoint1: CGPointMake(51, 24.46) controlPoint2: CGPointMake(48.54, 22)]; + [bezier8Path addCurveToPoint: CGPointMake(40, 27.5) controlPoint1: CGPointMake(42.46, 22) controlPoint2: CGPointMake(40, 24.46)]; + [bezier8Path addCurveToPoint: CGPointMake(45.5, 33) controlPoint1: CGPointMake(40, 30.54) controlPoint2: CGPointMake(42.46, 33)]; + [bezier8Path closePath]; + bezier8Path.miterLimit = 4; + + bezier8Path.usesEvenOddFillRule = YES; + + [color2 setFill]; + [bezier8Path fill]; + } + } + } + } + + +} +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIJCBVectorArtView.h b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIJCBVectorArtView.h new file mode 100644 index 0000000..bcfb5b3 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIJCBVectorArtView.h @@ -0,0 +1,5 @@ +#import "BTUICardVectorArtView.h" + +@interface BTUIJCBVectorArtView : BTUICardVectorArtView + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIJCBVectorArtView.m b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIJCBVectorArtView.m new file mode 100644 index 0000000..6e3f01b --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIJCBVectorArtView.m @@ -0,0 +1,3831 @@ +#import "BTUIJCBVectorArtView.h" + +@implementation BTUIJCBVectorArtView + +- (void)drawArt { + //// General Declarations + CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); + CGContextRef context = UIGraphicsGetCurrentContext(); + + //// Color Declarations + UIColor* color1 = [UIColor colorWithRed: 0.262 green: 0.646 blue: 0.146 alpha: 1]; + UIColor* color2 = [UIColor colorWithRed: 0.279 green: 0.659 blue: 0.143 alpha: 1]; + UIColor* color3 = [UIColor colorWithRed: 0.041 green: 0.33 blue: 0.659 alpha: 1]; + UIColor* color4 = [UIColor colorWithRed: 0.041 green: 0.341 blue: 0.673 alpha: 1]; + UIColor* color5 = [UIColor colorWithRed: 0.833 green: 0 blue: 0.166 alpha: 1]; + UIColor* color6 = [UIColor colorWithRed: 0.852 green: 0 blue: 0.169 alpha: 1]; + + //// Gradient Declarations + NSArray* linearGradient3Colors = [NSArray arrayWithObjects: + (id)color5.CGColor, + (id)color6.CGColor, nil]; + CGFloat linearGradient3Locations[] = {0, 1}; + CGGradientRef linearGradient3 = CGGradientCreateWithColors(colorSpace, (CFArrayRef)linearGradient3Colors, linearGradient3Locations); + NSArray* linearGradient1Colors = [NSArray arrayWithObjects: + (id)color1.CGColor, + (id)color2.CGColor, nil]; + CGFloat linearGradient1Locations[] = {0, 1}; + CGGradientRef linearGradient1 = CGGradientCreateWithColors(colorSpace, (CFArrayRef)linearGradient1Colors, linearGradient1Locations); + NSArray* linearGradient2Colors = [NSArray arrayWithObjects: + (id)color3.CGColor, + (id)color4.CGColor, nil]; + CGFloat linearGradient2Locations[] = {0, 1}; + CGGradientRef linearGradient2 = CGGradientCreateWithColors(colorSpace, (CFArrayRef)linearGradient2Colors, linearGradient2Locations); + + //// Page-1 + { + //// JCB + { + //// Bezier Drawing + UIBezierPath* bezierPath = [UIBezierPath bezierPath]; + [bezierPath moveToPoint: CGPointMake(55.28, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(55.31, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(55.37, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(55.42, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(55.48, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(55.53, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(55.59, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(55.64, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(55.7, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(55.75, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(55.81, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(55.86, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(55.92, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(55.97, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(56.03, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(56.08, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(56.14, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(56.19, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(56.25, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(56.3, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(56.36, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(56.41, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(56.47, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(56.52, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(56.58, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(56.63, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(56.69, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(56.74, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(56.8, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(56.85, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(56.91, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(56.96, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(57.02, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(57.07, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(57.13, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(57.18, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(57.24, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(57.29, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(57.34, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(57.4, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(57.45, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(57.51, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(57.56, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(57.62, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(57.67, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(57.73, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(57.78, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(57.84, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(57.89, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(57.95, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(58, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(58.06, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(58.11, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(58.17, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(58.22, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(58.28, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(58.33, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(58.39, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(58.44, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(58.5, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(58.55, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(58.6, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(58.61, 27.96)]; + [bezierPath addCurveToPoint: CGPointMake(58.66, 27.96) controlPoint1: CGPointMake(58.63, 27.96) controlPoint2: CGPointMake(58.64, 27.96)]; + [bezierPath addCurveToPoint: CGPointMake(58.72, 27.96) controlPoint1: CGPointMake(58.68, 27.96) controlPoint2: CGPointMake(58.7, 27.96)]; + [bezierPath addCurveToPoint: CGPointMake(58.77, 27.97) controlPoint1: CGPointMake(58.74, 27.96) controlPoint2: CGPointMake(58.75, 27.97)]; + [bezierPath addCurveToPoint: CGPointMake(58.83, 27.97) controlPoint1: CGPointMake(58.79, 27.97) controlPoint2: CGPointMake(58.81, 27.97)]; + [bezierPath addCurveToPoint: CGPointMake(58.88, 27.98) controlPoint1: CGPointMake(58.85, 27.97) controlPoint2: CGPointMake(58.87, 27.98)]; + [bezierPath addCurveToPoint: CGPointMake(58.94, 27.99) controlPoint1: CGPointMake(58.9, 27.98) controlPoint2: CGPointMake(58.92, 27.98)]; + [bezierPath addCurveToPoint: CGPointMake(58.97, 27.99) controlPoint1: CGPointMake(58.95, 27.99) controlPoint2: CGPointMake(58.96, 27.99)]; + [bezierPath addLineToPoint: CGPointMake(58.99, 28)]; + [bezierPath addCurveToPoint: CGPointMake(59.05, 28.01) controlPoint1: CGPointMake(59.01, 28) controlPoint2: CGPointMake(59.03, 28.01)]; + [bezierPath addCurveToPoint: CGPointMake(59.1, 28.03) controlPoint1: CGPointMake(59.07, 28.02) controlPoint2: CGPointMake(59.08, 28.02)]; + [bezierPath addCurveToPoint: CGPointMake(59.16, 28.05) controlPoint1: CGPointMake(59.12, 28.03) controlPoint2: CGPointMake(59.14, 28.04)]; + [bezierPath addCurveToPoint: CGPointMake(59.21, 28.07) controlPoint1: CGPointMake(59.18, 28.05) controlPoint2: CGPointMake(59.19, 28.06)]; + [bezierPath addCurveToPoint: CGPointMake(59.27, 28.09) controlPoint1: CGPointMake(59.23, 28.07) controlPoint2: CGPointMake(59.25, 28.08)]; + [bezierPath addCurveToPoint: CGPointMake(59.32, 28.12) controlPoint1: CGPointMake(59.29, 28.1) controlPoint2: CGPointMake(59.3, 28.11)]; + [bezierPath addCurveToPoint: CGPointMake(59.38, 28.15) controlPoint1: CGPointMake(59.34, 28.13) controlPoint2: CGPointMake(59.36, 28.14)]; + [bezierPath addCurveToPoint: CGPointMake(59.43, 28.18) controlPoint1: CGPointMake(59.4, 28.16) controlPoint2: CGPointMake(59.41, 28.17)]; + [bezierPath addCurveToPoint: CGPointMake(59.49, 28.21) controlPoint1: CGPointMake(59.45, 28.19) controlPoint2: CGPointMake(59.47, 28.2)]; + [bezierPath addCurveToPoint: CGPointMake(59.54, 28.25) controlPoint1: CGPointMake(59.51, 28.23) controlPoint2: CGPointMake(59.52, 28.24)]; + [bezierPath addCurveToPoint: CGPointMake(59.6, 28.29) controlPoint1: CGPointMake(59.56, 28.27) controlPoint2: CGPointMake(59.58, 28.28)]; + [bezierPath addCurveToPoint: CGPointMake(59.65, 28.34) controlPoint1: CGPointMake(59.62, 28.31) controlPoint2: CGPointMake(59.63, 28.33)]; + [bezierPath addCurveToPoint: CGPointMake(59.71, 28.39) controlPoint1: CGPointMake(59.67, 28.36) controlPoint2: CGPointMake(59.69, 28.38)]; + [bezierPath addCurveToPoint: CGPointMake(59.76, 28.45) controlPoint1: CGPointMake(59.73, 28.41) controlPoint2: CGPointMake(59.74, 28.43)]; + [bezierPath addCurveToPoint: CGPointMake(59.82, 28.52) controlPoint1: CGPointMake(59.78, 28.47) controlPoint2: CGPointMake(59.8, 28.49)]; + [bezierPath addCurveToPoint: CGPointMake(59.87, 28.59) controlPoint1: CGPointMake(59.84, 28.54) controlPoint2: CGPointMake(59.85, 28.57)]; + [bezierPath addCurveToPoint: CGPointMake(59.93, 28.68) controlPoint1: CGPointMake(59.89, 28.62) controlPoint2: CGPointMake(59.91, 28.65)]; + [bezierPath addCurveToPoint: CGPointMake(59.98, 28.78) controlPoint1: CGPointMake(59.95, 28.71) controlPoint2: CGPointMake(59.97, 28.74)]; + [bezierPath addCurveToPoint: CGPointMake(60.04, 28.91) controlPoint1: CGPointMake(60, 28.82) controlPoint2: CGPointMake(60.02, 28.86)]; + [bezierPath addCurveToPoint: CGPointMake(60.09, 29.09) controlPoint1: CGPointMake(60.06, 28.96) controlPoint2: CGPointMake(60.08, 29.03)]; + [bezierPath addCurveToPoint: CGPointMake(60.13, 29.43) controlPoint1: CGPointMake(60.12, 29.2) controlPoint2: CGPointMake(60.13, 29.31)]; + [bezierPath addCurveToPoint: CGPointMake(60.09, 29.78) controlPoint1: CGPointMake(60.13, 29.55) controlPoint2: CGPointMake(60.12, 29.67)]; + [bezierPath addCurveToPoint: CGPointMake(60.04, 29.96) controlPoint1: CGPointMake(60.08, 29.84) controlPoint2: CGPointMake(60.06, 29.9)]; + [bezierPath addCurveToPoint: CGPointMake(59.98, 30.09) controlPoint1: CGPointMake(60.02, 30) controlPoint2: CGPointMake(60, 30.05)]; + [bezierPath addCurveToPoint: CGPointMake(59.93, 30.19) controlPoint1: CGPointMake(59.97, 30.12) controlPoint2: CGPointMake(59.95, 30.16)]; + [bezierPath addCurveToPoint: CGPointMake(59.87, 30.27) controlPoint1: CGPointMake(59.91, 30.22) controlPoint2: CGPointMake(59.89, 30.25)]; + [bezierPath addCurveToPoint: CGPointMake(59.82, 30.35) controlPoint1: CGPointMake(59.85, 30.3) controlPoint2: CGPointMake(59.84, 30.32)]; + [bezierPath addCurveToPoint: CGPointMake(59.76, 30.41) controlPoint1: CGPointMake(59.8, 30.37) controlPoint2: CGPointMake(59.78, 30.39)]; + [bezierPath addCurveToPoint: CGPointMake(59.71, 30.47) controlPoint1: CGPointMake(59.74, 30.43) controlPoint2: CGPointMake(59.73, 30.45)]; + [bezierPath addCurveToPoint: CGPointMake(59.65, 30.52) controlPoint1: CGPointMake(59.69, 30.49) controlPoint2: CGPointMake(59.67, 30.51)]; + [bezierPath addCurveToPoint: CGPointMake(59.6, 30.57) controlPoint1: CGPointMake(59.63, 30.54) controlPoint2: CGPointMake(59.62, 30.56)]; + [bezierPath addCurveToPoint: CGPointMake(59.54, 30.61) controlPoint1: CGPointMake(59.58, 30.59) controlPoint2: CGPointMake(59.56, 30.6)]; + [bezierPath addCurveToPoint: CGPointMake(59.49, 30.65) controlPoint1: CGPointMake(59.52, 30.63) controlPoint2: CGPointMake(59.51, 30.64)]; + [bezierPath addCurveToPoint: CGPointMake(59.43, 30.69) controlPoint1: CGPointMake(59.47, 30.66) controlPoint2: CGPointMake(59.45, 30.68)]; + [bezierPath addCurveToPoint: CGPointMake(59.38, 30.72) controlPoint1: CGPointMake(59.41, 30.7) controlPoint2: CGPointMake(59.4, 30.71)]; + [bezierPath addCurveToPoint: CGPointMake(59.32, 30.75) controlPoint1: CGPointMake(59.36, 30.73) controlPoint2: CGPointMake(59.34, 30.74)]; + [bezierPath addCurveToPoint: CGPointMake(59.27, 30.77) controlPoint1: CGPointMake(59.3, 30.76) controlPoint2: CGPointMake(59.29, 30.77)]; + [bezierPath addCurveToPoint: CGPointMake(59.21, 30.8) controlPoint1: CGPointMake(59.25, 30.78) controlPoint2: CGPointMake(59.23, 30.79)]; + [bezierPath addCurveToPoint: CGPointMake(59.16, 30.82) controlPoint1: CGPointMake(59.19, 30.8) controlPoint2: CGPointMake(59.18, 30.81)]; + [bezierPath addCurveToPoint: CGPointMake(59.1, 30.84) controlPoint1: CGPointMake(59.14, 30.82) controlPoint2: CGPointMake(59.12, 30.83)]; + [bezierPath addCurveToPoint: CGPointMake(59.05, 30.85) controlPoint1: CGPointMake(59.08, 30.84) controlPoint2: CGPointMake(59.07, 30.85)]; + [bezierPath addCurveToPoint: CGPointMake(58.99, 30.87) controlPoint1: CGPointMake(59.03, 30.86) controlPoint2: CGPointMake(59.01, 30.86)]; + [bezierPath addLineToPoint: CGPointMake(58.97, 30.87)]; + [bezierPath addCurveToPoint: CGPointMake(58.94, 30.88) controlPoint1: CGPointMake(58.96, 30.87) controlPoint2: CGPointMake(58.95, 30.87)]; + [bezierPath addCurveToPoint: CGPointMake(58.88, 30.88) controlPoint1: CGPointMake(58.92, 30.88) controlPoint2: CGPointMake(58.9, 30.88)]; + [bezierPath addCurveToPoint: CGPointMake(58.83, 30.89) controlPoint1: CGPointMake(58.87, 30.89) controlPoint2: CGPointMake(58.85, 30.89)]; + [bezierPath addCurveToPoint: CGPointMake(58.77, 30.9) controlPoint1: CGPointMake(58.81, 30.89) controlPoint2: CGPointMake(58.79, 30.9)]; + [bezierPath addCurveToPoint: CGPointMake(58.72, 30.9) controlPoint1: CGPointMake(58.75, 30.9) controlPoint2: CGPointMake(58.74, 30.9)]; + [bezierPath addCurveToPoint: CGPointMake(58.66, 30.9) controlPoint1: CGPointMake(58.7, 30.9) controlPoint2: CGPointMake(58.68, 30.9)]; + [bezierPath addCurveToPoint: CGPointMake(58.61, 30.91) controlPoint1: CGPointMake(58.64, 30.91) controlPoint2: CGPointMake(58.63, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(58.58, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(58.55, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(58.5, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(58.44, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(58.39, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(58.33, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(58.28, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(58.22, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(58.17, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(58.11, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(58.06, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(58, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(57.95, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(57.89, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(57.84, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(57.78, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(57.73, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(57.67, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(57.62, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(57.56, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(57.51, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(57.45, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(57.4, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(57.34, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(57.29, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(57.24, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(57.18, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(57.13, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(57.07, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(57.02, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(56.96, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(56.91, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(56.85, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(56.8, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(56.74, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(56.69, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(56.63, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(56.58, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(56.52, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(56.47, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(56.41, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(56.36, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(56.3, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(56.25, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(56.19, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(56.14, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(56.08, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(56.03, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(55.97, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(55.92, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(55.86, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(55.81, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(55.75, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(55.7, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(55.64, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(55.59, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(55.53, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(55.48, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(55.42, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(55.37, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(55.31, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(55.28, 30.91)]; + [bezierPath addLineToPoint: CGPointMake(55.28, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(55.28, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(55.28, 27.96)]; + [bezierPath addLineToPoint: CGPointMake(55.28, 27.96)]; + [bezierPath closePath]; + [bezierPath moveToPoint: CGPointMake(59.71, 24.62)]; + [bezierPath addCurveToPoint: CGPointMake(59.74, 24.93) controlPoint1: CGPointMake(59.73, 24.72) controlPoint2: CGPointMake(59.74, 24.82)]; + [bezierPath addCurveToPoint: CGPointMake(59.71, 25.25) controlPoint1: CGPointMake(59.74, 25.04) controlPoint2: CGPointMake(59.73, 25.15)]; + [bezierPath addCurveToPoint: CGPointMake(59.65, 25.43) controlPoint1: CGPointMake(59.69, 25.31) controlPoint2: CGPointMake(59.67, 25.37)]; + [bezierPath addCurveToPoint: CGPointMake(59.6, 25.55) controlPoint1: CGPointMake(59.64, 25.47) controlPoint2: CGPointMake(59.62, 25.51)]; + [bezierPath addCurveToPoint: CGPointMake(59.54, 25.65) controlPoint1: CGPointMake(59.58, 25.59) controlPoint2: CGPointMake(59.56, 25.62)]; + [bezierPath addCurveToPoint: CGPointMake(59.49, 25.73) controlPoint1: CGPointMake(59.53, 25.68) controlPoint2: CGPointMake(59.51, 25.71)]; + [bezierPath addCurveToPoint: CGPointMake(59.43, 25.8) controlPoint1: CGPointMake(59.47, 25.76) controlPoint2: CGPointMake(59.45, 25.78)]; + [bezierPath addCurveToPoint: CGPointMake(59.38, 25.86) controlPoint1: CGPointMake(59.42, 25.82) controlPoint2: CGPointMake(59.4, 25.84)]; + [bezierPath addCurveToPoint: CGPointMake(59.32, 25.92) controlPoint1: CGPointMake(59.36, 25.88) controlPoint2: CGPointMake(59.34, 25.9)]; + [bezierPath addCurveToPoint: CGPointMake(59.27, 25.96) controlPoint1: CGPointMake(59.31, 25.93) controlPoint2: CGPointMake(59.29, 25.95)]; + [bezierPath addCurveToPoint: CGPointMake(59.21, 26.01) controlPoint1: CGPointMake(59.25, 25.98) controlPoint2: CGPointMake(59.23, 25.99)]; + [bezierPath addCurveToPoint: CGPointMake(59.16, 26.05) controlPoint1: CGPointMake(59.2, 26.02) controlPoint2: CGPointMake(59.18, 26.03)]; + [bezierPath addCurveToPoint: CGPointMake(59.1, 26.08) controlPoint1: CGPointMake(59.14, 26.06) controlPoint2: CGPointMake(59.12, 26.07)]; + [bezierPath addCurveToPoint: CGPointMake(59.05, 26.11) controlPoint1: CGPointMake(59.09, 26.09) controlPoint2: CGPointMake(59.07, 26.1)]; + [bezierPath addCurveToPoint: CGPointMake(58.99, 26.14) controlPoint1: CGPointMake(59.03, 26.12) controlPoint2: CGPointMake(59.01, 26.13)]; + [bezierPath addCurveToPoint: CGPointMake(58.94, 26.17) controlPoint1: CGPointMake(58.98, 26.15) controlPoint2: CGPointMake(58.96, 26.16)]; + [bezierPath addCurveToPoint: CGPointMake(58.88, 26.19) controlPoint1: CGPointMake(58.92, 26.17) controlPoint2: CGPointMake(58.9, 26.18)]; + [bezierPath addCurveToPoint: CGPointMake(58.83, 26.21) controlPoint1: CGPointMake(58.87, 26.2) controlPoint2: CGPointMake(58.85, 26.2)]; + [bezierPath addCurveToPoint: CGPointMake(58.77, 26.23) controlPoint1: CGPointMake(58.81, 26.22) controlPoint2: CGPointMake(58.79, 26.22)]; + [bezierPath addCurveToPoint: CGPointMake(58.72, 26.24) controlPoint1: CGPointMake(58.76, 26.23) controlPoint2: CGPointMake(58.74, 26.24)]; + [bezierPath addCurveToPoint: CGPointMake(58.66, 26.25) controlPoint1: CGPointMake(58.7, 26.25) controlPoint2: CGPointMake(58.68, 26.25)]; + [bezierPath addCurveToPoint: CGPointMake(58.61, 26.27) controlPoint1: CGPointMake(58.65, 26.26) controlPoint2: CGPointMake(58.63, 26.26)]; + [bezierPath addLineToPoint: CGPointMake(58.6, 26.27)]; + [bezierPath addCurveToPoint: CGPointMake(58.55, 26.27) controlPoint1: CGPointMake(58.58, 26.27) controlPoint2: CGPointMake(58.57, 26.27)]; + [bezierPath addCurveToPoint: CGPointMake(58.5, 26.28) controlPoint1: CGPointMake(58.54, 26.28) controlPoint2: CGPointMake(58.52, 26.28)]; + [bezierPath addCurveToPoint: CGPointMake(58.44, 26.28) controlPoint1: CGPointMake(58.48, 26.28) controlPoint2: CGPointMake(58.46, 26.28)]; + [bezierPath addCurveToPoint: CGPointMake(58.39, 26.29) controlPoint1: CGPointMake(58.43, 26.29) controlPoint2: CGPointMake(58.41, 26.29)]; + [bezierPath addCurveToPoint: CGPointMake(58.33, 26.29) controlPoint1: CGPointMake(58.37, 26.29) controlPoint2: CGPointMake(58.35, 26.29)]; + [bezierPath addCurveToPoint: CGPointMake(58.28, 26.29) controlPoint1: CGPointMake(58.32, 26.29) controlPoint2: CGPointMake(58.3, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(58.27, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(58.22, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(58.17, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(58.11, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(58.06, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(58, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(57.95, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(57.89, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(57.84, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(57.78, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(57.73, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(57.67, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(57.62, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(57.56, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(57.51, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(57.46, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(57.4, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(57.35, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(57.29, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(57.24, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(57.18, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(57.13, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(57.07, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(57.02, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(56.96, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(56.91, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(56.85, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(56.8, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(56.74, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(56.69, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(56.63, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(56.58, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(56.52, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(56.47, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(56.41, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(56.36, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(56.3, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(56.25, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(56.19, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(56.14, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(56.08, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(56.03, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(55.97, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(55.92, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(55.86, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(55.81, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(55.75, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(55.7, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(55.64, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(55.59, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(55.53, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(55.48, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(55.42, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(55.37, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(55.31, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(55.28, 26.29)]; + [bezierPath addLineToPoint: CGPointMake(55.28, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(55.31, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(55.37, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(55.42, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(55.48, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(55.53, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(55.59, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(55.64, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(55.7, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(55.75, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(55.81, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(55.86, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(55.92, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(55.97, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(56.03, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(56.08, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(56.14, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(56.19, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(56.25, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(56.3, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(56.36, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(56.41, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(56.47, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(56.52, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(56.58, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(56.63, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(56.69, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(56.74, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(56.8, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(56.85, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(56.91, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(56.96, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(57.02, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(57.07, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(57.13, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(57.18, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(57.24, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(57.29, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(57.35, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(57.4, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(57.46, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(57.51, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(57.56, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(57.62, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(57.67, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(57.73, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(57.78, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(57.84, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(57.89, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(57.95, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(58, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(58.06, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(58.11, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(58.17, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(58.22, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(58.28, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(58.3, 23.57)]; + [bezierPath addLineToPoint: CGPointMake(58.33, 23.57)]; + [bezierPath addCurveToPoint: CGPointMake(58.39, 23.57) controlPoint1: CGPointMake(58.35, 23.57) controlPoint2: CGPointMake(58.37, 23.57)]; + [bezierPath addCurveToPoint: CGPointMake(58.44, 23.58) controlPoint1: CGPointMake(58.41, 23.58) controlPoint2: CGPointMake(58.43, 23.58)]; + [bezierPath addCurveToPoint: CGPointMake(58.5, 23.58) controlPoint1: CGPointMake(58.46, 23.58) controlPoint2: CGPointMake(58.48, 23.58)]; + [bezierPath addCurveToPoint: CGPointMake(58.55, 23.59) controlPoint1: CGPointMake(58.52, 23.59) controlPoint2: CGPointMake(58.54, 23.59)]; + [bezierPath addCurveToPoint: CGPointMake(58.6, 23.59) controlPoint1: CGPointMake(58.57, 23.59) controlPoint2: CGPointMake(58.58, 23.59)]; + [bezierPath addLineToPoint: CGPointMake(58.61, 23.6)]; + [bezierPath addCurveToPoint: CGPointMake(58.66, 23.61) controlPoint1: CGPointMake(58.63, 23.6) controlPoint2: CGPointMake(58.65, 23.6)]; + [bezierPath addCurveToPoint: CGPointMake(58.72, 23.62) controlPoint1: CGPointMake(58.68, 23.61) controlPoint2: CGPointMake(58.7, 23.62)]; + [bezierPath addCurveToPoint: CGPointMake(58.77, 23.64) controlPoint1: CGPointMake(58.74, 23.63) controlPoint2: CGPointMake(58.76, 23.63)]; + [bezierPath addCurveToPoint: CGPointMake(58.83, 23.65) controlPoint1: CGPointMake(58.79, 23.64) controlPoint2: CGPointMake(58.81, 23.65)]; + [bezierPath addCurveToPoint: CGPointMake(58.88, 23.67) controlPoint1: CGPointMake(58.85, 23.66) controlPoint2: CGPointMake(58.87, 23.67)]; + [bezierPath addCurveToPoint: CGPointMake(58.94, 23.7) controlPoint1: CGPointMake(58.9, 23.68) controlPoint2: CGPointMake(58.92, 23.69)]; + [bezierPath addCurveToPoint: CGPointMake(58.99, 23.72) controlPoint1: CGPointMake(58.96, 23.7) controlPoint2: CGPointMake(58.98, 23.71)]; + [bezierPath addCurveToPoint: CGPointMake(59.05, 23.75) controlPoint1: CGPointMake(59.01, 23.73) controlPoint2: CGPointMake(59.03, 23.74)]; + [bezierPath addCurveToPoint: CGPointMake(59.1, 23.78) controlPoint1: CGPointMake(59.07, 23.76) controlPoint2: CGPointMake(59.09, 23.77)]; + [bezierPath addCurveToPoint: CGPointMake(59.16, 23.82) controlPoint1: CGPointMake(59.12, 23.79) controlPoint2: CGPointMake(59.14, 23.8)]; + [bezierPath addCurveToPoint: CGPointMake(59.21, 23.86) controlPoint1: CGPointMake(59.18, 23.83) controlPoint2: CGPointMake(59.2, 23.84)]; + [bezierPath addCurveToPoint: CGPointMake(59.27, 23.9) controlPoint1: CGPointMake(59.23, 23.87) controlPoint2: CGPointMake(59.25, 23.88)]; + [bezierPath addCurveToPoint: CGPointMake(59.32, 23.95) controlPoint1: CGPointMake(59.29, 23.91) controlPoint2: CGPointMake(59.31, 23.93)]; + [bezierPath addCurveToPoint: CGPointMake(59.38, 24) controlPoint1: CGPointMake(59.34, 23.96) controlPoint2: CGPointMake(59.36, 23.98)]; + [bezierPath addCurveToPoint: CGPointMake(59.43, 24.06) controlPoint1: CGPointMake(59.4, 24.02) controlPoint2: CGPointMake(59.42, 24.04)]; + [bezierPath addCurveToPoint: CGPointMake(59.49, 24.13) controlPoint1: CGPointMake(59.45, 24.08) controlPoint2: CGPointMake(59.47, 24.11)]; + [bezierPath addCurveToPoint: CGPointMake(59.54, 24.21) controlPoint1: CGPointMake(59.51, 24.16) controlPoint2: CGPointMake(59.53, 24.18)]; + [bezierPath addCurveToPoint: CGPointMake(59.6, 24.31) controlPoint1: CGPointMake(59.56, 24.24) controlPoint2: CGPointMake(59.58, 24.28)]; + [bezierPath addCurveToPoint: CGPointMake(59.65, 24.43) controlPoint1: CGPointMake(59.62, 24.35) controlPoint2: CGPointMake(59.64, 24.39)]; + [bezierPath addCurveToPoint: CGPointMake(59.71, 24.62) controlPoint1: CGPointMake(59.67, 24.49) controlPoint2: CGPointMake(59.69, 24.55)]; + [bezierPath addCurveToPoint: CGPointMake(59.71, 24.62) controlPoint1: CGPointMake(59.71, 24.62) controlPoint2: CGPointMake(59.69, 24.55)]; + [bezierPath addLineToPoint: CGPointMake(59.71, 24.62)]; + [bezierPath addLineToPoint: CGPointMake(59.71, 24.62)]; + [bezierPath closePath]; + [bezierPath moveToPoint: CGPointMake(66.52, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(66.54, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(66.54, 38.46)]; + [bezierPath addCurveToPoint: CGPointMake(66.52, 38.96) controlPoint1: CGPointMake(66.54, 38.63) controlPoint2: CGPointMake(66.54, 38.79)]; + [bezierPath addCurveToPoint: CGPointMake(66.47, 39.38) controlPoint1: CGPointMake(66.51, 39.1) controlPoint2: CGPointMake(66.49, 39.24)]; + [bezierPath addCurveToPoint: CGPointMake(66.41, 39.66) controlPoint1: CGPointMake(66.45, 39.48) controlPoint2: CGPointMake(66.43, 39.57)]; + [bezierPath addCurveToPoint: CGPointMake(66.36, 39.89) controlPoint1: CGPointMake(66.39, 39.74) controlPoint2: CGPointMake(66.38, 39.81)]; + [bezierPath addCurveToPoint: CGPointMake(66.3, 40.08) controlPoint1: CGPointMake(66.34, 39.95) controlPoint2: CGPointMake(66.32, 40.02)]; + [bezierPath addCurveToPoint: CGPointMake(66.25, 40.25) controlPoint1: CGPointMake(66.28, 40.14) controlPoint2: CGPointMake(66.27, 40.19)]; + [bezierPath addCurveToPoint: CGPointMake(66.19, 40.4) controlPoint1: CGPointMake(66.23, 40.3) controlPoint2: CGPointMake(66.21, 40.35)]; + [bezierPath addCurveToPoint: CGPointMake(66.14, 40.54) controlPoint1: CGPointMake(66.17, 40.45) controlPoint2: CGPointMake(66.16, 40.5)]; + [bezierPath addCurveToPoint: CGPointMake(66.08, 40.67) controlPoint1: CGPointMake(66.12, 40.58) controlPoint2: CGPointMake(66.1, 40.63)]; + [bezierPath addCurveToPoint: CGPointMake(66.03, 40.79) controlPoint1: CGPointMake(66.06, 40.71) controlPoint2: CGPointMake(66.05, 40.75)]; + [bezierPath addCurveToPoint: CGPointMake(65.97, 40.91) controlPoint1: CGPointMake(66.01, 40.83) controlPoint2: CGPointMake(65.99, 40.87)]; + [bezierPath addCurveToPoint: CGPointMake(65.92, 41.01) controlPoint1: CGPointMake(65.95, 40.94) controlPoint2: CGPointMake(65.94, 40.98)]; + [bezierPath addCurveToPoint: CGPointMake(65.86, 41.12) controlPoint1: CGPointMake(65.9, 41.05) controlPoint2: CGPointMake(65.88, 41.08)]; + [bezierPath addCurveToPoint: CGPointMake(65.81, 41.21) controlPoint1: CGPointMake(65.84, 41.15) controlPoint2: CGPointMake(65.83, 41.18)]; + [bezierPath addCurveToPoint: CGPointMake(65.75, 41.31) controlPoint1: CGPointMake(65.79, 41.25) controlPoint2: CGPointMake(65.77, 41.28)]; + [bezierPath addCurveToPoint: CGPointMake(65.7, 41.4) controlPoint1: CGPointMake(65.73, 41.34) controlPoint2: CGPointMake(65.72, 41.37)]; + [bezierPath addCurveToPoint: CGPointMake(65.64, 41.48) controlPoint1: CGPointMake(65.68, 41.43) controlPoint2: CGPointMake(65.66, 41.45)]; + [bezierPath addCurveToPoint: CGPointMake(65.59, 41.56) controlPoint1: CGPointMake(65.62, 41.51) controlPoint2: CGPointMake(65.61, 41.54)]; + [bezierPath addCurveToPoint: CGPointMake(65.53, 41.64) controlPoint1: CGPointMake(65.57, 41.59) controlPoint2: CGPointMake(65.55, 41.62)]; + [bezierPath addCurveToPoint: CGPointMake(65.48, 41.72) controlPoint1: CGPointMake(65.51, 41.67) controlPoint2: CGPointMake(65.5, 41.7)]; + [bezierPath addCurveToPoint: CGPointMake(65.42, 41.79) controlPoint1: CGPointMake(65.46, 41.75) controlPoint2: CGPointMake(65.44, 41.77)]; + [bezierPath addCurveToPoint: CGPointMake(65.37, 41.87) controlPoint1: CGPointMake(65.4, 41.82) controlPoint2: CGPointMake(65.39, 41.84)]; + [bezierPath addCurveToPoint: CGPointMake(65.31, 41.93) controlPoint1: CGPointMake(65.35, 41.89) controlPoint2: CGPointMake(65.33, 41.91)]; + [bezierPath addCurveToPoint: CGPointMake(65.26, 42) controlPoint1: CGPointMake(65.29, 41.96) controlPoint2: CGPointMake(65.28, 41.98)]; + [bezierPath addCurveToPoint: CGPointMake(65.2, 42.07) controlPoint1: CGPointMake(65.24, 42.02) controlPoint2: CGPointMake(65.22, 42.05)]; + [bezierPath addCurveToPoint: CGPointMake(65.15, 42.13) controlPoint1: CGPointMake(65.18, 42.09) controlPoint2: CGPointMake(65.17, 42.11)]; + [bezierPath addCurveToPoint: CGPointMake(65.09, 42.19) controlPoint1: CGPointMake(65.13, 42.15) controlPoint2: CGPointMake(65.11, 42.17)]; + [bezierPath addCurveToPoint: CGPointMake(65.04, 42.25) controlPoint1: CGPointMake(65.07, 42.21) controlPoint2: CGPointMake(65.06, 42.23)]; + [bezierPath addCurveToPoint: CGPointMake(64.98, 42.31) controlPoint1: CGPointMake(65.02, 42.27) controlPoint2: CGPointMake(65, 42.29)]; + [bezierPath addCurveToPoint: CGPointMake(64.93, 42.36) controlPoint1: CGPointMake(64.96, 42.33) controlPoint2: CGPointMake(64.95, 42.35)]; + [bezierPath addCurveToPoint: CGPointMake(64.87, 42.42) controlPoint1: CGPointMake(64.91, 42.38) controlPoint2: CGPointMake(64.89, 42.4)]; + [bezierPath addCurveToPoint: CGPointMake(64.82, 42.47) controlPoint1: CGPointMake(64.85, 42.44) controlPoint2: CGPointMake(64.84, 42.45)]; + [bezierPath addCurveToPoint: CGPointMake(64.76, 42.52) controlPoint1: CGPointMake(64.8, 42.49) controlPoint2: CGPointMake(64.78, 42.51)]; + [bezierPath addCurveToPoint: CGPointMake(64.71, 42.57) controlPoint1: CGPointMake(64.74, 42.54) controlPoint2: CGPointMake(64.73, 42.56)]; + [bezierPath addCurveToPoint: CGPointMake(64.65, 42.62) controlPoint1: CGPointMake(64.69, 42.59) controlPoint2: CGPointMake(64.67, 42.61)]; + [bezierPath addCurveToPoint: CGPointMake(64.6, 42.67) controlPoint1: CGPointMake(64.63, 42.64) controlPoint2: CGPointMake(64.62, 42.66)]; + [bezierPath addCurveToPoint: CGPointMake(64.54, 42.72) controlPoint1: CGPointMake(64.58, 42.69) controlPoint2: CGPointMake(64.56, 42.7)]; + [bezierPath addCurveToPoint: CGPointMake(64.49, 42.76) controlPoint1: CGPointMake(64.52, 42.73) controlPoint2: CGPointMake(64.51, 42.75)]; + [bezierPath addCurveToPoint: CGPointMake(64.43, 42.81) controlPoint1: CGPointMake(64.47, 42.78) controlPoint2: CGPointMake(64.45, 42.79)]; + [bezierPath addCurveToPoint: CGPointMake(64.38, 42.85) controlPoint1: CGPointMake(64.41, 42.82) controlPoint2: CGPointMake(64.4, 42.84)]; + [bezierPath addCurveToPoint: CGPointMake(64.32, 42.89) controlPoint1: CGPointMake(64.36, 42.86) controlPoint2: CGPointMake(64.34, 42.88)]; + [bezierPath addCurveToPoint: CGPointMake(64.27, 42.93) controlPoint1: CGPointMake(64.3, 42.91) controlPoint2: CGPointMake(64.29, 42.92)]; + [bezierPath addCurveToPoint: CGPointMake(64.21, 42.97) controlPoint1: CGPointMake(64.25, 42.95) controlPoint2: CGPointMake(64.23, 42.96)]; + [bezierPath addCurveToPoint: CGPointMake(64.16, 43.01) controlPoint1: CGPointMake(64.19, 42.99) controlPoint2: CGPointMake(64.18, 43)]; + [bezierPath addCurveToPoint: CGPointMake(64.1, 43.05) controlPoint1: CGPointMake(64.14, 43.03) controlPoint2: CGPointMake(64.12, 43.04)]; + [bezierPath addCurveToPoint: CGPointMake(64.05, 43.09) controlPoint1: CGPointMake(64.09, 43.06) controlPoint2: CGPointMake(64.07, 43.08)]; + [bezierPath addCurveToPoint: CGPointMake(63.99, 43.12) controlPoint1: CGPointMake(64.03, 43.1) controlPoint2: CGPointMake(64.01, 43.11)]; + [bezierPath addCurveToPoint: CGPointMake(63.94, 43.16) controlPoint1: CGPointMake(63.98, 43.14) controlPoint2: CGPointMake(63.96, 43.15)]; + [bezierPath addCurveToPoint: CGPointMake(63.88, 43.19) controlPoint1: CGPointMake(63.92, 43.17) controlPoint2: CGPointMake(63.9, 43.18)]; + [bezierPath addCurveToPoint: CGPointMake(63.83, 43.23) controlPoint1: CGPointMake(63.87, 43.21) controlPoint2: CGPointMake(63.85, 43.22)]; + [bezierPath addCurveToPoint: CGPointMake(63.77, 43.26) controlPoint1: CGPointMake(63.81, 43.24) controlPoint2: CGPointMake(63.79, 43.25)]; + [bezierPath addLineToPoint: CGPointMake(63.72, 43.29)]; + [bezierPath addCurveToPoint: CGPointMake(63.66, 43.32) controlPoint1: CGPointMake(63.7, 43.3) controlPoint2: CGPointMake(63.68, 43.31)]; + [bezierPath addCurveToPoint: CGPointMake(63.61, 43.35) controlPoint1: CGPointMake(63.65, 43.33) controlPoint2: CGPointMake(63.63, 43.34)]; + [bezierPath addCurveToPoint: CGPointMake(63.55, 43.38) controlPoint1: CGPointMake(63.59, 43.36) controlPoint2: CGPointMake(63.57, 43.37)]; + [bezierPath addCurveToPoint: CGPointMake(63.5, 43.41) controlPoint1: CGPointMake(63.54, 43.39) controlPoint2: CGPointMake(63.52, 43.4)]; + [bezierPath addCurveToPoint: CGPointMake(63.44, 43.44) controlPoint1: CGPointMake(63.48, 43.42) controlPoint2: CGPointMake(63.46, 43.43)]; + [bezierPath addCurveToPoint: CGPointMake(63.39, 43.47) controlPoint1: CGPointMake(63.43, 43.45) controlPoint2: CGPointMake(63.41, 43.46)]; + [bezierPath addCurveToPoint: CGPointMake(63.33, 43.49) controlPoint1: CGPointMake(63.37, 43.48) controlPoint2: CGPointMake(63.35, 43.49)]; + [bezierPath addCurveToPoint: CGPointMake(63.28, 43.52) controlPoint1: CGPointMake(63.32, 43.5) controlPoint2: CGPointMake(63.3, 43.51)]; + [bezierPath addLineToPoint: CGPointMake(63.22, 43.55)]; + [bezierPath addLineToPoint: CGPointMake(63.17, 43.57)]; + [bezierPath addCurveToPoint: CGPointMake(63.11, 43.59) controlPoint1: CGPointMake(63.15, 43.58) controlPoint2: CGPointMake(63.13, 43.59)]; + [bezierPath addCurveToPoint: CGPointMake(63.06, 43.62) controlPoint1: CGPointMake(63.1, 43.6) controlPoint2: CGPointMake(63.08, 43.61)]; + [bezierPath addCurveToPoint: CGPointMake(63, 43.64) controlPoint1: CGPointMake(63.04, 43.62) controlPoint2: CGPointMake(63.02, 43.63)]; + [bezierPath addCurveToPoint: CGPointMake(62.95, 43.66) controlPoint1: CGPointMake(62.99, 43.65) controlPoint2: CGPointMake(62.97, 43.65)]; + [bezierPath addCurveToPoint: CGPointMake(62.89, 43.68) controlPoint1: CGPointMake(62.93, 43.67) controlPoint2: CGPointMake(62.91, 43.68)]; + [bezierPath addCurveToPoint: CGPointMake(62.84, 43.7) controlPoint1: CGPointMake(62.88, 43.69) controlPoint2: CGPointMake(62.86, 43.7)]; + [bezierPath addLineToPoint: CGPointMake(62.78, 43.72)]; + [bezierPath addCurveToPoint: CGPointMake(62.73, 43.74) controlPoint1: CGPointMake(62.77, 43.73) controlPoint2: CGPointMake(62.75, 43.74)]; + [bezierPath addCurveToPoint: CGPointMake(62.67, 43.76) controlPoint1: CGPointMake(62.71, 43.75) controlPoint2: CGPointMake(62.69, 43.75)]; + [bezierPath addCurveToPoint: CGPointMake(62.62, 43.78) controlPoint1: CGPointMake(62.66, 43.77) controlPoint2: CGPointMake(62.64, 43.77)]; + [bezierPath addLineToPoint: CGPointMake(62.56, 43.8)]; + [bezierPath addCurveToPoint: CGPointMake(62.51, 43.81) controlPoint1: CGPointMake(62.55, 43.8) controlPoint2: CGPointMake(62.53, 43.81)]; + [bezierPath addLineToPoint: CGPointMake(62.45, 43.83)]; + [bezierPath addCurveToPoint: CGPointMake(62.4, 43.84) controlPoint1: CGPointMake(62.44, 43.83) controlPoint2: CGPointMake(62.42, 43.84)]; + [bezierPath addCurveToPoint: CGPointMake(62.34, 43.86) controlPoint1: CGPointMake(62.38, 43.85) controlPoint2: CGPointMake(62.36, 43.85)]; + [bezierPath addCurveToPoint: CGPointMake(62.29, 43.87) controlPoint1: CGPointMake(62.33, 43.86) controlPoint2: CGPointMake(62.31, 43.87)]; + [bezierPath addLineToPoint: CGPointMake(62.24, 43.89)]; + [bezierPath addLineToPoint: CGPointMake(62.18, 43.9)]; + [bezierPath addLineToPoint: CGPointMake(62.13, 43.91)]; + [bezierPath addCurveToPoint: CGPointMake(62.07, 43.92) controlPoint1: CGPointMake(62.11, 43.92) controlPoint2: CGPointMake(62.09, 43.92)]; + [bezierPath addCurveToPoint: CGPointMake(62.02, 43.94) controlPoint1: CGPointMake(62.05, 43.93) controlPoint2: CGPointMake(62.03, 43.93)]; + [bezierPath addLineToPoint: CGPointMake(61.96, 43.95)]; + [bezierPath addLineToPoint: CGPointMake(61.91, 43.96)]; + [bezierPath addCurveToPoint: CGPointMake(61.85, 43.97) controlPoint1: CGPointMake(61.89, 43.96) controlPoint2: CGPointMake(61.87, 43.96)]; + [bezierPath addCurveToPoint: CGPointMake(61.8, 43.98) controlPoint1: CGPointMake(61.83, 43.97) controlPoint2: CGPointMake(61.81, 43.97)]; + [bezierPath addLineToPoint: CGPointMake(61.74, 43.99)]; + [bezierPath addLineToPoint: CGPointMake(61.69, 43.99)]; + [bezierPath addLineToPoint: CGPointMake(61.63, 44)]; + [bezierPath addCurveToPoint: CGPointMake(61.58, 44.01) controlPoint1: CGPointMake(61.61, 44) controlPoint2: CGPointMake(61.59, 44.01)]; + [bezierPath addCurveToPoint: CGPointMake(61.52, 44.01) controlPoint1: CGPointMake(61.56, 44.01) controlPoint2: CGPointMake(61.54, 44.01)]; + [bezierPath addCurveToPoint: CGPointMake(61.47, 44.02) controlPoint1: CGPointMake(61.5, 44.02) controlPoint2: CGPointMake(61.48, 44.02)]; + [bezierPath addCurveToPoint: CGPointMake(61.41, 44.03) controlPoint1: CGPointMake(61.45, 44.02) controlPoint2: CGPointMake(61.43, 44.02)]; + [bezierPath addCurveToPoint: CGPointMake(61.36, 44.03) controlPoint1: CGPointMake(61.39, 44.03) controlPoint2: CGPointMake(61.37, 44.03)]; + [bezierPath addCurveToPoint: CGPointMake(61.3, 44.04) controlPoint1: CGPointMake(61.34, 44.03) controlPoint2: CGPointMake(61.32, 44.03)]; + [bezierPath addCurveToPoint: CGPointMake(61.25, 44.04) controlPoint1: CGPointMake(61.28, 44.04) controlPoint2: CGPointMake(61.26, 44.04)]; + [bezierPath addLineToPoint: CGPointMake(61.19, 44.04)]; + [bezierPath addCurveToPoint: CGPointMake(61.14, 44.05) controlPoint1: CGPointMake(61.17, 44.04) controlPoint2: CGPointMake(61.15, 44.05)]; + [bezierPath addCurveToPoint: CGPointMake(61.08, 44.05) controlPoint1: CGPointMake(61.12, 44.05) controlPoint2: CGPointMake(61.1, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(61.03, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(60.97, 44.05)]; + [bezierPath addCurveToPoint: CGPointMake(60.92, 44.05) controlPoint1: CGPointMake(60.95, 44.05) controlPoint2: CGPointMake(60.93, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(60.86, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(60.85, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(60.81, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(60.75, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(60.7, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(60.64, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(60.59, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(60.53, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(60.48, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(60.42, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(60.37, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(60.31, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(60.26, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(60.2, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(60.15, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(60.09, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(60.04, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(59.98, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(59.93, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(59.87, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(59.82, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(59.76, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(59.71, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(59.65, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(59.6, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(59.54, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(59.49, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(59.43, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(59.38, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(59.32, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(59.27, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(59.21, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(59.16, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(59.1, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(59.05, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(58.99, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(58.94, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(58.88, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(58.83, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(58.77, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(58.72, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(58.66, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(58.61, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(58.55, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(58.5, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(58.44, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(58.39, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(58.33, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(58.28, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(58.22, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(58.17, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(58.11, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(58.06, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(58, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(57.95, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(57.89, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(57.84, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(57.78, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(57.73, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(57.67, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(57.62, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(57.56, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(57.51, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(57.45, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(57.4, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(57.34, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(57.29, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(57.23, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(57.18, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(57.12, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(57.07, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(57.01, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(56.96, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(56.9, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(56.85, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(56.79, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(56.74, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(56.68, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(56.63, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(56.58, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(56.52, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(56.47, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(56.41, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(56.36, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(56.3, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(56.25, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(56.19, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(56.14, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(56.08, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(56.03, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(55.97, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(55.92, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(55.86, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(55.81, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(55.75, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(55.7, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(55.64, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(55.59, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(55.53, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(55.48, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(55.42, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(55.37, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(55.31, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(55.26, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(55.2, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(55.15, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(55.09, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(55.04, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(54.98, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(54.93, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(54.87, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(54.82, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(54.76, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(54.71, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(54.65, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(54.6, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(54.54, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(54.49, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(54.43, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(54.38, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(54.32, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(54.27, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(54.21, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(54.16, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(54.1, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(54.05, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(53.99, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(53.94, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(53.88, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(53.83, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(53.77, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(53.72, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(53.66, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(53.61, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(53.55, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(53.5, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(53.44, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(53.39, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(53.33, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(53.28, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(53.22, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(53.17, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(53.11, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(53.06, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(53, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(52.95, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(52.89, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(52.84, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(52.78, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(52.73, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(52.67, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(52.62, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(52.5, 44.05)]; + [bezierPath addLineToPoint: CGPointMake(52.5, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(52.62, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(52.67, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(52.73, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(52.78, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(52.84, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(52.89, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(52.95, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(53, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(53.06, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(53.11, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(53.17, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(53.22, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(53.28, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(53.33, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(53.39, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(53.44, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(53.5, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(53.55, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(53.61, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(53.66, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(53.72, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(53.77, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(53.83, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(53.88, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(53.94, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(53.99, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(54.05, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(54.1, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(54.16, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(54.21, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(54.27, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(54.32, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(54.38, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(54.43, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(54.49, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(54.54, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(54.6, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(54.65, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(54.71, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(54.76, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(54.82, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(54.87, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(54.93, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(54.98, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(55.04, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(55.09, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(55.15, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(55.2, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(55.26, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(55.31, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(55.37, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(55.42, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(55.48, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(55.53, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(55.59, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(55.64, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(55.7, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(55.75, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(55.81, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(55.86, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(55.92, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(55.97, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(56.03, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(56.08, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(56.14, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(56.19, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(56.25, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(56.3, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(56.36, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(56.41, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(56.47, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(56.52, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(56.58, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(56.63, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(56.68, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(56.74, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(56.79, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(56.85, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(56.9, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(56.96, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(57.01, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(57.07, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(57.12, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(57.18, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(57.23, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(57.29, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(57.34, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(57.4, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(57.45, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(57.51, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(57.56, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(57.62, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(57.67, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(57.73, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(57.78, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(57.84, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(57.89, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(57.95, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(58, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(58.06, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(58.11, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(58.17, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(58.22, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(58.28, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(58.33, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(58.39, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(58.44, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(58.5, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(58.55, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(58.61, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(58.66, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(58.72, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(58.77, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(58.83, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(58.88, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(58.94, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(58.99, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(59.05, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(59.1, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(59.16, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(59.21, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(59.27, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(59.32, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(59.38, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(59.43, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(59.49, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(59.54, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(59.6, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(59.65, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(59.71, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(59.76, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(59.82, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(59.87, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(59.93, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(59.98, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(60.04, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(60.09, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(60.15, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(60.2, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(60.26, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(60.31, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(60.37, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(60.42, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(60.48, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(60.53, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(60.59, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(60.64, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(60.7, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(60.75, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(60.81, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(60.86, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(60.92, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(60.97, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(61.03, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(61.08, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(61.14, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(61.19, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(61.25, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(61.3, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(61.33, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(61.36, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(61.41, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(61.47, 32.65)]; + [bezierPath addCurveToPoint: CGPointMake(61.52, 32.65) controlPoint1: CGPointMake(61.48, 32.65) controlPoint2: CGPointMake(61.5, 32.65)]; + [bezierPath addCurveToPoint: CGPointMake(61.58, 32.65) controlPoint1: CGPointMake(61.54, 32.65) controlPoint2: CGPointMake(61.56, 32.65)]; + [bezierPath addLineToPoint: CGPointMake(61.63, 32.64)]; + [bezierPath addLineToPoint: CGPointMake(61.69, 32.64)]; + [bezierPath addLineToPoint: CGPointMake(61.74, 32.64)]; + [bezierPath addLineToPoint: CGPointMake(61.8, 32.63)]; + [bezierPath addLineToPoint: CGPointMake(61.85, 32.63)]; + [bezierPath addCurveToPoint: CGPointMake(61.91, 32.62) controlPoint1: CGPointMake(61.87, 32.63) controlPoint2: CGPointMake(61.89, 32.63)]; + [bezierPath addCurveToPoint: CGPointMake(61.96, 32.62) controlPoint1: CGPointMake(61.92, 32.62) controlPoint2: CGPointMake(61.94, 32.62)]; + [bezierPath addLineToPoint: CGPointMake(62.02, 32.61)]; + [bezierPath addCurveToPoint: CGPointMake(62.07, 32.6) controlPoint1: CGPointMake(62.03, 32.61) controlPoint2: CGPointMake(62.05, 32.61)]; + [bezierPath addCurveToPoint: CGPointMake(62.13, 32.6) controlPoint1: CGPointMake(62.09, 32.6) controlPoint2: CGPointMake(62.11, 32.6)]; + [bezierPath addCurveToPoint: CGPointMake(62.18, 32.59) controlPoint1: CGPointMake(62.14, 32.59) controlPoint2: CGPointMake(62.16, 32.59)]; + [bezierPath addLineToPoint: CGPointMake(62.24, 32.58)]; + [bezierPath addLineToPoint: CGPointMake(62.29, 32.57)]; + [bezierPath addCurveToPoint: CGPointMake(62.34, 32.56) controlPoint1: CGPointMake(62.31, 32.57) controlPoint2: CGPointMake(62.33, 32.56)]; + [bezierPath addCurveToPoint: CGPointMake(62.4, 32.55) controlPoint1: CGPointMake(62.36, 32.55) controlPoint2: CGPointMake(62.38, 32.55)]; + [bezierPath addLineToPoint: CGPointMake(62.45, 32.54)]; + [bezierPath addCurveToPoint: CGPointMake(62.51, 32.52) controlPoint1: CGPointMake(62.47, 32.53) controlPoint2: CGPointMake(62.49, 32.53)]; + [bezierPath addCurveToPoint: CGPointMake(62.56, 32.51) controlPoint1: CGPointMake(62.53, 32.52) controlPoint2: CGPointMake(62.55, 32.51)]; + [bezierPath addCurveToPoint: CGPointMake(62.62, 32.5) controlPoint1: CGPointMake(62.58, 32.51) controlPoint2: CGPointMake(62.6, 32.5)]; + [bezierPath addCurveToPoint: CGPointMake(62.67, 32.48) controlPoint1: CGPointMake(62.64, 32.49) controlPoint2: CGPointMake(62.66, 32.49)]; + [bezierPath addCurveToPoint: CGPointMake(62.73, 32.47) controlPoint1: CGPointMake(62.69, 32.48) controlPoint2: CGPointMake(62.71, 32.47)]; + [bezierPath addCurveToPoint: CGPointMake(62.78, 32.45) controlPoint1: CGPointMake(62.75, 32.46) controlPoint2: CGPointMake(62.77, 32.46)]; + [bezierPath addLineToPoint: CGPointMake(62.84, 32.43)]; + [bezierPath addCurveToPoint: CGPointMake(62.89, 32.42) controlPoint1: CGPointMake(62.86, 32.43) controlPoint2: CGPointMake(62.88, 32.42)]; + [bezierPath addCurveToPoint: CGPointMake(62.95, 32.4) controlPoint1: CGPointMake(62.91, 32.41) controlPoint2: CGPointMake(62.93, 32.4)]; + [bezierPath addCurveToPoint: CGPointMake(63, 32.38) controlPoint1: CGPointMake(62.97, 32.39) controlPoint2: CGPointMake(62.99, 32.38)]; + [bezierPath addCurveToPoint: CGPointMake(63.06, 32.36) controlPoint1: CGPointMake(63.02, 32.37) controlPoint2: CGPointMake(63.04, 32.36)]; + [bezierPath addCurveToPoint: CGPointMake(63.11, 32.34) controlPoint1: CGPointMake(63.08, 32.35) controlPoint2: CGPointMake(63.1, 32.34)]; + [bezierPath addCurveToPoint: CGPointMake(63.17, 32.31) controlPoint1: CGPointMake(63.13, 32.33) controlPoint2: CGPointMake(63.15, 32.32)]; + [bezierPath addCurveToPoint: CGPointMake(63.22, 32.29) controlPoint1: CGPointMake(63.19, 32.31) controlPoint2: CGPointMake(63.21, 32.3)]; + [bezierPath addCurveToPoint: CGPointMake(63.28, 32.27) controlPoint1: CGPointMake(63.24, 32.28) controlPoint2: CGPointMake(63.26, 32.27)]; + [bezierPath addCurveToPoint: CGPointMake(63.33, 32.24) controlPoint1: CGPointMake(63.3, 32.26) controlPoint2: CGPointMake(63.32, 32.25)]; + [bezierPath addCurveToPoint: CGPointMake(63.39, 32.22) controlPoint1: CGPointMake(63.35, 32.23) controlPoint2: CGPointMake(63.37, 32.22)]; + [bezierPath addCurveToPoint: CGPointMake(63.44, 32.19) controlPoint1: CGPointMake(63.41, 32.21) controlPoint2: CGPointMake(63.43, 32.2)]; + [bezierPath addCurveToPoint: CGPointMake(63.5, 32.16) controlPoint1: CGPointMake(63.46, 32.18) controlPoint2: CGPointMake(63.48, 32.17)]; + [bezierPath addCurveToPoint: CGPointMake(63.55, 32.13) controlPoint1: CGPointMake(63.52, 32.15) controlPoint2: CGPointMake(63.54, 32.14)]; + [bezierPath addCurveToPoint: CGPointMake(63.61, 32.1) controlPoint1: CGPointMake(63.57, 32.12) controlPoint2: CGPointMake(63.59, 32.11)]; + [bezierPath addCurveToPoint: CGPointMake(63.66, 32.06) controlPoint1: CGPointMake(63.63, 32.09) controlPoint2: CGPointMake(63.65, 32.08)]; + [bezierPath addCurveToPoint: CGPointMake(63.72, 32.03) controlPoint1: CGPointMake(63.68, 32.05) controlPoint2: CGPointMake(63.7, 32.04)]; + [bezierPath addCurveToPoint: CGPointMake(63.77, 31.99) controlPoint1: CGPointMake(63.74, 32.02) controlPoint2: CGPointMake(63.76, 32.01)]; + [bezierPath addCurveToPoint: CGPointMake(63.83, 31.96) controlPoint1: CGPointMake(63.79, 31.98) controlPoint2: CGPointMake(63.81, 31.97)]; + [bezierPath addCurveToPoint: CGPointMake(63.88, 31.92) controlPoint1: CGPointMake(63.85, 31.94) controlPoint2: CGPointMake(63.87, 31.93)]; + [bezierPath addCurveToPoint: CGPointMake(63.94, 31.88) controlPoint1: CGPointMake(63.9, 31.9) controlPoint2: CGPointMake(63.92, 31.89)]; + [bezierPath addCurveToPoint: CGPointMake(63.99, 31.83) controlPoint1: CGPointMake(63.96, 31.86) controlPoint2: CGPointMake(63.98, 31.85)]; + [bezierPath addCurveToPoint: CGPointMake(64.05, 31.79) controlPoint1: CGPointMake(64.01, 31.82) controlPoint2: CGPointMake(64.03, 31.8)]; + [bezierPath addCurveToPoint: CGPointMake(64.1, 31.74) controlPoint1: CGPointMake(64.07, 31.77) controlPoint2: CGPointMake(64.09, 31.76)]; + [bezierPath addCurveToPoint: CGPointMake(64.16, 31.69) controlPoint1: CGPointMake(64.12, 31.72) controlPoint2: CGPointMake(64.14, 31.71)]; + [bezierPath addCurveToPoint: CGPointMake(64.21, 31.64) controlPoint1: CGPointMake(64.18, 31.67) controlPoint2: CGPointMake(64.2, 31.66)]; + [bezierPath addCurveToPoint: CGPointMake(64.27, 31.58) controlPoint1: CGPointMake(64.23, 31.62) controlPoint2: CGPointMake(64.25, 31.6)]; + [bezierPath addCurveToPoint: CGPointMake(64.32, 31.52) controlPoint1: CGPointMake(64.29, 31.56) controlPoint2: CGPointMake(64.31, 31.54)]; + [bezierPath addCurveToPoint: CGPointMake(64.38, 31.46) controlPoint1: CGPointMake(64.34, 31.5) controlPoint2: CGPointMake(64.36, 31.48)]; + [bezierPath addCurveToPoint: CGPointMake(64.43, 31.39) controlPoint1: CGPointMake(64.4, 31.44) controlPoint2: CGPointMake(64.42, 31.41)]; + [bezierPath addCurveToPoint: CGPointMake(64.49, 31.32) controlPoint1: CGPointMake(64.45, 31.37) controlPoint2: CGPointMake(64.47, 31.34)]; + [bezierPath addCurveToPoint: CGPointMake(64.54, 31.24) controlPoint1: CGPointMake(64.51, 31.29) controlPoint2: CGPointMake(64.53, 31.27)]; + [bezierPath addCurveToPoint: CGPointMake(64.6, 31.15) controlPoint1: CGPointMake(64.56, 31.21) controlPoint2: CGPointMake(64.58, 31.18)]; + [bezierPath addCurveToPoint: CGPointMake(64.65, 31.06) controlPoint1: CGPointMake(64.62, 31.12) controlPoint2: CGPointMake(64.64, 31.09)]; + [bezierPath addCurveToPoint: CGPointMake(64.71, 30.95) controlPoint1: CGPointMake(64.67, 31.02) controlPoint2: CGPointMake(64.69, 30.99)]; + [bezierPath addCurveToPoint: CGPointMake(64.76, 30.83) controlPoint1: CGPointMake(64.73, 30.91) controlPoint2: CGPointMake(64.75, 30.87)]; + [bezierPath addCurveToPoint: CGPointMake(64.82, 30.68) controlPoint1: CGPointMake(64.78, 30.78) controlPoint2: CGPointMake(64.8, 30.73)]; + [bezierPath addCurveToPoint: CGPointMake(64.87, 30.5) controlPoint1: CGPointMake(64.84, 30.62) controlPoint2: CGPointMake(64.86, 30.56)]; + [bezierPath addCurveToPoint: CGPointMake(64.93, 30.22) controlPoint1: CGPointMake(64.9, 30.41) controlPoint2: CGPointMake(64.91, 30.31)]; + [bezierPath addCurveToPoint: CGPointMake(64.95, 29.86) controlPoint1: CGPointMake(64.94, 30.1) controlPoint2: CGPointMake(64.95, 29.98)]; + [bezierPath addCurveToPoint: CGPointMake(64.93, 29.51) controlPoint1: CGPointMake(64.95, 29.74) controlPoint2: CGPointMake(64.94, 29.62)]; + [bezierPath addCurveToPoint: CGPointMake(64.87, 29.24) controlPoint1: CGPointMake(64.91, 29.42) controlPoint2: CGPointMake(64.9, 29.32)]; + [bezierPath addCurveToPoint: CGPointMake(64.82, 29.06) controlPoint1: CGPointMake(64.86, 29.18) controlPoint2: CGPointMake(64.84, 29.12)]; + [bezierPath addCurveToPoint: CGPointMake(64.76, 28.92) controlPoint1: CGPointMake(64.8, 29.01) controlPoint2: CGPointMake(64.78, 28.97)]; + [bezierPath addCurveToPoint: CGPointMake(64.71, 28.8) controlPoint1: CGPointMake(64.75, 28.88) controlPoint2: CGPointMake(64.73, 28.84)]; + [bezierPath addCurveToPoint: CGPointMake(64.65, 28.7) controlPoint1: CGPointMake(64.69, 28.77) controlPoint2: CGPointMake(64.67, 28.73)]; + [bezierPath addCurveToPoint: CGPointMake(64.6, 28.61) controlPoint1: CGPointMake(64.64, 28.67) controlPoint2: CGPointMake(64.62, 28.64)]; + [bezierPath addCurveToPoint: CGPointMake(64.54, 28.52) controlPoint1: CGPointMake(64.58, 28.58) controlPoint2: CGPointMake(64.56, 28.55)]; + [bezierPath addCurveToPoint: CGPointMake(64.49, 28.45) controlPoint1: CGPointMake(64.53, 28.5) controlPoint2: CGPointMake(64.51, 28.47)]; + [bezierPath addCurveToPoint: CGPointMake(64.43, 28.38) controlPoint1: CGPointMake(64.47, 28.42) controlPoint2: CGPointMake(64.45, 28.4)]; + [bezierPath addCurveToPoint: CGPointMake(64.38, 28.31) controlPoint1: CGPointMake(64.42, 28.36) controlPoint2: CGPointMake(64.4, 28.33)]; + [bezierPath addCurveToPoint: CGPointMake(64.32, 28.25) controlPoint1: CGPointMake(64.36, 28.29) controlPoint2: CGPointMake(64.34, 28.27)]; + [bezierPath addCurveToPoint: CGPointMake(64.27, 28.19) controlPoint1: CGPointMake(64.31, 28.23) controlPoint2: CGPointMake(64.29, 28.21)]; + [bezierPath addCurveToPoint: CGPointMake(64.21, 28.14) controlPoint1: CGPointMake(64.25, 28.17) controlPoint2: CGPointMake(64.23, 28.16)]; + [bezierPath addCurveToPoint: CGPointMake(64.16, 28.09) controlPoint1: CGPointMake(64.2, 28.12) controlPoint2: CGPointMake(64.18, 28.1)]; + [bezierPath addCurveToPoint: CGPointMake(64.1, 28.04) controlPoint1: CGPointMake(64.14, 28.07) controlPoint2: CGPointMake(64.12, 28.06)]; + [bezierPath addCurveToPoint: CGPointMake(64.05, 27.99) controlPoint1: CGPointMake(64.09, 28.02) controlPoint2: CGPointMake(64.07, 28.01)]; + [bezierPath addCurveToPoint: CGPointMake(63.99, 27.95) controlPoint1: CGPointMake(64.03, 27.98) controlPoint2: CGPointMake(64.01, 27.96)]; + [bezierPath addCurveToPoint: CGPointMake(63.94, 27.91) controlPoint1: CGPointMake(63.98, 27.94) controlPoint2: CGPointMake(63.96, 27.92)]; + [bezierPath addCurveToPoint: CGPointMake(63.88, 27.87) controlPoint1: CGPointMake(63.92, 27.89) controlPoint2: CGPointMake(63.9, 27.88)]; + [bezierPath addCurveToPoint: CGPointMake(63.83, 27.83) controlPoint1: CGPointMake(63.87, 27.86) controlPoint2: CGPointMake(63.85, 27.84)]; + [bezierPath addCurveToPoint: CGPointMake(63.77, 27.79) controlPoint1: CGPointMake(63.81, 27.82) controlPoint2: CGPointMake(63.79, 27.81)]; + [bezierPath addCurveToPoint: CGPointMake(63.72, 27.76) controlPoint1: CGPointMake(63.76, 27.78) controlPoint2: CGPointMake(63.74, 27.77)]; + [bezierPath addCurveToPoint: CGPointMake(63.66, 27.73) controlPoint1: CGPointMake(63.7, 27.75) controlPoint2: CGPointMake(63.68, 27.74)]; + [bezierPath addCurveToPoint: CGPointMake(63.61, 27.69) controlPoint1: CGPointMake(63.65, 27.72) controlPoint2: CGPointMake(63.63, 27.71)]; + [bezierPath addCurveToPoint: CGPointMake(63.55, 27.66) controlPoint1: CGPointMake(63.59, 27.68) controlPoint2: CGPointMake(63.57, 27.67)]; + [bezierPath addCurveToPoint: CGPointMake(63.5, 27.64) controlPoint1: CGPointMake(63.54, 27.65) controlPoint2: CGPointMake(63.52, 27.64)]; + [bezierPath addCurveToPoint: CGPointMake(63.44, 27.61) controlPoint1: CGPointMake(63.48, 27.63) controlPoint2: CGPointMake(63.46, 27.62)]; + [bezierPath addCurveToPoint: CGPointMake(63.39, 27.58) controlPoint1: CGPointMake(63.43, 27.6) controlPoint2: CGPointMake(63.41, 27.59)]; + [bezierPath addCurveToPoint: CGPointMake(63.33, 27.55) controlPoint1: CGPointMake(63.37, 27.57) controlPoint2: CGPointMake(63.35, 27.56)]; + [bezierPath addCurveToPoint: CGPointMake(63.28, 27.53) controlPoint1: CGPointMake(63.32, 27.55) controlPoint2: CGPointMake(63.3, 27.54)]; + [bezierPath addCurveToPoint: CGPointMake(63.22, 27.51) controlPoint1: CGPointMake(63.26, 27.52) controlPoint2: CGPointMake(63.24, 27.51)]; + [bezierPath addCurveToPoint: CGPointMake(63.17, 27.48) controlPoint1: CGPointMake(63.21, 27.5) controlPoint2: CGPointMake(63.19, 27.49)]; + [bezierPath addCurveToPoint: CGPointMake(63.11, 27.46) controlPoint1: CGPointMake(63.15, 27.48) controlPoint2: CGPointMake(63.13, 27.47)]; + [bezierPath addCurveToPoint: CGPointMake(63.06, 27.44) controlPoint1: CGPointMake(63.1, 27.46) controlPoint2: CGPointMake(63.08, 27.45)]; + [bezierPath addCurveToPoint: CGPointMake(63, 27.42) controlPoint1: CGPointMake(63.04, 27.43) controlPoint2: CGPointMake(63.02, 27.43)]; + [bezierPath addCurveToPoint: CGPointMake(62.95, 27.4) controlPoint1: CGPointMake(62.99, 27.42) controlPoint2: CGPointMake(62.97, 27.41)]; + [bezierPath addCurveToPoint: CGPointMake(62.89, 27.38) controlPoint1: CGPointMake(62.93, 27.4) controlPoint2: CGPointMake(62.91, 27.39)]; + [bezierPath addCurveToPoint: CGPointMake(62.84, 27.37) controlPoint1: CGPointMake(62.88, 27.38) controlPoint2: CGPointMake(62.86, 27.37)]; + [bezierPath addCurveToPoint: CGPointMake(62.78, 27.35) controlPoint1: CGPointMake(62.82, 27.36) controlPoint2: CGPointMake(62.8, 27.36)]; + [bezierPath addLineToPoint: CGPointMake(62.73, 27.34)]; + [bezierPath addCurveToPoint: CGPointMake(62.67, 27.32) controlPoint1: CGPointMake(62.71, 27.33) controlPoint2: CGPointMake(62.69, 27.32)]; + [bezierPath addCurveToPoint: CGPointMake(62.62, 27.31) controlPoint1: CGPointMake(62.66, 27.31) controlPoint2: CGPointMake(62.64, 27.31)]; + [bezierPath addCurveToPoint: CGPointMake(62.56, 27.29) controlPoint1: CGPointMake(62.6, 27.3) controlPoint2: CGPointMake(62.58, 27.3)]; + [bezierPath addCurveToPoint: CGPointMake(62.51, 27.28) controlPoint1: CGPointMake(62.55, 27.29) controlPoint2: CGPointMake(62.53, 27.28)]; + [bezierPath addCurveToPoint: CGPointMake(62.45, 27.27) controlPoint1: CGPointMake(62.49, 27.27) controlPoint2: CGPointMake(62.47, 27.27)]; + [bezierPath addCurveToPoint: CGPointMake(62.4, 27.26) controlPoint1: CGPointMake(62.44, 27.26) controlPoint2: CGPointMake(62.42, 27.26)]; + [bezierPath addCurveToPoint: CGPointMake(62.34, 27.24) controlPoint1: CGPointMake(62.38, 27.25) controlPoint2: CGPointMake(62.36, 27.25)]; + [bezierPath addLineToPoint: CGPointMake(62.29, 27.23)]; + [bezierPath addLineToPoint: CGPointMake(62.24, 27.22)]; + [bezierPath addCurveToPoint: CGPointMake(62.18, 27.21) controlPoint1: CGPointMake(62.22, 27.22) controlPoint2: CGPointMake(62.2, 27.22)]; + [bezierPath addLineToPoint: CGPointMake(62.13, 27.21)]; + [bezierPath addCurveToPoint: CGPointMake(62.07, 27.2) controlPoint1: CGPointMake(62.11, 27.2) controlPoint2: CGPointMake(62.09, 27.2)]; + [bezierPath addLineToPoint: CGPointMake(62.02, 27.19)]; + [bezierPath addLineToPoint: CGPointMake(61.96, 27.18)]; + [bezierPath addLineToPoint: CGPointMake(61.91, 27.18)]; + [bezierPath addLineToPoint: CGPointMake(61.85, 27.17)]; + [bezierPath addLineToPoint: CGPointMake(61.8, 27.17)]; + [bezierPath addLineToPoint: CGPointMake(61.74, 27.16)]; + [bezierPath addLineToPoint: CGPointMake(61.69, 27.16)]; + [bezierPath addLineToPoint: CGPointMake(61.69, 27.09)]; + [bezierPath addLineToPoint: CGPointMake(61.74, 27.09)]; + [bezierPath addLineToPoint: CGPointMake(61.8, 27.08)]; + [bezierPath addCurveToPoint: CGPointMake(61.85, 27.07) controlPoint1: CGPointMake(61.81, 27.07) controlPoint2: CGPointMake(61.83, 27.07)]; + [bezierPath addLineToPoint: CGPointMake(61.91, 27.06)]; + [bezierPath addCurveToPoint: CGPointMake(61.96, 27.05) controlPoint1: CGPointMake(61.92, 27.05) controlPoint2: CGPointMake(61.94, 27.05)]; + [bezierPath addLineToPoint: CGPointMake(62.02, 27.04)]; + [bezierPath addCurveToPoint: CGPointMake(62.07, 27.02) controlPoint1: CGPointMake(62.03, 27.03) controlPoint2: CGPointMake(62.05, 27.03)]; + [bezierPath addCurveToPoint: CGPointMake(62.13, 27.01) controlPoint1: CGPointMake(62.09, 27.02) controlPoint2: CGPointMake(62.11, 27.01)]; + [bezierPath addCurveToPoint: CGPointMake(62.18, 27) controlPoint1: CGPointMake(62.14, 27) controlPoint2: CGPointMake(62.16, 27)]; + [bezierPath addCurveToPoint: CGPointMake(62.24, 26.98) controlPoint1: CGPointMake(62.2, 26.99) controlPoint2: CGPointMake(62.22, 26.99)]; + [bezierPath addCurveToPoint: CGPointMake(62.29, 26.96) controlPoint1: CGPointMake(62.25, 26.97) controlPoint2: CGPointMake(62.27, 26.97)]; + [bezierPath addCurveToPoint: CGPointMake(62.34, 26.95) controlPoint1: CGPointMake(62.31, 26.96) controlPoint2: CGPointMake(62.33, 26.95)]; + [bezierPath addCurveToPoint: CGPointMake(62.4, 26.93) controlPoint1: CGPointMake(62.36, 26.94) controlPoint2: CGPointMake(62.38, 26.94)]; + [bezierPath addCurveToPoint: CGPointMake(62.45, 26.91) controlPoint1: CGPointMake(62.42, 26.92) controlPoint2: CGPointMake(62.44, 26.92)]; + [bezierPath addCurveToPoint: CGPointMake(62.51, 26.89) controlPoint1: CGPointMake(62.47, 26.9) controlPoint2: CGPointMake(62.49, 26.9)]; + [bezierPath addCurveToPoint: CGPointMake(62.56, 26.87) controlPoint1: CGPointMake(62.53, 26.88) controlPoint2: CGPointMake(62.55, 26.88)]; + [bezierPath addCurveToPoint: CGPointMake(62.62, 26.85) controlPoint1: CGPointMake(62.58, 26.86) controlPoint2: CGPointMake(62.6, 26.86)]; + [bezierPath addCurveToPoint: CGPointMake(62.67, 26.83) controlPoint1: CGPointMake(62.64, 26.84) controlPoint2: CGPointMake(62.66, 26.83)]; + [bezierPath addCurveToPoint: CGPointMake(62.73, 26.8) controlPoint1: CGPointMake(62.69, 26.82) controlPoint2: CGPointMake(62.71, 26.81)]; + [bezierPath addCurveToPoint: CGPointMake(62.78, 26.78) controlPoint1: CGPointMake(62.75, 26.79) controlPoint2: CGPointMake(62.77, 26.78)]; + [bezierPath addCurveToPoint: CGPointMake(62.84, 26.75) controlPoint1: CGPointMake(62.8, 26.77) controlPoint2: CGPointMake(62.82, 26.76)]; + [bezierPath addCurveToPoint: CGPointMake(62.89, 26.72) controlPoint1: CGPointMake(62.86, 26.74) controlPoint2: CGPointMake(62.88, 26.73)]; + [bezierPath addCurveToPoint: CGPointMake(62.95, 26.69) controlPoint1: CGPointMake(62.91, 26.71) controlPoint2: CGPointMake(62.93, 26.7)]; + [bezierPath addCurveToPoint: CGPointMake(63, 26.66) controlPoint1: CGPointMake(62.97, 26.68) controlPoint2: CGPointMake(62.99, 26.67)]; + [bezierPath addCurveToPoint: CGPointMake(63.06, 26.63) controlPoint1: CGPointMake(63.02, 26.65) controlPoint2: CGPointMake(63.04, 26.64)]; + [bezierPath addCurveToPoint: CGPointMake(63.11, 26.6) controlPoint1: CGPointMake(63.08, 26.62) controlPoint2: CGPointMake(63.1, 26.61)]; + [bezierPath addCurveToPoint: CGPointMake(63.17, 26.56) controlPoint1: CGPointMake(63.13, 26.58) controlPoint2: CGPointMake(63.15, 26.57)]; + [bezierPath addCurveToPoint: CGPointMake(63.22, 26.52) controlPoint1: CGPointMake(63.19, 26.55) controlPoint2: CGPointMake(63.21, 26.53)]; + [bezierPath addCurveToPoint: CGPointMake(63.28, 26.48) controlPoint1: CGPointMake(63.24, 26.51) controlPoint2: CGPointMake(63.26, 26.5)]; + [bezierPath addCurveToPoint: CGPointMake(63.33, 26.44) controlPoint1: CGPointMake(63.3, 26.47) controlPoint2: CGPointMake(63.32, 26.46)]; + [bezierPath addCurveToPoint: CGPointMake(63.39, 26.4) controlPoint1: CGPointMake(63.35, 26.43) controlPoint2: CGPointMake(63.37, 26.41)]; + [bezierPath addCurveToPoint: CGPointMake(63.44, 26.35) controlPoint1: CGPointMake(63.41, 26.38) controlPoint2: CGPointMake(63.43, 26.37)]; + [bezierPath addCurveToPoint: CGPointMake(63.5, 26.3) controlPoint1: CGPointMake(63.46, 26.34) controlPoint2: CGPointMake(63.48, 26.32)]; + [bezierPath addCurveToPoint: CGPointMake(63.55, 26.25) controlPoint1: CGPointMake(63.52, 26.29) controlPoint2: CGPointMake(63.54, 26.27)]; + [bezierPath addCurveToPoint: CGPointMake(63.61, 26.2) controlPoint1: CGPointMake(63.57, 26.23) controlPoint2: CGPointMake(63.59, 26.21)]; + [bezierPath addCurveToPoint: CGPointMake(63.66, 26.14) controlPoint1: CGPointMake(63.63, 26.18) controlPoint2: CGPointMake(63.65, 26.16)]; + [bezierPath addCurveToPoint: CGPointMake(63.72, 26.07) controlPoint1: CGPointMake(63.68, 26.12) controlPoint2: CGPointMake(63.7, 26.1)]; + [bezierPath addCurveToPoint: CGPointMake(63.77, 26.01) controlPoint1: CGPointMake(63.74, 26.05) controlPoint2: CGPointMake(63.76, 26.03)]; + [bezierPath addCurveToPoint: CGPointMake(63.83, 25.94) controlPoint1: CGPointMake(63.79, 25.98) controlPoint2: CGPointMake(63.81, 25.96)]; + [bezierPath addCurveToPoint: CGPointMake(63.88, 25.86) controlPoint1: CGPointMake(63.85, 25.91) controlPoint2: CGPointMake(63.87, 25.88)]; + [bezierPath addCurveToPoint: CGPointMake(63.94, 25.77) controlPoint1: CGPointMake(63.9, 25.83) controlPoint2: CGPointMake(63.92, 25.8)]; + [bezierPath addCurveToPoint: CGPointMake(63.99, 25.68) controlPoint1: CGPointMake(63.96, 25.74) controlPoint2: CGPointMake(63.98, 25.71)]; + [bezierPath addCurveToPoint: CGPointMake(64.05, 25.57) controlPoint1: CGPointMake(64.01, 25.64) controlPoint2: CGPointMake(64.03, 25.6)]; + [bezierPath addCurveToPoint: CGPointMake(64.1, 25.45) controlPoint1: CGPointMake(64.07, 25.53) controlPoint2: CGPointMake(64.09, 25.49)]; + [bezierPath addCurveToPoint: CGPointMake(64.16, 25.3) controlPoint1: CGPointMake(64.12, 25.4) controlPoint2: CGPointMake(64.14, 25.35)]; + [bezierPath addCurveToPoint: CGPointMake(64.21, 25.11) controlPoint1: CGPointMake(64.18, 25.24) controlPoint2: CGPointMake(64.2, 25.17)]; + [bezierPath addCurveToPoint: CGPointMake(64.27, 24.79) controlPoint1: CGPointMake(64.24, 25) controlPoint2: CGPointMake(64.26, 24.9)]; + [bezierPath addCurveToPoint: CGPointMake(64.28, 24.53) controlPoint1: CGPointMake(64.28, 24.7) controlPoint2: CGPointMake(64.28, 24.62)]; + [bezierPath addCurveToPoint: CGPointMake(64.27, 24.26) controlPoint1: CGPointMake(64.28, 24.43) controlPoint2: CGPointMake(64.28, 24.34)]; + [bezierPath addCurveToPoint: CGPointMake(64.21, 23.93) controlPoint1: CGPointMake(64.26, 24.14) controlPoint2: CGPointMake(64.24, 24.04)]; + [bezierPath addCurveToPoint: CGPointMake(64.16, 23.74) controlPoint1: CGPointMake(64.2, 23.87) controlPoint2: CGPointMake(64.18, 23.8)]; + [bezierPath addCurveToPoint: CGPointMake(64.1, 23.59) controlPoint1: CGPointMake(64.14, 23.69) controlPoint2: CGPointMake(64.12, 23.64)]; + [bezierPath addCurveToPoint: CGPointMake(64.05, 23.47) controlPoint1: CGPointMake(64.09, 23.55) controlPoint2: CGPointMake(64.07, 23.51)]; + [bezierPath addCurveToPoint: CGPointMake(63.99, 23.36) controlPoint1: CGPointMake(64.03, 23.43) controlPoint2: CGPointMake(64.01, 23.4)]; + [bezierPath addCurveToPoint: CGPointMake(63.94, 23.27) controlPoint1: CGPointMake(63.98, 23.33) controlPoint2: CGPointMake(63.96, 23.3)]; + [bezierPath addCurveToPoint: CGPointMake(63.88, 23.19) controlPoint1: CGPointMake(63.92, 23.24) controlPoint2: CGPointMake(63.9, 23.22)]; + [bezierPath addCurveToPoint: CGPointMake(63.83, 23.11) controlPoint1: CGPointMake(63.87, 23.16) controlPoint2: CGPointMake(63.85, 23.14)]; + [bezierPath addCurveToPoint: CGPointMake(63.77, 23.04) controlPoint1: CGPointMake(63.81, 23.09) controlPoint2: CGPointMake(63.79, 23.06)]; + [bezierPath addCurveToPoint: CGPointMake(63.72, 22.98) controlPoint1: CGPointMake(63.76, 23.02) controlPoint2: CGPointMake(63.74, 23)]; + [bezierPath addCurveToPoint: CGPointMake(63.66, 22.92) controlPoint1: CGPointMake(63.7, 22.96) controlPoint2: CGPointMake(63.68, 22.94)]; + [bezierPath addCurveToPoint: CGPointMake(63.61, 22.86) controlPoint1: CGPointMake(63.65, 22.9) controlPoint2: CGPointMake(63.63, 22.88)]; + [bezierPath addCurveToPoint: CGPointMake(63.55, 22.81) controlPoint1: CGPointMake(63.59, 22.84) controlPoint2: CGPointMake(63.57, 22.82)]; + [bezierPath addCurveToPoint: CGPointMake(63.5, 22.76) controlPoint1: CGPointMake(63.54, 22.79) controlPoint2: CGPointMake(63.52, 22.77)]; + [bezierPath addCurveToPoint: CGPointMake(63.44, 22.71) controlPoint1: CGPointMake(63.48, 22.74) controlPoint2: CGPointMake(63.46, 22.72)]; + [bezierPath addCurveToPoint: CGPointMake(63.39, 22.66) controlPoint1: CGPointMake(63.43, 22.69) controlPoint2: CGPointMake(63.41, 22.68)]; + [bezierPath addCurveToPoint: CGPointMake(63.33, 22.62) controlPoint1: CGPointMake(63.37, 22.65) controlPoint2: CGPointMake(63.35, 22.64)]; + [bezierPath addCurveToPoint: CGPointMake(63.28, 22.58) controlPoint1: CGPointMake(63.32, 22.61) controlPoint2: CGPointMake(63.3, 22.6)]; + [bezierPath addCurveToPoint: CGPointMake(63.22, 22.54) controlPoint1: CGPointMake(63.26, 22.57) controlPoint2: CGPointMake(63.24, 22.56)]; + [bezierPath addCurveToPoint: CGPointMake(63.17, 22.51) controlPoint1: CGPointMake(63.21, 22.53) controlPoint2: CGPointMake(63.19, 22.52)]; + [bezierPath addCurveToPoint: CGPointMake(63.11, 22.47) controlPoint1: CGPointMake(63.15, 22.5) controlPoint2: CGPointMake(63.13, 22.49)]; + [bezierPath addCurveToPoint: CGPointMake(63.06, 22.44) controlPoint1: CGPointMake(63.1, 22.46) controlPoint2: CGPointMake(63.08, 22.45)]; + [bezierPath addCurveToPoint: CGPointMake(63, 22.41) controlPoint1: CGPointMake(63.04, 22.43) controlPoint2: CGPointMake(63.02, 22.42)]; + [bezierPath addCurveToPoint: CGPointMake(62.95, 22.38) controlPoint1: CGPointMake(62.99, 22.4) controlPoint2: CGPointMake(62.97, 22.39)]; + [bezierPath addCurveToPoint: CGPointMake(62.89, 22.35) controlPoint1: CGPointMake(62.93, 22.37) controlPoint2: CGPointMake(62.91, 22.36)]; + [bezierPath addCurveToPoint: CGPointMake(62.84, 22.33) controlPoint1: CGPointMake(62.88, 22.34) controlPoint2: CGPointMake(62.86, 22.33)]; + [bezierPath addCurveToPoint: CGPointMake(62.78, 22.3) controlPoint1: CGPointMake(62.82, 22.32) controlPoint2: CGPointMake(62.8, 22.31)]; + [bezierPath addCurveToPoint: CGPointMake(62.73, 22.27) controlPoint1: CGPointMake(62.77, 22.29) controlPoint2: CGPointMake(62.75, 22.28)]; + [bezierPath addCurveToPoint: CGPointMake(62.67, 22.25) controlPoint1: CGPointMake(62.71, 22.27) controlPoint2: CGPointMake(62.69, 22.26)]; + [bezierPath addCurveToPoint: CGPointMake(62.62, 22.23) controlPoint1: CGPointMake(62.66, 22.24) controlPoint2: CGPointMake(62.64, 22.24)]; + [bezierPath addCurveToPoint: CGPointMake(62.56, 22.21) controlPoint1: CGPointMake(62.6, 22.22) controlPoint2: CGPointMake(62.58, 22.21)]; + [bezierPath addCurveToPoint: CGPointMake(62.51, 22.19) controlPoint1: CGPointMake(62.55, 22.2) controlPoint2: CGPointMake(62.53, 22.19)]; + [bezierPath addCurveToPoint: CGPointMake(62.45, 22.17) controlPoint1: CGPointMake(62.49, 22.18) controlPoint2: CGPointMake(62.47, 22.17)]; + [bezierPath addCurveToPoint: CGPointMake(62.4, 22.15) controlPoint1: CGPointMake(62.44, 22.16) controlPoint2: CGPointMake(62.42, 22.16)]; + [bezierPath addCurveToPoint: CGPointMake(62.34, 22.13) controlPoint1: CGPointMake(62.38, 22.14) controlPoint2: CGPointMake(62.36, 22.14)]; + [bezierPath addCurveToPoint: CGPointMake(62.29, 22.11) controlPoint1: CGPointMake(62.33, 22.13) controlPoint2: CGPointMake(62.31, 22.12)]; + [bezierPath addCurveToPoint: CGPointMake(62.24, 22.1) controlPoint1: CGPointMake(62.27, 22.11) controlPoint2: CGPointMake(62.25, 22.1)]; + [bezierPath addCurveToPoint: CGPointMake(62.18, 22.08) controlPoint1: CGPointMake(62.22, 22.09) controlPoint2: CGPointMake(62.2, 22.09)]; + [bezierPath addCurveToPoint: CGPointMake(62.13, 22.07) controlPoint1: CGPointMake(62.16, 22.08) controlPoint2: CGPointMake(62.14, 22.07)]; + [bezierPath addLineToPoint: CGPointMake(62.07, 22.06)]; + [bezierPath addCurveToPoint: CGPointMake(62.02, 22.04) controlPoint1: CGPointMake(62.05, 22.05) controlPoint2: CGPointMake(62.03, 22.05)]; + [bezierPath addCurveToPoint: CGPointMake(61.96, 22.03) controlPoint1: CGPointMake(62, 22.04) controlPoint2: CGPointMake(61.98, 22.03)]; + [bezierPath addLineToPoint: CGPointMake(61.91, 22.02)]; + [bezierPath addCurveToPoint: CGPointMake(61.85, 22.01) controlPoint1: CGPointMake(61.89, 22.01) controlPoint2: CGPointMake(61.87, 22.01)]; + [bezierPath addCurveToPoint: CGPointMake(61.8, 22) controlPoint1: CGPointMake(61.83, 22) controlPoint2: CGPointMake(61.81, 22)]; + [bezierPath addLineToPoint: CGPointMake(61.74, 21.99)]; + [bezierPath addCurveToPoint: CGPointMake(61.69, 21.98) controlPoint1: CGPointMake(61.72, 21.99) controlPoint2: CGPointMake(61.7, 21.98)]; + [bezierPath addLineToPoint: CGPointMake(61.63, 21.97)]; + [bezierPath addLineToPoint: CGPointMake(61.58, 21.96)]; + [bezierPath addLineToPoint: CGPointMake(61.52, 21.96)]; + [bezierPath addLineToPoint: CGPointMake(61.47, 21.95)]; + [bezierPath addLineToPoint: CGPointMake(61.41, 21.94)]; + [bezierPath addLineToPoint: CGPointMake(61.36, 21.94)]; + [bezierPath addLineToPoint: CGPointMake(61.3, 21.93)]; + [bezierPath addLineToPoint: CGPointMake(61.25, 21.93)]; + [bezierPath addLineToPoint: CGPointMake(61.19, 21.93)]; + [bezierPath addLineToPoint: CGPointMake(61.14, 21.92)]; + [bezierPath addLineToPoint: CGPointMake(61.11, 21.92)]; + [bezierPath addLineToPoint: CGPointMake(61.08, 21.92)]; + [bezierPath addLineToPoint: CGPointMake(61.03, 21.92)]; + [bezierPath addLineToPoint: CGPointMake(60.97, 21.91)]; + [bezierPath addLineToPoint: CGPointMake(60.92, 21.91)]; + [bezierPath addLineToPoint: CGPointMake(60.86, 21.91)]; + [bezierPath addLineToPoint: CGPointMake(60.81, 21.91)]; + [bezierPath addLineToPoint: CGPointMake(60.75, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(60.7, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(60.64, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(60.59, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(60.56, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(60.53, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(60.48, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(60.42, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(60.37, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(60.31, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(60.26, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(60.2, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(60.15, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(60.09, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(60.04, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(59.98, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(59.93, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(59.87, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(59.82, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(59.76, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(59.71, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(59.65, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(59.6, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(59.54, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(59.49, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(59.43, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(59.38, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(59.32, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(59.27, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(59.21, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(59.16, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(59.1, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(59.05, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(58.99, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(58.94, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(58.88, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(58.83, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(58.77, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(58.72, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(58.66, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(58.61, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(58.55, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(58.5, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(58.44, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(58.39, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(58.33, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(58.28, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(58.22, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(58.17, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(58.11, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(58.06, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(58, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(57.95, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(57.89, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(57.84, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(57.78, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(57.73, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(57.67, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(57.62, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(57.56, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(57.51, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(57.45, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(57.4, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(57.34, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(57.29, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(57.23, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(57.18, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(57.12, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(57.07, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(57.01, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(56.96, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(56.9, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(56.85, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(56.79, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(56.74, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(56.68, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(56.63, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(56.58, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(56.52, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(56.47, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(56.41, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(56.36, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(56.3, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(56.25, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(56.19, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(56.14, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(56.08, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(56.03, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(55.97, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(55.92, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(55.86, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(55.81, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(55.75, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(55.7, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(55.64, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(55.59, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(55.53, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(55.48, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(55.42, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(55.37, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(55.31, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(55.26, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(55.2, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(55.15, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(55.09, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(55.04, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(54.98, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(54.93, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(54.87, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(54.82, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(54.76, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(54.71, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(54.65, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(54.6, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(54.54, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(54.49, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(54.43, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(54.38, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(54.32, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(54.27, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(54.21, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(54.16, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(54.1, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(54.05, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(53.99, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(53.94, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(53.88, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(53.83, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(53.77, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(53.72, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(53.66, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(53.61, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(53.55, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(53.5, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(53.44, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(53.39, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(53.33, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(53.28, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(53.22, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(53.17, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(53.11, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(53.06, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(53, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(52.95, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(52.89, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(52.84, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(52.78, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(52.73, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(52.67, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(52.62, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(52.5, 21.9)]; + [bezierPath addLineToPoint: CGPointMake(52.5, 16.09)]; + [bezierPath addCurveToPoint: CGPointMake(52.62, 14.95) controlPoint1: CGPointMake(52.5, 15.7) controlPoint2: CGPointMake(52.54, 15.32)]; + [bezierPath addCurveToPoint: CGPointMake(52.67, 14.72) controlPoint1: CGPointMake(52.64, 14.87) controlPoint2: CGPointMake(52.65, 14.8)]; + [bezierPath addCurveToPoint: CGPointMake(52.73, 14.52) controlPoint1: CGPointMake(52.69, 14.65) controlPoint2: CGPointMake(52.71, 14.59)]; + [bezierPath addCurveToPoint: CGPointMake(52.78, 14.35) controlPoint1: CGPointMake(52.75, 14.46) controlPoint2: CGPointMake(52.76, 14.4)]; + [bezierPath addCurveToPoint: CGPointMake(52.84, 14.19) controlPoint1: CGPointMake(52.8, 14.29) controlPoint2: CGPointMake(52.82, 14.24)]; + [bezierPath addCurveToPoint: CGPointMake(52.89, 14.05) controlPoint1: CGPointMake(52.86, 14.14) controlPoint2: CGPointMake(52.87, 14.09)]; + [bezierPath addCurveToPoint: CGPointMake(52.95, 13.91) controlPoint1: CGPointMake(52.91, 14) controlPoint2: CGPointMake(52.93, 13.96)]; + [bezierPath addCurveToPoint: CGPointMake(53, 13.79) controlPoint1: CGPointMake(52.97, 13.87) controlPoint2: CGPointMake(52.98, 13.83)]; + [bezierPath addCurveToPoint: CGPointMake(53.06, 13.68) controlPoint1: CGPointMake(53.02, 13.75) controlPoint2: CGPointMake(53.04, 13.71)]; + [bezierPath addCurveToPoint: CGPointMake(53.11, 13.57) controlPoint1: CGPointMake(53.08, 13.64) controlPoint2: CGPointMake(53.09, 13.6)]; + [bezierPath addCurveToPoint: CGPointMake(53.17, 13.46) controlPoint1: CGPointMake(53.13, 13.53) controlPoint2: CGPointMake(53.15, 13.5)]; + [bezierPath addCurveToPoint: CGPointMake(53.22, 13.36) controlPoint1: CGPointMake(53.19, 13.43) controlPoint2: CGPointMake(53.2, 13.4)]; + [bezierPath addCurveToPoint: CGPointMake(53.28, 13.27) controlPoint1: CGPointMake(53.24, 13.33) controlPoint2: CGPointMake(53.26, 13.3)]; + [bezierPath addCurveToPoint: CGPointMake(53.33, 13.18) controlPoint1: CGPointMake(53.3, 13.24) controlPoint2: CGPointMake(53.31, 13.21)]; + [bezierPath addCurveToPoint: CGPointMake(53.39, 13.09) controlPoint1: CGPointMake(53.35, 13.15) controlPoint2: CGPointMake(53.37, 13.12)]; + [bezierPath addCurveToPoint: CGPointMake(53.44, 13.01) controlPoint1: CGPointMake(53.41, 13.06) controlPoint2: CGPointMake(53.42, 13.04)]; + [bezierPath addCurveToPoint: CGPointMake(53.5, 12.93) controlPoint1: CGPointMake(53.46, 12.98) controlPoint2: CGPointMake(53.48, 12.96)]; + [bezierPath addCurveToPoint: CGPointMake(53.55, 12.85) controlPoint1: CGPointMake(53.52, 12.9) controlPoint2: CGPointMake(53.53, 12.88)]; + [bezierPath addCurveToPoint: CGPointMake(53.61, 12.78) controlPoint1: CGPointMake(53.57, 12.83) controlPoint2: CGPointMake(53.59, 12.8)]; + [bezierPath addCurveToPoint: CGPointMake(53.66, 12.71) controlPoint1: CGPointMake(53.63, 12.75) controlPoint2: CGPointMake(53.64, 12.73)]; + [bezierPath addCurveToPoint: CGPointMake(53.72, 12.64) controlPoint1: CGPointMake(53.68, 12.68) controlPoint2: CGPointMake(53.7, 12.66)]; + [bezierPath addCurveToPoint: CGPointMake(53.77, 12.57) controlPoint1: CGPointMake(53.74, 12.61) controlPoint2: CGPointMake(53.75, 12.59)]; + [bezierPath addCurveToPoint: CGPointMake(53.83, 12.5) controlPoint1: CGPointMake(53.79, 12.55) controlPoint2: CGPointMake(53.81, 12.53)]; + [bezierPath addCurveToPoint: CGPointMake(53.88, 12.44) controlPoint1: CGPointMake(53.85, 12.48) controlPoint2: CGPointMake(53.86, 12.46)]; + [bezierPath addCurveToPoint: CGPointMake(53.94, 12.38) controlPoint1: CGPointMake(53.9, 12.42) controlPoint2: CGPointMake(53.92, 12.4)]; + [bezierPath addCurveToPoint: CGPointMake(53.99, 12.32) controlPoint1: CGPointMake(53.96, 12.36) controlPoint2: CGPointMake(53.97, 12.34)]; + [bezierPath addCurveToPoint: CGPointMake(54.05, 12.26) controlPoint1: CGPointMake(54.01, 12.3) controlPoint2: CGPointMake(54.03, 12.28)]; + [bezierPath addCurveToPoint: CGPointMake(54.1, 12.2) controlPoint1: CGPointMake(54.07, 12.24) controlPoint2: CGPointMake(54.08, 12.22)]; + [bezierPath addCurveToPoint: CGPointMake(54.16, 12.15) controlPoint1: CGPointMake(54.12, 12.19) controlPoint2: CGPointMake(54.14, 12.17)]; + [bezierPath addCurveToPoint: CGPointMake(54.21, 12.1) controlPoint1: CGPointMake(54.18, 12.13) controlPoint2: CGPointMake(54.19, 12.11)]; + [bezierPath addCurveToPoint: CGPointMake(54.27, 12.04) controlPoint1: CGPointMake(54.23, 12.08) controlPoint2: CGPointMake(54.25, 12.06)]; + [bezierPath addCurveToPoint: CGPointMake(54.32, 11.99) controlPoint1: CGPointMake(54.29, 12.03) controlPoint2: CGPointMake(54.3, 12.01)]; + [bezierPath addCurveToPoint: CGPointMake(54.38, 11.94) controlPoint1: CGPointMake(54.34, 11.98) controlPoint2: CGPointMake(54.36, 11.96)]; + [bezierPath addCurveToPoint: CGPointMake(54.43, 11.89) controlPoint1: CGPointMake(54.4, 11.93) controlPoint2: CGPointMake(54.41, 11.91)]; + [bezierPath addCurveToPoint: CGPointMake(54.49, 11.85) controlPoint1: CGPointMake(54.45, 11.88) controlPoint2: CGPointMake(54.47, 11.86)]; + [bezierPath addCurveToPoint: CGPointMake(54.54, 11.8) controlPoint1: CGPointMake(54.51, 11.83) controlPoint2: CGPointMake(54.52, 11.82)]; + [bezierPath addCurveToPoint: CGPointMake(54.6, 11.76) controlPoint1: CGPointMake(54.56, 11.79) controlPoint2: CGPointMake(54.58, 11.77)]; + [bezierPath addCurveToPoint: CGPointMake(54.65, 11.71) controlPoint1: CGPointMake(54.62, 11.74) controlPoint2: CGPointMake(54.63, 11.73)]; + [bezierPath addLineToPoint: CGPointMake(54.71, 11.67)]; + [bezierPath addLineToPoint: CGPointMake(54.76, 11.63)]; + [bezierPath addCurveToPoint: CGPointMake(54.82, 11.59) controlPoint1: CGPointMake(54.78, 11.62) controlPoint2: CGPointMake(54.8, 11.6)]; + [bezierPath addCurveToPoint: CGPointMake(54.87, 11.55) controlPoint1: CGPointMake(54.83, 11.58) controlPoint2: CGPointMake(54.85, 11.56)]; + [bezierPath addLineToPoint: CGPointMake(54.93, 11.51)]; + [bezierPath addCurveToPoint: CGPointMake(54.98, 11.47) controlPoint1: CGPointMake(54.94, 11.5) controlPoint2: CGPointMake(54.96, 11.49)]; + [bezierPath addLineToPoint: CGPointMake(55.04, 11.44)]; + [bezierPath addLineToPoint: CGPointMake(55.09, 11.4)]; + [bezierPath addCurveToPoint: CGPointMake(55.15, 11.37) controlPoint1: CGPointMake(55.11, 11.39) controlPoint2: CGPointMake(55.13, 11.38)]; + [bezierPath addLineToPoint: CGPointMake(55.2, 11.33)]; + [bezierPath addCurveToPoint: CGPointMake(55.26, 11.3) controlPoint1: CGPointMake(55.22, 11.32) controlPoint2: CGPointMake(55.24, 11.31)]; + [bezierPath addCurveToPoint: CGPointMake(55.31, 11.27) controlPoint1: CGPointMake(55.27, 11.29) controlPoint2: CGPointMake(55.29, 11.28)]; + [bezierPath addCurveToPoint: CGPointMake(55.37, 11.24) controlPoint1: CGPointMake(55.33, 11.26) controlPoint2: CGPointMake(55.35, 11.25)]; + [bezierPath addCurveToPoint: CGPointMake(55.42, 11.21) controlPoint1: CGPointMake(55.38, 11.23) controlPoint2: CGPointMake(55.4, 11.22)]; + [bezierPath addCurveToPoint: CGPointMake(55.48, 11.18) controlPoint1: CGPointMake(55.44, 11.2) controlPoint2: CGPointMake(55.46, 11.19)]; + [bezierPath addCurveToPoint: CGPointMake(55.53, 11.15) controlPoint1: CGPointMake(55.49, 11.17) controlPoint2: CGPointMake(55.51, 11.16)]; + [bezierPath addCurveToPoint: CGPointMake(55.59, 11.12) controlPoint1: CGPointMake(55.55, 11.14) controlPoint2: CGPointMake(55.57, 11.13)]; + [bezierPath addCurveToPoint: CGPointMake(55.64, 11.09) controlPoint1: CGPointMake(55.6, 11.11) controlPoint2: CGPointMake(55.62, 11.1)]; + [bezierPath addCurveToPoint: CGPointMake(55.7, 11.07) controlPoint1: CGPointMake(55.66, 11.08) controlPoint2: CGPointMake(55.68, 11.07)]; + [bezierPath addLineToPoint: CGPointMake(55.75, 11.04)]; + [bezierPath addCurveToPoint: CGPointMake(55.81, 11.01) controlPoint1: CGPointMake(55.77, 11.03) controlPoint2: CGPointMake(55.79, 11.02)]; + [bezierPath addCurveToPoint: CGPointMake(55.86, 10.99) controlPoint1: CGPointMake(55.82, 11.01) controlPoint2: CGPointMake(55.84, 11)]; + [bezierPath addCurveToPoint: CGPointMake(55.92, 10.97) controlPoint1: CGPointMake(55.88, 10.98) controlPoint2: CGPointMake(55.9, 10.97)]; + [bezierPath addCurveToPoint: CGPointMake(55.97, 10.94) controlPoint1: CGPointMake(55.93, 10.96) controlPoint2: CGPointMake(55.95, 10.95)]; + [bezierPath addCurveToPoint: CGPointMake(56.03, 10.92) controlPoint1: CGPointMake(55.99, 10.93) controlPoint2: CGPointMake(56.01, 10.93)]; + [bezierPath addCurveToPoint: CGPointMake(56.08, 10.9) controlPoint1: CGPointMake(56.04, 10.91) controlPoint2: CGPointMake(56.06, 10.91)]; + [bezierPath addLineToPoint: CGPointMake(56.14, 10.88)]; + [bezierPath addLineToPoint: CGPointMake(56.19, 10.86)]; + [bezierPath addCurveToPoint: CGPointMake(56.25, 10.84) controlPoint1: CGPointMake(56.21, 10.85) controlPoint2: CGPointMake(56.23, 10.84)]; + [bezierPath addCurveToPoint: CGPointMake(56.3, 10.82) controlPoint1: CGPointMake(56.26, 10.83) controlPoint2: CGPointMake(56.28, 10.82)]; + [bezierPath addCurveToPoint: CGPointMake(56.36, 10.8) controlPoint1: CGPointMake(56.32, 10.81) controlPoint2: CGPointMake(56.34, 10.8)]; + [bezierPath addCurveToPoint: CGPointMake(56.41, 10.78) controlPoint1: CGPointMake(56.37, 10.79) controlPoint2: CGPointMake(56.39, 10.79)]; + [bezierPath addLineToPoint: CGPointMake(56.47, 10.76)]; + [bezierPath addCurveToPoint: CGPointMake(56.52, 10.75) controlPoint1: CGPointMake(56.48, 10.76) controlPoint2: CGPointMake(56.5, 10.75)]; + [bezierPath addCurveToPoint: CGPointMake(56.58, 10.73) controlPoint1: CGPointMake(56.54, 10.74) controlPoint2: CGPointMake(56.56, 10.73)]; + [bezierPath addCurveToPoint: CGPointMake(56.63, 10.71) controlPoint1: CGPointMake(56.59, 10.72) controlPoint2: CGPointMake(56.61, 10.72)]; + [bezierPath addCurveToPoint: CGPointMake(56.68, 10.7) controlPoint1: CGPointMake(56.65, 10.71) controlPoint2: CGPointMake(56.67, 10.7)]; + [bezierPath addCurveToPoint: CGPointMake(56.74, 10.68) controlPoint1: CGPointMake(56.7, 10.69) controlPoint2: CGPointMake(56.72, 10.69)]; + [bezierPath addLineToPoint: CGPointMake(56.79, 10.67)]; + [bezierPath addCurveToPoint: CGPointMake(56.85, 10.66) controlPoint1: CGPointMake(56.81, 10.67) controlPoint2: CGPointMake(56.83, 10.66)]; + [bezierPath addCurveToPoint: CGPointMake(56.9, 10.64) controlPoint1: CGPointMake(56.87, 10.65) controlPoint2: CGPointMake(56.89, 10.65)]; + [bezierPath addCurveToPoint: CGPointMake(56.96, 10.63) controlPoint1: CGPointMake(56.92, 10.64) controlPoint2: CGPointMake(56.94, 10.64)]; + [bezierPath addLineToPoint: CGPointMake(57.01, 10.62)]; + [bezierPath addLineToPoint: CGPointMake(57.07, 10.61)]; + [bezierPath addCurveToPoint: CGPointMake(57.12, 10.6) controlPoint1: CGPointMake(57.09, 10.61) controlPoint2: CGPointMake(57.11, 10.6)]; + [bezierPath addCurveToPoint: CGPointMake(57.18, 10.59) controlPoint1: CGPointMake(57.14, 10.6) controlPoint2: CGPointMake(57.16, 10.59)]; + [bezierPath addCurveToPoint: CGPointMake(57.23, 10.58) controlPoint1: CGPointMake(57.2, 10.59) controlPoint2: CGPointMake(57.22, 10.58)]; + [bezierPath addLineToPoint: CGPointMake(57.29, 10.57)]; + [bezierPath addCurveToPoint: CGPointMake(57.34, 10.56) controlPoint1: CGPointMake(57.31, 10.57) controlPoint2: CGPointMake(57.33, 10.56)]; + [bezierPath addCurveToPoint: CGPointMake(57.4, 10.55) controlPoint1: CGPointMake(57.36, 10.56) controlPoint2: CGPointMake(57.38, 10.56)]; + [bezierPath addCurveToPoint: CGPointMake(57.45, 10.55) controlPoint1: CGPointMake(57.42, 10.55) controlPoint2: CGPointMake(57.44, 10.55)]; + [bezierPath addCurveToPoint: CGPointMake(57.51, 10.54) controlPoint1: CGPointMake(57.47, 10.54) controlPoint2: CGPointMake(57.49, 10.54)]; + [bezierPath addLineToPoint: CGPointMake(57.56, 10.53)]; + [bezierPath addCurveToPoint: CGPointMake(57.62, 10.53) controlPoint1: CGPointMake(57.58, 10.53) controlPoint2: CGPointMake(57.6, 10.53)]; + [bezierPath addCurveToPoint: CGPointMake(57.67, 10.52) controlPoint1: CGPointMake(57.64, 10.53) controlPoint2: CGPointMake(57.66, 10.52)]; + [bezierPath addLineToPoint: CGPointMake(57.73, 10.52)]; + [bezierPath addLineToPoint: CGPointMake(57.78, 10.51)]; + [bezierPath addCurveToPoint: CGPointMake(57.84, 10.51) controlPoint1: CGPointMake(57.8, 10.51) controlPoint2: CGPointMake(57.82, 10.51)]; + [bezierPath addCurveToPoint: CGPointMake(57.89, 10.51) controlPoint1: CGPointMake(57.86, 10.51) controlPoint2: CGPointMake(57.88, 10.51)]; + [bezierPath addCurveToPoint: CGPointMake(57.95, 10.51) controlPoint1: CGPointMake(57.91, 10.51) controlPoint2: CGPointMake(57.93, 10.51)]; + [bezierPath addLineToPoint: CGPointMake(58, 10.5)]; + [bezierPath addCurveToPoint: CGPointMake(58.06, 10.5) controlPoint1: CGPointMake(58.02, 10.5) controlPoint2: CGPointMake(58.04, 10.5)]; + [bezierPath addCurveToPoint: CGPointMake(58.11, 10.5) controlPoint1: CGPointMake(58.08, 10.5) controlPoint2: CGPointMake(58.1, 10.5)]; + [bezierPath addCurveToPoint: CGPointMake(58.17, 10.5) controlPoint1: CGPointMake(58.13, 10.5) controlPoint2: CGPointMake(58.15, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(58.18, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(58.22, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(58.28, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(58.33, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(58.39, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(58.44, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(58.5, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(58.55, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(58.61, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(58.66, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(58.72, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(58.77, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(58.83, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(58.88, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(58.94, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(58.99, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(59.05, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(59.1, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(59.16, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(59.21, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(59.27, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(59.32, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(59.38, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(59.43, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(59.49, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(59.54, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(59.6, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(59.65, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(59.71, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(59.76, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(59.82, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(59.87, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(59.93, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(59.98, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(60.04, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(60.09, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(60.15, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(60.2, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(60.26, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(60.31, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(60.37, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(60.42, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(60.48, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(60.53, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(60.59, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(60.64, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(60.7, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(60.75, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(60.81, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(60.86, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(60.92, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(60.97, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(61.03, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(61.08, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(61.14, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(61.19, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(61.25, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(61.3, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(61.36, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(61.41, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(61.47, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(61.52, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(61.58, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(61.63, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(61.69, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(61.74, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(61.8, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(61.85, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(61.91, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(61.96, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(62.02, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(62.07, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(62.13, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(62.18, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(62.24, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(62.29, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(62.34, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(62.4, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(62.45, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(62.51, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(62.56, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(62.62, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(62.67, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(62.73, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(62.78, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(62.84, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(62.89, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(62.95, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(63, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(63.06, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(63.11, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(63.17, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(63.22, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(63.28, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(63.33, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(63.39, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(63.44, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(63.5, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(63.55, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(63.61, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(63.66, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(63.72, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(63.77, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(63.83, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(63.88, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(63.94, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(63.99, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(64.05, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(64.1, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(64.16, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(64.21, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(64.27, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(64.32, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(64.38, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(64.43, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(64.49, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(64.54, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(64.6, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(64.65, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(64.71, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(64.76, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(64.82, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(64.87, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(64.93, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(64.98, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(65.04, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(65.09, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(65.15, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(65.2, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(65.26, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(65.31, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(65.37, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(65.42, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(65.48, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(65.53, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(65.59, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(65.64, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(65.7, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(65.75, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(65.81, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(65.86, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(65.92, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(65.97, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(66.03, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(66.08, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(66.14, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(66.19, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(66.25, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(66.3, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(66.36, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(66.41, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(66.47, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(66.52, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(66.52, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(66.52, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(66.52, 10.5)]; + [bezierPath addLineToPoint: CGPointMake(66.52, 10.5)]; + [bezierPath closePath]; + bezierPath.miterLimit = 4; + + bezierPath.usesEvenOddFillRule = YES; + + CGContextSaveGState(context); + [bezierPath addClip]; + CGContextDrawLinearGradient(context, linearGradient1, + CGPointMake(52.5, 27.28), + CGPointMake(66.54, 27.28), + kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation); + CGContextRestoreGState(context); + + + //// Bezier 2 Drawing + UIBezierPath* bezier2Path = [UIBezierPath bezierPath]; + [bezier2Path moveToPoint: CGPointMake(20.62, 29.96)]; + [bezier2Path addCurveToPoint: CGPointMake(20.5, 29.9) controlPoint1: CGPointMake(20.58, 29.94) controlPoint2: CGPointMake(20.54, 29.92)]; + [bezier2Path addLineToPoint: CGPointMake(20.5, 16.09)]; + [bezier2Path addCurveToPoint: CGPointMake(20.62, 14.96) controlPoint1: CGPointMake(20.5, 15.7) controlPoint2: CGPointMake(20.54, 15.32)]; + [bezier2Path addCurveToPoint: CGPointMake(20.67, 14.72) controlPoint1: CGPointMake(20.63, 14.88) controlPoint2: CGPointMake(20.65, 14.8)]; + [bezier2Path addCurveToPoint: CGPointMake(20.73, 14.52) controlPoint1: CGPointMake(20.69, 14.65) controlPoint2: CGPointMake(20.71, 14.59)]; + [bezier2Path addCurveToPoint: CGPointMake(20.78, 14.35) controlPoint1: CGPointMake(20.74, 14.47) controlPoint2: CGPointMake(20.76, 14.41)]; + [bezier2Path addCurveToPoint: CGPointMake(20.84, 14.19) controlPoint1: CGPointMake(20.8, 14.3) controlPoint2: CGPointMake(20.82, 14.24)]; + [bezier2Path addCurveToPoint: CGPointMake(20.89, 14.05) controlPoint1: CGPointMake(20.85, 14.14) controlPoint2: CGPointMake(20.87, 14.1)]; + [bezier2Path addCurveToPoint: CGPointMake(20.95, 13.92) controlPoint1: CGPointMake(20.91, 14) controlPoint2: CGPointMake(20.93, 13.96)]; + [bezier2Path addCurveToPoint: CGPointMake(21, 13.79) controlPoint1: CGPointMake(20.96, 13.88) controlPoint2: CGPointMake(20.98, 13.83)]; + [bezier2Path addCurveToPoint: CGPointMake(21.06, 13.68) controlPoint1: CGPointMake(21.02, 13.75) controlPoint2: CGPointMake(21.04, 13.72)]; + [bezier2Path addCurveToPoint: CGPointMake(21.11, 13.57) controlPoint1: CGPointMake(21.07, 13.64) controlPoint2: CGPointMake(21.09, 13.61)]; + [bezier2Path addCurveToPoint: CGPointMake(21.17, 13.47) controlPoint1: CGPointMake(21.13, 13.53) controlPoint2: CGPointMake(21.15, 13.5)]; + [bezier2Path addCurveToPoint: CGPointMake(21.22, 13.37) controlPoint1: CGPointMake(21.18, 13.43) controlPoint2: CGPointMake(21.2, 13.4)]; + [bezier2Path addCurveToPoint: CGPointMake(21.28, 13.27) controlPoint1: CGPointMake(21.24, 13.34) controlPoint2: CGPointMake(21.26, 13.3)]; + [bezier2Path addCurveToPoint: CGPointMake(21.33, 13.18) controlPoint1: CGPointMake(21.29, 13.24) controlPoint2: CGPointMake(21.31, 13.21)]; + [bezier2Path addCurveToPoint: CGPointMake(21.39, 13.1) controlPoint1: CGPointMake(21.35, 13.15) controlPoint2: CGPointMake(21.37, 13.12)]; + [bezier2Path addCurveToPoint: CGPointMake(21.44, 13.01) controlPoint1: CGPointMake(21.4, 13.07) controlPoint2: CGPointMake(21.42, 13.04)]; + [bezier2Path addCurveToPoint: CGPointMake(21.5, 12.93) controlPoint1: CGPointMake(21.46, 12.99) controlPoint2: CGPointMake(21.48, 12.96)]; + [bezier2Path addCurveToPoint: CGPointMake(21.55, 12.86) controlPoint1: CGPointMake(21.51, 12.91) controlPoint2: CGPointMake(21.53, 12.88)]; + [bezier2Path addCurveToPoint: CGPointMake(21.61, 12.78) controlPoint1: CGPointMake(21.57, 12.83) controlPoint2: CGPointMake(21.59, 12.81)]; + [bezier2Path addCurveToPoint: CGPointMake(21.66, 12.71) controlPoint1: CGPointMake(21.62, 12.76) controlPoint2: CGPointMake(21.64, 12.73)]; + [bezier2Path addCurveToPoint: CGPointMake(21.71, 12.64) controlPoint1: CGPointMake(21.68, 12.69) controlPoint2: CGPointMake(21.7, 12.66)]; + [bezier2Path addCurveToPoint: CGPointMake(21.77, 12.57) controlPoint1: CGPointMake(21.73, 12.62) controlPoint2: CGPointMake(21.75, 12.59)]; + [bezier2Path addCurveToPoint: CGPointMake(21.82, 12.51) controlPoint1: CGPointMake(21.79, 12.55) controlPoint2: CGPointMake(21.81, 12.53)]; + [bezier2Path addCurveToPoint: CGPointMake(21.88, 12.44) controlPoint1: CGPointMake(21.84, 12.49) controlPoint2: CGPointMake(21.86, 12.46)]; + [bezier2Path addCurveToPoint: CGPointMake(21.93, 12.38) controlPoint1: CGPointMake(21.9, 12.42) controlPoint2: CGPointMake(21.92, 12.4)]; + [bezier2Path addCurveToPoint: CGPointMake(21.99, 12.32) controlPoint1: CGPointMake(21.95, 12.36) controlPoint2: CGPointMake(21.97, 12.34)]; + [bezier2Path addCurveToPoint: CGPointMake(22.04, 12.26) controlPoint1: CGPointMake(22.01, 12.3) controlPoint2: CGPointMake(22.03, 12.28)]; + [bezier2Path addCurveToPoint: CGPointMake(22.1, 12.21) controlPoint1: CGPointMake(22.06, 12.24) controlPoint2: CGPointMake(22.08, 12.23)]; + [bezier2Path addCurveToPoint: CGPointMake(22.15, 12.15) controlPoint1: CGPointMake(22.12, 12.19) controlPoint2: CGPointMake(22.14, 12.17)]; + [bezier2Path addCurveToPoint: CGPointMake(22.21, 12.1) controlPoint1: CGPointMake(22.17, 12.13) controlPoint2: CGPointMake(22.19, 12.12)]; + [bezier2Path addCurveToPoint: CGPointMake(22.26, 12.05) controlPoint1: CGPointMake(22.23, 12.08) controlPoint2: CGPointMake(22.24, 12.06)]; + [bezier2Path addCurveToPoint: CGPointMake(22.32, 12) controlPoint1: CGPointMake(22.28, 12.03) controlPoint2: CGPointMake(22.3, 12.01)]; + [bezier2Path addCurveToPoint: CGPointMake(22.37, 11.95) controlPoint1: CGPointMake(22.34, 11.98) controlPoint2: CGPointMake(22.35, 11.96)]; + [bezier2Path addCurveToPoint: CGPointMake(22.43, 11.9) controlPoint1: CGPointMake(22.39, 11.93) controlPoint2: CGPointMake(22.41, 11.91)]; + [bezier2Path addCurveToPoint: CGPointMake(22.48, 11.85) controlPoint1: CGPointMake(22.45, 11.88) controlPoint2: CGPointMake(22.46, 11.87)]; + [bezier2Path addCurveToPoint: CGPointMake(22.54, 11.81) controlPoint1: CGPointMake(22.5, 11.84) controlPoint2: CGPointMake(22.52, 11.82)]; + [bezier2Path addCurveToPoint: CGPointMake(22.59, 11.76) controlPoint1: CGPointMake(22.56, 11.79) controlPoint2: CGPointMake(22.57, 11.78)]; + [bezier2Path addCurveToPoint: CGPointMake(22.65, 11.72) controlPoint1: CGPointMake(22.61, 11.75) controlPoint2: CGPointMake(22.63, 11.73)]; + [bezier2Path addCurveToPoint: CGPointMake(22.7, 11.67) controlPoint1: CGPointMake(22.67, 11.7) controlPoint2: CGPointMake(22.68, 11.69)]; + [bezier2Path addCurveToPoint: CGPointMake(22.76, 11.63) controlPoint1: CGPointMake(22.72, 11.66) controlPoint2: CGPointMake(22.74, 11.65)]; + [bezier2Path addCurveToPoint: CGPointMake(22.81, 11.59) controlPoint1: CGPointMake(22.78, 11.62) controlPoint2: CGPointMake(22.79, 11.61)]; + [bezier2Path addLineToPoint: CGPointMake(22.87, 11.55)]; + [bezier2Path addCurveToPoint: CGPointMake(22.92, 11.52) controlPoint1: CGPointMake(22.89, 11.54) controlPoint2: CGPointMake(22.9, 11.53)]; + [bezier2Path addCurveToPoint: CGPointMake(22.98, 11.48) controlPoint1: CGPointMake(22.94, 11.5) controlPoint2: CGPointMake(22.96, 11.49)]; + [bezier2Path addCurveToPoint: CGPointMake(23.03, 11.44) controlPoint1: CGPointMake(22.99, 11.47) controlPoint2: CGPointMake(23.01, 11.45)]; + [bezier2Path addCurveToPoint: CGPointMake(23.09, 11.41) controlPoint1: CGPointMake(23.05, 11.43) controlPoint2: CGPointMake(23.07, 11.42)]; + [bezier2Path addCurveToPoint: CGPointMake(23.14, 11.37) controlPoint1: CGPointMake(23.1, 11.39) controlPoint2: CGPointMake(23.12, 11.38)]; + [bezier2Path addCurveToPoint: CGPointMake(23.2, 11.34) controlPoint1: CGPointMake(23.16, 11.36) controlPoint2: CGPointMake(23.18, 11.35)]; + [bezier2Path addCurveToPoint: CGPointMake(23.25, 11.3) controlPoint1: CGPointMake(23.21, 11.33) controlPoint2: CGPointMake(23.23, 11.31)]; + [bezier2Path addCurveToPoint: CGPointMake(23.31, 11.27) controlPoint1: CGPointMake(23.27, 11.29) controlPoint2: CGPointMake(23.29, 11.28)]; + [bezier2Path addCurveToPoint: CGPointMake(23.36, 11.24) controlPoint1: CGPointMake(23.32, 11.26) controlPoint2: CGPointMake(23.34, 11.25)]; + [bezier2Path addCurveToPoint: CGPointMake(23.42, 11.21) controlPoint1: CGPointMake(23.38, 11.23) controlPoint2: CGPointMake(23.4, 11.22)]; + [bezier2Path addCurveToPoint: CGPointMake(23.47, 11.18) controlPoint1: CGPointMake(23.43, 11.2) controlPoint2: CGPointMake(23.45, 11.19)]; + [bezier2Path addCurveToPoint: CGPointMake(23.53, 11.15) controlPoint1: CGPointMake(23.49, 11.17) controlPoint2: CGPointMake(23.51, 11.16)]; + [bezier2Path addCurveToPoint: CGPointMake(23.58, 11.12) controlPoint1: CGPointMake(23.54, 11.14) controlPoint2: CGPointMake(23.56, 11.13)]; + [bezier2Path addCurveToPoint: CGPointMake(23.63, 11.1) controlPoint1: CGPointMake(23.6, 11.11) controlPoint2: CGPointMake(23.62, 11.1)]; + [bezier2Path addLineToPoint: CGPointMake(23.69, 11.07)]; + [bezier2Path addCurveToPoint: CGPointMake(23.74, 11.04) controlPoint1: CGPointMake(23.71, 11.06) controlPoint2: CGPointMake(23.73, 11.05)]; + [bezier2Path addCurveToPoint: CGPointMake(23.8, 11.02) controlPoint1: CGPointMake(23.76, 11.03) controlPoint2: CGPointMake(23.78, 11.03)]; + [bezier2Path addCurveToPoint: CGPointMake(23.85, 10.99) controlPoint1: CGPointMake(23.82, 11.01) controlPoint2: CGPointMake(23.84, 11)]; + [bezier2Path addCurveToPoint: CGPointMake(23.91, 10.97) controlPoint1: CGPointMake(23.87, 10.98) controlPoint2: CGPointMake(23.89, 10.98)]; + [bezier2Path addCurveToPoint: CGPointMake(23.96, 10.95) controlPoint1: CGPointMake(23.93, 10.96) controlPoint2: CGPointMake(23.95, 10.95)]; + [bezier2Path addCurveToPoint: CGPointMake(24.02, 10.92) controlPoint1: CGPointMake(23.98, 10.94) controlPoint2: CGPointMake(24, 10.93)]; + [bezier2Path addLineToPoint: CGPointMake(24.07, 10.9)]; + [bezier2Path addLineToPoint: CGPointMake(24.13, 10.88)]; + [bezier2Path addLineToPoint: CGPointMake(24.18, 10.86)]; + [bezier2Path addCurveToPoint: CGPointMake(24.24, 10.84) controlPoint1: CGPointMake(24.2, 10.85) controlPoint2: CGPointMake(24.22, 10.84)]; + [bezier2Path addCurveToPoint: CGPointMake(24.29, 10.82) controlPoint1: CGPointMake(24.26, 10.83) controlPoint2: CGPointMake(24.27, 10.83)]; + [bezier2Path addCurveToPoint: CGPointMake(24.35, 10.8) controlPoint1: CGPointMake(24.31, 10.81) controlPoint2: CGPointMake(24.33, 10.81)]; + [bezier2Path addLineToPoint: CGPointMake(24.4, 10.78)]; + [bezier2Path addLineToPoint: CGPointMake(24.46, 10.76)]; + [bezier2Path addCurveToPoint: CGPointMake(24.51, 10.75) controlPoint1: CGPointMake(24.48, 10.76) controlPoint2: CGPointMake(24.49, 10.75)]; + [bezier2Path addCurveToPoint: CGPointMake(24.57, 10.73) controlPoint1: CGPointMake(24.53, 10.74) controlPoint2: CGPointMake(24.55, 10.74)]; + [bezier2Path addCurveToPoint: CGPointMake(24.62, 10.72) controlPoint1: CGPointMake(24.59, 10.73) controlPoint2: CGPointMake(24.6, 10.72)]; + [bezier2Path addCurveToPoint: CGPointMake(24.68, 10.7) controlPoint1: CGPointMake(24.64, 10.71) controlPoint2: CGPointMake(24.66, 10.71)]; + [bezier2Path addLineToPoint: CGPointMake(24.73, 10.69)]; + [bezier2Path addCurveToPoint: CGPointMake(24.79, 10.67) controlPoint1: CGPointMake(24.75, 10.68) controlPoint2: CGPointMake(24.77, 10.68)]; + [bezier2Path addCurveToPoint: CGPointMake(24.84, 10.66) controlPoint1: CGPointMake(24.8, 10.67) controlPoint2: CGPointMake(24.82, 10.66)]; + [bezier2Path addCurveToPoint: CGPointMake(24.9, 10.65) controlPoint1: CGPointMake(24.86, 10.65) controlPoint2: CGPointMake(24.88, 10.65)]; + [bezier2Path addCurveToPoint: CGPointMake(24.95, 10.63) controlPoint1: CGPointMake(24.91, 10.64) controlPoint2: CGPointMake(24.93, 10.64)]; + [bezier2Path addLineToPoint: CGPointMake(25.01, 10.62)]; + [bezier2Path addCurveToPoint: CGPointMake(25.06, 10.61) controlPoint1: CGPointMake(25.02, 10.62) controlPoint2: CGPointMake(25.04, 10.61)]; + [bezier2Path addCurveToPoint: CGPointMake(25.12, 10.6) controlPoint1: CGPointMake(25.08, 10.61) controlPoint2: CGPointMake(25.1, 10.6)]; + [bezier2Path addCurveToPoint: CGPointMake(25.17, 10.59) controlPoint1: CGPointMake(25.13, 10.6) controlPoint2: CGPointMake(25.15, 10.59)]; + [bezier2Path addCurveToPoint: CGPointMake(25.23, 10.58) controlPoint1: CGPointMake(25.19, 10.59) controlPoint2: CGPointMake(25.21, 10.58)]; + [bezier2Path addLineToPoint: CGPointMake(25.28, 10.57)]; + [bezier2Path addCurveToPoint: CGPointMake(25.34, 10.56) controlPoint1: CGPointMake(25.3, 10.57) controlPoint2: CGPointMake(25.32, 10.57)]; + [bezier2Path addCurveToPoint: CGPointMake(25.39, 10.56) controlPoint1: CGPointMake(25.35, 10.56) controlPoint2: CGPointMake(25.37, 10.56)]; + [bezier2Path addCurveToPoint: CGPointMake(25.44, 10.55) controlPoint1: CGPointMake(25.41, 10.55) controlPoint2: CGPointMake(25.43, 10.55)]; + [bezier2Path addLineToPoint: CGPointMake(25.5, 10.54)]; + [bezier2Path addLineToPoint: CGPointMake(25.55, 10.54)]; + [bezier2Path addCurveToPoint: CGPointMake(25.61, 10.53) controlPoint1: CGPointMake(25.57, 10.53) controlPoint2: CGPointMake(25.59, 10.53)]; + [bezier2Path addCurveToPoint: CGPointMake(25.66, 10.52) controlPoint1: CGPointMake(25.63, 10.53) controlPoint2: CGPointMake(25.65, 10.53)]; + [bezier2Path addLineToPoint: CGPointMake(25.72, 10.52)]; + [bezier2Path addCurveToPoint: CGPointMake(25.77, 10.52) controlPoint1: CGPointMake(25.74, 10.52) controlPoint2: CGPointMake(25.76, 10.52)]; + [bezier2Path addCurveToPoint: CGPointMake(25.83, 10.51) controlPoint1: CGPointMake(25.79, 10.51) controlPoint2: CGPointMake(25.81, 10.51)]; + [bezier2Path addCurveToPoint: CGPointMake(25.88, 10.51) controlPoint1: CGPointMake(25.85, 10.51) controlPoint2: CGPointMake(25.87, 10.51)]; + [bezier2Path addCurveToPoint: CGPointMake(25.94, 10.51) controlPoint1: CGPointMake(25.9, 10.51) controlPoint2: CGPointMake(25.92, 10.51)]; + [bezier2Path addLineToPoint: CGPointMake(25.99, 10.5)]; + [bezier2Path addCurveToPoint: CGPointMake(26.05, 10.5) controlPoint1: CGPointMake(26.01, 10.5) controlPoint2: CGPointMake(26.03, 10.5)]; + [bezier2Path addCurveToPoint: CGPointMake(26.1, 10.5) controlPoint1: CGPointMake(26.07, 10.5) controlPoint2: CGPointMake(26.08, 10.5)]; + [bezier2Path addCurveToPoint: CGPointMake(26.16, 10.5) controlPoint1: CGPointMake(26.12, 10.5) controlPoint2: CGPointMake(26.14, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(26.18, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(26.21, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(26.27, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(26.32, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(26.38, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(26.43, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(26.49, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(26.54, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(26.6, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(26.65, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(26.71, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(26.76, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(26.82, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(26.87, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(26.93, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(26.98, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(27.04, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(27.09, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(27.15, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(27.2, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(27.26, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(27.31, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(27.36, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(27.42, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(27.47, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(27.53, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(27.58, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(27.64, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(27.69, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(27.75, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(27.8, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(27.86, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(27.91, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(27.97, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(28.02, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(28.08, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(28.13, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(28.19, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(28.24, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(28.3, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(28.35, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(28.41, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(28.46, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(28.52, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(28.57, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(28.63, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(28.68, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(28.74, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(28.79, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(28.85, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(28.9, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(28.96, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(29.01, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(29.07, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(29.12, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(29.18, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(29.23, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(29.28, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(29.34, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(29.39, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(29.45, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(29.5, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(29.56, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(29.61, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(29.67, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(29.72, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(29.78, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(29.83, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(29.89, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(29.94, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(30, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(30.05, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(30.11, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(30.16, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(30.22, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(30.27, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(30.33, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(30.38, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(30.44, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(30.49, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(30.55, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(30.6, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(30.66, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(30.71, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(30.77, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(30.82, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(30.88, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(30.93, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(30.99, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(31.04, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(31.09, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(31.15, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(31.2, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(31.26, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(31.31, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(31.37, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(31.42, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(31.48, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(31.53, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(31.59, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(31.64, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(31.7, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(31.75, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(31.81, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(31.86, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(31.92, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(31.97, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(32.03, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(32.08, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(32.14, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(32.19, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(32.25, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(32.3, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(32.36, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(32.41, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(32.47, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(32.52, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(32.58, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(32.63, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(32.69, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(32.74, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(32.8, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(32.85, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(32.91, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(32.96, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(33.01, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(33.07, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(33.12, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(33.18, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(33.23, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(33.29, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(33.34, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(33.4, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(33.45, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(33.51, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(33.56, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(33.62, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(33.67, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(33.73, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(33.78, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(33.84, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(33.89, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(33.95, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(34, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(34.06, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(34.11, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(34.17, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(34.22, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(34.28, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(34.33, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(34.39, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(34.44, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(34.5, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(34.54, 10.5)]; + [bezier2Path addLineToPoint: CGPointMake(34.54, 38.46)]; + [bezier2Path addCurveToPoint: CGPointMake(34.5, 39.18) controlPoint1: CGPointMake(34.54, 38.7) controlPoint2: CGPointMake(34.53, 38.94)]; + [bezier2Path addCurveToPoint: CGPointMake(34.44, 39.52) controlPoint1: CGPointMake(34.48, 39.29) controlPoint2: CGPointMake(34.46, 39.4)]; + [bezier2Path addCurveToPoint: CGPointMake(34.39, 39.77) controlPoint1: CGPointMake(34.42, 39.6) controlPoint2: CGPointMake(34.41, 39.68)]; + [bezier2Path addCurveToPoint: CGPointMake(34.33, 39.97) controlPoint1: CGPointMake(34.37, 39.84) controlPoint2: CGPointMake(34.35, 39.91)]; + [bezier2Path addCurveToPoint: CGPointMake(34.28, 40.15) controlPoint1: CGPointMake(34.31, 40.04) controlPoint2: CGPointMake(34.3, 40.1)]; + [bezier2Path addCurveToPoint: CGPointMake(34.22, 40.32) controlPoint1: CGPointMake(34.26, 40.21) controlPoint2: CGPointMake(34.24, 40.26)]; + [bezier2Path addCurveToPoint: CGPointMake(34.17, 40.46) controlPoint1: CGPointMake(34.2, 40.36) controlPoint2: CGPointMake(34.19, 40.41)]; + [bezier2Path addCurveToPoint: CGPointMake(34.11, 40.6) controlPoint1: CGPointMake(34.15, 40.51) controlPoint2: CGPointMake(34.13, 40.55)]; + [bezier2Path addCurveToPoint: CGPointMake(34.06, 40.72) controlPoint1: CGPointMake(34.09, 40.64) controlPoint2: CGPointMake(34.08, 40.68)]; + [bezier2Path addCurveToPoint: CGPointMake(34, 40.84) controlPoint1: CGPointMake(34.04, 40.76) controlPoint2: CGPointMake(34.02, 40.8)]; + [bezier2Path addCurveToPoint: CGPointMake(33.95, 40.95) controlPoint1: CGPointMake(33.98, 40.88) controlPoint2: CGPointMake(33.97, 40.92)]; + [bezier2Path addCurveToPoint: CGPointMake(33.89, 41.06) controlPoint1: CGPointMake(33.93, 40.99) controlPoint2: CGPointMake(33.91, 41.02)]; + [bezier2Path addCurveToPoint: CGPointMake(33.84, 41.16) controlPoint1: CGPointMake(33.87, 41.09) controlPoint2: CGPointMake(33.86, 41.12)]; + [bezier2Path addCurveToPoint: CGPointMake(33.78, 41.25) controlPoint1: CGPointMake(33.82, 41.19) controlPoint2: CGPointMake(33.8, 41.22)]; + [bezier2Path addCurveToPoint: CGPointMake(33.73, 41.35) controlPoint1: CGPointMake(33.76, 41.28) controlPoint2: CGPointMake(33.75, 41.31)]; + [bezier2Path addCurveToPoint: CGPointMake(33.67, 41.43) controlPoint1: CGPointMake(33.71, 41.37) controlPoint2: CGPointMake(33.69, 41.4)]; + [bezier2Path addCurveToPoint: CGPointMake(33.62, 41.52) controlPoint1: CGPointMake(33.65, 41.46) controlPoint2: CGPointMake(33.64, 41.49)]; + [bezier2Path addCurveToPoint: CGPointMake(33.56, 41.6) controlPoint1: CGPointMake(33.6, 41.54) controlPoint2: CGPointMake(33.58, 41.57)]; + [bezier2Path addCurveToPoint: CGPointMake(33.51, 41.68) controlPoint1: CGPointMake(33.55, 41.62) controlPoint2: CGPointMake(33.53, 41.65)]; + [bezier2Path addCurveToPoint: CGPointMake(33.45, 41.75) controlPoint1: CGPointMake(33.49, 41.7) controlPoint2: CGPointMake(33.47, 41.73)]; + [bezier2Path addCurveToPoint: CGPointMake(33.4, 41.82) controlPoint1: CGPointMake(33.44, 41.78) controlPoint2: CGPointMake(33.42, 41.8)]; + [bezier2Path addCurveToPoint: CGPointMake(33.34, 41.89) controlPoint1: CGPointMake(33.38, 41.85) controlPoint2: CGPointMake(33.36, 41.87)]; + [bezier2Path addCurveToPoint: CGPointMake(33.29, 41.96) controlPoint1: CGPointMake(33.33, 41.92) controlPoint2: CGPointMake(33.31, 41.94)]; + [bezier2Path addCurveToPoint: CGPointMake(33.23, 42.03) controlPoint1: CGPointMake(33.27, 41.98) controlPoint2: CGPointMake(33.25, 42.01)]; + [bezier2Path addCurveToPoint: CGPointMake(33.18, 42.09) controlPoint1: CGPointMake(33.22, 42.05) controlPoint2: CGPointMake(33.2, 42.07)]; + [bezier2Path addCurveToPoint: CGPointMake(33.12, 42.15) controlPoint1: CGPointMake(33.16, 42.11) controlPoint2: CGPointMake(33.14, 42.13)]; + [bezier2Path addCurveToPoint: CGPointMake(33.07, 42.21) controlPoint1: CGPointMake(33.11, 42.17) controlPoint2: CGPointMake(33.09, 42.19)]; + [bezier2Path addCurveToPoint: CGPointMake(33.01, 42.27) controlPoint1: CGPointMake(33.05, 42.23) controlPoint2: CGPointMake(33.03, 42.25)]; + [bezier2Path addCurveToPoint: CGPointMake(32.96, 42.33) controlPoint1: CGPointMake(33, 42.29) controlPoint2: CGPointMake(32.98, 42.31)]; + [bezier2Path addCurveToPoint: CGPointMake(32.91, 42.39) controlPoint1: CGPointMake(32.94, 42.35) controlPoint2: CGPointMake(32.92, 42.37)]; + [bezier2Path addCurveToPoint: CGPointMake(32.85, 42.44) controlPoint1: CGPointMake(32.89, 42.4) controlPoint2: CGPointMake(32.87, 42.42)]; + [bezier2Path addCurveToPoint: CGPointMake(32.8, 42.49) controlPoint1: CGPointMake(32.83, 42.46) controlPoint2: CGPointMake(32.81, 42.47)]; + [bezier2Path addCurveToPoint: CGPointMake(32.74, 42.54) controlPoint1: CGPointMake(32.78, 42.51) controlPoint2: CGPointMake(32.76, 42.53)]; + [bezier2Path addCurveToPoint: CGPointMake(32.69, 42.59) controlPoint1: CGPointMake(32.72, 42.56) controlPoint2: CGPointMake(32.7, 42.58)]; + [bezier2Path addCurveToPoint: CGPointMake(32.63, 42.64) controlPoint1: CGPointMake(32.67, 42.61) controlPoint2: CGPointMake(32.65, 42.63)]; + [bezier2Path addCurveToPoint: CGPointMake(32.58, 42.69) controlPoint1: CGPointMake(32.61, 42.66) controlPoint2: CGPointMake(32.59, 42.67)]; + [bezier2Path addCurveToPoint: CGPointMake(32.52, 42.73) controlPoint1: CGPointMake(32.56, 42.7) controlPoint2: CGPointMake(32.54, 42.72)]; + [bezier2Path addCurveToPoint: CGPointMake(32.47, 42.78) controlPoint1: CGPointMake(32.5, 42.75) controlPoint2: CGPointMake(32.48, 42.77)]; + [bezier2Path addCurveToPoint: CGPointMake(32.41, 42.82) controlPoint1: CGPointMake(32.45, 42.79) controlPoint2: CGPointMake(32.43, 42.81)]; + [bezier2Path addCurveToPoint: CGPointMake(32.36, 42.87) controlPoint1: CGPointMake(32.39, 42.84) controlPoint2: CGPointMake(32.37, 42.85)]; + [bezier2Path addCurveToPoint: CGPointMake(32.3, 42.91) controlPoint1: CGPointMake(32.34, 42.88) controlPoint2: CGPointMake(32.32, 42.89)]; + [bezier2Path addCurveToPoint: CGPointMake(32.25, 42.95) controlPoint1: CGPointMake(32.28, 42.92) controlPoint2: CGPointMake(32.27, 42.94)]; + [bezier2Path addCurveToPoint: CGPointMake(32.19, 42.99) controlPoint1: CGPointMake(32.23, 42.96) controlPoint2: CGPointMake(32.21, 42.98)]; + [bezier2Path addCurveToPoint: CGPointMake(32.14, 43.03) controlPoint1: CGPointMake(32.17, 43) controlPoint2: CGPointMake(32.16, 43.01)]; + [bezier2Path addCurveToPoint: CGPointMake(32.08, 43.06) controlPoint1: CGPointMake(32.12, 43.04) controlPoint2: CGPointMake(32.1, 43.05)]; + [bezier2Path addCurveToPoint: CGPointMake(32.03, 43.1) controlPoint1: CGPointMake(32.06, 43.08) controlPoint2: CGPointMake(32.05, 43.09)]; + [bezier2Path addCurveToPoint: CGPointMake(31.97, 43.14) controlPoint1: CGPointMake(32.01, 43.11) controlPoint2: CGPointMake(31.99, 43.13)]; + [bezier2Path addCurveToPoint: CGPointMake(31.92, 43.17) controlPoint1: CGPointMake(31.95, 43.15) controlPoint2: CGPointMake(31.94, 43.16)]; + [bezier2Path addCurveToPoint: CGPointMake(31.86, 43.21) controlPoint1: CGPointMake(31.9, 43.18) controlPoint2: CGPointMake(31.88, 43.2)]; + [bezier2Path addCurveToPoint: CGPointMake(31.81, 43.24) controlPoint1: CGPointMake(31.84, 43.22) controlPoint2: CGPointMake(31.83, 43.23)]; + [bezier2Path addCurveToPoint: CGPointMake(31.75, 43.27) controlPoint1: CGPointMake(31.79, 43.25) controlPoint2: CGPointMake(31.77, 43.26)]; + [bezier2Path addCurveToPoint: CGPointMake(31.7, 43.3) controlPoint1: CGPointMake(31.73, 43.28) controlPoint2: CGPointMake(31.72, 43.29)]; + [bezier2Path addCurveToPoint: CGPointMake(31.64, 43.33) controlPoint1: CGPointMake(31.68, 43.31) controlPoint2: CGPointMake(31.66, 43.32)]; + [bezier2Path addCurveToPoint: CGPointMake(31.59, 43.36) controlPoint1: CGPointMake(31.63, 43.34) controlPoint2: CGPointMake(31.61, 43.35)]; + [bezier2Path addCurveToPoint: CGPointMake(31.53, 43.39) controlPoint1: CGPointMake(31.57, 43.37) controlPoint2: CGPointMake(31.55, 43.38)]; + [bezier2Path addLineToPoint: CGPointMake(31.48, 43.42)]; + [bezier2Path addCurveToPoint: CGPointMake(31.42, 43.45) controlPoint1: CGPointMake(31.46, 43.43) controlPoint2: CGPointMake(31.44, 43.44)]; + [bezier2Path addCurveToPoint: CGPointMake(31.37, 43.48) controlPoint1: CGPointMake(31.41, 43.46) controlPoint2: CGPointMake(31.39, 43.47)]; + [bezier2Path addCurveToPoint: CGPointMake(31.31, 43.5) controlPoint1: CGPointMake(31.35, 43.49) controlPoint2: CGPointMake(31.33, 43.5)]; + [bezier2Path addCurveToPoint: CGPointMake(31.26, 43.53) controlPoint1: CGPointMake(31.3, 43.51) controlPoint2: CGPointMake(31.28, 43.52)]; + [bezier2Path addCurveToPoint: CGPointMake(31.2, 43.55) controlPoint1: CGPointMake(31.24, 43.54) controlPoint2: CGPointMake(31.22, 43.55)]; + [bezier2Path addCurveToPoint: CGPointMake(31.15, 43.58) controlPoint1: CGPointMake(31.19, 43.56) controlPoint2: CGPointMake(31.17, 43.57)]; + [bezier2Path addLineToPoint: CGPointMake(31.09, 43.6)]; + [bezier2Path addLineToPoint: CGPointMake(31.04, 43.62)]; + [bezier2Path addCurveToPoint: CGPointMake(30.99, 43.65) controlPoint1: CGPointMake(31.02, 43.63) controlPoint2: CGPointMake(31, 43.64)]; + [bezier2Path addCurveToPoint: CGPointMake(30.93, 43.67) controlPoint1: CGPointMake(30.97, 43.65) controlPoint2: CGPointMake(30.95, 43.66)]; + [bezier2Path addCurveToPoint: CGPointMake(30.88, 43.69) controlPoint1: CGPointMake(30.91, 43.68) controlPoint2: CGPointMake(30.89, 43.68)]; + [bezier2Path addCurveToPoint: CGPointMake(30.82, 43.71) controlPoint1: CGPointMake(30.86, 43.7) controlPoint2: CGPointMake(30.84, 43.7)]; + [bezier2Path addCurveToPoint: CGPointMake(30.77, 43.73) controlPoint1: CGPointMake(30.8, 43.72) controlPoint2: CGPointMake(30.78, 43.72)]; + [bezier2Path addLineToPoint: CGPointMake(30.71, 43.75)]; + [bezier2Path addLineToPoint: CGPointMake(30.66, 43.77)]; + [bezier2Path addCurveToPoint: CGPointMake(30.6, 43.78) controlPoint1: CGPointMake(30.64, 43.77) controlPoint2: CGPointMake(30.62, 43.78)]; + [bezier2Path addCurveToPoint: CGPointMake(30.55, 43.8) controlPoint1: CGPointMake(30.58, 43.79) controlPoint2: CGPointMake(30.56, 43.8)]; + [bezier2Path addCurveToPoint: CGPointMake(30.49, 43.82) controlPoint1: CGPointMake(30.53, 43.81) controlPoint2: CGPointMake(30.51, 43.81)]; + [bezier2Path addLineToPoint: CGPointMake(30.44, 43.83)]; + [bezier2Path addLineToPoint: CGPointMake(30.38, 43.85)]; + [bezier2Path addCurveToPoint: CGPointMake(30.33, 43.86) controlPoint1: CGPointMake(30.36, 43.85) controlPoint2: CGPointMake(30.35, 43.86)]; + [bezier2Path addCurveToPoint: CGPointMake(30.27, 43.88) controlPoint1: CGPointMake(30.31, 43.87) controlPoint2: CGPointMake(30.29, 43.87)]; + [bezier2Path addCurveToPoint: CGPointMake(30.22, 43.89) controlPoint1: CGPointMake(30.25, 43.88) controlPoint2: CGPointMake(30.24, 43.89)]; + [bezier2Path addCurveToPoint: CGPointMake(30.16, 43.9) controlPoint1: CGPointMake(30.2, 43.9) controlPoint2: CGPointMake(30.18, 43.9)]; + [bezier2Path addLineToPoint: CGPointMake(30.11, 43.92)]; + [bezier2Path addLineToPoint: CGPointMake(30.05, 43.93)]; + [bezier2Path addCurveToPoint: CGPointMake(30, 43.94) controlPoint1: CGPointMake(30.03, 43.93) controlPoint2: CGPointMake(30.02, 43.94)]; + [bezier2Path addCurveToPoint: CGPointMake(29.94, 43.95) controlPoint1: CGPointMake(29.98, 43.94) controlPoint2: CGPointMake(29.96, 43.95)]; + [bezier2Path addCurveToPoint: CGPointMake(29.89, 43.96) controlPoint1: CGPointMake(29.92, 43.95) controlPoint2: CGPointMake(29.91, 43.96)]; + [bezier2Path addLineToPoint: CGPointMake(29.83, 43.97)]; + [bezier2Path addCurveToPoint: CGPointMake(29.78, 43.98) controlPoint1: CGPointMake(29.82, 43.97) controlPoint2: CGPointMake(29.8, 43.98)]; + [bezier2Path addCurveToPoint: CGPointMake(29.72, 43.99) controlPoint1: CGPointMake(29.76, 43.98) controlPoint2: CGPointMake(29.74, 43.99)]; + [bezier2Path addCurveToPoint: CGPointMake(29.67, 44) controlPoint1: CGPointMake(29.71, 43.99) controlPoint2: CGPointMake(29.69, 43.99)]; + [bezier2Path addLineToPoint: CGPointMake(29.61, 44)]; + [bezier2Path addCurveToPoint: CGPointMake(29.56, 44.01) controlPoint1: CGPointMake(29.6, 44.01) controlPoint2: CGPointMake(29.58, 44.01)]; + [bezier2Path addCurveToPoint: CGPointMake(29.5, 44.02) controlPoint1: CGPointMake(29.54, 44.01) controlPoint2: CGPointMake(29.52, 44.01)]; + [bezier2Path addCurveToPoint: CGPointMake(29.45, 44.02) controlPoint1: CGPointMake(29.49, 44.02) controlPoint2: CGPointMake(29.47, 44.02)]; + [bezier2Path addCurveToPoint: CGPointMake(29.39, 44.03) controlPoint1: CGPointMake(29.43, 44.02) controlPoint2: CGPointMake(29.41, 44.03)]; + [bezier2Path addLineToPoint: CGPointMake(29.34, 44.03)]; + [bezier2Path addCurveToPoint: CGPointMake(29.28, 44.04) controlPoint1: CGPointMake(29.32, 44.03) controlPoint2: CGPointMake(29.3, 44.04)]; + [bezier2Path addCurveToPoint: CGPointMake(29.23, 44.04) controlPoint1: CGPointMake(29.27, 44.04) controlPoint2: CGPointMake(29.25, 44.04)]; + [bezier2Path addLineToPoint: CGPointMake(29.18, 44.04)]; + [bezier2Path addLineToPoint: CGPointMake(29.12, 44.05)]; + [bezier2Path addCurveToPoint: CGPointMake(29.07, 44.05) controlPoint1: CGPointMake(29.1, 44.05) controlPoint2: CGPointMake(29.08, 44.05)]; + [bezier2Path addCurveToPoint: CGPointMake(29.01, 44.05) controlPoint1: CGPointMake(29.05, 44.05) controlPoint2: CGPointMake(29.03, 44.05)]; + [bezier2Path addCurveToPoint: CGPointMake(28.96, 44.05) controlPoint1: CGPointMake(28.99, 44.05) controlPoint2: CGPointMake(28.97, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(28.9, 44.05)]; + [bezier2Path addCurveToPoint: CGPointMake(28.85, 44.05) controlPoint1: CGPointMake(28.88, 44.05) controlPoint2: CGPointMake(28.87, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(28.85, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(28.79, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(28.74, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(28.68, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(28.63, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(28.57, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(28.52, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(28.46, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(28.41, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(28.35, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(28.3, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(28.24, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(28.19, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(28.13, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(28.08, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(28.02, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(27.97, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(27.91, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(27.86, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(27.8, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(27.75, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(27.69, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(27.64, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(27.58, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(27.53, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(27.47, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(27.42, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(27.36, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(27.31, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(27.26, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(27.2, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(27.15, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(27.09, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(27.04, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(26.98, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(26.93, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(26.87, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(26.82, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(26.76, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(26.71, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(26.65, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(26.6, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(26.54, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(26.49, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(26.43, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(26.38, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(26.32, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(26.27, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(26.21, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(26.16, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(26.1, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(26.05, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(25.99, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(25.94, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(25.88, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(25.83, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(25.77, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(25.72, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(25.66, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(25.61, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(25.55, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(25.5, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(25.44, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(25.39, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(25.34, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(25.28, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(25.23, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(25.17, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(25.12, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(25.06, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(25.01, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(24.95, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(24.9, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(24.84, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(24.79, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(24.73, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(24.68, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(24.62, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(24.57, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(24.51, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(24.46, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(24.4, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(24.35, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(24.29, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(24.24, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(24.18, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(24.13, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(24.07, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(24.02, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(23.96, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(23.91, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(23.85, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(23.8, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(23.74, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(23.69, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(23.63, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(23.58, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(23.53, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(23.47, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(23.42, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(23.36, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(23.31, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(23.25, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(23.2, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(23.14, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(23.09, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(23.03, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(22.98, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(22.92, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(22.87, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(22.81, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(22.76, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(22.7, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(22.65, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(22.59, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(22.54, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(22.48, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(22.43, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(22.37, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(22.32, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(22.26, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(22.21, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(22.15, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(22.1, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(22.04, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(21.99, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(21.93, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(21.88, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(21.82, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(21.77, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(21.71, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(21.66, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(21.61, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(21.55, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(21.5, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(21.44, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(21.39, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(21.33, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(21.28, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(21.22, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(21.17, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(21.11, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(21.06, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(21, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(20.95, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(20.89, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(20.84, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(20.78, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(20.73, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(20.67, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(20.62, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(20.5, 44.05)]; + [bezier2Path addLineToPoint: CGPointMake(20.5, 32.27)]; + [bezier2Path addCurveToPoint: CGPointMake(20.62, 32.3) controlPoint1: CGPointMake(20.5, 32.27) controlPoint2: CGPointMake(20.54, 32.28)]; + [bezier2Path addLineToPoint: CGPointMake(20.67, 32.31)]; + [bezier2Path addLineToPoint: CGPointMake(20.73, 32.32)]; + [bezier2Path addLineToPoint: CGPointMake(20.78, 32.34)]; + [bezier2Path addLineToPoint: CGPointMake(20.84, 32.35)]; + [bezier2Path addLineToPoint: CGPointMake(20.89, 32.36)]; + [bezier2Path addLineToPoint: CGPointMake(20.95, 32.38)]; + [bezier2Path addLineToPoint: CGPointMake(21, 32.39)]; + [bezier2Path addLineToPoint: CGPointMake(21.06, 32.4)]; + [bezier2Path addLineToPoint: CGPointMake(21.11, 32.41)]; + [bezier2Path addLineToPoint: CGPointMake(21.17, 32.42)]; + [bezier2Path addLineToPoint: CGPointMake(21.22, 32.43)]; + [bezier2Path addLineToPoint: CGPointMake(21.28, 32.45)]; + [bezier2Path addLineToPoint: CGPointMake(21.33, 32.46)]; + [bezier2Path addLineToPoint: CGPointMake(21.39, 32.47)]; + [bezier2Path addLineToPoint: CGPointMake(21.44, 32.48)]; + [bezier2Path addLineToPoint: CGPointMake(21.5, 32.49)]; + [bezier2Path addLineToPoint: CGPointMake(21.55, 32.5)]; + [bezier2Path addLineToPoint: CGPointMake(21.61, 32.51)]; + [bezier2Path addLineToPoint: CGPointMake(21.66, 32.52)]; + [bezier2Path addLineToPoint: CGPointMake(21.71, 32.53)]; + [bezier2Path addLineToPoint: CGPointMake(21.77, 32.54)]; + [bezier2Path addLineToPoint: CGPointMake(21.82, 32.55)]; + [bezier2Path addLineToPoint: CGPointMake(21.88, 32.56)]; + [bezier2Path addLineToPoint: CGPointMake(21.93, 32.57)]; + [bezier2Path addLineToPoint: CGPointMake(21.99, 32.58)]; + [bezier2Path addLineToPoint: CGPointMake(22.04, 32.59)]; + [bezier2Path addLineToPoint: CGPointMake(22.1, 32.6)]; + [bezier2Path addLineToPoint: CGPointMake(22.15, 32.61)]; + [bezier2Path addLineToPoint: CGPointMake(22.21, 32.62)]; + [bezier2Path addLineToPoint: CGPointMake(22.26, 32.63)]; + [bezier2Path addLineToPoint: CGPointMake(22.32, 32.64)]; + [bezier2Path addLineToPoint: CGPointMake(22.37, 32.64)]; + [bezier2Path addLineToPoint: CGPointMake(22.43, 32.65)]; + [bezier2Path addLineToPoint: CGPointMake(22.48, 32.66)]; + [bezier2Path addLineToPoint: CGPointMake(22.54, 32.67)]; + [bezier2Path addLineToPoint: CGPointMake(22.59, 32.68)]; + [bezier2Path addLineToPoint: CGPointMake(22.65, 32.69)]; + [bezier2Path addLineToPoint: CGPointMake(22.7, 32.69)]; + [bezier2Path addLineToPoint: CGPointMake(22.76, 32.7)]; + [bezier2Path addLineToPoint: CGPointMake(22.81, 32.71)]; + [bezier2Path addLineToPoint: CGPointMake(22.87, 32.72)]; + [bezier2Path addLineToPoint: CGPointMake(22.92, 32.73)]; + [bezier2Path addLineToPoint: CGPointMake(22.98, 32.73)]; + [bezier2Path addLineToPoint: CGPointMake(23.03, 32.74)]; + [bezier2Path addLineToPoint: CGPointMake(23.09, 32.75)]; + [bezier2Path addLineToPoint: CGPointMake(23.14, 32.75)]; + [bezier2Path addLineToPoint: CGPointMake(23.2, 32.76)]; + [bezier2Path addLineToPoint: CGPointMake(23.25, 32.77)]; + [bezier2Path addLineToPoint: CGPointMake(23.31, 32.77)]; + [bezier2Path addLineToPoint: CGPointMake(23.36, 32.78)]; + [bezier2Path addLineToPoint: CGPointMake(23.42, 32.79)]; + [bezier2Path addLineToPoint: CGPointMake(23.47, 32.79)]; + [bezier2Path addLineToPoint: CGPointMake(23.53, 32.8)]; + [bezier2Path addLineToPoint: CGPointMake(23.58, 32.81)]; + [bezier2Path addLineToPoint: CGPointMake(23.63, 32.81)]; + [bezier2Path addLineToPoint: CGPointMake(23.69, 32.82)]; + [bezier2Path addLineToPoint: CGPointMake(23.74, 32.82)]; + [bezier2Path addLineToPoint: CGPointMake(23.8, 32.83)]; + [bezier2Path addLineToPoint: CGPointMake(23.85, 32.84)]; + [bezier2Path addLineToPoint: CGPointMake(23.91, 32.84)]; + [bezier2Path addLineToPoint: CGPointMake(23.96, 32.85)]; + [bezier2Path addLineToPoint: CGPointMake(24.02, 32.85)]; + [bezier2Path addLineToPoint: CGPointMake(24.07, 32.86)]; + [bezier2Path addLineToPoint: CGPointMake(24.13, 32.86)]; + [bezier2Path addLineToPoint: CGPointMake(24.18, 32.87)]; + [bezier2Path addLineToPoint: CGPointMake(24.24, 32.87)]; + [bezier2Path addLineToPoint: CGPointMake(24.29, 32.88)]; + [bezier2Path addLineToPoint: CGPointMake(24.35, 32.88)]; + [bezier2Path addLineToPoint: CGPointMake(24.4, 32.88)]; + [bezier2Path addLineToPoint: CGPointMake(24.46, 32.89)]; + [bezier2Path addLineToPoint: CGPointMake(24.51, 32.89)]; + [bezier2Path addLineToPoint: CGPointMake(24.57, 32.9)]; + [bezier2Path addLineToPoint: CGPointMake(24.62, 32.9)]; + [bezier2Path addLineToPoint: CGPointMake(24.68, 32.9)]; + [bezier2Path addLineToPoint: CGPointMake(24.73, 32.91)]; + [bezier2Path addLineToPoint: CGPointMake(24.79, 32.91)]; + [bezier2Path addLineToPoint: CGPointMake(24.84, 32.92)]; + [bezier2Path addLineToPoint: CGPointMake(24.9, 32.92)]; + [bezier2Path addLineToPoint: CGPointMake(24.95, 32.92)]; + [bezier2Path addLineToPoint: CGPointMake(25.01, 32.93)]; + [bezier2Path addLineToPoint: CGPointMake(25.06, 32.93)]; + [bezier2Path addLineToPoint: CGPointMake(25.12, 32.93)]; + [bezier2Path addLineToPoint: CGPointMake(25.17, 32.93)]; + [bezier2Path addLineToPoint: CGPointMake(25.23, 32.94)]; + [bezier2Path addLineToPoint: CGPointMake(25.28, 32.94)]; + [bezier2Path addLineToPoint: CGPointMake(25.34, 32.94)]; + [bezier2Path addLineToPoint: CGPointMake(25.39, 32.94)]; + [bezier2Path addLineToPoint: CGPointMake(25.44, 32.95)]; + [bezier2Path addLineToPoint: CGPointMake(25.5, 32.95)]; + [bezier2Path addLineToPoint: CGPointMake(25.55, 32.95)]; + [bezier2Path addLineToPoint: CGPointMake(25.61, 32.95)]; + [bezier2Path addLineToPoint: CGPointMake(25.66, 32.95)]; + [bezier2Path addLineToPoint: CGPointMake(25.72, 32.95)]; + [bezier2Path addLineToPoint: CGPointMake(25.77, 32.96)]; + [bezier2Path addLineToPoint: CGPointMake(25.83, 32.96)]; + [bezier2Path addLineToPoint: CGPointMake(25.88, 32.96)]; + [bezier2Path addLineToPoint: CGPointMake(25.94, 32.96)]; + [bezier2Path addLineToPoint: CGPointMake(25.99, 32.96)]; + [bezier2Path addLineToPoint: CGPointMake(26.05, 32.96)]; + [bezier2Path addLineToPoint: CGPointMake(26.1, 32.96)]; + [bezier2Path addLineToPoint: CGPointMake(26.16, 32.96)]; + [bezier2Path addLineToPoint: CGPointMake(26.21, 32.96)]; + [bezier2Path addLineToPoint: CGPointMake(26.27, 32.96)]; + [bezier2Path addLineToPoint: CGPointMake(26.32, 32.96)]; + [bezier2Path addLineToPoint: CGPointMake(26.34, 32.96)]; + [bezier2Path addLineToPoint: CGPointMake(26.38, 32.96)]; + [bezier2Path addLineToPoint: CGPointMake(26.43, 32.96)]; + [bezier2Path addLineToPoint: CGPointMake(26.49, 32.96)]; + [bezier2Path addLineToPoint: CGPointMake(26.54, 32.96)]; + [bezier2Path addLineToPoint: CGPointMake(26.6, 32.96)]; + [bezier2Path addLineToPoint: CGPointMake(26.65, 32.96)]; + [bezier2Path addLineToPoint: CGPointMake(26.71, 32.96)]; + [bezier2Path addLineToPoint: CGPointMake(26.76, 32.96)]; + [bezier2Path addLineToPoint: CGPointMake(26.82, 32.96)]; + [bezier2Path addLineToPoint: CGPointMake(26.87, 32.96)]; + [bezier2Path addLineToPoint: CGPointMake(26.93, 32.95)]; + [bezier2Path addLineToPoint: CGPointMake(26.98, 32.95)]; + [bezier2Path addLineToPoint: CGPointMake(27.04, 32.95)]; + [bezier2Path addLineToPoint: CGPointMake(27.09, 32.95)]; + [bezier2Path addLineToPoint: CGPointMake(27.15, 32.95)]; + [bezier2Path addLineToPoint: CGPointMake(27.2, 32.94)]; + [bezier2Path addLineToPoint: CGPointMake(27.26, 32.94)]; + [bezier2Path addLineToPoint: CGPointMake(27.31, 32.94)]; + [bezier2Path addLineToPoint: CGPointMake(27.36, 32.94)]; + [bezier2Path addLineToPoint: CGPointMake(27.42, 32.93)]; + [bezier2Path addLineToPoint: CGPointMake(27.47, 32.93)]; + [bezier2Path addLineToPoint: CGPointMake(27.53, 32.93)]; + [bezier2Path addLineToPoint: CGPointMake(27.58, 32.92)]; + [bezier2Path addLineToPoint: CGPointMake(27.64, 32.92)]; + [bezier2Path addLineToPoint: CGPointMake(27.69, 32.92)]; + [bezier2Path addLineToPoint: CGPointMake(27.75, 32.91)]; + [bezier2Path addLineToPoint: CGPointMake(27.8, 32.91)]; + [bezier2Path addLineToPoint: CGPointMake(27.86, 32.9)]; + [bezier2Path addLineToPoint: CGPointMake(27.91, 32.9)]; + [bezier2Path addLineToPoint: CGPointMake(27.97, 32.89)]; + [bezier2Path addLineToPoint: CGPointMake(28.02, 32.89)]; + [bezier2Path addLineToPoint: CGPointMake(28.08, 32.88)]; + [bezier2Path addLineToPoint: CGPointMake(28.13, 32.88)]; + [bezier2Path addLineToPoint: CGPointMake(28.19, 32.87)]; + [bezier2Path addLineToPoint: CGPointMake(28.24, 32.87)]; + [bezier2Path addLineToPoint: CGPointMake(28.3, 32.86)]; + [bezier2Path addLineToPoint: CGPointMake(28.35, 32.85)]; + [bezier2Path addLineToPoint: CGPointMake(28.41, 32.85)]; + [bezier2Path addLineToPoint: CGPointMake(28.46, 32.84)]; + [bezier2Path addLineToPoint: CGPointMake(28.52, 32.83)]; + [bezier2Path addLineToPoint: CGPointMake(28.57, 32.83)]; + [bezier2Path addLineToPoint: CGPointMake(28.63, 32.82)]; + [bezier2Path addCurveToPoint: CGPointMake(28.68, 32.81) controlPoint1: CGPointMake(28.64, 32.82) controlPoint2: CGPointMake(28.66, 32.81)]; + [bezier2Path addLineToPoint: CGPointMake(28.74, 32.8)]; + [bezier2Path addLineToPoint: CGPointMake(28.79, 32.79)]; + [bezier2Path addLineToPoint: CGPointMake(28.85, 32.79)]; + [bezier2Path addCurveToPoint: CGPointMake(28.9, 32.78) controlPoint1: CGPointMake(28.86, 32.78) controlPoint2: CGPointMake(28.88, 32.78)]; + [bezier2Path addLineToPoint: CGPointMake(28.96, 32.77)]; + [bezier2Path addCurveToPoint: CGPointMake(29.01, 32.76) controlPoint1: CGPointMake(28.97, 32.76) controlPoint2: CGPointMake(28.99, 32.76)]; + [bezier2Path addCurveToPoint: CGPointMake(29.07, 32.75) controlPoint1: CGPointMake(29.03, 32.76) controlPoint2: CGPointMake(29.05, 32.75)]; + [bezier2Path addLineToPoint: CGPointMake(29.12, 32.74)]; + [bezier2Path addLineToPoint: CGPointMake(29.18, 32.73)]; + [bezier2Path addLineToPoint: CGPointMake(29.23, 32.72)]; + [bezier2Path addCurveToPoint: CGPointMake(29.28, 32.71) controlPoint1: CGPointMake(29.25, 32.71) controlPoint2: CGPointMake(29.27, 32.71)]; + [bezier2Path addLineToPoint: CGPointMake(29.34, 32.7)]; + [bezier2Path addLineToPoint: CGPointMake(29.39, 32.68)]; + [bezier2Path addCurveToPoint: CGPointMake(29.45, 32.67) controlPoint1: CGPointMake(29.41, 32.68) controlPoint2: CGPointMake(29.43, 32.68)]; + [bezier2Path addLineToPoint: CGPointMake(29.5, 32.66)]; + [bezier2Path addCurveToPoint: CGPointMake(29.56, 32.65) controlPoint1: CGPointMake(29.52, 32.66) controlPoint2: CGPointMake(29.54, 32.65)]; + [bezier2Path addCurveToPoint: CGPointMake(29.61, 32.63) controlPoint1: CGPointMake(29.58, 32.64) controlPoint2: CGPointMake(29.6, 32.64)]; + [bezier2Path addLineToPoint: CGPointMake(29.67, 32.62)]; + [bezier2Path addCurveToPoint: CGPointMake(29.72, 32.61) controlPoint1: CGPointMake(29.69, 32.62) controlPoint2: CGPointMake(29.71, 32.61)]; + [bezier2Path addCurveToPoint: CGPointMake(29.78, 32.59) controlPoint1: CGPointMake(29.74, 32.6) controlPoint2: CGPointMake(29.76, 32.6)]; + [bezier2Path addLineToPoint: CGPointMake(29.83, 32.58)]; + [bezier2Path addCurveToPoint: CGPointMake(29.89, 32.57) controlPoint1: CGPointMake(29.85, 32.58) controlPoint2: CGPointMake(29.87, 32.57)]; + [bezier2Path addCurveToPoint: CGPointMake(29.94, 32.55) controlPoint1: CGPointMake(29.91, 32.56) controlPoint2: CGPointMake(29.92, 32.56)]; + [bezier2Path addLineToPoint: CGPointMake(30, 32.53)]; + [bezier2Path addCurveToPoint: CGPointMake(30.05, 32.52) controlPoint1: CGPointMake(30.02, 32.53) controlPoint2: CGPointMake(30.03, 32.52)]; + [bezier2Path addLineToPoint: CGPointMake(30.11, 32.5)]; + [bezier2Path addLineToPoint: CGPointMake(30.16, 32.49)]; + [bezier2Path addCurveToPoint: CGPointMake(30.22, 32.47) controlPoint1: CGPointMake(30.18, 32.48) controlPoint2: CGPointMake(30.2, 32.47)]; + [bezier2Path addLineToPoint: CGPointMake(30.27, 32.45)]; + [bezier2Path addLineToPoint: CGPointMake(30.33, 32.43)]; + [bezier2Path addCurveToPoint: CGPointMake(30.38, 32.41) controlPoint1: CGPointMake(30.35, 32.43) controlPoint2: CGPointMake(30.36, 32.42)]; + [bezier2Path addCurveToPoint: CGPointMake(30.44, 32.39) controlPoint1: CGPointMake(30.4, 32.41) controlPoint2: CGPointMake(30.42, 32.4)]; + [bezier2Path addLineToPoint: CGPointMake(30.49, 32.37)]; + [bezier2Path addCurveToPoint: CGPointMake(30.55, 32.35) controlPoint1: CGPointMake(30.51, 32.37) controlPoint2: CGPointMake(30.53, 32.36)]; + [bezier2Path addCurveToPoint: CGPointMake(30.6, 32.33) controlPoint1: CGPointMake(30.56, 32.35) controlPoint2: CGPointMake(30.58, 32.34)]; + [bezier2Path addCurveToPoint: CGPointMake(30.66, 32.31) controlPoint1: CGPointMake(30.62, 32.33) controlPoint2: CGPointMake(30.64, 32.32)]; + [bezier2Path addLineToPoint: CGPointMake(30.71, 32.29)]; + [bezier2Path addLineToPoint: CGPointMake(30.77, 32.27)]; + [bezier2Path addCurveToPoint: CGPointMake(30.82, 32.25) controlPoint1: CGPointMake(30.78, 32.26) controlPoint2: CGPointMake(30.8, 32.25)]; + [bezier2Path addCurveToPoint: CGPointMake(30.88, 32.22) controlPoint1: CGPointMake(30.84, 32.24) controlPoint2: CGPointMake(30.86, 32.23)]; + [bezier2Path addLineToPoint: CGPointMake(30.93, 32.2)]; + [bezier2Path addLineToPoint: CGPointMake(30.99, 32.17)]; + [bezier2Path addCurveToPoint: CGPointMake(31.04, 32.15) controlPoint1: CGPointMake(31, 32.16) controlPoint2: CGPointMake(31.02, 32.15)]; + [bezier2Path addCurveToPoint: CGPointMake(31.09, 32.12) controlPoint1: CGPointMake(31.06, 32.14) controlPoint2: CGPointMake(31.08, 32.13)]; + [bezier2Path addCurveToPoint: CGPointMake(31.15, 32.09) controlPoint1: CGPointMake(31.11, 32.11) controlPoint2: CGPointMake(31.13, 32.1)]; + [bezier2Path addCurveToPoint: CGPointMake(31.2, 32.06) controlPoint1: CGPointMake(31.17, 32.08) controlPoint2: CGPointMake(31.19, 32.07)]; + [bezier2Path addCurveToPoint: CGPointMake(31.26, 32.04) controlPoint1: CGPointMake(31.22, 32.06) controlPoint2: CGPointMake(31.24, 32.05)]; + [bezier2Path addCurveToPoint: CGPointMake(31.31, 32.01) controlPoint1: CGPointMake(31.28, 32.03) controlPoint2: CGPointMake(31.3, 32.02)]; + [bezier2Path addCurveToPoint: CGPointMake(31.37, 31.98) controlPoint1: CGPointMake(31.33, 32) controlPoint2: CGPointMake(31.35, 31.99)]; + [bezier2Path addCurveToPoint: CGPointMake(31.42, 31.94) controlPoint1: CGPointMake(31.39, 31.97) controlPoint2: CGPointMake(31.41, 31.95)]; + [bezier2Path addCurveToPoint: CGPointMake(31.48, 31.91) controlPoint1: CGPointMake(31.44, 31.93) controlPoint2: CGPointMake(31.46, 31.92)]; + [bezier2Path addCurveToPoint: CGPointMake(31.53, 31.88) controlPoint1: CGPointMake(31.5, 31.9) controlPoint2: CGPointMake(31.52, 31.89)]; + [bezier2Path addCurveToPoint: CGPointMake(31.59, 31.84) controlPoint1: CGPointMake(31.55, 31.87) controlPoint2: CGPointMake(31.57, 31.86)]; + [bezier2Path addCurveToPoint: CGPointMake(31.64, 31.81) controlPoint1: CGPointMake(31.61, 31.83) controlPoint2: CGPointMake(31.63, 31.82)]; + [bezier2Path addCurveToPoint: CGPointMake(31.7, 31.77) controlPoint1: CGPointMake(31.66, 31.8) controlPoint2: CGPointMake(31.68, 31.78)]; + [bezier2Path addCurveToPoint: CGPointMake(31.75, 31.73) controlPoint1: CGPointMake(31.72, 31.76) controlPoint2: CGPointMake(31.73, 31.75)]; + [bezier2Path addCurveToPoint: CGPointMake(31.81, 31.69) controlPoint1: CGPointMake(31.77, 31.72) controlPoint2: CGPointMake(31.79, 31.71)]; + [bezier2Path addCurveToPoint: CGPointMake(31.86, 31.65) controlPoint1: CGPointMake(31.83, 31.68) controlPoint2: CGPointMake(31.84, 31.67)]; + [bezier2Path addCurveToPoint: CGPointMake(31.92, 31.61) controlPoint1: CGPointMake(31.88, 31.64) controlPoint2: CGPointMake(31.9, 31.63)]; + [bezier2Path addCurveToPoint: CGPointMake(31.97, 31.57) controlPoint1: CGPointMake(31.94, 31.6) controlPoint2: CGPointMake(31.95, 31.58)]; + [bezier2Path addCurveToPoint: CGPointMake(32.03, 31.52) controlPoint1: CGPointMake(31.99, 31.55) controlPoint2: CGPointMake(32.01, 31.54)]; + [bezier2Path addCurveToPoint: CGPointMake(32.08, 31.48) controlPoint1: CGPointMake(32.05, 31.51) controlPoint2: CGPointMake(32.06, 31.49)]; + [bezier2Path addCurveToPoint: CGPointMake(32.14, 31.43) controlPoint1: CGPointMake(32.1, 31.46) controlPoint2: CGPointMake(32.12, 31.44)]; + [bezier2Path addCurveToPoint: CGPointMake(32.19, 31.38) controlPoint1: CGPointMake(32.16, 31.41) controlPoint2: CGPointMake(32.17, 31.4)]; + [bezier2Path addCurveToPoint: CGPointMake(32.25, 31.33) controlPoint1: CGPointMake(32.21, 31.36) controlPoint2: CGPointMake(32.23, 31.34)]; + [bezier2Path addCurveToPoint: CGPointMake(32.3, 31.27) controlPoint1: CGPointMake(32.27, 31.31) controlPoint2: CGPointMake(32.28, 31.29)]; + [bezier2Path addCurveToPoint: CGPointMake(32.36, 31.21) controlPoint1: CGPointMake(32.32, 31.25) controlPoint2: CGPointMake(32.34, 31.23)]; + [bezier2Path addCurveToPoint: CGPointMake(32.41, 31.15) controlPoint1: CGPointMake(32.38, 31.19) controlPoint2: CGPointMake(32.39, 31.17)]; + [bezier2Path addCurveToPoint: CGPointMake(32.47, 31.09) controlPoint1: CGPointMake(32.43, 31.13) controlPoint2: CGPointMake(32.45, 31.11)]; + [bezier2Path addCurveToPoint: CGPointMake(32.52, 31.03) controlPoint1: CGPointMake(32.48, 31.07) controlPoint2: CGPointMake(32.5, 31.05)]; + [bezier2Path addCurveToPoint: CGPointMake(32.58, 30.96) controlPoint1: CGPointMake(32.54, 31) controlPoint2: CGPointMake(32.56, 30.98)]; + [bezier2Path addCurveToPoint: CGPointMake(32.63, 30.89) controlPoint1: CGPointMake(32.59, 30.94) controlPoint2: CGPointMake(32.61, 30.91)]; + [bezier2Path addCurveToPoint: CGPointMake(32.69, 30.81) controlPoint1: CGPointMake(32.65, 30.86) controlPoint2: CGPointMake(32.67, 30.84)]; + [bezier2Path addCurveToPoint: CGPointMake(32.74, 30.73) controlPoint1: CGPointMake(32.7, 30.78) controlPoint2: CGPointMake(32.72, 30.76)]; + [bezier2Path addCurveToPoint: CGPointMake(32.8, 30.64) controlPoint1: CGPointMake(32.76, 30.7) controlPoint2: CGPointMake(32.78, 30.67)]; + [bezier2Path addCurveToPoint: CGPointMake(32.85, 30.55) controlPoint1: CGPointMake(32.81, 30.61) controlPoint2: CGPointMake(32.83, 30.58)]; + [bezier2Path addCurveToPoint: CGPointMake(32.91, 30.45) controlPoint1: CGPointMake(32.87, 30.52) controlPoint2: CGPointMake(32.89, 30.49)]; + [bezier2Path addCurveToPoint: CGPointMake(32.96, 30.34) controlPoint1: CGPointMake(32.92, 30.42) controlPoint2: CGPointMake(32.94, 30.38)]; + [bezier2Path addCurveToPoint: CGPointMake(33.01, 30.23) controlPoint1: CGPointMake(32.98, 30.31) controlPoint2: CGPointMake(33, 30.27)]; + [bezier2Path addCurveToPoint: CGPointMake(33.07, 30.1) controlPoint1: CGPointMake(33.03, 30.18) controlPoint2: CGPointMake(33.05, 30.14)]; + [bezier2Path addCurveToPoint: CGPointMake(33.12, 29.95) controlPoint1: CGPointMake(33.09, 30.05) controlPoint2: CGPointMake(33.11, 30)]; + [bezier2Path addCurveToPoint: CGPointMake(33.18, 29.78) controlPoint1: CGPointMake(33.14, 29.9) controlPoint2: CGPointMake(33.16, 29.84)]; + [bezier2Path addCurveToPoint: CGPointMake(33.23, 29.58) controlPoint1: CGPointMake(33.2, 29.72) controlPoint2: CGPointMake(33.22, 29.65)]; + [bezier2Path addCurveToPoint: CGPointMake(33.29, 29.33) controlPoint1: CGPointMake(33.25, 29.5) controlPoint2: CGPointMake(33.27, 29.42)]; + [bezier2Path addCurveToPoint: CGPointMake(33.34, 28.94) controlPoint1: CGPointMake(33.31, 29.2) controlPoint2: CGPointMake(33.33, 29.08)]; + [bezier2Path addCurveToPoint: CGPointMake(33.37, 28.39) controlPoint1: CGPointMake(33.36, 28.76) controlPoint2: CGPointMake(33.37, 28.58)]; + [bezier2Path addLineToPoint: CGPointMake(33.37, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(33.34, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(33.29, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(33.23, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(33.18, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(33.12, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(33.07, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(33.01, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(32.96, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(32.91, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(32.85, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(32.8, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(32.74, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(32.69, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(32.63, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(32.58, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(32.52, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(32.47, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(32.41, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(32.36, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(32.3, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(32.25, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(32.19, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(32.14, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(32.08, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(32.03, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(31.97, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(31.92, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(31.86, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(31.81, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(31.75, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(31.7, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(31.64, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(31.59, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(31.53, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(31.48, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(31.42, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(31.37, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(31.31, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(31.26, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(31.2, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(31.15, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(31.09, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(31.04, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(30.99, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(30.93, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(30.88, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(30.82, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(30.77, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(30.71, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(30.66, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(30.6, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(30.55, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(30.49, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(30.44, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(30.38, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(30.33, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(30.27, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(30.22, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(30.16, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(30.11, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(30.05, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(30, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(29.94, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(29.89, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(29.83, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(29.78, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(29.72, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(29.67, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(29.61, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(29.56, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(29.5, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(29.45, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(29.39, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(29.34, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(29.28, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(29.23, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(29.18, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(29.12, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(29.07, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(29.01, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(28.96, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(28.9, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(28.85, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(28.79, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(28.74, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(28.68, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(28.63, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(28.57, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(28.52, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(28.48, 21.9)]; + [bezier2Path addLineToPoint: CGPointMake(28.48, 28.39)]; + [bezier2Path addCurveToPoint: CGPointMake(28.46, 28.69) controlPoint1: CGPointMake(28.48, 28.49) controlPoint2: CGPointMake(28.47, 28.59)]; + [bezier2Path addCurveToPoint: CGPointMake(28.41, 29.05) controlPoint1: CGPointMake(28.45, 28.81) controlPoint2: CGPointMake(28.43, 28.93)]; + [bezier2Path addCurveToPoint: CGPointMake(28.35, 29.27) controlPoint1: CGPointMake(28.39, 29.13) controlPoint2: CGPointMake(28.37, 29.2)]; + [bezier2Path addCurveToPoint: CGPointMake(28.3, 29.43) controlPoint1: CGPointMake(28.34, 29.32) controlPoint2: CGPointMake(28.32, 29.38)]; + [bezier2Path addCurveToPoint: CGPointMake(28.24, 29.57) controlPoint1: CGPointMake(28.28, 29.48) controlPoint2: CGPointMake(28.26, 29.53)]; + [bezier2Path addCurveToPoint: CGPointMake(28.19, 29.69) controlPoint1: CGPointMake(28.23, 29.61) controlPoint2: CGPointMake(28.21, 29.65)]; + [bezier2Path addCurveToPoint: CGPointMake(28.13, 29.79) controlPoint1: CGPointMake(28.17, 29.72) controlPoint2: CGPointMake(28.15, 29.76)]; + [bezier2Path addCurveToPoint: CGPointMake(28.08, 29.89) controlPoint1: CGPointMake(28.12, 29.82) controlPoint2: CGPointMake(28.1, 29.86)]; + [bezier2Path addCurveToPoint: CGPointMake(28.02, 29.97) controlPoint1: CGPointMake(28.06, 29.92) controlPoint2: CGPointMake(28.04, 29.94)]; + [bezier2Path addCurveToPoint: CGPointMake(27.97, 30.05) controlPoint1: CGPointMake(28.01, 30) controlPoint2: CGPointMake(27.99, 30.02)]; + [bezier2Path addCurveToPoint: CGPointMake(27.91, 30.12) controlPoint1: CGPointMake(27.95, 30.07) controlPoint2: CGPointMake(27.93, 30.1)]; + [bezier2Path addCurveToPoint: CGPointMake(27.86, 30.19) controlPoint1: CGPointMake(27.9, 30.14) controlPoint2: CGPointMake(27.88, 30.17)]; + [bezier2Path addCurveToPoint: CGPointMake(27.8, 30.25) controlPoint1: CGPointMake(27.84, 30.21) controlPoint2: CGPointMake(27.82, 30.23)]; + [bezier2Path addCurveToPoint: CGPointMake(27.75, 30.31) controlPoint1: CGPointMake(27.79, 30.27) controlPoint2: CGPointMake(27.77, 30.29)]; + [bezier2Path addCurveToPoint: CGPointMake(27.69, 30.36) controlPoint1: CGPointMake(27.73, 30.33) controlPoint2: CGPointMake(27.71, 30.35)]; + [bezier2Path addCurveToPoint: CGPointMake(27.64, 30.41) controlPoint1: CGPointMake(27.68, 30.38) controlPoint2: CGPointMake(27.66, 30.4)]; + [bezier2Path addCurveToPoint: CGPointMake(27.58, 30.46) controlPoint1: CGPointMake(27.62, 30.43) controlPoint2: CGPointMake(27.6, 30.45)]; + [bezier2Path addCurveToPoint: CGPointMake(27.53, 30.51) controlPoint1: CGPointMake(27.57, 30.48) controlPoint2: CGPointMake(27.55, 30.49)]; + [bezier2Path addCurveToPoint: CGPointMake(27.47, 30.55) controlPoint1: CGPointMake(27.51, 30.52) controlPoint2: CGPointMake(27.49, 30.54)]; + [bezier2Path addCurveToPoint: CGPointMake(27.42, 30.59) controlPoint1: CGPointMake(27.46, 30.56) controlPoint2: CGPointMake(27.44, 30.58)]; + [bezier2Path addCurveToPoint: CGPointMake(27.36, 30.63) controlPoint1: CGPointMake(27.4, 30.6) controlPoint2: CGPointMake(27.38, 30.62)]; + [bezier2Path addCurveToPoint: CGPointMake(27.31, 30.67) controlPoint1: CGPointMake(27.35, 30.64) controlPoint2: CGPointMake(27.33, 30.65)]; + [bezier2Path addCurveToPoint: CGPointMake(27.26, 30.7) controlPoint1: CGPointMake(27.29, 30.68) controlPoint2: CGPointMake(27.27, 30.69)]; + [bezier2Path addCurveToPoint: CGPointMake(27.2, 30.73) controlPoint1: CGPointMake(27.24, 30.71) controlPoint2: CGPointMake(27.22, 30.72)]; + [bezier2Path addCurveToPoint: CGPointMake(27.15, 30.76) controlPoint1: CGPointMake(27.18, 30.74) controlPoint2: CGPointMake(27.16, 30.75)]; + [bezier2Path addCurveToPoint: CGPointMake(27.09, 30.79) controlPoint1: CGPointMake(27.13, 30.77) controlPoint2: CGPointMake(27.11, 30.78)]; + [bezier2Path addCurveToPoint: CGPointMake(27.04, 30.82) controlPoint1: CGPointMake(27.07, 30.8) controlPoint2: CGPointMake(27.05, 30.81)]; + [bezier2Path addCurveToPoint: CGPointMake(26.98, 30.85) controlPoint1: CGPointMake(27.02, 30.83) controlPoint2: CGPointMake(27, 30.84)]; + [bezier2Path addCurveToPoint: CGPointMake(26.93, 30.87) controlPoint1: CGPointMake(26.96, 30.86) controlPoint2: CGPointMake(26.94, 30.86)]; + [bezier2Path addCurveToPoint: CGPointMake(26.87, 30.9) controlPoint1: CGPointMake(26.91, 30.88) controlPoint2: CGPointMake(26.89, 30.89)]; + [bezier2Path addCurveToPoint: CGPointMake(26.82, 30.92) controlPoint1: CGPointMake(26.85, 30.9) controlPoint2: CGPointMake(26.83, 30.91)]; + [bezier2Path addCurveToPoint: CGPointMake(26.76, 30.94) controlPoint1: CGPointMake(26.8, 30.92) controlPoint2: CGPointMake(26.78, 30.93)]; + [bezier2Path addCurveToPoint: CGPointMake(26.71, 30.96) controlPoint1: CGPointMake(26.74, 30.94) controlPoint2: CGPointMake(26.73, 30.95)]; + [bezier2Path addCurveToPoint: CGPointMake(26.65, 30.98) controlPoint1: CGPointMake(26.69, 30.96) controlPoint2: CGPointMake(26.67, 30.97)]; + [bezier2Path addCurveToPoint: CGPointMake(26.6, 30.99) controlPoint1: CGPointMake(26.63, 30.98) controlPoint2: CGPointMake(26.62, 30.99)]; + [bezier2Path addCurveToPoint: CGPointMake(26.54, 31.01) controlPoint1: CGPointMake(26.58, 31) controlPoint2: CGPointMake(26.56, 31)]; + [bezier2Path addCurveToPoint: CGPointMake(26.49, 31.03) controlPoint1: CGPointMake(26.52, 31.02) controlPoint2: CGPointMake(26.51, 31.02)]; + [bezier2Path addCurveToPoint: CGPointMake(26.43, 31.04) controlPoint1: CGPointMake(26.47, 31.03) controlPoint2: CGPointMake(26.45, 31.04)]; + [bezier2Path addCurveToPoint: CGPointMake(26.38, 31.05) controlPoint1: CGPointMake(26.41, 31.04) controlPoint2: CGPointMake(26.4, 31.05)]; + [bezier2Path addCurveToPoint: CGPointMake(26.32, 31.07) controlPoint1: CGPointMake(26.36, 31.06) controlPoint2: CGPointMake(26.34, 31.06)]; + [bezier2Path addCurveToPoint: CGPointMake(26.27, 31.08) controlPoint1: CGPointMake(26.3, 31.07) controlPoint2: CGPointMake(26.29, 31.07)]; + [bezier2Path addCurveToPoint: CGPointMake(26.21, 31.09) controlPoint1: CGPointMake(26.25, 31.08) controlPoint2: CGPointMake(26.23, 31.08)]; + [bezier2Path addCurveToPoint: CGPointMake(26.16, 31.1) controlPoint1: CGPointMake(26.19, 31.09) controlPoint2: CGPointMake(26.18, 31.1)]; + [bezier2Path addCurveToPoint: CGPointMake(26.1, 31.11) controlPoint1: CGPointMake(26.14, 31.1) controlPoint2: CGPointMake(26.12, 31.1)]; + [bezier2Path addLineToPoint: CGPointMake(26.05, 31.12)]; + [bezier2Path addCurveToPoint: CGPointMake(25.99, 31.12) controlPoint1: CGPointMake(26.03, 31.12) controlPoint2: CGPointMake(26.01, 31.12)]; + [bezier2Path addCurveToPoint: CGPointMake(25.94, 31.13) controlPoint1: CGPointMake(25.98, 31.13) controlPoint2: CGPointMake(25.96, 31.13)]; + [bezier2Path addLineToPoint: CGPointMake(25.88, 31.14)]; + [bezier2Path addCurveToPoint: CGPointMake(25.83, 31.14) controlPoint1: CGPointMake(25.87, 31.14) controlPoint2: CGPointMake(25.85, 31.14)]; + [bezier2Path addCurveToPoint: CGPointMake(25.77, 31.15) controlPoint1: CGPointMake(25.81, 31.14) controlPoint2: CGPointMake(25.79, 31.14)]; + [bezier2Path addCurveToPoint: CGPointMake(25.72, 31.15) controlPoint1: CGPointMake(25.76, 31.15) controlPoint2: CGPointMake(25.74, 31.15)]; + [bezier2Path addCurveToPoint: CGPointMake(25.66, 31.15) controlPoint1: CGPointMake(25.7, 31.15) controlPoint2: CGPointMake(25.68, 31.15)]; + [bezier2Path addCurveToPoint: CGPointMake(25.61, 31.15) controlPoint1: CGPointMake(25.65, 31.15) controlPoint2: CGPointMake(25.63, 31.15)]; + [bezier2Path addCurveToPoint: CGPointMake(25.55, 31.16) controlPoint1: CGPointMake(25.59, 31.16) controlPoint2: CGPointMake(25.57, 31.16)]; + [bezier2Path addLineToPoint: CGPointMake(25.5, 31.16)]; + [bezier2Path addCurveToPoint: CGPointMake(25.44, 31.16) controlPoint1: CGPointMake(25.48, 31.16) controlPoint2: CGPointMake(25.46, 31.16)]; + [bezier2Path addLineToPoint: CGPointMake(25.42, 31.16)]; + [bezier2Path addLineToPoint: CGPointMake(25.39, 31.16)]; + [bezier2Path addLineToPoint: CGPointMake(25.34, 31.16)]; + [bezier2Path addLineToPoint: CGPointMake(25.28, 31.16)]; + [bezier2Path addLineToPoint: CGPointMake(25.23, 31.16)]; + [bezier2Path addLineToPoint: CGPointMake(25.17, 31.15)]; + [bezier2Path addLineToPoint: CGPointMake(25.12, 31.15)]; + [bezier2Path addLineToPoint: CGPointMake(25.06, 31.15)]; + [bezier2Path addLineToPoint: CGPointMake(25.01, 31.15)]; + [bezier2Path addLineToPoint: CGPointMake(24.95, 31.15)]; + [bezier2Path addLineToPoint: CGPointMake(24.9, 31.14)]; + [bezier2Path addLineToPoint: CGPointMake(24.84, 31.14)]; + [bezier2Path addLineToPoint: CGPointMake(24.79, 31.14)]; + [bezier2Path addLineToPoint: CGPointMake(24.73, 31.13)]; + [bezier2Path addLineToPoint: CGPointMake(24.68, 31.13)]; + [bezier2Path addLineToPoint: CGPointMake(24.62, 31.12)]; + [bezier2Path addLineToPoint: CGPointMake(24.57, 31.12)]; + [bezier2Path addLineToPoint: CGPointMake(24.51, 31.11)]; + [bezier2Path addLineToPoint: CGPointMake(24.46, 31.1)]; + [bezier2Path addLineToPoint: CGPointMake(24.4, 31.1)]; + [bezier2Path addLineToPoint: CGPointMake(24.35, 31.09)]; + [bezier2Path addLineToPoint: CGPointMake(24.29, 31.09)]; + [bezier2Path addLineToPoint: CGPointMake(24.24, 31.08)]; + [bezier2Path addLineToPoint: CGPointMake(24.18, 31.07)]; + [bezier2Path addLineToPoint: CGPointMake(24.13, 31.06)]; + [bezier2Path addLineToPoint: CGPointMake(24.07, 31.06)]; + [bezier2Path addLineToPoint: CGPointMake(24.02, 31.05)]; + [bezier2Path addLineToPoint: CGPointMake(23.96, 31.04)]; + [bezier2Path addLineToPoint: CGPointMake(23.91, 31.03)]; + [bezier2Path addLineToPoint: CGPointMake(23.85, 31.02)]; + [bezier2Path addLineToPoint: CGPointMake(23.8, 31.01)]; + [bezier2Path addLineToPoint: CGPointMake(23.74, 31)]; + [bezier2Path addLineToPoint: CGPointMake(23.69, 30.99)]; + [bezier2Path addLineToPoint: CGPointMake(23.63, 30.98)]; + [bezier2Path addLineToPoint: CGPointMake(23.58, 30.97)]; + [bezier2Path addLineToPoint: CGPointMake(23.53, 30.96)]; + [bezier2Path addLineToPoint: CGPointMake(23.47, 30.95)]; + [bezier2Path addLineToPoint: CGPointMake(23.42, 30.93)]; + [bezier2Path addLineToPoint: CGPointMake(23.36, 30.92)]; + [bezier2Path addLineToPoint: CGPointMake(23.31, 30.91)]; + [bezier2Path addLineToPoint: CGPointMake(23.25, 30.9)]; + [bezier2Path addLineToPoint: CGPointMake(23.2, 30.88)]; + [bezier2Path addLineToPoint: CGPointMake(23.14, 30.87)]; + [bezier2Path addLineToPoint: CGPointMake(23.09, 30.86)]; + [bezier2Path addLineToPoint: CGPointMake(23.03, 30.84)]; + [bezier2Path addLineToPoint: CGPointMake(22.98, 30.83)]; + [bezier2Path addLineToPoint: CGPointMake(22.92, 30.81)]; + [bezier2Path addLineToPoint: CGPointMake(22.87, 30.8)]; + [bezier2Path addLineToPoint: CGPointMake(22.81, 30.78)]; + [bezier2Path addLineToPoint: CGPointMake(22.76, 30.77)]; + [bezier2Path addLineToPoint: CGPointMake(22.7, 30.75)]; + [bezier2Path addLineToPoint: CGPointMake(22.65, 30.74)]; + [bezier2Path addLineToPoint: CGPointMake(22.59, 30.72)]; + [bezier2Path addLineToPoint: CGPointMake(22.54, 30.7)]; + [bezier2Path addLineToPoint: CGPointMake(22.48, 30.69)]; + [bezier2Path addLineToPoint: CGPointMake(22.43, 30.67)]; + [bezier2Path addLineToPoint: CGPointMake(22.37, 30.65)]; + [bezier2Path addLineToPoint: CGPointMake(22.32, 30.63)]; + [bezier2Path addLineToPoint: CGPointMake(22.26, 30.62)]; + [bezier2Path addLineToPoint: CGPointMake(22.21, 30.6)]; + [bezier2Path addLineToPoint: CGPointMake(22.15, 30.58)]; + [bezier2Path addLineToPoint: CGPointMake(22.1, 30.56)]; + [bezier2Path addLineToPoint: CGPointMake(22.04, 30.54)]; + [bezier2Path addLineToPoint: CGPointMake(21.99, 30.52)]; + [bezier2Path addLineToPoint: CGPointMake(21.93, 30.5)]; + [bezier2Path addLineToPoint: CGPointMake(21.88, 30.48)]; + [bezier2Path addLineToPoint: CGPointMake(21.82, 30.46)]; + [bezier2Path addLineToPoint: CGPointMake(21.77, 30.44)]; + [bezier2Path addLineToPoint: CGPointMake(21.71, 30.42)]; + [bezier2Path addLineToPoint: CGPointMake(21.66, 30.4)]; + [bezier2Path addLineToPoint: CGPointMake(21.61, 30.38)]; + [bezier2Path addLineToPoint: CGPointMake(21.55, 30.36)]; + [bezier2Path addLineToPoint: CGPointMake(21.5, 30.34)]; + [bezier2Path addLineToPoint: CGPointMake(21.44, 30.32)]; + [bezier2Path addLineToPoint: CGPointMake(21.39, 30.29)]; + [bezier2Path addLineToPoint: CGPointMake(21.33, 30.27)]; + [bezier2Path addLineToPoint: CGPointMake(21.28, 30.25)]; + [bezier2Path addLineToPoint: CGPointMake(21.22, 30.23)]; + [bezier2Path addLineToPoint: CGPointMake(21.17, 30.2)]; + [bezier2Path addLineToPoint: CGPointMake(21.11, 30.18)]; + [bezier2Path addLineToPoint: CGPointMake(21.06, 30.16)]; + [bezier2Path addLineToPoint: CGPointMake(21, 30.13)]; + [bezier2Path addLineToPoint: CGPointMake(20.95, 30.11)]; + [bezier2Path addLineToPoint: CGPointMake(20.89, 30.08)]; + [bezier2Path addLineToPoint: CGPointMake(20.84, 30.06)]; + [bezier2Path addLineToPoint: CGPointMake(20.78, 30.04)]; + [bezier2Path addLineToPoint: CGPointMake(20.73, 30.01)]; + [bezier2Path addLineToPoint: CGPointMake(20.67, 29.98)]; + [bezier2Path addLineToPoint: CGPointMake(20.62, 29.96)]; + [bezier2Path addLineToPoint: CGPointMake(20.62, 29.96)]; + [bezier2Path addLineToPoint: CGPointMake(20.62, 29.96)]; + [bezier2Path addLineToPoint: CGPointMake(20.62, 29.96)]; + [bezier2Path addLineToPoint: CGPointMake(20.62, 29.96)]; + [bezier2Path closePath]; + bezier2Path.miterLimit = 4; + + bezier2Path.usesEvenOddFillRule = YES; + + CGContextSaveGState(context); + [bezier2Path addClip]; + CGContextDrawLinearGradient(context, linearGradient2, + CGPointMake(20.5, 27.28), + CGPointMake(34.54, 27.28), + kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation); + CGContextRestoreGState(context); + + + //// Bezier 3 Drawing + UIBezierPath* bezier3Path = [UIBezierPath bezierPath]; + [bezier3Path moveToPoint: CGPointMake(36.5, 23.41)]; + [bezier3Path addLineToPoint: CGPointMake(36.5, 16.09)]; + [bezier3Path addCurveToPoint: CGPointMake(36.62, 14.96) controlPoint1: CGPointMake(36.5, 15.7) controlPoint2: CGPointMake(36.54, 15.32)]; + [bezier3Path addCurveToPoint: CGPointMake(36.67, 14.72) controlPoint1: CGPointMake(36.63, 14.88) controlPoint2: CGPointMake(36.65, 14.8)]; + [bezier3Path addCurveToPoint: CGPointMake(36.73, 14.52) controlPoint1: CGPointMake(36.69, 14.66) controlPoint2: CGPointMake(36.71, 14.59)]; + [bezier3Path addCurveToPoint: CGPointMake(36.78, 14.35) controlPoint1: CGPointMake(36.74, 14.47) controlPoint2: CGPointMake(36.76, 14.41)]; + [bezier3Path addCurveToPoint: CGPointMake(36.84, 14.19) controlPoint1: CGPointMake(36.8, 14.3) controlPoint2: CGPointMake(36.82, 14.25)]; + [bezier3Path addCurveToPoint: CGPointMake(36.89, 14.05) controlPoint1: CGPointMake(36.85, 14.15) controlPoint2: CGPointMake(36.87, 14.1)]; + [bezier3Path addCurveToPoint: CGPointMake(36.95, 13.92) controlPoint1: CGPointMake(36.91, 14.01) controlPoint2: CGPointMake(36.93, 13.96)]; + [bezier3Path addCurveToPoint: CGPointMake(37, 13.79) controlPoint1: CGPointMake(36.96, 13.88) controlPoint2: CGPointMake(36.98, 13.83)]; + [bezier3Path addCurveToPoint: CGPointMake(37.06, 13.68) controlPoint1: CGPointMake(37.02, 13.76) controlPoint2: CGPointMake(37.04, 13.72)]; + [bezier3Path addCurveToPoint: CGPointMake(37.11, 13.57) controlPoint1: CGPointMake(37.07, 13.64) controlPoint2: CGPointMake(37.09, 13.61)]; + [bezier3Path addCurveToPoint: CGPointMake(37.17, 13.47) controlPoint1: CGPointMake(37.13, 13.53) controlPoint2: CGPointMake(37.15, 13.5)]; + [bezier3Path addCurveToPoint: CGPointMake(37.22, 13.37) controlPoint1: CGPointMake(37.18, 13.43) controlPoint2: CGPointMake(37.2, 13.4)]; + [bezier3Path addCurveToPoint: CGPointMake(37.28, 13.27) controlPoint1: CGPointMake(37.24, 13.34) controlPoint2: CGPointMake(37.26, 13.3)]; + [bezier3Path addCurveToPoint: CGPointMake(37.33, 13.18) controlPoint1: CGPointMake(37.29, 13.24) controlPoint2: CGPointMake(37.31, 13.21)]; + [bezier3Path addCurveToPoint: CGPointMake(37.39, 13.1) controlPoint1: CGPointMake(37.35, 13.15) controlPoint2: CGPointMake(37.37, 13.12)]; + [bezier3Path addCurveToPoint: CGPointMake(37.44, 13.01) controlPoint1: CGPointMake(37.4, 13.07) controlPoint2: CGPointMake(37.42, 13.04)]; + [bezier3Path addCurveToPoint: CGPointMake(37.5, 12.93) controlPoint1: CGPointMake(37.46, 12.99) controlPoint2: CGPointMake(37.48, 12.96)]; + [bezier3Path addCurveToPoint: CGPointMake(37.55, 12.86) controlPoint1: CGPointMake(37.51, 12.91) controlPoint2: CGPointMake(37.53, 12.88)]; + [bezier3Path addCurveToPoint: CGPointMake(37.61, 12.78) controlPoint1: CGPointMake(37.57, 12.83) controlPoint2: CGPointMake(37.59, 12.81)]; + [bezier3Path addCurveToPoint: CGPointMake(37.66, 12.71) controlPoint1: CGPointMake(37.62, 12.76) controlPoint2: CGPointMake(37.64, 12.73)]; + [bezier3Path addCurveToPoint: CGPointMake(37.71, 12.64) controlPoint1: CGPointMake(37.68, 12.69) controlPoint2: CGPointMake(37.7, 12.66)]; + [bezier3Path addCurveToPoint: CGPointMake(37.77, 12.57) controlPoint1: CGPointMake(37.73, 12.62) controlPoint2: CGPointMake(37.75, 12.59)]; + [bezier3Path addCurveToPoint: CGPointMake(37.82, 12.51) controlPoint1: CGPointMake(37.79, 12.55) controlPoint2: CGPointMake(37.81, 12.53)]; + [bezier3Path addCurveToPoint: CGPointMake(37.88, 12.44) controlPoint1: CGPointMake(37.84, 12.49) controlPoint2: CGPointMake(37.86, 12.46)]; + [bezier3Path addCurveToPoint: CGPointMake(37.93, 12.38) controlPoint1: CGPointMake(37.9, 12.42) controlPoint2: CGPointMake(37.92, 12.4)]; + [bezier3Path addCurveToPoint: CGPointMake(37.99, 12.32) controlPoint1: CGPointMake(37.95, 12.36) controlPoint2: CGPointMake(37.97, 12.34)]; + [bezier3Path addCurveToPoint: CGPointMake(38.04, 12.26) controlPoint1: CGPointMake(38.01, 12.3) controlPoint2: CGPointMake(38.03, 12.28)]; + [bezier3Path addCurveToPoint: CGPointMake(38.1, 12.21) controlPoint1: CGPointMake(38.06, 12.25) controlPoint2: CGPointMake(38.08, 12.23)]; + [bezier3Path addCurveToPoint: CGPointMake(38.15, 12.15) controlPoint1: CGPointMake(38.12, 12.19) controlPoint2: CGPointMake(38.14, 12.17)]; + [bezier3Path addCurveToPoint: CGPointMake(38.21, 12.1) controlPoint1: CGPointMake(38.17, 12.13) controlPoint2: CGPointMake(38.19, 12.12)]; + [bezier3Path addCurveToPoint: CGPointMake(38.26, 12.05) controlPoint1: CGPointMake(38.23, 12.08) controlPoint2: CGPointMake(38.24, 12.06)]; + [bezier3Path addCurveToPoint: CGPointMake(38.32, 12) controlPoint1: CGPointMake(38.28, 12.03) controlPoint2: CGPointMake(38.3, 12.01)]; + [bezier3Path addCurveToPoint: CGPointMake(38.37, 11.95) controlPoint1: CGPointMake(38.34, 11.98) controlPoint2: CGPointMake(38.35, 11.96)]; + [bezier3Path addCurveToPoint: CGPointMake(38.43, 11.9) controlPoint1: CGPointMake(38.39, 11.93) controlPoint2: CGPointMake(38.41, 11.91)]; + [bezier3Path addCurveToPoint: CGPointMake(38.48, 11.85) controlPoint1: CGPointMake(38.45, 11.88) controlPoint2: CGPointMake(38.46, 11.87)]; + [bezier3Path addCurveToPoint: CGPointMake(38.54, 11.81) controlPoint1: CGPointMake(38.5, 11.84) controlPoint2: CGPointMake(38.52, 11.82)]; + [bezier3Path addCurveToPoint: CGPointMake(38.59, 11.76) controlPoint1: CGPointMake(38.56, 11.79) controlPoint2: CGPointMake(38.57, 11.78)]; + [bezier3Path addCurveToPoint: CGPointMake(38.65, 11.72) controlPoint1: CGPointMake(38.61, 11.75) controlPoint2: CGPointMake(38.63, 11.73)]; + [bezier3Path addCurveToPoint: CGPointMake(38.7, 11.68) controlPoint1: CGPointMake(38.67, 11.7) controlPoint2: CGPointMake(38.68, 11.69)]; + [bezier3Path addCurveToPoint: CGPointMake(38.76, 11.63) controlPoint1: CGPointMake(38.72, 11.66) controlPoint2: CGPointMake(38.74, 11.65)]; + [bezier3Path addCurveToPoint: CGPointMake(38.81, 11.59) controlPoint1: CGPointMake(38.78, 11.62) controlPoint2: CGPointMake(38.79, 11.61)]; + [bezier3Path addCurveToPoint: CGPointMake(38.87, 11.55) controlPoint1: CGPointMake(38.83, 11.58) controlPoint2: CGPointMake(38.85, 11.57)]; + [bezier3Path addCurveToPoint: CGPointMake(38.92, 11.52) controlPoint1: CGPointMake(38.89, 11.54) controlPoint2: CGPointMake(38.9, 11.53)]; + [bezier3Path addCurveToPoint: CGPointMake(38.98, 11.48) controlPoint1: CGPointMake(38.94, 11.5) controlPoint2: CGPointMake(38.96, 11.49)]; + [bezier3Path addCurveToPoint: CGPointMake(39.03, 11.44) controlPoint1: CGPointMake(38.99, 11.47) controlPoint2: CGPointMake(39.01, 11.45)]; + [bezier3Path addCurveToPoint: CGPointMake(39.09, 11.41) controlPoint1: CGPointMake(39.05, 11.43) controlPoint2: CGPointMake(39.07, 11.42)]; + [bezier3Path addCurveToPoint: CGPointMake(39.14, 11.37) controlPoint1: CGPointMake(39.1, 11.39) controlPoint2: CGPointMake(39.12, 11.38)]; + [bezier3Path addCurveToPoint: CGPointMake(39.2, 11.34) controlPoint1: CGPointMake(39.16, 11.36) controlPoint2: CGPointMake(39.18, 11.35)]; + [bezier3Path addCurveToPoint: CGPointMake(39.25, 11.3) controlPoint1: CGPointMake(39.21, 11.33) controlPoint2: CGPointMake(39.23, 11.32)]; + [bezier3Path addCurveToPoint: CGPointMake(39.31, 11.27) controlPoint1: CGPointMake(39.27, 11.29) controlPoint2: CGPointMake(39.29, 11.28)]; + [bezier3Path addCurveToPoint: CGPointMake(39.36, 11.24) controlPoint1: CGPointMake(39.32, 11.26) controlPoint2: CGPointMake(39.34, 11.25)]; + [bezier3Path addCurveToPoint: CGPointMake(39.42, 11.21) controlPoint1: CGPointMake(39.38, 11.23) controlPoint2: CGPointMake(39.4, 11.22)]; + [bezier3Path addCurveToPoint: CGPointMake(39.47, 11.18) controlPoint1: CGPointMake(39.43, 11.2) controlPoint2: CGPointMake(39.45, 11.19)]; + [bezier3Path addCurveToPoint: CGPointMake(39.53, 11.15) controlPoint1: CGPointMake(39.49, 11.17) controlPoint2: CGPointMake(39.51, 11.16)]; + [bezier3Path addCurveToPoint: CGPointMake(39.58, 11.12) controlPoint1: CGPointMake(39.54, 11.14) controlPoint2: CGPointMake(39.56, 11.13)]; + [bezier3Path addLineToPoint: CGPointMake(39.63, 11.1)]; + [bezier3Path addLineToPoint: CGPointMake(39.69, 11.07)]; + [bezier3Path addCurveToPoint: CGPointMake(39.74, 11.04) controlPoint1: CGPointMake(39.71, 11.06) controlPoint2: CGPointMake(39.73, 11.05)]; + [bezier3Path addCurveToPoint: CGPointMake(39.8, 11.02) controlPoint1: CGPointMake(39.76, 11.03) controlPoint2: CGPointMake(39.78, 11.03)]; + [bezier3Path addCurveToPoint: CGPointMake(39.85, 10.99) controlPoint1: CGPointMake(39.82, 11.01) controlPoint2: CGPointMake(39.84, 11)]; + [bezier3Path addCurveToPoint: CGPointMake(39.91, 10.97) controlPoint1: CGPointMake(39.87, 10.98) controlPoint2: CGPointMake(39.89, 10.98)]; + [bezier3Path addCurveToPoint: CGPointMake(39.96, 10.95) controlPoint1: CGPointMake(39.93, 10.96) controlPoint2: CGPointMake(39.95, 10.95)]; + [bezier3Path addCurveToPoint: CGPointMake(40.02, 10.92) controlPoint1: CGPointMake(39.98, 10.94) controlPoint2: CGPointMake(40, 10.93)]; + [bezier3Path addLineToPoint: CGPointMake(40.07, 10.9)]; + [bezier3Path addCurveToPoint: CGPointMake(40.13, 10.88) controlPoint1: CGPointMake(40.09, 10.89) controlPoint2: CGPointMake(40.11, 10.89)]; + [bezier3Path addCurveToPoint: CGPointMake(40.18, 10.86) controlPoint1: CGPointMake(40.15, 10.87) controlPoint2: CGPointMake(40.17, 10.87)]; + [bezier3Path addCurveToPoint: CGPointMake(40.24, 10.84) controlPoint1: CGPointMake(40.2, 10.85) controlPoint2: CGPointMake(40.22, 10.85)]; + [bezier3Path addCurveToPoint: CGPointMake(40.29, 10.82) controlPoint1: CGPointMake(40.26, 10.83) controlPoint2: CGPointMake(40.27, 10.83)]; + [bezier3Path addCurveToPoint: CGPointMake(40.35, 10.8) controlPoint1: CGPointMake(40.31, 10.81) controlPoint2: CGPointMake(40.33, 10.81)]; + [bezier3Path addCurveToPoint: CGPointMake(40.4, 10.78) controlPoint1: CGPointMake(40.37, 10.79) controlPoint2: CGPointMake(40.38, 10.79)]; + [bezier3Path addLineToPoint: CGPointMake(40.46, 10.77)]; + [bezier3Path addCurveToPoint: CGPointMake(40.51, 10.75) controlPoint1: CGPointMake(40.48, 10.76) controlPoint2: CGPointMake(40.49, 10.75)]; + [bezier3Path addCurveToPoint: CGPointMake(40.57, 10.73) controlPoint1: CGPointMake(40.53, 10.74) controlPoint2: CGPointMake(40.55, 10.74)]; + [bezier3Path addCurveToPoint: CGPointMake(40.62, 10.72) controlPoint1: CGPointMake(40.59, 10.73) controlPoint2: CGPointMake(40.6, 10.72)]; + [bezier3Path addCurveToPoint: CGPointMake(40.68, 10.7) controlPoint1: CGPointMake(40.64, 10.71) controlPoint2: CGPointMake(40.66, 10.71)]; + [bezier3Path addLineToPoint: CGPointMake(40.73, 10.69)]; + [bezier3Path addCurveToPoint: CGPointMake(40.79, 10.67) controlPoint1: CGPointMake(40.75, 10.68) controlPoint2: CGPointMake(40.77, 10.68)]; + [bezier3Path addCurveToPoint: CGPointMake(40.84, 10.66) controlPoint1: CGPointMake(40.81, 10.67) controlPoint2: CGPointMake(40.82, 10.66)]; + [bezier3Path addCurveToPoint: CGPointMake(40.9, 10.65) controlPoint1: CGPointMake(40.86, 10.65) controlPoint2: CGPointMake(40.88, 10.65)]; + [bezier3Path addCurveToPoint: CGPointMake(40.95, 10.63) controlPoint1: CGPointMake(40.91, 10.64) controlPoint2: CGPointMake(40.93, 10.64)]; + [bezier3Path addLineToPoint: CGPointMake(41.01, 10.62)]; + [bezier3Path addCurveToPoint: CGPointMake(41.06, 10.61) controlPoint1: CGPointMake(41.02, 10.62) controlPoint2: CGPointMake(41.04, 10.61)]; + [bezier3Path addCurveToPoint: CGPointMake(41.12, 10.6) controlPoint1: CGPointMake(41.08, 10.61) controlPoint2: CGPointMake(41.1, 10.6)]; + [bezier3Path addCurveToPoint: CGPointMake(41.17, 10.59) controlPoint1: CGPointMake(41.13, 10.6) controlPoint2: CGPointMake(41.15, 10.59)]; + [bezier3Path addLineToPoint: CGPointMake(41.23, 10.58)]; + [bezier3Path addLineToPoint: CGPointMake(41.28, 10.57)]; + [bezier3Path addCurveToPoint: CGPointMake(41.34, 10.56) controlPoint1: CGPointMake(41.3, 10.57) controlPoint2: CGPointMake(41.32, 10.57)]; + [bezier3Path addCurveToPoint: CGPointMake(41.39, 10.56) controlPoint1: CGPointMake(41.35, 10.56) controlPoint2: CGPointMake(41.37, 10.56)]; + [bezier3Path addCurveToPoint: CGPointMake(41.45, 10.55) controlPoint1: CGPointMake(41.41, 10.55) controlPoint2: CGPointMake(41.43, 10.55)]; + [bezier3Path addLineToPoint: CGPointMake(41.5, 10.54)]; + [bezier3Path addLineToPoint: CGPointMake(41.55, 10.54)]; + [bezier3Path addCurveToPoint: CGPointMake(41.61, 10.53) controlPoint1: CGPointMake(41.57, 10.53) controlPoint2: CGPointMake(41.59, 10.53)]; + [bezier3Path addCurveToPoint: CGPointMake(41.66, 10.52) controlPoint1: CGPointMake(41.63, 10.53) controlPoint2: CGPointMake(41.65, 10.53)]; + [bezier3Path addLineToPoint: CGPointMake(41.72, 10.52)]; + [bezier3Path addCurveToPoint: CGPointMake(41.77, 10.52) controlPoint1: CGPointMake(41.74, 10.52) controlPoint2: CGPointMake(41.76, 10.52)]; + [bezier3Path addCurveToPoint: CGPointMake(41.83, 10.51) controlPoint1: CGPointMake(41.79, 10.51) controlPoint2: CGPointMake(41.81, 10.51)]; + [bezier3Path addCurveToPoint: CGPointMake(41.88, 10.51) controlPoint1: CGPointMake(41.85, 10.51) controlPoint2: CGPointMake(41.87, 10.51)]; + [bezier3Path addCurveToPoint: CGPointMake(41.94, 10.51) controlPoint1: CGPointMake(41.9, 10.51) controlPoint2: CGPointMake(41.92, 10.51)]; + [bezier3Path addLineToPoint: CGPointMake(41.99, 10.5)]; + [bezier3Path addCurveToPoint: CGPointMake(42.05, 10.5) controlPoint1: CGPointMake(42.01, 10.5) controlPoint2: CGPointMake(42.03, 10.5)]; + [bezier3Path addCurveToPoint: CGPointMake(42.1, 10.5) controlPoint1: CGPointMake(42.07, 10.5) controlPoint2: CGPointMake(42.09, 10.5)]; + [bezier3Path addCurveToPoint: CGPointMake(42.16, 10.5) controlPoint1: CGPointMake(42.12, 10.5) controlPoint2: CGPointMake(42.14, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(42.21, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(42.27, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(42.32, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(42.38, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(42.43, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(42.49, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(42.54, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(42.6, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(42.65, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(42.71, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(42.76, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(42.82, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(42.87, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(42.93, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(42.98, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(43.04, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(43.09, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(43.15, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(43.2, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(43.26, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(43.31, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(43.37, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(43.42, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(43.47, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(43.53, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(43.58, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(43.64, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(43.69, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(43.75, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(43.8, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(43.86, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(43.91, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(43.97, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(44.02, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(44.08, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(44.13, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(44.19, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(44.24, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(44.3, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(44.35, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(44.41, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(44.46, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(44.52, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(44.57, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(44.63, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(44.68, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(44.74, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(44.79, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(44.85, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(44.9, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(44.96, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(45.01, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(45.07, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(45.12, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(45.18, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(45.23, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(45.29, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(45.34, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(45.39, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(45.45, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(45.5, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(45.56, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(45.61, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(45.67, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(45.72, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(45.78, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(45.83, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(45.89, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(45.94, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(46, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(46.05, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(46.11, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(46.16, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(46.22, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(46.27, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(46.33, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(46.38, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(46.44, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(46.49, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(46.55, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(46.6, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(46.66, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(46.71, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(46.77, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(46.82, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(46.88, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(46.93, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(46.99, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(47.04, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(47.1, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(47.15, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(47.21, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(47.26, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(47.31, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(47.37, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(47.42, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(47.48, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(47.53, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(47.59, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(47.64, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(47.7, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(47.75, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(47.81, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(47.86, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(47.92, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(47.97, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(48.03, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(48.08, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(48.14, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(48.19, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(48.25, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(48.3, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(48.36, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(48.41, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(48.47, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(48.52, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(48.58, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(48.63, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(48.69, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(48.74, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(48.8, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(48.85, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(48.91, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(48.96, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(49.02, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(49.07, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(49.13, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(49.18, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(49.23, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(49.29, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(49.34, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(49.4, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(49.45, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(49.51, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(49.56, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(49.62, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(49.67, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(49.73, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(49.78, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(49.84, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(49.89, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(49.95, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(50, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(50.06, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(50.11, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(50.17, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(50.22, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(50.28, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(50.33, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(50.39, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(50.44, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(50.5, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(50.54, 10.5)]; + [bezier3Path addLineToPoint: CGPointMake(50.54, 38.46)]; + [bezier3Path addCurveToPoint: CGPointMake(50.5, 39.18) controlPoint1: CGPointMake(50.54, 38.7) controlPoint2: CGPointMake(50.53, 38.94)]; + [bezier3Path addCurveToPoint: CGPointMake(50.44, 39.51) controlPoint1: CGPointMake(50.48, 39.29) controlPoint2: CGPointMake(50.46, 39.4)]; + [bezier3Path addCurveToPoint: CGPointMake(50.39, 39.77) controlPoint1: CGPointMake(50.43, 39.6) controlPoint2: CGPointMake(50.41, 39.68)]; + [bezier3Path addCurveToPoint: CGPointMake(50.33, 39.97) controlPoint1: CGPointMake(50.37, 39.84) controlPoint2: CGPointMake(50.35, 39.91)]; + [bezier3Path addCurveToPoint: CGPointMake(50.28, 40.15) controlPoint1: CGPointMake(50.31, 40.03) controlPoint2: CGPointMake(50.3, 40.09)]; + [bezier3Path addCurveToPoint: CGPointMake(50.22, 40.32) controlPoint1: CGPointMake(50.26, 40.21) controlPoint2: CGPointMake(50.24, 40.26)]; + [bezier3Path addCurveToPoint: CGPointMake(50.17, 40.46) controlPoint1: CGPointMake(50.2, 40.36) controlPoint2: CGPointMake(50.19, 40.41)]; + [bezier3Path addCurveToPoint: CGPointMake(50.11, 40.6) controlPoint1: CGPointMake(50.15, 40.51) controlPoint2: CGPointMake(50.13, 40.55)]; + [bezier3Path addCurveToPoint: CGPointMake(50.06, 40.72) controlPoint1: CGPointMake(50.09, 40.64) controlPoint2: CGPointMake(50.08, 40.68)]; + [bezier3Path addCurveToPoint: CGPointMake(50, 40.84) controlPoint1: CGPointMake(50.04, 40.76) controlPoint2: CGPointMake(50.02, 40.8)]; + [bezier3Path addCurveToPoint: CGPointMake(49.95, 40.95) controlPoint1: CGPointMake(49.98, 40.88) controlPoint2: CGPointMake(49.97, 40.92)]; + [bezier3Path addCurveToPoint: CGPointMake(49.89, 41.06) controlPoint1: CGPointMake(49.93, 40.99) controlPoint2: CGPointMake(49.91, 41.02)]; + [bezier3Path addCurveToPoint: CGPointMake(49.84, 41.16) controlPoint1: CGPointMake(49.88, 41.09) controlPoint2: CGPointMake(49.86, 41.12)]; + [bezier3Path addCurveToPoint: CGPointMake(49.78, 41.25) controlPoint1: CGPointMake(49.82, 41.19) controlPoint2: CGPointMake(49.8, 41.22)]; + [bezier3Path addCurveToPoint: CGPointMake(49.73, 41.34) controlPoint1: CGPointMake(49.77, 41.28) controlPoint2: CGPointMake(49.75, 41.31)]; + [bezier3Path addCurveToPoint: CGPointMake(49.67, 41.43) controlPoint1: CGPointMake(49.71, 41.37) controlPoint2: CGPointMake(49.69, 41.4)]; + [bezier3Path addCurveToPoint: CGPointMake(49.62, 41.52) controlPoint1: CGPointMake(49.66, 41.46) controlPoint2: CGPointMake(49.64, 41.49)]; + [bezier3Path addCurveToPoint: CGPointMake(49.56, 41.6) controlPoint1: CGPointMake(49.6, 41.54) controlPoint2: CGPointMake(49.58, 41.57)]; + [bezier3Path addCurveToPoint: CGPointMake(49.51, 41.68) controlPoint1: CGPointMake(49.55, 41.62) controlPoint2: CGPointMake(49.53, 41.65)]; + [bezier3Path addCurveToPoint: CGPointMake(49.45, 41.75) controlPoint1: CGPointMake(49.49, 41.7) controlPoint2: CGPointMake(49.47, 41.73)]; + [bezier3Path addCurveToPoint: CGPointMake(49.4, 41.82) controlPoint1: CGPointMake(49.44, 41.77) controlPoint2: CGPointMake(49.42, 41.8)]; + [bezier3Path addCurveToPoint: CGPointMake(49.34, 41.89) controlPoint1: CGPointMake(49.38, 41.85) controlPoint2: CGPointMake(49.36, 41.87)]; + [bezier3Path addCurveToPoint: CGPointMake(49.29, 41.96) controlPoint1: CGPointMake(49.33, 41.92) controlPoint2: CGPointMake(49.31, 41.94)]; + [bezier3Path addCurveToPoint: CGPointMake(49.23, 42.03) controlPoint1: CGPointMake(49.27, 41.98) controlPoint2: CGPointMake(49.25, 42.01)]; + [bezier3Path addCurveToPoint: CGPointMake(49.18, 42.09) controlPoint1: CGPointMake(49.22, 42.05) controlPoint2: CGPointMake(49.2, 42.07)]; + [bezier3Path addCurveToPoint: CGPointMake(49.13, 42.15) controlPoint1: CGPointMake(49.16, 42.11) controlPoint2: CGPointMake(49.14, 42.13)]; + [bezier3Path addCurveToPoint: CGPointMake(49.07, 42.21) controlPoint1: CGPointMake(49.11, 42.17) controlPoint2: CGPointMake(49.09, 42.19)]; + [bezier3Path addCurveToPoint: CGPointMake(49.02, 42.27) controlPoint1: CGPointMake(49.05, 42.23) controlPoint2: CGPointMake(49.03, 42.25)]; + [bezier3Path addCurveToPoint: CGPointMake(48.96, 42.33) controlPoint1: CGPointMake(49, 42.29) controlPoint2: CGPointMake(48.98, 42.31)]; + [bezier3Path addCurveToPoint: CGPointMake(48.91, 42.39) controlPoint1: CGPointMake(48.94, 42.35) controlPoint2: CGPointMake(48.92, 42.37)]; + [bezier3Path addCurveToPoint: CGPointMake(48.85, 42.44) controlPoint1: CGPointMake(48.89, 42.4) controlPoint2: CGPointMake(48.87, 42.42)]; + [bezier3Path addCurveToPoint: CGPointMake(48.8, 42.49) controlPoint1: CGPointMake(48.83, 42.46) controlPoint2: CGPointMake(48.81, 42.47)]; + [bezier3Path addCurveToPoint: CGPointMake(48.74, 42.54) controlPoint1: CGPointMake(48.78, 42.51) controlPoint2: CGPointMake(48.76, 42.53)]; + [bezier3Path addCurveToPoint: CGPointMake(48.69, 42.59) controlPoint1: CGPointMake(48.72, 42.56) controlPoint2: CGPointMake(48.7, 42.58)]; + [bezier3Path addCurveToPoint: CGPointMake(48.63, 42.64) controlPoint1: CGPointMake(48.67, 42.61) controlPoint2: CGPointMake(48.65, 42.63)]; + [bezier3Path addCurveToPoint: CGPointMake(48.58, 42.69) controlPoint1: CGPointMake(48.61, 42.66) controlPoint2: CGPointMake(48.59, 42.67)]; + [bezier3Path addCurveToPoint: CGPointMake(48.52, 42.73) controlPoint1: CGPointMake(48.56, 42.7) controlPoint2: CGPointMake(48.54, 42.72)]; + [bezier3Path addCurveToPoint: CGPointMake(48.47, 42.78) controlPoint1: CGPointMake(48.5, 42.75) controlPoint2: CGPointMake(48.49, 42.77)]; + [bezier3Path addCurveToPoint: CGPointMake(48.41, 42.82) controlPoint1: CGPointMake(48.45, 42.79) controlPoint2: CGPointMake(48.43, 42.81)]; + [bezier3Path addCurveToPoint: CGPointMake(48.36, 42.87) controlPoint1: CGPointMake(48.39, 42.84) controlPoint2: CGPointMake(48.38, 42.85)]; + [bezier3Path addCurveToPoint: CGPointMake(48.3, 42.91) controlPoint1: CGPointMake(48.34, 42.88) controlPoint2: CGPointMake(48.32, 42.89)]; + [bezier3Path addCurveToPoint: CGPointMake(48.25, 42.95) controlPoint1: CGPointMake(48.28, 42.92) controlPoint2: CGPointMake(48.27, 42.94)]; + [bezier3Path addCurveToPoint: CGPointMake(48.19, 42.99) controlPoint1: CGPointMake(48.23, 42.96) controlPoint2: CGPointMake(48.21, 42.98)]; + [bezier3Path addCurveToPoint: CGPointMake(48.14, 43.03) controlPoint1: CGPointMake(48.17, 43) controlPoint2: CGPointMake(48.16, 43.01)]; + [bezier3Path addCurveToPoint: CGPointMake(48.08, 43.06) controlPoint1: CGPointMake(48.12, 43.04) controlPoint2: CGPointMake(48.1, 43.05)]; + [bezier3Path addCurveToPoint: CGPointMake(48.03, 43.1) controlPoint1: CGPointMake(48.06, 43.08) controlPoint2: CGPointMake(48.05, 43.09)]; + [bezier3Path addCurveToPoint: CGPointMake(47.97, 43.14) controlPoint1: CGPointMake(48.01, 43.11) controlPoint2: CGPointMake(47.99, 43.13)]; + [bezier3Path addCurveToPoint: CGPointMake(47.92, 43.17) controlPoint1: CGPointMake(47.95, 43.15) controlPoint2: CGPointMake(47.94, 43.16)]; + [bezier3Path addCurveToPoint: CGPointMake(47.86, 43.21) controlPoint1: CGPointMake(47.9, 43.18) controlPoint2: CGPointMake(47.88, 43.2)]; + [bezier3Path addCurveToPoint: CGPointMake(47.81, 43.24) controlPoint1: CGPointMake(47.85, 43.22) controlPoint2: CGPointMake(47.83, 43.23)]; + [bezier3Path addCurveToPoint: CGPointMake(47.75, 43.27) controlPoint1: CGPointMake(47.79, 43.25) controlPoint2: CGPointMake(47.77, 43.26)]; + [bezier3Path addCurveToPoint: CGPointMake(47.7, 43.3) controlPoint1: CGPointMake(47.74, 43.28) controlPoint2: CGPointMake(47.72, 43.29)]; + [bezier3Path addCurveToPoint: CGPointMake(47.64, 43.33) controlPoint1: CGPointMake(47.68, 43.31) controlPoint2: CGPointMake(47.66, 43.32)]; + [bezier3Path addLineToPoint: CGPointMake(47.59, 43.36)]; + [bezier3Path addLineToPoint: CGPointMake(47.53, 43.39)]; + [bezier3Path addLineToPoint: CGPointMake(47.48, 43.42)]; + [bezier3Path addCurveToPoint: CGPointMake(47.42, 43.45) controlPoint1: CGPointMake(47.46, 43.43) controlPoint2: CGPointMake(47.44, 43.44)]; + [bezier3Path addCurveToPoint: CGPointMake(47.37, 43.48) controlPoint1: CGPointMake(47.41, 43.46) controlPoint2: CGPointMake(47.39, 43.47)]; + [bezier3Path addCurveToPoint: CGPointMake(47.31, 43.5) controlPoint1: CGPointMake(47.35, 43.49) controlPoint2: CGPointMake(47.33, 43.49)]; + [bezier3Path addCurveToPoint: CGPointMake(47.26, 43.53) controlPoint1: CGPointMake(47.3, 43.51) controlPoint2: CGPointMake(47.28, 43.52)]; + [bezier3Path addCurveToPoint: CGPointMake(47.21, 43.55) controlPoint1: CGPointMake(47.24, 43.54) controlPoint2: CGPointMake(47.22, 43.55)]; + [bezier3Path addCurveToPoint: CGPointMake(47.15, 43.58) controlPoint1: CGPointMake(47.19, 43.56) controlPoint2: CGPointMake(47.17, 43.57)]; + [bezier3Path addLineToPoint: CGPointMake(47.1, 43.6)]; + [bezier3Path addLineToPoint: CGPointMake(47.04, 43.62)]; + [bezier3Path addLineToPoint: CGPointMake(46.99, 43.65)]; + [bezier3Path addCurveToPoint: CGPointMake(46.93, 43.67) controlPoint1: CGPointMake(46.97, 43.65) controlPoint2: CGPointMake(46.95, 43.66)]; + [bezier3Path addCurveToPoint: CGPointMake(46.88, 43.69) controlPoint1: CGPointMake(46.91, 43.68) controlPoint2: CGPointMake(46.89, 43.68)]; + [bezier3Path addCurveToPoint: CGPointMake(46.82, 43.71) controlPoint1: CGPointMake(46.86, 43.7) controlPoint2: CGPointMake(46.84, 43.7)]; + [bezier3Path addCurveToPoint: CGPointMake(46.77, 43.73) controlPoint1: CGPointMake(46.8, 43.72) controlPoint2: CGPointMake(46.78, 43.72)]; + [bezier3Path addLineToPoint: CGPointMake(46.71, 43.75)]; + [bezier3Path addLineToPoint: CGPointMake(46.66, 43.77)]; + [bezier3Path addCurveToPoint: CGPointMake(46.6, 43.78) controlPoint1: CGPointMake(46.64, 43.77) controlPoint2: CGPointMake(46.62, 43.78)]; + [bezier3Path addCurveToPoint: CGPointMake(46.55, 43.8) controlPoint1: CGPointMake(46.58, 43.79) controlPoint2: CGPointMake(46.57, 43.8)]; + [bezier3Path addCurveToPoint: CGPointMake(46.49, 43.82) controlPoint1: CGPointMake(46.53, 43.81) controlPoint2: CGPointMake(46.51, 43.81)]; + [bezier3Path addLineToPoint: CGPointMake(46.44, 43.83)]; + [bezier3Path addLineToPoint: CGPointMake(46.38, 43.85)]; + [bezier3Path addCurveToPoint: CGPointMake(46.33, 43.86) controlPoint1: CGPointMake(46.36, 43.85) controlPoint2: CGPointMake(46.35, 43.86)]; + [bezier3Path addCurveToPoint: CGPointMake(46.27, 43.88) controlPoint1: CGPointMake(46.31, 43.87) controlPoint2: CGPointMake(46.29, 43.87)]; + [bezier3Path addCurveToPoint: CGPointMake(46.22, 43.89) controlPoint1: CGPointMake(46.25, 43.88) controlPoint2: CGPointMake(46.24, 43.89)]; + [bezier3Path addCurveToPoint: CGPointMake(46.16, 43.9) controlPoint1: CGPointMake(46.2, 43.9) controlPoint2: CGPointMake(46.18, 43.9)]; + [bezier3Path addLineToPoint: CGPointMake(46.11, 43.92)]; + [bezier3Path addLineToPoint: CGPointMake(46.05, 43.93)]; + [bezier3Path addCurveToPoint: CGPointMake(46, 43.94) controlPoint1: CGPointMake(46.03, 43.93) controlPoint2: CGPointMake(46.02, 43.94)]; + [bezier3Path addCurveToPoint: CGPointMake(45.94, 43.95) controlPoint1: CGPointMake(45.98, 43.94) controlPoint2: CGPointMake(45.96, 43.95)]; + [bezier3Path addLineToPoint: CGPointMake(45.89, 43.96)]; + [bezier3Path addLineToPoint: CGPointMake(45.83, 43.97)]; + [bezier3Path addCurveToPoint: CGPointMake(45.78, 43.98) controlPoint1: CGPointMake(45.82, 43.97) controlPoint2: CGPointMake(45.8, 43.98)]; + [bezier3Path addCurveToPoint: CGPointMake(45.72, 43.99) controlPoint1: CGPointMake(45.76, 43.98) controlPoint2: CGPointMake(45.74, 43.99)]; + [bezier3Path addCurveToPoint: CGPointMake(45.67, 44) controlPoint1: CGPointMake(45.71, 43.99) controlPoint2: CGPointMake(45.69, 43.99)]; + [bezier3Path addLineToPoint: CGPointMake(45.61, 44)]; + [bezier3Path addCurveToPoint: CGPointMake(45.56, 44.01) controlPoint1: CGPointMake(45.6, 44.01) controlPoint2: CGPointMake(45.58, 44.01)]; + [bezier3Path addCurveToPoint: CGPointMake(45.5, 44.02) controlPoint1: CGPointMake(45.54, 44.01) controlPoint2: CGPointMake(45.52, 44.01)]; + [bezier3Path addCurveToPoint: CGPointMake(45.45, 44.02) controlPoint1: CGPointMake(45.49, 44.02) controlPoint2: CGPointMake(45.47, 44.02)]; + [bezier3Path addCurveToPoint: CGPointMake(45.39, 44.03) controlPoint1: CGPointMake(45.43, 44.02) controlPoint2: CGPointMake(45.41, 44.03)]; + [bezier3Path addLineToPoint: CGPointMake(45.34, 44.03)]; + [bezier3Path addCurveToPoint: CGPointMake(45.29, 44.04) controlPoint1: CGPointMake(45.32, 44.03) controlPoint2: CGPointMake(45.3, 44.04)]; + [bezier3Path addCurveToPoint: CGPointMake(45.23, 44.04) controlPoint1: CGPointMake(45.27, 44.04) controlPoint2: CGPointMake(45.25, 44.04)]; + [bezier3Path addLineToPoint: CGPointMake(45.18, 44.04)]; + [bezier3Path addLineToPoint: CGPointMake(45.12, 44.05)]; + [bezier3Path addCurveToPoint: CGPointMake(45.07, 44.05) controlPoint1: CGPointMake(45.1, 44.05) controlPoint2: CGPointMake(45.08, 44.05)]; + [bezier3Path addCurveToPoint: CGPointMake(45.01, 44.05) controlPoint1: CGPointMake(45.05, 44.05) controlPoint2: CGPointMake(45.03, 44.05)]; + [bezier3Path addCurveToPoint: CGPointMake(44.96, 44.05) controlPoint1: CGPointMake(44.99, 44.05) controlPoint2: CGPointMake(44.97, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(44.9, 44.05)]; + [bezier3Path addCurveToPoint: CGPointMake(44.85, 44.05) controlPoint1: CGPointMake(44.88, 44.05) controlPoint2: CGPointMake(44.87, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(44.79, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(44.74, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(44.68, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(44.63, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(44.57, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(44.52, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(44.46, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(44.41, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(44.35, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(44.3, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(44.24, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(44.19, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(44.13, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(44.08, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(44.02, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(43.97, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(43.91, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(43.86, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(43.8, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(43.75, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(43.69, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(43.64, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(43.58, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(43.53, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(43.47, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(43.42, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(43.37, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(43.31, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(43.26, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(43.2, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(43.15, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(43.09, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(43.04, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(42.98, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(42.93, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(42.87, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(42.82, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(42.76, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(42.71, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(42.65, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(42.6, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(42.54, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(42.49, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(42.43, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(42.38, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(42.32, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(42.27, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(42.21, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(42.16, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(42.1, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(42.05, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(41.99, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(41.94, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(41.88, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(41.83, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(41.77, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(41.72, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(41.66, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(41.61, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(41.55, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(41.5, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(41.45, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(41.39, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(41.34, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(41.28, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(41.23, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(41.17, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(41.12, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(41.06, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(41.01, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(40.95, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(40.9, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(40.84, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(40.79, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(40.73, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(40.68, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(40.62, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(40.57, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(40.51, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(40.46, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(40.4, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(40.35, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(40.29, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(40.24, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(40.18, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(40.13, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(40.07, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(40.02, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(39.96, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(39.91, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(39.85, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(39.8, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(39.74, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(39.69, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(39.63, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(39.58, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(39.53, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(39.47, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(39.42, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(39.36, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(39.31, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(39.25, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(39.2, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(39.14, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(39.09, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(39.03, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(38.98, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(38.92, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(38.87, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(38.81, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(38.76, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(38.7, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(38.65, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(38.59, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(38.54, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(38.48, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(38.43, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(38.37, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(38.32, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(38.26, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(38.21, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(38.15, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(38.1, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(38.04, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(37.99, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(37.93, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(37.88, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(37.82, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(37.77, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(37.71, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(37.66, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(37.61, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(37.55, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(37.5, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(37.44, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(37.39, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(37.33, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(37.28, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(37.22, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(37.17, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(37.11, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(37.06, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(37, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(36.95, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(36.89, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(36.84, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(36.78, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(36.73, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(36.67, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(36.62, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(36.5, 44.05)]; + [bezier3Path addLineToPoint: CGPointMake(36.5, 31.14)]; + [bezier3Path addCurveToPoint: CGPointMake(36.62, 31.24) controlPoint1: CGPointMake(36.54, 31.17) controlPoint2: CGPointMake(36.58, 31.21)]; + [bezier3Path addCurveToPoint: CGPointMake(36.67, 31.28) controlPoint1: CGPointMake(36.64, 31.25) controlPoint2: CGPointMake(36.65, 31.27)]; + [bezier3Path addCurveToPoint: CGPointMake(36.73, 31.32) controlPoint1: CGPointMake(36.69, 31.29) controlPoint2: CGPointMake(36.71, 31.31)]; + [bezier3Path addCurveToPoint: CGPointMake(36.78, 31.36) controlPoint1: CGPointMake(36.75, 31.34) controlPoint2: CGPointMake(36.76, 31.35)]; + [bezier3Path addCurveToPoint: CGPointMake(36.84, 31.4) controlPoint1: CGPointMake(36.8, 31.38) controlPoint2: CGPointMake(36.82, 31.39)]; + [bezier3Path addCurveToPoint: CGPointMake(36.89, 31.44) controlPoint1: CGPointMake(36.86, 31.42) controlPoint2: CGPointMake(36.87, 31.43)]; + [bezier3Path addCurveToPoint: CGPointMake(36.95, 31.48) controlPoint1: CGPointMake(36.91, 31.45) controlPoint2: CGPointMake(36.93, 31.47)]; + [bezier3Path addLineToPoint: CGPointMake(37, 31.52)]; + [bezier3Path addCurveToPoint: CGPointMake(37.06, 31.55) controlPoint1: CGPointMake(37.02, 31.53) controlPoint2: CGPointMake(37.04, 31.54)]; + [bezier3Path addLineToPoint: CGPointMake(37.11, 31.59)]; + [bezier3Path addCurveToPoint: CGPointMake(37.17, 31.62) controlPoint1: CGPointMake(37.13, 31.6) controlPoint2: CGPointMake(37.15, 31.61)]; + [bezier3Path addCurveToPoint: CGPointMake(37.22, 31.66) controlPoint1: CGPointMake(37.18, 31.63) controlPoint2: CGPointMake(37.2, 31.64)]; + [bezier3Path addLineToPoint: CGPointMake(37.28, 31.69)]; + [bezier3Path addCurveToPoint: CGPointMake(37.33, 31.72) controlPoint1: CGPointMake(37.29, 31.7) controlPoint2: CGPointMake(37.31, 31.71)]; + [bezier3Path addCurveToPoint: CGPointMake(37.39, 31.75) controlPoint1: CGPointMake(37.35, 31.73) controlPoint2: CGPointMake(37.37, 31.74)]; + [bezier3Path addLineToPoint: CGPointMake(37.44, 31.78)]; + [bezier3Path addLineToPoint: CGPointMake(37.5, 31.81)]; + [bezier3Path addLineToPoint: CGPointMake(37.55, 31.84)]; + [bezier3Path addCurveToPoint: CGPointMake(37.61, 31.87) controlPoint1: CGPointMake(37.57, 31.85) controlPoint2: CGPointMake(37.59, 31.86)]; + [bezier3Path addCurveToPoint: CGPointMake(37.66, 31.9) controlPoint1: CGPointMake(37.62, 31.88) controlPoint2: CGPointMake(37.64, 31.89)]; + [bezier3Path addLineToPoint: CGPointMake(37.71, 31.93)]; + [bezier3Path addLineToPoint: CGPointMake(37.77, 31.95)]; + [bezier3Path addLineToPoint: CGPointMake(37.82, 31.98)]; + [bezier3Path addCurveToPoint: CGPointMake(37.88, 32) controlPoint1: CGPointMake(37.84, 31.99) controlPoint2: CGPointMake(37.86, 32)]; + [bezier3Path addLineToPoint: CGPointMake(37.93, 32.03)]; + [bezier3Path addLineToPoint: CGPointMake(37.99, 32.05)]; + [bezier3Path addLineToPoint: CGPointMake(38.04, 32.08)]; + [bezier3Path addLineToPoint: CGPointMake(38.1, 32.1)]; + [bezier3Path addLineToPoint: CGPointMake(38.15, 32.12)]; + [bezier3Path addLineToPoint: CGPointMake(38.21, 32.15)]; + [bezier3Path addLineToPoint: CGPointMake(38.26, 32.17)]; + [bezier3Path addLineToPoint: CGPointMake(38.32, 32.19)]; + [bezier3Path addLineToPoint: CGPointMake(38.37, 32.21)]; + [bezier3Path addLineToPoint: CGPointMake(38.43, 32.23)]; + [bezier3Path addCurveToPoint: CGPointMake(38.48, 32.25) controlPoint1: CGPointMake(38.45, 32.24) controlPoint2: CGPointMake(38.46, 32.25)]; + [bezier3Path addLineToPoint: CGPointMake(38.54, 32.27)]; + [bezier3Path addCurveToPoint: CGPointMake(38.59, 32.29) controlPoint1: CGPointMake(38.56, 32.28) controlPoint2: CGPointMake(38.57, 32.28)]; + [bezier3Path addCurveToPoint: CGPointMake(38.65, 32.31) controlPoint1: CGPointMake(38.61, 32.3) controlPoint2: CGPointMake(38.63, 32.3)]; + [bezier3Path addLineToPoint: CGPointMake(38.7, 32.33)]; + [bezier3Path addLineToPoint: CGPointMake(38.76, 32.35)]; + [bezier3Path addCurveToPoint: CGPointMake(38.81, 32.36) controlPoint1: CGPointMake(38.78, 32.35) controlPoint2: CGPointMake(38.79, 32.36)]; + [bezier3Path addCurveToPoint: CGPointMake(38.87, 32.38) controlPoint1: CGPointMake(38.83, 32.37) controlPoint2: CGPointMake(38.85, 32.38)]; + [bezier3Path addLineToPoint: CGPointMake(38.92, 32.4)]; + [bezier3Path addLineToPoint: CGPointMake(38.98, 32.42)]; + [bezier3Path addLineToPoint: CGPointMake(39.03, 32.43)]; + [bezier3Path addLineToPoint: CGPointMake(39.09, 32.45)]; + [bezier3Path addLineToPoint: CGPointMake(39.14, 32.46)]; + [bezier3Path addLineToPoint: CGPointMake(39.2, 32.48)]; + [bezier3Path addLineToPoint: CGPointMake(39.25, 32.49)]; + [bezier3Path addLineToPoint: CGPointMake(39.31, 32.51)]; + [bezier3Path addLineToPoint: CGPointMake(39.36, 32.52)]; + [bezier3Path addLineToPoint: CGPointMake(39.42, 32.54)]; + [bezier3Path addLineToPoint: CGPointMake(39.47, 32.55)]; + [bezier3Path addLineToPoint: CGPointMake(39.53, 32.56)]; + [bezier3Path addLineToPoint: CGPointMake(39.58, 32.58)]; + [bezier3Path addLineToPoint: CGPointMake(39.63, 32.59)]; + [bezier3Path addLineToPoint: CGPointMake(39.69, 32.6)]; + [bezier3Path addLineToPoint: CGPointMake(39.74, 32.62)]; + [bezier3Path addLineToPoint: CGPointMake(39.8, 32.63)]; + [bezier3Path addLineToPoint: CGPointMake(39.85, 32.64)]; + [bezier3Path addLineToPoint: CGPointMake(39.91, 32.65)]; + [bezier3Path addLineToPoint: CGPointMake(39.96, 32.66)]; + [bezier3Path addLineToPoint: CGPointMake(40.02, 32.67)]; + [bezier3Path addLineToPoint: CGPointMake(40.07, 32.68)]; + [bezier3Path addLineToPoint: CGPointMake(40.13, 32.69)]; + [bezier3Path addLineToPoint: CGPointMake(40.18, 32.7)]; + [bezier3Path addLineToPoint: CGPointMake(40.24, 32.71)]; + [bezier3Path addLineToPoint: CGPointMake(40.29, 32.72)]; + [bezier3Path addLineToPoint: CGPointMake(40.35, 32.73)]; + [bezier3Path addLineToPoint: CGPointMake(40.4, 32.74)]; + [bezier3Path addLineToPoint: CGPointMake(40.46, 32.75)]; + [bezier3Path addLineToPoint: CGPointMake(40.51, 32.76)]; + [bezier3Path addLineToPoint: CGPointMake(40.57, 32.77)]; + [bezier3Path addLineToPoint: CGPointMake(40.62, 32.78)]; + [bezier3Path addLineToPoint: CGPointMake(40.68, 32.79)]; + [bezier3Path addLineToPoint: CGPointMake(40.73, 32.79)]; + [bezier3Path addLineToPoint: CGPointMake(40.79, 32.8)]; + [bezier3Path addLineToPoint: CGPointMake(40.84, 32.81)]; + [bezier3Path addLineToPoint: CGPointMake(40.9, 32.82)]; + [bezier3Path addLineToPoint: CGPointMake(40.95, 32.82)]; + [bezier3Path addLineToPoint: CGPointMake(41.01, 32.83)]; + [bezier3Path addLineToPoint: CGPointMake(41.06, 32.84)]; + [bezier3Path addLineToPoint: CGPointMake(41.12, 32.84)]; + [bezier3Path addLineToPoint: CGPointMake(41.17, 32.85)]; + [bezier3Path addLineToPoint: CGPointMake(41.23, 32.86)]; + [bezier3Path addLineToPoint: CGPointMake(41.28, 32.86)]; + [bezier3Path addLineToPoint: CGPointMake(41.34, 32.87)]; + [bezier3Path addLineToPoint: CGPointMake(41.39, 32.87)]; + [bezier3Path addLineToPoint: CGPointMake(41.45, 32.88)]; + [bezier3Path addLineToPoint: CGPointMake(41.5, 32.88)]; + [bezier3Path addLineToPoint: CGPointMake(41.55, 32.89)]; + [bezier3Path addLineToPoint: CGPointMake(41.61, 32.89)]; + [bezier3Path addLineToPoint: CGPointMake(41.66, 32.9)]; + [bezier3Path addLineToPoint: CGPointMake(41.72, 32.9)]; + [bezier3Path addLineToPoint: CGPointMake(41.77, 32.91)]; + [bezier3Path addLineToPoint: CGPointMake(41.83, 32.91)]; + [bezier3Path addLineToPoint: CGPointMake(41.88, 32.91)]; + [bezier3Path addLineToPoint: CGPointMake(41.94, 32.92)]; + [bezier3Path addLineToPoint: CGPointMake(41.99, 32.92)]; + [bezier3Path addLineToPoint: CGPointMake(42.05, 32.93)]; + [bezier3Path addLineToPoint: CGPointMake(42.1, 32.93)]; + [bezier3Path addLineToPoint: CGPointMake(42.16, 32.93)]; + [bezier3Path addLineToPoint: CGPointMake(42.21, 32.93)]; + [bezier3Path addLineToPoint: CGPointMake(42.27, 32.94)]; + [bezier3Path addLineToPoint: CGPointMake(42.32, 32.94)]; + [bezier3Path addLineToPoint: CGPointMake(42.38, 32.94)]; + [bezier3Path addLineToPoint: CGPointMake(42.43, 32.94)]; + [bezier3Path addLineToPoint: CGPointMake(42.49, 32.95)]; + [bezier3Path addLineToPoint: CGPointMake(42.54, 32.95)]; + [bezier3Path addLineToPoint: CGPointMake(42.6, 32.95)]; + [bezier3Path addLineToPoint: CGPointMake(42.65, 32.95)]; + [bezier3Path addLineToPoint: CGPointMake(42.71, 32.95)]; + [bezier3Path addLineToPoint: CGPointMake(42.76, 32.96)]; + [bezier3Path addLineToPoint: CGPointMake(42.82, 32.96)]; + [bezier3Path addLineToPoint: CGPointMake(42.87, 32.96)]; + [bezier3Path addLineToPoint: CGPointMake(42.93, 32.96)]; + [bezier3Path addLineToPoint: CGPointMake(42.98, 32.96)]; + [bezier3Path addLineToPoint: CGPointMake(43.04, 32.96)]; + [bezier3Path addLineToPoint: CGPointMake(43.09, 32.96)]; + [bezier3Path addLineToPoint: CGPointMake(43.15, 32.96)]; + [bezier3Path addLineToPoint: CGPointMake(43.2, 32.96)]; + [bezier3Path addLineToPoint: CGPointMake(43.26, 32.96)]; + [bezier3Path addLineToPoint: CGPointMake(43.31, 32.96)]; + [bezier3Path addLineToPoint: CGPointMake(43.37, 32.96)]; + [bezier3Path addLineToPoint: CGPointMake(43.42, 32.96)]; + [bezier3Path addLineToPoint: CGPointMake(43.47, 32.96)]; + [bezier3Path addLineToPoint: CGPointMake(43.53, 32.96)]; + [bezier3Path addLineToPoint: CGPointMake(43.58, 32.96)]; + [bezier3Path addLineToPoint: CGPointMake(43.64, 32.96)]; + [bezier3Path addLineToPoint: CGPointMake(43.69, 32.96)]; + [bezier3Path addLineToPoint: CGPointMake(43.75, 32.96)]; + [bezier3Path addLineToPoint: CGPointMake(43.8, 32.96)]; + [bezier3Path addLineToPoint: CGPointMake(43.86, 32.96)]; + [bezier3Path addLineToPoint: CGPointMake(43.91, 32.96)]; + [bezier3Path addLineToPoint: CGPointMake(43.97, 32.96)]; + [bezier3Path addLineToPoint: CGPointMake(44.02, 32.95)]; + [bezier3Path addLineToPoint: CGPointMake(44.08, 32.95)]; + [bezier3Path addLineToPoint: CGPointMake(44.13, 32.95)]; + [bezier3Path addLineToPoint: CGPointMake(44.19, 32.95)]; + [bezier3Path addLineToPoint: CGPointMake(44.24, 32.95)]; + [bezier3Path addLineToPoint: CGPointMake(44.3, 32.94)]; + [bezier3Path addLineToPoint: CGPointMake(44.35, 32.94)]; + [bezier3Path addLineToPoint: CGPointMake(44.41, 32.94)]; + [bezier3Path addLineToPoint: CGPointMake(44.46, 32.94)]; + [bezier3Path addLineToPoint: CGPointMake(44.52, 32.94)]; + [bezier3Path addLineToPoint: CGPointMake(44.57, 32.93)]; + [bezier3Path addLineToPoint: CGPointMake(44.63, 32.93)]; + [bezier3Path addLineToPoint: CGPointMake(44.68, 32.93)]; + [bezier3Path addLineToPoint: CGPointMake(44.74, 32.92)]; + [bezier3Path addLineToPoint: CGPointMake(44.79, 32.92)]; + [bezier3Path addLineToPoint: CGPointMake(44.85, 32.92)]; + [bezier3Path addLineToPoint: CGPointMake(44.9, 32.91)]; + [bezier3Path addLineToPoint: CGPointMake(44.96, 32.91)]; + [bezier3Path addLineToPoint: CGPointMake(45.01, 32.91)]; + [bezier3Path addLineToPoint: CGPointMake(45.07, 32.9)]; + [bezier3Path addLineToPoint: CGPointMake(45.12, 32.9)]; + [bezier3Path addLineToPoint: CGPointMake(45.18, 32.89)]; + [bezier3Path addLineToPoint: CGPointMake(45.23, 32.89)]; + [bezier3Path addLineToPoint: CGPointMake(45.29, 32.88)]; + [bezier3Path addLineToPoint: CGPointMake(45.34, 32.88)]; + [bezier3Path addLineToPoint: CGPointMake(45.39, 32.87)]; + [bezier3Path addLineToPoint: CGPointMake(45.45, 32.87)]; + [bezier3Path addLineToPoint: CGPointMake(45.5, 32.86)]; + [bezier3Path addLineToPoint: CGPointMake(45.56, 32.86)]; + [bezier3Path addLineToPoint: CGPointMake(45.61, 32.85)]; + [bezier3Path addLineToPoint: CGPointMake(45.67, 32.84)]; + [bezier3Path addLineToPoint: CGPointMake(45.72, 32.84)]; + [bezier3Path addLineToPoint: CGPointMake(45.78, 32.83)]; + [bezier3Path addLineToPoint: CGPointMake(45.83, 32.83)]; + [bezier3Path addLineToPoint: CGPointMake(45.89, 32.82)]; + [bezier3Path addLineToPoint: CGPointMake(45.94, 32.81)]; + [bezier3Path addLineToPoint: CGPointMake(46, 32.81)]; + [bezier3Path addLineToPoint: CGPointMake(46.05, 32.8)]; + [bezier3Path addLineToPoint: CGPointMake(46.11, 32.79)]; + [bezier3Path addLineToPoint: CGPointMake(46.16, 32.78)]; + [bezier3Path addLineToPoint: CGPointMake(46.22, 32.78)]; + [bezier3Path addLineToPoint: CGPointMake(46.27, 32.77)]; + [bezier3Path addLineToPoint: CGPointMake(46.33, 32.76)]; + [bezier3Path addLineToPoint: CGPointMake(46.38, 32.75)]; + [bezier3Path addLineToPoint: CGPointMake(46.44, 32.75)]; + [bezier3Path addLineToPoint: CGPointMake(46.49, 32.74)]; + [bezier3Path addLineToPoint: CGPointMake(46.55, 32.73)]; + [bezier3Path addLineToPoint: CGPointMake(46.6, 32.72)]; + [bezier3Path addLineToPoint: CGPointMake(46.66, 32.71)]; + [bezier3Path addLineToPoint: CGPointMake(46.71, 32.71)]; + [bezier3Path addLineToPoint: CGPointMake(46.77, 32.7)]; + [bezier3Path addLineToPoint: CGPointMake(46.82, 32.69)]; + [bezier3Path addLineToPoint: CGPointMake(46.88, 32.68)]; + [bezier3Path addLineToPoint: CGPointMake(46.93, 32.67)]; + [bezier3Path addLineToPoint: CGPointMake(46.99, 32.66)]; + [bezier3Path addLineToPoint: CGPointMake(47.04, 32.65)]; + [bezier3Path addLineToPoint: CGPointMake(47.1, 32.64)]; + [bezier3Path addLineToPoint: CGPointMake(47.15, 32.64)]; + [bezier3Path addLineToPoint: CGPointMake(47.21, 32.63)]; + [bezier3Path addLineToPoint: CGPointMake(47.26, 32.62)]; + [bezier3Path addLineToPoint: CGPointMake(47.31, 32.61)]; + [bezier3Path addLineToPoint: CGPointMake(47.37, 32.6)]; + [bezier3Path addLineToPoint: CGPointMake(47.42, 32.59)]; + [bezier3Path addLineToPoint: CGPointMake(47.48, 32.58)]; + [bezier3Path addLineToPoint: CGPointMake(47.53, 32.57)]; + [bezier3Path addLineToPoint: CGPointMake(47.59, 32.56)]; + [bezier3Path addLineToPoint: CGPointMake(47.64, 32.55)]; + [bezier3Path addLineToPoint: CGPointMake(47.7, 32.54)]; + [bezier3Path addLineToPoint: CGPointMake(47.75, 32.53)]; + [bezier3Path addLineToPoint: CGPointMake(47.81, 32.52)]; + [bezier3Path addLineToPoint: CGPointMake(47.86, 32.51)]; + [bezier3Path addLineToPoint: CGPointMake(47.92, 32.5)]; + [bezier3Path addLineToPoint: CGPointMake(47.97, 32.48)]; + [bezier3Path addLineToPoint: CGPointMake(48.03, 32.47)]; + [bezier3Path addLineToPoint: CGPointMake(48.08, 32.46)]; + [bezier3Path addLineToPoint: CGPointMake(48.14, 32.45)]; + [bezier3Path addLineToPoint: CGPointMake(48.19, 32.44)]; + [bezier3Path addLineToPoint: CGPointMake(48.25, 32.43)]; + [bezier3Path addLineToPoint: CGPointMake(48.3, 32.42)]; + [bezier3Path addLineToPoint: CGPointMake(48.36, 32.41)]; + [bezier3Path addLineToPoint: CGPointMake(48.41, 32.39)]; + [bezier3Path addLineToPoint: CGPointMake(48.47, 32.38)]; + [bezier3Path addLineToPoint: CGPointMake(48.52, 32.37)]; + [bezier3Path addLineToPoint: CGPointMake(48.58, 32.36)]; + [bezier3Path addLineToPoint: CGPointMake(48.63, 32.35)]; + [bezier3Path addLineToPoint: CGPointMake(48.69, 32.33)]; + [bezier3Path addLineToPoint: CGPointMake(48.74, 32.32)]; + [bezier3Path addLineToPoint: CGPointMake(48.8, 32.31)]; + [bezier3Path addLineToPoint: CGPointMake(48.85, 32.3)]; + [bezier3Path addLineToPoint: CGPointMake(48.91, 32.28)]; + [bezier3Path addLineToPoint: CGPointMake(48.96, 32.27)]; + [bezier3Path addLineToPoint: CGPointMake(48.96, 29.9)]; + [bezier3Path addLineToPoint: CGPointMake(48.91, 29.93)]; + [bezier3Path addLineToPoint: CGPointMake(48.85, 29.96)]; + [bezier3Path addLineToPoint: CGPointMake(48.8, 29.98)]; + [bezier3Path addLineToPoint: CGPointMake(48.74, 30.01)]; + [bezier3Path addLineToPoint: CGPointMake(48.69, 30.04)]; + [bezier3Path addLineToPoint: CGPointMake(48.63, 30.06)]; + [bezier3Path addLineToPoint: CGPointMake(48.58, 30.09)]; + [bezier3Path addLineToPoint: CGPointMake(48.52, 30.11)]; + [bezier3Path addLineToPoint: CGPointMake(48.47, 30.14)]; + [bezier3Path addLineToPoint: CGPointMake(48.41, 30.16)]; + [bezier3Path addLineToPoint: CGPointMake(48.36, 30.19)]; + [bezier3Path addLineToPoint: CGPointMake(48.3, 30.21)]; + [bezier3Path addLineToPoint: CGPointMake(48.25, 30.23)]; + [bezier3Path addLineToPoint: CGPointMake(48.19, 30.26)]; + [bezier3Path addLineToPoint: CGPointMake(48.14, 30.28)]; + [bezier3Path addLineToPoint: CGPointMake(48.08, 30.3)]; + [bezier3Path addLineToPoint: CGPointMake(48.03, 30.33)]; + [bezier3Path addLineToPoint: CGPointMake(47.97, 30.35)]; + [bezier3Path addLineToPoint: CGPointMake(47.92, 30.37)]; + [bezier3Path addLineToPoint: CGPointMake(47.86, 30.39)]; + [bezier3Path addLineToPoint: CGPointMake(47.81, 30.41)]; + [bezier3Path addLineToPoint: CGPointMake(47.75, 30.43)]; + [bezier3Path addLineToPoint: CGPointMake(47.7, 30.45)]; + [bezier3Path addLineToPoint: CGPointMake(47.64, 30.48)]; + [bezier3Path addLineToPoint: CGPointMake(47.59, 30.5)]; + [bezier3Path addLineToPoint: CGPointMake(47.53, 30.52)]; + [bezier3Path addLineToPoint: CGPointMake(47.48, 30.54)]; + [bezier3Path addLineToPoint: CGPointMake(47.42, 30.55)]; + [bezier3Path addLineToPoint: CGPointMake(47.37, 30.57)]; + [bezier3Path addLineToPoint: CGPointMake(47.31, 30.59)]; + [bezier3Path addLineToPoint: CGPointMake(47.26, 30.61)]; + [bezier3Path addLineToPoint: CGPointMake(47.21, 30.63)]; + [bezier3Path addLineToPoint: CGPointMake(47.15, 30.65)]; + [bezier3Path addLineToPoint: CGPointMake(47.1, 30.66)]; + [bezier3Path addLineToPoint: CGPointMake(47.04, 30.68)]; + [bezier3Path addLineToPoint: CGPointMake(46.99, 30.7)]; + [bezier3Path addLineToPoint: CGPointMake(46.93, 30.72)]; + [bezier3Path addLineToPoint: CGPointMake(46.88, 30.73)]; + [bezier3Path addLineToPoint: CGPointMake(46.82, 30.75)]; + [bezier3Path addLineToPoint: CGPointMake(46.77, 30.76)]; + [bezier3Path addLineToPoint: CGPointMake(46.71, 30.78)]; + [bezier3Path addLineToPoint: CGPointMake(46.66, 30.79)]; + [bezier3Path addLineToPoint: CGPointMake(46.6, 30.81)]; + [bezier3Path addLineToPoint: CGPointMake(46.55, 30.82)]; + [bezier3Path addLineToPoint: CGPointMake(46.49, 30.84)]; + [bezier3Path addLineToPoint: CGPointMake(46.44, 30.85)]; + [bezier3Path addLineToPoint: CGPointMake(46.38, 30.86)]; + [bezier3Path addLineToPoint: CGPointMake(46.33, 30.88)]; + [bezier3Path addLineToPoint: CGPointMake(46.27, 30.89)]; + [bezier3Path addLineToPoint: CGPointMake(46.22, 30.9)]; + [bezier3Path addLineToPoint: CGPointMake(46.16, 30.92)]; + [bezier3Path addLineToPoint: CGPointMake(46.11, 30.93)]; + [bezier3Path addLineToPoint: CGPointMake(46.05, 30.94)]; + [bezier3Path addLineToPoint: CGPointMake(46, 30.95)]; + [bezier3Path addLineToPoint: CGPointMake(45.94, 30.96)]; + [bezier3Path addLineToPoint: CGPointMake(45.89, 30.97)]; + [bezier3Path addLineToPoint: CGPointMake(45.83, 30.98)]; + [bezier3Path addLineToPoint: CGPointMake(45.78, 30.99)]; + [bezier3Path addLineToPoint: CGPointMake(45.72, 31)]; + [bezier3Path addLineToPoint: CGPointMake(45.67, 31.01)]; + [bezier3Path addLineToPoint: CGPointMake(45.61, 31.02)]; + [bezier3Path addLineToPoint: CGPointMake(45.56, 31.03)]; + [bezier3Path addLineToPoint: CGPointMake(45.5, 31.04)]; + [bezier3Path addLineToPoint: CGPointMake(45.45, 31.05)]; + [bezier3Path addLineToPoint: CGPointMake(45.39, 31.06)]; + [bezier3Path addLineToPoint: CGPointMake(45.34, 31.06)]; + [bezier3Path addLineToPoint: CGPointMake(45.29, 31.07)]; + [bezier3Path addLineToPoint: CGPointMake(45.23, 31.08)]; + [bezier3Path addLineToPoint: CGPointMake(45.18, 31.09)]; + [bezier3Path addLineToPoint: CGPointMake(45.12, 31.09)]; + [bezier3Path addLineToPoint: CGPointMake(45.07, 31.1)]; + [bezier3Path addLineToPoint: CGPointMake(45.01, 31.1)]; + [bezier3Path addLineToPoint: CGPointMake(44.96, 31.11)]; + [bezier3Path addLineToPoint: CGPointMake(44.9, 31.12)]; + [bezier3Path addLineToPoint: CGPointMake(44.85, 31.12)]; + [bezier3Path addLineToPoint: CGPointMake(44.79, 31.13)]; + [bezier3Path addLineToPoint: CGPointMake(44.74, 31.13)]; + [bezier3Path addLineToPoint: CGPointMake(44.68, 31.14)]; + [bezier3Path addLineToPoint: CGPointMake(44.63, 31.14)]; + [bezier3Path addLineToPoint: CGPointMake(44.57, 31.14)]; + [bezier3Path addLineToPoint: CGPointMake(44.52, 31.15)]; + [bezier3Path addLineToPoint: CGPointMake(44.46, 31.15)]; + [bezier3Path addLineToPoint: CGPointMake(44.41, 31.15)]; + [bezier3Path addLineToPoint: CGPointMake(44.35, 31.15)]; + [bezier3Path addLineToPoint: CGPointMake(44.3, 31.16)]; + [bezier3Path addLineToPoint: CGPointMake(44.24, 31.16)]; + [bezier3Path addLineToPoint: CGPointMake(44.19, 31.16)]; + [bezier3Path addLineToPoint: CGPointMake(44.13, 31.16)]; + [bezier3Path addLineToPoint: CGPointMake(44.08, 31.16)]; + [bezier3Path addCurveToPoint: CGPointMake(44.02, 31.16) controlPoint1: CGPointMake(44.06, 31.16) controlPoint2: CGPointMake(44.04, 31.16)]; + [bezier3Path addLineToPoint: CGPointMake(43.97, 31.16)]; + [bezier3Path addLineToPoint: CGPointMake(43.91, 31.16)]; + [bezier3Path addLineToPoint: CGPointMake(43.86, 31.16)]; + [bezier3Path addLineToPoint: CGPointMake(43.8, 31.16)]; + [bezier3Path addCurveToPoint: CGPointMake(43.75, 31.16) controlPoint1: CGPointMake(43.79, 31.16) controlPoint2: CGPointMake(43.77, 31.16)]; + [bezier3Path addCurveToPoint: CGPointMake(43.69, 31.15) controlPoint1: CGPointMake(43.73, 31.15) controlPoint2: CGPointMake(43.71, 31.15)]; + [bezier3Path addLineToPoint: CGPointMake(43.64, 31.15)]; + [bezier3Path addLineToPoint: CGPointMake(43.58, 31.15)]; + [bezier3Path addLineToPoint: CGPointMake(43.53, 31.14)]; + [bezier3Path addLineToPoint: CGPointMake(43.47, 31.14)]; + [bezier3Path addCurveToPoint: CGPointMake(43.42, 31.13) controlPoint1: CGPointMake(43.46, 31.14) controlPoint2: CGPointMake(43.44, 31.14)]; + [bezier3Path addCurveToPoint: CGPointMake(43.37, 31.13) controlPoint1: CGPointMake(43.4, 31.13) controlPoint2: CGPointMake(43.38, 31.13)]; + [bezier3Path addLineToPoint: CGPointMake(43.31, 31.12)]; + [bezier3Path addLineToPoint: CGPointMake(43.26, 31.12)]; + [bezier3Path addLineToPoint: CGPointMake(43.2, 31.11)]; + [bezier3Path addLineToPoint: CGPointMake(43.15, 31.1)]; + [bezier3Path addLineToPoint: CGPointMake(43.09, 31.1)]; + [bezier3Path addCurveToPoint: CGPointMake(43.04, 31.09) controlPoint1: CGPointMake(43.07, 31.09) controlPoint2: CGPointMake(43.05, 31.09)]; + [bezier3Path addCurveToPoint: CGPointMake(42.98, 31.08) controlPoint1: CGPointMake(43.02, 31.09) controlPoint2: CGPointMake(43, 31.08)]; + [bezier3Path addCurveToPoint: CGPointMake(42.93, 31.07) controlPoint1: CGPointMake(42.96, 31.08) controlPoint2: CGPointMake(42.94, 31.07)]; + [bezier3Path addCurveToPoint: CGPointMake(42.87, 31.06) controlPoint1: CGPointMake(42.91, 31.07) controlPoint2: CGPointMake(42.89, 31.06)]; + [bezier3Path addCurveToPoint: CGPointMake(42.82, 31.05) controlPoint1: CGPointMake(42.85, 31.06) controlPoint2: CGPointMake(42.83, 31.05)]; + [bezier3Path addCurveToPoint: CGPointMake(42.76, 31.04) controlPoint1: CGPointMake(42.8, 31.05) controlPoint2: CGPointMake(42.78, 31.04)]; + [bezier3Path addCurveToPoint: CGPointMake(42.71, 31.03) controlPoint1: CGPointMake(42.74, 31.03) controlPoint2: CGPointMake(42.72, 31.03)]; + [bezier3Path addCurveToPoint: CGPointMake(42.65, 31.01) controlPoint1: CGPointMake(42.69, 31.02) controlPoint2: CGPointMake(42.67, 31.02)]; + [bezier3Path addLineToPoint: CGPointMake(42.6, 31)]; + [bezier3Path addCurveToPoint: CGPointMake(42.54, 30.99) controlPoint1: CGPointMake(42.58, 31) controlPoint2: CGPointMake(42.56, 30.99)]; + [bezier3Path addCurveToPoint: CGPointMake(42.49, 30.97) controlPoint1: CGPointMake(42.52, 30.98) controlPoint2: CGPointMake(42.51, 30.98)]; + [bezier3Path addCurveToPoint: CGPointMake(42.43, 30.96) controlPoint1: CGPointMake(42.47, 30.97) controlPoint2: CGPointMake(42.45, 30.96)]; + [bezier3Path addCurveToPoint: CGPointMake(42.38, 30.94) controlPoint1: CGPointMake(42.41, 30.95) controlPoint2: CGPointMake(42.4, 30.95)]; + [bezier3Path addCurveToPoint: CGPointMake(42.32, 30.93) controlPoint1: CGPointMake(42.36, 30.94) controlPoint2: CGPointMake(42.34, 30.93)]; + [bezier3Path addCurveToPoint: CGPointMake(42.27, 30.91) controlPoint1: CGPointMake(42.3, 30.92) controlPoint2: CGPointMake(42.29, 30.92)]; + [bezier3Path addCurveToPoint: CGPointMake(42.21, 30.89) controlPoint1: CGPointMake(42.25, 30.91) controlPoint2: CGPointMake(42.23, 30.9)]; + [bezier3Path addCurveToPoint: CGPointMake(42.16, 30.88) controlPoint1: CGPointMake(42.19, 30.89) controlPoint2: CGPointMake(42.18, 30.88)]; + [bezier3Path addCurveToPoint: CGPointMake(42.1, 30.86) controlPoint1: CGPointMake(42.14, 30.87) controlPoint2: CGPointMake(42.12, 30.86)]; + [bezier3Path addCurveToPoint: CGPointMake(42.05, 30.84) controlPoint1: CGPointMake(42.09, 30.85) controlPoint2: CGPointMake(42.07, 30.84)]; + [bezier3Path addCurveToPoint: CGPointMake(41.99, 30.81) controlPoint1: CGPointMake(42.03, 30.83) controlPoint2: CGPointMake(42.01, 30.82)]; + [bezier3Path addCurveToPoint: CGPointMake(41.94, 30.79) controlPoint1: CGPointMake(41.98, 30.81) controlPoint2: CGPointMake(41.96, 30.8)]; + [bezier3Path addCurveToPoint: CGPointMake(41.88, 30.77) controlPoint1: CGPointMake(41.92, 30.79) controlPoint2: CGPointMake(41.9, 30.78)]; + [bezier3Path addCurveToPoint: CGPointMake(41.83, 30.75) controlPoint1: CGPointMake(41.87, 30.76) controlPoint2: CGPointMake(41.85, 30.75)]; + [bezier3Path addCurveToPoint: CGPointMake(41.77, 30.72) controlPoint1: CGPointMake(41.81, 30.74) controlPoint2: CGPointMake(41.79, 30.73)]; + [bezier3Path addCurveToPoint: CGPointMake(41.72, 30.7) controlPoint1: CGPointMake(41.76, 30.71) controlPoint2: CGPointMake(41.74, 30.71)]; + [bezier3Path addCurveToPoint: CGPointMake(41.66, 30.67) controlPoint1: CGPointMake(41.7, 30.69) controlPoint2: CGPointMake(41.68, 30.68)]; + [bezier3Path addCurveToPoint: CGPointMake(41.61, 30.64) controlPoint1: CGPointMake(41.65, 30.66) controlPoint2: CGPointMake(41.63, 30.65)]; + [bezier3Path addCurveToPoint: CGPointMake(41.55, 30.61) controlPoint1: CGPointMake(41.59, 30.63) controlPoint2: CGPointMake(41.57, 30.62)]; + [bezier3Path addCurveToPoint: CGPointMake(41.5, 30.58) controlPoint1: CGPointMake(41.54, 30.6) controlPoint2: CGPointMake(41.52, 30.59)]; + [bezier3Path addCurveToPoint: CGPointMake(41.45, 30.55) controlPoint1: CGPointMake(41.48, 30.57) controlPoint2: CGPointMake(41.46, 30.56)]; + [bezier3Path addCurveToPoint: CGPointMake(41.39, 30.52) controlPoint1: CGPointMake(41.43, 30.54) controlPoint2: CGPointMake(41.41, 30.53)]; + [bezier3Path addCurveToPoint: CGPointMake(41.34, 30.49) controlPoint1: CGPointMake(41.37, 30.51) controlPoint2: CGPointMake(41.35, 30.5)]; + [bezier3Path addCurveToPoint: CGPointMake(41.28, 30.45) controlPoint1: CGPointMake(41.32, 30.47) controlPoint2: CGPointMake(41.3, 30.46)]; + [bezier3Path addCurveToPoint: CGPointMake(41.23, 30.41) controlPoint1: CGPointMake(41.26, 30.44) controlPoint2: CGPointMake(41.24, 30.43)]; + [bezier3Path addCurveToPoint: CGPointMake(41.17, 30.38) controlPoint1: CGPointMake(41.21, 30.4) controlPoint2: CGPointMake(41.19, 30.39)]; + [bezier3Path addCurveToPoint: CGPointMake(41.12, 30.34) controlPoint1: CGPointMake(41.15, 30.36) controlPoint2: CGPointMake(41.13, 30.35)]; + [bezier3Path addCurveToPoint: CGPointMake(41.06, 30.3) controlPoint1: CGPointMake(41.1, 30.32) controlPoint2: CGPointMake(41.08, 30.31)]; + [bezier3Path addCurveToPoint: CGPointMake(41.01, 30.25) controlPoint1: CGPointMake(41.04, 30.28) controlPoint2: CGPointMake(41.02, 30.27)]; + [bezier3Path addCurveToPoint: CGPointMake(40.95, 30.21) controlPoint1: CGPointMake(40.99, 30.24) controlPoint2: CGPointMake(40.97, 30.22)]; + [bezier3Path addCurveToPoint: CGPointMake(40.9, 30.16) controlPoint1: CGPointMake(40.93, 30.19) controlPoint2: CGPointMake(40.91, 30.18)]; + [bezier3Path addCurveToPoint: CGPointMake(40.84, 30.11) controlPoint1: CGPointMake(40.88, 30.14) controlPoint2: CGPointMake(40.86, 30.13)]; + [bezier3Path addCurveToPoint: CGPointMake(40.79, 30.06) controlPoint1: CGPointMake(40.82, 30.09) controlPoint2: CGPointMake(40.8, 30.08)]; + [bezier3Path addCurveToPoint: CGPointMake(40.73, 30.01) controlPoint1: CGPointMake(40.77, 30.04) controlPoint2: CGPointMake(40.75, 30.02)]; + [bezier3Path addCurveToPoint: CGPointMake(40.68, 29.95) controlPoint1: CGPointMake(40.71, 29.99) controlPoint2: CGPointMake(40.7, 29.97)]; + [bezier3Path addCurveToPoint: CGPointMake(40.62, 29.89) controlPoint1: CGPointMake(40.66, 29.93) controlPoint2: CGPointMake(40.64, 29.91)]; + [bezier3Path addCurveToPoint: CGPointMake(40.57, 29.83) controlPoint1: CGPointMake(40.6, 29.87) controlPoint2: CGPointMake(40.59, 29.85)]; + [bezier3Path addCurveToPoint: CGPointMake(40.51, 29.76) controlPoint1: CGPointMake(40.55, 29.81) controlPoint2: CGPointMake(40.53, 29.78)]; + [bezier3Path addCurveToPoint: CGPointMake(40.46, 29.69) controlPoint1: CGPointMake(40.49, 29.74) controlPoint2: CGPointMake(40.48, 29.71)]; + [bezier3Path addCurveToPoint: CGPointMake(40.4, 29.62) controlPoint1: CGPointMake(40.44, 29.67) controlPoint2: CGPointMake(40.42, 29.64)]; + [bezier3Path addCurveToPoint: CGPointMake(40.35, 29.54) controlPoint1: CGPointMake(40.38, 29.59) controlPoint2: CGPointMake(40.37, 29.57)]; + [bezier3Path addCurveToPoint: CGPointMake(40.29, 29.45) controlPoint1: CGPointMake(40.33, 29.51) controlPoint2: CGPointMake(40.31, 29.48)]; + [bezier3Path addCurveToPoint: CGPointMake(40.24, 29.36) controlPoint1: CGPointMake(40.27, 29.42) controlPoint2: CGPointMake(40.26, 29.39)]; + [bezier3Path addCurveToPoint: CGPointMake(40.18, 29.27) controlPoint1: CGPointMake(40.22, 29.33) controlPoint2: CGPointMake(40.2, 29.3)]; + [bezier3Path addCurveToPoint: CGPointMake(40.13, 29.16) controlPoint1: CGPointMake(40.16, 29.23) controlPoint2: CGPointMake(40.15, 29.2)]; + [bezier3Path addCurveToPoint: CGPointMake(40.07, 29.05) controlPoint1: CGPointMake(40.11, 29.12) controlPoint2: CGPointMake(40.09, 29.09)]; + [bezier3Path addCurveToPoint: CGPointMake(40.02, 28.92) controlPoint1: CGPointMake(40.05, 29) controlPoint2: CGPointMake(40.04, 28.96)]; + [bezier3Path addCurveToPoint: CGPointMake(39.96, 28.77) controlPoint1: CGPointMake(40, 28.87) controlPoint2: CGPointMake(39.98, 28.82)]; + [bezier3Path addCurveToPoint: CGPointMake(39.91, 28.61) controlPoint1: CGPointMake(39.94, 28.72) controlPoint2: CGPointMake(39.93, 28.67)]; + [bezier3Path addCurveToPoint: CGPointMake(39.85, 28.41) controlPoint1: CGPointMake(39.89, 28.55) controlPoint2: CGPointMake(39.87, 28.48)]; + [bezier3Path addCurveToPoint: CGPointMake(39.8, 28.16) controlPoint1: CGPointMake(39.83, 28.33) controlPoint2: CGPointMake(39.82, 28.24)]; + [bezier3Path addCurveToPoint: CGPointMake(39.74, 27.76) controlPoint1: CGPointMake(39.78, 28.03) controlPoint2: CGPointMake(39.76, 27.9)]; + [bezier3Path addCurveToPoint: CGPointMake(39.72, 27.28) controlPoint1: CGPointMake(39.73, 27.6) controlPoint2: CGPointMake(39.72, 27.44)]; + [bezier3Path addCurveToPoint: CGPointMake(39.74, 26.79) controlPoint1: CGPointMake(39.72, 27.11) controlPoint2: CGPointMake(39.73, 26.95)]; + [bezier3Path addCurveToPoint: CGPointMake(39.8, 26.4) controlPoint1: CGPointMake(39.76, 26.66) controlPoint2: CGPointMake(39.78, 26.53)]; + [bezier3Path addCurveToPoint: CGPointMake(39.85, 26.14) controlPoint1: CGPointMake(39.82, 26.31) controlPoint2: CGPointMake(39.83, 26.23)]; + [bezier3Path addCurveToPoint: CGPointMake(39.91, 25.94) controlPoint1: CGPointMake(39.87, 26.08) controlPoint2: CGPointMake(39.89, 26.01)]; + [bezier3Path addCurveToPoint: CGPointMake(39.96, 25.78) controlPoint1: CGPointMake(39.93, 25.89) controlPoint2: CGPointMake(39.94, 25.83)]; + [bezier3Path addCurveToPoint: CGPointMake(40.02, 25.64) controlPoint1: CGPointMake(39.98, 25.73) controlPoint2: CGPointMake(40, 25.68)]; + [bezier3Path addCurveToPoint: CGPointMake(40.07, 25.51) controlPoint1: CGPointMake(40.04, 25.59) controlPoint2: CGPointMake(40.05, 25.55)]; + [bezier3Path addCurveToPoint: CGPointMake(40.13, 25.39) controlPoint1: CGPointMake(40.09, 25.47) controlPoint2: CGPointMake(40.11, 25.43)]; + [bezier3Path addCurveToPoint: CGPointMake(40.18, 25.29) controlPoint1: CGPointMake(40.15, 25.36) controlPoint2: CGPointMake(40.16, 25.32)]; + [bezier3Path addCurveToPoint: CGPointMake(40.24, 25.19) controlPoint1: CGPointMake(40.2, 25.25) controlPoint2: CGPointMake(40.22, 25.22)]; + [bezier3Path addCurveToPoint: CGPointMake(40.29, 25.1) controlPoint1: CGPointMake(40.26, 25.16) controlPoint2: CGPointMake(40.27, 25.13)]; + [bezier3Path addCurveToPoint: CGPointMake(40.35, 25.02) controlPoint1: CGPointMake(40.31, 25.07) controlPoint2: CGPointMake(40.33, 25.04)]; + [bezier3Path addCurveToPoint: CGPointMake(40.4, 24.94) controlPoint1: CGPointMake(40.37, 24.99) controlPoint2: CGPointMake(40.38, 24.96)]; + [bezier3Path addCurveToPoint: CGPointMake(40.46, 24.86) controlPoint1: CGPointMake(40.42, 24.91) controlPoint2: CGPointMake(40.44, 24.89)]; + [bezier3Path addCurveToPoint: CGPointMake(40.51, 24.79) controlPoint1: CGPointMake(40.48, 24.84) controlPoint2: CGPointMake(40.49, 24.82)]; + [bezier3Path addCurveToPoint: CGPointMake(40.57, 24.73) controlPoint1: CGPointMake(40.53, 24.77) controlPoint2: CGPointMake(40.55, 24.75)]; + [bezier3Path addCurveToPoint: CGPointMake(40.62, 24.66) controlPoint1: CGPointMake(40.59, 24.71) controlPoint2: CGPointMake(40.6, 24.69)]; + [bezier3Path addCurveToPoint: CGPointMake(40.68, 24.6) controlPoint1: CGPointMake(40.64, 24.64) controlPoint2: CGPointMake(40.66, 24.62)]; + [bezier3Path addCurveToPoint: CGPointMake(40.73, 24.55) controlPoint1: CGPointMake(40.7, 24.59) controlPoint2: CGPointMake(40.71, 24.57)]; + [bezier3Path addCurveToPoint: CGPointMake(40.79, 24.49) controlPoint1: CGPointMake(40.75, 24.53) controlPoint2: CGPointMake(40.77, 24.51)]; + [bezier3Path addCurveToPoint: CGPointMake(40.84, 24.44) controlPoint1: CGPointMake(40.8, 24.48) controlPoint2: CGPointMake(40.82, 24.46)]; + [bezier3Path addCurveToPoint: CGPointMake(40.9, 24.39) controlPoint1: CGPointMake(40.86, 24.43) controlPoint2: CGPointMake(40.88, 24.41)]; + [bezier3Path addCurveToPoint: CGPointMake(40.95, 24.35) controlPoint1: CGPointMake(40.91, 24.38) controlPoint2: CGPointMake(40.93, 24.36)]; + [bezier3Path addCurveToPoint: CGPointMake(41.01, 24.3) controlPoint1: CGPointMake(40.97, 24.33) controlPoint2: CGPointMake(40.99, 24.32)]; + [bezier3Path addCurveToPoint: CGPointMake(41.06, 24.26) controlPoint1: CGPointMake(41.02, 24.29) controlPoint2: CGPointMake(41.04, 24.27)]; + [bezier3Path addCurveToPoint: CGPointMake(41.12, 24.22) controlPoint1: CGPointMake(41.08, 24.24) controlPoint2: CGPointMake(41.1, 24.23)]; + [bezier3Path addCurveToPoint: CGPointMake(41.17, 24.18) controlPoint1: CGPointMake(41.13, 24.2) controlPoint2: CGPointMake(41.15, 24.19)]; + [bezier3Path addCurveToPoint: CGPointMake(41.23, 24.14) controlPoint1: CGPointMake(41.19, 24.16) controlPoint2: CGPointMake(41.21, 24.15)]; + [bezier3Path addCurveToPoint: CGPointMake(41.28, 24.1) controlPoint1: CGPointMake(41.24, 24.13) controlPoint2: CGPointMake(41.26, 24.11)]; + [bezier3Path addCurveToPoint: CGPointMake(41.34, 24.07) controlPoint1: CGPointMake(41.3, 24.09) controlPoint2: CGPointMake(41.32, 24.08)]; + [bezier3Path addCurveToPoint: CGPointMake(41.39, 24.03) controlPoint1: CGPointMake(41.35, 24.06) controlPoint2: CGPointMake(41.37, 24.04)]; + [bezier3Path addCurveToPoint: CGPointMake(41.45, 24) controlPoint1: CGPointMake(41.41, 24.02) controlPoint2: CGPointMake(41.43, 24.01)]; + [bezier3Path addCurveToPoint: CGPointMake(41.5, 23.97) controlPoint1: CGPointMake(41.46, 23.99) controlPoint2: CGPointMake(41.48, 23.98)]; + [bezier3Path addCurveToPoint: CGPointMake(41.55, 23.94) controlPoint1: CGPointMake(41.52, 23.96) controlPoint2: CGPointMake(41.54, 23.95)]; + [bezier3Path addCurveToPoint: CGPointMake(41.61, 23.91) controlPoint1: CGPointMake(41.57, 23.93) controlPoint2: CGPointMake(41.59, 23.92)]; + [bezier3Path addCurveToPoint: CGPointMake(41.66, 23.88) controlPoint1: CGPointMake(41.63, 23.9) controlPoint2: CGPointMake(41.65, 23.89)]; + [bezier3Path addCurveToPoint: CGPointMake(41.72, 23.86) controlPoint1: CGPointMake(41.68, 23.87) controlPoint2: CGPointMake(41.7, 23.87)]; + [bezier3Path addCurveToPoint: CGPointMake(41.77, 23.83) controlPoint1: CGPointMake(41.74, 23.85) controlPoint2: CGPointMake(41.76, 23.84)]; + [bezier3Path addCurveToPoint: CGPointMake(41.83, 23.81) controlPoint1: CGPointMake(41.79, 23.82) controlPoint2: CGPointMake(41.81, 23.81)]; + [bezier3Path addCurveToPoint: CGPointMake(41.88, 23.78) controlPoint1: CGPointMake(41.85, 23.8) controlPoint2: CGPointMake(41.87, 23.79)]; + [bezier3Path addCurveToPoint: CGPointMake(41.94, 23.76) controlPoint1: CGPointMake(41.9, 23.78) controlPoint2: CGPointMake(41.92, 23.77)]; + [bezier3Path addCurveToPoint: CGPointMake(41.99, 23.74) controlPoint1: CGPointMake(41.96, 23.75) controlPoint2: CGPointMake(41.98, 23.75)]; + [bezier3Path addCurveToPoint: CGPointMake(42.05, 23.72) controlPoint1: CGPointMake(42.01, 23.73) controlPoint2: CGPointMake(42.03, 23.72)]; + [bezier3Path addCurveToPoint: CGPointMake(42.1, 23.7) controlPoint1: CGPointMake(42.07, 23.71) controlPoint2: CGPointMake(42.09, 23.7)]; + [bezier3Path addCurveToPoint: CGPointMake(42.16, 23.68) controlPoint1: CGPointMake(42.12, 23.69) controlPoint2: CGPointMake(42.14, 23.68)]; + [bezier3Path addCurveToPoint: CGPointMake(42.21, 23.66) controlPoint1: CGPointMake(42.18, 23.67) controlPoint2: CGPointMake(42.19, 23.67)]; + [bezier3Path addCurveToPoint: CGPointMake(42.27, 23.64) controlPoint1: CGPointMake(42.23, 23.65) controlPoint2: CGPointMake(42.25, 23.65)]; + [bezier3Path addCurveToPoint: CGPointMake(42.32, 23.63) controlPoint1: CGPointMake(42.29, 23.64) controlPoint2: CGPointMake(42.3, 23.63)]; + [bezier3Path addCurveToPoint: CGPointMake(42.38, 23.61) controlPoint1: CGPointMake(42.34, 23.62) controlPoint2: CGPointMake(42.36, 23.61)]; + [bezier3Path addLineToPoint: CGPointMake(42.43, 23.59)]; + [bezier3Path addCurveToPoint: CGPointMake(42.49, 23.58) controlPoint1: CGPointMake(42.45, 23.59) controlPoint2: CGPointMake(42.47, 23.58)]; + [bezier3Path addCurveToPoint: CGPointMake(42.54, 23.56) controlPoint1: CGPointMake(42.51, 23.57) controlPoint2: CGPointMake(42.52, 23.57)]; + [bezier3Path addCurveToPoint: CGPointMake(42.6, 23.55) controlPoint1: CGPointMake(42.56, 23.56) controlPoint2: CGPointMake(42.58, 23.56)]; + [bezier3Path addLineToPoint: CGPointMake(42.65, 23.54)]; + [bezier3Path addCurveToPoint: CGPointMake(42.71, 23.53) controlPoint1: CGPointMake(42.67, 23.53) controlPoint2: CGPointMake(42.69, 23.53)]; + [bezier3Path addCurveToPoint: CGPointMake(42.76, 23.51) controlPoint1: CGPointMake(42.72, 23.52) controlPoint2: CGPointMake(42.74, 23.52)]; + [bezier3Path addCurveToPoint: CGPointMake(42.82, 23.5) controlPoint1: CGPointMake(42.78, 23.51) controlPoint2: CGPointMake(42.8, 23.51)]; + [bezier3Path addCurveToPoint: CGPointMake(42.87, 23.49) controlPoint1: CGPointMake(42.83, 23.5) controlPoint2: CGPointMake(42.85, 23.5)]; + [bezier3Path addCurveToPoint: CGPointMake(42.93, 23.48) controlPoint1: CGPointMake(42.89, 23.49) controlPoint2: CGPointMake(42.91, 23.49)]; + [bezier3Path addCurveToPoint: CGPointMake(42.98, 23.47) controlPoint1: CGPointMake(42.94, 23.48) controlPoint2: CGPointMake(42.96, 23.48)]; + [bezier3Path addCurveToPoint: CGPointMake(43.04, 23.47) controlPoint1: CGPointMake(43, 23.47) controlPoint2: CGPointMake(43.02, 23.47)]; + [bezier3Path addLineToPoint: CGPointMake(43.09, 23.46)]; + [bezier3Path addLineToPoint: CGPointMake(43.15, 23.45)]; + [bezier3Path addLineToPoint: CGPointMake(43.2, 23.44)]; + [bezier3Path addLineToPoint: CGPointMake(43.26, 23.44)]; + [bezier3Path addLineToPoint: CGPointMake(43.31, 23.43)]; + [bezier3Path addLineToPoint: CGPointMake(43.37, 23.42)]; + [bezier3Path addCurveToPoint: CGPointMake(43.42, 23.42) controlPoint1: CGPointMake(43.38, 23.42) controlPoint2: CGPointMake(43.4, 23.42)]; + [bezier3Path addCurveToPoint: CGPointMake(43.47, 23.41) controlPoint1: CGPointMake(43.44, 23.42) controlPoint2: CGPointMake(43.46, 23.42)]; + [bezier3Path addLineToPoint: CGPointMake(43.53, 23.41)]; + [bezier3Path addLineToPoint: CGPointMake(43.58, 23.41)]; + [bezier3Path addLineToPoint: CGPointMake(43.64, 23.4)]; + [bezier3Path addLineToPoint: CGPointMake(43.69, 23.4)]; + [bezier3Path addCurveToPoint: CGPointMake(43.75, 23.4) controlPoint1: CGPointMake(43.71, 23.4) controlPoint2: CGPointMake(43.73, 23.4)]; + [bezier3Path addCurveToPoint: CGPointMake(43.8, 23.4) controlPoint1: CGPointMake(43.77, 23.4) controlPoint2: CGPointMake(43.79, 23.4)]; + [bezier3Path addLineToPoint: CGPointMake(43.86, 23.39)]; + [bezier3Path addLineToPoint: CGPointMake(43.91, 23.39)]; + [bezier3Path addLineToPoint: CGPointMake(43.97, 23.39)]; + [bezier3Path addLineToPoint: CGPointMake(44.02, 23.39)]; + [bezier3Path addCurveToPoint: CGPointMake(44.08, 23.39) controlPoint1: CGPointMake(44.04, 23.39) controlPoint2: CGPointMake(44.06, 23.39)]; + [bezier3Path addLineToPoint: CGPointMake(44.13, 23.39)]; + [bezier3Path addLineToPoint: CGPointMake(44.19, 23.39)]; + [bezier3Path addLineToPoint: CGPointMake(44.24, 23.4)]; + [bezier3Path addLineToPoint: CGPointMake(44.3, 23.4)]; + [bezier3Path addLineToPoint: CGPointMake(44.35, 23.4)]; + [bezier3Path addLineToPoint: CGPointMake(44.41, 23.4)]; + [bezier3Path addLineToPoint: CGPointMake(44.46, 23.4)]; + [bezier3Path addLineToPoint: CGPointMake(44.52, 23.41)]; + [bezier3Path addLineToPoint: CGPointMake(44.57, 23.41)]; + [bezier3Path addLineToPoint: CGPointMake(44.63, 23.41)]; + [bezier3Path addLineToPoint: CGPointMake(44.68, 23.42)]; + [bezier3Path addLineToPoint: CGPointMake(44.74, 23.42)]; + [bezier3Path addLineToPoint: CGPointMake(44.79, 23.43)]; + [bezier3Path addLineToPoint: CGPointMake(44.85, 23.43)]; + [bezier3Path addLineToPoint: CGPointMake(44.9, 23.44)]; + [bezier3Path addLineToPoint: CGPointMake(44.96, 23.44)]; + [bezier3Path addLineToPoint: CGPointMake(45.01, 23.45)]; + [bezier3Path addLineToPoint: CGPointMake(45.07, 23.45)]; + [bezier3Path addLineToPoint: CGPointMake(45.12, 23.46)]; + [bezier3Path addLineToPoint: CGPointMake(45.18, 23.47)]; + [bezier3Path addLineToPoint: CGPointMake(45.23, 23.47)]; + [bezier3Path addLineToPoint: CGPointMake(45.29, 23.48)]; + [bezier3Path addLineToPoint: CGPointMake(45.34, 23.49)]; + [bezier3Path addLineToPoint: CGPointMake(45.39, 23.5)]; + [bezier3Path addLineToPoint: CGPointMake(45.45, 23.5)]; + [bezier3Path addLineToPoint: CGPointMake(45.5, 23.51)]; + [bezier3Path addLineToPoint: CGPointMake(45.56, 23.52)]; + [bezier3Path addLineToPoint: CGPointMake(45.61, 23.53)]; + [bezier3Path addLineToPoint: CGPointMake(45.67, 23.54)]; + [bezier3Path addLineToPoint: CGPointMake(45.72, 23.55)]; + [bezier3Path addLineToPoint: CGPointMake(45.78, 23.56)]; + [bezier3Path addLineToPoint: CGPointMake(45.83, 23.57)]; + [bezier3Path addLineToPoint: CGPointMake(45.89, 23.58)]; + [bezier3Path addLineToPoint: CGPointMake(45.94, 23.59)]; + [bezier3Path addLineToPoint: CGPointMake(46, 23.6)]; + [bezier3Path addLineToPoint: CGPointMake(46.05, 23.61)]; + [bezier3Path addLineToPoint: CGPointMake(46.11, 23.62)]; + [bezier3Path addLineToPoint: CGPointMake(46.16, 23.64)]; + [bezier3Path addLineToPoint: CGPointMake(46.22, 23.65)]; + [bezier3Path addLineToPoint: CGPointMake(46.27, 23.66)]; + [bezier3Path addLineToPoint: CGPointMake(46.33, 23.67)]; + [bezier3Path addLineToPoint: CGPointMake(46.38, 23.69)]; + [bezier3Path addLineToPoint: CGPointMake(46.44, 23.7)]; + [bezier3Path addLineToPoint: CGPointMake(46.49, 23.71)]; + [bezier3Path addLineToPoint: CGPointMake(46.55, 23.73)]; + [bezier3Path addLineToPoint: CGPointMake(46.6, 23.74)]; + [bezier3Path addLineToPoint: CGPointMake(46.66, 23.76)]; + [bezier3Path addLineToPoint: CGPointMake(46.71, 23.77)]; + [bezier3Path addLineToPoint: CGPointMake(46.77, 23.79)]; + [bezier3Path addLineToPoint: CGPointMake(46.82, 23.8)]; + [bezier3Path addLineToPoint: CGPointMake(46.88, 23.82)]; + [bezier3Path addLineToPoint: CGPointMake(46.93, 23.84)]; + [bezier3Path addLineToPoint: CGPointMake(46.99, 23.85)]; + [bezier3Path addLineToPoint: CGPointMake(47.04, 23.87)]; + [bezier3Path addLineToPoint: CGPointMake(47.1, 23.89)]; + [bezier3Path addLineToPoint: CGPointMake(47.15, 23.9)]; + [bezier3Path addLineToPoint: CGPointMake(47.21, 23.92)]; + [bezier3Path addLineToPoint: CGPointMake(47.26, 23.94)]; + [bezier3Path addLineToPoint: CGPointMake(47.31, 23.96)]; + [bezier3Path addLineToPoint: CGPointMake(47.37, 23.98)]; + [bezier3Path addLineToPoint: CGPointMake(47.42, 24)]; + [bezier3Path addLineToPoint: CGPointMake(47.48, 24.02)]; + [bezier3Path addLineToPoint: CGPointMake(47.53, 24.03)]; + [bezier3Path addLineToPoint: CGPointMake(47.59, 24.05)]; + [bezier3Path addLineToPoint: CGPointMake(47.64, 24.08)]; + [bezier3Path addLineToPoint: CGPointMake(47.7, 24.1)]; + [bezier3Path addLineToPoint: CGPointMake(47.75, 24.12)]; + [bezier3Path addLineToPoint: CGPointMake(47.81, 24.14)]; + [bezier3Path addLineToPoint: CGPointMake(47.86, 24.16)]; + [bezier3Path addLineToPoint: CGPointMake(47.92, 24.18)]; + [bezier3Path addLineToPoint: CGPointMake(47.97, 24.2)]; + [bezier3Path addLineToPoint: CGPointMake(48.03, 24.23)]; + [bezier3Path addLineToPoint: CGPointMake(48.08, 24.25)]; + [bezier3Path addLineToPoint: CGPointMake(48.14, 24.27)]; + [bezier3Path addLineToPoint: CGPointMake(48.19, 24.3)]; + [bezier3Path addLineToPoint: CGPointMake(48.25, 24.32)]; + [bezier3Path addLineToPoint: CGPointMake(48.3, 24.34)]; + [bezier3Path addLineToPoint: CGPointMake(48.36, 24.37)]; + [bezier3Path addLineToPoint: CGPointMake(48.41, 24.39)]; + [bezier3Path addLineToPoint: CGPointMake(48.47, 24.42)]; + [bezier3Path addLineToPoint: CGPointMake(48.52, 24.44)]; + [bezier3Path addLineToPoint: CGPointMake(48.58, 24.47)]; + [bezier3Path addLineToPoint: CGPointMake(48.63, 24.49)]; + [bezier3Path addLineToPoint: CGPointMake(48.69, 24.52)]; + [bezier3Path addLineToPoint: CGPointMake(48.74, 24.54)]; + [bezier3Path addLineToPoint: CGPointMake(48.8, 24.57)]; + [bezier3Path addLineToPoint: CGPointMake(48.85, 24.6)]; + [bezier3Path addLineToPoint: CGPointMake(48.91, 24.62)]; + [bezier3Path addLineToPoint: CGPointMake(48.96, 24.65)]; + [bezier3Path addLineToPoint: CGPointMake(48.96, 22.28)]; + [bezier3Path addLineToPoint: CGPointMake(48.91, 22.27)]; + [bezier3Path addLineToPoint: CGPointMake(48.85, 22.26)]; + [bezier3Path addLineToPoint: CGPointMake(48.8, 22.25)]; + [bezier3Path addLineToPoint: CGPointMake(48.74, 22.23)]; + [bezier3Path addLineToPoint: CGPointMake(48.69, 22.22)]; + [bezier3Path addLineToPoint: CGPointMake(48.63, 22.21)]; + [bezier3Path addLineToPoint: CGPointMake(48.58, 22.2)]; + [bezier3Path addLineToPoint: CGPointMake(48.52, 22.18)]; + [bezier3Path addLineToPoint: CGPointMake(48.47, 22.17)]; + [bezier3Path addLineToPoint: CGPointMake(48.41, 22.16)]; + [bezier3Path addLineToPoint: CGPointMake(48.36, 22.15)]; + [bezier3Path addLineToPoint: CGPointMake(48.3, 22.14)]; + [bezier3Path addLineToPoint: CGPointMake(48.25, 22.12)]; + [bezier3Path addLineToPoint: CGPointMake(48.19, 22.11)]; + [bezier3Path addLineToPoint: CGPointMake(48.14, 22.1)]; + [bezier3Path addLineToPoint: CGPointMake(48.08, 22.09)]; + [bezier3Path addLineToPoint: CGPointMake(48.03, 22.08)]; + [bezier3Path addLineToPoint: CGPointMake(47.97, 22.07)]; + [bezier3Path addLineToPoint: CGPointMake(47.92, 22.06)]; + [bezier3Path addLineToPoint: CGPointMake(47.86, 22.05)]; + [bezier3Path addLineToPoint: CGPointMake(47.81, 22.04)]; + [bezier3Path addLineToPoint: CGPointMake(47.75, 22.03)]; + [bezier3Path addLineToPoint: CGPointMake(47.7, 22.02)]; + [bezier3Path addLineToPoint: CGPointMake(47.64, 22.01)]; + [bezier3Path addLineToPoint: CGPointMake(47.59, 22)]; + [bezier3Path addLineToPoint: CGPointMake(47.53, 21.99)]; + [bezier3Path addLineToPoint: CGPointMake(47.48, 21.98)]; + [bezier3Path addLineToPoint: CGPointMake(47.42, 21.97)]; + [bezier3Path addLineToPoint: CGPointMake(47.37, 21.96)]; + [bezier3Path addLineToPoint: CGPointMake(47.31, 21.95)]; + [bezier3Path addLineToPoint: CGPointMake(47.26, 21.94)]; + [bezier3Path addLineToPoint: CGPointMake(47.21, 21.93)]; + [bezier3Path addLineToPoint: CGPointMake(47.15, 21.92)]; + [bezier3Path addLineToPoint: CGPointMake(47.1, 21.91)]; + [bezier3Path addLineToPoint: CGPointMake(47.04, 21.9)]; + [bezier3Path addLineToPoint: CGPointMake(46.99, 21.89)]; + [bezier3Path addLineToPoint: CGPointMake(46.93, 21.88)]; + [bezier3Path addLineToPoint: CGPointMake(46.88, 21.87)]; + [bezier3Path addLineToPoint: CGPointMake(46.82, 21.86)]; + [bezier3Path addLineToPoint: CGPointMake(46.77, 21.86)]; + [bezier3Path addLineToPoint: CGPointMake(46.71, 21.85)]; + [bezier3Path addLineToPoint: CGPointMake(46.66, 21.84)]; + [bezier3Path addLineToPoint: CGPointMake(46.6, 21.83)]; + [bezier3Path addLineToPoint: CGPointMake(46.55, 21.82)]; + [bezier3Path addLineToPoint: CGPointMake(46.49, 21.81)]; + [bezier3Path addLineToPoint: CGPointMake(46.44, 21.81)]; + [bezier3Path addLineToPoint: CGPointMake(46.38, 21.8)]; + [bezier3Path addLineToPoint: CGPointMake(46.33, 21.79)]; + [bezier3Path addLineToPoint: CGPointMake(46.27, 21.78)]; + [bezier3Path addLineToPoint: CGPointMake(46.22, 21.78)]; + [bezier3Path addLineToPoint: CGPointMake(46.16, 21.77)]; + [bezier3Path addLineToPoint: CGPointMake(46.11, 21.76)]; + [bezier3Path addLineToPoint: CGPointMake(46.05, 21.76)]; + [bezier3Path addLineToPoint: CGPointMake(46, 21.75)]; + [bezier3Path addLineToPoint: CGPointMake(45.94, 21.74)]; + [bezier3Path addLineToPoint: CGPointMake(45.89, 21.74)]; + [bezier3Path addLineToPoint: CGPointMake(45.83, 21.73)]; + [bezier3Path addLineToPoint: CGPointMake(45.78, 21.72)]; + [bezier3Path addLineToPoint: CGPointMake(45.72, 21.72)]; + [bezier3Path addLineToPoint: CGPointMake(45.67, 21.71)]; + [bezier3Path addLineToPoint: CGPointMake(45.61, 21.7)]; + [bezier3Path addLineToPoint: CGPointMake(45.56, 21.7)]; + [bezier3Path addLineToPoint: CGPointMake(45.5, 21.69)]; + [bezier3Path addLineToPoint: CGPointMake(45.45, 21.69)]; + [bezier3Path addLineToPoint: CGPointMake(45.39, 21.68)]; + [bezier3Path addLineToPoint: CGPointMake(45.34, 21.68)]; + [bezier3Path addLineToPoint: CGPointMake(45.29, 21.67)]; + [bezier3Path addLineToPoint: CGPointMake(45.23, 21.67)]; + [bezier3Path addLineToPoint: CGPointMake(45.18, 21.66)]; + [bezier3Path addLineToPoint: CGPointMake(45.12, 21.66)]; + [bezier3Path addLineToPoint: CGPointMake(45.07, 21.65)]; + [bezier3Path addLineToPoint: CGPointMake(45.01, 21.65)]; + [bezier3Path addLineToPoint: CGPointMake(44.96, 21.65)]; + [bezier3Path addLineToPoint: CGPointMake(44.9, 21.64)]; + [bezier3Path addLineToPoint: CGPointMake(44.85, 21.64)]; + [bezier3Path addLineToPoint: CGPointMake(44.79, 21.63)]; + [bezier3Path addLineToPoint: CGPointMake(44.74, 21.63)]; + [bezier3Path addLineToPoint: CGPointMake(44.68, 21.63)]; + [bezier3Path addLineToPoint: CGPointMake(44.63, 21.62)]; + [bezier3Path addLineToPoint: CGPointMake(44.57, 21.62)]; + [bezier3Path addLineToPoint: CGPointMake(44.52, 21.62)]; + [bezier3Path addLineToPoint: CGPointMake(44.46, 21.62)]; + [bezier3Path addLineToPoint: CGPointMake(44.41, 21.61)]; + [bezier3Path addLineToPoint: CGPointMake(44.35, 21.61)]; + [bezier3Path addLineToPoint: CGPointMake(44.3, 21.61)]; + [bezier3Path addLineToPoint: CGPointMake(44.24, 21.61)]; + [bezier3Path addLineToPoint: CGPointMake(44.19, 21.61)]; + [bezier3Path addLineToPoint: CGPointMake(44.13, 21.6)]; + [bezier3Path addLineToPoint: CGPointMake(44.08, 21.6)]; + [bezier3Path addLineToPoint: CGPointMake(44.02, 21.6)]; + [bezier3Path addLineToPoint: CGPointMake(43.97, 21.6)]; + [bezier3Path addLineToPoint: CGPointMake(43.91, 21.6)]; + [bezier3Path addLineToPoint: CGPointMake(43.86, 21.6)]; + [bezier3Path addLineToPoint: CGPointMake(43.8, 21.6)]; + [bezier3Path addLineToPoint: CGPointMake(43.75, 21.59)]; + [bezier3Path addLineToPoint: CGPointMake(43.69, 21.59)]; + [bezier3Path addLineToPoint: CGPointMake(43.64, 21.59)]; + [bezier3Path addLineToPoint: CGPointMake(43.58, 21.59)]; + [bezier3Path addLineToPoint: CGPointMake(43.53, 21.59)]; + [bezier3Path addLineToPoint: CGPointMake(43.47, 21.59)]; + [bezier3Path addLineToPoint: CGPointMake(43.42, 21.59)]; + [bezier3Path addLineToPoint: CGPointMake(43.37, 21.59)]; + [bezier3Path addLineToPoint: CGPointMake(43.31, 21.59)]; + [bezier3Path addLineToPoint: CGPointMake(43.26, 21.59)]; + [bezier3Path addLineToPoint: CGPointMake(43.2, 21.59)]; + [bezier3Path addLineToPoint: CGPointMake(43.15, 21.59)]; + [bezier3Path addLineToPoint: CGPointMake(43.09, 21.59)]; + [bezier3Path addLineToPoint: CGPointMake(43.04, 21.59)]; + [bezier3Path addLineToPoint: CGPointMake(42.98, 21.59)]; + [bezier3Path addLineToPoint: CGPointMake(42.93, 21.6)]; + [bezier3Path addLineToPoint: CGPointMake(42.87, 21.6)]; + [bezier3Path addLineToPoint: CGPointMake(42.82, 21.6)]; + [bezier3Path addLineToPoint: CGPointMake(42.76, 21.6)]; + [bezier3Path addLineToPoint: CGPointMake(42.71, 21.6)]; + [bezier3Path addLineToPoint: CGPointMake(42.65, 21.6)]; + [bezier3Path addLineToPoint: CGPointMake(42.6, 21.6)]; + [bezier3Path addLineToPoint: CGPointMake(42.54, 21.61)]; + [bezier3Path addLineToPoint: CGPointMake(42.49, 21.61)]; + [bezier3Path addLineToPoint: CGPointMake(42.43, 21.61)]; + [bezier3Path addLineToPoint: CGPointMake(42.38, 21.61)]; + [bezier3Path addLineToPoint: CGPointMake(42.32, 21.61)]; + [bezier3Path addLineToPoint: CGPointMake(42.27, 21.62)]; + [bezier3Path addLineToPoint: CGPointMake(42.21, 21.62)]; + [bezier3Path addLineToPoint: CGPointMake(42.16, 21.62)]; + [bezier3Path addLineToPoint: CGPointMake(42.1, 21.63)]; + [bezier3Path addLineToPoint: CGPointMake(42.05, 21.63)]; + [bezier3Path addLineToPoint: CGPointMake(41.99, 21.63)]; + [bezier3Path addLineToPoint: CGPointMake(41.94, 21.64)]; + [bezier3Path addLineToPoint: CGPointMake(41.88, 21.64)]; + [bezier3Path addLineToPoint: CGPointMake(41.83, 21.64)]; + [bezier3Path addLineToPoint: CGPointMake(41.77, 21.65)]; + [bezier3Path addLineToPoint: CGPointMake(41.72, 21.65)]; + [bezier3Path addLineToPoint: CGPointMake(41.66, 21.66)]; + [bezier3Path addLineToPoint: CGPointMake(41.61, 21.66)]; + [bezier3Path addLineToPoint: CGPointMake(41.55, 21.67)]; + [bezier3Path addLineToPoint: CGPointMake(41.5, 21.67)]; + [bezier3Path addLineToPoint: CGPointMake(41.45, 21.68)]; + [bezier3Path addLineToPoint: CGPointMake(41.39, 21.68)]; + [bezier3Path addLineToPoint: CGPointMake(41.34, 21.69)]; + [bezier3Path addLineToPoint: CGPointMake(41.28, 21.69)]; + [bezier3Path addLineToPoint: CGPointMake(41.23, 21.7)]; + [bezier3Path addLineToPoint: CGPointMake(41.17, 21.71)]; + [bezier3Path addLineToPoint: CGPointMake(41.12, 21.71)]; + [bezier3Path addLineToPoint: CGPointMake(41.06, 21.72)]; + [bezier3Path addLineToPoint: CGPointMake(41.01, 21.72)]; + [bezier3Path addLineToPoint: CGPointMake(40.95, 21.73)]; + [bezier3Path addLineToPoint: CGPointMake(40.9, 21.74)]; + [bezier3Path addLineToPoint: CGPointMake(40.84, 21.75)]; + [bezier3Path addLineToPoint: CGPointMake(40.79, 21.75)]; + [bezier3Path addLineToPoint: CGPointMake(40.73, 21.76)]; + [bezier3Path addLineToPoint: CGPointMake(40.68, 21.77)]; + [bezier3Path addLineToPoint: CGPointMake(40.62, 21.78)]; + [bezier3Path addLineToPoint: CGPointMake(40.57, 21.79)]; + [bezier3Path addLineToPoint: CGPointMake(40.51, 21.79)]; + [bezier3Path addLineToPoint: CGPointMake(40.46, 21.8)]; + [bezier3Path addLineToPoint: CGPointMake(40.4, 21.81)]; + [bezier3Path addLineToPoint: CGPointMake(40.35, 21.82)]; + [bezier3Path addLineToPoint: CGPointMake(40.29, 21.83)]; + [bezier3Path addLineToPoint: CGPointMake(40.24, 21.84)]; + [bezier3Path addLineToPoint: CGPointMake(40.18, 21.85)]; + [bezier3Path addLineToPoint: CGPointMake(40.13, 21.86)]; + [bezier3Path addLineToPoint: CGPointMake(40.07, 21.87)]; + [bezier3Path addLineToPoint: CGPointMake(40.02, 21.88)]; + [bezier3Path addLineToPoint: CGPointMake(39.96, 21.89)]; + [bezier3Path addLineToPoint: CGPointMake(39.91, 21.9)]; + [bezier3Path addLineToPoint: CGPointMake(39.85, 21.92)]; + [bezier3Path addLineToPoint: CGPointMake(39.8, 21.93)]; + [bezier3Path addLineToPoint: CGPointMake(39.74, 21.94)]; + [bezier3Path addLineToPoint: CGPointMake(39.69, 21.95)]; + [bezier3Path addLineToPoint: CGPointMake(39.63, 21.96)]; + [bezier3Path addLineToPoint: CGPointMake(39.58, 21.98)]; + [bezier3Path addLineToPoint: CGPointMake(39.53, 21.99)]; + [bezier3Path addLineToPoint: CGPointMake(39.47, 22)]; + [bezier3Path addLineToPoint: CGPointMake(39.42, 22.02)]; + [bezier3Path addLineToPoint: CGPointMake(39.36, 22.03)]; + [bezier3Path addLineToPoint: CGPointMake(39.31, 22.05)]; + [bezier3Path addLineToPoint: CGPointMake(39.25, 22.06)]; + [bezier3Path addLineToPoint: CGPointMake(39.2, 22.08)]; + [bezier3Path addLineToPoint: CGPointMake(39.14, 22.09)]; + [bezier3Path addLineToPoint: CGPointMake(39.09, 22.11)]; + [bezier3Path addLineToPoint: CGPointMake(39.03, 22.12)]; + [bezier3Path addLineToPoint: CGPointMake(38.98, 22.14)]; + [bezier3Path addLineToPoint: CGPointMake(38.92, 22.16)]; + [bezier3Path addLineToPoint: CGPointMake(38.87, 22.17)]; + [bezier3Path addCurveToPoint: CGPointMake(38.81, 22.19) controlPoint1: CGPointMake(38.85, 22.18) controlPoint2: CGPointMake(38.83, 22.18)]; + [bezier3Path addLineToPoint: CGPointMake(38.76, 22.21)]; + [bezier3Path addCurveToPoint: CGPointMake(38.7, 22.23) controlPoint1: CGPointMake(38.74, 22.21) controlPoint2: CGPointMake(38.72, 22.22)]; + [bezier3Path addLineToPoint: CGPointMake(38.65, 22.25)]; + [bezier3Path addLineToPoint: CGPointMake(38.59, 22.26)]; + [bezier3Path addCurveToPoint: CGPointMake(38.54, 22.28) controlPoint1: CGPointMake(38.57, 22.27) controlPoint2: CGPointMake(38.56, 22.28)]; + [bezier3Path addCurveToPoint: CGPointMake(38.48, 22.3) controlPoint1: CGPointMake(38.52, 22.29) controlPoint2: CGPointMake(38.5, 22.3)]; + [bezier3Path addLineToPoint: CGPointMake(38.43, 22.32)]; + [bezier3Path addCurveToPoint: CGPointMake(38.37, 22.34) controlPoint1: CGPointMake(38.41, 22.33) controlPoint2: CGPointMake(38.39, 22.34)]; + [bezier3Path addLineToPoint: CGPointMake(38.32, 22.37)]; + [bezier3Path addLineToPoint: CGPointMake(38.26, 22.39)]; + [bezier3Path addLineToPoint: CGPointMake(38.21, 22.41)]; + [bezier3Path addLineToPoint: CGPointMake(38.15, 22.43)]; + [bezier3Path addLineToPoint: CGPointMake(38.1, 22.45)]; + [bezier3Path addLineToPoint: CGPointMake(38.04, 22.48)]; + [bezier3Path addLineToPoint: CGPointMake(37.99, 22.5)]; + [bezier3Path addLineToPoint: CGPointMake(37.93, 22.53)]; + [bezier3Path addLineToPoint: CGPointMake(37.88, 22.55)]; + [bezier3Path addCurveToPoint: CGPointMake(37.82, 22.58) controlPoint1: CGPointMake(37.86, 22.56) controlPoint2: CGPointMake(37.84, 22.57)]; + [bezier3Path addLineToPoint: CGPointMake(37.77, 22.6)]; + [bezier3Path addLineToPoint: CGPointMake(37.71, 22.63)]; + [bezier3Path addLineToPoint: CGPointMake(37.66, 22.66)]; + [bezier3Path addCurveToPoint: CGPointMake(37.61, 22.69) controlPoint1: CGPointMake(37.64, 22.67) controlPoint2: CGPointMake(37.62, 22.68)]; + [bezier3Path addCurveToPoint: CGPointMake(37.55, 22.71) controlPoint1: CGPointMake(37.59, 22.69) controlPoint2: CGPointMake(37.57, 22.7)]; + [bezier3Path addLineToPoint: CGPointMake(37.5, 22.74)]; + [bezier3Path addLineToPoint: CGPointMake(37.44, 22.77)]; + [bezier3Path addCurveToPoint: CGPointMake(37.39, 22.8) controlPoint1: CGPointMake(37.42, 22.78) controlPoint2: CGPointMake(37.4, 22.79)]; + [bezier3Path addCurveToPoint: CGPointMake(37.33, 22.83) controlPoint1: CGPointMake(37.37, 22.81) controlPoint2: CGPointMake(37.35, 22.82)]; + [bezier3Path addCurveToPoint: CGPointMake(37.28, 22.87) controlPoint1: CGPointMake(37.31, 22.85) controlPoint2: CGPointMake(37.29, 22.86)]; + [bezier3Path addCurveToPoint: CGPointMake(37.22, 22.9) controlPoint1: CGPointMake(37.26, 22.88) controlPoint2: CGPointMake(37.24, 22.89)]; + [bezier3Path addCurveToPoint: CGPointMake(37.17, 22.93) controlPoint1: CGPointMake(37.2, 22.91) controlPoint2: CGPointMake(37.18, 22.92)]; + [bezier3Path addCurveToPoint: CGPointMake(37.11, 22.97) controlPoint1: CGPointMake(37.15, 22.94) controlPoint2: CGPointMake(37.13, 22.96)]; + [bezier3Path addLineToPoint: CGPointMake(37.06, 23)]; + [bezier3Path addCurveToPoint: CGPointMake(37, 23.04) controlPoint1: CGPointMake(37.04, 23.01) controlPoint2: CGPointMake(37.02, 23.03)]; + [bezier3Path addLineToPoint: CGPointMake(36.95, 23.08)]; + [bezier3Path addCurveToPoint: CGPointMake(36.89, 23.11) controlPoint1: CGPointMake(36.93, 23.09) controlPoint2: CGPointMake(36.91, 23.1)]; + [bezier3Path addCurveToPoint: CGPointMake(36.84, 23.15) controlPoint1: CGPointMake(36.87, 23.13) controlPoint2: CGPointMake(36.86, 23.14)]; + [bezier3Path addCurveToPoint: CGPointMake(36.78, 23.19) controlPoint1: CGPointMake(36.82, 23.17) controlPoint2: CGPointMake(36.8, 23.18)]; + [bezier3Path addCurveToPoint: CGPointMake(36.73, 23.23) controlPoint1: CGPointMake(36.76, 23.21) controlPoint2: CGPointMake(36.75, 23.22)]; + [bezier3Path addCurveToPoint: CGPointMake(36.67, 23.27) controlPoint1: CGPointMake(36.71, 23.25) controlPoint2: CGPointMake(36.69, 23.26)]; + [bezier3Path addCurveToPoint: CGPointMake(36.62, 23.32) controlPoint1: CGPointMake(36.65, 23.29) controlPoint2: CGPointMake(36.64, 23.3)]; + [bezier3Path addCurveToPoint: CGPointMake(36.5, 23.41) controlPoint1: CGPointMake(36.58, 23.35) controlPoint2: CGPointMake(36.54, 23.38)]; + [bezier3Path closePath]; + bezier3Path.miterLimit = 4; + + bezier3Path.usesEvenOddFillRule = YES; + + CGContextSaveGState(context); + [bezier3Path addClip]; + CGContextDrawLinearGradient(context, linearGradient3, + CGPointMake(36.5, 27.28), + CGPointMake(50.54, 27.28), + kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation); + CGContextRestoreGState(context); + } + } + + + //// Cleanup + CGGradientRelease(linearGradient3); + CGGradientRelease(linearGradient1); + CGGradientRelease(linearGradient2); + CGColorSpaceRelease(colorSpace); + +} + + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIMaestroVectorArtView.h b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIMaestroVectorArtView.h new file mode 100644 index 0000000..7b63195 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIMaestroVectorArtView.h @@ -0,0 +1,5 @@ +#import "BTUICardVectorArtView.h" + +@interface BTUIMaestroVectorArtView : BTUICardVectorArtView + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIMaestroVectorArtView.m b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIMaestroVectorArtView.m new file mode 100644 index 0000000..81dd870 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIMaestroVectorArtView.m @@ -0,0 +1,309 @@ +#import "BTUIMaestroVectorArtView.h" + +@implementation BTUIMaestroVectorArtView + +- (void)drawArt { + //// Color Declarations + UIColor* color3 = [UIColor colorWithRed: 1 green: 1 blue: 1 alpha: 1]; + UIColor* color1 = [UIColor colorWithRed: 0.067 green: 0.541 blue: 0.834 alpha: 1]; + UIColor* color2 = [UIColor colorWithRed: 0.899 green: 0 blue: 0.139 alpha: 1]; + + //// Page-1 + { + //// Maestro + { + //// Shape + { + //// Bezier Drawing + UIBezierPath* bezierPath = [UIBezierPath bezierPath]; + [bezierPath moveToPoint: CGPointMake(43.91, 40.1)]; + [bezierPath addCurveToPoint: CGPointMake(49.5, 27.5) controlPoint1: CGPointMake(47.34, 36.99) controlPoint2: CGPointMake(49.5, 32.5)]; + [bezierPath addCurveToPoint: CGPointMake(43.91, 14.9) controlPoint1: CGPointMake(49.5, 22.5) controlPoint2: CGPointMake(47.34, 18.01)]; + [bezierPath addCurveToPoint: CGPointMake(32.5, 10.5) controlPoint1: CGPointMake(40.89, 12.17) controlPoint2: CGPointMake(36.89, 10.5)]; + [bezierPath addCurveToPoint: CGPointMake(15.5, 27.5) controlPoint1: CGPointMake(23.11, 10.5) controlPoint2: CGPointMake(15.5, 18.11)]; + [bezierPath addCurveToPoint: CGPointMake(32.5, 44.5) controlPoint1: CGPointMake(15.5, 36.89) controlPoint2: CGPointMake(23.11, 44.5)]; + [bezierPath addCurveToPoint: CGPointMake(43.91, 40.1) controlPoint1: CGPointMake(36.89, 44.5) controlPoint2: CGPointMake(40.89, 42.83)]; + [bezierPath addLineToPoint: CGPointMake(43.91, 40.1)]; + [bezierPath addLineToPoint: CGPointMake(43.91, 40.1)]; + [bezierPath addLineToPoint: CGPointMake(43.91, 40.1)]; + [bezierPath addLineToPoint: CGPointMake(43.91, 40.1)]; + [bezierPath closePath]; + bezierPath.miterLimit = 4; + + bezierPath.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezierPath fill]; + + + //// Bezier 2 Drawing + UIBezierPath* bezier2Path = [UIBezierPath bezierPath]; + [bezier2Path moveToPoint: CGPointMake(54.81, 11)]; + [bezier2Path addCurveToPoint: CGPointMake(43.27, 15.4) controlPoint1: CGPointMake(50.36, 11) controlPoint2: CGPointMake(46.32, 12.67)]; + [bezier2Path addCurveToPoint: CGPointMake(41.53, 17.2) controlPoint1: CGPointMake(42.64, 15.96) controlPoint2: CGPointMake(42.06, 16.56)]; + [bezier2Path addLineToPoint: CGPointMake(45, 17.2)]; + [bezier2Path addCurveToPoint: CGPointMake(46.31, 19) controlPoint1: CGPointMake(45.48, 17.77) controlPoint2: CGPointMake(45.91, 18.37)]; + [bezier2Path addLineToPoint: CGPointMake(40.22, 19)]; + [bezier2Path addCurveToPoint: CGPointMake(39.23, 20.8) controlPoint1: CGPointMake(39.85, 19.58) controlPoint2: CGPointMake(39.52, 20.18)]; + [bezier2Path addLineToPoint: CGPointMake(47.3, 20.8)]; + [bezier2Path addCurveToPoint: CGPointMake(48.03, 22.6) controlPoint1: CGPointMake(47.58, 21.38) controlPoint2: CGPointMake(47.82, 21.98)]; + [bezier2Path addLineToPoint: CGPointMake(38.5, 22.6)]; + [bezier2Path addCurveToPoint: CGPointMake(38, 24.4) controlPoint1: CGPointMake(38.3, 23.19) controlPoint2: CGPointMake(38.13, 23.79)]; + [bezier2Path addLineToPoint: CGPointMake(48.53, 24.4)]; + [bezier2Path addCurveToPoint: CGPointMake(48.92, 28) controlPoint1: CGPointMake(48.78, 25.56) controlPoint2: CGPointMake(48.92, 26.76)]; + [bezier2Path addCurveToPoint: CGPointMake(48.03, 33.4) controlPoint1: CGPointMake(48.92, 29.89) controlPoint2: CGPointMake(48.61, 31.7)]; + [bezier2Path addLineToPoint: CGPointMake(38.5, 33.4)]; + [bezier2Path addCurveToPoint: CGPointMake(39.23, 35.2) controlPoint1: CGPointMake(38.71, 34.02) controlPoint2: CGPointMake(38.95, 34.62)]; + [bezier2Path addLineToPoint: CGPointMake(47.3, 35.2)]; + [bezier2Path addCurveToPoint: CGPointMake(46.31, 37) controlPoint1: CGPointMake(47.01, 35.82) controlPoint2: CGPointMake(46.68, 36.42)]; + [bezier2Path addLineToPoint: CGPointMake(40.22, 37)]; + [bezier2Path addCurveToPoint: CGPointMake(41.53, 38.8) controlPoint1: CGPointMake(40.62, 37.63) controlPoint2: CGPointMake(41.05, 38.23)]; + [bezier2Path addLineToPoint: CGPointMake(45, 38.8)]; + [bezier2Path addCurveToPoint: CGPointMake(43.27, 40.6) controlPoint1: CGPointMake(44.47, 39.44) controlPoint2: CGPointMake(43.89, 40.04)]; + [bezier2Path addCurveToPoint: CGPointMake(54.81, 45) controlPoint1: CGPointMake(46.32, 43.33) controlPoint2: CGPointMake(50.36, 45)]; + [bezier2Path addCurveToPoint: CGPointMake(72, 28) controlPoint1: CGPointMake(64.3, 45) controlPoint2: CGPointMake(72, 37.39)]; + [bezier2Path addCurveToPoint: CGPointMake(54.81, 11) controlPoint1: CGPointMake(72, 18.61) controlPoint2: CGPointMake(64.3, 11)]; + [bezier2Path addLineToPoint: CGPointMake(54.81, 11)]; + [bezier2Path addLineToPoint: CGPointMake(54.81, 11)]; + [bezier2Path addLineToPoint: CGPointMake(54.81, 11)]; + [bezier2Path addLineToPoint: CGPointMake(54.81, 11)]; + [bezier2Path closePath]; + bezier2Path.miterLimit = 4; + + bezier2Path.usesEvenOddFillRule = YES; + + [color2 setFill]; + [bezier2Path fill]; + + + //// Bezier 3 Drawing + UIBezierPath* bezier3Path = [UIBezierPath bezierPath]; + [bezier3Path moveToPoint: CGPointMake(30.6, 32.21)]; + [bezier3Path addLineToPoint: CGPointMake(28.45, 32.21)]; + [bezier3Path addLineToPoint: CGPointMake(29.73, 25.44)]; + [bezier3Path addLineToPoint: CGPointMake(26.79, 32.21)]; + [bezier3Path addLineToPoint: CGPointMake(24.83, 32.21)]; + [bezier3Path addLineToPoint: CGPointMake(24.47, 25.48)]; + [bezier3Path addLineToPoint: CGPointMake(23.19, 32.21)]; + [bezier3Path addLineToPoint: CGPointMake(21.24, 32.21)]; + [bezier3Path addLineToPoint: CGPointMake(22.91, 23.4)]; + [bezier3Path addLineToPoint: CGPointMake(26.26, 23.4)]; + [bezier3Path addLineToPoint: CGPointMake(26.44, 28.85)]; + [bezier3Path addLineToPoint: CGPointMake(28.8, 23.4)]; + [bezier3Path addLineToPoint: CGPointMake(32.29, 23.4)]; + [bezier3Path addLineToPoint: CGPointMake(30.6, 32.21)]; + [bezier3Path addLineToPoint: CGPointMake(30.6, 32.21)]; + [bezier3Path closePath]; + bezier3Path.miterLimit = 4; + + bezier3Path.usesEvenOddFillRule = YES; + + [color3 setFill]; + [bezier3Path fill]; + + + //// Bezier 4 Drawing + UIBezierPath* bezier4Path = [UIBezierPath bezierPath]; + [bezier4Path moveToPoint: CGPointMake(54.6, 32.12)]; + [bezier4Path addCurveToPoint: CGPointMake(53.06, 32.36) controlPoint1: CGPointMake(54.01, 32.29) controlPoint2: CGPointMake(53.55, 32.36)]; + [bezier4Path addCurveToPoint: CGPointMake(51.36, 30.78) controlPoint1: CGPointMake(51.96, 32.36) controlPoint2: CGPointMake(51.36, 31.8)]; + [bezier4Path addCurveToPoint: CGPointMake(51.42, 30.14) controlPoint1: CGPointMake(51.36, 30.58) controlPoint2: CGPointMake(51.38, 30.37)]; + [bezier4Path addLineToPoint: CGPointMake(51.55, 29.44)]; + [bezier4Path addLineToPoint: CGPointMake(51.65, 28.87)]; + [bezier4Path addLineToPoint: CGPointMake(52.65, 23.4)]; + [bezier4Path addLineToPoint: CGPointMake(54.78, 23.4)]; + [bezier4Path addLineToPoint: CGPointMake(54.47, 25.04)]; + [bezier4Path addLineToPoint: CGPointMake(55.57, 25.04)]; + [bezier4Path addLineToPoint: CGPointMake(55.27, 26.79)]; + [bezier4Path addLineToPoint: CGPointMake(54.17, 26.79)]; + [bezier4Path addLineToPoint: CGPointMake(53.61, 29.78)]; + [bezier4Path addCurveToPoint: CGPointMake(53.57, 30.07) controlPoint1: CGPointMake(53.58, 29.91) controlPoint2: CGPointMake(53.57, 30.01)]; + [bezier4Path addCurveToPoint: CGPointMake(54.3, 30.61) controlPoint1: CGPointMake(53.57, 30.44) controlPoint2: CGPointMake(53.79, 30.61)]; + [bezier4Path addCurveToPoint: CGPointMake(54.88, 30.54) controlPoint1: CGPointMake(54.55, 30.61) controlPoint2: CGPointMake(54.74, 30.58)]; + [bezier4Path addLineToPoint: CGPointMake(54.6, 32.12)]; + [bezier4Path addLineToPoint: CGPointMake(54.6, 32.12)]; + [bezier4Path addLineToPoint: CGPointMake(54.6, 32.12)]; + [bezier4Path addLineToPoint: CGPointMake(54.6, 32.12)]; + [bezier4Path closePath]; + bezier4Path.miterLimit = 4; + + bezier4Path.usesEvenOddFillRule = YES; + + [color3 setFill]; + [bezier4Path fill]; + + + //// Bezier 5 Drawing + UIBezierPath* bezier5Path = [UIBezierPath bezierPath]; + [bezier5Path moveToPoint: CGPointMake(60.87, 25.1)]; + [bezier5Path addCurveToPoint: CGPointMake(60.63, 25.03) controlPoint1: CGPointMake(60.69, 25.03) controlPoint2: CGPointMake(60.65, 25.03)]; + [bezier5Path addCurveToPoint: CGPointMake(60.44, 24.98) controlPoint1: CGPointMake(60.51, 25) controlPoint2: CGPointMake(60.45, 24.99)]; + [bezier5Path addCurveToPoint: CGPointMake(60.23, 24.97) controlPoint1: CGPointMake(60.38, 24.97) controlPoint2: CGPointMake(60.31, 24.97)]; + [bezier5Path addCurveToPoint: CGPointMake(58.36, 26.13) controlPoint1: CGPointMake(59.52, 24.97) controlPoint2: CGPointMake(59.01, 25.28)]; + [bezier5Path addLineToPoint: CGPointMake(58.55, 25.04)]; + [bezier5Path addLineToPoint: CGPointMake(56.6, 25.04)]; + [bezier5Path addLineToPoint: CGPointMake(55.29, 32.21)]; + [bezier5Path addLineToPoint: CGPointMake(57.44, 32.21)]; + [bezier5Path addCurveToPoint: CGPointMake(59.57, 27.06) controlPoint1: CGPointMake(58.21, 27.83) controlPoint2: CGPointMake(58.54, 27.06)]; + [bezier5Path addCurveToPoint: CGPointMake(59.84, 27.08) controlPoint1: CGPointMake(59.65, 27.06) controlPoint2: CGPointMake(59.74, 27.07)]; + [bezier5Path addLineToPoint: CGPointMake(60.09, 27.13)]; + [bezier5Path addLineToPoint: CGPointMake(60.87, 25.1)]; + [bezier5Path addLineToPoint: CGPointMake(60.87, 25.1)]; + [bezier5Path addLineToPoint: CGPointMake(60.87, 25.1)]; + [bezier5Path addLineToPoint: CGPointMake(60.87, 25.1)]; + [bezier5Path closePath]; + bezier5Path.miterLimit = 4; + + bezier5Path.usesEvenOddFillRule = YES; + + [color3 setFill]; + [bezier5Path fill]; + + + //// Bezier 6 Drawing + UIBezierPath* bezier6Path = [UIBezierPath bezierPath]; + [bezier6Path moveToPoint: CGPointMake(46.09, 27.31)]; + [bezier6Path addCurveToPoint: CGPointMake(47.74, 29.31) controlPoint1: CGPointMake(46.09, 28.21) controlPoint2: CGPointMake(46.59, 28.84)]; + [bezier6Path addCurveToPoint: CGPointMake(48.76, 30.1) controlPoint1: CGPointMake(48.62, 29.67) controlPoint2: CGPointMake(48.76, 29.77)]; + [bezier6Path addCurveToPoint: CGPointMake(47.51, 30.75) controlPoint1: CGPointMake(48.76, 30.54) controlPoint2: CGPointMake(48.37, 30.75)]; + [bezier6Path addCurveToPoint: CGPointMake(45.56, 30.46) controlPoint1: CGPointMake(46.86, 30.75) controlPoint2: CGPointMake(46.26, 30.66)]; + [bezier6Path addLineToPoint: CGPointMake(45.26, 32.11)]; + [bezier6Path addLineToPoint: CGPointMake(45.36, 32.13)]; + [bezier6Path addLineToPoint: CGPointMake(45.76, 32.2)]; + [bezier6Path addCurveToPoint: CGPointMake(46.33, 32.27) controlPoint1: CGPointMake(45.89, 32.23) controlPoint2: CGPointMake(46.08, 32.25)]; + [bezier6Path addCurveToPoint: CGPointMake(47.52, 32.33) controlPoint1: CGPointMake(46.84, 32.31) controlPoint2: CGPointMake(47.24, 32.33)]; + [bezier6Path addCurveToPoint: CGPointMake(50.88, 29.93) controlPoint1: CGPointMake(49.82, 32.33) controlPoint2: CGPointMake(50.88, 31.57)]; + [bezier6Path addCurveToPoint: CGPointMake(49.34, 27.94) controlPoint1: CGPointMake(50.88, 28.95) controlPoint2: CGPointMake(50.43, 28.37)]; + [bezier6Path addCurveToPoint: CGPointMake(48.33, 27.16) controlPoint1: CGPointMake(48.43, 27.58) controlPoint2: CGPointMake(48.33, 27.5)]; + [bezier6Path addCurveToPoint: CGPointMake(49.39, 26.58) controlPoint1: CGPointMake(48.33, 26.78) controlPoint2: CGPointMake(48.69, 26.58)]; + [bezier6Path addCurveToPoint: CGPointMake(50.95, 26.68) controlPoint1: CGPointMake(49.82, 26.58) controlPoint2: CGPointMake(50.4, 26.62)]; + [bezier6Path addLineToPoint: CGPointMake(51.26, 25.03)]; + [bezier6Path addCurveToPoint: CGPointMake(49.35, 24.89) controlPoint1: CGPointMake(50.7, 24.95) controlPoint2: CGPointMake(49.85, 24.89)]; + [bezier6Path addCurveToPoint: CGPointMake(46.09, 27.31) controlPoint1: CGPointMake(46.92, 24.89) controlPoint2: CGPointMake(46.08, 25.99)]; + [bezier6Path addLineToPoint: CGPointMake(46.09, 27.31)]; + [bezier6Path addLineToPoint: CGPointMake(46.09, 27.31)]; + [bezier6Path addLineToPoint: CGPointMake(46.09, 27.31)]; + [bezier6Path addLineToPoint: CGPointMake(46.09, 27.31)]; + [bezier6Path closePath]; + bezier6Path.miterLimit = 4; + + bezier6Path.usesEvenOddFillRule = YES; + + [color3 setFill]; + [bezier6Path fill]; + + + //// Bezier 7 Drawing + UIBezierPath* bezier7Path = [UIBezierPath bezierPath]; + [bezier7Path moveToPoint: CGPointMake(37.58, 32.21)]; + [bezier7Path addLineToPoint: CGPointMake(35.8, 32.21)]; + [bezier7Path addLineToPoint: CGPointMake(35.84, 31.47)]; + [bezier7Path addCurveToPoint: CGPointMake(33.58, 32.34) controlPoint1: CGPointMake(35.29, 32.06) controlPoint2: CGPointMake(34.57, 32.34)]; + [bezier7Path addCurveToPoint: CGPointMake(31.62, 30.38) controlPoint1: CGPointMake(32.42, 32.34) controlPoint2: CGPointMake(31.62, 31.54)]; + [bezier7Path addCurveToPoint: CGPointMake(35.39, 27.61) controlPoint1: CGPointMake(31.62, 28.63) controlPoint2: CGPointMake(33.01, 27.61)]; + [bezier7Path addCurveToPoint: CGPointMake(36.27, 27.67) controlPoint1: CGPointMake(35.64, 27.61) controlPoint2: CGPointMake(35.95, 27.63)]; + [bezier7Path addCurveToPoint: CGPointMake(36.35, 27.2) controlPoint1: CGPointMake(36.34, 27.43) controlPoint2: CGPointMake(36.35, 27.33)]; + [bezier7Path addCurveToPoint: CGPointMake(34.98, 26.55) controlPoint1: CGPointMake(36.35, 26.73) controlPoint2: CGPointMake(35.98, 26.55)]; + [bezier7Path addCurveToPoint: CGPointMake(33.19, 26.75) controlPoint1: CGPointMake(34.36, 26.55) controlPoint2: CGPointMake(33.67, 26.63)]; + [bezier7Path addLineToPoint: CGPointMake(32.89, 26.83)]; + [bezier7Path addLineToPoint: CGPointMake(32.7, 26.87)]; + [bezier7Path addLineToPoint: CGPointMake(33, 25.26)]; + [bezier7Path addCurveToPoint: CGPointMake(35.57, 24.88) controlPoint1: CGPointMake(34.07, 24.99) controlPoint2: CGPointMake(34.78, 24.88)]; + [bezier7Path addCurveToPoint: CGPointMake(38.39, 26.98) controlPoint1: CGPointMake(37.42, 24.88) controlPoint2: CGPointMake(38.39, 25.61)]; + [bezier7Path addCurveToPoint: CGPointMake(38.22, 28.4) controlPoint1: CGPointMake(38.39, 27.34) controlPoint2: CGPointMake(38.36, 27.61)]; + [bezier7Path addLineToPoint: CGPointMake(37.77, 30.95)]; + [bezier7Path addLineToPoint: CGPointMake(37.69, 31.4)]; + [bezier7Path addLineToPoint: CGPointMake(37.64, 31.77)]; + [bezier7Path addLineToPoint: CGPointMake(37.6, 32.02)]; + [bezier7Path addLineToPoint: CGPointMake(37.58, 32.21)]; + [bezier7Path addLineToPoint: CGPointMake(37.58, 32.21)]; + [bezier7Path addLineToPoint: CGPointMake(37.58, 32.21)]; + [bezier7Path addLineToPoint: CGPointMake(37.58, 32.21)]; + [bezier7Path closePath]; + [bezier7Path moveToPoint: CGPointMake(36.01, 29.02)]; + [bezier7Path addCurveToPoint: CGPointMake(35.53, 28.99) controlPoint1: CGPointMake(35.79, 28.99) controlPoint2: CGPointMake(35.69, 28.99)]; + [bezier7Path addCurveToPoint: CGPointMake(33.7, 30.08) controlPoint1: CGPointMake(34.32, 28.99) controlPoint2: CGPointMake(33.7, 29.36)]; + [bezier7Path addCurveToPoint: CGPointMake(34.47, 30.81) controlPoint1: CGPointMake(33.7, 30.53) controlPoint2: CGPointMake(34, 30.81)]; + [bezier7Path addCurveToPoint: CGPointMake(36.01, 29.02) controlPoint1: CGPointMake(35.35, 30.81) controlPoint2: CGPointMake(35.98, 30.08)]; + [bezier7Path addLineToPoint: CGPointMake(36.01, 29.02)]; + [bezier7Path addLineToPoint: CGPointMake(36.01, 29.02)]; + [bezier7Path addLineToPoint: CGPointMake(36.01, 29.02)]; + [bezier7Path addLineToPoint: CGPointMake(36.01, 29.02)]; + [bezier7Path closePath]; + bezier7Path.miterLimit = 4; + + bezier7Path.usesEvenOddFillRule = YES; + + [color3 setFill]; + [bezier7Path fill]; + + + //// Bezier 8 Drawing + UIBezierPath* bezier8Path = [UIBezierPath bezierPath]; + [bezier8Path moveToPoint: CGPointMake(44.63, 32.06)]; + [bezier8Path addCurveToPoint: CGPointMake(42.43, 32.35) controlPoint1: CGPointMake(43.89, 32.25) controlPoint2: CGPointMake(43.18, 32.35)]; + [bezier8Path addCurveToPoint: CGPointMake(38.77, 29.14) controlPoint1: CGPointMake(40.02, 32.35) controlPoint2: CGPointMake(38.77, 31.24)]; + [bezier8Path addCurveToPoint: CGPointMake(42.53, 24.86) controlPoint1: CGPointMake(38.77, 26.68) controlPoint2: CGPointMake(40.36, 24.86)]; + [bezier8Path addCurveToPoint: CGPointMake(45.42, 27.47) controlPoint1: CGPointMake(44.29, 24.86) controlPoint2: CGPointMake(45.42, 25.88)]; + [bezier8Path addCurveToPoint: CGPointMake(45.16, 29.24) controlPoint1: CGPointMake(45.42, 28) controlPoint2: CGPointMake(45.35, 28.51)]; + [bezier8Path addLineToPoint: CGPointMake(40.89, 29.24)]; + [bezier8Path addCurveToPoint: CGPointMake(40.87, 29.47) controlPoint1: CGPointMake(40.87, 29.35) controlPoint2: CGPointMake(40.87, 29.4)]; + [bezier8Path addCurveToPoint: CGPointMake(42.75, 30.72) controlPoint1: CGPointMake(40.87, 30.3) controlPoint2: CGPointMake(41.5, 30.72)]; + [bezier8Path addCurveToPoint: CGPointMake(44.98, 30.27) controlPoint1: CGPointMake(43.52, 30.72) controlPoint2: CGPointMake(44.21, 30.58)]; + [bezier8Path addLineToPoint: CGPointMake(44.63, 32.06)]; + [bezier8Path addLineToPoint: CGPointMake(44.63, 32.06)]; + [bezier8Path addLineToPoint: CGPointMake(44.63, 32.06)]; + [bezier8Path addLineToPoint: CGPointMake(44.63, 32.06)]; + [bezier8Path closePath]; + [bezier8Path moveToPoint: CGPointMake(43.48, 27.79)]; + [bezier8Path addCurveToPoint: CGPointMake(43.5, 27.43) controlPoint1: CGPointMake(43.49, 27.64) controlPoint2: CGPointMake(43.5, 27.52)]; + [bezier8Path addCurveToPoint: CGPointMake(42.48, 26.5) controlPoint1: CGPointMake(43.5, 26.84) controlPoint2: CGPointMake(43.12, 26.5)]; + [bezier8Path addCurveToPoint: CGPointMake(41.11, 27.79) controlPoint1: CGPointMake(41.8, 26.5) controlPoint2: CGPointMake(41.31, 26.96)]; + [bezier8Path addLineToPoint: CGPointMake(43.48, 27.79)]; + [bezier8Path addLineToPoint: CGPointMake(43.48, 27.79)]; + [bezier8Path addLineToPoint: CGPointMake(43.48, 27.79)]; + [bezier8Path addLineToPoint: CGPointMake(43.48, 27.79)]; + [bezier8Path closePath]; + bezier8Path.miterLimit = 4; + + bezier8Path.usesEvenOddFillRule = YES; + + [color3 setFill]; + [bezier8Path fill]; + + + //// Bezier 9 Drawing + UIBezierPath* bezier9Path = [UIBezierPath bezierPath]; + [bezier9Path moveToPoint: CGPointMake(67.55, 28.96)]; + [bezier9Path addCurveToPoint: CGPointMake(63.38, 32.4) controlPoint1: CGPointMake(67.23, 31.35) controlPoint2: CGPointMake(65.57, 32.4)]; + [bezier9Path addCurveToPoint: CGPointMake(59.96, 29.1) controlPoint1: CGPointMake(60.95, 32.4) controlPoint2: CGPointMake(59.96, 30.92)]; + [bezier9Path addCurveToPoint: CGPointMake(64.19, 24.84) controlPoint1: CGPointMake(59.96, 26.56) controlPoint2: CGPointMake(61.63, 24.84)]; + [bezier9Path addCurveToPoint: CGPointMake(67.6, 28.07) controlPoint1: CGPointMake(66.42, 24.84) controlPoint2: CGPointMake(67.6, 26.25)]; + [bezier9Path addCurveToPoint: CGPointMake(67.55, 28.96) controlPoint1: CGPointMake(67.6, 28.52) controlPoint2: CGPointMake(67.6, 28.55)]; + [bezier9Path addLineToPoint: CGPointMake(67.55, 28.96)]; + [bezier9Path addLineToPoint: CGPointMake(67.55, 28.96)]; + [bezier9Path addLineToPoint: CGPointMake(67.55, 28.96)]; + [bezier9Path addLineToPoint: CGPointMake(67.55, 28.96)]; + [bezier9Path closePath]; + [bezier9Path moveToPoint: CGPointMake(65.33, 28.05)]; + [bezier9Path addCurveToPoint: CGPointMake(64.15, 26.59) controlPoint1: CGPointMake(65.33, 27.3) controlPoint2: CGPointMake(65.03, 26.59)]; + [bezier9Path addCurveToPoint: CGPointMake(62.38, 29.04) controlPoint1: CGPointMake(63.06, 26.59) controlPoint2: CGPointMake(62.38, 27.89)]; + [bezier9Path addCurveToPoint: CGPointMake(63.61, 30.66) controlPoint1: CGPointMake(62.38, 30.02) controlPoint2: CGPointMake(62.84, 30.67)]; + [bezier9Path addCurveToPoint: CGPointMake(65.26, 28.9) controlPoint1: CGPointMake(64.08, 30.66) controlPoint2: CGPointMake(65.07, 30.02)]; + [bezier9Path addCurveToPoint: CGPointMake(65.33, 28.05) controlPoint1: CGPointMake(65.31, 28.64) controlPoint2: CGPointMake(65.33, 28.35)]; + [bezier9Path addLineToPoint: CGPointMake(65.33, 28.05)]; + [bezier9Path addLineToPoint: CGPointMake(65.33, 28.05)]; + [bezier9Path addLineToPoint: CGPointMake(65.33, 28.05)]; + [bezier9Path addLineToPoint: CGPointMake(65.33, 28.05)]; + [bezier9Path closePath]; + bezier9Path.miterLimit = 4; + + bezier9Path.usesEvenOddFillRule = YES; + + [color3 setFill]; + [bezier9Path fill]; + } + } + } +} +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIMasterCardVectorArtView.h b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIMasterCardVectorArtView.h new file mode 100644 index 0000000..6ad97ef --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIMasterCardVectorArtView.h @@ -0,0 +1,5 @@ +#import "BTUICardVectorArtView.h" + +@interface BTUIMasterCardVectorArtView : BTUICardVectorArtView + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIMasterCardVectorArtView.m b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIMasterCardVectorArtView.m new file mode 100644 index 0000000..7a4a371 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIMasterCardVectorArtView.m @@ -0,0 +1,3247 @@ +#import "BTUIMasterCardVectorArtView.h" + +@implementation BTUIMasterCardVectorArtView + +- (void)drawArt { + //// Color Declarations + UIColor* color1 = [UIColor colorWithRed: 0.93 green: 0.619 blue: 0.186 alpha: 1]; + UIColor* color2 = [UIColor colorWithRed: 0.8 green: 0.039 blue: 0.147 alpha: 1]; + UIColor* color3 = [UIColor colorWithRed: 1 green: 1 blue: 1 alpha: 1]; + + //// Page-1 + { + //// MasterCard + { + //// Group 4 + { + //// Bezier Drawing + UIBezierPath* bezierPath = [UIBezierPath bezierPath]; + [bezierPath moveToPoint: CGPointMake(54.97, 45)]; + [bezierPath addLineToPoint: CGPointMake(55.85, 44.98)]; + [bezierPath addLineToPoint: CGPointMake(56.71, 44.91)]; + [bezierPath addLineToPoint: CGPointMake(57.56, 44.81)]; + [bezierPath addLineToPoint: CGPointMake(58.4, 44.66)]; + [bezierPath addLineToPoint: CGPointMake(59.22, 44.47)]; + [bezierPath addLineToPoint: CGPointMake(60.03, 44.24)]; + [bezierPath addLineToPoint: CGPointMake(60.82, 43.97)]; + [bezierPath addLineToPoint: CGPointMake(61.6, 43.66)]; + [bezierPath addLineToPoint: CGPointMake(62.35, 43.32)]; + [bezierPath addLineToPoint: CGPointMake(63.09, 42.95)]; + [bezierPath addLineToPoint: CGPointMake(63.8, 42.53)]; + [bezierPath addLineToPoint: CGPointMake(64.49, 42.09)]; + [bezierPath addLineToPoint: CGPointMake(65.16, 41.62)]; + [bezierPath addLineToPoint: CGPointMake(65.8, 41.11)]; + [bezierPath addLineToPoint: CGPointMake(66.42, 40.58)]; + [bezierPath addLineToPoint: CGPointMake(67.01, 40.01)]; + [bezierPath addLineToPoint: CGPointMake(67.58, 39.42)]; + [bezierPath addLineToPoint: CGPointMake(68.11, 38.8)]; + [bezierPath addLineToPoint: CGPointMake(68.62, 38.16)]; + [bezierPath addLineToPoint: CGPointMake(69.09, 37.49)]; + [bezierPath addLineToPoint: CGPointMake(69.53, 36.8)]; + [bezierPath addLineToPoint: CGPointMake(69.95, 36.09)]; + [bezierPath addLineToPoint: CGPointMake(70.32, 35.35)]; + [bezierPath addLineToPoint: CGPointMake(70.66, 34.6)]; + [bezierPath addLineToPoint: CGPointMake(70.97, 33.82)]; + [bezierPath addLineToPoint: CGPointMake(71.24, 33.03)]; + [bezierPath addLineToPoint: CGPointMake(71.47, 32.22)]; + [bezierPath addLineToPoint: CGPointMake(71.66, 31.4)]; + [bezierPath addLineToPoint: CGPointMake(71.81, 30.56)]; + [bezierPath addLineToPoint: CGPointMake(71.91, 29.71)]; + [bezierPath addLineToPoint: CGPointMake(71.98, 28.85)]; + [bezierPath addLineToPoint: CGPointMake(72, 27.97)]; + [bezierPath addLineToPoint: CGPointMake(71.98, 27.1)]; + [bezierPath addLineToPoint: CGPointMake(71.91, 26.24)]; + [bezierPath addLineToPoint: CGPointMake(71.81, 25.39)]; + [bezierPath addLineToPoint: CGPointMake(71.66, 24.56)]; + [bezierPath addLineToPoint: CGPointMake(71.47, 23.74)]; + [bezierPath addLineToPoint: CGPointMake(71.24, 22.93)]; + [bezierPath addLineToPoint: CGPointMake(70.97, 22.14)]; + [bezierPath addLineToPoint: CGPointMake(70.66, 21.37)]; + [bezierPath addLineToPoint: CGPointMake(70.32, 20.62)]; + [bezierPath addLineToPoint: CGPointMake(69.95, 19.89)]; + [bezierPath addLineToPoint: CGPointMake(69.53, 19.18)]; + [bezierPath addLineToPoint: CGPointMake(69.09, 18.49)]; + [bezierPath addLineToPoint: CGPointMake(68.62, 17.82)]; + [bezierPath addLineToPoint: CGPointMake(68.11, 17.19)]; + [bezierPath addLineToPoint: CGPointMake(67.58, 16.57)]; + [bezierPath addLineToPoint: CGPointMake(67.01, 15.98)]; + [bezierPath addLineToPoint: CGPointMake(66.42, 15.42)]; + [bezierPath addLineToPoint: CGPointMake(65.8, 14.88)]; + [bezierPath addLineToPoint: CGPointMake(65.16, 14.38)]; + [bezierPath addLineToPoint: CGPointMake(64.49, 13.9)]; + [bezierPath addLineToPoint: CGPointMake(63.8, 13.46)]; + [bezierPath addLineToPoint: CGPointMake(63.09, 13.05)]; + [bezierPath addLineToPoint: CGPointMake(62.35, 12.68)]; + [bezierPath addLineToPoint: CGPointMake(61.6, 12.34)]; + [bezierPath addLineToPoint: CGPointMake(60.82, 12.03)]; + [bezierPath addLineToPoint: CGPointMake(60.03, 11.76)]; + [bezierPath addLineToPoint: CGPointMake(59.22, 11.53)]; + [bezierPath addLineToPoint: CGPointMake(58.4, 11.34)]; + [bezierPath addLineToPoint: CGPointMake(57.56, 11.19)]; + [bezierPath addLineToPoint: CGPointMake(56.71, 11.09)]; + [bezierPath addLineToPoint: CGPointMake(55.85, 11.02)]; + [bezierPath addLineToPoint: CGPointMake(54.97, 11)]; + [bezierPath addLineToPoint: CGPointMake(54.1, 11.02)]; + [bezierPath addLineToPoint: CGPointMake(53.23, 11.09)]; + [bezierPath addLineToPoint: CGPointMake(52.38, 11.19)]; + [bezierPath addLineToPoint: CGPointMake(51.54, 11.34)]; + [bezierPath addLineToPoint: CGPointMake(50.72, 11.53)]; + [bezierPath addLineToPoint: CGPointMake(49.92, 11.76)]; + [bezierPath addLineToPoint: CGPointMake(49.13, 12.03)]; + [bezierPath addLineToPoint: CGPointMake(48.36, 12.34)]; + [bezierPath addLineToPoint: CGPointMake(47.61, 12.68)]; + [bezierPath addLineToPoint: CGPointMake(46.88, 13.05)]; + [bezierPath addLineToPoint: CGPointMake(46.17, 13.46)]; + [bezierPath addLineToPoint: CGPointMake(45.48, 13.9)]; + [bezierPath addLineToPoint: CGPointMake(44.81, 14.38)]; + [bezierPath addLineToPoint: CGPointMake(44.17, 14.88)]; + [bezierPath addLineToPoint: CGPointMake(43.56, 15.42)]; + [bezierPath addLineToPoint: CGPointMake(42.97, 15.98)]; + [bezierPath addLineToPoint: CGPointMake(42.4, 16.57)]; + [bezierPath addLineToPoint: CGPointMake(41.87, 17.19)]; + [bezierPath addLineToPoint: CGPointMake(41.37, 17.82)]; + [bezierPath addLineToPoint: CGPointMake(40.9, 18.49)]; + [bezierPath addLineToPoint: CGPointMake(40.45, 19.18)]; + [bezierPath addLineToPoint: CGPointMake(40.05, 19.89)]; + [bezierPath addLineToPoint: CGPointMake(39.67, 20.62)]; + [bezierPath addLineToPoint: CGPointMake(39.33, 21.37)]; + [bezierPath addLineToPoint: CGPointMake(39.03, 22.14)]; + [bezierPath addLineToPoint: CGPointMake(38.76, 22.93)]; + [bezierPath addLineToPoint: CGPointMake(38.53, 23.74)]; + [bezierPath addLineToPoint: CGPointMake(38.34, 24.56)]; + [bezierPath addLineToPoint: CGPointMake(38.19, 25.39)]; + [bezierPath addLineToPoint: CGPointMake(38.09, 26.24)]; + [bezierPath addLineToPoint: CGPointMake(38.02, 27.1)]; + [bezierPath addLineToPoint: CGPointMake(38, 27.97)]; + [bezierPath addLineToPoint: CGPointMake(38.02, 28.85)]; + [bezierPath addLineToPoint: CGPointMake(38.09, 29.71)]; + [bezierPath addLineToPoint: CGPointMake(38.19, 30.56)]; + [bezierPath addLineToPoint: CGPointMake(38.34, 31.4)]; + [bezierPath addLineToPoint: CGPointMake(38.53, 32.22)]; + [bezierPath addLineToPoint: CGPointMake(38.76, 33.03)]; + [bezierPath addLineToPoint: CGPointMake(39.03, 33.82)]; + [bezierPath addLineToPoint: CGPointMake(39.33, 34.6)]; + [bezierPath addLineToPoint: CGPointMake(39.67, 35.35)]; + [bezierPath addLineToPoint: CGPointMake(40.05, 36.09)]; + [bezierPath addLineToPoint: CGPointMake(40.45, 36.8)]; + [bezierPath addLineToPoint: CGPointMake(40.9, 37.49)]; + [bezierPath addLineToPoint: CGPointMake(41.37, 38.16)]; + [bezierPath addLineToPoint: CGPointMake(41.87, 38.8)]; + [bezierPath addLineToPoint: CGPointMake(42.4, 39.42)]; + [bezierPath addLineToPoint: CGPointMake(42.97, 40.01)]; + [bezierPath addLineToPoint: CGPointMake(43.56, 40.58)]; + [bezierPath addLineToPoint: CGPointMake(44.17, 41.11)]; + [bezierPath addLineToPoint: CGPointMake(44.81, 41.62)]; + [bezierPath addLineToPoint: CGPointMake(45.48, 42.09)]; + [bezierPath addLineToPoint: CGPointMake(46.17, 42.53)]; + [bezierPath addLineToPoint: CGPointMake(46.88, 42.95)]; + [bezierPath addLineToPoint: CGPointMake(47.61, 43.32)]; + [bezierPath addLineToPoint: CGPointMake(48.36, 43.66)]; + [bezierPath addLineToPoint: CGPointMake(49.13, 43.97)]; + [bezierPath addLineToPoint: CGPointMake(49.92, 44.24)]; + [bezierPath addLineToPoint: CGPointMake(50.72, 44.47)]; + [bezierPath addLineToPoint: CGPointMake(51.54, 44.66)]; + [bezierPath addLineToPoint: CGPointMake(52.38, 44.81)]; + [bezierPath addLineToPoint: CGPointMake(53.23, 44.91)]; + [bezierPath addLineToPoint: CGPointMake(54.1, 44.98)]; + [bezierPath addLineToPoint: CGPointMake(54.97, 45)]; + [bezierPath closePath]; + bezierPath.miterLimit = 4; + + bezierPath.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezierPath fill]; + + + //// Bezier 2 Drawing + UIBezierPath* bezier2Path = [UIBezierPath bezierPath]; + [bezier2Path moveToPoint: CGPointMake(33.03, 45)]; + [bezier2Path addLineToPoint: CGPointMake(33.9, 44.98)]; + [bezier2Path addLineToPoint: CGPointMake(34.77, 44.91)]; + [bezier2Path addLineToPoint: CGPointMake(35.62, 44.81)]; + [bezier2Path addLineToPoint: CGPointMake(36.46, 44.66)]; + [bezier2Path addLineToPoint: CGPointMake(37.28, 44.47)]; + [bezier2Path addLineToPoint: CGPointMake(38.08, 44.24)]; + [bezier2Path addLineToPoint: CGPointMake(38.87, 43.97)]; + [bezier2Path addLineToPoint: CGPointMake(39.64, 43.66)]; + [bezier2Path addLineToPoint: CGPointMake(40.39, 43.32)]; + [bezier2Path addLineToPoint: CGPointMake(41.12, 42.95)]; + [bezier2Path addLineToPoint: CGPointMake(41.83, 42.53)]; + [bezier2Path addLineToPoint: CGPointMake(42.52, 42.09)]; + [bezier2Path addLineToPoint: CGPointMake(43.19, 41.62)]; + [bezier2Path addLineToPoint: CGPointMake(43.83, 41.11)]; + [bezier2Path addLineToPoint: CGPointMake(44.44, 40.58)]; + [bezier2Path addLineToPoint: CGPointMake(45.03, 40.01)]; + [bezier2Path addLineToPoint: CGPointMake(45.6, 39.42)]; + [bezier2Path addLineToPoint: CGPointMake(46.13, 38.8)]; + [bezier2Path addLineToPoint: CGPointMake(46.63, 38.16)]; + [bezier2Path addLineToPoint: CGPointMake(47.1, 37.49)]; + [bezier2Path addLineToPoint: CGPointMake(47.55, 36.8)]; + [bezier2Path addLineToPoint: CGPointMake(47.95, 36.09)]; + [bezier2Path addLineToPoint: CGPointMake(48.33, 35.35)]; + [bezier2Path addLineToPoint: CGPointMake(48.67, 34.6)]; + [bezier2Path addLineToPoint: CGPointMake(48.97, 33.82)]; + [bezier2Path addLineToPoint: CGPointMake(49.24, 33.03)]; + [bezier2Path addLineToPoint: CGPointMake(49.47, 32.22)]; + [bezier2Path addLineToPoint: CGPointMake(49.66, 31.4)]; + [bezier2Path addLineToPoint: CGPointMake(49.81, 30.56)]; + [bezier2Path addLineToPoint: CGPointMake(49.91, 29.71)]; + [bezier2Path addLineToPoint: CGPointMake(49.98, 28.85)]; + [bezier2Path addLineToPoint: CGPointMake(50, 27.97)]; + [bezier2Path addLineToPoint: CGPointMake(49.98, 27.1)]; + [bezier2Path addLineToPoint: CGPointMake(49.91, 26.24)]; + [bezier2Path addLineToPoint: CGPointMake(49.81, 25.39)]; + [bezier2Path addLineToPoint: CGPointMake(49.66, 24.56)]; + [bezier2Path addLineToPoint: CGPointMake(49.47, 23.74)]; + [bezier2Path addLineToPoint: CGPointMake(49.24, 22.93)]; + [bezier2Path addLineToPoint: CGPointMake(48.97, 22.14)]; + [bezier2Path addLineToPoint: CGPointMake(48.67, 21.37)]; + [bezier2Path addLineToPoint: CGPointMake(48.33, 20.62)]; + [bezier2Path addLineToPoint: CGPointMake(47.95, 19.89)]; + [bezier2Path addLineToPoint: CGPointMake(47.55, 19.18)]; + [bezier2Path addLineToPoint: CGPointMake(47.1, 18.49)]; + [bezier2Path addLineToPoint: CGPointMake(46.63, 17.82)]; + [bezier2Path addLineToPoint: CGPointMake(46.13, 17.19)]; + [bezier2Path addLineToPoint: CGPointMake(45.6, 16.57)]; + [bezier2Path addLineToPoint: CGPointMake(45.03, 15.98)]; + [bezier2Path addLineToPoint: CGPointMake(44.44, 15.42)]; + [bezier2Path addLineToPoint: CGPointMake(43.83, 14.88)]; + [bezier2Path addLineToPoint: CGPointMake(43.19, 14.38)]; + [bezier2Path addLineToPoint: CGPointMake(42.52, 13.9)]; + [bezier2Path addLineToPoint: CGPointMake(41.83, 13.46)]; + [bezier2Path addLineToPoint: CGPointMake(41.12, 13.05)]; + [bezier2Path addLineToPoint: CGPointMake(40.39, 12.68)]; + [bezier2Path addLineToPoint: CGPointMake(39.64, 12.34)]; + [bezier2Path addLineToPoint: CGPointMake(38.87, 12.03)]; + [bezier2Path addLineToPoint: CGPointMake(38.08, 11.76)]; + [bezier2Path addLineToPoint: CGPointMake(37.28, 11.53)]; + [bezier2Path addLineToPoint: CGPointMake(36.46, 11.34)]; + [bezier2Path addLineToPoint: CGPointMake(35.62, 11.19)]; + [bezier2Path addLineToPoint: CGPointMake(34.77, 11.09)]; + [bezier2Path addLineToPoint: CGPointMake(33.9, 11.02)]; + [bezier2Path addLineToPoint: CGPointMake(33.03, 11)]; + [bezier2Path addLineToPoint: CGPointMake(32.15, 11.02)]; + [bezier2Path addLineToPoint: CGPointMake(31.29, 11.09)]; + [bezier2Path addLineToPoint: CGPointMake(30.44, 11.19)]; + [bezier2Path addLineToPoint: CGPointMake(29.6, 11.34)]; + [bezier2Path addLineToPoint: CGPointMake(28.78, 11.53)]; + [bezier2Path addLineToPoint: CGPointMake(27.97, 11.76)]; + [bezier2Path addLineToPoint: CGPointMake(27.18, 12.03)]; + [bezier2Path addLineToPoint: CGPointMake(26.4, 12.34)]; + [bezier2Path addLineToPoint: CGPointMake(25.65, 12.68)]; + [bezier2Path addLineToPoint: CGPointMake(24.91, 13.05)]; + [bezier2Path addLineToPoint: CGPointMake(24.2, 13.46)]; + [bezier2Path addLineToPoint: CGPointMake(23.51, 13.9)]; + [bezier2Path addLineToPoint: CGPointMake(22.84, 14.38)]; + [bezier2Path addLineToPoint: CGPointMake(22.2, 14.88)]; + [bezier2Path addLineToPoint: CGPointMake(21.58, 15.42)]; + [bezier2Path addLineToPoint: CGPointMake(20.99, 15.98)]; + [bezier2Path addLineToPoint: CGPointMake(20.42, 16.57)]; + [bezier2Path addLineToPoint: CGPointMake(19.89, 17.19)]; + [bezier2Path addLineToPoint: CGPointMake(19.38, 17.82)]; + [bezier2Path addLineToPoint: CGPointMake(18.91, 18.49)]; + [bezier2Path addLineToPoint: CGPointMake(18.47, 19.18)]; + [bezier2Path addLineToPoint: CGPointMake(18.05, 19.89)]; + [bezier2Path addLineToPoint: CGPointMake(17.68, 20.62)]; + [bezier2Path addLineToPoint: CGPointMake(17.34, 21.37)]; + [bezier2Path addLineToPoint: CGPointMake(17.03, 22.14)]; + [bezier2Path addLineToPoint: CGPointMake(16.76, 22.93)]; + [bezier2Path addLineToPoint: CGPointMake(16.53, 23.74)]; + [bezier2Path addLineToPoint: CGPointMake(16.34, 24.56)]; + [bezier2Path addLineToPoint: CGPointMake(16.2, 25.39)]; + [bezier2Path addLineToPoint: CGPointMake(16.09, 26.24)]; + [bezier2Path addLineToPoint: CGPointMake(16.02, 27.1)]; + [bezier2Path addLineToPoint: CGPointMake(16, 27.97)]; + [bezier2Path addLineToPoint: CGPointMake(16.02, 28.85)]; + [bezier2Path addLineToPoint: CGPointMake(16.09, 29.71)]; + [bezier2Path addLineToPoint: CGPointMake(16.2, 30.56)]; + [bezier2Path addLineToPoint: CGPointMake(16.34, 31.4)]; + [bezier2Path addLineToPoint: CGPointMake(16.53, 32.22)]; + [bezier2Path addLineToPoint: CGPointMake(16.76, 33.03)]; + [bezier2Path addLineToPoint: CGPointMake(17.03, 33.82)]; + [bezier2Path addLineToPoint: CGPointMake(17.34, 34.6)]; + [bezier2Path addLineToPoint: CGPointMake(17.68, 35.35)]; + [bezier2Path addLineToPoint: CGPointMake(18.05, 36.09)]; + [bezier2Path addLineToPoint: CGPointMake(18.47, 36.8)]; + [bezier2Path addLineToPoint: CGPointMake(18.91, 37.49)]; + [bezier2Path addLineToPoint: CGPointMake(19.38, 38.16)]; + [bezier2Path addLineToPoint: CGPointMake(19.89, 38.8)]; + [bezier2Path addLineToPoint: CGPointMake(20.42, 39.42)]; + [bezier2Path addLineToPoint: CGPointMake(20.99, 40.01)]; + [bezier2Path addLineToPoint: CGPointMake(21.58, 40.58)]; + [bezier2Path addLineToPoint: CGPointMake(22.2, 41.11)]; + [bezier2Path addLineToPoint: CGPointMake(22.84, 41.62)]; + [bezier2Path addLineToPoint: CGPointMake(23.51, 42.09)]; + [bezier2Path addLineToPoint: CGPointMake(24.2, 42.53)]; + [bezier2Path addLineToPoint: CGPointMake(24.91, 42.95)]; + [bezier2Path addLineToPoint: CGPointMake(25.65, 43.32)]; + [bezier2Path addLineToPoint: CGPointMake(26.4, 43.66)]; + [bezier2Path addLineToPoint: CGPointMake(27.18, 43.97)]; + [bezier2Path addLineToPoint: CGPointMake(27.97, 44.24)]; + [bezier2Path addLineToPoint: CGPointMake(28.78, 44.47)]; + [bezier2Path addLineToPoint: CGPointMake(29.6, 44.66)]; + [bezier2Path addLineToPoint: CGPointMake(30.44, 44.81)]; + [bezier2Path addLineToPoint: CGPointMake(31.29, 44.91)]; + [bezier2Path addLineToPoint: CGPointMake(32.15, 44.98)]; + [bezier2Path addLineToPoint: CGPointMake(33.03, 45)]; + [bezier2Path closePath]; + bezier2Path.miterLimit = 4; + + bezier2Path.usesEvenOddFillRule = YES; + + [color2 setFill]; + [bezier2Path fill]; + + + //// Bezier 3 Drawing + UIBezierPath* bezier3Path = [UIBezierPath bezierPath]; + [bezier3Path moveToPoint: CGPointMake(41.68, 17.72)]; + [bezier3Path addLineToPoint: CGPointMake(50.65, 17.72)]; + [bezier3Path addLineToPoint: CGPointMake(50.65, 16.81)]; + [bezier3Path addLineToPoint: CGPointMake(42.46, 16.81)]; + [bezier3Path addLineToPoint: CGPointMake(41.68, 17.72)]; + [bezier3Path closePath]; + bezier3Path.miterLimit = 4; + + bezier3Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier3Path fill]; + + + //// Bezier 4 Drawing + UIBezierPath* bezier4Path = [UIBezierPath bezierPath]; + [bezier4Path moveToPoint: CGPointMake(40.34, 19.76)]; + [bezier4Path addLineToPoint: CGPointMake(50.65, 19.76)]; + [bezier4Path addLineToPoint: CGPointMake(50.65, 18.85)]; + [bezier4Path addLineToPoint: CGPointMake(40.88, 18.85)]; + [bezier4Path addLineToPoint: CGPointMake(40.34, 19.76)]; + [bezier4Path closePath]; + bezier4Path.miterLimit = 4; + + bezier4Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier4Path fill]; + + + //// Bezier 5 Drawing + UIBezierPath* bezier5Path = [UIBezierPath bezierPath]; + [bezier5Path moveToPoint: CGPointMake(39.34, 21.8)]; + [bezier5Path addLineToPoint: CGPointMake(50.65, 21.8)]; + [bezier5Path addLineToPoint: CGPointMake(50.65, 20.88)]; + [bezier5Path addLineToPoint: CGPointMake(39.73, 20.88)]; + [bezier5Path addLineToPoint: CGPointMake(39.34, 21.8)]; + [bezier5Path closePath]; + bezier5Path.miterLimit = 4; + + bezier5Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier5Path fill]; + + + //// Bezier 6 Drawing + UIBezierPath* bezier6Path = [UIBezierPath bezierPath]; + [bezier6Path moveToPoint: CGPointMake(38.65, 23.83)]; + [bezier6Path addLineToPoint: CGPointMake(50.65, 23.83)]; + [bezier6Path addLineToPoint: CGPointMake(50.65, 22.92)]; + [bezier6Path addLineToPoint: CGPointMake(38.93, 22.92)]; + [bezier6Path addLineToPoint: CGPointMake(38.65, 23.83)]; + [bezier6Path closePath]; + bezier6Path.miterLimit = 4; + + bezier6Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier6Path fill]; + + + //// Bezier 7 Drawing + UIBezierPath* bezier7Path = [UIBezierPath bezierPath]; + [bezier7Path moveToPoint: CGPointMake(39.05, 33.68)]; + [bezier7Path addLineToPoint: CGPointMake(50.68, 33.68)]; + [bezier7Path addLineToPoint: CGPointMake(50.68, 32.77)]; + [bezier7Path addLineToPoint: CGPointMake(38.76, 32.77)]; + [bezier7Path addLineToPoint: CGPointMake(39.05, 33.68)]; + [bezier7Path closePath]; + bezier7Path.miterLimit = 4; + + bezier7Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier7Path fill]; + + + //// Bezier 8 Drawing + UIBezierPath* bezier8Path = [UIBezierPath bezierPath]; + [bezier8Path moveToPoint: CGPointMake(39.9, 35.72)]; + [bezier8Path addLineToPoint: CGPointMake(50.68, 35.72)]; + [bezier8Path addLineToPoint: CGPointMake(50.68, 34.8)]; + [bezier8Path addLineToPoint: CGPointMake(39.48, 34.8)]; + [bezier8Path addLineToPoint: CGPointMake(39.9, 35.72)]; + [bezier8Path closePath]; + bezier8Path.miterLimit = 4; + + bezier8Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier8Path fill]; + + + //// Bezier 9 Drawing + UIBezierPath* bezier9Path = [UIBezierPath bezierPath]; + [bezier9Path moveToPoint: CGPointMake(41.11, 37.75)]; + [bezier9Path addLineToPoint: CGPointMake(50.68, 37.75)]; + [bezier9Path addLineToPoint: CGPointMake(50.68, 36.84)]; + [bezier9Path addLineToPoint: CGPointMake(40.54, 36.84)]; + [bezier9Path addLineToPoint: CGPointMake(41.11, 37.75)]; + [bezier9Path closePath]; + bezier9Path.miterLimit = 4; + + bezier9Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier9Path fill]; + + + //// Bezier 10 Drawing + UIBezierPath* bezier10Path = [UIBezierPath bezierPath]; + [bezier10Path moveToPoint: CGPointMake(42.77, 39.79)]; + [bezier10Path addLineToPoint: CGPointMake(50.68, 39.79)]; + [bezier10Path addLineToPoint: CGPointMake(50.68, 38.87)]; + [bezier10Path addLineToPoint: CGPointMake(41.97, 38.87)]; + [bezier10Path addLineToPoint: CGPointMake(42.77, 39.79)]; + [bezier10Path closePath]; + bezier10Path.miterLimit = 4; + + bezier10Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier10Path fill]; + + + //// Bezier 11 Drawing + UIBezierPath* bezier11Path = [UIBezierPath bezierPath]; + [bezier11Path moveToPoint: CGPointMake(38.24, 25.87)]; + [bezier11Path addLineToPoint: CGPointMake(50.65, 25.87)]; + [bezier11Path addLineToPoint: CGPointMake(50.65, 24.95)]; + [bezier11Path addLineToPoint: CGPointMake(38.42, 24.95)]; + [bezier11Path addLineToPoint: CGPointMake(38.24, 25.87)]; + [bezier11Path closePath]; + bezier11Path.miterLimit = 4; + + bezier11Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier11Path fill]; + + + //// Bezier 12 Drawing + UIBezierPath* bezier12Path = [UIBezierPath bezierPath]; + [bezier12Path moveToPoint: CGPointMake(45.8, 31.65)]; + [bezier12Path addLineToPoint: CGPointMake(50.53, 31.65)]; + [bezier12Path addLineToPoint: CGPointMake(50.53, 30.73)]; + [bezier12Path addLineToPoint: CGPointMake(45.97, 30.73)]; + [bezier12Path addLineToPoint: CGPointMake(45.8, 31.65)]; + [bezier12Path closePath]; + bezier12Path.miterLimit = 4; + + bezier12Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier12Path fill]; + + + //// Bezier 13 Drawing + UIBezierPath* bezier13Path = [UIBezierPath bezierPath]; + [bezier13Path moveToPoint: CGPointMake(46.18, 29.62)]; + [bezier13Path addLineToPoint: CGPointMake(50.53, 29.62)]; + [bezier13Path addLineToPoint: CGPointMake(50.53, 28.7)]; + [bezier13Path addLineToPoint: CGPointMake(46.35, 28.7)]; + [bezier13Path addLineToPoint: CGPointMake(46.18, 29.62)]; + [bezier13Path closePath]; + bezier13Path.miterLimit = 4; + + bezier13Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier13Path fill]; + + + //// Bezier 14 Drawing + UIBezierPath* bezier14Path = [UIBezierPath bezierPath]; + [bezier14Path moveToPoint: CGPointMake(37.93, 28.7)]; + [bezier14Path addLineToPoint: CGPointMake(39.16, 28.7)]; + [bezier14Path addLineToPoint: CGPointMake(39.16, 29.62)]; + [bezier14Path addLineToPoint: CGPointMake(37.99, 29.62)]; + [bezier14Path addLineToPoint: CGPointMake(37.93, 28.7)]; + [bezier14Path closePath]; + bezier14Path.miterLimit = 4; + + bezier14Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier14Path fill]; + + + //// Bezier 15 Drawing + UIBezierPath* bezier15Path = [UIBezierPath bezierPath]; + [bezier15Path moveToPoint: CGPointMake(35.63, 27.59)]; + [bezier15Path addLineToPoint: CGPointMake(35.55, 27.58)]; + [bezier15Path addLineToPoint: CGPointMake(35.48, 27.57)]; + [bezier15Path addLineToPoint: CGPointMake(35.4, 27.56)]; + [bezier15Path addLineToPoint: CGPointMake(35.33, 27.55)]; + [bezier15Path addLineToPoint: CGPointMake(35.26, 27.53)]; + [bezier15Path addLineToPoint: CGPointMake(35.18, 27.52)]; + [bezier15Path addLineToPoint: CGPointMake(35.11, 27.51)]; + [bezier15Path addLineToPoint: CGPointMake(35.03, 27.5)]; + [bezier15Path addLineToPoint: CGPointMake(34.95, 27.49)]; + [bezier15Path addLineToPoint: CGPointMake(34.86, 27.48)]; + [bezier15Path addLineToPoint: CGPointMake(34.76, 27.48)]; + [bezier15Path addLineToPoint: CGPointMake(34.65, 27.47)]; + [bezier15Path addLineToPoint: CGPointMake(34.53, 27.47)]; + [bezier15Path addLineToPoint: CGPointMake(34.4, 27.48)]; + [bezier15Path addLineToPoint: CGPointMake(34.25, 27.49)]; + [bezier15Path addLineToPoint: CGPointMake(34.09, 27.5)]; + [bezier15Path addLineToPoint: CGPointMake(33.97, 27.52)]; + [bezier15Path addLineToPoint: CGPointMake(33.86, 27.53)]; + [bezier15Path addLineToPoint: CGPointMake(33.77, 27.57)]; + [bezier15Path addLineToPoint: CGPointMake(33.68, 27.6)]; + [bezier15Path addLineToPoint: CGPointMake(33.6, 27.64)]; + [bezier15Path addLineToPoint: CGPointMake(33.53, 27.69)]; + [bezier15Path addLineToPoint: CGPointMake(33.47, 27.74)]; + [bezier15Path addLineToPoint: CGPointMake(33.42, 27.8)]; + [bezier15Path addLineToPoint: CGPointMake(33.39, 27.86)]; + [bezier15Path addLineToPoint: CGPointMake(33.36, 27.92)]; + [bezier15Path addLineToPoint: CGPointMake(33.35, 27.99)]; + [bezier15Path addLineToPoint: CGPointMake(33.35, 28.06)]; + [bezier15Path addLineToPoint: CGPointMake(33.36, 28.13)]; + [bezier15Path addLineToPoint: CGPointMake(33.39, 28.21)]; + [bezier15Path addLineToPoint: CGPointMake(33.43, 28.28)]; + [bezier15Path addLineToPoint: CGPointMake(33.49, 28.35)]; + [bezier15Path addLineToPoint: CGPointMake(33.6, 28.46)]; + [bezier15Path addLineToPoint: CGPointMake(33.74, 28.55)]; + [bezier15Path addLineToPoint: CGPointMake(33.9, 28.62)]; + [bezier15Path addLineToPoint: CGPointMake(34.07, 28.68)]; + [bezier15Path addLineToPoint: CGPointMake(34.25, 28.74)]; + [bezier15Path addLineToPoint: CGPointMake(34.44, 28.8)]; + [bezier15Path addLineToPoint: CGPointMake(34.63, 28.87)]; + [bezier15Path addLineToPoint: CGPointMake(34.81, 28.95)]; + [bezier15Path addLineToPoint: CGPointMake(34.98, 29.04)]; + [bezier15Path addLineToPoint: CGPointMake(35.14, 29.16)]; + [bezier15Path addLineToPoint: CGPointMake(35.28, 29.3)]; + [bezier15Path addLineToPoint: CGPointMake(35.4, 29.48)]; + [bezier15Path addLineToPoint: CGPointMake(35.49, 29.7)]; + [bezier15Path addLineToPoint: CGPointMake(35.55, 29.95)]; + [bezier15Path addLineToPoint: CGPointMake(35.57, 30.26)]; + [bezier15Path addLineToPoint: CGPointMake(35.55, 30.62)]; + [bezier15Path addLineToPoint: CGPointMake(35.51, 30.89)]; + [bezier15Path addLineToPoint: CGPointMake(35.44, 31.12)]; + [bezier15Path addLineToPoint: CGPointMake(35.35, 31.34)]; + [bezier15Path addLineToPoint: CGPointMake(35.24, 31.53)]; + [bezier15Path addLineToPoint: CGPointMake(35.11, 31.69)]; + [bezier15Path addLineToPoint: CGPointMake(34.96, 31.83)]; + [bezier15Path addLineToPoint: CGPointMake(34.8, 31.96)]; + [bezier15Path addLineToPoint: CGPointMake(34.62, 32.07)]; + [bezier15Path addLineToPoint: CGPointMake(34.44, 32.15)]; + [bezier15Path addLineToPoint: CGPointMake(34.25, 32.23)]; + [bezier15Path addLineToPoint: CGPointMake(34.06, 32.28)]; + [bezier15Path addLineToPoint: CGPointMake(33.86, 32.33)]; + [bezier15Path addLineToPoint: CGPointMake(33.66, 32.36)]; + [bezier15Path addLineToPoint: CGPointMake(33.48, 32.38)]; + [bezier15Path addLineToPoint: CGPointMake(33.29, 32.39)]; + [bezier15Path addLineToPoint: CGPointMake(33.11, 32.4)]; + [bezier15Path addLineToPoint: CGPointMake(32.87, 32.4)]; + [bezier15Path addLineToPoint: CGPointMake(32.64, 32.39)]; + [bezier15Path addLineToPoint: CGPointMake(32.44, 32.39)]; + [bezier15Path addLineToPoint: CGPointMake(32.25, 32.39)]; + [bezier15Path addLineToPoint: CGPointMake(32.08, 32.38)]; + [bezier15Path addLineToPoint: CGPointMake(31.93, 32.37)]; + [bezier15Path addLineToPoint: CGPointMake(31.79, 32.36)]; + [bezier15Path addLineToPoint: CGPointMake(31.66, 32.34)]; + [bezier15Path addLineToPoint: CGPointMake(31.54, 32.33)]; + [bezier15Path addLineToPoint: CGPointMake(31.43, 32.31)]; + [bezier15Path addLineToPoint: CGPointMake(31.32, 32.29)]; + [bezier15Path addLineToPoint: CGPointMake(31.23, 32.26)]; + [bezier15Path addLineToPoint: CGPointMake(31.13, 32.24)]; + [bezier15Path addLineToPoint: CGPointMake(30.95, 32.17)]; + [bezier15Path addLineToPoint: CGPointMake(30.85, 32.13)]; + [bezier15Path addLineToPoint: CGPointMake(31.11, 30.88)]; + [bezier15Path addLineToPoint: CGPointMake(31.16, 30.89)]; + [bezier15Path addLineToPoint: CGPointMake(31.22, 30.9)]; + [bezier15Path addLineToPoint: CGPointMake(31.3, 30.93)]; + [bezier15Path addLineToPoint: CGPointMake(31.4, 30.95)]; + [bezier15Path addLineToPoint: CGPointMake(31.5, 30.97)]; + [bezier15Path addLineToPoint: CGPointMake(31.62, 31)]; + [bezier15Path addLineToPoint: CGPointMake(31.74, 31.02)]; + [bezier15Path addLineToPoint: CGPointMake(31.88, 31.05)]; + [bezier15Path addLineToPoint: CGPointMake(32.02, 31.07)]; + [bezier15Path addLineToPoint: CGPointMake(32.17, 31.09)]; + [bezier15Path addLineToPoint: CGPointMake(32.32, 31.11)]; + [bezier15Path addLineToPoint: CGPointMake(32.48, 31.13)]; + [bezier15Path addLineToPoint: CGPointMake(32.65, 31.13)]; + [bezier15Path addLineToPoint: CGPointMake(32.81, 31.14)]; + [bezier15Path addLineToPoint: CGPointMake(32.98, 31.14)]; + [bezier15Path addLineToPoint: CGPointMake(33.14, 31.13)]; + [bezier15Path addLineToPoint: CGPointMake(33.31, 31.1)]; + [bezier15Path addLineToPoint: CGPointMake(33.44, 31.05)]; + [bezier15Path addLineToPoint: CGPointMake(33.54, 30.99)]; + [bezier15Path addLineToPoint: CGPointMake(33.62, 30.91)]; + [bezier15Path addLineToPoint: CGPointMake(33.68, 30.83)]; + [bezier15Path addLineToPoint: CGPointMake(33.72, 30.74)]; + [bezier15Path addLineToPoint: CGPointMake(33.75, 30.65)]; + [bezier15Path addLineToPoint: CGPointMake(33.77, 30.56)]; + [bezier15Path addLineToPoint: CGPointMake(33.78, 30.4)]; + [bezier15Path addLineToPoint: CGPointMake(33.73, 30.26)]; + [bezier15Path addLineToPoint: CGPointMake(33.64, 30.14)]; + [bezier15Path addLineToPoint: CGPointMake(33.49, 30.05)]; + [bezier15Path addLineToPoint: CGPointMake(33.32, 29.96)]; + [bezier15Path addLineToPoint: CGPointMake(33.12, 29.87)]; + [bezier15Path addLineToPoint: CGPointMake(32.9, 29.79)]; + [bezier15Path addLineToPoint: CGPointMake(32.68, 29.7)]; + [bezier15Path addLineToPoint: CGPointMake(32.45, 29.6)]; + [bezier15Path addLineToPoint: CGPointMake(32.24, 29.48)]; + [bezier15Path addLineToPoint: CGPointMake(32.04, 29.33)]; + [bezier15Path addLineToPoint: CGPointMake(31.85, 29.16)]; + [bezier15Path addLineToPoint: CGPointMake(31.71, 28.94)]; + [bezier15Path addLineToPoint: CGPointMake(31.61, 28.68)]; + [bezier15Path addLineToPoint: CGPointMake(31.56, 28.38)]; + [bezier15Path addLineToPoint: CGPointMake(31.56, 28.01)]; + [bezier15Path addLineToPoint: CGPointMake(31.59, 27.79)]; + [bezier15Path addLineToPoint: CGPointMake(31.63, 27.58)]; + [bezier15Path addLineToPoint: CGPointMake(31.69, 27.39)]; + [bezier15Path addLineToPoint: CGPointMake(31.76, 27.2)]; + [bezier15Path addLineToPoint: CGPointMake(31.85, 27.03)]; + [bezier15Path addLineToPoint: CGPointMake(31.95, 26.89)]; + [bezier15Path addLineToPoint: CGPointMake(32.07, 26.74)]; + [bezier15Path addLineToPoint: CGPointMake(32.21, 26.62)]; + [bezier15Path addLineToPoint: CGPointMake(32.38, 26.51)]; + [bezier15Path addLineToPoint: CGPointMake(32.56, 26.42)]; + [bezier15Path addLineToPoint: CGPointMake(32.76, 26.33)]; + [bezier15Path addLineToPoint: CGPointMake(32.99, 26.27)]; + [bezier15Path addLineToPoint: CGPointMake(33.25, 26.22)]; + [bezier15Path addLineToPoint: CGPointMake(33.53, 26.18)]; + [bezier15Path addLineToPoint: CGPointMake(33.84, 26.16)]; + [bezier15Path addLineToPoint: CGPointMake(34.17, 26.15)]; + [bezier15Path addLineToPoint: CGPointMake(34.38, 26.15)]; + [bezier15Path addLineToPoint: CGPointMake(34.58, 26.16)]; + [bezier15Path addLineToPoint: CGPointMake(34.75, 26.16)]; + [bezier15Path addLineToPoint: CGPointMake(34.91, 26.17)]; + [bezier15Path addLineToPoint: CGPointMake(35.05, 26.18)]; + [bezier15Path addLineToPoint: CGPointMake(35.18, 26.19)]; + [bezier15Path addLineToPoint: CGPointMake(35.3, 26.2)]; + [bezier15Path addLineToPoint: CGPointMake(35.4, 26.21)]; + [bezier15Path addLineToPoint: CGPointMake(35.5, 26.22)]; + [bezier15Path addLineToPoint: CGPointMake(35.58, 26.24)]; + [bezier15Path addLineToPoint: CGPointMake(35.65, 26.25)]; + [bezier15Path addLineToPoint: CGPointMake(35.72, 26.26)]; + [bezier15Path addLineToPoint: CGPointMake(35.78, 26.28)]; + [bezier15Path addLineToPoint: CGPointMake(35.83, 26.28)]; + [bezier15Path addLineToPoint: CGPointMake(35.88, 26.29)]; + [bezier15Path addLineToPoint: CGPointMake(35.92, 26.3)]; + [bezier15Path addLineToPoint: CGPointMake(35.63, 27.59)]; + [bezier15Path closePath]; + bezier15Path.miterLimit = 4; + + bezier15Path.usesEvenOddFillRule = YES; + + [color3 setFill]; + [bezier15Path fill]; + + + //// Bezier 16 Drawing + UIBezierPath* bezier16Path = [UIBezierPath bezierPath]; + [bezier16Path moveToPoint: CGPointMake(35.63, 27.59)]; + [bezier16Path addLineToPoint: CGPointMake(35.63, 27.59)]; + [bezier16Path addLineToPoint: CGPointMake(35.55, 27.58)]; + [bezier16Path addLineToPoint: CGPointMake(35.48, 27.57)]; + [bezier16Path addLineToPoint: CGPointMake(35.4, 27.56)]; + [bezier16Path addLineToPoint: CGPointMake(35.33, 27.55)]; + [bezier16Path addLineToPoint: CGPointMake(35.26, 27.53)]; + [bezier16Path addLineToPoint: CGPointMake(35.18, 27.52)]; + [bezier16Path addLineToPoint: CGPointMake(35.11, 27.51)]; + [bezier16Path addLineToPoint: CGPointMake(35.03, 27.5)]; + [bezier16Path addLineToPoint: CGPointMake(34.95, 27.49)]; + [bezier16Path addLineToPoint: CGPointMake(34.86, 27.48)]; + [bezier16Path addLineToPoint: CGPointMake(34.76, 27.48)]; + [bezier16Path addLineToPoint: CGPointMake(34.65, 27.47)]; + [bezier16Path addLineToPoint: CGPointMake(34.53, 27.47)]; + [bezier16Path addLineToPoint: CGPointMake(34.4, 27.48)]; + [bezier16Path addLineToPoint: CGPointMake(34.25, 27.49)]; + [bezier16Path addLineToPoint: CGPointMake(34.09, 27.5)]; + [bezier16Path addLineToPoint: CGPointMake(33.97, 27.52)]; + [bezier16Path addLineToPoint: CGPointMake(33.86, 27.53)]; + [bezier16Path addLineToPoint: CGPointMake(33.77, 27.57)]; + [bezier16Path addLineToPoint: CGPointMake(33.68, 27.6)]; + [bezier16Path addLineToPoint: CGPointMake(33.6, 27.64)]; + [bezier16Path addLineToPoint: CGPointMake(33.53, 27.69)]; + [bezier16Path addLineToPoint: CGPointMake(33.47, 27.74)]; + [bezier16Path addLineToPoint: CGPointMake(33.42, 27.8)]; + [bezier16Path addLineToPoint: CGPointMake(33.39, 27.86)]; + [bezier16Path addLineToPoint: CGPointMake(33.36, 27.92)]; + [bezier16Path addLineToPoint: CGPointMake(33.35, 27.99)]; + [bezier16Path addLineToPoint: CGPointMake(33.35, 28.06)]; + [bezier16Path addLineToPoint: CGPointMake(33.36, 28.13)]; + [bezier16Path addLineToPoint: CGPointMake(33.39, 28.21)]; + [bezier16Path addLineToPoint: CGPointMake(33.43, 28.28)]; + [bezier16Path addLineToPoint: CGPointMake(33.49, 28.35)]; + [bezier16Path addLineToPoint: CGPointMake(33.6, 28.46)]; + [bezier16Path addLineToPoint: CGPointMake(33.74, 28.55)]; + [bezier16Path addLineToPoint: CGPointMake(33.9, 28.62)]; + [bezier16Path addLineToPoint: CGPointMake(34.07, 28.68)]; + [bezier16Path addLineToPoint: CGPointMake(34.25, 28.74)]; + [bezier16Path addLineToPoint: CGPointMake(34.44, 28.8)]; + [bezier16Path addLineToPoint: CGPointMake(34.63, 28.87)]; + [bezier16Path addLineToPoint: CGPointMake(34.81, 28.95)]; + [bezier16Path addLineToPoint: CGPointMake(34.98, 29.04)]; + [bezier16Path addLineToPoint: CGPointMake(35.14, 29.16)]; + [bezier16Path addLineToPoint: CGPointMake(35.28, 29.3)]; + [bezier16Path addLineToPoint: CGPointMake(35.4, 29.48)]; + [bezier16Path addLineToPoint: CGPointMake(35.49, 29.7)]; + [bezier16Path addLineToPoint: CGPointMake(35.55, 29.95)]; + [bezier16Path addLineToPoint: CGPointMake(35.57, 30.26)]; + [bezier16Path addLineToPoint: CGPointMake(35.55, 30.62)]; + [bezier16Path addLineToPoint: CGPointMake(35.51, 30.89)]; + [bezier16Path addLineToPoint: CGPointMake(35.44, 31.12)]; + [bezier16Path addLineToPoint: CGPointMake(35.35, 31.34)]; + [bezier16Path addLineToPoint: CGPointMake(35.24, 31.53)]; + [bezier16Path addLineToPoint: CGPointMake(35.11, 31.69)]; + [bezier16Path addLineToPoint: CGPointMake(34.96, 31.83)]; + [bezier16Path addLineToPoint: CGPointMake(34.8, 31.96)]; + [bezier16Path addLineToPoint: CGPointMake(34.62, 32.07)]; + [bezier16Path addLineToPoint: CGPointMake(34.44, 32.15)]; + [bezier16Path addLineToPoint: CGPointMake(34.25, 32.23)]; + [bezier16Path addLineToPoint: CGPointMake(34.06, 32.28)]; + [bezier16Path addLineToPoint: CGPointMake(33.86, 32.33)]; + [bezier16Path addLineToPoint: CGPointMake(33.66, 32.36)]; + [bezier16Path addLineToPoint: CGPointMake(33.48, 32.38)]; + [bezier16Path addLineToPoint: CGPointMake(33.29, 32.39)]; + [bezier16Path addLineToPoint: CGPointMake(33.11, 32.4)]; + [bezier16Path addLineToPoint: CGPointMake(32.87, 32.4)]; + [bezier16Path addLineToPoint: CGPointMake(32.64, 32.39)]; + [bezier16Path addLineToPoint: CGPointMake(32.44, 32.39)]; + [bezier16Path addLineToPoint: CGPointMake(32.25, 32.39)]; + [bezier16Path addLineToPoint: CGPointMake(32.08, 32.38)]; + [bezier16Path addLineToPoint: CGPointMake(31.93, 32.37)]; + [bezier16Path addLineToPoint: CGPointMake(31.79, 32.36)]; + [bezier16Path addLineToPoint: CGPointMake(31.66, 32.34)]; + [bezier16Path addLineToPoint: CGPointMake(31.54, 32.33)]; + [bezier16Path addLineToPoint: CGPointMake(31.43, 32.31)]; + [bezier16Path addLineToPoint: CGPointMake(31.32, 32.29)]; + [bezier16Path addLineToPoint: CGPointMake(31.23, 32.26)]; + [bezier16Path addLineToPoint: CGPointMake(31.13, 32.24)]; + [bezier16Path addLineToPoint: CGPointMake(30.95, 32.17)]; + [bezier16Path addLineToPoint: CGPointMake(30.85, 32.13)]; + [bezier16Path addLineToPoint: CGPointMake(31.11, 30.88)]; + [bezier16Path addLineToPoint: CGPointMake(31.16, 30.89)]; + [bezier16Path addLineToPoint: CGPointMake(31.22, 30.9)]; + [bezier16Path addLineToPoint: CGPointMake(31.3, 30.93)]; + [bezier16Path addLineToPoint: CGPointMake(31.4, 30.95)]; + [bezier16Path addLineToPoint: CGPointMake(31.5, 30.97)]; + [bezier16Path addLineToPoint: CGPointMake(31.62, 31)]; + [bezier16Path addLineToPoint: CGPointMake(31.74, 31.02)]; + [bezier16Path addLineToPoint: CGPointMake(31.88, 31.05)]; + [bezier16Path addLineToPoint: CGPointMake(32.02, 31.07)]; + [bezier16Path addLineToPoint: CGPointMake(32.17, 31.09)]; + [bezier16Path addLineToPoint: CGPointMake(32.32, 31.11)]; + [bezier16Path addLineToPoint: CGPointMake(32.48, 31.13)]; + [bezier16Path addLineToPoint: CGPointMake(32.65, 31.13)]; + [bezier16Path addLineToPoint: CGPointMake(32.81, 31.14)]; + [bezier16Path addLineToPoint: CGPointMake(32.98, 31.14)]; + [bezier16Path addLineToPoint: CGPointMake(33.14, 31.13)]; + [bezier16Path addLineToPoint: CGPointMake(33.31, 31.1)]; + [bezier16Path addLineToPoint: CGPointMake(33.44, 31.05)]; + [bezier16Path addLineToPoint: CGPointMake(33.54, 30.99)]; + [bezier16Path addLineToPoint: CGPointMake(33.62, 30.91)]; + [bezier16Path addLineToPoint: CGPointMake(33.68, 30.83)]; + [bezier16Path addLineToPoint: CGPointMake(33.72, 30.74)]; + [bezier16Path addLineToPoint: CGPointMake(33.75, 30.65)]; + [bezier16Path addLineToPoint: CGPointMake(33.77, 30.56)]; + [bezier16Path addLineToPoint: CGPointMake(33.78, 30.4)]; + [bezier16Path addLineToPoint: CGPointMake(33.73, 30.26)]; + [bezier16Path addLineToPoint: CGPointMake(33.64, 30.14)]; + [bezier16Path addLineToPoint: CGPointMake(33.49, 30.05)]; + [bezier16Path addLineToPoint: CGPointMake(33.32, 29.96)]; + [bezier16Path addLineToPoint: CGPointMake(33.12, 29.87)]; + [bezier16Path addLineToPoint: CGPointMake(32.9, 29.79)]; + [bezier16Path addLineToPoint: CGPointMake(32.68, 29.7)]; + [bezier16Path addLineToPoint: CGPointMake(32.45, 29.6)]; + [bezier16Path addLineToPoint: CGPointMake(32.24, 29.48)]; + [bezier16Path addLineToPoint: CGPointMake(32.04, 29.33)]; + [bezier16Path addLineToPoint: CGPointMake(31.85, 29.16)]; + [bezier16Path addLineToPoint: CGPointMake(31.71, 28.94)]; + [bezier16Path addLineToPoint: CGPointMake(31.61, 28.68)]; + [bezier16Path addLineToPoint: CGPointMake(31.56, 28.38)]; + [bezier16Path addLineToPoint: CGPointMake(31.56, 28.01)]; + [bezier16Path addLineToPoint: CGPointMake(31.59, 27.79)]; + [bezier16Path addLineToPoint: CGPointMake(31.63, 27.58)]; + [bezier16Path addLineToPoint: CGPointMake(31.69, 27.39)]; + [bezier16Path addLineToPoint: CGPointMake(31.76, 27.2)]; + [bezier16Path addLineToPoint: CGPointMake(31.85, 27.03)]; + [bezier16Path addLineToPoint: CGPointMake(31.95, 26.89)]; + [bezier16Path addLineToPoint: CGPointMake(32.07, 26.74)]; + [bezier16Path addLineToPoint: CGPointMake(32.21, 26.62)]; + [bezier16Path addLineToPoint: CGPointMake(32.38, 26.51)]; + [bezier16Path addLineToPoint: CGPointMake(32.56, 26.42)]; + [bezier16Path addLineToPoint: CGPointMake(32.76, 26.33)]; + [bezier16Path addLineToPoint: CGPointMake(32.99, 26.27)]; + [bezier16Path addLineToPoint: CGPointMake(33.25, 26.22)]; + [bezier16Path addLineToPoint: CGPointMake(33.53, 26.18)]; + [bezier16Path addLineToPoint: CGPointMake(33.84, 26.16)]; + [bezier16Path addLineToPoint: CGPointMake(34.17, 26.15)]; + [bezier16Path addLineToPoint: CGPointMake(34.38, 26.15)]; + [bezier16Path addLineToPoint: CGPointMake(34.58, 26.16)]; + [bezier16Path addLineToPoint: CGPointMake(34.75, 26.16)]; + [bezier16Path addLineToPoint: CGPointMake(34.91, 26.17)]; + [bezier16Path addLineToPoint: CGPointMake(35.05, 26.18)]; + [bezier16Path addLineToPoint: CGPointMake(35.18, 26.19)]; + [bezier16Path addLineToPoint: CGPointMake(35.3, 26.2)]; + [bezier16Path addLineToPoint: CGPointMake(35.4, 26.21)]; + [bezier16Path addLineToPoint: CGPointMake(35.5, 26.22)]; + [bezier16Path addLineToPoint: CGPointMake(35.58, 26.24)]; + [bezier16Path addLineToPoint: CGPointMake(35.65, 26.25)]; + [bezier16Path addLineToPoint: CGPointMake(35.72, 26.26)]; + [bezier16Path addLineToPoint: CGPointMake(35.78, 26.28)]; + [bezier16Path addLineToPoint: CGPointMake(35.83, 26.28)]; + [bezier16Path addLineToPoint: CGPointMake(35.88, 26.29)]; + [bezier16Path addLineToPoint: CGPointMake(35.92, 26.3)]; + [bezier16Path addLineToPoint: CGPointMake(35.63, 27.59)]; + [bezier16Path closePath]; + bezier16Path.miterLimit = 4; + + bezier16Path.usesEvenOddFillRule = YES; + + [color3 setStroke]; + bezier16Path.lineWidth = 0.5; + [bezier16Path stroke]; + + + //// Bezier 17 Drawing + UIBezierPath* bezier17Path = [UIBezierPath bezierPath]; + [bezier17Path moveToPoint: CGPointMake(36.98, 24.89)]; + [bezier17Path addLineToPoint: CGPointMake(38.56, 24.89)]; + [bezier17Path addLineToPoint: CGPointMake(38.33, 26.27)]; + [bezier17Path addLineToPoint: CGPointMake(39.28, 26.27)]; + [bezier17Path addLineToPoint: CGPointMake(39.07, 27.56)]; + [bezier17Path addLineToPoint: CGPointMake(38.07, 27.53)]; + [bezier17Path addLineToPoint: CGPointMake(37.53, 30.71)]; + [bezier17Path addLineToPoint: CGPointMake(37.52, 30.82)]; + [bezier17Path addLineToPoint: CGPointMake(37.55, 30.92)]; + [bezier17Path addLineToPoint: CGPointMake(37.6, 30.99)]; + [bezier17Path addLineToPoint: CGPointMake(37.68, 31.05)]; + [bezier17Path addLineToPoint: CGPointMake(37.78, 31.09)]; + [bezier17Path addLineToPoint: CGPointMake(37.89, 31.13)]; + [bezier17Path addLineToPoint: CGPointMake(38.02, 31.15)]; + [bezier17Path addLineToPoint: CGPointMake(38.16, 31.16)]; + [bezier17Path addLineToPoint: CGPointMake(38.28, 31.16)]; + [bezier17Path addLineToPoint: CGPointMake(38.4, 31.14)]; + [bezier17Path addLineToPoint: CGPointMake(38.5, 31.13)]; + [bezier17Path addLineToPoint: CGPointMake(38.59, 31.1)]; + [bezier17Path addLineToPoint: CGPointMake(38.66, 31.08)]; + [bezier17Path addLineToPoint: CGPointMake(38.71, 31.06)]; + [bezier17Path addLineToPoint: CGPointMake(38.75, 31.05)]; + [bezier17Path addLineToPoint: CGPointMake(38.76, 31.05)]; + [bezier17Path addLineToPoint: CGPointMake(38.56, 32.11)]; + [bezier17Path addLineToPoint: CGPointMake(38.52, 32.13)]; + [bezier17Path addLineToPoint: CGPointMake(38.48, 32.16)]; + [bezier17Path addLineToPoint: CGPointMake(38.44, 32.18)]; + [bezier17Path addLineToPoint: CGPointMake(38.4, 32.2)]; + [bezier17Path addLineToPoint: CGPointMake(38.36, 32.22)]; + [bezier17Path addLineToPoint: CGPointMake(38.32, 32.24)]; + [bezier17Path addLineToPoint: CGPointMake(38.27, 32.25)]; + [bezier17Path addLineToPoint: CGPointMake(38.21, 32.27)]; + [bezier17Path addLineToPoint: CGPointMake(38.16, 32.29)]; + [bezier17Path addLineToPoint: CGPointMake(38.1, 32.3)]; + [bezier17Path addLineToPoint: CGPointMake(38.03, 32.31)]; + [bezier17Path addLineToPoint: CGPointMake(37.96, 32.32)]; + [bezier17Path addLineToPoint: CGPointMake(37.89, 32.33)]; + [bezier17Path addLineToPoint: CGPointMake(37.8, 32.35)]; + [bezier17Path addLineToPoint: CGPointMake(37.71, 32.36)]; + [bezier17Path addLineToPoint: CGPointMake(37.62, 32.37)]; + [bezier17Path addLineToPoint: CGPointMake(37.18, 32.37)]; + [bezier17Path addLineToPoint: CGPointMake(36.96, 32.35)]; + [bezier17Path addLineToPoint: CGPointMake(36.76, 32.33)]; + [bezier17Path addLineToPoint: CGPointMake(36.57, 32.29)]; + [bezier17Path addLineToPoint: CGPointMake(36.42, 32.25)]; + [bezier17Path addLineToPoint: CGPointMake(36.29, 32.2)]; + [bezier17Path addLineToPoint: CGPointMake(36.18, 32.15)]; + [bezier17Path addLineToPoint: CGPointMake(36.08, 32.08)]; + [bezier17Path addLineToPoint: CGPointMake(36.01, 32)]; + [bezier17Path addLineToPoint: CGPointMake(35.95, 31.92)]; + [bezier17Path addLineToPoint: CGPointMake(35.91, 31.83)]; + [bezier17Path addLineToPoint: CGPointMake(35.89, 31.73)]; + [bezier17Path addLineToPoint: CGPointMake(35.87, 31.62)]; + [bezier17Path addLineToPoint: CGPointMake(35.86, 31.5)]; + [bezier17Path addLineToPoint: CGPointMake(35.86, 31.38)]; + [bezier17Path addLineToPoint: CGPointMake(35.88, 31.25)]; + [bezier17Path addLineToPoint: CGPointMake(35.9, 31.1)]; + [bezier17Path addLineToPoint: CGPointMake(36.98, 24.89)]; + [bezier17Path closePath]; + bezier17Path.miterLimit = 4; + + bezier17Path.usesEvenOddFillRule = YES; + + [color3 setFill]; + [bezier17Path fill]; + + + //// Bezier 18 Drawing + UIBezierPath* bezier18Path = [UIBezierPath bezierPath]; + [bezier18Path moveToPoint: CGPointMake(36.98, 24.89)]; + [bezier18Path addLineToPoint: CGPointMake(38.56, 24.89)]; + [bezier18Path addLineToPoint: CGPointMake(38.33, 26.27)]; + [bezier18Path addLineToPoint: CGPointMake(39.28, 26.27)]; + [bezier18Path addLineToPoint: CGPointMake(39.07, 27.56)]; + [bezier18Path addLineToPoint: CGPointMake(38.07, 27.53)]; + [bezier18Path addLineToPoint: CGPointMake(37.53, 30.71)]; + [bezier18Path addLineToPoint: CGPointMake(37.52, 30.82)]; + [bezier18Path addLineToPoint: CGPointMake(37.55, 30.92)]; + [bezier18Path addLineToPoint: CGPointMake(37.6, 30.99)]; + [bezier18Path addLineToPoint: CGPointMake(37.68, 31.05)]; + [bezier18Path addLineToPoint: CGPointMake(37.78, 31.09)]; + [bezier18Path addLineToPoint: CGPointMake(37.89, 31.13)]; + [bezier18Path addLineToPoint: CGPointMake(38.02, 31.15)]; + [bezier18Path addLineToPoint: CGPointMake(38.16, 31.16)]; + [bezier18Path addLineToPoint: CGPointMake(38.28, 31.16)]; + [bezier18Path addLineToPoint: CGPointMake(38.4, 31.14)]; + [bezier18Path addLineToPoint: CGPointMake(38.5, 31.13)]; + [bezier18Path addLineToPoint: CGPointMake(38.59, 31.1)]; + [bezier18Path addLineToPoint: CGPointMake(38.66, 31.08)]; + [bezier18Path addLineToPoint: CGPointMake(38.71, 31.06)]; + [bezier18Path addLineToPoint: CGPointMake(38.75, 31.05)]; + [bezier18Path addLineToPoint: CGPointMake(38.76, 31.05)]; + [bezier18Path addLineToPoint: CGPointMake(38.56, 32.11)]; + [bezier18Path addLineToPoint: CGPointMake(38.52, 32.13)]; + [bezier18Path addLineToPoint: CGPointMake(38.48, 32.16)]; + [bezier18Path addLineToPoint: CGPointMake(38.44, 32.18)]; + [bezier18Path addLineToPoint: CGPointMake(38.4, 32.2)]; + [bezier18Path addLineToPoint: CGPointMake(38.36, 32.22)]; + [bezier18Path addLineToPoint: CGPointMake(38.32, 32.24)]; + [bezier18Path addLineToPoint: CGPointMake(38.27, 32.25)]; + [bezier18Path addLineToPoint: CGPointMake(38.21, 32.27)]; + [bezier18Path addLineToPoint: CGPointMake(38.16, 32.29)]; + [bezier18Path addLineToPoint: CGPointMake(38.1, 32.3)]; + [bezier18Path addLineToPoint: CGPointMake(38.03, 32.31)]; + [bezier18Path addLineToPoint: CGPointMake(37.96, 32.32)]; + [bezier18Path addLineToPoint: CGPointMake(37.89, 32.33)]; + [bezier18Path addLineToPoint: CGPointMake(37.8, 32.35)]; + [bezier18Path addLineToPoint: CGPointMake(37.71, 32.36)]; + [bezier18Path addLineToPoint: CGPointMake(37.62, 32.37)]; + [bezier18Path addLineToPoint: CGPointMake(37.18, 32.37)]; + [bezier18Path addLineToPoint: CGPointMake(36.96, 32.35)]; + [bezier18Path addLineToPoint: CGPointMake(36.76, 32.33)]; + [bezier18Path addLineToPoint: CGPointMake(36.57, 32.29)]; + [bezier18Path addLineToPoint: CGPointMake(36.42, 32.25)]; + [bezier18Path addLineToPoint: CGPointMake(36.29, 32.2)]; + [bezier18Path addLineToPoint: CGPointMake(36.18, 32.15)]; + [bezier18Path addLineToPoint: CGPointMake(36.08, 32.08)]; + [bezier18Path addLineToPoint: CGPointMake(36.01, 32)]; + [bezier18Path addLineToPoint: CGPointMake(35.95, 31.92)]; + [bezier18Path addLineToPoint: CGPointMake(35.91, 31.83)]; + [bezier18Path addLineToPoint: CGPointMake(35.89, 31.73)]; + [bezier18Path addLineToPoint: CGPointMake(35.87, 31.62)]; + [bezier18Path addLineToPoint: CGPointMake(35.86, 31.5)]; + [bezier18Path addLineToPoint: CGPointMake(35.86, 31.38)]; + [bezier18Path addLineToPoint: CGPointMake(35.88, 31.25)]; + [bezier18Path addLineToPoint: CGPointMake(35.9, 31.1)]; + [bezier18Path addLineToPoint: CGPointMake(36.98, 24.89)]; + [bezier18Path closePath]; + bezier18Path.miterLimit = 4; + + bezier18Path.usesEvenOddFillRule = YES; + + [color3 setStroke]; + bezier18Path.lineWidth = 0.5; + [bezier18Path stroke]; + + + //// Bezier 19 Drawing + UIBezierPath* bezier19Path = [UIBezierPath bezierPath]; + [bezier19Path moveToPoint: CGPointMake(40.52, 29.8)]; + [bezier19Path addLineToPoint: CGPointMake(40.51, 29.9)]; + [bezier19Path addLineToPoint: CGPointMake(40.53, 30.01)]; + [bezier19Path addLineToPoint: CGPointMake(40.55, 30.12)]; + [bezier19Path addLineToPoint: CGPointMake(40.59, 30.23)]; + [bezier19Path addLineToPoint: CGPointMake(40.63, 30.33)]; + [bezier19Path addLineToPoint: CGPointMake(40.7, 30.44)]; + [bezier19Path addLineToPoint: CGPointMake(40.76, 30.53)]; + [bezier19Path addLineToPoint: CGPointMake(40.84, 30.63)]; + [bezier19Path addLineToPoint: CGPointMake(40.93, 30.72)]; + [bezier19Path addLineToPoint: CGPointMake(41.02, 30.8)]; + [bezier19Path addLineToPoint: CGPointMake(41.12, 30.87)]; + [bezier19Path addLineToPoint: CGPointMake(41.23, 30.93)]; + [bezier19Path addLineToPoint: CGPointMake(41.34, 30.98)]; + [bezier19Path addLineToPoint: CGPointMake(41.45, 31.02)]; + [bezier19Path addLineToPoint: CGPointMake(41.57, 31.05)]; + [bezier19Path addLineToPoint: CGPointMake(41.72, 31.07)]; + [bezier19Path addLineToPoint: CGPointMake(41.86, 31.09)]; + [bezier19Path addLineToPoint: CGPointMake(42.01, 31.1)]; + [bezier19Path addLineToPoint: CGPointMake(42.15, 31.12)]; + [bezier19Path addLineToPoint: CGPointMake(42.3, 31.12)]; + [bezier19Path addLineToPoint: CGPointMake(42.46, 31.12)]; + [bezier19Path addLineToPoint: CGPointMake(42.6, 31.12)]; + [bezier19Path addLineToPoint: CGPointMake(42.76, 31.1)]; + [bezier19Path addLineToPoint: CGPointMake(42.91, 31.08)]; + [bezier19Path addLineToPoint: CGPointMake(43.06, 31.05)]; + [bezier19Path addLineToPoint: CGPointMake(43.22, 31.02)]; + [bezier19Path addLineToPoint: CGPointMake(43.38, 30.97)]; + [bezier19Path addLineToPoint: CGPointMake(43.54, 30.9)]; + [bezier19Path addLineToPoint: CGPointMake(43.7, 30.84)]; + [bezier19Path addLineToPoint: CGPointMake(43.86, 30.75)]; + [bezier19Path addLineToPoint: CGPointMake(44.03, 30.65)]; + [bezier19Path addLineToPoint: CGPointMake(43.8, 32.05)]; + [bezier19Path addLineToPoint: CGPointMake(43.71, 32.09)]; + [bezier19Path addLineToPoint: CGPointMake(43.62, 32.14)]; + [bezier19Path addLineToPoint: CGPointMake(43.53, 32.17)]; + [bezier19Path addLineToPoint: CGPointMake(43.44, 32.21)]; + [bezier19Path addLineToPoint: CGPointMake(43.36, 32.24)]; + [bezier19Path addLineToPoint: CGPointMake(43.26, 32.27)]; + [bezier19Path addLineToPoint: CGPointMake(43.17, 32.29)]; + [bezier19Path addLineToPoint: CGPointMake(43.08, 32.31)]; + [bezier19Path addLineToPoint: CGPointMake(42.97, 32.32)]; + [bezier19Path addLineToPoint: CGPointMake(42.86, 32.33)]; + [bezier19Path addLineToPoint: CGPointMake(42.74, 32.35)]; + [bezier19Path addLineToPoint: CGPointMake(42.61, 32.36)]; + [bezier19Path addLineToPoint: CGPointMake(42.46, 32.36)]; + [bezier19Path addLineToPoint: CGPointMake(42.31, 32.36)]; + [bezier19Path addLineToPoint: CGPointMake(42.13, 32.37)]; + [bezier19Path addLineToPoint: CGPointMake(41.94, 32.37)]; + [bezier19Path addLineToPoint: CGPointMake(41.66, 32.36)]; + [bezier19Path addLineToPoint: CGPointMake(41.38, 32.33)]; + [bezier19Path addLineToPoint: CGPointMake(41.09, 32.29)]; + [bezier19Path addLineToPoint: CGPointMake(40.81, 32.23)]; + [bezier19Path addLineToPoint: CGPointMake(40.53, 32.14)]; + [bezier19Path addLineToPoint: CGPointMake(40.26, 32.03)]; + [bezier19Path addLineToPoint: CGPointMake(40.01, 31.89)]; + [bezier19Path addLineToPoint: CGPointMake(39.77, 31.72)]; + [bezier19Path addLineToPoint: CGPointMake(39.55, 31.53)]; + [bezier19Path addLineToPoint: CGPointMake(39.35, 31.3)]; + [bezier19Path addLineToPoint: CGPointMake(39.19, 31.04)]; + [bezier19Path addLineToPoint: CGPointMake(39.05, 30.73)]; + [bezier19Path addLineToPoint: CGPointMake(38.95, 30.4)]; + [bezier19Path addLineToPoint: CGPointMake(38.89, 30.02)]; + [bezier19Path addLineToPoint: CGPointMake(38.87, 29.6)]; + [bezier19Path addLineToPoint: CGPointMake(38.9, 29.13)]; + [bezier19Path addLineToPoint: CGPointMake(38.93, 28.95)]; + [bezier19Path addLineToPoint: CGPointMake(38.96, 28.74)]; + [bezier19Path addLineToPoint: CGPointMake(39.01, 28.51)]; + [bezier19Path addLineToPoint: CGPointMake(39.07, 28.27)]; + [bezier19Path addLineToPoint: CGPointMake(39.15, 28.03)]; + [bezier19Path addLineToPoint: CGPointMake(39.26, 27.78)]; + [bezier19Path addLineToPoint: CGPointMake(39.39, 27.53)]; + [bezier19Path addLineToPoint: CGPointMake(39.55, 27.3)]; + [bezier19Path addLineToPoint: CGPointMake(39.73, 27.07)]; + [bezier19Path addLineToPoint: CGPointMake(39.95, 26.85)]; + [bezier19Path addLineToPoint: CGPointMake(40.2, 26.66)]; + [bezier19Path addLineToPoint: CGPointMake(40.49, 26.49)]; + [bezier19Path addLineToPoint: CGPointMake(40.82, 26.34)]; + [bezier19Path addLineToPoint: CGPointMake(41.19, 26.24)]; + [bezier19Path addLineToPoint: CGPointMake(41.6, 26.17)]; + [bezier19Path addLineToPoint: CGPointMake(42.06, 26.15)]; + [bezier19Path addLineToPoint: CGPointMake(42.28, 26.16)]; + [bezier19Path addLineToPoint: CGPointMake(42.51, 26.18)]; + [bezier19Path addLineToPoint: CGPointMake(42.75, 26.22)]; + [bezier19Path addLineToPoint: CGPointMake(42.98, 26.28)]; + [bezier19Path addLineToPoint: CGPointMake(43.21, 26.36)]; + [bezier19Path addLineToPoint: CGPointMake(43.43, 26.46)]; + [bezier19Path addLineToPoint: CGPointMake(43.63, 26.6)]; + [bezier19Path addLineToPoint: CGPointMake(43.82, 26.76)]; + [bezier19Path addLineToPoint: CGPointMake(43.99, 26.95)]; + [bezier19Path addLineToPoint: CGPointMake(44.13, 27.18)]; + [bezier19Path addLineToPoint: CGPointMake(44.25, 27.44)]; + [bezier19Path addLineToPoint: CGPointMake(44.33, 27.74)]; + [bezier19Path addLineToPoint: CGPointMake(44.37, 28.09)]; + [bezier19Path addLineToPoint: CGPointMake(44.38, 28.47)]; + [bezier19Path addLineToPoint: CGPointMake(44.34, 28.91)]; + [bezier19Path addLineToPoint: CGPointMake(44.25, 29.38)]; + [bezier19Path addLineToPoint: CGPointMake(44.23, 29.73)]; + [bezier19Path addLineToPoint: CGPointMake(40.08, 29.73)]; + [bezier19Path addLineToPoint: CGPointMake(40.34, 28.61)]; + [bezier19Path addLineToPoint: CGPointMake(42.83, 28.61)]; + [bezier19Path addLineToPoint: CGPointMake(42.84, 28.47)]; + [bezier19Path addLineToPoint: CGPointMake(42.84, 28.33)]; + [bezier19Path addLineToPoint: CGPointMake(42.83, 28.21)]; + [bezier19Path addLineToPoint: CGPointMake(42.8, 28.09)]; + [bezier19Path addLineToPoint: CGPointMake(42.76, 27.98)]; + [bezier19Path addLineToPoint: CGPointMake(42.72, 27.89)]; + [bezier19Path addLineToPoint: CGPointMake(42.67, 27.8)]; + [bezier19Path addLineToPoint: CGPointMake(42.61, 27.72)]; + [bezier19Path addLineToPoint: CGPointMake(42.54, 27.65)]; + [bezier19Path addLineToPoint: CGPointMake(42.47, 27.6)]; + [bezier19Path addLineToPoint: CGPointMake(42.38, 27.55)]; + [bezier19Path addLineToPoint: CGPointMake(42.3, 27.5)]; + [bezier19Path addLineToPoint: CGPointMake(42.2, 27.47)]; + [bezier19Path addLineToPoint: CGPointMake(42.11, 27.44)]; + [bezier19Path addLineToPoint: CGPointMake(42.02, 27.43)]; + [bezier19Path addLineToPoint: CGPointMake(41.91, 27.41)]; + [bezier19Path addLineToPoint: CGPointMake(41.81, 27.42)]; + [bezier19Path addLineToPoint: CGPointMake(41.7, 27.44)]; + [bezier19Path addLineToPoint: CGPointMake(41.61, 27.46)]; + [bezier19Path addLineToPoint: CGPointMake(41.51, 27.49)]; + [bezier19Path addLineToPoint: CGPointMake(41.41, 27.54)]; + [bezier19Path addLineToPoint: CGPointMake(41.33, 27.59)]; + [bezier19Path addLineToPoint: CGPointMake(41.24, 27.65)]; + [bezier19Path addLineToPoint: CGPointMake(41.17, 27.72)]; + [bezier19Path addLineToPoint: CGPointMake(41.09, 27.8)]; + [bezier19Path addLineToPoint: CGPointMake(41.03, 27.89)]; + [bezier19Path addLineToPoint: CGPointMake(40.96, 27.98)]; + [bezier19Path addLineToPoint: CGPointMake(40.91, 28.08)]; + [bezier19Path addLineToPoint: CGPointMake(40.86, 28.18)]; + [bezier19Path addLineToPoint: CGPointMake(40.82, 28.29)]; + [bezier19Path addLineToPoint: CGPointMake(40.79, 28.41)]; + [bezier19Path addLineToPoint: CGPointMake(40.76, 28.52)]; + [bezier19Path addLineToPoint: CGPointMake(40.54, 29.7)]; + [bezier19Path addLineToPoint: CGPointMake(40.52, 29.8)]; + [bezier19Path closePath]; + bezier19Path.miterLimit = 4; + + bezier19Path.usesEvenOddFillRule = YES; + + [color3 setFill]; + [bezier19Path fill]; + + + //// Bezier 20 Drawing + UIBezierPath* bezier20Path = [UIBezierPath bezierPath]; + [bezier20Path moveToPoint: CGPointMake(40.63, 28.52)]; + [bezier20Path addLineToPoint: CGPointMake(40.54, 29.7)]; + [bezier20Path addLineToPoint: CGPointMake(40.52, 29.8)]; + [bezier20Path addLineToPoint: CGPointMake(40.51, 29.9)]; + [bezier20Path addLineToPoint: CGPointMake(40.53, 30.01)]; + [bezier20Path addLineToPoint: CGPointMake(40.55, 30.12)]; + [bezier20Path addLineToPoint: CGPointMake(40.59, 30.23)]; + [bezier20Path addLineToPoint: CGPointMake(40.63, 30.33)]; + [bezier20Path addLineToPoint: CGPointMake(40.7, 30.44)]; + [bezier20Path addLineToPoint: CGPointMake(40.76, 30.53)]; + [bezier20Path addLineToPoint: CGPointMake(40.84, 30.63)]; + [bezier20Path addLineToPoint: CGPointMake(40.93, 30.72)]; + [bezier20Path addLineToPoint: CGPointMake(41.02, 30.8)]; + [bezier20Path addLineToPoint: CGPointMake(41.12, 30.87)]; + [bezier20Path addLineToPoint: CGPointMake(41.23, 30.93)]; + [bezier20Path addLineToPoint: CGPointMake(41.34, 30.98)]; + [bezier20Path addLineToPoint: CGPointMake(41.45, 31.02)]; + [bezier20Path addLineToPoint: CGPointMake(41.57, 31.05)]; + [bezier20Path addLineToPoint: CGPointMake(41.72, 31.07)]; + [bezier20Path addLineToPoint: CGPointMake(41.86, 31.09)]; + [bezier20Path addLineToPoint: CGPointMake(42.01, 31.1)]; + [bezier20Path addLineToPoint: CGPointMake(42.15, 31.12)]; + [bezier20Path addLineToPoint: CGPointMake(42.3, 31.12)]; + [bezier20Path addLineToPoint: CGPointMake(42.46, 31.12)]; + [bezier20Path addLineToPoint: CGPointMake(42.6, 31.12)]; + [bezier20Path addLineToPoint: CGPointMake(42.76, 31.1)]; + [bezier20Path addLineToPoint: CGPointMake(42.91, 31.08)]; + [bezier20Path addLineToPoint: CGPointMake(43.06, 31.05)]; + [bezier20Path addLineToPoint: CGPointMake(43.22, 31.02)]; + [bezier20Path addLineToPoint: CGPointMake(43.38, 30.97)]; + [bezier20Path addLineToPoint: CGPointMake(43.54, 30.9)]; + [bezier20Path addLineToPoint: CGPointMake(43.7, 30.84)]; + [bezier20Path addLineToPoint: CGPointMake(43.86, 30.75)]; + [bezier20Path addLineToPoint: CGPointMake(44.03, 30.65)]; + [bezier20Path addLineToPoint: CGPointMake(43.8, 32.05)]; + [bezier20Path addLineToPoint: CGPointMake(43.71, 32.09)]; + [bezier20Path addLineToPoint: CGPointMake(43.62, 32.14)]; + [bezier20Path addLineToPoint: CGPointMake(43.53, 32.17)]; + [bezier20Path addLineToPoint: CGPointMake(43.44, 32.21)]; + [bezier20Path addLineToPoint: CGPointMake(43.36, 32.24)]; + [bezier20Path addLineToPoint: CGPointMake(43.26, 32.27)]; + [bezier20Path addLineToPoint: CGPointMake(43.17, 32.29)]; + [bezier20Path addLineToPoint: CGPointMake(43.08, 32.31)]; + [bezier20Path addLineToPoint: CGPointMake(42.97, 32.32)]; + [bezier20Path addLineToPoint: CGPointMake(42.86, 32.33)]; + [bezier20Path addLineToPoint: CGPointMake(42.74, 32.35)]; + [bezier20Path addLineToPoint: CGPointMake(42.61, 32.36)]; + [bezier20Path addLineToPoint: CGPointMake(42.46, 32.36)]; + [bezier20Path addLineToPoint: CGPointMake(42.31, 32.36)]; + [bezier20Path addLineToPoint: CGPointMake(42.13, 32.37)]; + [bezier20Path addLineToPoint: CGPointMake(41.94, 32.37)]; + [bezier20Path addLineToPoint: CGPointMake(41.66, 32.36)]; + [bezier20Path addLineToPoint: CGPointMake(41.38, 32.33)]; + [bezier20Path addLineToPoint: CGPointMake(41.09, 32.29)]; + [bezier20Path addLineToPoint: CGPointMake(40.81, 32.23)]; + [bezier20Path addLineToPoint: CGPointMake(40.53, 32.14)]; + [bezier20Path addLineToPoint: CGPointMake(40.26, 32.03)]; + [bezier20Path addLineToPoint: CGPointMake(40.01, 31.89)]; + [bezier20Path addLineToPoint: CGPointMake(39.77, 31.72)]; + [bezier20Path addLineToPoint: CGPointMake(39.55, 31.53)]; + [bezier20Path addLineToPoint: CGPointMake(39.35, 31.3)]; + [bezier20Path addLineToPoint: CGPointMake(39.19, 31.04)]; + [bezier20Path addLineToPoint: CGPointMake(39.05, 30.73)]; + [bezier20Path addLineToPoint: CGPointMake(38.95, 30.4)]; + [bezier20Path addLineToPoint: CGPointMake(38.89, 30.02)]; + [bezier20Path addLineToPoint: CGPointMake(38.87, 29.6)]; + [bezier20Path addLineToPoint: CGPointMake(38.9, 29.13)]; + [bezier20Path addLineToPoint: CGPointMake(38.93, 28.95)]; + [bezier20Path addLineToPoint: CGPointMake(38.96, 28.74)]; + [bezier20Path addLineToPoint: CGPointMake(39.01, 28.51)]; + [bezier20Path addLineToPoint: CGPointMake(39.07, 28.27)]; + [bezier20Path addLineToPoint: CGPointMake(39.15, 28.03)]; + [bezier20Path addLineToPoint: CGPointMake(39.26, 27.78)]; + [bezier20Path addLineToPoint: CGPointMake(39.39, 27.53)]; + [bezier20Path addLineToPoint: CGPointMake(39.55, 27.3)]; + [bezier20Path addLineToPoint: CGPointMake(39.73, 27.07)]; + [bezier20Path addLineToPoint: CGPointMake(39.95, 26.85)]; + [bezier20Path addLineToPoint: CGPointMake(40.2, 26.66)]; + [bezier20Path addLineToPoint: CGPointMake(40.49, 26.49)]; + [bezier20Path addLineToPoint: CGPointMake(40.82, 26.34)]; + [bezier20Path addLineToPoint: CGPointMake(41.19, 26.24)]; + [bezier20Path addLineToPoint: CGPointMake(41.6, 26.17)]; + [bezier20Path addLineToPoint: CGPointMake(42.06, 26.15)]; + [bezier20Path addLineToPoint: CGPointMake(42.28, 26.16)]; + [bezier20Path addLineToPoint: CGPointMake(42.51, 26.18)]; + [bezier20Path addLineToPoint: CGPointMake(42.75, 26.22)]; + [bezier20Path addLineToPoint: CGPointMake(42.98, 26.28)]; + [bezier20Path addLineToPoint: CGPointMake(43.21, 26.36)]; + [bezier20Path addLineToPoint: CGPointMake(43.43, 26.46)]; + [bezier20Path addLineToPoint: CGPointMake(43.63, 26.6)]; + [bezier20Path addLineToPoint: CGPointMake(43.82, 26.76)]; + [bezier20Path addLineToPoint: CGPointMake(43.99, 26.95)]; + [bezier20Path addLineToPoint: CGPointMake(44.13, 27.18)]; + [bezier20Path addLineToPoint: CGPointMake(44.25, 27.44)]; + [bezier20Path addLineToPoint: CGPointMake(44.33, 27.74)]; + [bezier20Path addLineToPoint: CGPointMake(44.37, 28.09)]; + [bezier20Path addLineToPoint: CGPointMake(44.38, 28.47)]; + [bezier20Path addLineToPoint: CGPointMake(44.34, 28.91)]; + [bezier20Path addLineToPoint: CGPointMake(44.25, 29.38)]; + [bezier20Path addLineToPoint: CGPointMake(44.23, 29.73)]; + [bezier20Path addLineToPoint: CGPointMake(40.14, 29.7)]; + [bezier20Path addLineToPoint: CGPointMake(40.34, 28.61)]; + [bezier20Path addLineToPoint: CGPointMake(42.83, 28.61)]; + [bezier20Path addLineToPoint: CGPointMake(42.84, 28.47)]; + [bezier20Path addLineToPoint: CGPointMake(42.84, 28.33)]; + [bezier20Path addLineToPoint: CGPointMake(42.83, 28.21)]; + [bezier20Path addLineToPoint: CGPointMake(42.8, 28.09)]; + [bezier20Path addLineToPoint: CGPointMake(42.76, 27.98)]; + [bezier20Path addLineToPoint: CGPointMake(42.72, 27.89)]; + [bezier20Path addLineToPoint: CGPointMake(42.67, 27.8)]; + [bezier20Path addLineToPoint: CGPointMake(42.61, 27.72)]; + [bezier20Path addLineToPoint: CGPointMake(42.54, 27.65)]; + [bezier20Path addLineToPoint: CGPointMake(42.47, 27.6)]; + [bezier20Path addLineToPoint: CGPointMake(42.38, 27.55)]; + [bezier20Path addLineToPoint: CGPointMake(42.3, 27.5)]; + [bezier20Path addLineToPoint: CGPointMake(42.2, 27.47)]; + [bezier20Path addLineToPoint: CGPointMake(42.11, 27.44)]; + [bezier20Path addLineToPoint: CGPointMake(42.02, 27.43)]; + [bezier20Path addLineToPoint: CGPointMake(41.91, 27.41)]; + [bezier20Path addLineToPoint: CGPointMake(41.81, 27.42)]; + [bezier20Path addLineToPoint: CGPointMake(41.7, 27.44)]; + [bezier20Path addLineToPoint: CGPointMake(41.61, 27.46)]; + [bezier20Path addLineToPoint: CGPointMake(41.51, 27.49)]; + [bezier20Path addLineToPoint: CGPointMake(41.41, 27.54)]; + [bezier20Path addLineToPoint: CGPointMake(41.33, 27.59)]; + [bezier20Path addLineToPoint: CGPointMake(41.24, 27.65)]; + [bezier20Path addLineToPoint: CGPointMake(41.17, 27.72)]; + [bezier20Path addLineToPoint: CGPointMake(41.09, 27.8)]; + [bezier20Path addLineToPoint: CGPointMake(41.03, 27.89)]; + [bezier20Path addLineToPoint: CGPointMake(40.96, 27.98)]; + [bezier20Path addLineToPoint: CGPointMake(40.91, 28.08)]; + [bezier20Path addLineToPoint: CGPointMake(40.86, 28.18)]; + [bezier20Path addLineToPoint: CGPointMake(40.82, 28.29)]; + [bezier20Path addLineToPoint: CGPointMake(40.79, 28.41)]; + [bezier20Path addLineToPoint: CGPointMake(40.76, 28.52)]; + [bezier20Path addLineToPoint: CGPointMake(40.54, 29.7)]; + bezier20Path.miterLimit = 4; + + bezier20Path.usesEvenOddFillRule = YES; + + [color3 setStroke]; + bezier20Path.lineWidth = 0.5; + [bezier20Path stroke]; + + + //// Bezier 21 Drawing + UIBezierPath* bezier21Path = [UIBezierPath bezierPath]; + [bezier21Path moveToPoint: CGPointMake(39.5, 28.5)]; + [bezier21Path addLineToPoint: CGPointMake(39.5, 30.5)]; + [bezier21Path addLineToPoint: CGPointMake(40.5, 30.5)]; + [bezier21Path addLineToPoint: CGPointMake(40.62, 28.5)]; + [bezier21Path addLineToPoint: CGPointMake(39.5, 28.5)]; + [bezier21Path closePath]; + bezier21Path.miterLimit = 4; + + bezier21Path.usesEvenOddFillRule = YES; + + [color3 setFill]; + [bezier21Path fill]; + + + //// Bezier 22 Drawing + UIBezierPath* bezier22Path = [UIBezierPath bezierPath]; + [bezier22Path moveToPoint: CGPointMake(54.12, 26.61)]; + [bezier22Path addLineToPoint: CGPointMake(54.04, 26.57)]; + [bezier22Path addLineToPoint: CGPointMake(53.97, 26.54)]; + [bezier22Path addLineToPoint: CGPointMake(53.89, 26.5)]; + [bezier22Path addLineToPoint: CGPointMake(53.8, 26.46)]; + [bezier22Path addLineToPoint: CGPointMake(53.72, 26.42)]; + [bezier22Path addLineToPoint: CGPointMake(53.52, 26.36)]; + [bezier22Path addLineToPoint: CGPointMake(53.42, 26.32)]; + [bezier22Path addLineToPoint: CGPointMake(53.31, 26.29)]; + [bezier22Path addLineToPoint: CGPointMake(53.2, 26.27)]; + [bezier22Path addLineToPoint: CGPointMake(53.09, 26.25)]; + [bezier22Path addLineToPoint: CGPointMake(52.97, 26.23)]; + [bezier22Path addLineToPoint: CGPointMake(52.83, 26.22)]; + [bezier22Path addLineToPoint: CGPointMake(52.7, 26.21)]; + [bezier22Path addLineToPoint: CGPointMake(52.28, 26.21)]; + [bezier22Path addLineToPoint: CGPointMake(52.13, 26.22)]; + [bezier22Path addLineToPoint: CGPointMake(51.98, 26.24)]; + [bezier22Path addLineToPoint: CGPointMake(51.82, 26.26)]; + [bezier22Path addLineToPoint: CGPointMake(51.66, 26.31)]; + [bezier22Path addLineToPoint: CGPointMake(51.5, 26.37)]; + [bezier22Path addLineToPoint: CGPointMake(51.34, 26.45)]; + [bezier22Path addLineToPoint: CGPointMake(51.18, 26.55)]; + [bezier22Path addLineToPoint: CGPointMake(51.03, 26.68)]; + [bezier22Path addLineToPoint: CGPointMake(50.88, 26.83)]; + [bezier22Path addLineToPoint: CGPointMake(50.74, 27.01)]; + [bezier22Path addLineToPoint: CGPointMake(50.6, 27.22)]; + [bezier22Path addLineToPoint: CGPointMake(50.48, 27.47)]; + [bezier22Path addLineToPoint: CGPointMake(50.36, 27.76)]; + [bezier22Path addLineToPoint: CGPointMake(50.25, 28.08)]; + [bezier22Path addLineToPoint: CGPointMake(50.16, 28.44)]; + [bezier22Path addLineToPoint: CGPointMake(50.12, 28.64)]; + [bezier22Path addLineToPoint: CGPointMake(50.1, 28.84)]; + [bezier22Path addLineToPoint: CGPointMake(50.09, 29.04)]; + [bezier22Path addLineToPoint: CGPointMake(50.1, 29.24)]; + [bezier22Path addLineToPoint: CGPointMake(50.11, 29.43)]; + [bezier22Path addLineToPoint: CGPointMake(50.15, 29.61)]; + [bezier22Path addLineToPoint: CGPointMake(50.2, 29.78)]; + [bezier22Path addLineToPoint: CGPointMake(50.27, 29.95)]; + [bezier22Path addLineToPoint: CGPointMake(50.35, 30.11)]; + [bezier22Path addLineToPoint: CGPointMake(50.45, 30.26)]; + [bezier22Path addLineToPoint: CGPointMake(50.57, 30.39)]; + [bezier22Path addLineToPoint: CGPointMake(50.71, 30.51)]; + [bezier22Path addLineToPoint: CGPointMake(50.86, 30.61)]; + [bezier22Path addLineToPoint: CGPointMake(51.04, 30.69)]; + [bezier22Path addLineToPoint: CGPointMake(51.24, 30.77)]; + [bezier22Path addLineToPoint: CGPointMake(51.45, 30.82)]; + [bezier22Path addLineToPoint: CGPointMake(51.53, 30.84)]; + [bezier22Path addLineToPoint: CGPointMake(51.61, 30.85)]; + [bezier22Path addLineToPoint: CGPointMake(51.71, 30.87)]; + [bezier22Path addLineToPoint: CGPointMake(51.83, 30.88)]; + [bezier22Path addLineToPoint: CGPointMake(51.95, 30.89)]; + [bezier22Path addLineToPoint: CGPointMake(52.23, 30.89)]; + [bezier22Path addLineToPoint: CGPointMake(52.37, 30.88)]; + [bezier22Path addLineToPoint: CGPointMake(52.52, 30.86)]; + [bezier22Path addLineToPoint: CGPointMake(52.66, 30.83)]; + [bezier22Path addLineToPoint: CGPointMake(52.81, 30.79)]; + [bezier22Path addLineToPoint: CGPointMake(52.95, 30.75)]; + [bezier22Path addLineToPoint: CGPointMake(53.09, 30.68)]; + [bezier22Path addLineToPoint: CGPointMake(53.22, 30.61)]; + [bezier22Path addLineToPoint: CGPointMake(53.34, 30.52)]; + [bezier22Path addLineToPoint: CGPointMake(53.46, 30.42)]; + [bezier22Path addLineToPoint: CGPointMake(53.2, 31.94)]; + [bezier22Path addLineToPoint: CGPointMake(53.17, 31.96)]; + [bezier22Path addLineToPoint: CGPointMake(53.13, 32)]; + [bezier22Path addLineToPoint: CGPointMake(53.09, 32.04)]; + [bezier22Path addLineToPoint: CGPointMake(53.03, 32.07)]; + [bezier22Path addLineToPoint: CGPointMake(52.97, 32.12)]; + [bezier22Path addLineToPoint: CGPointMake(52.89, 32.16)]; + [bezier22Path addLineToPoint: CGPointMake(52.8, 32.2)]; + [bezier22Path addLineToPoint: CGPointMake(52.7, 32.23)]; + [bezier22Path addLineToPoint: CGPointMake(52.57, 32.27)]; + [bezier22Path addLineToPoint: CGPointMake(52.42, 32.3)]; + [bezier22Path addLineToPoint: CGPointMake(52.25, 32.32)]; + [bezier22Path addLineToPoint: CGPointMake(52.05, 32.35)]; + [bezier22Path addLineToPoint: CGPointMake(51.83, 32.36)]; + [bezier22Path addLineToPoint: CGPointMake(51.57, 32.36)]; + [bezier22Path addLineToPoint: CGPointMake(51.28, 32.36)]; + [bezier22Path addLineToPoint: CGPointMake(50.96, 32.34)]; + [bezier22Path addLineToPoint: CGPointMake(50.7, 32.31)]; + [bezier22Path addLineToPoint: CGPointMake(50.44, 32.25)]; + [bezier22Path addLineToPoint: CGPointMake(50.18, 32.17)]; + [bezier22Path addLineToPoint: CGPointMake(49.91, 32.05)]; + [bezier22Path addLineToPoint: CGPointMake(49.66, 31.92)]; + [bezier22Path addLineToPoint: CGPointMake(49.42, 31.75)]; + [bezier22Path addLineToPoint: CGPointMake(49.2, 31.55)]; + [bezier22Path addLineToPoint: CGPointMake(48.99, 31.32)]; + [bezier22Path addLineToPoint: CGPointMake(48.8, 31.06)]; + [bezier22Path addLineToPoint: CGPointMake(48.64, 30.78)]; + [bezier22Path addLineToPoint: CGPointMake(48.5, 30.46)]; + [bezier22Path addLineToPoint: CGPointMake(48.4, 30.11)]; + [bezier22Path addLineToPoint: CGPointMake(48.33, 29.73)]; + [bezier22Path addLineToPoint: CGPointMake(48.31, 29.33)]; + [bezier22Path addLineToPoint: CGPointMake(48.32, 28.88)]; + [bezier22Path addLineToPoint: CGPointMake(48.38, 28.41)]; + [bezier22Path addLineToPoint: CGPointMake(48.43, 28.18)]; + [bezier22Path addLineToPoint: CGPointMake(48.48, 27.95)]; + [bezier22Path addLineToPoint: CGPointMake(48.54, 27.73)]; + [bezier22Path addLineToPoint: CGPointMake(48.59, 27.52)]; + [bezier22Path addLineToPoint: CGPointMake(48.66, 27.32)]; + [bezier22Path addLineToPoint: CGPointMake(48.73, 27.12)]; + [bezier22Path addLineToPoint: CGPointMake(48.8, 26.93)]; + [bezier22Path addLineToPoint: CGPointMake(48.88, 26.75)]; + [bezier22Path addLineToPoint: CGPointMake(48.97, 26.58)]; + [bezier22Path addLineToPoint: CGPointMake(49.05, 26.41)]; + [bezier22Path addLineToPoint: CGPointMake(49.15, 26.25)]; + [bezier22Path addLineToPoint: CGPointMake(49.25, 26.11)]; + [bezier22Path addLineToPoint: CGPointMake(49.36, 25.96)]; + [bezier22Path addLineToPoint: CGPointMake(49.47, 25.83)]; + [bezier22Path addLineToPoint: CGPointMake(49.58, 25.7)]; + [bezier22Path addLineToPoint: CGPointMake(49.7, 25.58)]; + [bezier22Path addLineToPoint: CGPointMake(49.83, 25.47)]; + [bezier22Path addLineToPoint: CGPointMake(49.97, 25.36)]; + [bezier22Path addLineToPoint: CGPointMake(50.1, 25.26)]; + [bezier22Path addLineToPoint: CGPointMake(50.24, 25.17)]; + [bezier22Path addLineToPoint: CGPointMake(50.4, 25.09)]; + [bezier22Path addLineToPoint: CGPointMake(50.55, 25.01)]; + [bezier22Path addLineToPoint: CGPointMake(50.71, 24.94)]; + [bezier22Path addLineToPoint: CGPointMake(50.88, 24.88)]; + [bezier22Path addLineToPoint: CGPointMake(51.05, 24.82)]; + [bezier22Path addLineToPoint: CGPointMake(51.23, 24.78)]; + [bezier22Path addLineToPoint: CGPointMake(51.41, 24.74)]; + [bezier22Path addLineToPoint: CGPointMake(51.61, 24.7)]; + [bezier22Path addLineToPoint: CGPointMake(51.8, 24.68)]; + [bezier22Path addLineToPoint: CGPointMake(52, 24.65)]; + [bezier22Path addLineToPoint: CGPointMake(52.21, 24.64)]; + [bezier22Path addLineToPoint: CGPointMake(52.43, 24.64)]; + [bezier22Path addLineToPoint: CGPointMake(52.61, 24.64)]; + [bezier22Path addLineToPoint: CGPointMake(52.78, 24.65)]; + [bezier22Path addLineToPoint: CGPointMake(52.95, 24.67)]; + [bezier22Path addLineToPoint: CGPointMake(53.13, 24.69)]; + [bezier22Path addLineToPoint: CGPointMake(53.28, 24.72)]; + [bezier22Path addLineToPoint: CGPointMake(53.44, 24.75)]; + [bezier22Path addLineToPoint: CGPointMake(53.59, 24.78)]; + [bezier22Path addLineToPoint: CGPointMake(53.72, 24.81)]; + [bezier22Path addLineToPoint: CGPointMake(53.85, 24.85)]; + [bezier22Path addLineToPoint: CGPointMake(53.97, 24.88)]; + [bezier22Path addLineToPoint: CGPointMake(54.08, 24.92)]; + [bezier22Path addLineToPoint: CGPointMake(54.17, 24.95)]; + [bezier22Path addLineToPoint: CGPointMake(54.25, 24.98)]; + [bezier22Path addLineToPoint: CGPointMake(54.31, 25)]; + [bezier22Path addLineToPoint: CGPointMake(54.37, 25.02)]; + [bezier22Path addLineToPoint: CGPointMake(54.4, 25.03)]; + [bezier22Path addLineToPoint: CGPointMake(54.12, 26.61)]; + [bezier22Path closePath]; + bezier22Path.miterLimit = 4; + + bezier22Path.usesEvenOddFillRule = YES; + + [color3 setFill]; + [bezier22Path fill]; + + + //// Bezier 23 Drawing + UIBezierPath* bezier23Path = [UIBezierPath bezierPath]; + [bezier23Path moveToPoint: CGPointMake(54.12, 26.61)]; + [bezier23Path addLineToPoint: CGPointMake(54.12, 26.61)]; + [bezier23Path addLineToPoint: CGPointMake(54.04, 26.57)]; + [bezier23Path addLineToPoint: CGPointMake(53.97, 26.54)]; + [bezier23Path addLineToPoint: CGPointMake(53.89, 26.5)]; + [bezier23Path addLineToPoint: CGPointMake(53.8, 26.46)]; + [bezier23Path addLineToPoint: CGPointMake(53.72, 26.42)]; + [bezier23Path addLineToPoint: CGPointMake(53.52, 26.36)]; + [bezier23Path addLineToPoint: CGPointMake(53.42, 26.32)]; + [bezier23Path addLineToPoint: CGPointMake(53.31, 26.29)]; + [bezier23Path addLineToPoint: CGPointMake(53.2, 26.27)]; + [bezier23Path addLineToPoint: CGPointMake(53.09, 26.25)]; + [bezier23Path addLineToPoint: CGPointMake(52.97, 26.23)]; + [bezier23Path addLineToPoint: CGPointMake(52.83, 26.22)]; + [bezier23Path addLineToPoint: CGPointMake(52.7, 26.21)]; + [bezier23Path addLineToPoint: CGPointMake(52.28, 26.21)]; + [bezier23Path addLineToPoint: CGPointMake(52.13, 26.22)]; + [bezier23Path addLineToPoint: CGPointMake(51.98, 26.24)]; + [bezier23Path addLineToPoint: CGPointMake(51.82, 26.26)]; + [bezier23Path addLineToPoint: CGPointMake(51.66, 26.31)]; + [bezier23Path addLineToPoint: CGPointMake(51.5, 26.37)]; + [bezier23Path addLineToPoint: CGPointMake(51.34, 26.45)]; + [bezier23Path addLineToPoint: CGPointMake(51.18, 26.55)]; + [bezier23Path addLineToPoint: CGPointMake(51.03, 26.68)]; + [bezier23Path addLineToPoint: CGPointMake(50.88, 26.83)]; + [bezier23Path addLineToPoint: CGPointMake(50.74, 27.01)]; + [bezier23Path addLineToPoint: CGPointMake(50.6, 27.22)]; + [bezier23Path addLineToPoint: CGPointMake(50.48, 27.47)]; + [bezier23Path addLineToPoint: CGPointMake(50.36, 27.76)]; + [bezier23Path addLineToPoint: CGPointMake(50.25, 28.08)]; + [bezier23Path addLineToPoint: CGPointMake(50.16, 28.44)]; + [bezier23Path addLineToPoint: CGPointMake(50.12, 28.64)]; + [bezier23Path addLineToPoint: CGPointMake(50.1, 28.84)]; + [bezier23Path addLineToPoint: CGPointMake(50.09, 29.04)]; + [bezier23Path addLineToPoint: CGPointMake(50.1, 29.24)]; + [bezier23Path addLineToPoint: CGPointMake(50.11, 29.43)]; + [bezier23Path addLineToPoint: CGPointMake(50.15, 29.61)]; + [bezier23Path addLineToPoint: CGPointMake(50.2, 29.78)]; + [bezier23Path addLineToPoint: CGPointMake(50.27, 29.95)]; + [bezier23Path addLineToPoint: CGPointMake(50.35, 30.11)]; + [bezier23Path addLineToPoint: CGPointMake(50.45, 30.26)]; + [bezier23Path addLineToPoint: CGPointMake(50.57, 30.39)]; + [bezier23Path addLineToPoint: CGPointMake(50.71, 30.51)]; + [bezier23Path addLineToPoint: CGPointMake(50.86, 30.61)]; + [bezier23Path addLineToPoint: CGPointMake(51.04, 30.69)]; + [bezier23Path addLineToPoint: CGPointMake(51.24, 30.77)]; + [bezier23Path addLineToPoint: CGPointMake(51.45, 30.82)]; + [bezier23Path addLineToPoint: CGPointMake(51.53, 30.84)]; + [bezier23Path addLineToPoint: CGPointMake(51.61, 30.85)]; + [bezier23Path addLineToPoint: CGPointMake(51.71, 30.87)]; + [bezier23Path addLineToPoint: CGPointMake(51.83, 30.88)]; + [bezier23Path addLineToPoint: CGPointMake(51.95, 30.89)]; + [bezier23Path addLineToPoint: CGPointMake(52.23, 30.89)]; + [bezier23Path addLineToPoint: CGPointMake(52.37, 30.88)]; + [bezier23Path addLineToPoint: CGPointMake(52.52, 30.86)]; + [bezier23Path addLineToPoint: CGPointMake(52.66, 30.83)]; + [bezier23Path addLineToPoint: CGPointMake(52.81, 30.79)]; + [bezier23Path addLineToPoint: CGPointMake(52.95, 30.75)]; + [bezier23Path addLineToPoint: CGPointMake(53.09, 30.68)]; + [bezier23Path addLineToPoint: CGPointMake(53.22, 30.61)]; + [bezier23Path addLineToPoint: CGPointMake(53.34, 30.52)]; + [bezier23Path addLineToPoint: CGPointMake(53.46, 30.42)]; + [bezier23Path addLineToPoint: CGPointMake(53.2, 31.94)]; + [bezier23Path addLineToPoint: CGPointMake(53.17, 31.96)]; + [bezier23Path addLineToPoint: CGPointMake(53.13, 32)]; + [bezier23Path addLineToPoint: CGPointMake(53.09, 32.04)]; + [bezier23Path addLineToPoint: CGPointMake(53.03, 32.07)]; + [bezier23Path addLineToPoint: CGPointMake(52.97, 32.12)]; + [bezier23Path addLineToPoint: CGPointMake(52.89, 32.16)]; + [bezier23Path addLineToPoint: CGPointMake(52.8, 32.2)]; + [bezier23Path addLineToPoint: CGPointMake(52.7, 32.23)]; + [bezier23Path addLineToPoint: CGPointMake(52.57, 32.27)]; + [bezier23Path addLineToPoint: CGPointMake(52.42, 32.3)]; + [bezier23Path addLineToPoint: CGPointMake(52.25, 32.32)]; + [bezier23Path addLineToPoint: CGPointMake(52.05, 32.35)]; + [bezier23Path addLineToPoint: CGPointMake(51.83, 32.36)]; + [bezier23Path addLineToPoint: CGPointMake(51.57, 32.36)]; + [bezier23Path addLineToPoint: CGPointMake(51.28, 32.36)]; + [bezier23Path addLineToPoint: CGPointMake(50.96, 32.34)]; + [bezier23Path addLineToPoint: CGPointMake(50.7, 32.31)]; + [bezier23Path addLineToPoint: CGPointMake(50.44, 32.25)]; + [bezier23Path addLineToPoint: CGPointMake(50.18, 32.17)]; + [bezier23Path addLineToPoint: CGPointMake(49.91, 32.05)]; + [bezier23Path addLineToPoint: CGPointMake(49.66, 31.92)]; + [bezier23Path addLineToPoint: CGPointMake(49.42, 31.75)]; + [bezier23Path addLineToPoint: CGPointMake(49.2, 31.55)]; + [bezier23Path addLineToPoint: CGPointMake(48.99, 31.32)]; + [bezier23Path addLineToPoint: CGPointMake(48.8, 31.06)]; + [bezier23Path addLineToPoint: CGPointMake(48.64, 30.78)]; + [bezier23Path addLineToPoint: CGPointMake(48.5, 30.46)]; + [bezier23Path addLineToPoint: CGPointMake(48.4, 30.11)]; + [bezier23Path addLineToPoint: CGPointMake(48.33, 29.73)]; + [bezier23Path addLineToPoint: CGPointMake(48.31, 29.33)]; + [bezier23Path addLineToPoint: CGPointMake(48.32, 28.88)]; + [bezier23Path addLineToPoint: CGPointMake(48.38, 28.41)]; + [bezier23Path addLineToPoint: CGPointMake(48.43, 28.18)]; + [bezier23Path addLineToPoint: CGPointMake(48.48, 27.95)]; + [bezier23Path addLineToPoint: CGPointMake(48.54, 27.73)]; + [bezier23Path addLineToPoint: CGPointMake(48.59, 27.52)]; + [bezier23Path addLineToPoint: CGPointMake(48.66, 27.32)]; + [bezier23Path addLineToPoint: CGPointMake(48.73, 27.12)]; + [bezier23Path addLineToPoint: CGPointMake(48.8, 26.93)]; + [bezier23Path addLineToPoint: CGPointMake(48.88, 26.75)]; + [bezier23Path addLineToPoint: CGPointMake(48.97, 26.58)]; + [bezier23Path addLineToPoint: CGPointMake(49.05, 26.41)]; + [bezier23Path addLineToPoint: CGPointMake(49.15, 26.25)]; + [bezier23Path addLineToPoint: CGPointMake(49.25, 26.11)]; + [bezier23Path addLineToPoint: CGPointMake(49.36, 25.96)]; + [bezier23Path addLineToPoint: CGPointMake(49.47, 25.83)]; + [bezier23Path addLineToPoint: CGPointMake(49.58, 25.7)]; + [bezier23Path addLineToPoint: CGPointMake(49.7, 25.58)]; + [bezier23Path addLineToPoint: CGPointMake(49.83, 25.47)]; + [bezier23Path addLineToPoint: CGPointMake(49.97, 25.36)]; + [bezier23Path addLineToPoint: CGPointMake(50.1, 25.26)]; + [bezier23Path addLineToPoint: CGPointMake(50.24, 25.17)]; + [bezier23Path addLineToPoint: CGPointMake(50.4, 25.09)]; + [bezier23Path addLineToPoint: CGPointMake(50.55, 25.01)]; + [bezier23Path addLineToPoint: CGPointMake(50.71, 24.94)]; + [bezier23Path addLineToPoint: CGPointMake(50.88, 24.88)]; + [bezier23Path addLineToPoint: CGPointMake(51.05, 24.82)]; + [bezier23Path addLineToPoint: CGPointMake(51.23, 24.78)]; + [bezier23Path addLineToPoint: CGPointMake(51.41, 24.74)]; + [bezier23Path addLineToPoint: CGPointMake(51.61, 24.7)]; + [bezier23Path addLineToPoint: CGPointMake(51.8, 24.68)]; + [bezier23Path addLineToPoint: CGPointMake(52, 24.65)]; + [bezier23Path addLineToPoint: CGPointMake(52.21, 24.64)]; + [bezier23Path addLineToPoint: CGPointMake(52.43, 24.64)]; + [bezier23Path addLineToPoint: CGPointMake(52.61, 24.64)]; + [bezier23Path addLineToPoint: CGPointMake(52.78, 24.65)]; + [bezier23Path addLineToPoint: CGPointMake(52.95, 24.67)]; + [bezier23Path addLineToPoint: CGPointMake(53.13, 24.69)]; + [bezier23Path addLineToPoint: CGPointMake(53.28, 24.72)]; + [bezier23Path addLineToPoint: CGPointMake(53.44, 24.75)]; + [bezier23Path addLineToPoint: CGPointMake(53.59, 24.78)]; + [bezier23Path addLineToPoint: CGPointMake(53.72, 24.81)]; + [bezier23Path addLineToPoint: CGPointMake(53.85, 24.85)]; + [bezier23Path addLineToPoint: CGPointMake(53.97, 24.88)]; + [bezier23Path addLineToPoint: CGPointMake(54.08, 24.92)]; + [bezier23Path addLineToPoint: CGPointMake(54.17, 24.95)]; + [bezier23Path addLineToPoint: CGPointMake(54.25, 24.98)]; + [bezier23Path addLineToPoint: CGPointMake(54.31, 25)]; + [bezier23Path addLineToPoint: CGPointMake(54.37, 25.02)]; + [bezier23Path addLineToPoint: CGPointMake(54.4, 25.03)]; + [bezier23Path addLineToPoint: CGPointMake(54.12, 26.61)]; + [bezier23Path closePath]; + bezier23Path.miterLimit = 4; + + bezier23Path.usesEvenOddFillRule = YES; + + [color3 setStroke]; + bezier23Path.lineWidth = 0.5; + [bezier23Path stroke]; + + + //// Bezier 24 Drawing + UIBezierPath* bezier24Path = [UIBezierPath bezierPath]; + [bezier24Path moveToPoint: CGPointMake(68.13, 32.37)]; + [bezier24Path addLineToPoint: CGPointMake(66.56, 32.37)]; + [bezier24Path addLineToPoint: CGPointMake(66.67, 31.74)]; + [bezier24Path addLineToPoint: CGPointMake(66.67, 31.68)]; + [bezier24Path addLineToPoint: CGPointMake(66.58, 31.79)]; + [bezier24Path addLineToPoint: CGPointMake(66.48, 31.9)]; + [bezier24Path addLineToPoint: CGPointMake(66.39, 31.99)]; + [bezier24Path addLineToPoint: CGPointMake(66.28, 32.07)]; + [bezier24Path addLineToPoint: CGPointMake(66.18, 32.14)]; + [bezier24Path addLineToPoint: CGPointMake(66.08, 32.2)]; + [bezier24Path addLineToPoint: CGPointMake(65.98, 32.25)]; + [bezier24Path addLineToPoint: CGPointMake(65.87, 32.31)]; + [bezier24Path addLineToPoint: CGPointMake(65.76, 32.35)]; + [bezier24Path addLineToPoint: CGPointMake(65.65, 32.37)]; + [bezier24Path addLineToPoint: CGPointMake(65.54, 32.4)]; + [bezier24Path addLineToPoint: CGPointMake(65.43, 32.42)]; + [bezier24Path addLineToPoint: CGPointMake(65.32, 32.44)]; + [bezier24Path addLineToPoint: CGPointMake(65.21, 32.45)]; + [bezier24Path addLineToPoint: CGPointMake(65.09, 32.45)]; + [bezier24Path addLineToPoint: CGPointMake(64.98, 32.45)]; + [bezier24Path addLineToPoint: CGPointMake(64.68, 32.43)]; + [bezier24Path addLineToPoint: CGPointMake(64.41, 32.37)]; + [bezier24Path addLineToPoint: CGPointMake(64.16, 32.27)]; + [bezier24Path addLineToPoint: CGPointMake(63.93, 32.14)]; + [bezier24Path addLineToPoint: CGPointMake(63.73, 31.98)]; + [bezier24Path addLineToPoint: CGPointMake(63.54, 31.78)]; + [bezier24Path addLineToPoint: CGPointMake(63.38, 31.57)]; + [bezier24Path addLineToPoint: CGPointMake(63.25, 31.33)]; + [bezier24Path addLineToPoint: CGPointMake(63.13, 31.08)]; + [bezier24Path addLineToPoint: CGPointMake(63.04, 30.81)]; + [bezier24Path addLineToPoint: CGPointMake(62.98, 30.53)]; + [bezier24Path addLineToPoint: CGPointMake(62.94, 30.24)]; + [bezier24Path addLineToPoint: CGPointMake(62.92, 29.95)]; + [bezier24Path addLineToPoint: CGPointMake(62.92, 29.65)]; + [bezier24Path addLineToPoint: CGPointMake(62.95, 29.36)]; + [bezier24Path addLineToPoint: CGPointMake(63, 29.07)]; + [bezier24Path addLineToPoint: CGPointMake(63.09, 28.74)]; + [bezier24Path addLineToPoint: CGPointMake(63.19, 28.42)]; + [bezier24Path addLineToPoint: CGPointMake(63.31, 28.13)]; + [bezier24Path addLineToPoint: CGPointMake(63.45, 27.85)]; + [bezier24Path addLineToPoint: CGPointMake(63.6, 27.6)]; + [bezier24Path addLineToPoint: CGPointMake(63.77, 27.37)]; + [bezier24Path addLineToPoint: CGPointMake(63.95, 27.16)]; + [bezier24Path addLineToPoint: CGPointMake(64.14, 26.98)]; + [bezier24Path addLineToPoint: CGPointMake(64.34, 26.81)]; + [bezier24Path addLineToPoint: CGPointMake(64.55, 26.67)]; + [bezier24Path addLineToPoint: CGPointMake(64.76, 26.54)]; + [bezier24Path addLineToPoint: CGPointMake(64.98, 26.45)]; + [bezier24Path addLineToPoint: CGPointMake(65.21, 26.37)]; + [bezier24Path addLineToPoint: CGPointMake(65.43, 26.32)]; + [bezier24Path addLineToPoint: CGPointMake(65.66, 26.28)]; + [bezier24Path addLineToPoint: CGPointMake(65.9, 26.27)]; + [bezier24Path addLineToPoint: CGPointMake(66.06, 26.28)]; + [bezier24Path addLineToPoint: CGPointMake(66.22, 26.29)]; + [bezier24Path addLineToPoint: CGPointMake(66.37, 26.32)]; + [bezier24Path addLineToPoint: CGPointMake(66.51, 26.36)]; + [bezier24Path addLineToPoint: CGPointMake(66.64, 26.41)]; + [bezier24Path addLineToPoint: CGPointMake(66.75, 26.46)]; + [bezier24Path addLineToPoint: CGPointMake(66.86, 26.52)]; + [bezier24Path addLineToPoint: CGPointMake(66.97, 26.58)]; + [bezier24Path addLineToPoint: CGPointMake(67.06, 26.65)]; + [bezier24Path addLineToPoint: CGPointMake(67.14, 26.73)]; + [bezier24Path addLineToPoint: CGPointMake(67.22, 26.8)]; + [bezier24Path addLineToPoint: CGPointMake(67.29, 26.87)]; + [bezier24Path addLineToPoint: CGPointMake(67.34, 26.95)]; + [bezier24Path addLineToPoint: CGPointMake(67.39, 27.02)]; + [bezier24Path addLineToPoint: CGPointMake(67.44, 27.09)]; + [bezier24Path addLineToPoint: CGPointMake(67.47, 27.16)]; + [bezier24Path addLineToPoint: CGPointMake(67.87, 24.92)]; + [bezier24Path addLineToPoint: CGPointMake(69.42, 24.92)]; + [bezier24Path addLineToPoint: CGPointMake(68.13, 32.37)]; + [bezier24Path closePath]; + bezier24Path.miterLimit = 4; + + bezier24Path.usesEvenOddFillRule = YES; + + [color3 setFill]; + [bezier24Path fill]; + + + //// Bezier 25 Drawing + UIBezierPath* bezier25Path = [UIBezierPath bezierPath]; + [bezier25Path moveToPoint: CGPointMake(68.13, 32.37)]; + [bezier25Path addLineToPoint: CGPointMake(66.56, 32.37)]; + [bezier25Path addLineToPoint: CGPointMake(66.67, 31.74)]; + [bezier25Path addLineToPoint: CGPointMake(66.67, 31.68)]; + [bezier25Path addLineToPoint: CGPointMake(66.58, 31.79)]; + [bezier25Path addLineToPoint: CGPointMake(66.48, 31.9)]; + [bezier25Path addLineToPoint: CGPointMake(66.39, 31.99)]; + [bezier25Path addLineToPoint: CGPointMake(66.28, 32.07)]; + [bezier25Path addLineToPoint: CGPointMake(66.18, 32.14)]; + [bezier25Path addLineToPoint: CGPointMake(66.08, 32.2)]; + [bezier25Path addLineToPoint: CGPointMake(65.98, 32.25)]; + [bezier25Path addLineToPoint: CGPointMake(65.87, 32.31)]; + [bezier25Path addLineToPoint: CGPointMake(65.76, 32.35)]; + [bezier25Path addLineToPoint: CGPointMake(65.65, 32.37)]; + [bezier25Path addLineToPoint: CGPointMake(65.54, 32.4)]; + [bezier25Path addLineToPoint: CGPointMake(65.43, 32.42)]; + [bezier25Path addLineToPoint: CGPointMake(65.32, 32.44)]; + [bezier25Path addLineToPoint: CGPointMake(65.21, 32.45)]; + [bezier25Path addLineToPoint: CGPointMake(65.09, 32.45)]; + [bezier25Path addLineToPoint: CGPointMake(64.98, 32.45)]; + [bezier25Path addLineToPoint: CGPointMake(64.68, 32.43)]; + [bezier25Path addLineToPoint: CGPointMake(64.41, 32.37)]; + [bezier25Path addLineToPoint: CGPointMake(64.16, 32.27)]; + [bezier25Path addLineToPoint: CGPointMake(63.93, 32.14)]; + [bezier25Path addLineToPoint: CGPointMake(63.73, 31.98)]; + [bezier25Path addLineToPoint: CGPointMake(63.54, 31.78)]; + [bezier25Path addLineToPoint: CGPointMake(63.38, 31.57)]; + [bezier25Path addLineToPoint: CGPointMake(63.25, 31.33)]; + [bezier25Path addLineToPoint: CGPointMake(63.13, 31.08)]; + [bezier25Path addLineToPoint: CGPointMake(63.04, 30.81)]; + [bezier25Path addLineToPoint: CGPointMake(62.98, 30.53)]; + [bezier25Path addLineToPoint: CGPointMake(62.94, 30.24)]; + [bezier25Path addLineToPoint: CGPointMake(62.92, 29.95)]; + [bezier25Path addLineToPoint: CGPointMake(62.92, 29.65)]; + [bezier25Path addLineToPoint: CGPointMake(62.95, 29.36)]; + [bezier25Path addLineToPoint: CGPointMake(63, 29.07)]; + [bezier25Path addLineToPoint: CGPointMake(63.09, 28.74)]; + [bezier25Path addLineToPoint: CGPointMake(63.19, 28.42)]; + [bezier25Path addLineToPoint: CGPointMake(63.31, 28.13)]; + [bezier25Path addLineToPoint: CGPointMake(63.45, 27.85)]; + [bezier25Path addLineToPoint: CGPointMake(63.6, 27.6)]; + [bezier25Path addLineToPoint: CGPointMake(63.77, 27.37)]; + [bezier25Path addLineToPoint: CGPointMake(63.95, 27.16)]; + [bezier25Path addLineToPoint: CGPointMake(64.14, 26.98)]; + [bezier25Path addLineToPoint: CGPointMake(64.34, 26.81)]; + [bezier25Path addLineToPoint: CGPointMake(64.55, 26.67)]; + [bezier25Path addLineToPoint: CGPointMake(64.76, 26.54)]; + [bezier25Path addLineToPoint: CGPointMake(64.98, 26.45)]; + [bezier25Path addLineToPoint: CGPointMake(65.21, 26.37)]; + [bezier25Path addLineToPoint: CGPointMake(65.43, 26.32)]; + [bezier25Path addLineToPoint: CGPointMake(65.66, 26.28)]; + [bezier25Path addLineToPoint: CGPointMake(65.9, 26.27)]; + [bezier25Path addLineToPoint: CGPointMake(66.06, 26.28)]; + [bezier25Path addLineToPoint: CGPointMake(66.22, 26.29)]; + [bezier25Path addLineToPoint: CGPointMake(66.37, 26.32)]; + [bezier25Path addLineToPoint: CGPointMake(66.51, 26.36)]; + [bezier25Path addLineToPoint: CGPointMake(66.64, 26.41)]; + [bezier25Path addLineToPoint: CGPointMake(66.75, 26.46)]; + [bezier25Path addLineToPoint: CGPointMake(66.86, 26.52)]; + [bezier25Path addLineToPoint: CGPointMake(66.97, 26.58)]; + [bezier25Path addLineToPoint: CGPointMake(67.06, 26.65)]; + [bezier25Path addLineToPoint: CGPointMake(67.14, 26.73)]; + [bezier25Path addLineToPoint: CGPointMake(67.22, 26.8)]; + [bezier25Path addLineToPoint: CGPointMake(67.29, 26.87)]; + [bezier25Path addLineToPoint: CGPointMake(67.34, 26.95)]; + [bezier25Path addLineToPoint: CGPointMake(67.39, 27.02)]; + [bezier25Path addLineToPoint: CGPointMake(67.44, 27.09)]; + [bezier25Path addLineToPoint: CGPointMake(67.47, 27.16)]; + [bezier25Path addLineToPoint: CGPointMake(67.87, 24.92)]; + [bezier25Path addLineToPoint: CGPointMake(69.42, 24.92)]; + [bezier25Path addLineToPoint: CGPointMake(68.13, 32.37)]; + [bezier25Path closePath]; + bezier25Path.miterLimit = 4; + + bezier25Path.usesEvenOddFillRule = YES; + + [color3 setStroke]; + bezier25Path.lineWidth = 0.5; + [bezier25Path stroke]; + + + //// Bezier 26 Drawing + UIBezierPath* bezier26Path = [UIBezierPath bezierPath]; + [bezier26Path moveToPoint: CGPointMake(65.55, 30.99)]; + [bezier26Path addLineToPoint: CGPointMake(65.71, 30.98)]; + [bezier26Path addLineToPoint: CGPointMake(65.86, 30.94)]; + [bezier26Path addLineToPoint: CGPointMake(66, 30.9)]; + [bezier26Path addLineToPoint: CGPointMake(66.13, 30.84)]; + [bezier26Path addLineToPoint: CGPointMake(66.25, 30.77)]; + [bezier26Path addLineToPoint: CGPointMake(66.36, 30.69)]; + [bezier26Path addLineToPoint: CGPointMake(66.47, 30.59)]; + [bezier26Path addLineToPoint: CGPointMake(66.57, 30.49)]; + [bezier26Path addLineToPoint: CGPointMake(66.65, 30.38)]; + [bezier26Path addLineToPoint: CGPointMake(66.73, 30.25)]; + [bezier26Path addLineToPoint: CGPointMake(66.81, 30.12)]; + [bezier26Path addLineToPoint: CGPointMake(66.87, 29.98)]; + [bezier26Path addLineToPoint: CGPointMake(66.93, 29.84)]; + [bezier26Path addLineToPoint: CGPointMake(66.97, 29.69)]; + [bezier26Path addLineToPoint: CGPointMake(67.01, 29.54)]; + [bezier26Path addLineToPoint: CGPointMake(67.04, 29.38)]; + [bezier26Path addLineToPoint: CGPointMake(67.07, 29.23)]; + [bezier26Path addLineToPoint: CGPointMake(67.09, 29.06)]; + [bezier26Path addLineToPoint: CGPointMake(67.09, 28.91)]; + [bezier26Path addLineToPoint: CGPointMake(67.08, 28.75)]; + [bezier26Path addLineToPoint: CGPointMake(67.06, 28.6)]; + [bezier26Path addLineToPoint: CGPointMake(67.04, 28.46)]; + [bezier26Path addLineToPoint: CGPointMake(67, 28.32)]; + [bezier26Path addLineToPoint: CGPointMake(66.95, 28.19)]; + [bezier26Path addLineToPoint: CGPointMake(66.9, 28.08)]; + [bezier26Path addLineToPoint: CGPointMake(66.83, 27.97)]; + [bezier26Path addLineToPoint: CGPointMake(66.76, 27.88)]; + [bezier26Path addLineToPoint: CGPointMake(66.67, 27.8)]; + [bezier26Path addLineToPoint: CGPointMake(66.57, 27.73)]; + [bezier26Path addLineToPoint: CGPointMake(66.47, 27.68)]; + [bezier26Path addLineToPoint: CGPointMake(66.36, 27.65)]; + [bezier26Path addLineToPoint: CGPointMake(66.24, 27.64)]; + [bezier26Path addLineToPoint: CGPointMake(66.09, 27.65)]; + [bezier26Path addLineToPoint: CGPointMake(65.95, 27.68)]; + [bezier26Path addLineToPoint: CGPointMake(65.82, 27.72)]; + [bezier26Path addLineToPoint: CGPointMake(65.69, 27.78)]; + [bezier26Path addLineToPoint: CGPointMake(65.57, 27.85)]; + [bezier26Path addLineToPoint: CGPointMake(65.46, 27.94)]; + [bezier26Path addLineToPoint: CGPointMake(65.36, 28.04)]; + [bezier26Path addLineToPoint: CGPointMake(65.26, 28.15)]; + [bezier26Path addLineToPoint: CGPointMake(65.18, 28.27)]; + [bezier26Path addLineToPoint: CGPointMake(65.1, 28.41)]; + [bezier26Path addLineToPoint: CGPointMake(65.02, 28.54)]; + [bezier26Path addLineToPoint: CGPointMake(64.96, 28.69)]; + [bezier26Path addLineToPoint: CGPointMake(64.91, 28.84)]; + [bezier26Path addLineToPoint: CGPointMake(64.86, 29)]; + [bezier26Path addLineToPoint: CGPointMake(64.81, 29.16)]; + [bezier26Path addLineToPoint: CGPointMake(64.78, 29.33)]; + [bezier26Path addLineToPoint: CGPointMake(64.75, 29.58)]; + [bezier26Path addLineToPoint: CGPointMake(64.76, 29.85)]; + [bezier26Path addLineToPoint: CGPointMake(64.8, 30.13)]; + [bezier26Path addLineToPoint: CGPointMake(64.88, 30.4)]; + [bezier26Path addLineToPoint: CGPointMake(64.99, 30.63)]; + [bezier26Path addLineToPoint: CGPointMake(65.14, 30.82)]; + [bezier26Path addLineToPoint: CGPointMake(65.33, 30.94)]; + [bezier26Path addLineToPoint: CGPointMake(65.55, 30.99)]; + [bezier26Path closePath]; + bezier26Path.miterLimit = 4; + + bezier26Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier26Path fill]; + + + //// Bezier 27 Drawing + UIBezierPath* bezier27Path = [UIBezierPath bezierPath]; + [bezier27Path moveToPoint: CGPointMake(30.59, 31.1)]; + [bezier27Path addLineToPoint: CGPointMake(30.36, 32.37)]; + [bezier27Path addLineToPoint: CGPointMake(28.93, 32.37)]; + [bezier27Path addLineToPoint: CGPointMake(28.97, 32.13)]; + [bezier27Path addLineToPoint: CGPointMake(29, 31.92)]; + [bezier27Path addLineToPoint: CGPointMake(29.02, 31.76)]; + [bezier27Path addLineToPoint: CGPointMake(29.04, 31.68)]; + [bezier27Path addLineToPoint: CGPointMake(28.96, 31.77)]; + [bezier27Path addLineToPoint: CGPointMake(28.87, 31.86)]; + [bezier27Path addLineToPoint: CGPointMake(28.76, 31.95)]; + [bezier27Path addLineToPoint: CGPointMake(28.64, 32.03)]; + [bezier27Path addLineToPoint: CGPointMake(28.51, 32.11)]; + [bezier27Path addLineToPoint: CGPointMake(28.36, 32.17)]; + [bezier27Path addLineToPoint: CGPointMake(28.22, 32.24)]; + [bezier27Path addLineToPoint: CGPointMake(28.06, 32.3)]; + [bezier27Path addLineToPoint: CGPointMake(27.9, 32.35)]; + [bezier27Path addLineToPoint: CGPointMake(27.73, 32.39)]; + [bezier27Path addLineToPoint: CGPointMake(27.57, 32.43)]; + [bezier27Path addLineToPoint: CGPointMake(27.4, 32.45)]; + [bezier27Path addLineToPoint: CGPointMake(27.23, 32.46)]; + [bezier27Path addLineToPoint: CGPointMake(27.07, 32.46)]; + [bezier27Path addLineToPoint: CGPointMake(26.91, 32.45)]; + [bezier27Path addLineToPoint: CGPointMake(26.75, 32.43)]; + [bezier27Path addLineToPoint: CGPointMake(26.55, 32.37)]; + [bezier27Path addLineToPoint: CGPointMake(26.37, 32.32)]; + [bezier27Path addLineToPoint: CGPointMake(26.21, 32.24)]; + [bezier27Path addLineToPoint: CGPointMake(26.07, 32.16)]; + [bezier27Path addLineToPoint: CGPointMake(25.94, 32.07)]; + [bezier27Path addLineToPoint: CGPointMake(25.83, 31.96)]; + [bezier27Path addLineToPoint: CGPointMake(25.74, 31.86)]; + [bezier27Path addLineToPoint: CGPointMake(25.66, 31.74)]; + [bezier27Path addLineToPoint: CGPointMake(25.59, 31.62)]; + [bezier27Path addLineToPoint: CGPointMake(25.53, 31.5)]; + [bezier27Path addLineToPoint: CGPointMake(25.49, 31.37)]; + [bezier27Path addLineToPoint: CGPointMake(25.45, 31.25)]; + [bezier27Path addLineToPoint: CGPointMake(25.43, 31.12)]; + [bezier27Path addLineToPoint: CGPointMake(25.41, 30.98)]; + [bezier27Path addLineToPoint: CGPointMake(25.4, 30.86)]; + [bezier27Path addLineToPoint: CGPointMake(25.4, 30.73)]; + [bezier27Path addLineToPoint: CGPointMake(25.42, 30.51)]; + [bezier27Path addLineToPoint: CGPointMake(25.45, 30.3)]; + [bezier27Path addLineToPoint: CGPointMake(25.51, 30.1)]; + [bezier27Path addLineToPoint: CGPointMake(25.59, 29.91)]; + [bezier27Path addLineToPoint: CGPointMake(25.68, 29.73)]; + [bezier27Path addLineToPoint: CGPointMake(25.78, 29.56)]; + [bezier27Path addLineToPoint: CGPointMake(25.9, 29.4)]; + [bezier27Path addLineToPoint: CGPointMake(26.04, 29.26)]; + [bezier27Path addLineToPoint: CGPointMake(26.18, 29.13)]; + [bezier27Path addLineToPoint: CGPointMake(26.34, 29.01)]; + [bezier27Path addLineToPoint: CGPointMake(26.5, 28.9)]; + [bezier27Path addLineToPoint: CGPointMake(26.67, 28.81)]; + [bezier27Path addLineToPoint: CGPointMake(26.85, 28.73)]; + [bezier27Path addLineToPoint: CGPointMake(27.04, 28.67)]; + [bezier27Path addLineToPoint: CGPointMake(27.24, 28.62)]; + [bezier27Path addLineToPoint: CGPointMake(27.44, 28.58)]; + [bezier27Path addLineToPoint: CGPointMake(27.45, 28.58)]; + [bezier27Path addLineToPoint: CGPointMake(27.48, 28.58)]; + [bezier27Path addLineToPoint: CGPointMake(27.52, 28.57)]; + [bezier27Path addLineToPoint: CGPointMake(27.58, 28.56)]; + [bezier27Path addLineToPoint: CGPointMake(27.65, 28.55)]; + [bezier27Path addLineToPoint: CGPointMake(27.73, 28.55)]; + [bezier27Path addLineToPoint: CGPointMake(27.81, 28.54)]; + [bezier27Path addLineToPoint: CGPointMake(27.91, 28.52)]; + [bezier27Path addLineToPoint: CGPointMake(28.01, 28.51)]; + [bezier27Path addLineToPoint: CGPointMake(28.1, 28.5)]; + [bezier27Path addLineToPoint: CGPointMake(28.2, 28.5)]; + [bezier27Path addLineToPoint: CGPointMake(28.3, 28.49)]; + [bezier27Path addLineToPoint: CGPointMake(28.39, 28.48)]; + [bezier27Path addLineToPoint: CGPointMake(28.47, 28.47)]; + [bezier27Path addLineToPoint: CGPointMake(28.55, 28.47)]; + [bezier27Path addLineToPoint: CGPointMake(28.75, 28.47)]; + [bezier27Path addLineToPoint: CGPointMake(28.88, 28.47)]; + [bezier27Path addLineToPoint: CGPointMake(29.01, 28.48)]; + [bezier27Path addLineToPoint: CGPointMake(29.13, 28.48)]; + [bezier27Path addLineToPoint: CGPointMake(29.23, 28.49)]; + [bezier27Path addLineToPoint: CGPointMake(29.31, 28.49)]; + [bezier27Path addLineToPoint: CGPointMake(29.37, 28.5)]; + [bezier27Path addLineToPoint: CGPointMake(29.39, 28.5)]; + [bezier27Path addLineToPoint: CGPointMake(29.4, 28.46)]; + [bezier27Path addLineToPoint: CGPointMake(29.43, 28.35)]; + [bezier27Path addLineToPoint: CGPointMake(29.46, 28.23)]; + [bezier27Path addLineToPoint: CGPointMake(29.47, 28.13)]; + [bezier27Path addLineToPoint: CGPointMake(29.45, 28)]; + [bezier27Path addLineToPoint: CGPointMake(29.4, 27.89)]; + [bezier27Path addLineToPoint: CGPointMake(29.33, 27.78)]; + [bezier27Path addLineToPoint: CGPointMake(29.24, 27.7)]; + [bezier27Path addLineToPoint: CGPointMake(29.13, 27.63)]; + [bezier27Path addLineToPoint: CGPointMake(29.01, 27.57)]; + [bezier27Path addLineToPoint: CGPointMake(28.88, 27.54)]; + [bezier27Path addLineToPoint: CGPointMake(28.73, 27.53)]; + [bezier27Path addLineToPoint: CGPointMake(28.57, 27.52)]; + [bezier27Path addLineToPoint: CGPointMake(28.4, 27.52)]; + [bezier27Path addLineToPoint: CGPointMake(28.22, 27.52)]; + [bezier27Path addLineToPoint: CGPointMake(28.04, 27.52)]; + [bezier27Path addLineToPoint: CGPointMake(27.85, 27.53)]; + [bezier27Path addLineToPoint: CGPointMake(27.67, 27.55)]; + [bezier27Path addLineToPoint: CGPointMake(27.49, 27.57)]; + [bezier27Path addLineToPoint: CGPointMake(27.31, 27.59)]; + [bezier27Path addLineToPoint: CGPointMake(27.14, 27.61)]; + [bezier27Path addLineToPoint: CGPointMake(26.97, 27.64)]; + [bezier27Path addLineToPoint: CGPointMake(26.83, 27.67)]; + [bezier27Path addLineToPoint: CGPointMake(26.69, 27.7)]; + [bezier27Path addLineToPoint: CGPointMake(26.56, 27.73)]; + [bezier27Path addLineToPoint: CGPointMake(26.46, 27.77)]; + [bezier27Path addLineToPoint: CGPointMake(26.38, 27.81)]; + [bezier27Path addLineToPoint: CGPointMake(26.32, 27.84)]; + [bezier27Path addLineToPoint: CGPointMake(26.72, 26.47)]; + [bezier27Path addLineToPoint: CGPointMake(26.85, 26.42)]; + [bezier27Path addLineToPoint: CGPointMake(26.97, 26.37)]; + [bezier27Path addLineToPoint: CGPointMake(27.11, 26.33)]; + [bezier27Path addLineToPoint: CGPointMake(27.25, 26.3)]; + [bezier27Path addLineToPoint: CGPointMake(27.38, 26.28)]; + [bezier27Path addLineToPoint: CGPointMake(27.53, 26.25)]; + [bezier27Path addLineToPoint: CGPointMake(27.68, 26.23)]; + [bezier27Path addLineToPoint: CGPointMake(27.83, 26.22)]; + [bezier27Path addLineToPoint: CGPointMake(27.99, 26.21)]; + [bezier27Path addLineToPoint: CGPointMake(28.16, 26.2)]; + [bezier27Path addLineToPoint: CGPointMake(28.33, 26.2)]; + [bezier27Path addLineToPoint: CGPointMake(28.88, 26.2)]; + [bezier27Path addLineToPoint: CGPointMake(29.08, 26.2)]; + [bezier27Path addLineToPoint: CGPointMake(29.27, 26.21)]; + [bezier27Path addLineToPoint: CGPointMake(29.43, 26.22)]; + [bezier27Path addLineToPoint: CGPointMake(29.61, 26.25)]; + [bezier27Path addLineToPoint: CGPointMake(29.78, 26.29)]; + [bezier27Path addLineToPoint: CGPointMake(29.96, 26.34)]; + [bezier27Path addLineToPoint: CGPointMake(30.14, 26.41)]; + [bezier27Path addLineToPoint: CGPointMake(30.31, 26.49)]; + [bezier27Path addLineToPoint: CGPointMake(30.48, 26.58)]; + [bezier27Path addLineToPoint: CGPointMake(30.64, 26.69)]; + [bezier27Path addLineToPoint: CGPointMake(30.78, 26.82)]; + [bezier27Path addLineToPoint: CGPointMake(30.91, 26.95)]; + [bezier27Path addLineToPoint: CGPointMake(31.02, 27.11)]; + [bezier27Path addLineToPoint: CGPointMake(31.11, 27.28)]; + [bezier27Path addLineToPoint: CGPointMake(31.16, 27.46)]; + [bezier27Path addLineToPoint: CGPointMake(31.2, 27.65)]; + [bezier27Path addLineToPoint: CGPointMake(31.2, 27.87)]; + [bezier27Path addLineToPoint: CGPointMake(31.16, 28.1)]; + [bezier27Path addLineToPoint: CGPointMake(30.59, 31.1)]; + [bezier27Path closePath]; + bezier27Path.miterLimit = 4; + + bezier27Path.usesEvenOddFillRule = YES; + + [color3 setFill]; + [bezier27Path fill]; + + + //// Bezier 28 Drawing + UIBezierPath* bezier28Path = [UIBezierPath bezierPath]; + [bezier28Path moveToPoint: CGPointMake(30.59, 31.1)]; + [bezier28Path addLineToPoint: CGPointMake(30.36, 32.37)]; + [bezier28Path addLineToPoint: CGPointMake(28.93, 32.37)]; + [bezier28Path addLineToPoint: CGPointMake(28.97, 32.13)]; + [bezier28Path addLineToPoint: CGPointMake(29, 31.92)]; + [bezier28Path addLineToPoint: CGPointMake(29.02, 31.76)]; + [bezier28Path addLineToPoint: CGPointMake(29.04, 31.68)]; + [bezier28Path addLineToPoint: CGPointMake(28.96, 31.77)]; + [bezier28Path addLineToPoint: CGPointMake(28.87, 31.86)]; + [bezier28Path addLineToPoint: CGPointMake(28.76, 31.95)]; + [bezier28Path addLineToPoint: CGPointMake(28.64, 32.03)]; + [bezier28Path addLineToPoint: CGPointMake(28.51, 32.11)]; + [bezier28Path addLineToPoint: CGPointMake(28.36, 32.17)]; + [bezier28Path addLineToPoint: CGPointMake(28.22, 32.24)]; + [bezier28Path addLineToPoint: CGPointMake(28.06, 32.3)]; + [bezier28Path addLineToPoint: CGPointMake(27.9, 32.35)]; + [bezier28Path addLineToPoint: CGPointMake(27.73, 32.39)]; + [bezier28Path addLineToPoint: CGPointMake(27.57, 32.43)]; + [bezier28Path addLineToPoint: CGPointMake(27.4, 32.45)]; + [bezier28Path addLineToPoint: CGPointMake(27.23, 32.46)]; + [bezier28Path addLineToPoint: CGPointMake(27.07, 32.46)]; + [bezier28Path addLineToPoint: CGPointMake(26.91, 32.45)]; + [bezier28Path addLineToPoint: CGPointMake(26.75, 32.43)]; + [bezier28Path addLineToPoint: CGPointMake(26.55, 32.37)]; + [bezier28Path addLineToPoint: CGPointMake(26.37, 32.32)]; + [bezier28Path addLineToPoint: CGPointMake(26.21, 32.24)]; + [bezier28Path addLineToPoint: CGPointMake(26.07, 32.16)]; + [bezier28Path addLineToPoint: CGPointMake(25.94, 32.07)]; + [bezier28Path addLineToPoint: CGPointMake(25.83, 31.96)]; + [bezier28Path addLineToPoint: CGPointMake(25.74, 31.86)]; + [bezier28Path addLineToPoint: CGPointMake(25.66, 31.74)]; + [bezier28Path addLineToPoint: CGPointMake(25.59, 31.62)]; + [bezier28Path addLineToPoint: CGPointMake(25.53, 31.5)]; + [bezier28Path addLineToPoint: CGPointMake(25.49, 31.37)]; + [bezier28Path addLineToPoint: CGPointMake(25.45, 31.25)]; + [bezier28Path addLineToPoint: CGPointMake(25.43, 31.12)]; + [bezier28Path addLineToPoint: CGPointMake(25.41, 30.98)]; + [bezier28Path addLineToPoint: CGPointMake(25.4, 30.86)]; + [bezier28Path addLineToPoint: CGPointMake(25.4, 30.73)]; + [bezier28Path addLineToPoint: CGPointMake(25.42, 30.51)]; + [bezier28Path addLineToPoint: CGPointMake(25.45, 30.3)]; + [bezier28Path addLineToPoint: CGPointMake(25.51, 30.1)]; + [bezier28Path addLineToPoint: CGPointMake(25.59, 29.91)]; + [bezier28Path addLineToPoint: CGPointMake(25.68, 29.73)]; + [bezier28Path addLineToPoint: CGPointMake(25.78, 29.56)]; + [bezier28Path addLineToPoint: CGPointMake(25.9, 29.4)]; + [bezier28Path addLineToPoint: CGPointMake(26.04, 29.26)]; + [bezier28Path addLineToPoint: CGPointMake(26.18, 29.13)]; + [bezier28Path addLineToPoint: CGPointMake(26.34, 29.01)]; + [bezier28Path addLineToPoint: CGPointMake(26.5, 28.9)]; + [bezier28Path addLineToPoint: CGPointMake(26.67, 28.81)]; + [bezier28Path addLineToPoint: CGPointMake(26.85, 28.73)]; + [bezier28Path addLineToPoint: CGPointMake(27.04, 28.67)]; + [bezier28Path addLineToPoint: CGPointMake(27.24, 28.62)]; + [bezier28Path addLineToPoint: CGPointMake(27.44, 28.58)]; + [bezier28Path addLineToPoint: CGPointMake(27.45, 28.58)]; + [bezier28Path addLineToPoint: CGPointMake(27.48, 28.58)]; + [bezier28Path addLineToPoint: CGPointMake(27.52, 28.57)]; + [bezier28Path addLineToPoint: CGPointMake(27.58, 28.56)]; + [bezier28Path addLineToPoint: CGPointMake(27.65, 28.55)]; + [bezier28Path addLineToPoint: CGPointMake(27.73, 28.55)]; + [bezier28Path addLineToPoint: CGPointMake(27.81, 28.54)]; + [bezier28Path addLineToPoint: CGPointMake(27.91, 28.52)]; + [bezier28Path addLineToPoint: CGPointMake(28.01, 28.51)]; + [bezier28Path addLineToPoint: CGPointMake(28.1, 28.5)]; + [bezier28Path addLineToPoint: CGPointMake(28.2, 28.5)]; + [bezier28Path addLineToPoint: CGPointMake(28.3, 28.49)]; + [bezier28Path addLineToPoint: CGPointMake(28.39, 28.48)]; + [bezier28Path addLineToPoint: CGPointMake(28.47, 28.47)]; + [bezier28Path addLineToPoint: CGPointMake(28.55, 28.47)]; + [bezier28Path addLineToPoint: CGPointMake(28.75, 28.47)]; + [bezier28Path addLineToPoint: CGPointMake(28.88, 28.47)]; + [bezier28Path addLineToPoint: CGPointMake(29.01, 28.48)]; + [bezier28Path addLineToPoint: CGPointMake(29.13, 28.48)]; + [bezier28Path addLineToPoint: CGPointMake(29.23, 28.49)]; + [bezier28Path addLineToPoint: CGPointMake(29.31, 28.49)]; + [bezier28Path addLineToPoint: CGPointMake(29.37, 28.5)]; + [bezier28Path addLineToPoint: CGPointMake(29.39, 28.5)]; + [bezier28Path addLineToPoint: CGPointMake(29.4, 28.46)]; + [bezier28Path addLineToPoint: CGPointMake(29.43, 28.35)]; + [bezier28Path addLineToPoint: CGPointMake(29.46, 28.23)]; + [bezier28Path addLineToPoint: CGPointMake(29.47, 28.13)]; + [bezier28Path addLineToPoint: CGPointMake(29.45, 28)]; + [bezier28Path addLineToPoint: CGPointMake(29.4, 27.89)]; + [bezier28Path addLineToPoint: CGPointMake(29.33, 27.78)]; + [bezier28Path addLineToPoint: CGPointMake(29.24, 27.7)]; + [bezier28Path addLineToPoint: CGPointMake(29.13, 27.63)]; + [bezier28Path addLineToPoint: CGPointMake(29.01, 27.57)]; + [bezier28Path addLineToPoint: CGPointMake(28.88, 27.54)]; + [bezier28Path addLineToPoint: CGPointMake(28.73, 27.53)]; + [bezier28Path addLineToPoint: CGPointMake(28.57, 27.52)]; + [bezier28Path addLineToPoint: CGPointMake(28.4, 27.52)]; + [bezier28Path addLineToPoint: CGPointMake(28.22, 27.52)]; + [bezier28Path addLineToPoint: CGPointMake(28.04, 27.52)]; + [bezier28Path addLineToPoint: CGPointMake(27.85, 27.53)]; + [bezier28Path addLineToPoint: CGPointMake(27.67, 27.55)]; + [bezier28Path addLineToPoint: CGPointMake(27.49, 27.57)]; + [bezier28Path addLineToPoint: CGPointMake(27.31, 27.59)]; + [bezier28Path addLineToPoint: CGPointMake(27.14, 27.61)]; + [bezier28Path addLineToPoint: CGPointMake(26.97, 27.64)]; + [bezier28Path addLineToPoint: CGPointMake(26.83, 27.67)]; + [bezier28Path addLineToPoint: CGPointMake(26.69, 27.7)]; + [bezier28Path addLineToPoint: CGPointMake(26.56, 27.73)]; + [bezier28Path addLineToPoint: CGPointMake(26.46, 27.77)]; + [bezier28Path addLineToPoint: CGPointMake(26.38, 27.81)]; + [bezier28Path addLineToPoint: CGPointMake(26.32, 27.84)]; + [bezier28Path addLineToPoint: CGPointMake(26.72, 26.47)]; + [bezier28Path addLineToPoint: CGPointMake(26.85, 26.42)]; + [bezier28Path addLineToPoint: CGPointMake(26.97, 26.37)]; + [bezier28Path addLineToPoint: CGPointMake(27.11, 26.33)]; + [bezier28Path addLineToPoint: CGPointMake(27.25, 26.3)]; + [bezier28Path addLineToPoint: CGPointMake(27.38, 26.28)]; + [bezier28Path addLineToPoint: CGPointMake(27.53, 26.25)]; + [bezier28Path addLineToPoint: CGPointMake(27.68, 26.23)]; + [bezier28Path addLineToPoint: CGPointMake(27.83, 26.22)]; + [bezier28Path addLineToPoint: CGPointMake(27.99, 26.21)]; + [bezier28Path addLineToPoint: CGPointMake(28.16, 26.2)]; + [bezier28Path addLineToPoint: CGPointMake(28.33, 26.2)]; + [bezier28Path addLineToPoint: CGPointMake(28.88, 26.2)]; + [bezier28Path addLineToPoint: CGPointMake(29.08, 26.2)]; + [bezier28Path addLineToPoint: CGPointMake(29.27, 26.21)]; + [bezier28Path addLineToPoint: CGPointMake(29.43, 26.22)]; + [bezier28Path addLineToPoint: CGPointMake(29.61, 26.25)]; + [bezier28Path addLineToPoint: CGPointMake(29.78, 26.29)]; + [bezier28Path addLineToPoint: CGPointMake(29.96, 26.34)]; + [bezier28Path addLineToPoint: CGPointMake(30.14, 26.41)]; + [bezier28Path addLineToPoint: CGPointMake(30.31, 26.49)]; + [bezier28Path addLineToPoint: CGPointMake(30.48, 26.58)]; + [bezier28Path addLineToPoint: CGPointMake(30.64, 26.69)]; + [bezier28Path addLineToPoint: CGPointMake(30.78, 26.82)]; + [bezier28Path addLineToPoint: CGPointMake(30.91, 26.95)]; + [bezier28Path addLineToPoint: CGPointMake(31.02, 27.11)]; + [bezier28Path addLineToPoint: CGPointMake(31.11, 27.28)]; + [bezier28Path addLineToPoint: CGPointMake(31.16, 27.46)]; + [bezier28Path addLineToPoint: CGPointMake(31.2, 27.65)]; + [bezier28Path addLineToPoint: CGPointMake(31.2, 27.87)]; + [bezier28Path addLineToPoint: CGPointMake(31.16, 28.1)]; + [bezier28Path addLineToPoint: CGPointMake(30.59, 31.1)]; + [bezier28Path closePath]; + bezier28Path.miterLimit = 4; + + bezier28Path.usesEvenOddFillRule = YES; + + [color3 setStroke]; + bezier28Path.lineWidth = 0.5; + [bezier28Path stroke]; + + + //// Bezier 29 Drawing + UIBezierPath* bezier29Path = [UIBezierPath bezierPath]; + [bezier29Path moveToPoint: CGPointMake(29.22, 29.62)]; + [bezier29Path addLineToPoint: CGPointMake(29.21, 29.59)]; + [bezier29Path addLineToPoint: CGPointMake(29.19, 29.56)]; + [bezier29Path addLineToPoint: CGPointMake(29.16, 29.54)]; + [bezier29Path addLineToPoint: CGPointMake(29.1, 29.53)]; + [bezier29Path addLineToPoint: CGPointMake(29.04, 29.52)]; + [bezier29Path addLineToPoint: CGPointMake(28.96, 29.52)]; + [bezier29Path addLineToPoint: CGPointMake(28.79, 29.52)]; + [bezier29Path addLineToPoint: CGPointMake(28.7, 29.52)]; + [bezier29Path addLineToPoint: CGPointMake(28.6, 29.53)]; + [bezier29Path addLineToPoint: CGPointMake(28.51, 29.54)]; + [bezier29Path addLineToPoint: CGPointMake(28.42, 29.56)]; + [bezier29Path addLineToPoint: CGPointMake(28.34, 29.57)]; + [bezier29Path addLineToPoint: CGPointMake(28.26, 29.58)]; + [bezier29Path addLineToPoint: CGPointMake(28.19, 29.6)]; + [bezier29Path addLineToPoint: CGPointMake(28.12, 29.62)]; + [bezier29Path addLineToPoint: CGPointMake(28.08, 29.63)]; + [bezier29Path addLineToPoint: CGPointMake(28.04, 29.65)]; + [bezier29Path addLineToPoint: CGPointMake(27.98, 29.67)]; + [bezier29Path addLineToPoint: CGPointMake(27.91, 29.7)]; + [bezier29Path addLineToPoint: CGPointMake(27.84, 29.73)]; + [bezier29Path addLineToPoint: CGPointMake(27.77, 29.77)]; + [bezier29Path addLineToPoint: CGPointMake(27.69, 29.81)]; + [bezier29Path addLineToPoint: CGPointMake(27.61, 29.86)]; + [bezier29Path addLineToPoint: CGPointMake(27.53, 29.91)]; + [bezier29Path addLineToPoint: CGPointMake(27.46, 29.97)]; + [bezier29Path addLineToPoint: CGPointMake(27.39, 30.04)]; + [bezier29Path addLineToPoint: CGPointMake(27.33, 30.11)]; + [bezier29Path addLineToPoint: CGPointMake(27.27, 30.18)]; + [bezier29Path addLineToPoint: CGPointMake(27.23, 30.26)]; + [bezier29Path addLineToPoint: CGPointMake(27.2, 30.35)]; + [bezier29Path addLineToPoint: CGPointMake(27.18, 30.44)]; + [bezier29Path addLineToPoint: CGPointMake(27.17, 30.64)]; + [bezier29Path addLineToPoint: CGPointMake(27.2, 30.79)]; + [bezier29Path addLineToPoint: CGPointMake(27.26, 30.9)]; + [bezier29Path addLineToPoint: CGPointMake(27.33, 30.99)]; + [bezier29Path addLineToPoint: CGPointMake(27.42, 31.05)]; + [bezier29Path addLineToPoint: CGPointMake(27.52, 31.08)]; + [bezier29Path addLineToPoint: CGPointMake(27.61, 31.1)]; + [bezier29Path addLineToPoint: CGPointMake(27.7, 31.1)]; + [bezier29Path addLineToPoint: CGPointMake(27.87, 31.1)]; + [bezier29Path addLineToPoint: CGPointMake(28.02, 31.08)]; + [bezier29Path addLineToPoint: CGPointMake(28.17, 31.06)]; + [bezier29Path addLineToPoint: CGPointMake(28.3, 31.02)]; + [bezier29Path addLineToPoint: CGPointMake(28.41, 30.98)]; + [bezier29Path addLineToPoint: CGPointMake(28.52, 30.93)]; + [bezier29Path addLineToPoint: CGPointMake(28.62, 30.88)]; + [bezier29Path addLineToPoint: CGPointMake(28.71, 30.82)]; + [bezier29Path addLineToPoint: CGPointMake(28.78, 30.76)]; + [bezier29Path addLineToPoint: CGPointMake(28.85, 30.69)]; + [bezier29Path addLineToPoint: CGPointMake(28.9, 30.63)]; + [bezier29Path addLineToPoint: CGPointMake(28.95, 30.56)]; + [bezier29Path addLineToPoint: CGPointMake(28.99, 30.5)]; + [bezier29Path addLineToPoint: CGPointMake(29.02, 30.43)]; + [bezier29Path addLineToPoint: CGPointMake(29.05, 30.36)]; + [bezier29Path addLineToPoint: CGPointMake(29.07, 30.3)]; + [bezier29Path addLineToPoint: CGPointMake(29.12, 30.14)]; + [bezier29Path addLineToPoint: CGPointMake(29.16, 29.95)]; + [bezier29Path addLineToPoint: CGPointMake(29.19, 29.77)]; + [bezier29Path addLineToPoint: CGPointMake(29.22, 29.62)]; + [bezier29Path closePath]; + bezier29Path.miterLimit = 4; + + bezier29Path.usesEvenOddFillRule = YES; + + [color2 setFill]; + [bezier29Path fill]; + + + //// Bezier 30 Drawing + UIBezierPath* bezier30Path = [UIBezierPath bezierPath]; + [bezier30Path moveToPoint: CGPointMake(18.61, 32.37)]; + [bezier30Path addLineToPoint: CGPointMake(17.06, 32.37)]; + [bezier30Path addLineToPoint: CGPointMake(18.35, 24.89)]; + [bezier30Path addLineToPoint: CGPointMake(21.05, 24.89)]; + [bezier30Path addLineToPoint: CGPointMake(21.3, 29.33)]; + [bezier30Path addLineToPoint: CGPointMake(23.17, 24.89)]; + [bezier30Path addLineToPoint: CGPointMake(25.98, 24.89)]; + [bezier30Path addLineToPoint: CGPointMake(24.66, 32.37)]; + [bezier30Path addLineToPoint: CGPointMake(23.11, 32.37)]; + [bezier30Path addLineToPoint: CGPointMake(24.09, 26.78)]; + [bezier30Path addLineToPoint: CGPointMake(24.03, 26.78)]; + [bezier30Path addLineToPoint: CGPointMake(21.71, 32.37)]; + [bezier30Path addLineToPoint: CGPointMake(19.96, 32.37)]; + [bezier30Path addLineToPoint: CGPointMake(19.95, 32.13)]; + [bezier30Path addLineToPoint: CGPointMake(19.91, 31.51)]; + [bezier30Path addLineToPoint: CGPointMake(19.86, 30.63)]; + [bezier30Path addLineToPoint: CGPointMake(19.74, 28.6)]; + [bezier30Path addLineToPoint: CGPointMake(19.69, 27.71)]; + [bezier30Path addLineToPoint: CGPointMake(19.65, 27.06)]; + [bezier30Path addLineToPoint: CGPointMake(19.64, 26.78)]; + [bezier30Path addLineToPoint: CGPointMake(19.56, 26.78)]; + [bezier30Path addLineToPoint: CGPointMake(18.61, 32.37)]; + [bezier30Path closePath]; + bezier30Path.miterLimit = 4; + + bezier30Path.usesEvenOddFillRule = YES; + + [color3 setFill]; + [bezier30Path fill]; + + + //// Bezier 31 Drawing + UIBezierPath* bezier31Path = [UIBezierPath bezierPath]; + [bezier31Path moveToPoint: CGPointMake(18.61, 32.37)]; + [bezier31Path addLineToPoint: CGPointMake(17.06, 32.37)]; + [bezier31Path addLineToPoint: CGPointMake(18.35, 24.89)]; + [bezier31Path addLineToPoint: CGPointMake(21.05, 24.89)]; + [bezier31Path addLineToPoint: CGPointMake(21.3, 29.33)]; + [bezier31Path addLineToPoint: CGPointMake(23.17, 24.89)]; + [bezier31Path addLineToPoint: CGPointMake(25.98, 24.89)]; + [bezier31Path addLineToPoint: CGPointMake(24.66, 32.37)]; + [bezier31Path addLineToPoint: CGPointMake(23.11, 32.37)]; + [bezier31Path addLineToPoint: CGPointMake(24.09, 26.78)]; + [bezier31Path addLineToPoint: CGPointMake(24.03, 26.78)]; + [bezier31Path addLineToPoint: CGPointMake(21.71, 32.37)]; + [bezier31Path addLineToPoint: CGPointMake(19.96, 32.37)]; + [bezier31Path addLineToPoint: CGPointMake(19.95, 32.13)]; + [bezier31Path addLineToPoint: CGPointMake(19.91, 31.51)]; + [bezier31Path addLineToPoint: CGPointMake(19.86, 30.63)]; + [bezier31Path addLineToPoint: CGPointMake(19.74, 28.6)]; + [bezier31Path addLineToPoint: CGPointMake(19.69, 27.71)]; + [bezier31Path addLineToPoint: CGPointMake(19.65, 27.06)]; + [bezier31Path addLineToPoint: CGPointMake(19.64, 26.78)]; + [bezier31Path addLineToPoint: CGPointMake(19.56, 26.78)]; + [bezier31Path addLineToPoint: CGPointMake(18.61, 32.37)]; + [bezier31Path closePath]; + bezier31Path.miterLimit = 4; + + bezier31Path.usesEvenOddFillRule = YES; + + [color3 setStroke]; + bezier31Path.lineWidth = 0.5; + [bezier31Path stroke]; + + + //// Bezier 32 Drawing + UIBezierPath* bezier32Path = [UIBezierPath bezierPath]; + [bezier32Path moveToPoint: CGPointMake(58.85, 31.1)]; + [bezier32Path addLineToPoint: CGPointMake(58.61, 32.37)]; + [bezier32Path addLineToPoint: CGPointMake(57.18, 32.37)]; + [bezier32Path addLineToPoint: CGPointMake(57.2, 32.13)]; + [bezier32Path addLineToPoint: CGPointMake(57.2, 31.93)]; + [bezier32Path addLineToPoint: CGPointMake(57.2, 31.78)]; + [bezier32Path addLineToPoint: CGPointMake(57.21, 31.71)]; + [bezier32Path addLineToPoint: CGPointMake(57.14, 31.79)]; + [bezier32Path addLineToPoint: CGPointMake(57.05, 31.88)]; + [bezier32Path addLineToPoint: CGPointMake(56.95, 31.96)]; + [bezier32Path addLineToPoint: CGPointMake(56.84, 32.04)]; + [bezier32Path addLineToPoint: CGPointMake(56.72, 32.11)]; + [bezier32Path addLineToPoint: CGPointMake(56.58, 32.18)]; + [bezier32Path addLineToPoint: CGPointMake(56.44, 32.25)]; + [bezier32Path addLineToPoint: CGPointMake(56.3, 32.31)]; + [bezier32Path addLineToPoint: CGPointMake(56.14, 32.35)]; + [bezier32Path addLineToPoint: CGPointMake(55.98, 32.4)]; + [bezier32Path addLineToPoint: CGPointMake(55.82, 32.43)]; + [bezier32Path addLineToPoint: CGPointMake(55.66, 32.45)]; + [bezier32Path addLineToPoint: CGPointMake(55.5, 32.46)]; + [bezier32Path addLineToPoint: CGPointMake(55.34, 32.46)]; + [bezier32Path addLineToPoint: CGPointMake(55.19, 32.45)]; + [bezier32Path addLineToPoint: CGPointMake(55.03, 32.43)]; + [bezier32Path addLineToPoint: CGPointMake(54.83, 32.37)]; + [bezier32Path addLineToPoint: CGPointMake(54.65, 32.32)]; + [bezier32Path addLineToPoint: CGPointMake(54.49, 32.24)]; + [bezier32Path addLineToPoint: CGPointMake(54.34, 32.16)]; + [bezier32Path addLineToPoint: CGPointMake(54.21, 32.07)]; + [bezier32Path addLineToPoint: CGPointMake(54.1, 31.96)]; + [bezier32Path addLineToPoint: CGPointMake(54.01, 31.86)]; + [bezier32Path addLineToPoint: CGPointMake(53.93, 31.74)]; + [bezier32Path addLineToPoint: CGPointMake(53.87, 31.62)]; + [bezier32Path addLineToPoint: CGPointMake(53.81, 31.5)]; + [bezier32Path addLineToPoint: CGPointMake(53.77, 31.37)]; + [bezier32Path addLineToPoint: CGPointMake(53.74, 31.25)]; + [bezier32Path addLineToPoint: CGPointMake(53.72, 31.12)]; + [bezier32Path addLineToPoint: CGPointMake(53.7, 30.98)]; + [bezier32Path addLineToPoint: CGPointMake(53.69, 30.86)]; + [bezier32Path addLineToPoint: CGPointMake(53.69, 30.73)]; + [bezier32Path addLineToPoint: CGPointMake(53.7, 30.51)]; + [bezier32Path addLineToPoint: CGPointMake(53.73, 30.3)]; + [bezier32Path addLineToPoint: CGPointMake(53.79, 30.1)]; + [bezier32Path addLineToPoint: CGPointMake(53.86, 29.91)]; + [bezier32Path addLineToPoint: CGPointMake(53.95, 29.73)]; + [bezier32Path addLineToPoint: CGPointMake(54.05, 29.56)]; + [bezier32Path addLineToPoint: CGPointMake(54.17, 29.4)]; + [bezier32Path addLineToPoint: CGPointMake(54.3, 29.26)]; + [bezier32Path addLineToPoint: CGPointMake(54.45, 29.13)]; + [bezier32Path addLineToPoint: CGPointMake(54.61, 29.01)]; + [bezier32Path addLineToPoint: CGPointMake(54.77, 28.9)]; + [bezier32Path addLineToPoint: CGPointMake(54.95, 28.81)]; + [bezier32Path addLineToPoint: CGPointMake(55.12, 28.73)]; + [bezier32Path addLineToPoint: CGPointMake(55.31, 28.67)]; + [bezier32Path addLineToPoint: CGPointMake(55.5, 28.62)]; + [bezier32Path addLineToPoint: CGPointMake(55.69, 28.58)]; + [bezier32Path addLineToPoint: CGPointMake(55.7, 28.58)]; + [bezier32Path addLineToPoint: CGPointMake(55.73, 28.58)]; + [bezier32Path addLineToPoint: CGPointMake(55.77, 28.57)]; + [bezier32Path addLineToPoint: CGPointMake(55.83, 28.56)]; + [bezier32Path addLineToPoint: CGPointMake(55.9, 28.55)]; + [bezier32Path addLineToPoint: CGPointMake(55.98, 28.55)]; + [bezier32Path addLineToPoint: CGPointMake(56.07, 28.54)]; + [bezier32Path addLineToPoint: CGPointMake(56.16, 28.52)]; + [bezier32Path addLineToPoint: CGPointMake(56.26, 28.51)]; + [bezier32Path addLineToPoint: CGPointMake(56.36, 28.5)]; + [bezier32Path addLineToPoint: CGPointMake(56.46, 28.5)]; + [bezier32Path addLineToPoint: CGPointMake(56.55, 28.49)]; + [bezier32Path addLineToPoint: CGPointMake(56.64, 28.48)]; + [bezier32Path addLineToPoint: CGPointMake(56.72, 28.47)]; + [bezier32Path addLineToPoint: CGPointMake(56.8, 28.47)]; + [bezier32Path addLineToPoint: CGPointMake(57, 28.47)]; + [bezier32Path addLineToPoint: CGPointMake(57.14, 28.47)]; + [bezier32Path addLineToPoint: CGPointMake(57.27, 28.48)]; + [bezier32Path addLineToPoint: CGPointMake(57.4, 28.48)]; + [bezier32Path addLineToPoint: CGPointMake(57.5, 28.49)]; + [bezier32Path addLineToPoint: CGPointMake(57.59, 28.49)]; + [bezier32Path addLineToPoint: CGPointMake(57.65, 28.5)]; + [bezier32Path addLineToPoint: CGPointMake(57.67, 28.5)]; + [bezier32Path addLineToPoint: CGPointMake(57.68, 28.46)]; + [bezier32Path addLineToPoint: CGPointMake(57.7, 28.35)]; + [bezier32Path addLineToPoint: CGPointMake(57.71, 28.23)]; + [bezier32Path addLineToPoint: CGPointMake(57.73, 28.13)]; + [bezier32Path addLineToPoint: CGPointMake(57.7, 28)]; + [bezier32Path addLineToPoint: CGPointMake(57.66, 27.89)]; + [bezier32Path addLineToPoint: CGPointMake(57.58, 27.78)]; + [bezier32Path addLineToPoint: CGPointMake(57.5, 27.7)]; + [bezier32Path addLineToPoint: CGPointMake(57.4, 27.63)]; + [bezier32Path addLineToPoint: CGPointMake(57.28, 27.57)]; + [bezier32Path addLineToPoint: CGPointMake(57.15, 27.54)]; + [bezier32Path addLineToPoint: CGPointMake(57.01, 27.53)]; + [bezier32Path addLineToPoint: CGPointMake(56.85, 27.52)]; + [bezier32Path addLineToPoint: CGPointMake(56.68, 27.52)]; + [bezier32Path addLineToPoint: CGPointMake(56.51, 27.52)]; + [bezier32Path addLineToPoint: CGPointMake(56.32, 27.52)]; + [bezier32Path addLineToPoint: CGPointMake(56.14, 27.53)]; + [bezier32Path addLineToPoint: CGPointMake(55.95, 27.55)]; + [bezier32Path addLineToPoint: CGPointMake(55.77, 27.57)]; + [bezier32Path addLineToPoint: CGPointMake(55.6, 27.59)]; + [bezier32Path addLineToPoint: CGPointMake(55.43, 27.61)]; + [bezier32Path addLineToPoint: CGPointMake(55.26, 27.64)]; + [bezier32Path addLineToPoint: CGPointMake(55.11, 27.67)]; + [bezier32Path addLineToPoint: CGPointMake(54.98, 27.7)]; + [bezier32Path addLineToPoint: CGPointMake(54.85, 27.73)]; + [bezier32Path addLineToPoint: CGPointMake(54.75, 27.77)]; + [bezier32Path addLineToPoint: CGPointMake(54.67, 27.81)]; + [bezier32Path addLineToPoint: CGPointMake(54.61, 27.84)]; + [bezier32Path addLineToPoint: CGPointMake(55, 26.47)]; + [bezier32Path addLineToPoint: CGPointMake(55.13, 26.42)]; + [bezier32Path addLineToPoint: CGPointMake(55.26, 26.37)]; + [bezier32Path addLineToPoint: CGPointMake(55.39, 26.33)]; + [bezier32Path addLineToPoint: CGPointMake(55.53, 26.3)]; + [bezier32Path addLineToPoint: CGPointMake(55.67, 26.28)]; + [bezier32Path addLineToPoint: CGPointMake(55.81, 26.25)]; + [bezier32Path addLineToPoint: CGPointMake(55.96, 26.23)]; + [bezier32Path addLineToPoint: CGPointMake(56.11, 26.22)]; + [bezier32Path addLineToPoint: CGPointMake(56.27, 26.21)]; + [bezier32Path addLineToPoint: CGPointMake(56.44, 26.2)]; + [bezier32Path addLineToPoint: CGPointMake(56.6, 26.2)]; + [bezier32Path addLineToPoint: CGPointMake(57.14, 26.2)]; + [bezier32Path addLineToPoint: CGPointMake(57.33, 26.2)]; + [bezier32Path addLineToPoint: CGPointMake(57.53, 26.21)]; + [bezier32Path addLineToPoint: CGPointMake(57.69, 26.22)]; + [bezier32Path addLineToPoint: CGPointMake(57.86, 26.25)]; + [bezier32Path addLineToPoint: CGPointMake(58.03, 26.29)]; + [bezier32Path addLineToPoint: CGPointMake(58.22, 26.34)]; + [bezier32Path addLineToPoint: CGPointMake(58.39, 26.41)]; + [bezier32Path addLineToPoint: CGPointMake(58.57, 26.49)]; + [bezier32Path addLineToPoint: CGPointMake(58.74, 26.58)]; + [bezier32Path addLineToPoint: CGPointMake(58.9, 26.69)]; + [bezier32Path addLineToPoint: CGPointMake(59.04, 26.82)]; + [bezier32Path addLineToPoint: CGPointMake(59.17, 26.95)]; + [bezier32Path addLineToPoint: CGPointMake(59.29, 27.11)]; + [bezier32Path addLineToPoint: CGPointMake(59.37, 27.28)]; + [bezier32Path addLineToPoint: CGPointMake(59.43, 27.46)]; + [bezier32Path addLineToPoint: CGPointMake(59.47, 27.65)]; + [bezier32Path addLineToPoint: CGPointMake(59.47, 27.87)]; + [bezier32Path addLineToPoint: CGPointMake(59.44, 28.1)]; + [bezier32Path addLineToPoint: CGPointMake(58.85, 31.1)]; + [bezier32Path closePath]; + bezier32Path.miterLimit = 4; + + bezier32Path.usesEvenOddFillRule = YES; + + [color3 setFill]; + [bezier32Path fill]; + + + //// Bezier 33 Drawing + UIBezierPath* bezier33Path = [UIBezierPath bezierPath]; + [bezier33Path moveToPoint: CGPointMake(58.61, 32.41)]; + [bezier33Path addLineToPoint: CGPointMake(58.65, 32.37)]; + [bezier33Path addLineToPoint: CGPointMake(58.88, 31.11)]; + [bezier33Path addLineToPoint: CGPointMake(58.81, 31.1)]; + [bezier33Path addLineToPoint: CGPointMake(58.58, 32.36)]; + [bezier33Path addLineToPoint: CGPointMake(58.61, 32.33)]; + [bezier33Path addLineToPoint: CGPointMake(58.61, 32.41)]; + [bezier33Path addLineToPoint: CGPointMake(58.64, 32.4)]; + [bezier33Path addLineToPoint: CGPointMake(58.65, 32.37)]; + [bezier33Path addLineToPoint: CGPointMake(58.61, 32.41)]; + [bezier33Path closePath]; + bezier33Path.miterLimit = 4; + + bezier33Path.usesEvenOddFillRule = YES; + + [color3 setFill]; + [bezier33Path fill]; + + + //// Bezier 34 Drawing + UIBezierPath* bezier34Path = [UIBezierPath bezierPath]; + [bezier34Path moveToPoint: CGPointMake(57.15, 32.37)]; + [bezier34Path addLineToPoint: CGPointMake(57.18, 32.41)]; + [bezier34Path addLineToPoint: CGPointMake(58.61, 32.41)]; + [bezier34Path addLineToPoint: CGPointMake(58.61, 32.33)]; + [bezier34Path addLineToPoint: CGPointMake(57.18, 32.33)]; + [bezier34Path addLineToPoint: CGPointMake(57.22, 32.37)]; + [bezier34Path addLineToPoint: CGPointMake(57.15, 32.37)]; + [bezier34Path addLineToPoint: CGPointMake(57.14, 32.41)]; + [bezier34Path addLineToPoint: CGPointMake(57.18, 32.41)]; + [bezier34Path addLineToPoint: CGPointMake(57.15, 32.37)]; + [bezier34Path closePath]; + bezier34Path.miterLimit = 4; + + bezier34Path.usesEvenOddFillRule = YES; + + [color3 setFill]; + [bezier34Path fill]; + + + //// Bezier 35 Drawing + UIBezierPath* bezier35Path = [UIBezierPath bezierPath]; + [bezier35Path moveToPoint: CGPointMake(57.24, 31.73)]; + [bezier35Path addLineToPoint: CGPointMake(57.19, 31.69)]; + [bezier35Path addLineToPoint: CGPointMake(57.17, 31.78)]; + [bezier35Path addLineToPoint: CGPointMake(57.16, 31.93)]; + [bezier35Path addLineToPoint: CGPointMake(57.16, 32.13)]; + [bezier35Path addLineToPoint: CGPointMake(57.15, 32.37)]; + [bezier35Path addLineToPoint: CGPointMake(57.22, 32.37)]; + [bezier35Path addLineToPoint: CGPointMake(57.23, 32.13)]; + [bezier35Path addLineToPoint: CGPointMake(57.24, 31.93)]; + [bezier35Path addLineToPoint: CGPointMake(57.24, 31.78)]; + [bezier35Path addLineToPoint: CGPointMake(57.24, 31.73)]; + [bezier35Path addLineToPoint: CGPointMake(57.18, 31.69)]; + [bezier35Path addLineToPoint: CGPointMake(57.24, 31.73)]; + [bezier35Path closePath]; + bezier35Path.miterLimit = 4; + + bezier35Path.usesEvenOddFillRule = YES; + + [color3 setFill]; + [bezier35Path fill]; + + + //// Bezier 36 Drawing + UIBezierPath* bezier36Path = [UIBezierPath bezierPath]; + [bezier36Path moveToPoint: CGPointMake(55.03, 32.46)]; + [bezier36Path addLineToPoint: CGPointMake(55.03, 32.46)]; + [bezier36Path addLineToPoint: CGPointMake(55.19, 32.48)]; + [bezier36Path addLineToPoint: CGPointMake(55.34, 32.5)]; + [bezier36Path addLineToPoint: CGPointMake(55.5, 32.49)]; + [bezier36Path addLineToPoint: CGPointMake(55.66, 32.48)]; + [bezier36Path addLineToPoint: CGPointMake(55.83, 32.46)]; + [bezier36Path addLineToPoint: CGPointMake(55.99, 32.43)]; + [bezier36Path addLineToPoint: CGPointMake(56.15, 32.39)]; + [bezier36Path addLineToPoint: CGPointMake(56.31, 32.34)]; + [bezier36Path addLineToPoint: CGPointMake(56.45, 32.28)]; + [bezier36Path addLineToPoint: CGPointMake(56.6, 32.21)]; + [bezier36Path addLineToPoint: CGPointMake(56.73, 32.15)]; + [bezier36Path addLineToPoint: CGPointMake(56.85, 32.07)]; + [bezier36Path addLineToPoint: CGPointMake(56.97, 31.99)]; + [bezier36Path addLineToPoint: CGPointMake(57.08, 31.91)]; + [bezier36Path addLineToPoint: CGPointMake(57.17, 31.82)]; + [bezier36Path addLineToPoint: CGPointMake(57.24, 31.73)]; + [bezier36Path addLineToPoint: CGPointMake(57.18, 31.69)]; + [bezier36Path addLineToPoint: CGPointMake(57.11, 31.77)]; + [bezier36Path addLineToPoint: CGPointMake(57.03, 31.85)]; + [bezier36Path addLineToPoint: CGPointMake(56.93, 31.93)]; + [bezier36Path addLineToPoint: CGPointMake(56.82, 32.01)]; + [bezier36Path addLineToPoint: CGPointMake(56.7, 32.08)]; + [bezier36Path addLineToPoint: CGPointMake(56.56, 32.15)]; + [bezier36Path addLineToPoint: CGPointMake(56.43, 32.21)]; + [bezier36Path addLineToPoint: CGPointMake(56.29, 32.27)]; + [bezier36Path addLineToPoint: CGPointMake(56.14, 32.32)]; + [bezier36Path addLineToPoint: CGPointMake(55.98, 32.36)]; + [bezier36Path addLineToPoint: CGPointMake(55.82, 32.39)]; + [bezier36Path addLineToPoint: CGPointMake(55.66, 32.41)]; + [bezier36Path addLineToPoint: CGPointMake(55.5, 32.43)]; + [bezier36Path addLineToPoint: CGPointMake(55.34, 32.43)]; + [bezier36Path addLineToPoint: CGPointMake(55.19, 32.41)]; + [bezier36Path addLineToPoint: CGPointMake(55.04, 32.39)]; + [bezier36Path addLineToPoint: CGPointMake(55.03, 32.46)]; + [bezier36Path closePath]; + bezier36Path.miterLimit = 4; + + bezier36Path.usesEvenOddFillRule = YES; + + [color3 setFill]; + [bezier36Path fill]; + + + //// Bezier 37 Drawing + UIBezierPath* bezier37Path = [UIBezierPath bezierPath]; + [bezier37Path moveToPoint: CGPointMake(53.65, 30.73)]; + [bezier37Path addLineToPoint: CGPointMake(53.65, 30.73)]; + [bezier37Path addLineToPoint: CGPointMake(53.65, 30.86)]; + [bezier37Path addLineToPoint: CGPointMake(53.67, 30.98)]; + [bezier37Path addLineToPoint: CGPointMake(53.68, 31.12)]; + [bezier37Path addLineToPoint: CGPointMake(53.71, 31.25)]; + [bezier37Path addLineToPoint: CGPointMake(53.73, 31.38)]; + [bezier37Path addLineToPoint: CGPointMake(53.78, 31.51)]; + [bezier37Path addLineToPoint: CGPointMake(53.83, 31.64)]; + [bezier37Path addLineToPoint: CGPointMake(53.91, 31.76)]; + [bezier37Path addLineToPoint: CGPointMake(53.99, 31.88)]; + [bezier37Path addLineToPoint: CGPointMake(54.08, 31.99)]; + [bezier37Path addLineToPoint: CGPointMake(54.19, 32.09)]; + [bezier37Path addLineToPoint: CGPointMake(54.32, 32.19)]; + [bezier37Path addLineToPoint: CGPointMake(54.47, 32.28)]; + [bezier37Path addLineToPoint: CGPointMake(54.63, 32.35)]; + [bezier37Path addLineToPoint: CGPointMake(54.82, 32.41)]; + [bezier37Path addLineToPoint: CGPointMake(55.03, 32.46)]; + [bezier37Path addLineToPoint: CGPointMake(55.04, 32.39)]; + [bezier37Path addLineToPoint: CGPointMake(54.83, 32.34)]; + [bezier37Path addLineToPoint: CGPointMake(54.66, 32.28)]; + [bezier37Path addLineToPoint: CGPointMake(54.5, 32.21)]; + [bezier37Path addLineToPoint: CGPointMake(54.36, 32.13)]; + [bezier37Path addLineToPoint: CGPointMake(54.24, 32.04)]; + [bezier37Path addLineToPoint: CGPointMake(54.13, 31.94)]; + [bezier37Path addLineToPoint: CGPointMake(54.04, 31.83)]; + [bezier37Path addLineToPoint: CGPointMake(53.96, 31.72)]; + [bezier37Path addLineToPoint: CGPointMake(53.9, 31.61)]; + [bezier37Path addLineToPoint: CGPointMake(53.85, 31.49)]; + [bezier37Path addLineToPoint: CGPointMake(53.8, 31.37)]; + [bezier37Path addLineToPoint: CGPointMake(53.77, 31.24)]; + [bezier37Path addLineToPoint: CGPointMake(53.75, 31.11)]; + [bezier37Path addLineToPoint: CGPointMake(53.73, 30.98)]; + [bezier37Path addLineToPoint: CGPointMake(53.72, 30.86)]; + [bezier37Path addLineToPoint: CGPointMake(53.73, 30.73)]; + [bezier37Path addLineToPoint: CGPointMake(53.65, 30.73)]; + [bezier37Path closePath]; + bezier37Path.miterLimit = 4; + + bezier37Path.usesEvenOddFillRule = YES; + + [color3 setFill]; + [bezier37Path fill]; + + + //// Bezier 38 Drawing + UIBezierPath* bezier38Path = [UIBezierPath bezierPath]; + [bezier38Path moveToPoint: CGPointMake(55.69, 28.55)]; + [bezier38Path addLineToPoint: CGPointMake(55.69, 28.55)]; + [bezier38Path addLineToPoint: CGPointMake(55.49, 28.58)]; + [bezier38Path addLineToPoint: CGPointMake(55.3, 28.63)]; + [bezier38Path addLineToPoint: CGPointMake(55.11, 28.7)]; + [bezier38Path addLineToPoint: CGPointMake(54.93, 28.78)]; + [bezier38Path addLineToPoint: CGPointMake(54.75, 28.87)]; + [bezier38Path addLineToPoint: CGPointMake(54.58, 28.98)]; + [bezier38Path addLineToPoint: CGPointMake(54.43, 29.1)]; + [bezier38Path addLineToPoint: CGPointMake(54.28, 29.24)]; + [bezier38Path addLineToPoint: CGPointMake(54.14, 29.38)]; + [bezier38Path addLineToPoint: CGPointMake(54.02, 29.54)]; + [bezier38Path addLineToPoint: CGPointMake(53.91, 29.71)]; + [bezier38Path addLineToPoint: CGPointMake(53.83, 29.9)]; + [bezier38Path addLineToPoint: CGPointMake(53.75, 30.09)]; + [bezier38Path addLineToPoint: CGPointMake(53.7, 30.3)]; + [bezier38Path addLineToPoint: CGPointMake(53.67, 30.51)]; + [bezier38Path addLineToPoint: CGPointMake(53.65, 30.73)]; + [bezier38Path addLineToPoint: CGPointMake(53.73, 30.73)]; + [bezier38Path addLineToPoint: CGPointMake(53.73, 30.51)]; + [bezier38Path addLineToPoint: CGPointMake(53.77, 30.31)]; + [bezier38Path addLineToPoint: CGPointMake(53.82, 30.11)]; + [bezier38Path addLineToPoint: CGPointMake(53.89, 29.92)]; + [bezier38Path addLineToPoint: CGPointMake(53.98, 29.74)]; + [bezier38Path addLineToPoint: CGPointMake(54.08, 29.58)]; + [bezier38Path addLineToPoint: CGPointMake(54.2, 29.42)]; + [bezier38Path addLineToPoint: CGPointMake(54.33, 29.28)]; + [bezier38Path addLineToPoint: CGPointMake(54.47, 29.16)]; + [bezier38Path addLineToPoint: CGPointMake(54.63, 29.04)]; + [bezier38Path addLineToPoint: CGPointMake(54.79, 28.94)]; + [bezier38Path addLineToPoint: CGPointMake(54.96, 28.84)]; + [bezier38Path addLineToPoint: CGPointMake(55.13, 28.76)]; + [bezier38Path addLineToPoint: CGPointMake(55.32, 28.7)]; + [bezier38Path addLineToPoint: CGPointMake(55.51, 28.65)]; + [bezier38Path addLineToPoint: CGPointMake(55.69, 28.62)]; + [bezier38Path addLineToPoint: CGPointMake(55.69, 28.55)]; + [bezier38Path closePath]; + bezier38Path.miterLimit = 4; + + bezier38Path.usesEvenOddFillRule = YES; + + [color3 setFill]; + [bezier38Path fill]; + + + //// Bezier 39 Drawing + UIBezierPath* bezier39Path = [UIBezierPath bezierPath]; + [bezier39Path moveToPoint: CGPointMake(56.87, 28.43)]; + [bezier39Path addLineToPoint: CGPointMake(56.8, 28.43)]; + [bezier39Path addLineToPoint: CGPointMake(56.72, 28.44)]; + [bezier39Path addLineToPoint: CGPointMake(56.64, 28.45)]; + [bezier39Path addLineToPoint: CGPointMake(56.55, 28.45)]; + [bezier39Path addLineToPoint: CGPointMake(56.46, 28.46)]; + [bezier39Path addLineToPoint: CGPointMake(56.36, 28.47)]; + [bezier39Path addLineToPoint: CGPointMake(56.26, 28.48)]; + [bezier39Path addLineToPoint: CGPointMake(56.16, 28.49)]; + [bezier39Path addLineToPoint: CGPointMake(56.07, 28.5)]; + [bezier39Path addLineToPoint: CGPointMake(55.98, 28.51)]; + [bezier39Path addLineToPoint: CGPointMake(55.9, 28.52)]; + [bezier39Path addLineToPoint: CGPointMake(55.83, 28.53)]; + [bezier39Path addLineToPoint: CGPointMake(55.77, 28.54)]; + [bezier39Path addLineToPoint: CGPointMake(55.73, 28.54)]; + [bezier39Path addLineToPoint: CGPointMake(55.7, 28.55)]; + [bezier39Path addLineToPoint: CGPointMake(55.69, 28.55)]; + [bezier39Path addLineToPoint: CGPointMake(55.69, 28.62)]; + [bezier39Path addLineToPoint: CGPointMake(55.7, 28.62)]; + [bezier39Path addLineToPoint: CGPointMake(55.74, 28.61)]; + [bezier39Path addLineToPoint: CGPointMake(55.77, 28.6)]; + [bezier39Path addLineToPoint: CGPointMake(55.83, 28.6)]; + [bezier39Path addLineToPoint: CGPointMake(55.9, 28.59)]; + [bezier39Path addLineToPoint: CGPointMake(55.98, 28.58)]; + [bezier39Path addLineToPoint: CGPointMake(56.07, 28.57)]; + [bezier39Path addLineToPoint: CGPointMake(56.16, 28.56)]; + [bezier39Path addLineToPoint: CGPointMake(56.26, 28.55)]; + [bezier39Path addLineToPoint: CGPointMake(56.36, 28.54)]; + [bezier39Path addLineToPoint: CGPointMake(56.46, 28.53)]; + [bezier39Path addLineToPoint: CGPointMake(56.55, 28.52)]; + [bezier39Path addLineToPoint: CGPointMake(56.64, 28.51)]; + [bezier39Path addLineToPoint: CGPointMake(56.72, 28.51)]; + [bezier39Path addLineToPoint: CGPointMake(56.87, 28.51)]; + [bezier39Path addLineToPoint: CGPointMake(56.87, 28.43)]; + [bezier39Path closePath]; + bezier39Path.miterLimit = 4; + + bezier39Path.usesEvenOddFillRule = YES; + + [color3 setFill]; + [bezier39Path fill]; + + + //// Bezier 40 Drawing + UIBezierPath* bezier40Path = [UIBezierPath bezierPath]; + [bezier40Path moveToPoint: CGPointMake(57.63, 28.49)]; + [bezier40Path addLineToPoint: CGPointMake(57.67, 28.46)]; + [bezier40Path addLineToPoint: CGPointMake(57.65, 28.46)]; + [bezier40Path addLineToPoint: CGPointMake(57.59, 28.46)]; + [bezier40Path addLineToPoint: CGPointMake(57.5, 28.45)]; + [bezier40Path addLineToPoint: CGPointMake(57.4, 28.44)]; + [bezier40Path addLineToPoint: CGPointMake(57.14, 28.44)]; + [bezier40Path addLineToPoint: CGPointMake(57, 28.43)]; + [bezier40Path addLineToPoint: CGPointMake(56.87, 28.43)]; + [bezier40Path addLineToPoint: CGPointMake(56.87, 28.51)]; + [bezier40Path addLineToPoint: CGPointMake(57.14, 28.51)]; + [bezier40Path addLineToPoint: CGPointMake(57.27, 28.52)]; + [bezier40Path addLineToPoint: CGPointMake(57.5, 28.52)]; + [bezier40Path addLineToPoint: CGPointMake(57.59, 28.52)]; + [bezier40Path addLineToPoint: CGPointMake(57.65, 28.53)]; + [bezier40Path addLineToPoint: CGPointMake(57.67, 28.53)]; + [bezier40Path addLineToPoint: CGPointMake(57.7, 28.5)]; + [bezier40Path addLineToPoint: CGPointMake(57.67, 28.53)]; + [bezier40Path addLineToPoint: CGPointMake(57.7, 28.54)]; + [bezier40Path addLineToPoint: CGPointMake(57.7, 28.5)]; + [bezier40Path addLineToPoint: CGPointMake(57.63, 28.49)]; + [bezier40Path closePath]; + bezier40Path.miterLimit = 4; + + bezier40Path.usesEvenOddFillRule = YES; + + [color3 setFill]; + [bezier40Path fill]; + + + //// Bezier 41 Drawing + UIBezierPath* bezier41Path = [UIBezierPath bezierPath]; + [bezier41Path moveToPoint: CGPointMake(57.69, 28.13)]; + [bezier41Path addLineToPoint: CGPointMake(57.69, 28.13)]; + [bezier41Path addLineToPoint: CGPointMake(57.68, 28.23)]; + [bezier41Path addLineToPoint: CGPointMake(57.66, 28.35)]; + [bezier41Path addLineToPoint: CGPointMake(57.65, 28.45)]; + [bezier41Path addLineToPoint: CGPointMake(57.63, 28.49)]; + [bezier41Path addLineToPoint: CGPointMake(57.7, 28.5)]; + [bezier41Path addLineToPoint: CGPointMake(57.71, 28.46)]; + [bezier41Path addLineToPoint: CGPointMake(57.73, 28.36)]; + [bezier41Path addLineToPoint: CGPointMake(57.75, 28.23)]; + [bezier41Path addLineToPoint: CGPointMake(57.77, 28.13)]; + [bezier41Path addLineToPoint: CGPointMake(57.69, 28.13)]; + [bezier41Path closePath]; + bezier41Path.miterLimit = 4; + + bezier41Path.usesEvenOddFillRule = YES; + + [color3 setFill]; + [bezier41Path fill]; + + + //// Bezier 42 Drawing + UIBezierPath* bezier42Path = [UIBezierPath bezierPath]; + [bezier42Path moveToPoint: CGPointMake(57.01, 27.56)]; + [bezier42Path addLineToPoint: CGPointMake(57.01, 27.57)]; + [bezier42Path addLineToPoint: CGPointMake(57.14, 27.57)]; + [bezier42Path addLineToPoint: CGPointMake(57.26, 27.61)]; + [bezier42Path addLineToPoint: CGPointMake(57.38, 27.66)]; + [bezier42Path addLineToPoint: CGPointMake(57.48, 27.73)]; + [bezier42Path addLineToPoint: CGPointMake(57.55, 27.81)]; + [bezier42Path addLineToPoint: CGPointMake(57.62, 27.9)]; + [bezier42Path addLineToPoint: CGPointMake(57.67, 28.01)]; + [bezier42Path addLineToPoint: CGPointMake(57.69, 28.13)]; + [bezier42Path addLineToPoint: CGPointMake(57.76, 28.13)]; + [bezier42Path addLineToPoint: CGPointMake(57.74, 28)]; + [bezier42Path addLineToPoint: CGPointMake(57.69, 27.87)]; + [bezier42Path addLineToPoint: CGPointMake(57.61, 27.76)]; + [bezier42Path addLineToPoint: CGPointMake(57.52, 27.67)]; + [bezier42Path addLineToPoint: CGPointMake(57.41, 27.59)]; + [bezier42Path addLineToPoint: CGPointMake(57.29, 27.54)]; + [bezier42Path addLineToPoint: CGPointMake(57.16, 27.51)]; + [bezier42Path addLineToPoint: CGPointMake(57.01, 27.49)]; + [bezier42Path addLineToPoint: CGPointMake(57.01, 27.56)]; + [bezier42Path closePath]; + bezier42Path.miterLimit = 4; + + bezier42Path.usesEvenOddFillRule = YES; + + [color3 setFill]; + [bezier42Path fill]; + + + //// Bezier 43 Drawing + UIBezierPath* bezier43Path = [UIBezierPath bezierPath]; + [bezier43Path moveToPoint: CGPointMake(54.57, 27.84)]; + [bezier43Path addLineToPoint: CGPointMake(54.63, 27.87)]; + [bezier43Path addLineToPoint: CGPointMake(54.69, 27.84)]; + [bezier43Path addLineToPoint: CGPointMake(54.76, 27.8)]; + [bezier43Path addLineToPoint: CGPointMake(54.86, 27.77)]; + [bezier43Path addLineToPoint: CGPointMake(54.98, 27.73)]; + [bezier43Path addLineToPoint: CGPointMake(55.12, 27.71)]; + [bezier43Path addLineToPoint: CGPointMake(55.27, 27.68)]; + [bezier43Path addLineToPoint: CGPointMake(55.43, 27.65)]; + [bezier43Path addLineToPoint: CGPointMake(55.6, 27.63)]; + [bezier43Path addLineToPoint: CGPointMake(55.77, 27.6)]; + [bezier43Path addLineToPoint: CGPointMake(55.95, 27.59)]; + [bezier43Path addLineToPoint: CGPointMake(56.14, 27.57)]; + [bezier43Path addLineToPoint: CGPointMake(56.32, 27.56)]; + [bezier43Path addLineToPoint: CGPointMake(56.85, 27.56)]; + [bezier43Path addLineToPoint: CGPointMake(57.01, 27.56)]; + [bezier43Path addLineToPoint: CGPointMake(57.01, 27.49)]; + [bezier43Path addLineToPoint: CGPointMake(56.85, 27.49)]; + [bezier43Path addLineToPoint: CGPointMake(56.68, 27.48)]; + [bezier43Path addLineToPoint: CGPointMake(56.51, 27.48)]; + [bezier43Path addLineToPoint: CGPointMake(56.32, 27.49)]; + [bezier43Path addLineToPoint: CGPointMake(56.14, 27.5)]; + [bezier43Path addLineToPoint: CGPointMake(55.95, 27.52)]; + [bezier43Path addLineToPoint: CGPointMake(55.77, 27.53)]; + [bezier43Path addLineToPoint: CGPointMake(55.6, 27.56)]; + [bezier43Path addLineToPoint: CGPointMake(55.42, 27.58)]; + [bezier43Path addLineToPoint: CGPointMake(55.25, 27.61)]; + [bezier43Path addLineToPoint: CGPointMake(55.11, 27.64)]; + [bezier43Path addLineToPoint: CGPointMake(54.97, 27.67)]; + [bezier43Path addLineToPoint: CGPointMake(54.84, 27.7)]; + [bezier43Path addLineToPoint: CGPointMake(54.74, 27.73)]; + [bezier43Path addLineToPoint: CGPointMake(54.65, 27.77)]; + [bezier43Path addLineToPoint: CGPointMake(54.58, 27.81)]; + [bezier43Path addLineToPoint: CGPointMake(54.64, 27.85)]; + [bezier43Path addLineToPoint: CGPointMake(54.57, 27.84)]; + [bezier43Path closePath]; + bezier43Path.miterLimit = 4; + + bezier43Path.usesEvenOddFillRule = YES; + + [color3 setFill]; + [bezier43Path fill]; + + + //// Bezier 44 Drawing + UIBezierPath* bezier44Path = [UIBezierPath bezierPath]; + [bezier44Path moveToPoint: CGPointMake(54.99, 26.44)]; + [bezier44Path addLineToPoint: CGPointMake(54.97, 26.46)]; + [bezier44Path addLineToPoint: CGPointMake(54.57, 27.84)]; + [bezier44Path addLineToPoint: CGPointMake(54.64, 27.85)]; + [bezier44Path addLineToPoint: CGPointMake(55.04, 26.48)]; + [bezier44Path addLineToPoint: CGPointMake(55.02, 26.5)]; + [bezier44Path addLineToPoint: CGPointMake(54.99, 26.44)]; + [bezier44Path addLineToPoint: CGPointMake(54.98, 26.44)]; + [bezier44Path addLineToPoint: CGPointMake(54.97, 26.46)]; + [bezier44Path addLineToPoint: CGPointMake(54.99, 26.44)]; + [bezier44Path closePath]; + bezier44Path.miterLimit = 4; + + bezier44Path.usesEvenOddFillRule = YES; + + [color3 setFill]; + [bezier44Path fill]; + + + //// Bezier 45 Drawing + UIBezierPath* bezier45Path = [UIBezierPath bezierPath]; + [bezier45Path moveToPoint: CGPointMake(57.53, 26.17)]; + [bezier45Path addLineToPoint: CGPointMake(57.53, 26.17)]; + [bezier45Path addLineToPoint: CGPointMake(57.33, 26.16)]; + [bezier45Path addLineToPoint: CGPointMake(57.14, 26.16)]; + [bezier45Path addLineToPoint: CGPointMake(56.6, 26.16)]; + [bezier45Path addLineToPoint: CGPointMake(56.44, 26.17)]; + [bezier45Path addLineToPoint: CGPointMake(56.27, 26.17)]; + [bezier45Path addLineToPoint: CGPointMake(56.11, 26.19)]; + [bezier45Path addLineToPoint: CGPointMake(55.96, 26.2)]; + [bezier45Path addLineToPoint: CGPointMake(55.81, 26.22)]; + [bezier45Path addLineToPoint: CGPointMake(55.66, 26.24)]; + [bezier45Path addLineToPoint: CGPointMake(55.52, 26.27)]; + [bezier45Path addLineToPoint: CGPointMake(55.39, 26.3)]; + [bezier45Path addLineToPoint: CGPointMake(55.25, 26.34)]; + [bezier45Path addLineToPoint: CGPointMake(55.12, 26.38)]; + [bezier45Path addLineToPoint: CGPointMake(54.99, 26.44)]; + [bezier45Path addLineToPoint: CGPointMake(55.02, 26.5)]; + [bezier45Path addLineToPoint: CGPointMake(55.14, 26.45)]; + [bezier45Path addLineToPoint: CGPointMake(55.27, 26.41)]; + [bezier45Path addLineToPoint: CGPointMake(55.4, 26.37)]; + [bezier45Path addLineToPoint: CGPointMake(55.53, 26.34)]; + [bezier45Path addLineToPoint: CGPointMake(55.68, 26.31)]; + [bezier45Path addLineToPoint: CGPointMake(55.82, 26.29)]; + [bezier45Path addLineToPoint: CGPointMake(55.96, 26.26)]; + [bezier45Path addLineToPoint: CGPointMake(56.11, 26.25)]; + [bezier45Path addLineToPoint: CGPointMake(56.27, 26.24)]; + [bezier45Path addLineToPoint: CGPointMake(56.44, 26.24)]; + [bezier45Path addLineToPoint: CGPointMake(57.14, 26.24)]; + [bezier45Path addLineToPoint: CGPointMake(57.33, 26.24)]; + [bezier45Path addLineToPoint: CGPointMake(57.53, 26.24)]; + [bezier45Path addLineToPoint: CGPointMake(57.53, 26.17)]; + [bezier45Path closePath]; + bezier45Path.miterLimit = 4; + + bezier45Path.usesEvenOddFillRule = YES; + + [color3 setFill]; + [bezier45Path fill]; + + + //// Bezier 46 Drawing + UIBezierPath* bezier46Path = [UIBezierPath bezierPath]; + [bezier46Path moveToPoint: CGPointMake(59.48, 28.1)]; + [bezier46Path addLineToPoint: CGPointMake(59.48, 28.1)]; + [bezier46Path addLineToPoint: CGPointMake(59.51, 27.87)]; + [bezier46Path addLineToPoint: CGPointMake(59.51, 27.65)]; + [bezier46Path addLineToPoint: CGPointMake(59.47, 27.45)]; + [bezier46Path addLineToPoint: CGPointMake(59.41, 27.27)]; + [bezier46Path addLineToPoint: CGPointMake(59.31, 27.09)]; + [bezier46Path addLineToPoint: CGPointMake(59.2, 26.93)]; + [bezier46Path addLineToPoint: CGPointMake(59.06, 26.79)]; + [bezier46Path addLineToPoint: CGPointMake(58.92, 26.66)]; + [bezier46Path addLineToPoint: CGPointMake(58.76, 26.55)]; + [bezier46Path addLineToPoint: CGPointMake(58.59, 26.45)]; + [bezier46Path addLineToPoint: CGPointMake(58.4, 26.37)]; + [bezier46Path addLineToPoint: CGPointMake(58.23, 26.3)]; + [bezier46Path addLineToPoint: CGPointMake(58.04, 26.25)]; + [bezier46Path addLineToPoint: CGPointMake(57.86, 26.21)]; + [bezier46Path addLineToPoint: CGPointMake(57.69, 26.19)]; + [bezier46Path addLineToPoint: CGPointMake(57.53, 26.17)]; + [bezier46Path addLineToPoint: CGPointMake(57.53, 26.24)]; + [bezier46Path addLineToPoint: CGPointMake(57.69, 26.25)]; + [bezier46Path addLineToPoint: CGPointMake(57.85, 26.28)]; + [bezier46Path addLineToPoint: CGPointMake(58.03, 26.32)]; + [bezier46Path addLineToPoint: CGPointMake(58.2, 26.37)]; + [bezier46Path addLineToPoint: CGPointMake(58.38, 26.44)]; + [bezier46Path addLineToPoint: CGPointMake(58.55, 26.52)]; + [bezier46Path addLineToPoint: CGPointMake(58.72, 26.61)]; + [bezier46Path addLineToPoint: CGPointMake(58.88, 26.72)]; + [bezier46Path addLineToPoint: CGPointMake(59.02, 26.85)]; + [bezier46Path addLineToPoint: CGPointMake(59.14, 26.98)]; + [bezier46Path addLineToPoint: CGPointMake(59.26, 27.12)]; + [bezier46Path addLineToPoint: CGPointMake(59.34, 27.29)]; + [bezier46Path addLineToPoint: CGPointMake(59.4, 27.47)]; + [bezier46Path addLineToPoint: CGPointMake(59.44, 27.65)]; + [bezier46Path addLineToPoint: CGPointMake(59.44, 27.87)]; + [bezier46Path addLineToPoint: CGPointMake(59.41, 28.09)]; + [bezier46Path addLineToPoint: CGPointMake(59.48, 28.1)]; + [bezier46Path closePath]; + bezier46Path.miterLimit = 4; + + bezier46Path.usesEvenOddFillRule = YES; + + [color3 setFill]; + [bezier46Path fill]; + + + //// Bezier 47 Drawing + UIBezierPath* bezier47Path = [UIBezierPath bezierPath]; + [bezier47Path moveToPoint: CGPointMake(58.88, 31.11)]; + [bezier47Path addLineToPoint: CGPointMake(58.88, 31.11)]; + [bezier47Path addLineToPoint: CGPointMake(59.48, 28.1)]; + [bezier47Path addLineToPoint: CGPointMake(59.41, 28.09)]; + [bezier47Path addLineToPoint: CGPointMake(58.81, 31.1)]; + [bezier47Path addLineToPoint: CGPointMake(58.88, 31.11)]; + [bezier47Path closePath]; + bezier47Path.miterLimit = 4; + + bezier47Path.usesEvenOddFillRule = YES; + + [color3 setFill]; + [bezier47Path fill]; + + + //// Bezier 48 Drawing + UIBezierPath* bezier48Path = [UIBezierPath bezierPath]; + [bezier48Path moveToPoint: CGPointMake(57.47, 29.62)]; + [bezier48Path addLineToPoint: CGPointMake(57.46, 29.58)]; + [bezier48Path addLineToPoint: CGPointMake(57.44, 29.56)]; + [bezier48Path addLineToPoint: CGPointMake(57.4, 29.54)]; + [bezier48Path addLineToPoint: CGPointMake(57.34, 29.52)]; + [bezier48Path addLineToPoint: CGPointMake(57.28, 29.52)]; + [bezier48Path addLineToPoint: CGPointMake(57.2, 29.51)]; + [bezier48Path addLineToPoint: CGPointMake(57.12, 29.51)]; + [bezier48Path addLineToPoint: CGPointMake(57.03, 29.52)]; + [bezier48Path addLineToPoint: CGPointMake(56.94, 29.53)]; + [bezier48Path addLineToPoint: CGPointMake(56.85, 29.54)]; + [bezier48Path addLineToPoint: CGPointMake(56.76, 29.55)]; + [bezier48Path addLineToPoint: CGPointMake(56.67, 29.56)]; + [bezier48Path addLineToPoint: CGPointMake(56.59, 29.58)]; + [bezier48Path addLineToPoint: CGPointMake(56.51, 29.59)]; + [bezier48Path addLineToPoint: CGPointMake(56.44, 29.61)]; + [bezier48Path addLineToPoint: CGPointMake(56.38, 29.62)]; + [bezier48Path addLineToPoint: CGPointMake(56.34, 29.62)]; + [bezier48Path addLineToPoint: CGPointMake(56.3, 29.64)]; + [bezier48Path addLineToPoint: CGPointMake(56.24, 29.66)]; + [bezier48Path addLineToPoint: CGPointMake(56.18, 29.68)]; + [bezier48Path addLineToPoint: CGPointMake(56.1, 29.71)]; + [bezier48Path addLineToPoint: CGPointMake(56.03, 29.75)]; + [bezier48Path addLineToPoint: CGPointMake(55.95, 29.79)]; + [bezier48Path addLineToPoint: CGPointMake(55.88, 29.84)]; + [bezier48Path addLineToPoint: CGPointMake(55.81, 29.89)]; + [bezier48Path addLineToPoint: CGPointMake(55.73, 29.95)]; + [bezier48Path addLineToPoint: CGPointMake(55.67, 30.02)]; + [bezier48Path addLineToPoint: CGPointMake(55.61, 30.09)]; + [bezier48Path addLineToPoint: CGPointMake(55.56, 30.17)]; + [bezier48Path addLineToPoint: CGPointMake(55.52, 30.26)]; + [bezier48Path addLineToPoint: CGPointMake(55.48, 30.35)]; + [bezier48Path addLineToPoint: CGPointMake(55.47, 30.44)]; + [bezier48Path addLineToPoint: CGPointMake(55.46, 30.64)]; + [bezier48Path addLineToPoint: CGPointMake(55.49, 30.79)]; + [bezier48Path addLineToPoint: CGPointMake(55.53, 30.9)]; + [bezier48Path addLineToPoint: CGPointMake(55.6, 30.99)]; + [bezier48Path addLineToPoint: CGPointMake(55.69, 31.05)]; + [bezier48Path addLineToPoint: CGPointMake(55.78, 31.08)]; + [bezier48Path addLineToPoint: CGPointMake(55.88, 31.1)]; + [bezier48Path addLineToPoint: CGPointMake(55.98, 31.1)]; + [bezier48Path addLineToPoint: CGPointMake(56.15, 31.1)]; + [bezier48Path addLineToPoint: CGPointMake(56.31, 31.08)]; + [bezier48Path addLineToPoint: CGPointMake(56.46, 31.05)]; + [bezier48Path addLineToPoint: CGPointMake(56.59, 31.01)]; + [bezier48Path addLineToPoint: CGPointMake(56.71, 30.97)]; + [bezier48Path addLineToPoint: CGPointMake(56.82, 30.92)]; + [bezier48Path addLineToPoint: CGPointMake(56.92, 30.86)]; + [bezier48Path addLineToPoint: CGPointMake(57.01, 30.79)]; + [bezier48Path addLineToPoint: CGPointMake(57.09, 30.73)]; + [bezier48Path addLineToPoint: CGPointMake(57.16, 30.65)]; + [bezier48Path addLineToPoint: CGPointMake(57.22, 30.59)]; + [bezier48Path addLineToPoint: CGPointMake(57.28, 30.51)]; + [bezier48Path addLineToPoint: CGPointMake(57.32, 30.44)]; + [bezier48Path addLineToPoint: CGPointMake(57.34, 30.38)]; + [bezier48Path addLineToPoint: CGPointMake(57.37, 30.31)]; + [bezier48Path addLineToPoint: CGPointMake(57.38, 30.24)]; + [bezier48Path addLineToPoint: CGPointMake(57.41, 30.08)]; + [bezier48Path addLineToPoint: CGPointMake(57.44, 29.92)]; + [bezier48Path addLineToPoint: CGPointMake(57.46, 29.76)]; + [bezier48Path addLineToPoint: CGPointMake(57.47, 29.62)]; + [bezier48Path closePath]; + bezier48Path.miterLimit = 4; + + bezier48Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier48Path fill]; + + + //// Bezier 49 Drawing + UIBezierPath* bezier49Path = [UIBezierPath bezierPath]; + [bezier49Path moveToPoint: CGPointMake(59.27, 32.37)]; + [bezier49Path addLineToPoint: CGPointMake(60.88, 32.37)]; + [bezier49Path addLineToPoint: CGPointMake(61.46, 29.13)]; + [bezier49Path addLineToPoint: CGPointMake(61.48, 29)]; + [bezier49Path addLineToPoint: CGPointMake(61.51, 28.88)]; + [bezier49Path addLineToPoint: CGPointMake(61.55, 28.75)]; + [bezier49Path addLineToPoint: CGPointMake(61.59, 28.63)]; + [bezier49Path addLineToPoint: CGPointMake(61.65, 28.5)]; + [bezier49Path addLineToPoint: CGPointMake(61.72, 28.38)]; + [bezier49Path addLineToPoint: CGPointMake(61.79, 28.27)]; + [bezier49Path addLineToPoint: CGPointMake(61.88, 28.16)]; + [bezier49Path addLineToPoint: CGPointMake(61.98, 28.06)]; + [bezier49Path addLineToPoint: CGPointMake(62.1, 27.97)]; + [bezier49Path addLineToPoint: CGPointMake(62.23, 27.89)]; + [bezier49Path addLineToPoint: CGPointMake(62.38, 27.82)]; + [bezier49Path addLineToPoint: CGPointMake(62.54, 27.76)]; + [bezier49Path addLineToPoint: CGPointMake(62.72, 27.72)]; + [bezier49Path addLineToPoint: CGPointMake(62.92, 27.68)]; + [bezier49Path addLineToPoint: CGPointMake(63.15, 27.67)]; + [bezier49Path addLineToPoint: CGPointMake(63.29, 27.67)]; + [bezier49Path addLineToPoint: CGPointMake(63.54, 26.21)]; + [bezier49Path addLineToPoint: CGPointMake(63.38, 26.22)]; + [bezier49Path addLineToPoint: CGPointMake(63.23, 26.24)]; + [bezier49Path addLineToPoint: CGPointMake(63.09, 26.26)]; + [bezier49Path addLineToPoint: CGPointMake(62.95, 26.3)]; + [bezier49Path addLineToPoint: CGPointMake(62.83, 26.35)]; + [bezier49Path addLineToPoint: CGPointMake(62.71, 26.41)]; + [bezier49Path addLineToPoint: CGPointMake(62.59, 26.47)]; + [bezier49Path addLineToPoint: CGPointMake(62.49, 26.54)]; + [bezier49Path addLineToPoint: CGPointMake(62.38, 26.62)]; + [bezier49Path addLineToPoint: CGPointMake(62.29, 26.7)]; + [bezier49Path addLineToPoint: CGPointMake(62.19, 26.79)]; + [bezier49Path addLineToPoint: CGPointMake(62.1, 26.88)]; + [bezier49Path addLineToPoint: CGPointMake(62.02, 26.98)]; + [bezier49Path addLineToPoint: CGPointMake(61.93, 27.08)]; + [bezier49Path addLineToPoint: CGPointMake(61.85, 27.19)]; + [bezier49Path addLineToPoint: CGPointMake(61.77, 27.3)]; + [bezier49Path addLineToPoint: CGPointMake(61.94, 26.27)]; + [bezier49Path addLineToPoint: CGPointMake(60.34, 26.27)]; + [bezier49Path addLineToPoint: CGPointMake(59.27, 32.37)]; + [bezier49Path closePath]; + bezier49Path.miterLimit = 4; + + bezier49Path.usesEvenOddFillRule = YES; + + [color3 setFill]; + [bezier49Path fill]; + + + //// Bezier 50 Drawing + UIBezierPath* bezier50Path = [UIBezierPath bezierPath]; + [bezier50Path moveToPoint: CGPointMake(59.27, 32.37)]; + [bezier50Path addLineToPoint: CGPointMake(60.88, 32.37)]; + [bezier50Path addLineToPoint: CGPointMake(61.46, 29.13)]; + [bezier50Path addLineToPoint: CGPointMake(61.48, 29)]; + [bezier50Path addLineToPoint: CGPointMake(61.51, 28.88)]; + [bezier50Path addLineToPoint: CGPointMake(61.55, 28.75)]; + [bezier50Path addLineToPoint: CGPointMake(61.59, 28.63)]; + [bezier50Path addLineToPoint: CGPointMake(61.65, 28.5)]; + [bezier50Path addLineToPoint: CGPointMake(61.72, 28.38)]; + [bezier50Path addLineToPoint: CGPointMake(61.79, 28.27)]; + [bezier50Path addLineToPoint: CGPointMake(61.88, 28.16)]; + [bezier50Path addLineToPoint: CGPointMake(61.98, 28.06)]; + [bezier50Path addLineToPoint: CGPointMake(62.1, 27.97)]; + [bezier50Path addLineToPoint: CGPointMake(62.23, 27.89)]; + [bezier50Path addLineToPoint: CGPointMake(62.38, 27.82)]; + [bezier50Path addLineToPoint: CGPointMake(62.54, 27.76)]; + [bezier50Path addLineToPoint: CGPointMake(62.72, 27.72)]; + [bezier50Path addLineToPoint: CGPointMake(62.92, 27.68)]; + [bezier50Path addLineToPoint: CGPointMake(63.15, 27.67)]; + [bezier50Path addLineToPoint: CGPointMake(63.29, 27.67)]; + [bezier50Path addLineToPoint: CGPointMake(63.54, 26.21)]; + [bezier50Path addLineToPoint: CGPointMake(63.38, 26.22)]; + [bezier50Path addLineToPoint: CGPointMake(63.23, 26.24)]; + [bezier50Path addLineToPoint: CGPointMake(63.09, 26.26)]; + [bezier50Path addLineToPoint: CGPointMake(62.95, 26.3)]; + [bezier50Path addLineToPoint: CGPointMake(62.83, 26.35)]; + [bezier50Path addLineToPoint: CGPointMake(62.71, 26.41)]; + [bezier50Path addLineToPoint: CGPointMake(62.59, 26.47)]; + [bezier50Path addLineToPoint: CGPointMake(62.49, 26.54)]; + [bezier50Path addLineToPoint: CGPointMake(62.38, 26.62)]; + [bezier50Path addLineToPoint: CGPointMake(62.29, 26.7)]; + [bezier50Path addLineToPoint: CGPointMake(62.19, 26.79)]; + [bezier50Path addLineToPoint: CGPointMake(62.1, 26.88)]; + [bezier50Path addLineToPoint: CGPointMake(62.02, 26.98)]; + [bezier50Path addLineToPoint: CGPointMake(61.93, 27.08)]; + [bezier50Path addLineToPoint: CGPointMake(61.85, 27.19)]; + [bezier50Path addLineToPoint: CGPointMake(61.77, 27.3)]; + [bezier50Path addLineToPoint: CGPointMake(61.94, 26.27)]; + [bezier50Path addLineToPoint: CGPointMake(60.34, 26.27)]; + [bezier50Path addLineToPoint: CGPointMake(59.27, 32.37)]; + [bezier50Path closePath]; + bezier50Path.miterLimit = 4; + + bezier50Path.usesEvenOddFillRule = YES; + + [color3 setStroke]; + bezier50Path.lineWidth = 0.5; + [bezier50Path stroke]; + + + //// Bezier 51 Drawing + UIBezierPath* bezier51Path = [UIBezierPath bezierPath]; + [bezier51Path moveToPoint: CGPointMake(44.2, 32.37)]; + [bezier51Path addLineToPoint: CGPointMake(45.83, 32.37)]; + [bezier51Path addLineToPoint: CGPointMake(46.38, 29.13)]; + [bezier51Path addLineToPoint: CGPointMake(46.4, 29)]; + [bezier51Path addLineToPoint: CGPointMake(46.46, 28.76)]; + [bezier51Path addLineToPoint: CGPointMake(46.5, 28.65)]; + [bezier51Path addLineToPoint: CGPointMake(46.54, 28.54)]; + [bezier51Path addLineToPoint: CGPointMake(46.6, 28.43)]; + [bezier51Path addLineToPoint: CGPointMake(46.67, 28.33)]; + [bezier51Path addLineToPoint: CGPointMake(46.75, 28.23)]; + [bezier51Path addLineToPoint: CGPointMake(46.84, 28.14)]; + [bezier51Path addLineToPoint: CGPointMake(46.94, 28.06)]; + [bezier51Path addLineToPoint: CGPointMake(47.07, 27.99)]; + [bezier51Path addLineToPoint: CGPointMake(47.2, 27.93)]; + [bezier51Path addLineToPoint: CGPointMake(47.36, 27.88)]; + [bezier51Path addLineToPoint: CGPointMake(47.54, 27.83)]; + [bezier51Path addLineToPoint: CGPointMake(47.73, 27.8)]; + [bezier51Path addLineToPoint: CGPointMake(47.96, 27.78)]; + [bezier51Path addLineToPoint: CGPointMake(47.97, 27.78)]; + [bezier51Path addLineToPoint: CGPointMake(48, 27.79)]; + [bezier51Path addLineToPoint: CGPointMake(48.02, 27.8)]; + [bezier51Path addLineToPoint: CGPointMake(48.05, 27.8)]; + [bezier51Path addLineToPoint: CGPointMake(48.08, 27.8)]; + [bezier51Path addLineToPoint: CGPointMake(48.1, 27.81)]; + [bezier51Path addLineToPoint: CGPointMake(48.12, 27.81)]; + [bezier51Path addLineToPoint: CGPointMake(48.13, 27.81)]; + [bezier51Path addLineToPoint: CGPointMake(48.13, 27.79)]; + [bezier51Path addLineToPoint: CGPointMake(48.15, 27.72)]; + [bezier51Path addLineToPoint: CGPointMake(48.17, 27.62)]; + [bezier51Path addLineToPoint: CGPointMake(48.2, 27.49)]; + [bezier51Path addLineToPoint: CGPointMake(48.24, 27.35)]; + [bezier51Path addLineToPoint: CGPointMake(48.28, 27.19)]; + [bezier51Path addLineToPoint: CGPointMake(48.33, 27.03)]; + [bezier51Path addLineToPoint: CGPointMake(48.38, 26.87)]; + [bezier51Path addLineToPoint: CGPointMake(48.43, 26.76)]; + [bezier51Path addLineToPoint: CGPointMake(48.49, 26.65)]; + [bezier51Path addLineToPoint: CGPointMake(48.54, 26.54)]; + [bezier51Path addLineToPoint: CGPointMake(48.6, 26.45)]; + [bezier51Path addLineToPoint: CGPointMake(48.65, 26.36)]; + [bezier51Path addLineToPoint: CGPointMake(48.69, 26.29)]; + [bezier51Path addLineToPoint: CGPointMake(48.72, 26.25)]; + [bezier51Path addLineToPoint: CGPointMake(48.73, 26.24)]; + [bezier51Path addLineToPoint: CGPointMake(48.72, 26.24)]; + [bezier51Path addLineToPoint: CGPointMake(48.7, 26.23)]; + [bezier51Path addLineToPoint: CGPointMake(48.67, 26.22)]; + [bezier51Path addLineToPoint: CGPointMake(48.63, 26.22)]; + [bezier51Path addLineToPoint: CGPointMake(48.59, 26.22)]; + [bezier51Path addLineToPoint: CGPointMake(48.55, 26.21)]; + [bezier51Path addLineToPoint: CGPointMake(48.51, 26.21)]; + [bezier51Path addLineToPoint: CGPointMake(48.47, 26.21)]; + [bezier51Path addLineToPoint: CGPointMake(48.29, 26.22)]; + [bezier51Path addLineToPoint: CGPointMake(48.13, 26.24)]; + [bezier51Path addLineToPoint: CGPointMake(47.98, 26.26)]; + [bezier51Path addLineToPoint: CGPointMake(47.85, 26.3)]; + [bezier51Path addLineToPoint: CGPointMake(47.72, 26.34)]; + [bezier51Path addLineToPoint: CGPointMake(47.6, 26.4)]; + [bezier51Path addLineToPoint: CGPointMake(47.49, 26.46)]; + [bezier51Path addLineToPoint: CGPointMake(47.39, 26.53)]; + [bezier51Path addLineToPoint: CGPointMake(47.29, 26.6)]; + [bezier51Path addLineToPoint: CGPointMake(47.2, 26.69)]; + [bezier51Path addLineToPoint: CGPointMake(47.11, 26.77)]; + [bezier51Path addLineToPoint: CGPointMake(47.03, 26.87)]; + [bezier51Path addLineToPoint: CGPointMake(46.94, 26.96)]; + [bezier51Path addLineToPoint: CGPointMake(46.86, 27.07)]; + [bezier51Path addLineToPoint: CGPointMake(46.78, 27.19)]; + [bezier51Path addLineToPoint: CGPointMake(46.69, 27.3)]; + [bezier51Path addLineToPoint: CGPointMake(46.9, 26.27)]; + [bezier51Path addLineToPoint: CGPointMake(45.26, 26.27)]; + [bezier51Path addLineToPoint: CGPointMake(44.2, 32.37)]; + [bezier51Path closePath]; + bezier51Path.miterLimit = 4; + + bezier51Path.usesEvenOddFillRule = YES; + + [color3 setFill]; + [bezier51Path fill]; + + + //// Bezier 52 Drawing + UIBezierPath* bezier52Path = [UIBezierPath bezierPath]; + [bezier52Path moveToPoint: CGPointMake(44.2, 32.37)]; + [bezier52Path addLineToPoint: CGPointMake(45.83, 32.37)]; + [bezier52Path addLineToPoint: CGPointMake(46.38, 29.13)]; + [bezier52Path addLineToPoint: CGPointMake(46.4, 29)]; + [bezier52Path addLineToPoint: CGPointMake(46.46, 28.76)]; + [bezier52Path addLineToPoint: CGPointMake(46.5, 28.65)]; + [bezier52Path addLineToPoint: CGPointMake(46.54, 28.54)]; + [bezier52Path addLineToPoint: CGPointMake(46.6, 28.43)]; + [bezier52Path addLineToPoint: CGPointMake(46.67, 28.33)]; + [bezier52Path addLineToPoint: CGPointMake(46.75, 28.23)]; + [bezier52Path addLineToPoint: CGPointMake(46.84, 28.14)]; + [bezier52Path addLineToPoint: CGPointMake(46.94, 28.06)]; + [bezier52Path addLineToPoint: CGPointMake(47.07, 27.99)]; + [bezier52Path addLineToPoint: CGPointMake(47.2, 27.93)]; + [bezier52Path addLineToPoint: CGPointMake(47.36, 27.88)]; + [bezier52Path addLineToPoint: CGPointMake(47.54, 27.83)]; + [bezier52Path addLineToPoint: CGPointMake(47.73, 27.8)]; + [bezier52Path addLineToPoint: CGPointMake(47.96, 27.78)]; + [bezier52Path addLineToPoint: CGPointMake(47.97, 27.78)]; + [bezier52Path addLineToPoint: CGPointMake(48, 27.79)]; + [bezier52Path addLineToPoint: CGPointMake(48.02, 27.8)]; + [bezier52Path addLineToPoint: CGPointMake(48.05, 27.8)]; + [bezier52Path addLineToPoint: CGPointMake(48.08, 27.8)]; + [bezier52Path addLineToPoint: CGPointMake(48.1, 27.81)]; + [bezier52Path addLineToPoint: CGPointMake(48.12, 27.81)]; + [bezier52Path addLineToPoint: CGPointMake(48.13, 27.81)]; + [bezier52Path addLineToPoint: CGPointMake(48.13, 27.79)]; + [bezier52Path addLineToPoint: CGPointMake(48.15, 27.72)]; + [bezier52Path addLineToPoint: CGPointMake(48.17, 27.62)]; + [bezier52Path addLineToPoint: CGPointMake(48.2, 27.49)]; + [bezier52Path addLineToPoint: CGPointMake(48.24, 27.35)]; + [bezier52Path addLineToPoint: CGPointMake(48.28, 27.19)]; + [bezier52Path addLineToPoint: CGPointMake(48.33, 27.03)]; + [bezier52Path addLineToPoint: CGPointMake(48.38, 26.87)]; + [bezier52Path addLineToPoint: CGPointMake(48.43, 26.76)]; + [bezier52Path addLineToPoint: CGPointMake(48.49, 26.65)]; + [bezier52Path addLineToPoint: CGPointMake(48.54, 26.54)]; + [bezier52Path addLineToPoint: CGPointMake(48.6, 26.45)]; + [bezier52Path addLineToPoint: CGPointMake(48.65, 26.36)]; + [bezier52Path addLineToPoint: CGPointMake(48.69, 26.29)]; + [bezier52Path addLineToPoint: CGPointMake(48.72, 26.25)]; + [bezier52Path addLineToPoint: CGPointMake(48.73, 26.24)]; + [bezier52Path addLineToPoint: CGPointMake(48.72, 26.24)]; + [bezier52Path addLineToPoint: CGPointMake(48.7, 26.23)]; + [bezier52Path addLineToPoint: CGPointMake(48.67, 26.22)]; + [bezier52Path addLineToPoint: CGPointMake(48.63, 26.22)]; + [bezier52Path addLineToPoint: CGPointMake(48.59, 26.22)]; + [bezier52Path addLineToPoint: CGPointMake(48.55, 26.21)]; + [bezier52Path addLineToPoint: CGPointMake(48.51, 26.21)]; + [bezier52Path addLineToPoint: CGPointMake(48.47, 26.21)]; + [bezier52Path addLineToPoint: CGPointMake(48.29, 26.22)]; + [bezier52Path addLineToPoint: CGPointMake(48.13, 26.24)]; + [bezier52Path addLineToPoint: CGPointMake(47.98, 26.26)]; + [bezier52Path addLineToPoint: CGPointMake(47.85, 26.3)]; + [bezier52Path addLineToPoint: CGPointMake(47.72, 26.34)]; + [bezier52Path addLineToPoint: CGPointMake(47.6, 26.4)]; + [bezier52Path addLineToPoint: CGPointMake(47.49, 26.46)]; + [bezier52Path addLineToPoint: CGPointMake(47.39, 26.53)]; + [bezier52Path addLineToPoint: CGPointMake(47.29, 26.6)]; + [bezier52Path addLineToPoint: CGPointMake(47.2, 26.69)]; + [bezier52Path addLineToPoint: CGPointMake(47.11, 26.77)]; + [bezier52Path addLineToPoint: CGPointMake(47.03, 26.87)]; + [bezier52Path addLineToPoint: CGPointMake(46.94, 26.96)]; + [bezier52Path addLineToPoint: CGPointMake(46.86, 27.07)]; + [bezier52Path addLineToPoint: CGPointMake(46.78, 27.19)]; + [bezier52Path addLineToPoint: CGPointMake(46.69, 27.3)]; + [bezier52Path addLineToPoint: CGPointMake(46.9, 26.27)]; + [bezier52Path addLineToPoint: CGPointMake(45.26, 26.27)]; + [bezier52Path addLineToPoint: CGPointMake(44.2, 32.37)]; + [bezier52Path closePath]; + bezier52Path.miterLimit = 4; + + bezier52Path.usesEvenOddFillRule = YES; + + [color3 setStroke]; + bezier52Path.lineWidth = 0.5; + [bezier52Path stroke]; + } + } + } +} +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIPayPalMonogramCardView.h b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIPayPalMonogramCardView.h new file mode 100644 index 0000000..829b5d8 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIPayPalMonogramCardView.h @@ -0,0 +1,5 @@ +#import "BTUICardVectorArtView.h" + +@interface BTUIPayPalMonogramCardView : BTUICardVectorArtView + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIPayPalMonogramCardView.m b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIPayPalMonogramCardView.m new file mode 100644 index 0000000..8067f79 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIPayPalMonogramCardView.m @@ -0,0 +1,147 @@ +#import "BTUIPayPalMonogramCardView.h" + +@implementation BTUIPayPalMonogramCardView + +- (void)drawArt { + //// Color Declarations + UIColor* color3 = [UIColor colorWithRed: 0.092 green: 0.106 blue: 0.242 alpha: 1]; + UIColor* color2 = [UIColor colorWithRed: 0.132 green: 0.488 blue: 0.713 alpha: 1]; + UIColor* color1 = [UIColor colorWithRed: 0.115 green: 0.145 blue: 0.34 alpha: 1]; + + //// Page-1 + { + //// PayPal + { + //// pp_m_rgb + { + //// Group-5 + { + //// Bezier Drawing + UIBezierPath* bezierPath = [UIBezierPath bezierPath]; + [bezierPath moveToPoint: CGPointMake(60.96, 32.7)]; + [bezierPath addCurveToPoint: CGPointMake(62.99, 27.37) controlPoint1: CGPointMake(61.89, 31.21) controlPoint2: CGPointMake(62.58, 29.42)]; + [bezierPath addCurveToPoint: CGPointMake(63.2, 22.57) controlPoint1: CGPointMake(63.36, 25.57) controlPoint2: CGPointMake(63.43, 23.95)]; + [bezierPath addCurveToPoint: CGPointMake(61.44, 18.87) controlPoint1: CGPointMake(62.96, 21.11) controlPoint2: CGPointMake(62.36, 19.86)]; + [bezierPath addCurveToPoint: CGPointMake(59.32, 17.31) controlPoint1: CGPointMake(60.89, 18.26) controlPoint2: CGPointMake(60.17, 17.74)]; + [bezierPath addLineToPoint: CGPointMake(59.29, 17.29)]; + [bezierPath addLineToPoint: CGPointMake(59.29, 17.28)]; + [bezierPath addLineToPoint: CGPointMake(59.3, 17.26)]; + [bezierPath addCurveToPoint: CGPointMake(59.26, 12.67) controlPoint1: CGPointMake(59.59, 15.46) controlPoint2: CGPointMake(59.58, 13.96)]; + [bezierPath addCurveToPoint: CGPointMake(57.27, 9.1) controlPoint1: CGPointMake(58.94, 11.37) controlPoint2: CGPointMake(58.29, 10.2)]; + [bezierPath addCurveToPoint: CGPointMake(45.87, 5.66) controlPoint1: CGPointMake(55.17, 6.81) controlPoint2: CGPointMake(51.33, 5.66)]; + [bezierPath addLineToPoint: CGPointMake(30.88, 5.66)]; + [bezierPath addCurveToPoint: CGPointMake(28.81, 7.34) controlPoint1: CGPointMake(29.84, 5.66) controlPoint2: CGPointMake(28.97, 6.36)]; + [bezierPath addLineToPoint: CGPointMake(22.56, 45)]; + [bezierPath addCurveToPoint: CGPointMake(22.85, 45.95) controlPoint1: CGPointMake(22.51, 45.34) controlPoint2: CGPointMake(22.61, 45.69)]; + [bezierPath addCurveToPoint: CGPointMake(23.79, 46.36) controlPoint1: CGPointMake(23.08, 46.21) controlPoint2: CGPointMake(23.43, 46.36)]; + [bezierPath addLineToPoint: CGPointMake(33.1, 46.36)]; + [bezierPath addLineToPoint: CGPointMake(33.09, 46.42)]; + [bezierPath addLineToPoint: CGPointMake(32.45, 50.27)]; + [bezierPath addCurveToPoint: CGPointMake(32.7, 51.09) controlPoint1: CGPointMake(32.4, 50.57) controlPoint2: CGPointMake(32.49, 50.87)]; + [bezierPath addCurveToPoint: CGPointMake(33.52, 51.45) controlPoint1: CGPointMake(32.9, 51.32) controlPoint2: CGPointMake(33.2, 51.45)]; + [bezierPath addLineToPoint: CGPointMake(41.32, 51.45)]; + [bezierPath addCurveToPoint: CGPointMake(43.13, 49.99) controlPoint1: CGPointMake(42.22, 51.45) controlPoint2: CGPointMake(42.98, 50.84)]; + [bezierPath addLineToPoint: CGPointMake(43.2, 49.61)]; + [bezierPath addLineToPoint: CGPointMake(44.67, 40.74)]; + [bezierPath addLineToPoint: CGPointMake(44.77, 40.25)]; + [bezierPath addCurveToPoint: CGPointMake(46.67, 38.71) controlPoint1: CGPointMake(44.92, 39.36) controlPoint2: CGPointMake(45.72, 38.71)]; + [bezierPath addLineToPoint: CGPointMake(47.84, 38.71)]; + [bezierPath addCurveToPoint: CGPointMake(57.6, 36.2) controlPoint1: CGPointMake(51.85, 38.71) controlPoint2: CGPointMake(55.14, 37.86)]; + [bezierPath addCurveToPoint: CGPointMake(60.96, 32.7) controlPoint1: CGPointMake(58.94, 35.29) controlPoint2: CGPointMake(60.07, 34.11)]; + [bezierPath closePath]; + bezierPath.miterLimit = 4; + + bezierPath.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezierPath fill]; + + + //// Bezier 2 Drawing + UIBezierPath* bezier2Path = [UIBezierPath bezierPath]; + [bezier2Path moveToPoint: CGPointMake(37.87, 17.32)]; + [bezier2Path addCurveToPoint: CGPointMake(38.91, 15.98) controlPoint1: CGPointMake(37.97, 16.72) controlPoint2: CGPointMake(38.37, 16.23)]; + [bezier2Path addCurveToPoint: CGPointMake(39.72, 15.81) controlPoint1: CGPointMake(39.16, 15.87) controlPoint2: CGPointMake(39.43, 15.81)]; + [bezier2Path addLineToPoint: CGPointMake(51.48, 15.81)]; + [bezier2Path addCurveToPoint: CGPointMake(55.35, 16.08) controlPoint1: CGPointMake(52.87, 15.81) controlPoint2: CGPointMake(54.17, 15.89)]; + [bezier2Path addCurveToPoint: CGPointMake(56.34, 16.26) controlPoint1: CGPointMake(55.69, 16.13) controlPoint2: CGPointMake(56.02, 16.19)]; + [bezier2Path addCurveToPoint: CGPointMake(57.28, 16.48) controlPoint1: CGPointMake(56.66, 16.32) controlPoint2: CGPointMake(56.97, 16.4)]; + [bezier2Path addCurveToPoint: CGPointMake(57.72, 16.62) controlPoint1: CGPointMake(57.43, 16.53) controlPoint2: CGPointMake(57.57, 16.57)]; + [bezier2Path addCurveToPoint: CGPointMake(59.35, 17.27) controlPoint1: CGPointMake(58.3, 16.8) controlPoint2: CGPointMake(58.85, 17.02)]; + [bezier2Path addCurveToPoint: CGPointMake(57.31, 9.07) controlPoint1: CGPointMake(59.93, 13.7) controlPoint2: CGPointMake(59.34, 11.27)]; + [bezier2Path addCurveToPoint: CGPointMake(45.87, 5.61) controlPoint1: CGPointMake(55.08, 6.65) controlPoint2: CGPointMake(51.04, 5.61)]; + [bezier2Path addLineToPoint: CGPointMake(30.88, 5.61)]; + [bezier2Path addCurveToPoint: CGPointMake(28.76, 7.33) controlPoint1: CGPointMake(29.82, 5.61) controlPoint2: CGPointMake(28.92, 6.34)]; + [bezier2Path addLineToPoint: CGPointMake(22.52, 44.99)]; + [bezier2Path addCurveToPoint: CGPointMake(23.79, 46.41) controlPoint1: CGPointMake(22.39, 45.74) controlPoint2: CGPointMake(23, 46.41)]; + [bezier2Path addLineToPoint: CGPointMake(33.04, 46.41)]; + [bezier2Path addLineToPoint: CGPointMake(37.87, 17.32)]; + [bezier2Path closePath]; + bezier2Path.miterLimit = 4; + + bezier2Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier2Path fill]; + + + //// Bezier 3 Drawing + UIBezierPath* bezier3Path = [UIBezierPath bezierPath]; + [bezier3Path moveToPoint: CGPointMake(59.35, 17.27)]; + [bezier3Path addLineToPoint: CGPointMake(59.35, 17.27)]; + [bezier3Path addCurveToPoint: CGPointMake(59.19, 18.1) controlPoint1: CGPointMake(59.3, 17.54) controlPoint2: CGPointMake(59.25, 17.82)]; + [bezier3Path addCurveToPoint: CGPointMake(41.81, 31.1) controlPoint1: CGPointMake(57.21, 27.76) controlPoint2: CGPointMake(50.45, 31.1)]; + [bezier3Path addLineToPoint: CGPointMake(37.41, 31.1)]; + [bezier3Path addCurveToPoint: CGPointMake(35.3, 32.82) controlPoint1: CGPointMake(36.35, 31.1) controlPoint2: CGPointMake(35.46, 31.83)]; + [bezier3Path addLineToPoint: CGPointMake(32.41, 50.26)]; + [bezier3Path addCurveToPoint: CGPointMake(33.52, 51.5) controlPoint1: CGPointMake(32.3, 50.91) controlPoint2: CGPointMake(32.83, 51.5)]; + [bezier3Path addLineToPoint: CGPointMake(41.32, 51.5)]; + [bezier3Path addCurveToPoint: CGPointMake(43.17, 49.99) controlPoint1: CGPointMake(42.24, 51.5) controlPoint2: CGPointMake(43.03, 50.86)]; + [bezier3Path addLineToPoint: CGPointMake(43.25, 49.62)]; + [bezier3Path addLineToPoint: CGPointMake(44.72, 40.75)]; + [bezier3Path addLineToPoint: CGPointMake(44.82, 40.26)]; + [bezier3Path addCurveToPoint: CGPointMake(46.67, 38.75) controlPoint1: CGPointMake(44.96, 39.39) controlPoint2: CGPointMake(45.75, 38.75)]; + [bezier3Path addLineToPoint: CGPointMake(47.84, 38.75)]; + [bezier3Path addCurveToPoint: CGPointMake(63.04, 27.38) controlPoint1: CGPointMake(55.39, 38.75) controlPoint2: CGPointMake(61.31, 35.83)]; + [bezier3Path addCurveToPoint: CGPointMake(61.48, 18.84) controlPoint1: CGPointMake(63.77, 23.85) controlPoint2: CGPointMake(63.39, 20.91)]; + [bezier3Path addCurveToPoint: CGPointMake(59.35, 17.27) controlPoint1: CGPointMake(60.9, 18.21) controlPoint2: CGPointMake(60.18, 17.69)]; + [bezier3Path closePath]; + bezier3Path.miterLimit = 4; + + bezier3Path.usesEvenOddFillRule = YES; + + [color2 setFill]; + [bezier3Path fill]; + } + + + //// Bezier 4 Drawing + UIBezierPath* bezier4Path = [UIBezierPath bezierPath]; + [bezier4Path moveToPoint: CGPointMake(54.19, 19.56)]; + [bezier4Path addCurveToPoint: CGPointMake(53.5, 19.4) controlPoint1: CGPointMake(53.97, 19.5) controlPoint2: CGPointMake(53.74, 19.45)]; + [bezier4Path addCurveToPoint: CGPointMake(52.76, 19.26) controlPoint1: CGPointMake(53.26, 19.35) controlPoint2: CGPointMake(53.01, 19.3)]; + [bezier4Path addCurveToPoint: CGPointMake(49.88, 19.06) controlPoint1: CGPointMake(51.88, 19.13) controlPoint2: CGPointMake(50.92, 19.06)]; + [bezier4Path addLineToPoint: CGPointMake(41.15, 19.06)]; + [bezier4Path addCurveToPoint: CGPointMake(40.55, 19.19) controlPoint1: CGPointMake(40.94, 19.06) controlPoint2: CGPointMake(40.73, 19.11)]; + [bezier4Path addCurveToPoint: CGPointMake(39.77, 20.18) controlPoint1: CGPointMake(40.15, 19.38) controlPoint2: CGPointMake(39.85, 19.74)]; + [bezier4Path addLineToPoint: CGPointMake(37.92, 31.39)]; + [bezier4Path addLineToPoint: CGPointMake(37.86, 31.71)]; + [bezier4Path addCurveToPoint: CGPointMake(39.43, 30.43) controlPoint1: CGPointMake(37.99, 30.98) controlPoint2: CGPointMake(38.65, 30.43)]; + [bezier4Path addLineToPoint: CGPointMake(42.7, 30.43)]; + [bezier4Path addCurveToPoint: CGPointMake(55.61, 20.77) controlPoint1: CGPointMake(49.12, 30.43) controlPoint2: CGPointMake(54.15, 27.95)]; + [bezier4Path addCurveToPoint: CGPointMake(55.73, 20.15) controlPoint1: CGPointMake(55.66, 20.56) controlPoint2: CGPointMake(55.69, 20.35)]; + [bezier4Path addCurveToPoint: CGPointMake(54.52, 19.66) controlPoint1: CGPointMake(55.36, 19.96) controlPoint2: CGPointMake(54.95, 19.8)]; + [bezier4Path addCurveToPoint: CGPointMake(54.19, 19.56) controlPoint1: CGPointMake(54.41, 19.63) controlPoint2: CGPointMake(54.3, 19.6)]; + [bezier4Path closePath]; + bezier4Path.miterLimit = 4; + + bezier4Path.usesEvenOddFillRule = YES; + + [color3 setFill]; + [bezier4Path fill]; + } + } + } +} + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIPayPalWordmarkVectorArtView.h b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIPayPalWordmarkVectorArtView.h new file mode 100644 index 0000000..56f4fbb --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIPayPalWordmarkVectorArtView.h @@ -0,0 +1,24 @@ +#import +#import "BTUIVectorArtView.h" + +@class BTUI; + +@interface BTUIPayPalWordmarkVectorArtView : BTUIVectorArtView + +@property (nonatomic, strong) BTUI *theme; + +/// Initializes a PayPal Wordmark with padding +/// +/// This view includes built-in padding to ensure consistent typographical baseline alignment with Venmo and Coinbase wordmarks. +/// +/// @return A PayPal Wordmark with padding +- (BTUIPayPalWordmarkVectorArtView *)initWithPadding; + +/// Initializes a PayPal Wordmark +/// +/// This view does not include built-in padding. +/// +/// @return A PayPal Wordmark +- (BTUIPayPalWordmarkVectorArtView *)init; + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIPayPalWordmarkVectorArtView.m b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIPayPalWordmarkVectorArtView.m new file mode 100644 index 0000000..a2a20b7 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIPayPalWordmarkVectorArtView.m @@ -0,0 +1,395 @@ +#import "BTUIPayPalWordmarkVectorArtView.h" +#import "BTUI.h" + +@interface BTUIPayPalWordmarkVectorArtView () +@property (nonatomic, assign) BOOL includePadding; +@end + +@implementation BTUIPayPalWordmarkVectorArtView + +- (BTUIPayPalWordmarkVectorArtView *)initWithPadding { + self = [super init]; + if (self) { + self.includePadding = YES; + [self setupWithArtDimensions:CGSizeMake(158, 88)]; + } + return self; +} + +- (BTUIPayPalWordmarkVectorArtView *)init { + self = [super init]; + if (self) { + [self setupWithArtDimensions:CGSizeMake(284.0f, 80.0f)]; + } + return self; +} + +- (void)setupWithArtDimensions:(CGSize)artDimensions { + self.artDimensions = artDimensions; + self.opaque = NO; + self.theme = [BTUI braintreeTheme]; +} + +- (void)drawArt +{ + if (self.includePadding) { + //// Color Declarations + UIColor* payColor = [self.theme payBlue]; //[UIColor colorWithRed: 0.005 green: 0.123 blue: 0.454 alpha: 1]; + UIColor* palColor = [self.theme palBlue]; //[UIColor colorWithRed: 0.066 green: 0.536 blue: 0.839 alpha: 1]; + + //// Assets + { + //// button-paypal + { + //// Rectangle Drawing + + + //// logo/paypal + { + //// Bezier Drawing + UIBezierPath* bezierPath = [UIBezierPath bezierPath]; + [bezierPath moveToPoint: CGPointMake(102.29, 34.76)]; + [bezierPath addCurveToPoint: CGPointMake(96.25, 38.4) controlPoint1: CGPointMake(101.73, 38.4) controlPoint2: CGPointMake(98.95, 38.4)]; + [bezierPath addLineToPoint: CGPointMake(94.72, 38.4)]; + [bezierPath addLineToPoint: CGPointMake(95.8, 31.6)]; + [bezierPath addCurveToPoint: CGPointMake(96.63, 30.89) controlPoint1: CGPointMake(95.86, 31.19) controlPoint2: CGPointMake(96.22, 30.89)]; + [bezierPath addLineToPoint: CGPointMake(97.33, 30.89)]; + [bezierPath addCurveToPoint: CGPointMake(101.79, 31.93) controlPoint1: CGPointMake(99.17, 30.89) controlPoint2: CGPointMake(100.9, 30.89)]; + [bezierPath addCurveToPoint: CGPointMake(102.29, 34.76) controlPoint1: CGPointMake(102.33, 32.55) controlPoint2: CGPointMake(102.49, 33.48)]; + [bezierPath addLineToPoint: CGPointMake(102.29, 34.76)]; + [bezierPath closePath]; + [bezierPath moveToPoint: CGPointMake(91, 25)]; + [bezierPath addCurveToPoint: CGPointMake(89.56, 26.45) controlPoint1: CGPointMake(90.31, 25) controlPoint2: CGPointMake(89.67, 25.76)]; + [bezierPath addLineToPoint: CGPointMake(85.5, 53)]; + [bezierPath addCurveToPoint: CGPointMake(86.5, 54) controlPoint1: CGPointMake(85.42, 53.51) controlPoint2: CGPointMake(85.98, 54)]; + [bezierPath addLineToPoint: CGPointMake(91.5, 54)]; + [bezierPath addCurveToPoint: CGPointMake(92.5, 53) controlPoint1: CGPointMake(91.99, 54) controlPoint2: CGPointMake(92.42, 53.48)]; + [bezierPath addLineToPoint: CGPointMake(93.64, 45.22)]; + [bezierPath addCurveToPoint: CGPointMake(95.04, 44.03) controlPoint1: CGPointMake(93.75, 44.54) controlPoint2: CGPointMake(94.34, 44.03)]; + [bezierPath addLineToPoint: CGPointMake(98.25, 44.03)]; + [bezierPath addCurveToPoint: CGPointMake(109.81, 34.4) controlPoint1: CGPointMake(104.94, 44.03) controlPoint2: CGPointMake(108.8, 40.8)]; + [bezierPath addCurveToPoint: CGPointMake(108.52, 27.85) controlPoint1: CGPointMake(110.27, 31.59) controlPoint2: CGPointMake(109.83, 29.39)]; + [bezierPath addCurveToPoint: CGPointMake(101, 25) controlPoint1: CGPointMake(107.07, 26.16) controlPoint2: CGPointMake(104.4, 25)]; + [bezierPath addLineToPoint: CGPointMake(91, 25)]; + [bezierPath closePath]; + [bezierPath moveToPoint: CGPointMake(123.7, 44.09)]; + [bezierPath addCurveToPoint: CGPointMake(118.21, 48.73) controlPoint1: CGPointMake(123.22, 46.87) controlPoint2: CGPointMake(121.02, 48.73)]; + [bezierPath addCurveToPoint: CGPointMake(114.94, 47.42) controlPoint1: CGPointMake(116.79, 48.73) controlPoint2: CGPointMake(115.67, 48.28)]; + [bezierPath addCurveToPoint: CGPointMake(114.18, 44.01) controlPoint1: CGPointMake(114.22, 46.57) controlPoint2: CGPointMake(113.95, 45.36)]; + [bezierPath addCurveToPoint: CGPointMake(119.63, 39.33) controlPoint1: CGPointMake(114.61, 41.26) controlPoint2: CGPointMake(116.86, 39.33)]; + [bezierPath addCurveToPoint: CGPointMake(122.87, 40.66) controlPoint1: CGPointMake(121.01, 39.33) controlPoint2: CGPointMake(122.13, 39.79)]; + [bezierPath addCurveToPoint: CGPointMake(123.7, 44.09) controlPoint1: CGPointMake(123.62, 41.53) controlPoint2: CGPointMake(123.91, 42.75)]; + [bezierPath closePath]; + [bezierPath moveToPoint: CGPointMake(131.15, 34.46)]; + [bezierPath addLineToPoint: CGPointMake(126.25, 34.46)]; + [bezierPath addCurveToPoint: CGPointMake(125.41, 35.19) controlPoint1: CGPointMake(125.83, 34.46) controlPoint2: CGPointMake(125.48, 34.77)]; + [bezierPath addLineToPoint: CGPointMake(125.2, 36.57)]; + [bezierPath addLineToPoint: CGPointMake(124.85, 36.07)]; + [bezierPath addCurveToPoint: CGPointMake(119.07, 34) controlPoint1: CGPointMake(123.79, 34.52) controlPoint2: CGPointMake(121.43, 34)]; + [bezierPath addCurveToPoint: CGPointMake(108.15, 43.92) controlPoint1: CGPointMake(113.67, 34) controlPoint2: CGPointMake(109.05, 38.13)]; + [bezierPath addCurveToPoint: CGPointMake(109.97, 51.49) controlPoint1: CGPointMake(107.68, 46.81) controlPoint2: CGPointMake(108.34, 49.57)]; + [bezierPath addCurveToPoint: CGPointMake(116.13, 54) controlPoint1: CGPointMake(111.46, 53.26) controlPoint2: CGPointMake(113.59, 54)]; + [bezierPath addCurveToPoint: CGPointMake(122.91, 51.18) controlPoint1: CGPointMake(120.49, 54) controlPoint2: CGPointMake(122.91, 51.18)]; + [bezierPath addLineToPoint: CGPointMake(122.69, 52.55)]; + [bezierPath addCurveToPoint: CGPointMake(123.53, 53.54) controlPoint1: CGPointMake(122.61, 53.07) controlPoint2: CGPointMake(123.01, 53.54)]; + [bezierPath addLineToPoint: CGPointMake(127.94, 53.54)]; + [bezierPath addCurveToPoint: CGPointMake(129.34, 52.33) controlPoint1: CGPointMake(128.64, 53.54) controlPoint2: CGPointMake(129.23, 53.03)]; + [bezierPath addLineToPoint: CGPointMake(131.99, 35.46)]; + [bezierPath addCurveToPoint: CGPointMake(131.15, 34.46) controlPoint1: CGPointMake(132.07, 34.94) controlPoint2: CGPointMake(131.67, 34.46)]; + [bezierPath closePath]; + [bezierPath moveToPoint: CGPointMake(137, 27)]; + [bezierPath addLineToPoint: CGPointMake(133, 53)]; + [bezierPath addCurveToPoint: CGPointMake(134, 54) controlPoint1: CGPointMake(132.93, 53.54) controlPoint2: CGPointMake(133.34, 54)]; + [bezierPath addLineToPoint: CGPointMake(138, 54)]; + [bezierPath addCurveToPoint: CGPointMake(140, 53) controlPoint1: CGPointMake(138.98, 54) controlPoint2: CGPointMake(139.59, 53.5)]; + [bezierPath addLineToPoint: CGPointMake(144, 27)]; + [bezierPath addCurveToPoint: CGPointMake(143, 26) controlPoint1: CGPointMake(144.07, 26.46) controlPoint2: CGPointMake(143.66, 26)]; + [bezierPath addLineToPoint: CGPointMake(138, 26)]; + [bezierPath addCurveToPoint: CGPointMake(137, 27) controlPoint1: CGPointMake(137.79, 26) controlPoint2: CGPointMake(137.42, 26.3)]; + [bezierPath closePath]; + bezierPath.miterLimit = 4; + + bezierPath.usesEvenOddFillRule = YES; + + [palColor setFill]; + [bezierPath fill]; + + + //// Bezier 2 Drawing + UIBezierPath* bezier2Path = [UIBezierPath bezierPath]; + [bezier2Path moveToPoint: CGPointMake(29.84, 34.76)]; + [bezier2Path addCurveToPoint: CGPointMake(23.81, 38.4) controlPoint1: CGPointMake(29.29, 38.4) controlPoint2: CGPointMake(26.5, 38.4)]; + [bezier2Path addLineToPoint: CGPointMake(22.28, 38.4)]; + [bezier2Path addLineToPoint: CGPointMake(23.35, 31.6)]; + [bezier2Path addCurveToPoint: CGPointMake(24.19, 30.89) controlPoint1: CGPointMake(23.42, 31.19) controlPoint2: CGPointMake(23.77, 30.89)]; + [bezier2Path addLineToPoint: CGPointMake(24.89, 30.89)]; + [bezier2Path addCurveToPoint: CGPointMake(29.35, 31.93) controlPoint1: CGPointMake(26.72, 30.89) controlPoint2: CGPointMake(28.45, 30.89)]; + [bezier2Path addCurveToPoint: CGPointMake(29.84, 34.76) controlPoint1: CGPointMake(29.88, 32.55) controlPoint2: CGPointMake(30.04, 33.48)]; + [bezier2Path addLineToPoint: CGPointMake(29.84, 34.76)]; + [bezier2Path closePath]; + [bezier2Path moveToPoint: CGPointMake(18.5, 25)]; + [bezier2Path addCurveToPoint: CGPointMake(17, 26.5) controlPoint1: CGPointMake(17.81, 25) controlPoint2: CGPointMake(17.11, 25.82)]; + [bezier2Path addLineToPoint: CGPointMake(13, 53)]; + [bezier2Path addCurveToPoint: CGPointMake(14, 54) controlPoint1: CGPointMake(12.92, 53.51) controlPoint2: CGPointMake(13.48, 54)]; + [bezier2Path addLineToPoint: CGPointMake(18.5, 54)]; + [bezier2Path addCurveToPoint: CGPointMake(20, 52.5) controlPoint1: CGPointMake(19.19, 54) controlPoint2: CGPointMake(19.89, 53.18)]; + [bezier2Path addLineToPoint: CGPointMake(21.2, 45.22)]; + [bezier2Path addCurveToPoint: CGPointMake(22.59, 44.03) controlPoint1: CGPointMake(21.31, 44.54) controlPoint2: CGPointMake(21.9, 44.03)]; + [bezier2Path addLineToPoint: CGPointMake(25.81, 44.03)]; + [bezier2Path addCurveToPoint: CGPointMake(37.37, 34.4) controlPoint1: CGPointMake(32.5, 44.03) controlPoint2: CGPointMake(36.36, 40.8)]; + [bezier2Path addCurveToPoint: CGPointMake(36.07, 27.85) controlPoint1: CGPointMake(37.82, 31.59) controlPoint2: CGPointMake(37.39, 29.39)]; + [bezier2Path addCurveToPoint: CGPointMake(28.5, 25) controlPoint1: CGPointMake(34.63, 26.16) controlPoint2: CGPointMake(31.9, 25)]; + [bezier2Path addLineToPoint: CGPointMake(18.5, 25)]; + [bezier2Path closePath]; + [bezier2Path moveToPoint: CGPointMake(52.25, 44.09)]; + [bezier2Path addCurveToPoint: CGPointMake(46.76, 48.73) controlPoint1: CGPointMake(51.78, 46.87) controlPoint2: CGPointMake(49.57, 48.73)]; + [bezier2Path addCurveToPoint: CGPointMake(43.49, 47.42) controlPoint1: CGPointMake(45.35, 48.73) controlPoint2: CGPointMake(44.22, 48.28)]; + [bezier2Path addCurveToPoint: CGPointMake(42.73, 44.01) controlPoint1: CGPointMake(42.77, 46.57) controlPoint2: CGPointMake(42.5, 45.36)]; + [bezier2Path addCurveToPoint: CGPointMake(48.18, 39.33) controlPoint1: CGPointMake(43.17, 41.26) controlPoint2: CGPointMake(45.41, 39.33)]; + [bezier2Path addCurveToPoint: CGPointMake(51.42, 40.66) controlPoint1: CGPointMake(49.56, 39.33) controlPoint2: CGPointMake(50.69, 39.79)]; + [bezier2Path addCurveToPoint: CGPointMake(52.25, 44.09) controlPoint1: CGPointMake(52.17, 41.53) controlPoint2: CGPointMake(52.46, 42.75)]; + [bezier2Path closePath]; + [bezier2Path moveToPoint: CGPointMake(54.5, 34)]; + [bezier2Path addCurveToPoint: CGPointMake(53.5, 35) controlPoint1: CGPointMake(54.08, 34) controlPoint2: CGPointMake(53.56, 34.58)]; + [bezier2Path addLineToPoint: CGPointMake(53.2, 36.57)]; + [bezier2Path addLineToPoint: CGPointMake(52.85, 36.07)]; + [bezier2Path addCurveToPoint: CGPointMake(47.07, 34) controlPoint1: CGPointMake(51.79, 34.52) controlPoint2: CGPointMake(49.43, 34)]; + [bezier2Path addCurveToPoint: CGPointMake(36.15, 43.92) controlPoint1: CGPointMake(41.67, 34) controlPoint2: CGPointMake(37.05, 38.13)]; + [bezier2Path addCurveToPoint: CGPointMake(37.97, 51.49) controlPoint1: CGPointMake(35.68, 46.81) controlPoint2: CGPointMake(36.34, 49.57)]; + [bezier2Path addCurveToPoint: CGPointMake(44.13, 54) controlPoint1: CGPointMake(39.46, 53.26) controlPoint2: CGPointMake(41.59, 54)]; + [bezier2Path addCurveToPoint: CGPointMake(50.91, 51.18) controlPoint1: CGPointMake(48.49, 54) controlPoint2: CGPointMake(50.91, 51.18)]; + [bezier2Path addLineToPoint: CGPointMake(50.5, 53)]; + [bezier2Path addCurveToPoint: CGPointMake(51.5, 54) controlPoint1: CGPointMake(50.42, 53.52) controlPoint2: CGPointMake(50.98, 54)]; + [bezier2Path addLineToPoint: CGPointMake(56, 54)]; + [bezier2Path addCurveToPoint: CGPointMake(57.5, 52.5) controlPoint1: CGPointMake(56.7, 54) controlPoint2: CGPointMake(57.39, 53.2)]; + [bezier2Path addLineToPoint: CGPointMake(60, 35)]; + [bezier2Path addCurveToPoint: CGPointMake(59, 34) controlPoint1: CGPointMake(60.08, 34.48) controlPoint2: CGPointMake(59.52, 34)]; + [bezier2Path addLineToPoint: CGPointMake(54.5, 34)]; + [bezier2Path closePath]; + [bezier2Path moveToPoint: CGPointMake(80, 34)]; + [bezier2Path addCurveToPoint: CGPointMake(79, 35.04) controlPoint1: CGPointMake(79.67, 34) controlPoint2: CGPointMake(79.22, 34.24)]; + [bezier2Path addLineToPoint: CGPointMake(72, 44.4)]; + [bezier2Path addLineToPoint: CGPointMake(69, 35.04)]; + [bezier2Path addCurveToPoint: CGPointMake(68, 34) controlPoint1: CGPointMake(68.97, 34.42) controlPoint2: CGPointMake(68.41, 34)]; + [bezier2Path addLineToPoint: CGPointMake(63, 34)]; + [bezier2Path addCurveToPoint: CGPointMake(62, 35.04) controlPoint1: CGPointMake(62.27, 34) controlPoint2: CGPointMake(61.86, 34.58)]; + [bezier2Path addLineToPoint: CGPointMake(68, 51.68)]; + [bezier2Path addLineToPoint: CGPointMake(62, 58.96)]; + [bezier2Path addCurveToPoint: CGPointMake(63, 60) controlPoint1: CGPointMake(61.97, 59.21) controlPoint2: CGPointMake(62.38, 60)]; + [bezier2Path addLineToPoint: CGPointMake(68, 60)]; + [bezier2Path addCurveToPoint: CGPointMake(69, 58.96) controlPoint1: CGPointMake(68.54, 60) controlPoint2: CGPointMake(68.98, 59.77)]; + [bezier2Path addLineToPoint: CGPointMake(86, 35.04)]; + [bezier2Path addCurveToPoint: CGPointMake(85, 34) controlPoint1: CGPointMake(86.24, 34.79) controlPoint2: CGPointMake(85.83, 34)]; + [bezier2Path addLineToPoint: CGPointMake(80, 34)]; + [bezier2Path closePath]; + bezier2Path.miterLimit = 4; + + bezier2Path.usesEvenOddFillRule = YES; + + [payColor setFill]; + [bezier2Path fill]; + } + } + } + } else { + //// Color Declarations + UIColor* color0 = [self.theme palBlue]; + UIColor* color1 = [self.theme payBlue]; + + //// PayPal + { + //// Group 2 + { + //// Bezier Drawing + UIBezierPath* bezierPath = [UIBezierPath bezierPath]; + [bezierPath moveToPoint: CGPointMake(189.07, 1.49)]; + [bezierPath addLineToPoint: CGPointMake(167.92, 1.49)]; + [bezierPath addCurveToPoint: CGPointMake(165.02, 3.97) controlPoint1: CGPointMake(166.48, 1.49) controlPoint2: CGPointMake(165.24, 2.54)]; + [bezierPath addLineToPoint: CGPointMake(156.47, 58.2)]; + [bezierPath addCurveToPoint: CGPointMake(158.21, 60.24) controlPoint1: CGPointMake(156.3, 59.27) controlPoint2: CGPointMake(157.12, 60.24)]; + [bezierPath addLineToPoint: CGPointMake(169.06, 60.24)]; + [bezierPath addCurveToPoint: CGPointMake(171.09, 58.5) controlPoint1: CGPointMake(170.07, 60.24) controlPoint2: CGPointMake(170.93, 59.5)]; + [bezierPath addLineToPoint: CGPointMake(173.52, 43.13)]; + [bezierPath addCurveToPoint: CGPointMake(176.42, 40.65) controlPoint1: CGPointMake(173.74, 41.7) controlPoint2: CGPointMake(174.97, 40.65)]; + [bezierPath addLineToPoint: CGPointMake(183.11, 40.65)]; + [bezierPath addCurveToPoint: CGPointMake(207.18, 20.54) controlPoint1: CGPointMake(197.04, 40.65) controlPoint2: CGPointMake(205.08, 33.91)]; + [bezierPath addCurveToPoint: CGPointMake(204.49, 6.89) controlPoint1: CGPointMake(208.13, 14.7) controlPoint2: CGPointMake(207.22, 10.11)]; + [bezierPath addCurveToPoint: CGPointMake(189.07, 1.49) controlPoint1: CGPointMake(201.48, 3.36) controlPoint2: CGPointMake(196.15, 1.49)]; + [bezierPath closePath]; + [bezierPath moveToPoint: CGPointMake(191.51, 21.3)]; + [bezierPath addCurveToPoint: CGPointMake(178.95, 28.89) controlPoint1: CGPointMake(190.36, 28.89) controlPoint2: CGPointMake(184.56, 28.89)]; + [bezierPath addLineToPoint: CGPointMake(175.76, 28.89)]; + [bezierPath addLineToPoint: CGPointMake(178, 14.71)]; + [bezierPath addCurveToPoint: CGPointMake(179.74, 13.23) controlPoint1: CGPointMake(178.13, 13.86) controlPoint2: CGPointMake(178.87, 13.23)]; + [bezierPath addLineToPoint: CGPointMake(181.2, 13.23)]; + [bezierPath addCurveToPoint: CGPointMake(190.48, 15.4) controlPoint1: CGPointMake(185.02, 13.23) controlPoint2: CGPointMake(188.62, 13.23)]; + [bezierPath addCurveToPoint: CGPointMake(191.51, 21.3) controlPoint1: CGPointMake(191.6, 16.7) controlPoint2: CGPointMake(191.93, 18.63)]; + [bezierPath closePath]; + bezierPath.miterLimit = 4; + + [color0 setFill]; + [bezierPath fill]; + + + //// Bezier 2 Drawing + UIBezierPath* bezier2Path = [UIBezierPath bezierPath]; + [bezier2Path moveToPoint: CGPointMake(38.22, 1.49)]; + [bezier2Path addLineToPoint: CGPointMake(17.07, 1.49)]; + [bezier2Path addCurveToPoint: CGPointMake(14.17, 3.97) controlPoint1: CGPointMake(15.62, 1.49) controlPoint2: CGPointMake(14.39, 2.54)]; + [bezier2Path addLineToPoint: CGPointMake(5.61, 58.2)]; + [bezier2Path addCurveToPoint: CGPointMake(7.36, 60.24) controlPoint1: CGPointMake(5.45, 59.27) controlPoint2: CGPointMake(6.27, 60.24)]; + [bezier2Path addLineToPoint: CGPointMake(17.45, 60.24)]; + [bezier2Path addCurveToPoint: CGPointMake(20.36, 57.76) controlPoint1: CGPointMake(18.9, 60.24) controlPoint2: CGPointMake(20.13, 59.19)]; + [bezier2Path addLineToPoint: CGPointMake(22.67, 43.13)]; + [bezier2Path addCurveToPoint: CGPointMake(25.57, 40.65) controlPoint1: CGPointMake(22.89, 41.7) controlPoint2: CGPointMake(24.12, 40.65)]; + [bezier2Path addLineToPoint: CGPointMake(32.26, 40.65)]; + [bezier2Path addCurveToPoint: CGPointMake(56.33, 20.54) controlPoint1: CGPointMake(46.19, 40.65) controlPoint2: CGPointMake(54.23, 33.91)]; + [bezier2Path addCurveToPoint: CGPointMake(53.64, 6.89) controlPoint1: CGPointMake(57.28, 14.7) controlPoint2: CGPointMake(56.37, 10.11)]; + [bezier2Path addCurveToPoint: CGPointMake(38.22, 1.49) controlPoint1: CGPointMake(50.63, 3.36) controlPoint2: CGPointMake(45.3, 1.49)]; + [bezier2Path closePath]; + [bezier2Path moveToPoint: CGPointMake(40.66, 21.3)]; + [bezier2Path addCurveToPoint: CGPointMake(28.1, 28.89) controlPoint1: CGPointMake(39.51, 28.89) controlPoint2: CGPointMake(33.71, 28.89)]; + [bezier2Path addLineToPoint: CGPointMake(24.91, 28.89)]; + [bezier2Path addLineToPoint: CGPointMake(27.15, 14.71)]; + [bezier2Path addCurveToPoint: CGPointMake(28.89, 13.23) controlPoint1: CGPointMake(27.28, 13.86) controlPoint2: CGPointMake(28.02, 13.23)]; + [bezier2Path addLineToPoint: CGPointMake(30.35, 13.23)]; + [bezier2Path addCurveToPoint: CGPointMake(39.63, 15.4) controlPoint1: CGPointMake(34.17, 13.23) controlPoint2: CGPointMake(37.77, 13.23)]; + [bezier2Path addCurveToPoint: CGPointMake(40.66, 21.3) controlPoint1: CGPointMake(40.74, 16.7) controlPoint2: CGPointMake(41.08, 18.63)]; + [bezier2Path closePath]; + bezier2Path.miterLimit = 4; + + [color1 setFill]; + [bezier2Path fill]; + + + //// Bezier 3 Drawing + UIBezierPath* bezier3Path = [UIBezierPath bezierPath]; + [bezier3Path moveToPoint: CGPointMake(101.44, 21.06)]; + [bezier3Path addLineToPoint: CGPointMake(91.31, 21.06)]; + [bezier3Path addCurveToPoint: CGPointMake(89.57, 22.54) controlPoint1: CGPointMake(90.44, 21.06) controlPoint2: CGPointMake(89.7, 21.69)]; + [bezier3Path addLineToPoint: CGPointMake(89.12, 25.38)]; + [bezier3Path addLineToPoint: CGPointMake(88.41, 24.35)]; + [bezier3Path addCurveToPoint: CGPointMake(76.45, 20.1) controlPoint1: CGPointMake(86.22, 21.17) controlPoint2: CGPointMake(81.33, 20.1)]; + [bezier3Path addCurveToPoint: CGPointMake(53.85, 40.47) controlPoint1: CGPointMake(65.26, 20.1) controlPoint2: CGPointMake(55.71, 28.58)]; + [bezier3Path addCurveToPoint: CGPointMake(57.62, 56.03) controlPoint1: CGPointMake(52.88, 46.41) controlPoint2: CGPointMake(54.25, 52.08)]; + [bezier3Path addCurveToPoint: CGPointMake(70.37, 61.18) controlPoint1: CGPointMake(60.71, 59.67) controlPoint2: CGPointMake(65.12, 61.18)]; + [bezier3Path addCurveToPoint: CGPointMake(84.39, 55.39) controlPoint1: CGPointMake(79.39, 61.18) controlPoint2: CGPointMake(84.39, 55.39)]; + [bezier3Path addLineToPoint: CGPointMake(83.94, 58.2)]; + [bezier3Path addCurveToPoint: CGPointMake(85.68, 60.24) controlPoint1: CGPointMake(83.77, 59.27) controlPoint2: CGPointMake(84.6, 60.24)]; + [bezier3Path addLineToPoint: CGPointMake(94.8, 60.24)]; + [bezier3Path addCurveToPoint: CGPointMake(97.7, 57.76) controlPoint1: CGPointMake(96.25, 60.24) controlPoint2: CGPointMake(97.48, 59.19)]; + [bezier3Path addLineToPoint: CGPointMake(103.18, 23.09)]; + [bezier3Path addCurveToPoint: CGPointMake(101.44, 21.06) controlPoint1: CGPointMake(103.35, 22.02) controlPoint2: CGPointMake(102.52, 21.06)]; + [bezier3Path closePath]; + [bezier3Path moveToPoint: CGPointMake(87.32, 40.77)]; + [bezier3Path addCurveToPoint: CGPointMake(75.89, 50.44) controlPoint1: CGPointMake(86.34, 46.55) controlPoint2: CGPointMake(81.75, 50.44)]; + [bezier3Path addCurveToPoint: CGPointMake(69.09, 47.71) controlPoint1: CGPointMake(72.95, 50.44) controlPoint2: CGPointMake(70.6, 49.49)]; + [bezier3Path addCurveToPoint: CGPointMake(67.5, 40.59) controlPoint1: CGPointMake(67.59, 45.93) controlPoint2: CGPointMake(67.03, 43.4)]; + [bezier3Path addCurveToPoint: CGPointMake(78.85, 30.85) controlPoint1: CGPointMake(68.42, 34.86) controlPoint2: CGPointMake(73.08, 30.85)]; + [bezier3Path addCurveToPoint: CGPointMake(85.61, 33.61) controlPoint1: CGPointMake(81.73, 30.85) controlPoint2: CGPointMake(84.07, 31.8)]; + [bezier3Path addCurveToPoint: CGPointMake(87.32, 40.77) controlPoint1: CGPointMake(87.16, 35.42) controlPoint2: CGPointMake(87.77, 37.97)]; + [bezier3Path closePath]; + bezier3Path.miterLimit = 4; + + [color1 setFill]; + [bezier3Path fill]; + + + //// Bezier 4 Drawing + UIBezierPath* bezier4Path = [UIBezierPath bezierPath]; + [bezier4Path moveToPoint: CGPointMake(252.29, 21.06)]; + [bezier4Path addLineToPoint: CGPointMake(242.16, 21.06)]; + [bezier4Path addCurveToPoint: CGPointMake(240.42, 22.54) controlPoint1: CGPointMake(241.29, 21.06) controlPoint2: CGPointMake(240.55, 21.69)]; + [bezier4Path addLineToPoint: CGPointMake(239.97, 25.38)]; + [bezier4Path addLineToPoint: CGPointMake(239.27, 24.35)]; + [bezier4Path addCurveToPoint: CGPointMake(227.3, 20.1) controlPoint1: CGPointMake(237.07, 21.17) controlPoint2: CGPointMake(232.18, 20.1)]; + [bezier4Path addCurveToPoint: CGPointMake(204.7, 40.47) controlPoint1: CGPointMake(216.12, 20.1) controlPoint2: CGPointMake(206.56, 28.58)]; + [bezier4Path addCurveToPoint: CGPointMake(208.47, 56.03) controlPoint1: CGPointMake(203.73, 46.41) controlPoint2: CGPointMake(205.1, 52.08)]; + [bezier4Path addCurveToPoint: CGPointMake(221.22, 61.18) controlPoint1: CGPointMake(211.56, 59.67) controlPoint2: CGPointMake(215.97, 61.18)]; + [bezier4Path addCurveToPoint: CGPointMake(235.24, 55.39) controlPoint1: CGPointMake(230.24, 61.18) controlPoint2: CGPointMake(235.24, 55.39)]; + [bezier4Path addLineToPoint: CGPointMake(234.79, 58.2)]; + [bezier4Path addCurveToPoint: CGPointMake(236.53, 60.24) controlPoint1: CGPointMake(234.62, 59.27) controlPoint2: CGPointMake(235.45, 60.24)]; + [bezier4Path addLineToPoint: CGPointMake(245.65, 60.24)]; + [bezier4Path addCurveToPoint: CGPointMake(248.56, 57.76) controlPoint1: CGPointMake(247.1, 60.24) controlPoint2: CGPointMake(248.33, 59.19)]; + [bezier4Path addLineToPoint: CGPointMake(254.03, 23.09)]; + [bezier4Path addCurveToPoint: CGPointMake(252.29, 21.06) controlPoint1: CGPointMake(254.2, 22.02) controlPoint2: CGPointMake(253.37, 21.06)]; + [bezier4Path closePath]; + [bezier4Path moveToPoint: CGPointMake(238.17, 40.77)]; + [bezier4Path addCurveToPoint: CGPointMake(226.74, 50.44) controlPoint1: CGPointMake(237.19, 46.55) controlPoint2: CGPointMake(232.6, 50.44)]; + [bezier4Path addCurveToPoint: CGPointMake(219.94, 47.71) controlPoint1: CGPointMake(223.8, 50.44) controlPoint2: CGPointMake(221.45, 49.49)]; + [bezier4Path addCurveToPoint: CGPointMake(218.35, 40.59) controlPoint1: CGPointMake(218.44, 45.93) controlPoint2: CGPointMake(217.88, 43.4)]; + [bezier4Path addCurveToPoint: CGPointMake(229.7, 30.85) controlPoint1: CGPointMake(219.26, 34.86) controlPoint2: CGPointMake(223.93, 30.85)]; + [bezier4Path addCurveToPoint: CGPointMake(236.46, 33.61) controlPoint1: CGPointMake(232.58, 30.85) controlPoint2: CGPointMake(234.91, 31.8)]; + [bezier4Path addCurveToPoint: CGPointMake(238.17, 40.77) controlPoint1: CGPointMake(238.01, 35.42) controlPoint2: CGPointMake(238.62, 37.97)]; + [bezier4Path closePath]; + bezier4Path.miterLimit = 4; + + [color0 setFill]; + [bezier4Path fill]; + + + //// Bezier 5 Drawing + UIBezierPath* bezier5Path = [UIBezierPath bezierPath]; + [bezier5Path moveToPoint: CGPointMake(155.38, 21.06)]; + [bezier5Path addLineToPoint: CGPointMake(145.2, 21.06)]; + [bezier5Path addCurveToPoint: CGPointMake(142.76, 22.34) controlPoint1: CGPointMake(144.22, 21.06) controlPoint2: CGPointMake(143.31, 21.54)]; + [bezier5Path addLineToPoint: CGPointMake(128.72, 43.02)]; + [bezier5Path addLineToPoint: CGPointMake(122.77, 23.15)]; + [bezier5Path addCurveToPoint: CGPointMake(119.96, 21.06) controlPoint1: CGPointMake(122.4, 21.91) controlPoint2: CGPointMake(121.26, 21.06)]; + [bezier5Path addLineToPoint: CGPointMake(109.95, 21.06)]; + [bezier5Path addCurveToPoint: CGPointMake(108.28, 23.39) controlPoint1: CGPointMake(108.74, 21.06) controlPoint2: CGPointMake(107.89, 22.24)]; + [bezier5Path addLineToPoint: CGPointMake(119.49, 56.29)]; + [bezier5Path addLineToPoint: CGPointMake(108.95, 71.16)]; + [bezier5Path addCurveToPoint: CGPointMake(110.39, 73.95) controlPoint1: CGPointMake(108.12, 72.33) controlPoint2: CGPointMake(108.96, 73.95)]; + [bezier5Path addLineToPoint: CGPointMake(120.56, 73.95)]; + [bezier5Path addCurveToPoint: CGPointMake(122.97, 72.68) controlPoint1: CGPointMake(121.52, 73.95) controlPoint2: CGPointMake(122.42, 73.47)]; + [bezier5Path addLineToPoint: CGPointMake(156.82, 23.82)]; + [bezier5Path addCurveToPoint: CGPointMake(155.38, 21.06) controlPoint1: CGPointMake(157.63, 22.65) controlPoint2: CGPointMake(156.8, 21.06)]; + [bezier5Path closePath]; + bezier5Path.miterLimit = 4; + + [color1 setFill]; + [bezier5Path fill]; + + + //// Bezier 6 Drawing + UIBezierPath* bezier6Path = [UIBezierPath bezierPath]; + [bezier6Path moveToPoint: CGPointMake(264.22, 2.98)]; + [bezier6Path addLineToPoint: CGPointMake(255.54, 58.21)]; + [bezier6Path addCurveToPoint: CGPointMake(257.29, 60.24) controlPoint1: CGPointMake(255.38, 59.27) controlPoint2: CGPointMake(256.2, 60.24)]; + [bezier6Path addLineToPoint: CGPointMake(266.01, 60.24)]; + [bezier6Path addCurveToPoint: CGPointMake(268.92, 57.76) controlPoint1: CGPointMake(267.46, 60.24) controlPoint2: CGPointMake(268.69, 59.19)]; + [bezier6Path addLineToPoint: CGPointMake(277.48, 3.53)]; + [bezier6Path addCurveToPoint: CGPointMake(275.73, 1.49) controlPoint1: CGPointMake(277.64, 2.46) controlPoint2: CGPointMake(276.82, 1.49)]; + [bezier6Path addLineToPoint: CGPointMake(265.96, 1.49)]; + [bezier6Path addCurveToPoint: CGPointMake(264.22, 2.98) controlPoint1: CGPointMake(265.1, 1.49) controlPoint2: CGPointMake(264.36, 2.12)]; + [bezier6Path closePath]; + bezier6Path.miterLimit = 4; + + [color0 setFill]; + [bezier6Path fill]; + } + } + } +} + +- (void)updateConstraints { + NSLayoutConstraint *aspectRatioConstraint = [NSLayoutConstraint constraintWithItem:self + attribute:NSLayoutAttributeWidth + relatedBy:NSLayoutRelationEqual + toItem:self + attribute:NSLayoutAttributeHeight + multiplier:(self.artDimensions.width / self.artDimensions.height) + constant:0.0f]; + aspectRatioConstraint.priority = UILayoutPriorityRequired; + + [self addConstraint:aspectRatioConstraint]; + + [super updateConstraints]; +} + +- (UILayoutPriority)contentCompressionResistancePriorityForAxis:(__unused UILayoutConstraintAxis)axis { + return UILayoutPriorityRequired; +} + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIUnknownCardVectorArtView.h b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIUnknownCardVectorArtView.h new file mode 100644 index 0000000..fff4f3b --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIUnknownCardVectorArtView.h @@ -0,0 +1,5 @@ +#import "BTUICardVectorArtView.h" + +@interface BTUIUnknownCardVectorArtView : BTUICardVectorArtView + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIUnknownCardVectorArtView.m b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIUnknownCardVectorArtView.m new file mode 100644 index 0000000..45d5bad --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIUnknownCardVectorArtView.m @@ -0,0 +1,306 @@ +#import "BTUIUnknownCardVectorArtView.h" +#import "BTUI.h" + +@implementation BTUIUnknownCardVectorArtView + +- (void)drawArt { + + //// Color Declarations + UIColor* color2 = [UIColor colorWithRed: 0 green: 0 blue: 0 alpha: 0.099]; + UIColor* color1 = self.highlightColor ?: color2; + + //// Page-1 + { + //// Unknown + { + //// Card-# + { + //// CC-numbers + { + //// CC-number + { + //// Bezier Drawing + UIBezierPath* bezierPath = [UIBezierPath bezierPath]; + [bezierPath moveToPoint: CGPointMake(6, 30)]; + [bezierPath addLineToPoint: CGPointMake(8, 30)]; + [bezierPath addLineToPoint: CGPointMake(8, 36)]; + [bezierPath addLineToPoint: CGPointMake(6, 36)]; + [bezierPath addLineToPoint: CGPointMake(6, 30)]; + [bezierPath closePath]; + bezierPath.miterLimit = 4; + + bezierPath.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezierPath fill]; + + + //// Bezier 2 Drawing + UIBezierPath* bezier2Path = [UIBezierPath bezierPath]; + [bezier2Path moveToPoint: CGPointMake(10, 30)]; + [bezier2Path addLineToPoint: CGPointMake(12, 30)]; + [bezier2Path addLineToPoint: CGPointMake(12, 36)]; + [bezier2Path addLineToPoint: CGPointMake(10, 36)]; + [bezier2Path addLineToPoint: CGPointMake(10, 30)]; + [bezier2Path closePath]; + bezier2Path.miterLimit = 4; + + bezier2Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier2Path fill]; + + + //// Bezier 3 Drawing + UIBezierPath* bezier3Path = [UIBezierPath bezierPath]; + [bezier3Path moveToPoint: CGPointMake(14, 30)]; + [bezier3Path addLineToPoint: CGPointMake(16, 30)]; + [bezier3Path addLineToPoint: CGPointMake(16, 36)]; + [bezier3Path addLineToPoint: CGPointMake(14, 36)]; + [bezier3Path addLineToPoint: CGPointMake(14, 30)]; + [bezier3Path closePath]; + bezier3Path.miterLimit = 4; + + bezier3Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier3Path fill]; + + + //// Bezier 4 Drawing + UIBezierPath* bezier4Path = [UIBezierPath bezierPath]; + [bezier4Path moveToPoint: CGPointMake(18, 30)]; + [bezier4Path addLineToPoint: CGPointMake(20, 30)]; + [bezier4Path addLineToPoint: CGPointMake(20, 36)]; + [bezier4Path addLineToPoint: CGPointMake(18, 36)]; + [bezier4Path addLineToPoint: CGPointMake(18, 30)]; + [bezier4Path closePath]; + bezier4Path.miterLimit = 4; + + bezier4Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier4Path fill]; + + + //// Bezier 5 Drawing + UIBezierPath* bezier5Path = [UIBezierPath bezierPath]; + [bezier5Path moveToPoint: CGPointMake(26, 30)]; + [bezier5Path addLineToPoint: CGPointMake(28, 30)]; + [bezier5Path addLineToPoint: CGPointMake(28, 36)]; + [bezier5Path addLineToPoint: CGPointMake(26, 36)]; + [bezier5Path addLineToPoint: CGPointMake(26, 30)]; + [bezier5Path closePath]; + bezier5Path.miterLimit = 4; + + bezier5Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier5Path fill]; + + + //// Bezier 6 Drawing + UIBezierPath* bezier6Path = [UIBezierPath bezierPath]; + [bezier6Path moveToPoint: CGPointMake(30, 30)]; + [bezier6Path addLineToPoint: CGPointMake(32, 30)]; + [bezier6Path addLineToPoint: CGPointMake(32, 36)]; + [bezier6Path addLineToPoint: CGPointMake(30, 36)]; + [bezier6Path addLineToPoint: CGPointMake(30, 30)]; + [bezier6Path closePath]; + bezier6Path.miterLimit = 4; + + bezier6Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier6Path fill]; + + + //// Bezier 7 Drawing + UIBezierPath* bezier7Path = [UIBezierPath bezierPath]; + [bezier7Path moveToPoint: CGPointMake(34, 30)]; + [bezier7Path addLineToPoint: CGPointMake(36, 30)]; + [bezier7Path addLineToPoint: CGPointMake(36, 36)]; + [bezier7Path addLineToPoint: CGPointMake(34, 36)]; + [bezier7Path addLineToPoint: CGPointMake(34, 30)]; + [bezier7Path closePath]; + bezier7Path.miterLimit = 4; + + bezier7Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier7Path fill]; + + + //// Bezier 8 Drawing + UIBezierPath* bezier8Path = [UIBezierPath bezierPath]; + [bezier8Path moveToPoint: CGPointMake(38, 30)]; + [bezier8Path addLineToPoint: CGPointMake(40, 30)]; + [bezier8Path addLineToPoint: CGPointMake(40, 36)]; + [bezier8Path addLineToPoint: CGPointMake(38, 36)]; + [bezier8Path addLineToPoint: CGPointMake(38, 30)]; + [bezier8Path closePath]; + bezier8Path.miterLimit = 4; + + bezier8Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier8Path fill]; + + + //// Bezier 9 Drawing + UIBezierPath* bezier9Path = [UIBezierPath bezierPath]; + [bezier9Path moveToPoint: CGPointMake(46, 30)]; + [bezier9Path addLineToPoint: CGPointMake(48, 30)]; + [bezier9Path addLineToPoint: CGPointMake(48, 36)]; + [bezier9Path addLineToPoint: CGPointMake(46, 36)]; + [bezier9Path addLineToPoint: CGPointMake(46, 30)]; + [bezier9Path closePath]; + bezier9Path.miterLimit = 4; + + bezier9Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier9Path fill]; + + + //// Bezier 10 Drawing + UIBezierPath* bezier10Path = [UIBezierPath bezierPath]; + [bezier10Path moveToPoint: CGPointMake(50, 30)]; + [bezier10Path addLineToPoint: CGPointMake(52, 30)]; + [bezier10Path addLineToPoint: CGPointMake(52, 36)]; + [bezier10Path addLineToPoint: CGPointMake(50, 36)]; + [bezier10Path addLineToPoint: CGPointMake(50, 30)]; + [bezier10Path closePath]; + bezier10Path.miterLimit = 4; + + bezier10Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier10Path fill]; + + + //// Bezier 11 Drawing + UIBezierPath* bezier11Path = [UIBezierPath bezierPath]; + [bezier11Path moveToPoint: CGPointMake(54, 30)]; + [bezier11Path addLineToPoint: CGPointMake(56, 30)]; + [bezier11Path addLineToPoint: CGPointMake(56, 36)]; + [bezier11Path addLineToPoint: CGPointMake(54, 36)]; + [bezier11Path addLineToPoint: CGPointMake(54, 30)]; + [bezier11Path closePath]; + bezier11Path.miterLimit = 4; + + bezier11Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier11Path fill]; + + + //// Bezier 12 Drawing + UIBezierPath* bezier12Path = [UIBezierPath bezierPath]; + [bezier12Path moveToPoint: CGPointMake(58, 30)]; + [bezier12Path addLineToPoint: CGPointMake(60, 30)]; + [bezier12Path addLineToPoint: CGPointMake(60, 36)]; + [bezier12Path addLineToPoint: CGPointMake(58, 36)]; + [bezier12Path addLineToPoint: CGPointMake(58, 30)]; + [bezier12Path closePath]; + bezier12Path.miterLimit = 4; + + bezier12Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier12Path fill]; + + + //// Bezier 13 Drawing + UIBezierPath* bezier13Path = [UIBezierPath bezierPath]; + [bezier13Path moveToPoint: CGPointMake(66, 30)]; + [bezier13Path addLineToPoint: CGPointMake(68, 30)]; + [bezier13Path addLineToPoint: CGPointMake(68, 36)]; + [bezier13Path addLineToPoint: CGPointMake(66, 36)]; + [bezier13Path addLineToPoint: CGPointMake(66, 30)]; + [bezier13Path closePath]; + bezier13Path.miterLimit = 4; + + bezier13Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier13Path fill]; + + + //// Bezier 14 Drawing + UIBezierPath* bezier14Path = [UIBezierPath bezierPath]; + [bezier14Path moveToPoint: CGPointMake(70, 30)]; + [bezier14Path addLineToPoint: CGPointMake(72, 30)]; + [bezier14Path addLineToPoint: CGPointMake(72, 36)]; + [bezier14Path addLineToPoint: CGPointMake(70, 36)]; + [bezier14Path addLineToPoint: CGPointMake(70, 30)]; + [bezier14Path closePath]; + bezier14Path.miterLimit = 4; + + bezier14Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier14Path fill]; + + + //// Bezier 15 Drawing + UIBezierPath* bezier15Path = [UIBezierPath bezierPath]; + [bezier15Path moveToPoint: CGPointMake(74, 30)]; + [bezier15Path addLineToPoint: CGPointMake(76, 30)]; + [bezier15Path addLineToPoint: CGPointMake(76, 36)]; + [bezier15Path addLineToPoint: CGPointMake(74, 36)]; + [bezier15Path addLineToPoint: CGPointMake(74, 30)]; + [bezier15Path closePath]; + bezier15Path.miterLimit = 4; + + bezier15Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier15Path fill]; + + + //// Bezier 16 Drawing + UIBezierPath* bezier16Path = [UIBezierPath bezierPath]; + [bezier16Path moveToPoint: CGPointMake(78, 30)]; + [bezier16Path addLineToPoint: CGPointMake(80, 30)]; + [bezier16Path addLineToPoint: CGPointMake(80, 36)]; + [bezier16Path addLineToPoint: CGPointMake(78, 36)]; + [bezier16Path addLineToPoint: CGPointMake(78, 30)]; + [bezier16Path closePath]; + bezier16Path.miterLimit = 4; + + bezier16Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier16Path fill]; + } + + + //// Rectangle Drawing + UIBezierPath* rectanglePath = [UIBezierPath bezierPathWithRect: CGRectMake(26, 42, 14, 2)]; + [color2 setFill]; + [rectanglePath fill]; + + + //// Rectangle 2 Drawing + UIBezierPath* rectangle2Path = [UIBezierPath bezierPathWithRect: CGRectMake(6, 46, 34, 2)]; + [color2 setFill]; + [rectangle2Path fill]; + } + + + //// Rounded Rectangle Drawing + UIBezierPath* roundedRectanglePath = [UIBezierPath bezierPathWithRoundedRect: CGRectMake(6, 6, 14, 14) cornerRadius: 0.75]; + [color2 setFill]; + [roundedRectanglePath fill]; + + + //// Rounded Rectangle 2 Drawing + UIBezierPath* roundedRectangle2Path = [UIBezierPath bezierPathWithRoundedRect: CGRectMake(72, 40, 8, 8) cornerRadius: 0.75]; + [color2 setFill]; + [roundedRectangle2Path fill]; + } + } + } +} +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIVenmoWordmarkVectorArtView.h b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIVenmoWordmarkVectorArtView.h new file mode 100644 index 0000000..37c8059 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIVenmoWordmarkVectorArtView.h @@ -0,0 +1,7 @@ +#import "BTUIVectorArtView.h" + +@interface BTUIVenmoWordmarkVectorArtView : BTUIVectorArtView + +@property (nonatomic, strong) UIColor *color; + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIVenmoWordmarkVectorArtView.m b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIVenmoWordmarkVectorArtView.m new file mode 100644 index 0000000..9deb4c3 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIVenmoWordmarkVectorArtView.m @@ -0,0 +1,189 @@ +#import "BTUIVenmoWordmarkVectorArtView.h" + +@implementation BTUIVenmoWordmarkVectorArtView + +- (id)init { + self = [super init]; + if (self) { + self.artDimensions = CGSizeMake(132, 88); + self.opaque = NO; + } + return self; +} + +- (void)setColor:(UIColor *)color { + _color = color; + [self setNeedsDisplay]; +} + +- (void)drawArt { + //// Color Declarations + UIColor* color = self.color; //[UIColor colorWithRed: 0.194 green: 0.507 blue: 0.764 alpha: 1]; + + //// Assets + { + //// button-venmo + { + //// Rectangle Drawing + + + //// logo/venmo + { + //// Bezier Drawing + UIBezierPath* bezierPath = [UIBezierPath bezierPath]; + [bezierPath moveToPoint: CGPointMake(70.02, 53.98)]; + [bezierPath addCurveToPoint: CGPointMake(70.02, 52.78) controlPoint1: CGPointMake(70.02, 53.43) controlPoint2: CGPointMake(69.97, 53.09)]; + [bezierPath addCurveToPoint: CGPointMake(72.56, 36.46) controlPoint1: CGPointMake(70.87, 47.34) controlPoint2: CGPointMake(71.77, 41.9)]; + [bezierPath addCurveToPoint: CGPointMake(74.94, 34.44) controlPoint1: CGPointMake(72.87, 34.33) controlPoint2: CGPointMake(72.83, 34.43)]; + [bezierPath addCurveToPoint: CGPointMake(76.91, 34.43) controlPoint1: CGPointMake(75.59, 34.44) controlPoint2: CGPointMake(76.25, 34.48)]; + [bezierPath addCurveToPoint: CGPointMake(78.78, 35.72) controlPoint1: CGPointMake(77.84, 34.35) controlPoint2: CGPointMake(78.63, 34.46)]; + [bezierPath addCurveToPoint: CGPointMake(79.63, 35.35) controlPoint1: CGPointMake(79.13, 35.57) controlPoint2: CGPointMake(79.39, 35.49)]; + [bezierPath addCurveToPoint: CGPointMake(83.08, 34.11) controlPoint1: CGPointMake(80.7, 34.71) controlPoint2: CGPointMake(81.84, 34.3)]; + [bezierPath addCurveToPoint: CGPointMake(87.94, 35.56) controlPoint1: CGPointMake(84.94, 33.83) controlPoint2: CGPointMake(86.59, 34.13)]; + [bezierPath addCurveToPoint: CGPointMake(88.47, 35.99) controlPoint1: CGPointMake(88.08, 35.71) controlPoint2: CGPointMake(88.26, 35.82)]; + [bezierPath addCurveToPoint: CGPointMake(90.53, 34.9) controlPoint1: CGPointMake(89.16, 35.62) controlPoint2: CGPointMake(89.83, 35.22)]; + [bezierPath addCurveToPoint: CGPointMake(96.29, 34.23) controlPoint1: CGPointMake(92.38, 34.05) controlPoint2: CGPointMake(94.29, 33.75)]; + [bezierPath addCurveToPoint: CGPointMake(99, 37.48) controlPoint1: CGPointMake(97.97, 34.63) controlPoint2: CGPointMake(98.97, 35.72)]; + [bezierPath addCurveToPoint: CGPointMake(98.7, 41.97) controlPoint1: CGPointMake(99.02, 38.98) controlPoint2: CGPointMake(98.91, 40.49)]; + [bezierPath addCurveToPoint: CGPointMake(97.05, 52.6) controlPoint1: CGPointMake(98.2, 45.52) controlPoint2: CGPointMake(97.6, 49.06)]; + [bezierPath addCurveToPoint: CGPointMake(95.52, 53.99) controlPoint1: CGPointMake(96.84, 53.93) controlPoint2: CGPointMake(96.8, 53.99)]; + [bezierPath addCurveToPoint: CGPointMake(91.7, 53.99) controlPoint1: CGPointMake(94.24, 54) controlPoint2: CGPointMake(92.97, 54)]; + [bezierPath addCurveToPoint: CGPointMake(90.47, 53.9) controlPoint1: CGPointMake(91.34, 53.99) controlPoint2: CGPointMake(90.98, 53.94)]; + [bezierPath addCurveToPoint: CGPointMake(90.55, 52.4) controlPoint1: CGPointMake(90.5, 53.35) controlPoint2: CGPointMake(90.48, 52.87)]; + [bezierPath addCurveToPoint: CGPointMake(92.22, 41.39) controlPoint1: CGPointMake(91.1, 48.73) controlPoint2: CGPointMake(91.66, 45.06)]; + [bezierPath addCurveToPoint: CGPointMake(92.28, 40.52) controlPoint1: CGPointMake(92.26, 41.1) controlPoint2: CGPointMake(92.32, 40.8)]; + [bezierPath addCurveToPoint: CGPointMake(91.24, 39.51) controlPoint1: CGPointMake(92.21, 39.89) controlPoint2: CGPointMake(91.84, 39.46)]; + [bezierPath addCurveToPoint: CGPointMake(89.13, 40.07) controlPoint1: CGPointMake(90.52, 39.58) controlPoint2: CGPointMake(89.78, 39.77)]; + [bezierPath addCurveToPoint: CGPointMake(88.65, 41.13) controlPoint1: CGPointMake(88.86, 40.2) controlPoint2: CGPointMake(88.71, 40.75)]; + [bezierPath addCurveToPoint: CGPointMake(87.43, 48.92) controlPoint1: CGPointMake(88.22, 43.72) controlPoint2: CGPointMake(87.83, 46.32)]; + [bezierPath addCurveToPoint: CGPointMake(86.63, 53.9) controlPoint1: CGPointMake(87.17, 50.56) controlPoint2: CGPointMake(86.91, 52.2)]; + [bezierPath addLineToPoint: CGPointMake(80.17, 53.9)]; + [bezierPath addCurveToPoint: CGPointMake(80.62, 50.53) controlPoint1: CGPointMake(80.33, 52.73) controlPoint2: CGPointMake(80.45, 51.62)]; + [bezierPath addCurveToPoint: CGPointMake(81.96, 42.12) controlPoint1: CGPointMake(81.06, 47.72) controlPoint2: CGPointMake(81.52, 44.93)]; + [bezierPath addCurveToPoint: CGPointMake(82.02, 40.63) controlPoint1: CGPointMake(82.03, 41.63) controlPoint2: CGPointMake(82.08, 41.12)]; + [bezierPath addCurveToPoint: CGPointMake(81.53, 39.69) controlPoint1: CGPointMake(81.97, 40.29) controlPoint2: CGPointMake(81.79, 39.88)]; + [bezierPath addCurveToPoint: CGPointMake(78.43, 40.93) controlPoint1: CGPointMake(80.64, 39.03) controlPoint2: CGPointMake(78.64, 39.84)]; + [bezierPath addCurveToPoint: CGPointMake(77.86, 44.51) controlPoint1: CGPointMake(78.2, 42.12) controlPoint2: CGPointMake(78.04, 43.32)]; + [bezierPath addCurveToPoint: CGPointMake(76.58, 53.05) controlPoint1: CGPointMake(77.43, 47.36) controlPoint2: CGPointMake(77, 50.2)]; + [bezierPath addCurveToPoint: CGPointMake(75.81, 53.98) controlPoint1: CGPointMake(76.51, 53.55) controlPoint2: CGPointMake(76.4, 53.97)]; + [bezierPath addCurveToPoint: CGPointMake(70.02, 53.98) controlPoint1: CGPointMake(73.93, 53.98) controlPoint2: CGPointMake(72.05, 53.98)]; + [bezierPath closePath]; + [bezierPath moveToPoint: CGPointMake(65.64, 53.85)]; + [bezierPath addCurveToPoint: CGPointMake(59.25, 53.73) controlPoint1: CGPointMake(64, 54.09) controlPoint2: CGPointMake(60.19, 54.03)]; + [bezierPath addCurveToPoint: CGPointMake(59.71, 50.43) controlPoint1: CGPointMake(59.4, 52.64) controlPoint2: CGPointMake(59.54, 51.53)]; + [bezierPath addCurveToPoint: CGPointMake(61.06, 41.78) controlPoint1: CGPointMake(60.16, 47.55) controlPoint2: CGPointMake(60.61, 44.67)]; + [bezierPath addCurveToPoint: CGPointMake(58.66, 39.69) controlPoint1: CGPointMake(61.39, 39.72) controlPoint2: CGPointMake(60.6, 39.04)]; + [bezierPath addCurveToPoint: CGPointMake(57.43, 41.2) controlPoint1: CGPointMake(57.9, 39.94) controlPoint2: CGPointMake(57.55, 40.4)]; + [bezierPath addCurveToPoint: CGPointMake(55.71, 52.57) controlPoint1: CGPointMake(56.88, 45) controlPoint2: CGPointMake(56.29, 48.78)]; + [bezierPath addCurveToPoint: CGPointMake(54.19, 53.98) controlPoint1: CGPointMake(55.51, 53.92) controlPoint2: CGPointMake(55.46, 53.97)]; + [bezierPath addCurveToPoint: CGPointMake(49, 53.98) controlPoint1: CGPointMake(52.51, 53.99) controlPoint2: CGPointMake(50.84, 53.98)]; + [bezierPath addCurveToPoint: CGPointMake(49.38, 50.94) controlPoint1: CGPointMake(49.13, 52.89) controlPoint2: CGPointMake(49.22, 51.91)]; + [bezierPath addCurveToPoint: CGPointMake(51.46, 37.73) controlPoint1: CGPointMake(50.06, 46.54) controlPoint2: CGPointMake(50.76, 42.14)]; + [bezierPath addCurveToPoint: CGPointMake(51.8, 35.38) controlPoint1: CGPointMake(51.58, 36.95) controlPoint2: CGPointMake(51.71, 36.17)]; + [bezierPath addCurveToPoint: CGPointMake(52.73, 34.45) controlPoint1: CGPointMake(51.86, 34.79) controlPoint2: CGPointMake(52.12, 34.45)]; + [bezierPath addCurveToPoint: CGPointMake(56.91, 34.44) controlPoint1: CGPointMake(54.12, 34.45) controlPoint2: CGPointMake(55.52, 34.47)]; + [bezierPath addCurveToPoint: CGPointMake(57.91, 35.69) controlPoint1: CGPointMake(57.69, 34.43) controlPoint2: CGPointMake(57.61, 35.12)]; + [bezierPath addCurveToPoint: CGPointMake(59.21, 35.06) controlPoint1: CGPointMake(58.36, 35.47) controlPoint2: CGPointMake(58.79, 35.27)]; + [bezierPath addCurveToPoint: CGPointMake(65.29, 34.26) controlPoint1: CGPointMake(61.15, 34.1) controlPoint2: CGPointMake(63.16, 33.69)]; + [bezierPath addCurveToPoint: CGPointMake(67.84, 37) controlPoint1: CGPointMake(66.7, 34.64) controlPoint2: CGPointMake(67.49, 35.55)]; + [bezierPath addCurveToPoint: CGPointMake(67.73, 40.97) controlPoint1: CGPointMake(68.17, 38.36) controlPoint2: CGPointMake(67.92, 39.67)]; + [bezierPath addCurveToPoint: CGPointMake(65.8, 53.33) controlPoint1: CGPointMake(67.14, 45.1) controlPoint2: CGPointMake(66.45, 49.21)]; + [bezierPath addCurveToPoint: CGPointMake(65.64, 53.85) controlPoint1: CGPointMake(65.77, 53.49) controlPoint2: CGPointMake(65.71, 53.64)]; + [bezierPath closePath]; + [bezierPath moveToPoint: CGPointMake(118.98, 42.12)]; + [bezierPath addCurveToPoint: CGPointMake(117.38, 48.99) controlPoint1: CGPointMake(119.11, 44.56) controlPoint2: CGPointMake(118.6, 46.87)]; + [bezierPath addCurveToPoint: CGPointMake(108.97, 54) controlPoint1: CGPointMake(115.52, 52.2) controlPoint2: CGPointMake(112.75, 53.97)]; + [bezierPath addCurveToPoint: CGPointMake(105.76, 53.8) controlPoint1: CGPointMake(107.9, 54) controlPoint2: CGPointMake(106.8, 54.02)]; + [bezierPath addCurveToPoint: CGPointMake(101.19, 49.25) controlPoint1: CGPointMake(103.3, 53.26) controlPoint2: CGPointMake(101.73, 51.62)]; + [bezierPath addCurveToPoint: CGPointMake(102.47, 38.85) controlPoint1: CGPointMake(100.37, 45.67) controlPoint2: CGPointMake(100.59, 42.13)]; + [bezierPath addCurveToPoint: CGPointMake(109.3, 34.21) controlPoint1: CGPointMake(103.99, 36.22) controlPoint2: CGPointMake(106.29, 34.71)]; + [bezierPath addCurveToPoint: CGPointMake(113.49, 34.2) controlPoint1: CGPointMake(110.7, 33.97) controlPoint2: CGPointMake(112.08, 33.96)]; + [bezierPath addCurveToPoint: CGPointMake(118.97, 40.15) controlPoint1: CGPointMake(116.67, 34.74) controlPoint2: CGPointMake(118.72, 36.92)]; + [bezierPath addCurveToPoint: CGPointMake(118.98, 42.12) controlPoint1: CGPointMake(119.02, 40.8) controlPoint2: CGPointMake(118.98, 41.46)]; + [bezierPath closePath]; + [bezierPath moveToPoint: CGPointMake(107.37, 45.48)]; + [bezierPath addCurveToPoint: CGPointMake(107.54, 45.5) controlPoint1: CGPointMake(107.43, 45.48) controlPoint2: CGPointMake(107.48, 45.49)]; + [bezierPath addCurveToPoint: CGPointMake(107.55, 47.1) controlPoint1: CGPointMake(107.54, 46.04) controlPoint2: CGPointMake(107.5, 46.57)]; + [bezierPath addCurveToPoint: CGPointMake(108.89, 48.99) controlPoint1: CGPointMake(107.64, 48.09) controlPoint2: CGPointMake(108.18, 48.82)]; + [bezierPath addCurveToPoint: CGPointMake(110.96, 47.92) controlPoint1: CGPointMake(109.58, 49.16) controlPoint2: CGPointMake(110.4, 48.74)]; + [bezierPath addCurveToPoint: CGPointMake(111.09, 47.71) controlPoint1: CGPointMake(111, 47.85) controlPoint2: CGPointMake(111.05, 47.79)]; + [bezierPath addCurveToPoint: CGPointMake(112.18, 40.52) controlPoint1: CGPointMake(112.23, 45.43) controlPoint2: CGPointMake(112.51, 43.02)]; + [bezierPath addCurveToPoint: CGPointMake(111.11, 39.14) controlPoint1: CGPointMake(112.1, 39.9) controlPoint2: CGPointMake(111.81, 39.33)]; + [bezierPath addCurveToPoint: CGPointMake(109.2, 39.73) controlPoint1: CGPointMake(110.36, 38.95) controlPoint2: CGPointMake(109.66, 39.14)]; + [bezierPath addCurveToPoint: CGPointMake(108.08, 41.75) controlPoint1: CGPointMake(108.73, 40.33) controlPoint2: CGPointMake(108.29, 41.03)]; + [bezierPath addCurveToPoint: CGPointMake(107.37, 45.48) controlPoint1: CGPointMake(107.74, 42.96) controlPoint2: CGPointMake(107.6, 44.23)]; + [bezierPath closePath]; + [bezierPath moveToPoint: CGPointMake(12, 35.08)]; + [bezierPath addCurveToPoint: CGPointMake(13.83, 34.83) controlPoint1: CGPointMake(12.73, 34.98) controlPoint2: CGPointMake(13.28, 34.89)]; + [bezierPath addCurveToPoint: CGPointMake(17.44, 34.46) controlPoint1: CGPointMake(15.03, 34.69) controlPoint2: CGPointMake(16.24, 34.55)]; + [bezierPath addCurveToPoint: CGPointMake(18.72, 35.54) controlPoint1: CGPointMake(18.39, 34.39) controlPoint2: CGPointMake(18.6, 34.58)]; + [bezierPath addCurveToPoint: CGPointMake(19.75, 44.26) controlPoint1: CGPointMake(19.08, 38.45) controlPoint2: CGPointMake(19.4, 41.36)]; + [bezierPath addCurveToPoint: CGPointMake(20.28, 47.47) controlPoint1: CGPointMake(19.87, 45.33) controlPoint2: CGPointMake(20.02, 46.39)]; + [bezierPath addCurveToPoint: CGPointMake(23.06, 41.7) controlPoint1: CGPointMake(21.55, 45.7) controlPoint2: CGPointMake(22.38, 43.74)]; + [bezierPath addCurveToPoint: CGPointMake(23.16, 35.38) controlPoint1: CGPointMake(23.75, 39.62) controlPoint2: CGPointMake(23.88, 37.53)]; + [bezierPath addCurveToPoint: CGPointMake(23.98, 34.99) controlPoint1: CGPointMake(23.49, 35.22) controlPoint2: CGPointMake(23.72, 35.05)]; + [bezierPath addCurveToPoint: CGPointMake(28.25, 34.07) controlPoint1: CGPointMake(25.4, 34.67) controlPoint2: CGPointMake(26.82, 34.36)]; + [bezierPath addCurveToPoint: CGPointMake(29.46, 34.73) controlPoint1: CGPointMake(29.01, 33.91) controlPoint2: CGPointMake(29.17, 33.97)]; + [bezierPath addCurveToPoint: CGPointMake(29.93, 36.66) controlPoint1: CGPointMake(29.69, 35.35) controlPoint2: CGPointMake(29.86, 36.01)]; + [bezierPath addCurveToPoint: CGPointMake(28.75, 43.64) controlPoint1: CGPointMake(30.19, 39.1) controlPoint2: CGPointMake(29.68, 41.41)]; + [bezierPath addCurveToPoint: CGPointMake(23.03, 53.4) controlPoint1: CGPointMake(27.27, 47.16) controlPoint2: CGPointMake(25.23, 50.33)]; + [bezierPath addCurveToPoint: CGPointMake(22.17, 53.97) controlPoint1: CGPointMake(22.84, 53.67) controlPoint2: CGPointMake(22.46, 53.96)]; + [bezierPath addCurveToPoint: CGPointMake(15.03, 54) controlPoint1: CGPointMake(19.83, 54.02) controlPoint2: CGPointMake(17.49, 54)]; + [bezierPath addCurveToPoint: CGPointMake(13.49, 44.53) controlPoint1: CGPointMake(14.51, 50.78) controlPoint2: CGPointMake(13.99, 47.65)]; + [bezierPath addCurveToPoint: CGPointMake(12, 35.08) controlPoint1: CGPointMake(12.99, 41.41) controlPoint2: CGPointMake(12.4, 38.31)]; + [bezierPath closePath]; + [bezierPath moveToPoint: CGPointMake(38.37, 45.72)]; + [bezierPath addCurveToPoint: CGPointMake(41.21, 48.8) controlPoint1: CGPointMake(38.38, 47.8) controlPoint2: CGPointMake(39.3, 48.75)]; + [bezierPath addCurveToPoint: CGPointMake(45.43, 47.88) controlPoint1: CGPointMake(42.69, 48.84) controlPoint2: CGPointMake(44.07, 48.4)]; + [bezierPath addCurveToPoint: CGPointMake(46.75, 47.34) controlPoint1: CGPointMake(45.8, 47.73) controlPoint2: CGPointMake(46.18, 47.57)]; + [bezierPath addCurveToPoint: CGPointMake(45.97, 52.45) controlPoint1: CGPointMake(46.49, 49.15) controlPoint2: CGPointMake(46.28, 50.81)]; + [bezierPath addCurveToPoint: CGPointMake(45.18, 53.12) controlPoint1: CGPointMake(45.92, 52.72) controlPoint2: CGPointMake(45.5, 53.03)]; + [bezierPath addCurveToPoint: CGPointMake(42.05, 53.85) controlPoint1: CGPointMake(44.15, 53.42) controlPoint2: CGPointMake(43.11, 53.75)]; + [bezierPath addCurveToPoint: CGPointMake(37.72, 53.88) controlPoint1: CGPointMake(40.62, 53.98) controlPoint2: CGPointMake(39.14, 54.06)]; + [bezierPath addCurveToPoint: CGPointMake(31.74, 47.78) controlPoint1: CGPointMake(34.3, 53.45) controlPoint2: CGPointMake(32.15, 51.27)]; + [bezierPath addCurveToPoint: CGPointMake(34.04, 38.05) controlPoint1: CGPointMake(31.32, 44.29) controlPoint2: CGPointMake(31.95, 40.99)]; + [bezierPath addCurveToPoint: CGPointMake(44.6, 34.35) controlPoint1: CGPointMake(36.45, 34.65) controlPoint2: CGPointMake(40.9, 33.31)]; + [bezierPath addCurveToPoint: CGPointMake(46.79, 42.8) controlPoint1: CGPointMake(48.43, 35.42) controlPoint2: CGPointMake(49.6, 39.99)]; + [bezierPath addCurveToPoint: CGPointMake(41.48, 45.3) controlPoint1: CGPointMake(45.32, 44.27) controlPoint2: CGPointMake(43.45, 44.9)]; + [bezierPath addCurveToPoint: CGPointMake(38.37, 45.72) controlPoint1: CGPointMake(40.48, 45.5) controlPoint2: CGPointMake(39.45, 45.58)]; + [bezierPath closePath]; + [bezierPath moveToPoint: CGPointMake(38.49, 42.08)]; + [bezierPath addCurveToPoint: CGPointMake(42.3, 40.96) controlPoint1: CGPointMake(40.01, 42.18) controlPoint2: CGPointMake(41.22, 41.79)]; + [bezierPath addCurveToPoint: CGPointMake(42.73, 40.36) controlPoint1: CGPointMake(42.49, 40.82) controlPoint2: CGPointMake(42.63, 40.58)]; + [bezierPath addCurveToPoint: CGPointMake(42.52, 38.87) controlPoint1: CGPointMake(42.96, 39.83) controlPoint2: CGPointMake(42.92, 39.31)]; + [bezierPath addCurveToPoint: CGPointMake(41.16, 38.52) controlPoint1: CGPointMake(42.16, 38.46) controlPoint2: CGPointMake(41.68, 38.36)]; + [bezierPath addCurveToPoint: CGPointMake(40.36, 38.85) controlPoint1: CGPointMake(40.88, 38.6) controlPoint2: CGPointMake(40.59, 38.69)]; + [bezierPath addCurveToPoint: CGPointMake(38.49, 42.08) controlPoint1: CGPointMake(39.31, 39.6) controlPoint2: CGPointMake(38.62, 40.57)]; + [bezierPath addLineToPoint: CGPointMake(38.49, 42.08)]; + [bezierPath closePath]; + bezierPath.miterLimit = 4; + + bezierPath.usesEvenOddFillRule = YES; + + [color setFill]; + [bezierPath fill]; + } + } + } +} + +- (void)updateConstraints { + NSLayoutConstraint *aspectRatioConstraint = [NSLayoutConstraint constraintWithItem:self + attribute:NSLayoutAttributeWidth + relatedBy:NSLayoutRelationEqual + toItem:self + attribute:NSLayoutAttributeHeight + multiplier:(self.artDimensions.width / self.artDimensions.height) + constant:0.0f]; + aspectRatioConstraint.priority = UILayoutPriorityRequired; + + [self addConstraint:aspectRatioConstraint]; + + [super updateConstraints]; +} + +- (UILayoutPriority)contentCompressionResistancePriorityForAxis:(__unused UILayoutConstraintAxis)axis { + return UILayoutPriorityRequired; +} + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIVisaVectorArtView.h b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIVisaVectorArtView.h new file mode 100644 index 0000000..8516593 --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIVisaVectorArtView.h @@ -0,0 +1,5 @@ +#import "BTUICardVectorArtView.h" + +@interface BTUIVisaVectorArtView : BTUICardVectorArtView + +@end diff --git a/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIVisaVectorArtView.m b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIVisaVectorArtView.m new file mode 100644 index 0000000..4ff958a --- /dev/null +++ b/Pods/Braintree/Braintree/UI/Views/Vector Art/BTUIVisaVectorArtView.m @@ -0,0 +1,128 @@ +#import "BTUIVisaVectorArtView.h" + +@implementation BTUIVisaVectorArtView + +- (void)drawArt { + //// Color Declarations + UIColor* color2 = [UIColor colorWithRed: 0.914 green: 0.555 blue: 0.193 alpha: 1]; + UIColor* color1 = [UIColor colorWithRed: 0.033 green: 0.277 blue: 0.542 alpha: 1]; + + //// Page-1 + { + //// Visa + { + //// Group 3 + { + //// Bezier Drawing + UIBezierPath* bezierPath = [UIBezierPath bezierPath]; + [bezierPath moveToPoint: CGPointMake(37.45, 38.09)]; + [bezierPath addLineToPoint: CGPointMake(32.1, 38.09)]; + [bezierPath addLineToPoint: CGPointMake(35.45, 17)]; + [bezierPath addLineToPoint: CGPointMake(40.8, 17)]; + [bezierPath addLineToPoint: CGPointMake(37.45, 38.09)]; + [bezierPath closePath]; + bezierPath.miterLimit = 4; + + bezierPath.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezierPath fill]; + + + //// Bezier 2 Drawing + UIBezierPath* bezier2Path = [UIBezierPath bezierPath]; + [bezier2Path moveToPoint: CGPointMake(27.58, 17)]; + [bezier2Path addLineToPoint: CGPointMake(22.48, 31.5)]; + [bezier2Path addLineToPoint: CGPointMake(21.88, 28.38)]; + [bezier2Path addLineToPoint: CGPointMake(21.88, 28.38)]; + [bezier2Path addLineToPoint: CGPointMake(20.07, 18.9)]; + [bezier2Path addCurveToPoint: CGPointMake(17.53, 17) controlPoint1: CGPointMake(20.07, 18.9) controlPoint2: CGPointMake(19.86, 17)]; + [bezier2Path addLineToPoint: CGPointMake(9.1, 17)]; + [bezier2Path addLineToPoint: CGPointMake(9, 17.36)]; + [bezier2Path addCurveToPoint: CGPointMake(14.6, 19.77) controlPoint1: CGPointMake(9, 17.36) controlPoint2: CGPointMake(11.58, 17.91)]; + [bezier2Path addLineToPoint: CGPointMake(19.25, 38.09)]; + [bezier2Path addLineToPoint: CGPointMake(24.83, 38.09)]; + [bezier2Path addLineToPoint: CGPointMake(33.34, 17)]; + [bezier2Path addLineToPoint: CGPointMake(27.58, 17)]; + [bezier2Path closePath]; + bezier2Path.miterLimit = 4; + + bezier2Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier2Path fill]; + + + //// Bezier 3 Drawing + UIBezierPath* bezier3Path = [UIBezierPath bezierPath]; + [bezier3Path moveToPoint: CGPointMake(63.99, 30.63)]; + [bezier3Path addLineToPoint: CGPointMake(66.8, 22.74)]; + [bezier3Path addLineToPoint: CGPointMake(68.38, 30.63)]; + [bezier3Path addLineToPoint: CGPointMake(63.99, 30.63)]; + [bezier3Path addLineToPoint: CGPointMake(63.99, 30.63)]; + [bezier3Path addLineToPoint: CGPointMake(63.99, 30.63)]; + [bezier3Path addLineToPoint: CGPointMake(63.99, 30.63)]; + [bezier3Path closePath]; + [bezier3Path moveToPoint: CGPointMake(69.88, 38.09)]; + [bezier3Path addLineToPoint: CGPointMake(74.79, 38.09)]; + [bezier3Path addLineToPoint: CGPointMake(70.51, 17)]; + [bezier3Path addLineToPoint: CGPointMake(66.2, 17)]; + [bezier3Path addCurveToPoint: CGPointMake(63.73, 18.57) controlPoint1: CGPointMake(64.22, 17) controlPoint2: CGPointMake(63.73, 18.57)]; + [bezier3Path addLineToPoint: CGPointMake(55.75, 38.09)]; + [bezier3Path addLineToPoint: CGPointMake(61.33, 38.09)]; + [bezier3Path addLineToPoint: CGPointMake(62.45, 34.96)]; + [bezier3Path addLineToPoint: CGPointMake(69.25, 34.96)]; + [bezier3Path addLineToPoint: CGPointMake(69.88, 38.09)]; + [bezier3Path addLineToPoint: CGPointMake(69.88, 38.09)]; + [bezier3Path closePath]; + bezier3Path.miterLimit = 4; + + bezier3Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier3Path fill]; + + + //// Bezier 4 Drawing + UIBezierPath* bezier4Path = [UIBezierPath bezierPath]; + [bezier4Path moveToPoint: CGPointMake(56.14, 22.45)]; + [bezier4Path addLineToPoint: CGPointMake(56.9, 17.92)]; + [bezier4Path addCurveToPoint: CGPointMake(52.09, 17) controlPoint1: CGPointMake(56.9, 17.92) controlPoint2: CGPointMake(54.55, 17)]; + [bezier4Path addCurveToPoint: CGPointMake(43.12, 23.98) controlPoint1: CGPointMake(49.43, 17) controlPoint2: CGPointMake(43.12, 18.19)]; + [bezier4Path addCurveToPoint: CGPointMake(50.53, 32.36) controlPoint1: CGPointMake(43.12, 29.43) controlPoint2: CGPointMake(50.53, 29.5)]; + [bezier4Path addCurveToPoint: CGPointMake(41.7, 32.9) controlPoint1: CGPointMake(50.53, 35.22) controlPoint2: CGPointMake(43.89, 34.71)]; + [bezier4Path addLineToPoint: CGPointMake(40.9, 37.64)]; + [bezier4Path addCurveToPoint: CGPointMake(46.94, 38.83) controlPoint1: CGPointMake(40.9, 37.64) controlPoint2: CGPointMake(43.29, 38.83)]; + [bezier4Path addCurveToPoint: CGPointMake(56.11, 31.61) controlPoint1: CGPointMake(50.6, 38.83) controlPoint2: CGPointMake(56.11, 36.89)]; + [bezier4Path addCurveToPoint: CGPointMake(48.64, 23.23) controlPoint1: CGPointMake(56.11, 26.13) controlPoint2: CGPointMake(48.64, 25.62)]; + [bezier4Path addCurveToPoint: CGPointMake(56.14, 22.45) controlPoint1: CGPointMake(48.64, 20.85) controlPoint2: CGPointMake(53.85, 21.15)]; + [bezier4Path closePath]; + bezier4Path.miterLimit = 4; + + bezier4Path.usesEvenOddFillRule = YES; + + [color1 setFill]; + [bezier4Path fill]; + + + //// Bezier 5 Drawing + UIBezierPath* bezier5Path = [UIBezierPath bezierPath]; + [bezier5Path moveToPoint: CGPointMake(21.88, 28.38)]; + [bezier5Path addLineToPoint: CGPointMake(20.07, 18.9)]; + [bezier5Path addCurveToPoint: CGPointMake(17.53, 17) controlPoint1: CGPointMake(20.07, 18.9) controlPoint2: CGPointMake(19.86, 17)]; + [bezier5Path addLineToPoint: CGPointMake(9.1, 17)]; + [bezier5Path addLineToPoint: CGPointMake(9, 17.36)]; + [bezier5Path addCurveToPoint: CGPointMake(16.95, 21.45) controlPoint1: CGPointMake(9, 17.36) controlPoint2: CGPointMake(13.06, 18.22)]; + [bezier5Path addCurveToPoint: CGPointMake(21.88, 28.38) controlPoint1: CGPointMake(20.66, 24.53) controlPoint2: CGPointMake(21.88, 28.38)]; + [bezier5Path closePath]; + bezier5Path.miterLimit = 4; + + bezier5Path.usesEvenOddFillRule = YES; + + [color2 setFill]; + [bezier5Path fill]; + } + } + } +} +@end diff --git a/Pods/Braintree/Braintree/Venmo/BTClient+BTVenmo.h b/Pods/Braintree/Braintree/Venmo/BTClient+BTVenmo.h new file mode 100644 index 0000000..2bfad0a --- /dev/null +++ b/Pods/Braintree/Braintree/Venmo/BTClient+BTVenmo.h @@ -0,0 +1,13 @@ +#import "BTClient.h" + +typedef NS_ENUM(NSUInteger, BTVenmoStatus) { + BTVenmoStatusOff = 0, + BTVenmoStatusOffline, + BTVenmoStatusProduction +}; + +@interface BTClient (BTVenmo) + +- (BTVenmoStatus)btVenmo_status; + +@end diff --git a/Pods/Braintree/Braintree/Venmo/BTClient+BTVenmo.m b/Pods/Braintree/Braintree/Venmo/BTClient+BTVenmo.m new file mode 100644 index 0000000..3c8ce24 --- /dev/null +++ b/Pods/Braintree/Braintree/Venmo/BTClient+BTVenmo.m @@ -0,0 +1,20 @@ +#import "BTClient+BTVenmo.h" +#import "BTClient_Internal.h" + +NSString *const BTVenmoStatusValueProduction = @"production"; +NSString *const BTVenmoStatusValueOffline = @"offline"; + +@implementation BTClient (BTVenmo) + +- (BTVenmoStatus)btVenmo_status { + NSString *status = self.configuration.btVenmo_status; + if ([status isEqualToString:BTVenmoStatusValueProduction]) { + return BTVenmoStatusProduction; + } else if([status isEqualToString:BTVenmoStatusValueOffline]) { + return BTVenmoStatusOffline; + } else { + return BTVenmoStatusOff; + } +} + +@end diff --git a/Pods/Braintree/Braintree/Venmo/BTVenmoAppSwitchHandler.h b/Pods/Braintree/Braintree/Venmo/BTVenmoAppSwitchHandler.h new file mode 100644 index 0000000..301379f --- /dev/null +++ b/Pods/Braintree/Braintree/Venmo/BTVenmoAppSwitchHandler.h @@ -0,0 +1,11 @@ +#import +#import "BTClient.h" +#import "BTAppSwitching.h" +#import "BTAppSwitchErrors.h" + +@interface BTVenmoAppSwitchHandler : NSObject + ++ (instancetype)sharedHandler; + +@end + diff --git a/Pods/Braintree/Braintree/Venmo/BTVenmoAppSwitchHandler.m b/Pods/Braintree/Braintree/Venmo/BTVenmoAppSwitchHandler.m new file mode 100644 index 0000000..8c33ab2 --- /dev/null +++ b/Pods/Braintree/Braintree/Venmo/BTVenmoAppSwitchHandler.m @@ -0,0 +1,218 @@ +#import "BTVenmoAppSwitchHandler.h" +#import "BTVenmoAppSwitchHandler_Internal.h" +#import "BTVenmoAppSwitchRequestURL.h" +#import "BTVenmoAppSwitchReturnURL.h" +#import "BTClient+BTVenmo.h" +#import "BTClient_Internal.h" +#import "BTMutableCardPaymentMethod.h" +#import "BTAppSwitch.h" + +#import + +@implementation BTVenmoAppSwitchHandler + +@synthesize returnURLScheme = _returnURLScheme; +@synthesize delegate = _delegate; + ++ (void)load { + if (self == [BTVenmoAppSwitchHandler class]) { + [[BTAppSwitch sharedInstance] addAppSwitching:[BTVenmoAppSwitchHandler sharedHandler] forApp:BTAppTypeVenmo]; + } +} + +- (BOOL)initiateAppSwitchWithClient:(BTClient *)client delegate:(id)delegate error:(NSError *__autoreleasing *)error { + + client = [client copyWithMetadata:^(BTClientMutableMetadata *metadata) { + metadata.source = BTClientMetadataSourceVenmoApp; + }]; + + NSError *appSwitchError = [self appSwitchErrorForClient:client]; + if (appSwitchError) { + if ([appSwitchError.domain isEqualToString:BTAppSwitchErrorDomain]) { + switch (appSwitchError.code) { + case BTAppSwitchErrorDisabled: + [client postAnalyticsEvent:@"ios.venmo.appswitch.initiate.error.disabled"]; + break; + case BTAppSwitchErrorIntegrationReturnURLScheme: + [client postAnalyticsEvent:@"ios.venmo.appswitch.initiate.error.invalid.return-url-scheme"]; + break; + case BTAppSwitchErrorIntegrationMerchantId: + [client postAnalyticsEvent:@"ios.venmo.appswitch.initiate.error.invalid.merchant-id"]; + break; + case BTAppSwitchErrorAppNotAvailable: + [client postAnalyticsEvent:@"ios.venmo.appswitch.initiate.error.unavailable"]; + break; + default: + [client postAnalyticsEvent:@"ios.venmo.appswitch.initiate.error.unrecognized-error"]; + break; + } + } + if (error) { + *error = appSwitchError; + } + return NO; + } + + self.client = client; + self.delegate = delegate; + + BOOL offline = client.btVenmo_status == BTVenmoStatusOffline; + + NSURL *venmoAppSwitchURL = [BTVenmoAppSwitchRequestURL appSwitchURLForMerchantID:client.merchantId + returnURLScheme:self.returnURLScheme + offline:offline + error:error]; + if (*error) { + return NO; + } + + BOOL success = [[UIApplication sharedApplication] openURL:venmoAppSwitchURL]; + if (success) { + [client postAnalyticsEvent:@"ios.venmo.appswitch.initiate.success"]; + } else { + [client postAnalyticsEvent:@"ios.venmo.appswitch.initiate.error.failure"]; + if (error) { + *error = [NSError errorWithDomain:BTAppSwitchErrorDomain + code:BTAppSwitchErrorFailed + userInfo:@{NSLocalizedDescriptionKey: @"UIApplication failed to perform app switch to Venmo."}]; + } + return NO; + } + return YES; +} + + +- (BOOL)appSwitchAvailableForClient:(BTClient *)client { + return [self appSwitchErrorForClient:client] == nil; +} + +- (NSError *)appSwitchErrorForClient:(BTClient *)client { + + if ([client btVenmo_status] == BTVenmoStatusOff) { + return [NSError errorWithDomain:BTAppSwitchErrorDomain + code:BTAppSwitchErrorDisabled + userInfo:@{ NSLocalizedDescriptionKey:@"Venmo App Switch is not enabled." }]; + } + + if (!self.returnURLScheme) { + return [NSError errorWithDomain:BTAppSwitchErrorDomain + code:BTAppSwitchErrorIntegrationReturnURLScheme + userInfo:@{ NSLocalizedDescriptionKey:@"Venmo App Switch requires you to set a returnURLScheme. Please call +[Braintree setReturnURLScheme:]." }]; + } + + if (!client.merchantId) { + return [NSError errorWithDomain:BTAppSwitchErrorDomain + code:BTAppSwitchErrorIntegrationMerchantId + userInfo:@{ NSLocalizedDescriptionKey:@"Venmo App Switch could not find all required fields in the client token." }]; + } + + if (![BTVenmoAppSwitchRequestURL isAppSwitchAvailable]) { + return [NSError errorWithDomain:BTAppSwitchErrorDomain + code:BTAppSwitchErrorAppNotAvailable + userInfo:@{ NSLocalizedDescriptionKey:@"No version of the Venmo app is installed on this device that is compatible with app switch." }]; + } + + return nil; +} + +- (BOOL)canHandleReturnURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication { + return [BTVenmoAppSwitchReturnURL isValidURL:url sourceApplication:sourceApplication]; +} + +- (void)handleReturnURL:(NSURL *)url { + BTVenmoAppSwitchReturnURL *returnURL = [[BTVenmoAppSwitchReturnURL alloc] initWithURL:url]; + switch (returnURL.state) { + case BTVenmoAppSwitchReturnURLStateSucceeded: { + [self informDelegateWillCreatePaymentMethod]; + [self.client postAnalyticsEvent:@"ios.venmo.appswitch.handle.authorized"]; + + switch (self.client.btVenmo_status) { + case BTVenmoStatusOffline: + /* FALLTHROUGH */ + [self.client postAnalyticsEvent:@"ios.venmo.appswitch.handle.offline"]; + case BTVenmoStatusProduction: { + [self.client fetchPaymentMethodWithNonce:returnURL.paymentMethod.nonce + success:^(BTPaymentMethod *paymentMethod){ + [self.client postAnalyticsEvent:@"ios.venmo.appswitch.handle.success"]; + [self informDelegateDidCreatePaymentMethod:paymentMethod]; + } + failure:^(NSError *error){ + [self.client postAnalyticsEvent:@"ios.venmo.appswitch.handle.client-failure"]; + NSError *venmoError = [NSError errorWithDomain:BTAppSwitchErrorDomain + code:BTAppSwitchErrorFailureFetchingPaymentMethod + userInfo:@{NSLocalizedDescriptionKey: @"Failed to fetch payment method", + NSUnderlyingErrorKey: error}]; + [self informDelegateDidFailWithError:venmoError]; + }]; + break; + } + case BTVenmoStatusOff: { + NSError *error = [NSError errorWithDomain:BTAppSwitchErrorDomain + code:BTAppSwitchErrorDisabled + userInfo:@{ NSLocalizedDescriptionKey: @"Received a Venmo app switch return while Venmo is disabled" }]; + [self informDelegateDidFailWithError:error]; + [self.client postAnalyticsEvent:@"ios.venmo.appswitch.handle.off"]; + break; + } + } + break; + } + case BTVenmoAppSwitchReturnURLStateFailed: + [self.client postAnalyticsEvent:@"ios.venmo.appswitch.handle.error"]; + [self informDelegateDidFailWithError:returnURL.error]; + break; + case BTVenmoAppSwitchReturnURLStateCanceled: + [self.client postAnalyticsEvent:@"ios.venmo.appswitch.handle.cancel"]; + [self informDelegateDidCancel]; + break; + default: + // should not happen + break; + } +} + +#pragma mark Delegate Informers + +- (void)informDelegateWillCreatePaymentMethod { + if ([self.delegate respondsToSelector:@selector(appSwitcherWillCreatePaymentMethod:)]) { + [self.delegate appSwitcherWillCreatePaymentMethod:self]; + } +} + +- (void)informDelegateDidCreatePaymentMethod:(BTPaymentMethod *)paymentMethod { + if ([self.delegate respondsToSelector:@selector(appSwitcher:didCreatePaymentMethod:)]) { + [self.delegate appSwitcher:self didCreatePaymentMethod:paymentMethod]; + } +} + +- (void)informDelegateDidFailWithError:(NSError *)error { + if ([self.delegate respondsToSelector:@selector(appSwitcher:didFailWithError:)]) { + [self.delegate appSwitcher:self didFailWithError:error]; + } +} + +- (void)informDelegateDidFailWithErrorCode:(NSInteger)code localizedDescription:(NSString *)localizedDescription { + NSError *error = [NSError errorWithDomain:BTAppSwitchErrorDomain + code:code + userInfo:@{ NSLocalizedDescriptionKey:localizedDescription }]; + [self informDelegateDidFailWithError:error]; +} + +- (void)informDelegateDidCancel { + if ([self.delegate respondsToSelector:@selector(appSwitcherDidCancel:)]) { + [self.delegate appSwitcherDidCancel:self]; + } +} + +#pragma mark Singleton + ++ (instancetype)sharedHandler { + static BTVenmoAppSwitchHandler *instance; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + instance = [[BTVenmoAppSwitchHandler alloc] init]; + }); + return instance; +} + +@end diff --git a/Pods/Braintree/Braintree/Venmo/BTVenmoAppSwitchHandler_Internal.h b/Pods/Braintree/Braintree/Venmo/BTVenmoAppSwitchHandler_Internal.h new file mode 100644 index 0000000..eb786c9 --- /dev/null +++ b/Pods/Braintree/Braintree/Venmo/BTVenmoAppSwitchHandler_Internal.h @@ -0,0 +1,8 @@ +#import "BTVenmoAppSwitchHandler.h" +#import "BTClient.h" + +@interface BTVenmoAppSwitchHandler () + +@property (nonatomic, strong) BTClient *client; + +@end diff --git a/Pods/Braintree/Braintree/Venmo/BTVenmoAppSwitchRequestURL.h b/Pods/Braintree/Braintree/Venmo/BTVenmoAppSwitchRequestURL.h new file mode 100644 index 0000000..a0c962f --- /dev/null +++ b/Pods/Braintree/Braintree/Venmo/BTVenmoAppSwitchRequestURL.h @@ -0,0 +1,17 @@ +#import + +@interface BTVenmoAppSwitchRequestURL : NSObject + +/// Whether app to the Venmo app is available ++ (BOOL)isAppSwitchAvailable; + +/// Create an app switch URL +/// +/// @param merchantID The merchant ID +/// @param scheme The return URL scheme, e.g. "com.yourcompany.Your-App.payments" +/// @param offline Whether the Venmo app should be in "offline" mode, useful for testing/development +/// +/// @return The resulting URL ++ (NSURL *)appSwitchURLForMerchantID:(NSString *)merchantID returnURLScheme:(NSString *)scheme offline:(BOOL)offline error:(NSError * __autoreleasing *)error; + +@end diff --git a/Pods/Braintree/Braintree/Venmo/BTVenmoAppSwitchRequestURL.m b/Pods/Braintree/Braintree/Venmo/BTVenmoAppSwitchRequestURL.m new file mode 100644 index 0000000..30cfef2 --- /dev/null +++ b/Pods/Braintree/Braintree/Venmo/BTVenmoAppSwitchRequestURL.m @@ -0,0 +1,59 @@ +#import + +#import "BTVenmoAppSwitchRequestURL.h" +#import "BTURLUtils.h" +#import "BTAppSwitchErrors.h" + +#define kXCallbackTemplate @"scheme://x-callback-url/path" +#define kVenmoScheme @"com.venmo.touch.v1" + +@implementation BTVenmoAppSwitchRequestURL + ++ (BOOL)isAppSwitchAvailable { + NSURL *url = [self appSwitchBaseURLComponents].URL; + return [[UIApplication sharedApplication] canOpenURL:url]; +} + ++ (NSURL *)appSwitchURLForMerchantID:(NSString *)merchantID returnURLScheme:(NSString *)scheme offline:(BOOL)offline error:(NSError * __autoreleasing *)error { + NSString *bundleDisplayName = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleDisplayName"]; + if (!bundleDisplayName) { + if (error) { + *error = [NSError errorWithDomain:BTAppSwitchErrorDomain + code:BTAppSwitchErrorIntegrationInvalidBundleDisplayName + userInfo:@{NSLocalizedDescriptionKey: @"CFBundleDisplayName must be non-nil. Please set 'Bundle display name' in your Info.plist."}]; + } + return nil; + } + + NSMutableDictionary *appSwitchParameters = [@{@"x-success": [self returnURLWithScheme:scheme result:@"success"], + @"x-error": [self returnURLWithScheme:scheme result:@"error"], + @"x-cancel": [self returnURLWithScheme:scheme result:@"cancel"], + @"x-source": bundleDisplayName, + @"braintree_merchant_id": merchantID, + } mutableCopy]; + if (offline) { + appSwitchParameters[@"offline"] = @1; + } + + NSURLComponents *components = [self appSwitchBaseURLComponents]; + components.percentEncodedQuery = [BTURLUtils queryStringWithDictionary:appSwitchParameters]; + return components.URL; +} + +#pragma mark Internal Helpers + ++ (NSURL *)returnURLWithScheme:(NSString *)scheme result:(NSString *)result { + NSURLComponents *components = [NSURLComponents componentsWithString:kXCallbackTemplate]; + components.scheme = scheme; + components.percentEncodedPath = [NSString stringWithFormat:@"/vzero/auth/venmo/%@", result]; + return components.URL; +} + ++ (NSURLComponents *)appSwitchBaseURLComponents { + NSURLComponents *components = [NSURLComponents componentsWithString:kXCallbackTemplate]; + components.scheme = kVenmoScheme; + components.percentEncodedPath = @"/vzero/auth"; + return components; +} + +@end diff --git a/Pods/Braintree/Braintree/Venmo/BTVenmoAppSwitchReturnURL.h b/Pods/Braintree/Braintree/Venmo/BTVenmoAppSwitchReturnURL.h new file mode 100644 index 0000000..f989f48 --- /dev/null +++ b/Pods/Braintree/Braintree/Venmo/BTVenmoAppSwitchReturnURL.h @@ -0,0 +1,47 @@ +#import +#import "BTPaymentMethod.h" + +extern NSString *const BTVenmoAppSwitchReturnURLErrorDomain; + +typedef NS_ENUM(NSUInteger, BTVenmoAppSwitchReturnURLState) { + BTVenmoAppSwitchReturnURLStateSucceeded, + BTVenmoAppSwitchReturnURLStateFailed, + BTVenmoAppSwitchReturnURLStateCanceled, + BTVenmoAppSwitchReturnURLStateUnknown +}; + +/// This class interprets URLs received from the Venmo app via app switch returns. +/// +/// Venmo Touch app switch authorization requests should result in success, failure or +/// user-initiated cancelation. These states are communicated in the url. +@interface BTVenmoAppSwitchReturnURL : NSObject + +/// Evaluates whether the url-sourceApplication pair represents a valid Venmo Touch return. +/// +/// @param url an app switch return URL +/// @param sourceApplication an app switch source application +/// +/// @return YES if the url-sourceApplication pair likely represent a Venmo Touch app switch return ++ (BOOL)isValidURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication; + +/// Initializes a new BTVenmoAppSwitchReturnURL +/// +/// @param url an incoming app switch url +/// +/// @return An initialized app switch return url +- (instancetype)initWithURL:(NSURL *)url; + +/// The overall status of the app switch - success, failure or cancelation +@property (nonatomic, assign, readonly) BTVenmoAppSwitchReturnURLState state; + +/// Creates and returns a payment method object that represents the payment method +/// authorized in the Venmo app switch. +/// +/// @return A new payment method object with a transactable or vaultable nonce +@property (nonatomic, strong, readonly) BTPaymentMethod *paymentMethod; + +/// If the return URL's state is BTVenmoAppSwitchReturnURLStateFailed, +/// the error returned from Venmo via the app switch. +@property (nonatomic, strong, readonly) NSError *error; + +@end diff --git a/Pods/Braintree/Braintree/Venmo/BTVenmoAppSwitchReturnURL.m b/Pods/Braintree/Braintree/Venmo/BTVenmoAppSwitchReturnURL.m new file mode 100644 index 0000000..4695bb8 --- /dev/null +++ b/Pods/Braintree/Braintree/Venmo/BTVenmoAppSwitchReturnURL.m @@ -0,0 +1,45 @@ +#import "BTVenmoAppSwitchReturnURL.h" +#import "BTMutableCardPaymentMethod.h" +#import "BTURLUtils.h" + +NSString *const BTVenmoAppSwitchReturnURLErrorDomain = @"BTVenmoAppSwitchReturnURLErrorDomain"; + +@implementation BTVenmoAppSwitchReturnURL + ++ (BOOL)isValidURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication { + return [self isVenmoSourceApplication:sourceApplication] || [self isFakeWalletURL:url andSourceApplication:sourceApplication]; +} + +- (instancetype)initWithURL:(NSURL *)url { + self = [self init]; + if (self) { + NSDictionary *parameters = [BTURLUtils dictionaryForQueryString:url.query]; + if ([url.path isEqualToString:@"/vzero/auth/venmo/success"]) { + _state = BTVenmoAppSwitchReturnURLStateSucceeded; + _paymentMethod = [[BTMutableCardPaymentMethod alloc] init]; + _paymentMethod.nonce = parameters[@"paymentMethodNonce"]; + } else if ([url.path isEqualToString:@"/vzero/auth/venmo/error"]) { + _state = BTVenmoAppSwitchReturnURLStateFailed; + NSString *errorMessage = parameters[@"errorMessage"]; + NSInteger errorCode = [parameters[@"errorCode"] integerValue]; + _error = [NSError errorWithDomain:BTVenmoAppSwitchReturnURLErrorDomain code:errorCode userInfo:(errorMessage != nil ? @{ NSLocalizedDescriptionKey: errorMessage } : nil)]; + } else if ([url.path isEqualToString:@"/vzero/auth/venmo/cancel"]) { + _state = BTVenmoAppSwitchReturnURLStateCanceled; + } else { + _state = BTVenmoAppSwitchReturnURLStateUnknown; + } + } + return self; +} + +#pragma mark Internal Helpers + ++ (BOOL)isVenmoSourceApplication:(NSString *)sourceApplication { + return [sourceApplication isEqualToString:@"net.kortina.labs.Venmo"]; +} + ++ (BOOL)isFakeWalletURL:(NSURL *)url andSourceApplication:(NSString *)sourceApplication { + return [sourceApplication isEqualToString:@"com.paypal.PPClient.Debug"] && [url.host isEqualToString:@"x-callback-url"] && [url.path hasPrefix:@"/vzero/auth/venmo/"]; +} + +@end diff --git a/Pods/Braintree/LICENSE b/Pods/Braintree/LICENSE new file mode 100644 index 0000000..f6e69b7 --- /dev/null +++ b/Pods/Braintree/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2015 Braintree, a division of PayPal, Inc. + +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/Braintree/README.md b/Pods/Braintree/README.md new file mode 100644 index 0000000..478c8a7 --- /dev/null +++ b/Pods/Braintree/README.md @@ -0,0 +1,100 @@ +# Braintree v.zero SDK for iOS + +Welcome to Braintree's v.zero SDK for iOS. This CocoaPod will help you accept card, PayPal, and Venmo payments in your iOS app. + +![Screenshot of v.zero](screenshot.png) + +## Documentation + +Start with [**'Hello, Client!'**](https://developers.braintreepayments.com/ios/start/hello-client) for instructions on basic setup and usage. + +Next, read the [**full documentation**](https://developers.braintreepayments.com/ios/sdk/client) for information about integration options, such as Drop-In UI, custom payment button, and credit card tokenization. + +Finally, [**cocoadocs.org/docsets/Braintree**](http://cocoadocs.org/docsets/Braintree) hosts the complete, up-to-date API documentation generated straight from the header files. + +## Demo + +A demo app is included in project. To run it, run `pod install` and then open `Braintree.xcworkspace` in Xcode. See the [README](Demos/Braintree-Demo/README.md) for more details. + +### Special note on preprocessor macros + +Apple Pay is a build option. To include Apple Pay support in your build, use the `Apple-Pay` subspec in your Podfile: + +``` +pod "Braintree" +pod "Braintree/Apple-Pay" +``` + +Then ensure `BT_ENABLE_APPLE_PAY=1` is present in your target's "Preprocessor Macros" settings. +By default, this should happen automatically if you have a Preprocessor Macro entry for `$(inherited)`. + +## Updating for iOS 9 + +**Xcode 7 is required.** + +### Supporting Bitcode + +The Braintree SDK works with apps that have [bitcode](https://developer.apple.com/library/prerelease/ios/documentation/IDEs/Conceptual/AppDistributionGuide/AppThinning/AppThinning.html#//apple_ref/doc/uid/TP40012582-CH35-SW3) enabled. + +However, if your integration uses `BTData` for fraud detection, it does not currently support having bitcode enabled. We are working to add support for this shortly. + +### App Transport Security + +iOS 9 introduces new security requirements and restrictions. If your app is compiled with iOS 9 SDK, it must comply with Apple's [App Transport Security](https://developer.apple.com/library/prerelease/ios/technotes/App-Transport-Security-Technote/) policy. + +The Braintree Gateway domain complies with this policy. + +### URL Query Scheme Whitelist + +If your app is compiled with iOS 9 SDK and integrates payment options with an app-switch workflow, you must add URL schemes to the whitelist in your application's plist. + +If your app supports payments from PayPal: +* `com.paypal.ppclient.touch.v1` +* `com.paypal.ppclient.touch.v2` +* `org-appextension-feature-password-management` + +If your app supports payments from Venmo: +* `com.venmo.touch.v1` + +For example, if your app supports both PayPal and Venmo, you could add the following: +``` + LSApplicationQueriesSchemes + + com.venmo.touch.v1 + com.paypal.ppclient.touch.v1 + com.paypal.ppclient.touch.v2 + org-appextension-feature-password-management + +``` + +There is a new `UIApplicationDelegate` method that you may implement on iOS 9: +``` +- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary *)options +``` +Implementing this method is optional. If you do not implement it, the deprecated equivalent will still be called; otherwise, it will not. + +In either case, you still need to implement the deprecated equivalent in order to support iOS 8 or earlier: +``` +- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation +``` + +## Help + +* [Read the headers](Braintree/Braintree.h) +* [Read the docs](https://developers.braintreepayments.com/ios/sdk/client) +* Find a bug? [Open an issue](https://github.com/braintree/braintree_ios/issues) +* Want to contribute? [Check out contributing guidelines](CONTRIBUTING.md) and [submit a pull request](https://help.github.com/articles/creating-a-pull-request). + +## Feedback + +Braintree v.zero is in active development. We appreciate the time you take to try it out and welcome your feedback! + +Here are a few ways to get in touch: + +* [GitHub Issues](https://github.com/braintree/braintree_ios/issues) - For generally applicable issues and feedback +* [Braintree Support](https://articles.braintreepayments.com/) / support@braintreepayments.com - for personal support at any phase of integration + +### License + +The Braintree v.zero SDK is open source and available under the MIT license. See the [LICENSE](LICENSE) file for more info. + diff --git a/Pods/Manifest.lock b/Pods/Manifest.lock new file mode 100644 index 0000000..9ba44d0 --- /dev/null +++ b/Pods/Manifest.lock @@ -0,0 +1,44 @@ +PODS: + - Braintree (3.9.9): + - Braintree/API (= 3.9.9) + - Braintree/Coinbase (= 3.9.9) + - Braintree/Drop-In (= 3.9.9) + - Braintree/Payments (= 3.9.9) + - Braintree/PayPal (= 3.9.9) + - Braintree/UI (= 3.9.9) + - Braintree/Venmo (= 3.9.9) + - Braintree/API (3.9.9) + - Braintree/Coinbase (3.9.9): + - Braintree/API + - Braintree/Drop-In (3.9.9): + - Braintree/API + - Braintree/Coinbase + - Braintree/Payments + - Braintree/PayPal + - Braintree/UI + - Braintree/Venmo + - Braintree/Payments (3.9.9): + - Braintree/API + - Braintree/Coinbase + - Braintree/PayPal + - Braintree/Venmo + - Braintree/PayPal (3.9.9): + - Braintree/API + - Braintree/UI + - Braintree/UI (3.9.9): + - Braintree/API + - Braintree/Venmo (3.9.9): + - Braintree/API + - SwiftSpinner (1.5.0) + +DEPENDENCIES: + - Braintree (~> 3.9) + - SwiftSpinner + +SPEC CHECKSUMS: + Braintree: a9d35b7d5a8d76267adcb5795d32c20ca5f39a99 + SwiftSpinner: 4c058c7a1d6b444dd2e1d70988ead40783097133 + +PODFILE CHECKSUM: f9c29c30105959c35827399e9176ba1f78769ee6 + +COCOAPODS: 1.3.1 diff --git a/Pods/Pods.xcodeproj/project.pbxproj b/Pods/Pods.xcodeproj/project.pbxproj new file mode 100644 index 0000000..7bb3d04 --- /dev/null +++ b/Pods/Pods.xcodeproj/project.pbxproj @@ -0,0 +1,2528 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 48; + objects = { + +/* Begin PBXBuildFile section */ + 0120869DB99BAD06128E40C7B686A54A /* BTURLUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = A3AFC1B73339D9ADE9E90863068E91EA /* BTURLUtils.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + 015A01DA0B18C5729B23E85934237BAB /* BTDropInSelectPaymentMethodViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2FC342C88932A914345F1AE99162B3A9 /* BTDropInSelectPaymentMethodViewController.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + 01A6FF1DF4A5436D09208FE37B321143 /* BTAPIResponseParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 84229BCEDC65E86549AD82200811BB6C /* BTAPIResponseParser.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + 01C80D6EA8A74259FEAB26C229174114 /* BTHTTP.m in Sources */ = {isa = PBXBuildFile; fileRef = B54F2A5604BC653624FC45B5385132EF /* BTHTTP.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + 01CF0E2ECF9E3528A7DE12E592F94432 /* Pods-e-shopTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 0DA4BBF696E01D7790FA1BDF810A2DB5 /* Pods-e-shopTests-dummy.m */; }; + 024D8B45C2AA12D1464D92CC2F721531 /* BTUIJCBVectorArtView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C4EE17A51CF5CEC71F494A79BFF2EF2 /* BTUIJCBVectorArtView.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra -Wall -Wextra"; }; }; + 031CCBE8788463A08EC1E10E134AD128 /* BTCoinbasePaymentMethod.m in Sources */ = {isa = PBXBuildFile; fileRef = 86343D1F7AD70E3CCE07435CD5EFA091 /* BTCoinbasePaymentMethod.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + 035810C779B461BA0A6090A256BDA9BA /* BTClientTokenBooleanValueTransformer.h in Headers */ = {isa = PBXBuildFile; fileRef = 988CA6375666F26C9A42230E6D45E6E4 /* BTClientTokenBooleanValueTransformer.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 03AC7D374266F138AC3D4F1D56D00D66 /* BTUIMaestroVectorArtView.m in Sources */ = {isa = PBXBuildFile; fileRef = 6A3C7F88E85C1764B0867C13C19D4FFB /* BTUIMaestroVectorArtView.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra -Wall -Wextra"; }; }; + 04347D78E7DC2707553E56F173A0EE51 /* BTUIThemedView.h in Headers */ = {isa = PBXBuildFile; fileRef = 2E6CB3CBCB2613479547D5A2E89CFD3D /* BTUIThemedView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 04EA5618B9AE5E2C713E2A83789A2CC2 /* BTPayPalButton.h in Headers */ = {isa = PBXBuildFile; fileRef = CC7EA5A3803D08028AAFFCF6CFB02859 /* BTPayPalButton.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 052D1A134823A339DD7DA67F2CCE8458 /* MessageUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F96048B5D15CDD64A609C90F302D61D9 /* MessageUI.framework */; }; + 067374CBEEEABCF20B9B2D8C473799E5 /* BTPostalAddress_Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 1DE2F6908E2F404FB726399340D2CC5D /* BTPostalAddress_Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 06F09D8C89A51D1EF4E65D933D5A1BA6 /* BTUICoinbaseButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 0FB6287A9B8F3568FA2A3EFB55B0B656 /* BTUICoinbaseButton.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra -Wall -Wextra"; }; }; + 072CF44F4AEBB03F71D98EBB4F31C8BD /* BTUICardType.m in Sources */ = {isa = PBXBuildFile; fileRef = B571FC95A338FF23B17F310C9D361CAA /* BTUICardType.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra -Wall -Wextra"; }; }; + 083C1E3205BC1430E97C897FF38884AD /* fr.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E9A927568F262BFFA45D0597F6C13B17 /* fr.lproj */; }; + 09D429EA5AD100D6A4BEAFA6C5BB6BE9 /* BTUIPayPalMonogramCardView.h in Headers */ = {isa = PBXBuildFile; fileRef = D1766E2FA8DE5FB43E70FBFDEFE37243 /* BTUIPayPalMonogramCardView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0AB28F5215C4EBBA7BE68089ABB696A4 /* BTPayPalPaymentMethod.h in Headers */ = {isa = PBXBuildFile; fileRef = E5BBD6B3E3AFD7B358DC56DD22ED5C4F /* BTPayPalPaymentMethod.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0B90E5823A2ECB3BB061ADAA69D39D3C /* BTKeychain.m in Sources */ = {isa = PBXBuildFile; fileRef = 5776C7684A9A82717EEEBF7A82F5EE9B /* BTKeychain.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + 0BE3642A7BD1D6B03CBFB7BECEE20913 /* BTUIPaymentMethodType.h in Headers */ = {isa = PBXBuildFile; fileRef = FFC08737A8DBCF87AFB26B4E27EFAB90 /* BTUIPaymentMethodType.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0E5078043E1FCB628E40AAA04251E4D7 /* BTClient.h in Headers */ = {isa = PBXBuildFile; fileRef = ADB887C884655DE01B5FDCC5171D8742 /* BTClient.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0E50F5A8DB478F38E3EAF4FC0BEB26DC /* BTUILocalizedString.h in Headers */ = {isa = PBXBuildFile; fileRef = 85423B9058CC53C505631E22B8147991 /* BTUILocalizedString.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0E5F8BCEA98FB45E8EED42363C92B1A6 /* PayPalMobile.h in Headers */ = {isa = PBXBuildFile; fileRef = 68300CC717163E25B0F0AB6087F9CFCC /* PayPalMobile.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 0EEB5BCE500AFF7A25B00BB9E92A762D /* BTPaymentMethod_Mutable.h in Headers */ = {isa = PBXBuildFile; fileRef = 9543199E600B193849BF206E36D1A34D /* BTPaymentMethod_Mutable.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 0FF013B34979F08BAECC1CC3DC8EF4D5 /* BTCardPaymentMethod_Mutable.h in Headers */ = {isa = PBXBuildFile; fileRef = 165461E34E990BA54002EB1FFA72AF73 /* BTCardPaymentMethod_Mutable.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 111B9031393CE3EF35EC8E25F44FB164 /* BTConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = C57EE3A7CA81BD870AD8A66CD4B7F8A2 /* BTConfiguration.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 118D4FA4912709E2FDCAD40173D8D50C /* BTUI.h in Headers */ = {isa = PBXBuildFile; fileRef = EA7A90C03C66D822583F5216584C046D /* BTUI.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 11E8FA3D9F87D632F9ADE53680EEDB79 /* BTUICardNumberField.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C9A938174D6C38984C9124BC7E2DB3D /* BTUICardNumberField.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 12693E630284EC96E090A101FDFAF8D1 /* sv.lproj in Resources */ = {isa = PBXBuildFile; fileRef = E8C349E139987FAC8BDD38B1864C9356 /* sv.lproj */; }; + 126B89F9FB7CDF04BD4063CF10BAA325 /* BTPostalAddress.m in Sources */ = {isa = PBXBuildFile; fileRef = EB1673F8882EB5606298635536C6864B /* BTPostalAddress.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + 1284C16AA7D0E5C5299B34ABBE6D107C /* BTOfflineClientBackend.h in Headers */ = {isa = PBXBuildFile; fileRef = 77637EB3CCCB595FA220660128ED543A /* BTOfflineClientBackend.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 1342F673418A223C13543A088A9B4DCA /* BTUIDiscoverVectorArtView.m in Sources */ = {isa = PBXBuildFile; fileRef = 61029895D3F931847911CF97A9E12D7B /* BTUIDiscoverVectorArtView.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra -Wall -Wextra"; }; }; + 14AEBB0A45303DE61C9C8C197585EE73 /* BTPaymentApplePayProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 189866804C8C538C2C2C70527D4EF12A /* BTPaymentApplePayProvider.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + 1534E95100D283E399FDA272BF61FCE0 /* BTClientTokenApplePayStatusValueTransformer.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C29EDD397FE9B8F21CB8C97A626FF12 /* BTClientTokenApplePayStatusValueTransformer.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 184C5D357AB10C012DEA43C7A3AD9ED9 /* pt.lproj in Resources */ = {isa = PBXBuildFile; fileRef = C00B82E35FFE19E69BF5B770CE2039BE /* pt.lproj */; }; + 18E0B9884DB44539CEB02FC0FE9E0782 /* BTCardPaymentMethod.m in Sources */ = {isa = PBXBuildFile; fileRef = B00A1C86D45FE95FC5D86A95DE13B3D2 /* BTCardPaymentMethod.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + 191CDF15075A3823BE551FC271E876AA /* BTCoinbase.h in Headers */ = {isa = PBXBuildFile; fileRef = 7DCF3C69ED019540C45D3D14EF10D7C5 /* BTCoinbase.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 19A7301E7A538B28C0D7BC52F8636643 /* PayPalTouch.h in Headers */ = {isa = PBXBuildFile; fileRef = 5E4476C5C32A4F37503EAC3EDBC172AB /* PayPalTouch.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 1A60C277C859D503ED77A397447077AF /* BTUIFloatLabel.h in Headers */ = {isa = PBXBuildFile; fileRef = 93EBAF18FE8D49AB0EEBE7F0CAA62A16 /* BTUIFloatLabel.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1AE550245E28630098B9116D8560EE5E /* BTAppSwitchErrors.m in Sources */ = {isa = PBXBuildFile; fileRef = FAE82116866AB5704265E9661D13387A /* BTAppSwitchErrors.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + 1BFE6EE562D3CAF911159BA134ED07DD /* BTHTTP.h in Headers */ = {isa = PBXBuildFile; fileRef = 38931941A12871EC3C1363DC8FF8BAAD /* BTHTTP.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 1C9C81309F780BE851F892B543FB5F3F /* BTPayPalButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 75385C1B03ED0A5780BF3955C1B95119 /* BTPayPalButton.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + 1CDBE238AFAF66D7DAFBEF98A3A87916 /* BTThreeDSecureLookupResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 832DE7B4D5DEBFA5CC8F496CC06582A6 /* BTThreeDSecureLookupResult.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + 1D37463E69B60ADB0057BDA1A2BAFB14 /* BTUICardCvvField.h in Headers */ = {isa = PBXBuildFile; fileRef = CA66D8CBCC939CDCD1F3040E18DE8B2C /* BTUICardCvvField.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1E08C180ECF569EB570BA0E2F378F03F /* BTUICoinbaseMonogramCardView.h in Headers */ = {isa = PBXBuildFile; fileRef = 7BB80206B0AF9C9413BE3D3E332D8C93 /* BTUICoinbaseMonogramCardView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1E4332BB0CC32E5E6324D78D0D4E3A5D /* BTUIDinersClubVectorArtView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4481F7249B693A4A3D291377E5FCB768 /* BTUIDinersClubVectorArtView.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra -Wall -Wextra"; }; }; + 1E530F112B85AB5866FA07E696BB712F /* BTPayPalHorizontalSignatureWhiteView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C50B491A41B80AC46B684160F84B99D /* BTPayPalHorizontalSignatureWhiteView.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + 1EE89B817C7718862363E44085669395 /* es_ES.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 9F3A5B9B673C12EE866AE0C244F2D991 /* es_ES.lproj */; }; + 207D972EB5FBAD54DF3E03ADA3486C03 /* BTPaymentButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 45833D23B83E1BC5637395DF13A3BE0C /* BTPaymentButton.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + 2097702CD19D3117418E547EB2D23760 /* UIColor+BTUI.h in Headers */ = {isa = PBXBuildFile; fileRef = EFF28BCE039436F567FFA5A7FEB4D910 /* UIColor+BTUI.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2197C262BD8A2BACA3292B767CAAB02C /* BTUIViewUtil.h in Headers */ = {isa = PBXBuildFile; fileRef = 720FBB83349770228F46E2E15AE03023 /* BTUIViewUtil.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 23937BD3CAC019588D4C366702C8BD63 /* nb.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 2633231F53A3326ACA0A5781CFE1C860 /* nb.lproj */; }; + 239FA1C065D8DCFE48C75F96A67E25E2 /* BTClientTokenApplePayPaymentNetworksValueTransformer.h in Headers */ = {isa = PBXBuildFile; fileRef = 12EFFEFFE960B5FA829A41E523D05F25 /* BTClientTokenApplePayPaymentNetworksValueTransformer.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 23A6071B93E7C2894C08E3367F0585D8 /* BTApplePayPaymentMethod.h in Headers */ = {isa = PBXBuildFile; fileRef = 5CEF4595973ED6613C9610B47C78F04C /* BTApplePayPaymentMethod.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 24136661E2BB7404C46AA12860083419 /* BTCoinbaseDefines.m in Sources */ = {isa = PBXBuildFile; fileRef = E35DFD19292443931C3B8A4911074AEC /* BTCoinbaseDefines.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + 2490377F810D06CBC36B4D9804ECAB10 /* BTUICVVBackVectorArtView.h in Headers */ = {isa = PBXBuildFile; fileRef = AD7A112BD36337152384E6A68B51076C /* BTUICVVBackVectorArtView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 24F15BD3D81308F61DA50A97C49F09C0 /* BTMutableCardPaymentMethod.m in Sources */ = {isa = PBXBuildFile; fileRef = EC8B00183631D00F1F43318BEB98132D /* BTMutableCardPaymentMethod.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + 264AB122FEA657D85578F15AB25F1DBD /* BTPaymentMethod.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C044B5E30C3AE3D5F74022C87A3AA01 /* BTPaymentMethod.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 266D46614A12B7D631E64A2756A4FF46 /* BTUICoinbaseMonogramCardView.m in Sources */ = {isa = PBXBuildFile; fileRef = 2D76B816E171EA5ECFCFA0479824FE93 /* BTUICoinbaseMonogramCardView.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra -Wall -Wextra"; }; }; + 26A6F354A799C20B393EAA929F568F97 /* BTUIVisaVectorArtView.m in Sources */ = {isa = PBXBuildFile; fileRef = BABA5736281031AB62A71A3E32C059F7 /* BTUIVisaVectorArtView.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra -Wall -Wextra"; }; }; + 26BE54BF3F299F32FFC699FEED84ED8B /* BTClientCardRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A6D7E099F80840093E44F7B6ECCAFE1 /* BTClientCardRequest.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + 27345DD0DCF42A281430BB43B9041074 /* BTUIPayPalButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 653EF65C2437BFCE4E38CB83A94316A6 /* BTUIPayPalButton.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra -Wall -Wextra"; }; }; + 28A25EADF2A5821C05CC50303615792D /* BTUIVenmoWordmarkVectorArtView.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C71F7ACE14F1DDAA838EA8B19056F05 /* BTUIVenmoWordmarkVectorArtView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 298536B813885F244D4247FCD3527100 /* BTAppSwitch.m in Sources */ = {isa = PBXBuildFile; fileRef = 0B8D7F581901C097E1D25EADCA40F5D9 /* BTAppSwitch.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + 2AF77E4B1C8127D51490DA189B1EE815 /* BTUIScrollView.h in Headers */ = {isa = PBXBuildFile; fileRef = 7F290ED3B8BD1FAFC27B7000A204C2A6 /* BTUIScrollView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2B5F97CD50D3721BECFE62E0BF3CE088 /* da.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 7799743193946F7CE4DD2E5CE5F89B62 /* da.lproj */; }; + 2C3CF14F665CF54C3E99F232753664A0 /* Braintree-Payments-UI.h in Headers */ = {isa = PBXBuildFile; fileRef = 2934321B6ACEBA4413BCEB00A6BE0DA7 /* Braintree-Payments-UI.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2C6474FA8A68742C00CDB186BA817D2A /* BTErrors.h in Headers */ = {isa = PBXBuildFile; fileRef = B490350F03D817F809E81AB5A45DEE45 /* BTErrors.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2D34AE57358A9B72E667B0A52ABA70F8 /* it.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 2094F4BA7CE19E837D0E8F4CC3884F1B /* it.lproj */; }; + 2DC28BECC08092A0111A0D2208C7F51D /* BTClient+BTVenmo.m in Sources */ = {isa = PBXBuildFile; fileRef = 98043705638654CC26FB15592F5F8EE4 /* BTClient+BTVenmo.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra -Wall -Wextra"; }; }; + 315DCD6291FBE472DFB976167CF11A73 /* BTUIVectorArtView.h in Headers */ = {isa = PBXBuildFile; fileRef = 6B27628B12E9CE50F9989886608877C5 /* BTUIVectorArtView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3188C592DC9F1739DE6656EC2AD93804 /* BTUILocalizedString.m in Sources */ = {isa = PBXBuildFile; fileRef = 65F787787D72E2E7077B921CF1DB444B /* BTUILocalizedString.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra -Wall -Wextra"; }; }; + 33E15FD25BA051AC5853051447D69028 /* ru.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 7AD9D2C396ECB47269F3E1D078B6A850 /* ru.lproj */; }; + 350DF7E50A99CE68E44BB05E8B93BF86 /* es.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 7A730547CBDA9A8E42DC8EA5CFD24276 /* es.lproj */; }; + 35AF9CCF89ECA7B4ABC0EAD6FC467E16 /* BTDropInUtil.h in Headers */ = {isa = PBXBuildFile; fileRef = FADFACB740A2CE3BCF97B82C0F016B23 /* BTDropInUtil.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 35FE82C3644DB29264E2557BF460DEAB /* BTCoinbaseOAuth.m in Sources */ = {isa = PBXBuildFile; fileRef = BBC95A3F395AB0BB5BD092E8D3B9B422 /* BTCoinbaseOAuth.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + 361187D9EB1EFFB68CD57571A2D9BA1A /* BTErrors.m in Sources */ = {isa = PBXBuildFile; fileRef = 85400FE5327281FF119C83A4D782CF4A /* BTErrors.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + 37039D01213F8B631E8EB55BBF6E077E /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E30FECFD9A464CB0A16FB6482C06FA57 /* CoreLocation.framework */; }; + 37524EE6CD6558AD6C77D5FB37978E8A /* en_CA.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 5404CB6D5E865BA59F3454655C4A11EE /* en_CA.lproj */; }; + 37C77FC2AD9EA18BBBFB455C1230CCBA /* de.lproj in Resources */ = {isa = PBXBuildFile; fileRef = FC4DB6D24B321D7FAA44BE1ADF7BD0CC /* de.lproj */; }; + 39D6342A2B13825805AE103DAA8F12C8 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A10093E5A41EEAEEA097F52B0BBBDCA7 /* UIKit.framework */; }; + 3A1BA76AA1A5B81ED6E3066E29465F95 /* SwiftSpinner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5AAB4900836AD65A1892863D8C0CA45B /* SwiftSpinner.swift */; }; + 3B7E1804D06F0101659B6AAF9A234DAB /* BTPaymentApplePayProvider_Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C73C62B2ECB0CE0CECCC01E74E47A1E /* BTPaymentApplePayProvider_Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 3C2C9D68771F4279557D1D198FD278D0 /* en_AU.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 956841DDBCE82016D9066E0F991B0EB5 /* en_AU.lproj */; }; + 3D080178540ED70237145805A3C7FFCA /* BTHTTPResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = BF15EE451A59879C62649818CB96D4B8 /* BTHTTPResponse.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 3DA442BE4489FE6D417B9910FAB7FFED /* BTMutableApplePayPaymentMethod.m in Sources */ = {isa = PBXBuildFile; fileRef = 510CE6410A513B6BFFF8C0F0E4CB93C8 /* BTMutableApplePayPaymentMethod.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + 3E3E5515D355160B0CA66ECE39463525 /* PayPalOAuthScopes.h in Headers */ = {isa = PBXBuildFile; fileRef = F4C8A0661199460635BABB64AF57A197 /* PayPalOAuthScopes.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 3EF6A1B84385F5F1AD7FC0245F952F80 /* BTVenmoAppSwitchRequestURL.m in Sources */ = {isa = PBXBuildFile; fileRef = 75F26B7BB170442F02FE9921F44DF42D /* BTVenmoAppSwitchRequestURL.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra -Wall -Wextra"; }; }; + 3F2D244DFE742225AEBD13B7A2A71E13 /* BTUIHorizontalButtonStackCollectionViewFlowLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = A6575B29A37D967CEE189167D3C457A7 /* BTUIHorizontalButtonStackCollectionViewFlowLayout.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra -Wall -Wextra"; }; }; + 410D9DDF91433A8C6EBFD29B00359754 /* BTUIHorizontalButtonStackSeparatorLineView.h in Headers */ = {isa = PBXBuildFile; fileRef = 784CE60F68D6EC7D1A6C4B6F8652162F /* BTUIHorizontalButtonStackSeparatorLineView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 41B53A4175641222884BC63716ECF23F /* Braintree-Coinbase.h in Headers */ = {isa = PBXBuildFile; fileRef = E570598F11EA7ED168263D87DED8A248 /* Braintree-Coinbase.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 41F55DB3E635C7DAD3F88244B9F69DB4 /* UIColor+BTUI.m in Sources */ = {isa = PBXBuildFile; fileRef = 79A1C156097E1AF87DA1E3E907139E49 /* UIColor+BTUI.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra -Wall -Wextra"; }; }; + 422C8B9A8605254001CA7370C8998089 /* BTUICTAControl.h in Headers */ = {isa = PBXBuildFile; fileRef = 0B87FA025DBA2C2D7B4A5B45991CDE0F /* BTUICTAControl.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 43E6305D216CA6C65211BEC11ECFBF99 /* BTPostalAddress.h in Headers */ = {isa = PBXBuildFile; fileRef = 62B0BB423C9C2A608B6AEC2BF10D0B6A /* BTPostalAddress.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4443F897B2D3B37F0D94D413A47129E7 /* BTUIDiscoverVectorArtView.h in Headers */ = {isa = PBXBuildFile; fileRef = 70985FCA1C9E59CCB4866246DAC7855B /* BTUIDiscoverVectorArtView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 44FD01E042AD9FA6907C9D4E0E848082 /* BTPaymentMethodCreationDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = F89F82156FC911C202F8D5ADAD77EAA4 /* BTPaymentMethodCreationDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 457AF8F653D310BF1F86D365EDB5C163 /* nl.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 88F844B1049EA76C84663E937172CA57 /* nl.lproj */; }; + 460D9D8121753347BAD686364E0D7B22 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DCA3EB6ACCDF017065BE82C0CD77274D /* Foundation.framework */; }; + 474508DDB7C9EC13FFBF3E656DD243F9 /* Pods-e-shopUITests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 939504379DEC44E80052E319CFC42A8C /* Pods-e-shopUITests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 47F4F40A11F7C0F57018A4912D3C01DA /* BTUIPaymentButtonCollectionViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 80B489031BD0D111868318889F96C03F /* BTUIPaymentButtonCollectionViewCell.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4869301401DB2ADFC2878BC75D4A9192 /* Braintree-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FE5360F4AD5267FF4C71E4A7198DA9E /* Braintree-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 49ADBAFE0BF2B24476B218A2497CF808 /* BTClient_Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = FDFABD53E21583B698FBACD77A41FF99 /* BTClient_Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 49BCA60FE356B63E574953DE9D11C70A /* BTUICardPostalCodeField.m in Sources */ = {isa = PBXBuildFile; fileRef = BA0CE2DAD4DFA8346D116A2EE71D3637 /* BTUICardPostalCodeField.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra -Wall -Wextra"; }; }; + 4A8366A148A09626F23191859F5454A5 /* BTDropInErrorAlert.m in Sources */ = {isa = PBXBuildFile; fileRef = EEB5D21C6D6AEC94C37E49AD0269D0C3 /* BTDropInErrorAlert.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + 4A87030416FF55A054B48E9E96C2E4E8 /* BTUISummaryView.m in Sources */ = {isa = PBXBuildFile; fileRef = 19A2914D7A65E3CAAA4FF3A219AFCC70 /* BTUISummaryView.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra -Wall -Wextra"; }; }; + 4A91ECD48DB9384F72C015B0DB37BAFE /* BTDropInLocalizedString.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F0351A88A244718952AEF13EB926369 /* BTDropInLocalizedString.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + 4B9513792AB6E3DD0FBE802704B001EA /* BTUIViewUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = 73CF74A7F811FE03E151D926E9944AD6 /* BTUIViewUtil.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra -Wall -Wextra"; }; }; + 4C661FEC1F17FE7C8B1E559881D3B23A /* BTUIPaymentMethodView.m in Sources */ = {isa = PBXBuildFile; fileRef = 9CE6DEAA87580380AA134D62C62D87EF /* BTUIPaymentMethodView.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra -Wall -Wextra"; }; }; + 4CACA04CA000D7AAE6A1931C475A2D29 /* he.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 1FBD085AA2BA94AEDF8B9C4F123AA10C /* he.lproj */; }; + 4D343EDCA8E7B9AE5887785E6132C8CB /* en.lproj in Resources */ = {isa = PBXBuildFile; fileRef = FD4A9EF2EE705D6BB3D182B92AA9F881 /* en.lproj */; }; + 4E02312EE9DA60BB30A26A29EBFA9684 /* BTUIJCBVectorArtView.h in Headers */ = {isa = PBXBuildFile; fileRef = 37F26233EB66AF1BEB06FEC2AE28741D /* BTUIJCBVectorArtView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4E87699A62DF67CAA9BCDF66E99A3706 /* fr_FR.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 5CBB67D9AC81740B4A603338EEC9F6A7 /* fr_FR.lproj */; }; + 4F929620824A72CD7D640D4D8674FBF5 /* BTAPIPinnedCertificates.m in Sources */ = {isa = PBXBuildFile; fileRef = DD938CFF98BF1E75D59D5819D578CB58 /* BTAPIPinnedCertificates.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + 4FD9481CF1583ABA043399FF496ADE83 /* PayPalProfileSharingViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = CA399B8A2A00ED43A7F736003AA65D4A /* PayPalProfileSharingViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 50883323C727321EFEA4E191CF17769F /* pt.lproj in Resources */ = {isa = PBXBuildFile; fileRef = B4BB3E39DF2D084B2FE1AF985AF66A3A /* pt.lproj */; }; + 51082C97BA8B2C099BD88A8AF510B566 /* BTMockApplePayPaymentAuthorizationView.h in Headers */ = {isa = PBXBuildFile; fileRef = 01FB766884043484E21C6BA24ACB20E5 /* BTMockApplePayPaymentAuthorizationView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 522EA7E1220C62C8CF8CCE83013308B0 /* it.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 401F1D5F7BBE42B7721F0A362382442F /* it.lproj */; }; + 52FDD6C385AF853DB8E1BA5B9ADD0AB5 /* BTUICVVFrontVectorArtView.h in Headers */ = {isa = PBXBuildFile; fileRef = 4FC818130C25A7E32674B34981C1CF2E /* BTUICVVFrontVectorArtView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 53926534C006EAE348C55306A74DEC7F /* BTAnalyticsMetadata.h in Headers */ = {isa = PBXBuildFile; fileRef = 38339BE4A246641306C1C261F490E1E6 /* BTAnalyticsMetadata.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 53C13CEE168AE5CE4848EE670AC59BA8 /* BTUI.m in Sources */ = {isa = PBXBuildFile; fileRef = BC02B5732729F561557DA9D4BD777945 /* BTUI.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra -Wall -Wextra"; }; }; + 53C6ED3A7E12CF5B8F8C76B679A31E31 /* BTClientToken.m in Sources */ = {isa = PBXBuildFile; fileRef = A824FDE36FB7B6E37BC93EF415BF5653 /* BTClientToken.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + 5419084F01982619A0C7CB79326AE206 /* BTUICardNumberField.m in Sources */ = {isa = PBXBuildFile; fileRef = DEDA6C813BA0A4A4B5553BE6A7D8204F /* BTUICardNumberField.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra -Wall -Wextra"; }; }; + 546AF7EAD530DF010AD0B82158BE5CEB /* BTUICardExpiryField.m in Sources */ = {isa = PBXBuildFile; fileRef = 56BFBE219E208BCB2B17DA7D33B7FF8D /* BTUICardExpiryField.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra -Wall -Wextra"; }; }; + 54984BEA7A91366D4C92121785E37C5F /* BTUIFormField_Protected.h in Headers */ = {isa = PBXBuildFile; fileRef = 60C3D0D869C4C0881520EFDB9816EC12 /* BTUIFormField_Protected.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 54AC6F9A3A262EF735AD07B432AADCB4 /* BTClientMetadata.h in Headers */ = {isa = PBXBuildFile; fileRef = B9D49F9BB9851BD128ACB53CE36503B0 /* BTClientMetadata.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 54AF321C804398D52091952C55315E85 /* BTClientTokenBooleanValueTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = 1698D7585E515C9AB4D0411B74E2B4E4 /* BTClientTokenBooleanValueTransformer.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + 579DDD3F2D763D7BCC28F44A5422223A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DCA3EB6ACCDF017065BE82C0CD77274D /* Foundation.framework */; }; + 591880F8FBAD47EE12B9C3986900198C /* BTThreeDSecureLookupResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 4EA2FF0C08B5444735AE639C147FDDE6 /* BTThreeDSecureLookupResult.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 5A0651F31CAFB48A681CC8C274D89C27 /* BTAnalyticsMetadata.m in Sources */ = {isa = PBXBuildFile; fileRef = 55296B2A90B8BA9CE61A7784F72C7A36 /* BTAnalyticsMetadata.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + 5A44FBED8CA502F1C76DB1270F32E104 /* BTUICVVFrontVectorArtView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DA807C0D8BEC5D8630D22D3DD470EF0 /* BTUICVVFrontVectorArtView.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra -Wall -Wextra"; }; }; + 5B9F146CCE8AAD63B54B103746E6F897 /* BTUICardHint.h in Headers */ = {isa = PBXBuildFile; fileRef = A0CA53D5DD63BF0F7AD430CAA9BFF36C /* BTUICardHint.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5C2A2630B357FC65678F47D4E9A1B54A /* BTPaymentProviderErrors.h in Headers */ = {isa = PBXBuildFile; fileRef = 3E9241BF24149C9BC653839B8ABDD8F7 /* BTPaymentProviderErrors.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5F7F6050E3E42343DD27871B1079F721 /* BTClient+Testing.m in Sources */ = {isa = PBXBuildFile; fileRef = 588089A8E5B3CB02611C38CC9A220F67 /* BTClient+Testing.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + 605108BBF9F1D2B33EEE075CE1FB90B2 /* BTDropInErrorAlert.h in Headers */ = {isa = PBXBuildFile; fileRef = A197B3CECA30AEA5DA8364242F5DDC02 /* BTDropInErrorAlert.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 615E09444C5E8F8498F82FA21AFE9C24 /* he.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 9B1300E38A06658936C39F2D5BFC90DA /* he.lproj */; }; + 617C2654BBBEA85161540B92FB9D4BF7 /* BTPayPalPaymentMethod_Mutable.h in Headers */ = {isa = PBXBuildFile; fileRef = 5FCDE9F7794B3AEDB30920A893FAF444 /* BTPayPalPaymentMethod_Mutable.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 623F3A97DD96FEE1D1C9A46A1BB924A3 /* BTPaymentProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = DEF6B666D5D948D1A4559074848CE494 /* BTPaymentProvider.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 62433B9324B3C862A5606432DCAB2462 /* BTPaymentProviderErrors.m in Sources */ = {isa = PBXBuildFile; fileRef = 6523AA06B7329D80F5763688BFA13DEC /* BTPaymentProviderErrors.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + 6282FDB409CF0E95F4D051A03BACB6B4 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D9416AB33B5BCFF233E535E92430B61E /* AVFoundation.framework */; }; + 630C846FB6B99E47CD3C913E2FEE00DE /* ru.lproj in Resources */ = {isa = PBXBuildFile; fileRef = BFEE3C0C4D89BD01CC7B467E89F49AED /* ru.lproj */; }; + 647527B3DB41311B73B7B10F46F6B55F /* Pods-e-shopTests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 59839D5BB7E4F9791FCB5E15667FA62D /* Pods-e-shopTests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 653E89428F4305188C04E3382B8C2412 /* fr.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 46A707DFC330422413D91ABE98FBBA93 /* fr.lproj */; }; + 6554D21C6ADABFB17307FBA9F9A5A70C /* BTErrors+BTPayPal.m in Sources */ = {isa = PBXBuildFile; fileRef = 272E73B615778A260640FD438FDC8C27 /* BTErrors+BTPayPal.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + 6700837ACF7E098AA03924D913770F3B /* Braintree-UI-Localization.bundle in Resources */ = {isa = PBXBuildFile; fileRef = AE7DFABF6FADBCF5FFE59CABE6952CBC /* Braintree-UI-Localization.bundle */; }; + 6782D47610335064E5FA65C504758698 /* BTClient+Offline.m in Sources */ = {isa = PBXBuildFile; fileRef = 819053F6192524A32EF90C7EC510DEEA /* BTClient+Offline.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + 681EEFC23322A1EA52F45F18E84A5D7B /* AddressBook.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DC4B34EC7CD169478D3EA0AFE5560242 /* AddressBook.framework */; }; + 685A49F8CF817EF5E0C5D479142DC351 /* BTPayPalAppSwitchHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 03A8AD28BDC14C140B367746A2BE4A0A /* BTPayPalAppSwitchHandler.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 6990821B9BBBA3463C2044119DF969D7 /* BTKeychain.h in Headers */ = {isa = PBXBuildFile; fileRef = 6394260A02F7F70C36756C55B0009ED3 /* BTKeychain.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 6B4FFB66AD666EC7ADE0F4DDA9DB5EC3 /* BTMutablePayPalPaymentMethod.h in Headers */ = {isa = PBXBuildFile; fileRef = 329C7B359C10DC47768653FA76DA9DDB /* BTMutablePayPalPaymentMethod.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 6D49EDD64E06F0F5336B2EEB0F9E1C93 /* BTUIUnknownCardVectorArtView.m in Sources */ = {isa = PBXBuildFile; fileRef = FE3B5147B5A79D36E832208526B02E2F /* BTUIUnknownCardVectorArtView.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra -Wall -Wextra"; }; }; + 6FC9FBF0266CC8BC0C83FC7F8055C244 /* Braintree-Drop-In-Localization.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 1AC0A4B9F1806BEA03BAC7410174E0F4 /* Braintree-Drop-In-Localization.bundle */; }; + 6FE2E45567F4B6C3DB1CCBEA8D169B16 /* BTUIMaestroVectorArtView.h in Headers */ = {isa = PBXBuildFile; fileRef = 175F9B42B7C5445F2CFE949571BBA5A3 /* BTUIMaestroVectorArtView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6FEFEF3F83C2CF57653469105958AB1B /* BTPayPalAppSwitchHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 50B09AD41FD73EB6829C6C051E5DA582 /* BTPayPalAppSwitchHandler.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + 701D85B0A034A8781917D8A6C69C9CF8 /* BTClientToken.h in Headers */ = {isa = PBXBuildFile; fileRef = 979D23B77BE016F44E0D3EEB7552BCF6 /* BTClientToken.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 70CBB3A6B9662554CDA578FFE0CEC37E /* BTDropInErrorState.h in Headers */ = {isa = PBXBuildFile; fileRef = 546F7E81A9D28C3471BAF3E70FD070CC /* BTDropInErrorState.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 732E8E5B14A461E3E91F9BF7E0268587 /* BTUICoinbaseWordmarkVectorArtView.h in Headers */ = {isa = PBXBuildFile; fileRef = 98039649B9D8AC5797338D4DE532B90B /* BTUICoinbaseWordmarkVectorArtView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 748A3A1F5807C1FAE16CF7D60EBF0618 /* BTDropInUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = BE1B38C04D469D2ADDF12AA9341B3860 /* BTDropInUtil.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + 7560576B67084B42FD0DFA86FF78F2E8 /* BTAppSwitching.h in Headers */ = {isa = PBXBuildFile; fileRef = F235EC4573E3BC035067BE9F6946BAB7 /* BTAppSwitching.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 758E38D19D2B4E11949CCB86D396EEC0 /* BTVenmoAppSwitchHandler_Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = F5F6F99BC90E0712B27FA75A9866708C /* BTVenmoAppSwitchHandler_Internal.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 75CF4892ABD30E8013384DF425D2CDED /* BTDropInLocalizedString.h in Headers */ = {isa = PBXBuildFile; fileRef = B7495CA1FCAEEB002802D635E24A4329 /* BTDropInLocalizedString.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 77DF7FA1633F6F245E03A1C054EECFB6 /* BTClientStore.h in Headers */ = {isa = PBXBuildFile; fileRef = 324DDB86681B65C762C06882B6D1D84E /* BTClientStore.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 782661D4DBB3C991B767B5DEBC97C331 /* BTUIVenmoButton.h in Headers */ = {isa = PBXBuildFile; fileRef = E0C8DD2DF21D62EE888D2C733E8DE642 /* BTUIVenmoButton.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 78646BD28EE588D0D00DE812C5C9327E /* BTConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = 775F09A6B9DC2B9AEA9C2FE6D60F5747 /* BTConfiguration.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + 79C9E907DC73AC18E7740278014581B8 /* de.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 2FF6F4FE92FEC1EF0B24FE4EE9985B45 /* de.lproj */; }; + 7DC30CFFE701226449C5142FC6EFDA2E /* Braintree-Payments.h in Headers */ = {isa = PBXBuildFile; fileRef = 7F60B0A270601DD3CFC6AD5AB821EFEC /* Braintree-Payments.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7E59F78D60FE0890223C8D9CB14A3806 /* BTUIPaymentMethodView.h in Headers */ = {isa = PBXBuildFile; fileRef = EAE057D3D7D45E4DE75FAEDF2E6239EC /* BTUIPaymentMethodView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7E74F319D1559686F9BB782D29E81EC1 /* BTClient+BTVenmo.h in Headers */ = {isa = PBXBuildFile; fileRef = 58D4AE93C14A08E6E6EDBAFAC2E49A0E /* BTClient+BTVenmo.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7F49096048F910343D56A064AE1E3B41 /* BTUIDinersClubVectorArtView.h in Headers */ = {isa = PBXBuildFile; fileRef = 01CAFF76BD30D2C3837E6314DF821568 /* BTUIDinersClubVectorArtView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7FB3D2B561194E5AE69501F5A2E77D92 /* PayPalPayment.h in Headers */ = {isa = PBXBuildFile; fileRef = 056D3F8945FBB82058AD7E35388DE3E0 /* PayPalPayment.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 801ED50A940F49B21DE5FAA3B80C13A4 /* BTApplePayPaymentMethod.m in Sources */ = {isa = PBXBuildFile; fileRef = 99A2993695AB373FA5F755C068F9C2AD /* BTApplePayPaymentMethod.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + 80D8EBDE40F7014FF27A69B554EC6F36 /* pl.lproj in Resources */ = {isa = PBXBuildFile; fileRef = DB48DC12CBE117C8ED6A220CB3E529D6 /* pl.lproj */; }; + 856ED1EF0ACFE136AF89CEAB86990D79 /* Pods-e-shop-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 1604B7739F25FDC3D4FE2EF3C6EB6549 /* Pods-e-shop-dummy.m */; }; + 85FBF5CF24291B3A56A232A85F14EB66 /* BTClientStore.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F4DF2508F1E5E978DC32BFFD3041847 /* BTClientStore.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + 86B2EC2448B317C91B1A61FB308FEA69 /* Pods-e-shopUITests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = E498E8D39CB5D3D1ED6B8B028ACCA1ED /* Pods-e-shopUITests-dummy.m */; }; + 86F709465ACFC28F8721C030FBA47D40 /* Braintree-API.h in Headers */ = {isa = PBXBuildFile; fileRef = E7A96E376CC4DC753049097ACF01F4DD /* Braintree-API.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 885AD76D683873B09A8E5906EDC3454A /* BTUIUnknownCardVectorArtView.h in Headers */ = {isa = PBXBuildFile; fileRef = FCFABB4AF3184938602F532831B1FE45 /* BTUIUnknownCardVectorArtView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 88E7396FBF2A0C0DF274BE78B998A7E2 /* BTUICoinbaseWordmarkVectorArtView.m in Sources */ = {isa = PBXBuildFile; fileRef = 600C9ADF11A0A743A3FCA0A13484039D /* BTUICoinbaseWordmarkVectorArtView.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra -Wall -Wextra"; }; }; + 898D7FAD7C73AB9C205BA4937DDB4C35 /* BTPaymentMethod.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E016DD89C30590C856A83E17100F313 /* BTPaymentMethod.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + 8A1AC83A9ABB8ADA9505F53F4B4CA709 /* BTOfflineModeURLProtocol.m in Sources */ = {isa = PBXBuildFile; fileRef = 21F4388F5207051CC72548F4FEEF347A /* BTOfflineModeURLProtocol.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + 8A32D0A5DBC5E9C8C2B54981AACA1525 /* SwiftSpinner-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = E956C3CD5E0CA6C461C51BE2C83D0DD6 /* SwiftSpinner-dummy.m */; }; + 8B54F81845C666039B207D770FF29994 /* BTCoinbasePaymentMethod.h in Headers */ = {isa = PBXBuildFile; fileRef = 28CF6E6C9FACE4E7F81D2177C76738F9 /* BTCoinbasePaymentMethod.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8C087B97D3F4039C55559543C97D513D /* BTMutableCardPaymentMethod.h in Headers */ = {isa = PBXBuildFile; fileRef = 119400E00337107F48840956E71CA79E /* BTMutableCardPaymentMethod.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 8C0FFB167E67DB4F4F675CD1784D91B7 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DCA3EB6ACCDF017065BE82C0CD77274D /* Foundation.framework */; }; + 8C2E8333AB2626DC4DD608FDA9799164 /* BTCoinbaseOAuth.h in Headers */ = {isa = PBXBuildFile; fileRef = 0667C1FB298D61186B389479268D6B0C /* BTCoinbaseOAuth.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 8CE3DD3A8E09999D608A408193118FA9 /* BTClientCardRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 18DC6C9559099F7280B732FC7883D614 /* BTClientCardRequest.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8E9B9D69DDD2152E35ADDD5C3AE92AC8 /* BTVenmoAppSwitchHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = FBBE53C0A036DEFB6380F5F46AA2823B /* BTVenmoAppSwitchHandler.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra -Wall -Wextra"; }; }; + 8F38F69DA2C63028F81E0E765A418124 /* pl.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 68A1FC01AD2ED0E190E0A33D1B2C47FA /* pl.lproj */; }; + 8F8BAA84A024F991E5346F2EF278C9B5 /* zh-Hans.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 066EEADDB26FADD359C2DA65EACA05EC /* zh-Hans.lproj */; }; + 91211978A597404D19512DE0B708276B /* BTCoinbasePaymentMethod_Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = B5331627F4B869AB13FD99EA7EC32607 /* BTCoinbasePaymentMethod_Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 918652015DA5026ED20FDB64024358BD /* BTDropInViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = B8A7F1ECBFF1BAFC3F06993ACE5DFEC9 /* BTDropInViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 93143E50BB2F31A9EA706939EF632FD2 /* BTPayPalViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = C9241063783B2A4F06F9DE3D2D00658B /* BTPayPalViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 933E740D7E92065D841E4FC381A85DBF /* BTVenmoAppSwitchHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 88494260CEDE63A821B3C2CCC634B20B /* BTVenmoAppSwitchHandler.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 934007A3CA57E7EF6BC660EFF85CCA27 /* Pods-e-shop-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 5E96E8626E8AAE007B4BF6CEA7D677B3 /* Pods-e-shop-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 93AE9E1AAEA950D48F9991F1917CC893 /* BTCardPaymentMethod.h in Headers */ = {isa = PBXBuildFile; fileRef = F1D4FEEBECE3C6D3E0A498E89CDA2775 /* BTCardPaymentMethod.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 949A869D49936AE4BBC923FC1207F250 /* es.lproj in Resources */ = {isa = PBXBuildFile; fileRef = B1AB57A8E3CDD4C876A2E77336B7C001 /* es.lproj */; }; + 96695D9DB0B0351A76EC25ECD17BAA0D /* BTClientTokenApplePayStatusValueTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = D325902D803D782B5B8A5C45D7F4187F /* BTClientTokenApplePayStatusValueTransformer.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + 967ADD44A2C2557582D536C8304E94BB /* BTAPIResponseParser.h in Headers */ = {isa = PBXBuildFile; fileRef = E55A634A2AE923AFD1C2AC9508216EE6 /* BTAPIResponseParser.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 96F63EC3C00D9C1714F34E12AAB99B14 /* BTClientCardTokenizationRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E14FBA54202A7F4153D802DA448CE8C /* BTClientCardTokenizationRequest.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + 974BB4774F1C8E302B86B4F2F6956191 /* BTUICardExpiryField.h in Headers */ = {isa = PBXBuildFile; fileRef = 577BAD514739A215A7ABC33969EECCF8 /* BTUICardExpiryField.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 977DC6C1DCC8E0D369F05F10F585EBF8 /* SwiftSpinner.h in Headers */ = {isa = PBXBuildFile; fileRef = A96C65B99B475FB331C34043F3BD68D4 /* SwiftSpinner.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9A039E74BC1944DE875586F8BC4C76D0 /* BTUIFormField.h in Headers */ = {isa = PBXBuildFile; fileRef = 0BB9259B8D88E6A62A6D191BB74524C5 /* BTUIFormField.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9B515C4659AF2232260C0C151387CF20 /* BTUIMasterCardVectorArtView.m in Sources */ = {isa = PBXBuildFile; fileRef = 694A103F30D18E471F70ADD4A35A84C8 /* BTUIMasterCardVectorArtView.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra -Wall -Wextra"; }; }; + 9EDEC6C658043FACC2EA80A059530073 /* BTVenmoAppSwitchReturnURL.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AF1ED6E74B939727F427787AA2D51AC /* BTVenmoAppSwitchReturnURL.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra -Wall -Wextra"; }; }; + 9F44CB6B1EB9F0270F6A5DDCFEA84774 /* en_CA.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 4A0E2D4A0ACA366F0ED438B0511EB080 /* en_CA.lproj */; }; + A0F37D7091C27FF580A1E382AC769D9E /* BTMutablePayPalPaymentMethod.m in Sources */ = {isa = PBXBuildFile; fileRef = 67B3F589263A763A9DEB7EFB58215F4B /* BTMutablePayPalPaymentMethod.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + A1305FED42367F89A376A32C334D2E7A /* BTAppSwitch.h in Headers */ = {isa = PBXBuildFile; fileRef = 5BD414275D72D8669FDF826623F56E6C /* BTAppSwitch.h */; settings = {ATTRIBUTES = (Project, ); }; }; + A1C717158939552EE693D7E40B212A6A /* BTUICardFormView.m in Sources */ = {isa = PBXBuildFile; fileRef = BF70395B9B5FFB6DE32DF90297887FA2 /* BTUICardFormView.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra -Wall -Wextra"; }; }; + A2437A1E496CDC233FEAE0A4C1C2D3FB /* BTPayPalHorizontalSignatureWhiteView.h in Headers */ = {isa = PBXBuildFile; fileRef = 8597562CF06A51DDD65FDFAFB804F004 /* BTPayPalHorizontalSignatureWhiteView.h */; settings = {ATTRIBUTES = (Project, ); }; }; + A30B68038EF488B71EC6B5C056E2F88A /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0D55B55B686E4781B2E301AFE6796DCF /* Accelerate.framework */; }; + A485C3388E41D0BB601DC12F8A249ED2 /* BTClientPaymentMethodValueTransformer.h in Headers */ = {isa = PBXBuildFile; fileRef = CAAECE01529235276AB1638EF733196C /* BTClientPaymentMethodValueTransformer.h */; settings = {ATTRIBUTES = (Project, ); }; }; + A4996FD6DFAD360297770AECD42AA68E /* BTDropInErrorState.m in Sources */ = {isa = PBXBuildFile; fileRef = 5001697A29FDCA7C353DBBFFBB9B88C6 /* BTDropInErrorState.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + A4B7448022BF3E87D25DBD2C363650A6 /* BTVenmoAppSwitchRequestURL.h in Headers */ = {isa = PBXBuildFile; fileRef = 3D48F14534A461E2E9FF76C8B8DD4888 /* BTVenmoAppSwitchRequestURL.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A5F4780B5651A42D48AC505142854F64 /* Braintree.m in Sources */ = {isa = PBXBuildFile; fileRef = A77E9D0565540646549A928543B0683F /* Braintree.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + A6444AB4D993A48CC74EF008771E37FD /* BTLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = D05209FFEB64AA107E1887F513E3FD83 /* BTLogger.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + A66C682EC1AAED7D637F4221E88372C4 /* BTPaymentProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AF70CB69D28D4BE0538BE8735B1D2E9 /* BTPaymentProvider.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + A68A5CD3EB7584AB70237106B472684B /* BTUICardExpiryFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = E7C46E1218663FBE61153E8D8564E198 /* BTUICardExpiryFormat.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A6DC0E71C58088F5155674CBD0A4EF70 /* BTUICTAControl.m in Sources */ = {isa = PBXBuildFile; fileRef = 9BA7C40835000B356B6654BD1C05A12F /* BTUICTAControl.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra -Wall -Wextra"; }; }; + A8C3488F9C845051A76EAC25CBD99F28 /* BTClientPaymentMethodValueTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D9D68D7B6CA34D60B16509BB8084743 /* BTClientPaymentMethodValueTransformer.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + A976576315BDF2B1C377560CF524052C /* BTClient+Offline.h in Headers */ = {isa = PBXBuildFile; fileRef = BE9F23152548348322AF3D1620883345 /* BTClient+Offline.h */; settings = {ATTRIBUTES = (Public, ); }; }; + AA0D425F5331728AE9F3DF940B127891 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82DD1B6EEBE1353D0F0B1E2B03B41AF2 /* CoreMedia.framework */; }; + AA9B56878B9A3D06D1EE5FEDCC0EA1CF /* BTClientTokenApplePayPaymentNetworksValueTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = 7F9EE9C0A5705AC33E76B38F7130B6F1 /* BTClientTokenApplePayPaymentNetworksValueTransformer.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + ABA2B3FB5C302B189679AD2964313B0B /* BTUIHorizontalButtonStackCollectionViewFlowLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = CC9C64948CEC6CCA8C1ACA1FE8D41B2D /* BTUIHorizontalButtonStackCollectionViewFlowLayout.h */; settings = {ATTRIBUTES = (Public, ); }; }; + ABE4B076155B4CC8B8716E6612FA77C1 /* BTPayPalViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 90FF84C5A7A3C3E4578B4A6949C6D2EF /* BTPayPalViewController.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + AD264C901BBBB2970758A174B818D906 /* BTUICardPostalCodeField.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A5958E162829C1F2845853FAFF21271 /* BTUICardPostalCodeField.h */; settings = {ATTRIBUTES = (Public, ); }; }; + AD2710FAE3DFB1D1234548B163CAA074 /* BTMutablePaymentMethod.m in Sources */ = {isa = PBXBuildFile; fileRef = A089368B5410E2C3A8A298903F6220A5 /* BTMutablePaymentMethod.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + AD30DECFFD51A0041656D35771E397E8 /* fr_CA.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 8ABDA8C06787D322B5084616451C6936 /* fr_CA.lproj */; }; + ADA952B413187B4533D9E9EDC34C9C83 /* Braintree-PayPal.h in Headers */ = {isa = PBXBuildFile; fileRef = 097017296FA40F78C707EE0190C35231 /* Braintree-PayPal.h */; settings = {ATTRIBUTES = (Public, ); }; }; + ADD8E4B619CCAC596C15D8F0A8090934 /* en_GB.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 00E95348D27C4FAE23FB9B9112FB3C2A /* en_GB.lproj */; }; + AEA2242F3C3E608C69FE879C7C520430 /* BTDropInSelectPaymentMethodViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 3818BD5DAD016542493A4D8A7A9FCFEE /* BTDropInSelectPaymentMethodViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; + AF6473DFE5D8F45D44929DCE1C093CFD /* BTMockApplePayPaymentAuthorizationViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 03EF47CEAF1FF53F7E0EAFEA132E870D /* BTMockApplePayPaymentAuthorizationViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; + AFDAF94E54EAA1261EC00F3997AD7A0B /* PayPalPaymentViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = E73890F7E6FDD399B996CD90C78DA870 /* PayPalPaymentViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; + B0293D5793834E6213A2AE6F9BC41AD6 /* BTApplePayPaymentMethod_Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 3E4C7FB83CB7290FB9DBA63FD8FEBD82 /* BTApplePayPaymentMethod_Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; + B112A375A949A67219A079F8E33B3003 /* BTUISummaryView.h in Headers */ = {isa = PBXBuildFile; fileRef = E435D48A4924EA03FB6C535B8FC5E3FC /* BTUISummaryView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B1A9B693C570D9E1680EC55DB00D7D6A /* fr_FR.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 50FB0AA4BE794DB09F45437E2D4B6D39 /* fr_FR.lproj */; }; + B25912208BEAE7A81B0E5CC68DCE018B /* BTUIMasterCardVectorArtView.h in Headers */ = {isa = PBXBuildFile; fileRef = DA007ADB023A2431F55D2312CB52C32F /* BTUIMasterCardVectorArtView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B25B8A33C10B1C4ED92206AFDFA61BD8 /* BTVenmoAppSwitchReturnURL.h in Headers */ = {isa = PBXBuildFile; fileRef = 77429DCF8526AAB784F235ECDE320FC2 /* BTVenmoAppSwitchReturnURL.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B2D28B26DA954F26A56636A20C911699 /* Braintree_Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = A22B43DBCB0A18EFD9B8C099421B41CC /* Braintree_Internal.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B366A476300A768AD0B3AA19354C6615 /* BTUIVenmoWordmarkVectorArtView.m in Sources */ = {isa = PBXBuildFile; fileRef = AAA6A4289AC766442F994D8C7545BA94 /* BTUIVenmoWordmarkVectorArtView.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra -Wall -Wextra"; }; }; + B3A7EB6E3EB669A2C6F473B33DB8D00C /* BTUICardVectorArtView.m in Sources */ = {isa = PBXBuildFile; fileRef = C0B7EBED640216CB3F4EDA6671F9930C /* BTUICardVectorArtView.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra -Wall -Wextra"; }; }; + B3EBC1656A83738E0E300C9005A1655D /* BTUICVVBackVectorArtView.m in Sources */ = {isa = PBXBuildFile; fileRef = C16B4967E831370ECDF6DD487BA26AFD /* BTUICVVBackVectorArtView.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra -Wall -Wextra"; }; }; + B40FB655E4E8B8BA745C7EFE842A20ED /* BTUICardExpiryFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = E5A4416474EB72E5A6B1166676293002 /* BTUICardExpiryFormat.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra -Wall -Wextra"; }; }; + B41AFD009B9A1FA73BDA91AC802C57C0 /* sv.lproj in Resources */ = {isa = PBXBuildFile; fileRef = DB8CA49FF18003C4F1AC98CAD3D47EDC /* sv.lproj */; }; + B4F2C29C6D91EFC194EA981E566471E6 /* BTURLUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BBD5AB1BCE700F6F5D05B202E4F75A4 /* BTURLUtils.h */; settings = {ATTRIBUTES = (Project, ); }; }; + B53CFE42A31F00F9260D5E088AFD3BF3 /* Braintree-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 04931217C691F5E1DD2EDE99C0325C35 /* Braintree-dummy.m */; }; + B597D34BC1B89FC75E5FB71B6BA7DA64 /* es_ES.lproj in Resources */ = {isa = PBXBuildFile; fileRef = F1C8D8C9BA56772C7F16B6F7D9310CB0 /* es_ES.lproj */; }; + B763C2782E9FF45D1540D1EFA74AEE14 /* Braintree-Version.h in Headers */ = {isa = PBXBuildFile; fileRef = FB7925B5379F9FCA4B0DE750B9D2F831 /* Braintree-Version.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B7F870B7F59D3498169B37597396BE0A /* BTOfflineClientBackend.m in Sources */ = {isa = PBXBuildFile; fileRef = 688FE6D209F39F7A256D0F2A12337999 /* BTOfflineClientBackend.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + B9534B03B507850E58C8DDF747AD4D6C /* BTUIFloatLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = 067CDB65089644D30CD950DFF8EDFC04 /* BTUIFloatLabel.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra -Wall -Wextra"; }; }; + BC3ED9FDE83722EFB40561BF2E858C0D /* en_AU.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 075D140B788A472C0A778560567C807D /* en_AU.lproj */; }; + BD1694D094559052F4F6ADC246235664 /* BTMutablePaymentMethod.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A0A6114376E2FCBE679CFA43BD07803 /* BTMutablePaymentMethod.h */; settings = {ATTRIBUTES = (Project, ); }; }; + BDA45F570973B50628F6F53C63866D48 /* BTDropInContentView.m in Sources */ = {isa = PBXBuildFile; fileRef = 2AF975CD57617548EB8CAF807C539719 /* BTDropInContentView.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + BF1960B0D33DC80D8EE2CCC2DB691C7A /* BTUIAmExVectorArtView.h in Headers */ = {isa = PBXBuildFile; fileRef = 4D452844708367AA4BF25041312750CA /* BTUIAmExVectorArtView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BF65F3C21B552FE98DAE07C599C292DD /* BTAPIPinnedCertificates.h in Headers */ = {isa = PBXBuildFile; fileRef = 39E3F487370716DD29B6FA35F46BEC88 /* BTAPIPinnedCertificates.h */; settings = {ATTRIBUTES = (Project, ); }; }; + C2794C72B1FFD41AF86B4D68CC54401F /* BTOfflineModeURLProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = A76FC5DFFDF753013EFCF8D6BC99276F /* BTOfflineModeURLProtocol.h */; settings = {ATTRIBUTES = (Project, ); }; }; + C4BDFD9BA454AE8C2451F03DE6ED3F0F /* en_GB.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 3D3C912A0C3A76D257046AE6CE6F0B97 /* en_GB.lproj */; }; + C6F76AFD9BDFE79026E4C2BD4062ECEC /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CCD735CE9A359DA7EC3902A5A000AE6E /* SystemConfiguration.framework */; }; + C70838A6EED4B04DBAA5FC4C5D0CB3C8 /* BTDropInContentView.h in Headers */ = {isa = PBXBuildFile; fileRef = DBBE990A0E887DE563DD89D9E6AD33AD /* BTDropInContentView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C710F3BE76AC1D84469BDB993314C3E1 /* BTLogger.h in Headers */ = {isa = PBXBuildFile; fileRef = CFDB88C42A99A599C063053E474E533B /* BTLogger.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C7C231720D2DE26FFEA66C8557C739B1 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FC0B507535E0F11C99F40F093E0E26A4 /* MobileCoreServices.framework */; }; + C99098B238353FBB1D565EC79DDAFE92 /* BTClient+BTPayPal.m in Sources */ = {isa = PBXBuildFile; fileRef = ECE18B767032811839CA8B5FDEA5F45D /* BTClient+BTPayPal.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + CA537B8DD934FA88DC9417D4E0D8BC1B /* BTAppSwitchingDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 3F3888077748753B1CFDB79BE515AE6E /* BTAppSwitchingDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CAF1E4235454CE853CACA21D02B5773B /* BTUIPayPalMonogramCardView.m in Sources */ = {isa = PBXBuildFile; fileRef = 3D03732FE41CAB86E3E2FCF4474A7771 /* BTUIPayPalMonogramCardView.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra -Wall -Wextra"; }; }; + CB7F871F9AF0EE636F1C567709FDAC30 /* BTMockApplePayPaymentAuthorizationView.m in Sources */ = {isa = PBXBuildFile; fileRef = 5A78BEF1089D75FCC370923D325BF50B /* BTMockApplePayPaymentAuthorizationView.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra -Wall -Wextra"; }; }; + CBFDDA6EA0F2873DD0AD1C68EB9E0674 /* BTUIThemedView.m in Sources */ = {isa = PBXBuildFile; fileRef = 19E123B367CEC880A941D83B356DA6A0 /* BTUIThemedView.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra -Wall -Wextra"; }; }; + CDC5FADA4F5255447E345BDC733768F8 /* BTUIVisaVectorArtView.h in Headers */ = {isa = PBXBuildFile; fileRef = 7FC4513465404253B2DE1D3F2FF98124 /* BTUIVisaVectorArtView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CE64BF35935FF116CC953ABF3D924F91 /* BTClientMetadata.m in Sources */ = {isa = PBXBuildFile; fileRef = 5CD135A55C33A2DA8EA129362C445EDB /* BTClientMetadata.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + D0D28057F22AE092C919C176B223B6FF /* BTUIScrollView.m in Sources */ = {isa = PBXBuildFile; fileRef = 5F86210A64EAB41DBCD768668D9836BD /* BTUIScrollView.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra -Wall -Wextra"; }; }; + D157EC82CF91F59B26D45A7AA8BCFB14 /* BTUIUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = 71214C1B37618129CB903F4D905796EB /* BTUIUtil.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra -Wall -Wextra"; }; }; + D17E35A2687AC4E040EAAA83762CCD60 /* BTClient.m in Sources */ = {isa = PBXBuildFile; fileRef = E34A50FCF7072CC5FC1335047A9A393F /* BTClient.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + D239C06F2BB14C43B029074416FC8588 /* BTPayPalPaymentMethod.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D821072A6751EBF76EB0B856B45203D /* BTPayPalPaymentMethod.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + D347B795146C40A6055238B0AE664D28 /* BTUIHorizontalButtonStackSeparatorLineView.m in Sources */ = {isa = PBXBuildFile; fileRef = 11900D1FFFE4774B5CA381BCFCB2F744 /* BTUIHorizontalButtonStackSeparatorLineView.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra -Wall -Wextra"; }; }; + D3AAF0E0BA3438A93B68844D24F2A649 /* fr_CA.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 0AE7B8063870B0DFE124D407F77F705F /* fr_CA.lproj */; }; + D443055B24A7A60E45CA2B2CBB1FF2EC /* BTUICardExpirationValidator.h in Headers */ = {isa = PBXBuildFile; fileRef = DF777EC545F15D6B1624FA3FF08253F9 /* BTUICardExpirationValidator.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D4648C856CF78B388AFF7F22B4F0443E /* BTCoinbaseDefines.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C9F71CBD7CA9479312170E45F8F166F /* BTCoinbaseDefines.h */; settings = {ATTRIBUTES = (Project, ); }; }; + D4F54E6DB3D5AC6672679CB0846585C6 /* BTUITextField.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B3381A9BABE613864B2BF4B1B2B94C5 /* BTUITextField.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D6C3F5F4CAF07EE0C815B31C6814C1DE /* BTLogger_Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = DDA27200595CF304AFDE92EF1CAF6583 /* BTLogger_Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; + D7904DEA41F64DA0B1568F887922D837 /* BTUICardVectorArtView.h in Headers */ = {isa = PBXBuildFile; fileRef = 9A3C1BB7E7CBF60E7F64E810B13C5301 /* BTUICardVectorArtView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D8E1B7FA35873BE1A547B39353970C0B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DCA3EB6ACCDF017065BE82C0CD77274D /* Foundation.framework */; }; + D932A90E15F7179C673C19FA75297F21 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DCA3EB6ACCDF017065BE82C0CD77274D /* Foundation.framework */; }; + D9A22298A70A00DEB691CC8BDB639473 /* BTUIPaymentButtonCollectionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = AD3932CD20EE7F354476511FD8FB7998 /* BTUIPaymentButtonCollectionViewCell.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra -Wall -Wextra"; }; }; + D9CB7B64829D28B7C57D035197159635 /* BTPayPalAppSwitchHandler_Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = E164768FA28AA99365AB933D18682C35 /* BTPayPalAppSwitchHandler_Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; + DAC7A1BC8783D09931A1387E8A5BF618 /* zh-Hans.lproj in Resources */ = {isa = PBXBuildFile; fileRef = C1B93F668D0CE0CBEE23A6A5B24E85B0 /* zh-Hans.lproj */; }; + DB13A8EB65353073EEA052F473FCCB1F /* Braintree.h in Headers */ = {isa = PBXBuildFile; fileRef = 82602B693A3179FD535B134B5ABA7CAB /* Braintree.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DBEFE4826FCE56FA6C4B1DDEFAE83126 /* BTUIVectorArtView.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A03E4FEEE63A93CD2ECA7C1A400345D /* BTUIVectorArtView.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra -Wall -Wextra"; }; }; + DD3B0BAEB2BFD0C9467D30DD757EC3B4 /* BTUICardCvvField.m in Sources */ = {isa = PBXBuildFile; fileRef = 95D6D49CDB41434D467C0D3DAAE387E9 /* BTUICardCvvField.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra -Wall -Wextra"; }; }; + DD482DFA05EFB3250B8CE11623613CB3 /* BTCoinbase.m in Sources */ = {isa = PBXBuildFile; fileRef = 62AD6757B6CB10F9A2C81E886CC8139F /* BTCoinbase.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + DEF64AEF3D519E608FB93C6E57E4D9E6 /* BTPaymentButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 6DC7DBADACBBC773B6F99C7FB872EB7A /* BTPaymentButton.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DF3091B83B00A194B07E7EAB8E477F06 /* BTUIPayPalButton.h in Headers */ = {isa = PBXBuildFile; fileRef = B582ACCD853C62DFAA23EB29E2942E91 /* BTUIPayPalButton.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DF7261B45C63F5C4FF0CC3E23FD37347 /* BTDropInViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B7B6F2BAE251CE03A1F9402EA267DFC2 /* BTDropInViewController.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + DFED5A9C29E7FE35C9C5F0D7B8519638 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 212C02BC3A0F549AA7007FA335483131 /* AudioToolbox.framework */; }; + E055AD90401C4FCEBB07C1215152C930 /* PayPalConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = BD3263E8248FEB304BFDF33A920C5439 /* PayPalConfiguration.h */; settings = {ATTRIBUTES = (Project, ); }; }; + E05622799EC0C7984445517B418B9411 /* BTHTTPResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 56BB7A3269887D5EE6BC12C11FD8E664 /* BTHTTPResponse.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra"; }; }; + E120DA63D67CCD143B189A1192A7C3AB /* BTClient+BTPayPal.h in Headers */ = {isa = PBXBuildFile; fileRef = 094825D2CBD1C90DD3F755AD2E86E503 /* BTClient+BTPayPal.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E259F278537DF1A1E1F12B1EAE10DEC8 /* BTUICardExpirationValidator.m in Sources */ = {isa = PBXBuildFile; fileRef = C0BFFED27052394953FB3D0A30E95D3F /* BTUICardExpirationValidator.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra -Wall -Wextra"; }; }; + E31AB6322A16D2A553B4E36FE15AE118 /* BTUIUtil.h in Headers */ = {isa = PBXBuildFile; fileRef = A677CDC0EA5C6A0A3CD01237AF72E718 /* BTUIUtil.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E3D87B102A319A1D6CE0EECE64A54DB3 /* BTUICoinbaseButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 28780614EB7DE7D069114EB18953C5FF /* BTUICoinbaseButton.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E44EE860CEFFFEF3487F596F9D559AF0 /* PayPalFuturePaymentViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 2D68062F2216FC2C7826ABA03C486BDD /* PayPalFuturePaymentViewController.h */; settings = {ATTRIBUTES = (Project, ); }; }; + E749EAF04A3706FE0FF0883CD3005EF0 /* nb.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 6C876C4B9A775AF89F019D590FD95E8C /* nb.lproj */; }; + E99FE3E237DDAFE565951CC47EB5370F /* BTUICardHint.m in Sources */ = {isa = PBXBuildFile; fileRef = 488D8A86345502CC02EE4B10F45D682A /* BTUICardHint.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra -Wall -Wextra"; }; }; + EA86255C849CE35E395D21ABA95B14AF /* tr.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 714F20D066D22CA3AF71E0A70350A397 /* tr.lproj */; }; + EB82BCEB186F6C251A725EF362E3FC1F /* BTClient+Testing.h in Headers */ = {isa = PBXBuildFile; fileRef = B9B0F25F6E9A76BCAB8CD3EF3D7D081D /* BTClient+Testing.h */; settings = {ATTRIBUTES = (Public, ); }; }; + ECD094D2F8B422024A14583A295FF694 /* BTPayPalViewController_Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = D55C501E3CDF57AFBBBB23C99C9FBA22 /* BTPayPalViewController_Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; + EF0FF8ADAECB92C7DA007A6217115CD3 /* SwiftSpinner-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 9CCBD56BC88FCF4F70833F459D431DF1 /* SwiftSpinner-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EF7DFB4E253EC3D6C25F09C603CD1F67 /* tr.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 043097C8D4BE5AC049DC55C22D749599 /* tr.lproj */; }; + EFEAD82DA248824F65AC8AC4F9EF44F7 /* BTAppSwitchErrors.h in Headers */ = {isa = PBXBuildFile; fileRef = ACC621E7611D04F6A93ECF9774B43EF8 /* BTAppSwitchErrors.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F1C618A86B641F152E368F2005AA364E /* BTMockApplePayPaymentAuthorizationViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 21773FC5C4C76C2B03E4420F846657FF /* BTMockApplePayPaymentAuthorizationViewController.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra -Wall -Wextra"; }; }; + F2746D4A3B04C409DC8143C585339170 /* BTUIPayPalWordmarkVectorArtView.m in Sources */ = {isa = PBXBuildFile; fileRef = 032F5C4BC554AD71736338EE0BE53DED /* BTUIPayPalWordmarkVectorArtView.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra -Wall -Wextra"; }; }; + F293818AEC2312FD6BCA62DECB40CE79 /* BTUIFormField.m in Sources */ = {isa = PBXBuildFile; fileRef = 60A885AA6480DEB46CD8F548C8495DCB /* BTUIFormField.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra -Wall -Wextra"; }; }; + F2A7536CDFA5C058E424417F18725924 /* BTErrors+BTPayPal.h in Headers */ = {isa = PBXBuildFile; fileRef = 9685C71CFBA0D13147F47D2A49FEF131 /* BTErrors+BTPayPal.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F2CE1BB75F9959467C6238A0EF1E94F2 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A10093E5A41EEAEEA097F52B0BBBDCA7 /* UIKit.framework */; }; + F5966432955C011639486B4C10349D14 /* BTPaymentApplePayProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 266CF3644F1760A681ED8A53A10DB322 /* BTPaymentApplePayProvider.h */; settings = {ATTRIBUTES = (Project, ); }; }; + F63339A2325D7B95BE965EFA6701C5B3 /* nl.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 5D4C5DB82C67B76F560917B0A876013C /* nl.lproj */; }; + F7E5D785A9E610F783EAEA6CB4FC2EE2 /* BTUITextField.m in Sources */ = {isa = PBXBuildFile; fileRef = 25BFDDDCACA702F2D3DA1D64A812DCF1 /* BTUITextField.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra -Wall -Wextra"; }; }; + F99C9D7C2FBF02DAE8A3FE0DDD482D68 /* en.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 50A64708B60E8B8714D4769A38C356C0 /* en.lproj */; }; + FB2CCF977538C9D9864296FD413218E5 /* BTUIAmExVectorArtView.m in Sources */ = {isa = PBXBuildFile; fileRef = 80D649CA236C3245685E5EDDD17EDFB2 /* BTUIAmExVectorArtView.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra -Wall -Wextra"; }; }; + FB4E25A35B7C2504623AF32EC742A088 /* BTClientCardTokenizationRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 63CCBA680A289348E44695F0F37C90D9 /* BTClientCardTokenizationRequest.h */; settings = {ATTRIBUTES = (Public, ); }; }; + FB8BD2869860D519B0CC9B79575800DD /* BTUIVenmoButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 81193EB1BBC61FC01DA61A2123184012 /* BTUIVenmoButton.m */; settings = {COMPILER_FLAGS = "-Wall -Werror -Wextra -Wall -Wextra"; }; }; + FC4C75E716B7CEA82F159CFCF924AA7A /* BTUICardType.h in Headers */ = {isa = PBXBuildFile; fileRef = 594270856579ECA7C38587B869C11103 /* BTUICardType.h */; settings = {ATTRIBUTES = (Public, ); }; }; + FD92F07ABE3944D130A0983557CA09D8 /* BTMutableApplePayPaymentMethod.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F5F2E3A36831346D29F3C5D6785668E /* BTMutableApplePayPaymentMethod.h */; settings = {ATTRIBUTES = (Project, ); }; }; + FED22AFBB2E25CB0E0BC5213FD2FBB58 /* BTUICardFormView.h in Headers */ = {isa = PBXBuildFile; fileRef = D514B7D36023356484EDBD7EC25AEB2D /* BTUICardFormView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + FF18A00D997DB584A063BF5BA0BA228D /* da.lproj in Resources */ = {isa = PBXBuildFile; fileRef = CB8FE086E8F31429BC1F0DEDD9A5DBD8 /* da.lproj */; }; + FF8F745FAD9319A79BEDF31983FA1948 /* BTUIPayPalWordmarkVectorArtView.h in Headers */ = {isa = PBXBuildFile; fileRef = 114ADCFD9A777215EBDA6A176AD70872 /* BTUIPayPalWordmarkVectorArtView.h */; settings = {ATTRIBUTES = (Public, ); }; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 28AF01E37AA3AE5E7D40AFC6A716E1A4 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 0216A666A53FA91B434D78FFF3844A15; + remoteInfo = "Braintree-Braintree-Drop-In-Localization"; + }; + 471BD0AD2BA23C2BB1D29E87E00641E3 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = C4183235EAFE92F8936576B47AC14369; + remoteInfo = SwiftSpinner; + }; + E85CFF93D5BB9B265A2FF640E1C8C4C3 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 2A2D068CE32D48F476DF6D1978B80935; + remoteInfo = "Braintree-Braintree-UI-Localization"; + }; + F55AC2750C9F308F37DE98B32F662D6F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 328427FD56364DBB2EE98EC86923B0FE; + remoteInfo = Braintree; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 00E95348D27C4FAE23FB9B9112FB3C2A /* en_GB.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = en_GB.lproj; path = Braintree/UI/Localization/en_GB.lproj; sourceTree = ""; }; + 012E49B7C3466A32BD319E4E4F815995 /* Pods-e-shopTests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-e-shopTests-resources.sh"; sourceTree = ""; }; + 01CAFF76BD30D2C3837E6314DF821568 /* BTUIDinersClubVectorArtView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTUIDinersClubVectorArtView.h; path = "Braintree/UI/Views/Vector Art/BTUIDinersClubVectorArtView.h"; sourceTree = ""; }; + 01FB766884043484E21C6BA24ACB20E5 /* BTMockApplePayPaymentAuthorizationView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTMockApplePayPaymentAuthorizationView.h; path = "Braintree/UI/Views/Apple Pay/BTMockApplePayPaymentAuthorizationView.h"; sourceTree = ""; }; + 032F5C4BC554AD71736338EE0BE53DED /* BTUIPayPalWordmarkVectorArtView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTUIPayPalWordmarkVectorArtView.m; path = "Braintree/UI/Views/Vector Art/BTUIPayPalWordmarkVectorArtView.m"; sourceTree = ""; }; + 038579BB75506D588A94589079AFAFEA /* Pods-e-shopTests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-e-shopTests-acknowledgements.markdown"; sourceTree = ""; }; + 03A8AD28BDC14C140B367746A2BE4A0A /* BTPayPalAppSwitchHandler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTPayPalAppSwitchHandler.h; path = Braintree/PayPal/BTPayPalAppSwitchHandler.h; sourceTree = ""; }; + 03EF47CEAF1FF53F7E0EAFEA132E870D /* BTMockApplePayPaymentAuthorizationViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTMockApplePayPaymentAuthorizationViewController.h; path = "Braintree/UI/Views/Apple Pay/BTMockApplePayPaymentAuthorizationViewController.h"; sourceTree = ""; }; + 043097C8D4BE5AC049DC55C22D749599 /* tr.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = tr.lproj; path = Braintree/UI/Localization/tr.lproj; sourceTree = ""; }; + 04931217C691F5E1DD2EDE99C0325C35 /* Braintree-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Braintree-dummy.m"; sourceTree = ""; }; + 056D3F8945FBB82058AD7E35388DE3E0 /* PayPalPayment.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PayPalPayment.h; path = Braintree/PayPal/mSDK/PayPalPayment.h; sourceTree = ""; }; + 0667C1FB298D61186B389479268D6B0C /* BTCoinbaseOAuth.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTCoinbaseOAuth.h; path = Braintree/Coinbase/Vendor/BTCoinbaseOAuth.h; sourceTree = ""; }; + 066EEADDB26FADD359C2DA65EACA05EC /* zh-Hans.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "zh-Hans.lproj"; path = "Braintree/UI/Localization/zh-Hans.lproj"; sourceTree = ""; }; + 067CDB65089644D30CD950DFF8EDFC04 /* BTUIFloatLabel.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTUIFloatLabel.m; path = "Braintree/UI/Views/Custom Views/BTUIFloatLabel.m"; sourceTree = ""; }; + 075D140B788A472C0A778560567C807D /* en_AU.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = en_AU.lproj; path = "Braintree/Drop-In/Localization/en_AU.lproj"; sourceTree = ""; }; + 094825D2CBD1C90DD3F755AD2E86E503 /* BTClient+BTPayPal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "BTClient+BTPayPal.h"; path = "Braintree/PayPal/@Public/BTClient+BTPayPal.h"; sourceTree = ""; }; + 097017296FA40F78C707EE0190C35231 /* Braintree-PayPal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "Braintree-PayPal.h"; path = "Braintree/PayPal/@Public/Braintree-PayPal.h"; sourceTree = ""; }; + 0AE7B8063870B0DFE124D407F77F705F /* fr_CA.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = fr_CA.lproj; path = "Braintree/Drop-In/Localization/fr_CA.lproj"; sourceTree = ""; }; + 0B417138C097DE0997C0EC21B5A8E848 /* Braintree.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = Braintree.modulemap; sourceTree = ""; }; + 0B87FA025DBA2C2D7B4A5B45991CDE0F /* BTUICTAControl.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTUICTAControl.h; path = "Braintree/UI/Views/Payments Components/BTUICTAControl.h"; sourceTree = ""; }; + 0B8D7F581901C097E1D25EADCA40F5D9 /* BTAppSwitch.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTAppSwitch.m; path = "Braintree/API/App Switch/BTAppSwitch.m"; sourceTree = ""; }; + 0BB9259B8D88E6A62A6D191BB74524C5 /* BTUIFormField.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTUIFormField.h; path = "Braintree/UI/Views/Custom Views/BTUIFormField.h"; sourceTree = ""; }; + 0BCD646F95BFFBF375A5569F1F0B20C8 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 0D55B55B686E4781B2E301AFE6796DCF /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/Accelerate.framework; sourceTree = DEVELOPER_DIR; }; + 0D837DD190669BD78364E00A2E961F7F /* ResourceBundle-Braintree-UI-Localization-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-Braintree-UI-Localization-Info.plist"; sourceTree = ""; }; + 0DA4BBF696E01D7790FA1BDF810A2DB5 /* Pods-e-shopTests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-e-shopTests-dummy.m"; sourceTree = ""; }; + 0F5F2E3A36831346D29F3C5D6785668E /* BTMutableApplePayPaymentMethod.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTMutableApplePayPaymentMethod.h; path = Braintree/API/Models/BTMutableApplePayPaymentMethod.h; sourceTree = ""; }; + 0FB6287A9B8F3568FA2A3EFB55B0B656 /* BTUICoinbaseButton.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTUICoinbaseButton.m; path = "Braintree/UI/Views/Payments Components/BTUICoinbaseButton.m"; sourceTree = ""; }; + 0FE5360F4AD5267FF4C71E4A7198DA9E /* Braintree-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Braintree-umbrella.h"; sourceTree = ""; }; + 114ADCFD9A777215EBDA6A176AD70872 /* BTUIPayPalWordmarkVectorArtView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTUIPayPalWordmarkVectorArtView.h; path = "Braintree/UI/Views/Vector Art/BTUIPayPalWordmarkVectorArtView.h"; sourceTree = ""; }; + 11900D1FFFE4774B5CA381BCFCB2F744 /* BTUIHorizontalButtonStackSeparatorLineView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTUIHorizontalButtonStackSeparatorLineView.m; path = "Braintree/UI/Views/Collection Views/BTUIHorizontalButtonStackSeparatorLineView.m"; sourceTree = ""; }; + 119400E00337107F48840956E71CA79E /* BTMutableCardPaymentMethod.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTMutableCardPaymentMethod.h; path = Braintree/API/Models/BTMutableCardPaymentMethod.h; sourceTree = ""; }; + 12EFFEFFE960B5FA829A41E523D05F25 /* BTClientTokenApplePayPaymentNetworksValueTransformer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTClientTokenApplePayPaymentNetworksValueTransformer.h; path = Braintree/API/Client/BTClientTokenApplePayPaymentNetworksValueTransformer.h; sourceTree = ""; }; + 14CC8C25872857E2437A3EB145237BC0 /* Pods-e-shopUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-e-shopUITests.debug.xcconfig"; sourceTree = ""; }; + 1604B7739F25FDC3D4FE2EF3C6EB6549 /* Pods-e-shop-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-e-shop-dummy.m"; sourceTree = ""; }; + 165461E34E990BA54002EB1FFA72AF73 /* BTCardPaymentMethod_Mutable.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTCardPaymentMethod_Mutable.h; path = Braintree/API/Models/BTCardPaymentMethod_Mutable.h; sourceTree = ""; }; + 1698D7585E515C9AB4D0411B74E2B4E4 /* BTClientTokenBooleanValueTransformer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTClientTokenBooleanValueTransformer.m; path = Braintree/API/Client/BTClientTokenBooleanValueTransformer.m; sourceTree = ""; }; + 1711A2FBC6D611770ABF04EF33B6C77B /* Pods_e_shopTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_e_shopTests.framework; path = "Pods-e-shopTests.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + 175F9B42B7C5445F2CFE949571BBA5A3 /* BTUIMaestroVectorArtView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTUIMaestroVectorArtView.h; path = "Braintree/UI/Views/Vector Art/BTUIMaestroVectorArtView.h"; sourceTree = ""; }; + 181523FA161A058C87B6A9A7B28DCBEF /* ResourceBundle-Braintree-Drop-In-Localization-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-Braintree-Drop-In-Localization-Info.plist"; sourceTree = ""; }; + 189866804C8C538C2C2C70527D4EF12A /* BTPaymentApplePayProvider.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTPaymentApplePayProvider.m; path = Braintree/Payments/BTPaymentApplePayProvider.m; sourceTree = ""; }; + 18DC6C9559099F7280B732FC7883D614 /* BTClientCardRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTClientCardRequest.h; path = "Braintree/API/@Public/BTClientCardRequest.h"; sourceTree = ""; }; + 19A2914D7A65E3CAAA4FF3A219AFCC70 /* BTUISummaryView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTUISummaryView.m; path = "Braintree/UI/Views/Payments Components/BTUISummaryView.m"; sourceTree = ""; }; + 19E123B367CEC880A941D83B356DA6A0 /* BTUIThemedView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTUIThemedView.m; path = "Braintree/UI/Views/Custom Views/BTUIThemedView.m"; sourceTree = ""; }; + 1AC0A4B9F1806BEA03BAC7410174E0F4 /* Braintree-Drop-In-Localization.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "Braintree-Drop-In-Localization.bundle"; path = "Braintree-Drop-In-Localization.bundle"; sourceTree = BUILT_PRODUCTS_DIR; }; + 1AF70CB69D28D4BE0538BE8735B1D2E9 /* BTPaymentProvider.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTPaymentProvider.m; path = Braintree/Payments/BTPaymentProvider.m; sourceTree = ""; }; + 1C29EDD397FE9B8F21CB8C97A626FF12 /* BTClientTokenApplePayStatusValueTransformer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTClientTokenApplePayStatusValueTransformer.h; path = Braintree/API/Client/BTClientTokenApplePayStatusValueTransformer.h; sourceTree = ""; }; + 1C9F71CBD7CA9479312170E45F8F166F /* BTCoinbaseDefines.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTCoinbaseDefines.h; path = Braintree/Coinbase/Vendor/BTCoinbaseDefines.h; sourceTree = ""; }; + 1D821072A6751EBF76EB0B856B45203D /* BTPayPalPaymentMethod.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTPayPalPaymentMethod.m; path = Braintree/API/Models/BTPayPalPaymentMethod.m; sourceTree = ""; }; + 1DE2F6908E2F404FB726399340D2CC5D /* BTPostalAddress_Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTPostalAddress_Internal.h; path = Braintree/API/Models/BTPostalAddress_Internal.h; sourceTree = ""; }; + 1DFCC9C897110F540B125AF084648C47 /* Pods-e-shopTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-e-shopTests.debug.xcconfig"; sourceTree = ""; }; + 1E016DD89C30590C856A83E17100F313 /* BTPaymentMethod.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTPaymentMethod.m; path = Braintree/API/Models/BTPaymentMethod.m; sourceTree = ""; }; + 1F0351A88A244718952AEF13EB926369 /* BTDropInLocalizedString.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTDropInLocalizedString.m; path = "Braintree/Drop-In/Localization/BTDropInLocalizedString.m"; sourceTree = ""; }; + 1FBD085AA2BA94AEDF8B9C4F123AA10C /* he.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = he.lproj; path = Braintree/UI/Localization/he.lproj; sourceTree = ""; }; + 2094F4BA7CE19E837D0E8F4CC3884F1B /* it.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = it.lproj; path = Braintree/UI/Localization/it.lproj; sourceTree = ""; }; + 212C02BC3A0F549AA7007FA335483131 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/AudioToolbox.framework; sourceTree = DEVELOPER_DIR; }; + 21773FC5C4C76C2B03E4420F846657FF /* BTMockApplePayPaymentAuthorizationViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTMockApplePayPaymentAuthorizationViewController.m; path = "Braintree/UI/Views/Apple Pay/BTMockApplePayPaymentAuthorizationViewController.m"; sourceTree = ""; }; + 21F4388F5207051CC72548F4FEEF347A /* BTOfflineModeURLProtocol.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTOfflineModeURLProtocol.m; path = "Braintree/API/Offline Mode/BTOfflineModeURLProtocol.m"; sourceTree = ""; }; + 23585019CE9A43FB294C8F2D768AE842 /* Pods-e-shop.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = "Pods-e-shop.modulemap"; sourceTree = ""; }; + 2470D2EA1A7E96AFD62FA39CA16D8194 /* Pods-e-shopUITests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-e-shopUITests-acknowledgements.markdown"; sourceTree = ""; }; + 25BFDDDCACA702F2D3DA1D64A812DCF1 /* BTUITextField.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTUITextField.m; path = "Braintree/UI/Views/Custom Views/BTUITextField.m"; sourceTree = ""; }; + 2633231F53A3326ACA0A5781CFE1C860 /* nb.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = nb.lproj; path = Braintree/UI/Localization/nb.lproj; sourceTree = ""; }; + 266CF3644F1760A681ED8A53A10DB322 /* BTPaymentApplePayProvider.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTPaymentApplePayProvider.h; path = Braintree/Payments/BTPaymentApplePayProvider.h; sourceTree = ""; }; + 272E73B615778A260640FD438FDC8C27 /* BTErrors+BTPayPal.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "BTErrors+BTPayPal.m"; path = "Braintree/PayPal/BTErrors+BTPayPal.m"; sourceTree = ""; }; + 28780614EB7DE7D069114EB18953C5FF /* BTUICoinbaseButton.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTUICoinbaseButton.h; path = "Braintree/UI/Views/Payments Components/BTUICoinbaseButton.h"; sourceTree = ""; }; + 28CF6E6C9FACE4E7F81D2177C76738F9 /* BTCoinbasePaymentMethod.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTCoinbasePaymentMethod.h; path = "Braintree/API/@Public/BTCoinbasePaymentMethod.h"; sourceTree = ""; }; + 2934321B6ACEBA4413BCEB00A6BE0DA7 /* Braintree-Payments-UI.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "Braintree-Payments-UI.h"; path = "Braintree/UI/Braintree-Payments-UI.h"; sourceTree = ""; }; + 2AF975CD57617548EB8CAF807C539719 /* BTDropInContentView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTDropInContentView.m; path = "Braintree/Drop-In/BTDropInContentView.m"; sourceTree = ""; }; + 2D68062F2216FC2C7826ABA03C486BDD /* PayPalFuturePaymentViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PayPalFuturePaymentViewController.h; path = Braintree/PayPal/mSDK/PayPalFuturePaymentViewController.h; sourceTree = ""; }; + 2D76B816E171EA5ECFCFA0479824FE93 /* BTUICoinbaseMonogramCardView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTUICoinbaseMonogramCardView.m; path = "Braintree/UI/Views/Vector Art/BTUICoinbaseMonogramCardView.m"; sourceTree = ""; }; + 2E6C0FA679EA247471ADDEAC839E6AA8 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 2E6CB3CBCB2613479547D5A2E89CFD3D /* BTUIThemedView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTUIThemedView.h; path = "Braintree/UI/Views/Custom Views/BTUIThemedView.h"; sourceTree = ""; }; + 2FC342C88932A914345F1AE99162B3A9 /* BTDropInSelectPaymentMethodViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTDropInSelectPaymentMethodViewController.m; path = "Braintree/Drop-In/BTDropInSelectPaymentMethodViewController.m"; sourceTree = ""; }; + 2FF6F4FE92FEC1EF0B24FE4EE9985B45 /* de.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = de.lproj; path = "Braintree/Drop-In/Localization/de.lproj"; sourceTree = ""; }; + 324DDB86681B65C762C06882B6D1D84E /* BTClientStore.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTClientStore.h; path = Braintree/API/Client/BTClientStore.h; sourceTree = ""; }; + 329C7B359C10DC47768653FA76DA9DDB /* BTMutablePayPalPaymentMethod.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTMutablePayPalPaymentMethod.h; path = Braintree/API/Models/BTMutablePayPalPaymentMethod.h; sourceTree = ""; }; + 37DAFD7538A1B3907DE72CF45D0DBCCB /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 37F26233EB66AF1BEB06FEC2AE28741D /* BTUIJCBVectorArtView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTUIJCBVectorArtView.h; path = "Braintree/UI/Views/Vector Art/BTUIJCBVectorArtView.h"; sourceTree = ""; }; + 3818BD5DAD016542493A4D8A7A9FCFEE /* BTDropInSelectPaymentMethodViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTDropInSelectPaymentMethodViewController.h; path = "Braintree/Drop-In/BTDropInSelectPaymentMethodViewController.h"; sourceTree = ""; }; + 38339BE4A246641306C1C261F490E1E6 /* BTAnalyticsMetadata.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTAnalyticsMetadata.h; path = Braintree/API/Utility/BTAnalyticsMetadata.h; sourceTree = ""; }; + 388BECC735B9D25364849EA98E582665 /* Pods-e-shopUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-e-shopUITests.release.xcconfig"; sourceTree = ""; }; + 38931941A12871EC3C1363DC8FF8BAAD /* BTHTTP.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTHTTP.h; path = Braintree/API/Networking/BTHTTP.h; sourceTree = ""; }; + 39E3F487370716DD29B6FA35F46BEC88 /* BTAPIPinnedCertificates.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTAPIPinnedCertificates.h; path = Braintree/API/Networking/Certificates/BTAPIPinnedCertificates.h; sourceTree = ""; }; + 3BBD5AB1BCE700F6F5D05B202E4F75A4 /* BTURLUtils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTURLUtils.h; path = Braintree/API/Networking/BTURLUtils.h; sourceTree = ""; }; + 3D03732FE41CAB86E3E2FCF4474A7771 /* BTUIPayPalMonogramCardView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTUIPayPalMonogramCardView.m; path = "Braintree/UI/Views/Vector Art/BTUIPayPalMonogramCardView.m"; sourceTree = ""; }; + 3D3C912A0C3A76D257046AE6CE6F0B97 /* en_GB.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = en_GB.lproj; path = "Braintree/Drop-In/Localization/en_GB.lproj"; sourceTree = ""; }; + 3D48F14534A461E2E9FF76C8B8DD4888 /* BTVenmoAppSwitchRequestURL.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTVenmoAppSwitchRequestURL.h; path = Braintree/Venmo/BTVenmoAppSwitchRequestURL.h; sourceTree = ""; }; + 3E4C7FB83CB7290FB9DBA63FD8FEBD82 /* BTApplePayPaymentMethod_Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTApplePayPaymentMethod_Internal.h; path = Braintree/API/Models/BTApplePayPaymentMethod_Internal.h; sourceTree = ""; }; + 3E9241BF24149C9BC653839B8ABDD8F7 /* BTPaymentProviderErrors.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTPaymentProviderErrors.h; path = "Braintree/Payments/@Public/BTPaymentProviderErrors.h"; sourceTree = ""; }; + 3F3888077748753B1CFDB79BE515AE6E /* BTAppSwitchingDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTAppSwitchingDelegate.h; path = "Braintree/API/@Public/BTAppSwitchingDelegate.h"; sourceTree = ""; }; + 401F1D5F7BBE42B7721F0A362382442F /* it.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = it.lproj; path = "Braintree/Drop-In/Localization/it.lproj"; sourceTree = ""; }; + 4481F7249B693A4A3D291377E5FCB768 /* BTUIDinersClubVectorArtView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTUIDinersClubVectorArtView.m; path = "Braintree/UI/Views/Vector Art/BTUIDinersClubVectorArtView.m"; sourceTree = ""; }; + 45833D23B83E1BC5637395DF13A3BE0C /* BTPaymentButton.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTPaymentButton.m; path = "Braintree/Drop-In/BTPaymentButton.m"; sourceTree = ""; }; + 46A707DFC330422413D91ABE98FBBA93 /* fr.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = fr.lproj; path = "Braintree/Drop-In/Localization/fr.lproj"; sourceTree = ""; }; + 46E4FD02D9A21DC83B6C03DDB4965853 /* Pods-e-shop.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-e-shop.debug.xcconfig"; sourceTree = ""; }; + 488D8A86345502CC02EE4B10F45D682A /* BTUICardHint.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTUICardHint.m; path = "Braintree/UI/Views/Payments Components/BTUICardHint.m"; sourceTree = ""; }; + 48A1C02ABA368650D28C1C473EE3EF3C /* Pods_e_shop.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_e_shop.framework; path = "Pods-e-shop.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + 490EA4531DE545600917DC344F674F12 /* SwiftSpinner.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SwiftSpinner.xcconfig; sourceTree = ""; }; + 4A0E2D4A0ACA366F0ED438B0511EB080 /* en_CA.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = en_CA.lproj; path = "Braintree/Drop-In/Localization/en_CA.lproj"; sourceTree = ""; }; + 4A5958E162829C1F2845853FAFF21271 /* BTUICardPostalCodeField.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTUICardPostalCodeField.h; path = "Braintree/UI/Views/Form Fields/BTUICardPostalCodeField.h"; sourceTree = ""; }; + 4A6D7E099F80840093E44F7B6ECCAFE1 /* BTClientCardRequest.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTClientCardRequest.m; path = Braintree/API/Models/BTClientCardRequest.m; sourceTree = ""; }; + 4C4EE17A51CF5CEC71F494A79BFF2EF2 /* BTUIJCBVectorArtView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTUIJCBVectorArtView.m; path = "Braintree/UI/Views/Vector Art/BTUIJCBVectorArtView.m"; sourceTree = ""; }; + 4D452844708367AA4BF25041312750CA /* BTUIAmExVectorArtView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTUIAmExVectorArtView.h; path = "Braintree/UI/Views/Vector Art/BTUIAmExVectorArtView.h"; sourceTree = ""; }; + 4D6A254E59968B8255EAE1D19030744E /* Pods-e-shopUITests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-e-shopUITests-frameworks.sh"; sourceTree = ""; }; + 4EA2FF0C08B5444735AE639C147FDDE6 /* BTThreeDSecureLookupResult.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTThreeDSecureLookupResult.h; path = Braintree/API/Models/BTThreeDSecureLookupResult.h; sourceTree = ""; }; + 4EDF156EE4D0274C4825A3F7C6CDBB90 /* Pods-e-shopUITests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-e-shopUITests-acknowledgements.plist"; sourceTree = ""; }; + 4FC818130C25A7E32674B34981C1CF2E /* BTUICVVFrontVectorArtView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTUICVVFrontVectorArtView.h; path = "Braintree/UI/Views/Vector Art/BTUICVVFrontVectorArtView.h"; sourceTree = ""; }; + 5001697A29FDCA7C353DBBFFBB9B88C6 /* BTDropInErrorState.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTDropInErrorState.m; path = "Braintree/Drop-In/BTDropInErrorState.m"; sourceTree = ""; }; + 50739A4F1DA2CB922A66AC58F3C48B62 /* Pods-e-shopUITests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = "Pods-e-shopUITests.modulemap"; sourceTree = ""; }; + 50A64708B60E8B8714D4769A38C356C0 /* en.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = en.lproj; path = Braintree/UI/Localization/en.lproj; sourceTree = ""; }; + 50B09AD41FD73EB6829C6C051E5DA582 /* BTPayPalAppSwitchHandler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTPayPalAppSwitchHandler.m; path = Braintree/PayPal/BTPayPalAppSwitchHandler.m; sourceTree = ""; }; + 50FB0AA4BE794DB09F45437E2D4B6D39 /* fr_FR.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = fr_FR.lproj; path = Braintree/UI/Localization/fr_FR.lproj; sourceTree = ""; }; + 510CE6410A513B6BFFF8C0F0E4CB93C8 /* BTMutableApplePayPaymentMethod.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTMutableApplePayPaymentMethod.m; path = Braintree/API/Models/BTMutableApplePayPaymentMethod.m; sourceTree = ""; }; + 5404CB6D5E865BA59F3454655C4A11EE /* en_CA.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = en_CA.lproj; path = Braintree/UI/Localization/en_CA.lproj; sourceTree = ""; }; + 546F7E81A9D28C3471BAF3E70FD070CC /* BTDropInErrorState.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTDropInErrorState.h; path = "Braintree/Drop-In/BTDropInErrorState.h"; sourceTree = ""; }; + 55296B2A90B8BA9CE61A7784F72C7A36 /* BTAnalyticsMetadata.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTAnalyticsMetadata.m; path = Braintree/API/Utility/BTAnalyticsMetadata.m; sourceTree = ""; }; + 56BB7A3269887D5EE6BC12C11FD8E664 /* BTHTTPResponse.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTHTTPResponse.m; path = Braintree/API/Networking/BTHTTPResponse.m; sourceTree = ""; }; + 56BFBE219E208BCB2B17DA7D33B7FF8D /* BTUICardExpiryField.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTUICardExpiryField.m; path = "Braintree/UI/Views/Form Fields/BTUICardExpiryField.m"; sourceTree = ""; }; + 5776C7684A9A82717EEEBF7A82F5EE9B /* BTKeychain.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTKeychain.m; path = Braintree/API/Utility/BTKeychain.m; sourceTree = ""; }; + 577BAD514739A215A7ABC33969EECCF8 /* BTUICardExpiryField.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTUICardExpiryField.h; path = "Braintree/UI/Views/Form Fields/BTUICardExpiryField.h"; sourceTree = ""; }; + 588089A8E5B3CB02611C38CC9A220F67 /* BTClient+Testing.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "BTClient+Testing.m"; path = "Braintree/API/Client/BTClient+Testing.m"; sourceTree = ""; }; + 58D4AE93C14A08E6E6EDBAFAC2E49A0E /* BTClient+BTVenmo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "BTClient+BTVenmo.h"; path = "Braintree/Venmo/BTClient+BTVenmo.h"; sourceTree = ""; }; + 594270856579ECA7C38587B869C11103 /* BTUICardType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTUICardType.h; path = Braintree/UI/Models/BTUICardType.h; sourceTree = ""; }; + 59839D5BB7E4F9791FCB5E15667FA62D /* Pods-e-shopTests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-e-shopTests-umbrella.h"; sourceTree = ""; }; + 5A78BEF1089D75FCC370923D325BF50B /* BTMockApplePayPaymentAuthorizationView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTMockApplePayPaymentAuthorizationView.m; path = "Braintree/UI/Views/Apple Pay/BTMockApplePayPaymentAuthorizationView.m"; sourceTree = ""; }; + 5AAB4900836AD65A1892863D8C0CA45B /* SwiftSpinner.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SwiftSpinner.swift; path = SwiftSpinner/SwiftSpinner.swift; sourceTree = ""; }; + 5AFF2A936820938E8C8142C1F2F70AB1 /* Pods-e-shopTests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = "Pods-e-shopTests.modulemap"; sourceTree = ""; }; + 5B4B6A3653A4DE2CF6421EDA25D3A543 /* Braintree.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Braintree.xcconfig; sourceTree = ""; }; + 5BD414275D72D8669FDF826623F56E6C /* BTAppSwitch.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTAppSwitch.h; path = "Braintree/API/App Switch/BTAppSwitch.h"; sourceTree = ""; }; + 5C15B7822472D6710B6595BD6DEBFF4E /* Pods-e-shop-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-e-shop-frameworks.sh"; sourceTree = ""; }; + 5CBB67D9AC81740B4A603338EEC9F6A7 /* fr_FR.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = fr_FR.lproj; path = "Braintree/Drop-In/Localization/fr_FR.lproj"; sourceTree = ""; }; + 5CD135A55C33A2DA8EA129362C445EDB /* BTClientMetadata.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTClientMetadata.m; path = Braintree/API/Client/BTClientMetadata.m; sourceTree = ""; }; + 5CEF4595973ED6613C9610B47C78F04C /* BTApplePayPaymentMethod.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTApplePayPaymentMethod.h; path = "Braintree/API/@Public/BTApplePayPaymentMethod.h"; sourceTree = ""; }; + 5D4C5DB82C67B76F560917B0A876013C /* nl.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = nl.lproj; path = Braintree/UI/Localization/nl.lproj; sourceTree = ""; }; + 5D9D68D7B6CA34D60B16509BB8084743 /* BTClientPaymentMethodValueTransformer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTClientPaymentMethodValueTransformer.m; path = Braintree/API/Client/BTClientPaymentMethodValueTransformer.m; sourceTree = ""; }; + 5E4476C5C32A4F37503EAC3EDBC172AB /* PayPalTouch.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PayPalTouch.h; path = Braintree/PayPal/mSDK/PayPalTouch.h; sourceTree = ""; }; + 5E96E8626E8AAE007B4BF6CEA7D677B3 /* Pods-e-shop-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-e-shop-umbrella.h"; sourceTree = ""; }; + 5F33D1E4FD76F4DB2CCFC55509473316 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 5F86210A64EAB41DBCD768668D9836BD /* BTUIScrollView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTUIScrollView.m; path = "Braintree/UI/Views/Custom Views/BTUIScrollView.m"; sourceTree = ""; }; + 5FCDE9F7794B3AEDB30920A893FAF444 /* BTPayPalPaymentMethod_Mutable.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTPayPalPaymentMethod_Mutable.h; path = Braintree/API/Models/BTPayPalPaymentMethod_Mutable.h; sourceTree = ""; }; + 600C9ADF11A0A743A3FCA0A13484039D /* BTUICoinbaseWordmarkVectorArtView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTUICoinbaseWordmarkVectorArtView.m; path = "Braintree/UI/Views/Vector Art/BTUICoinbaseWordmarkVectorArtView.m"; sourceTree = ""; }; + 60A885AA6480DEB46CD8F548C8495DCB /* BTUIFormField.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTUIFormField.m; path = "Braintree/UI/Views/Custom Views/BTUIFormField.m"; sourceTree = ""; }; + 60C3D0D869C4C0881520EFDB9816EC12 /* BTUIFormField_Protected.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTUIFormField_Protected.h; path = "Braintree/UI/Views/Custom Views/BTUIFormField_Protected.h"; sourceTree = ""; }; + 61029895D3F931847911CF97A9E12D7B /* BTUIDiscoverVectorArtView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTUIDiscoverVectorArtView.m; path = "Braintree/UI/Views/Vector Art/BTUIDiscoverVectorArtView.m"; sourceTree = ""; }; + 622714C087AFE696F4655B126EC33A6E /* Pods-e-shopTests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-e-shopTests-frameworks.sh"; sourceTree = ""; }; + 62AD6757B6CB10F9A2C81E886CC8139F /* BTCoinbase.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTCoinbase.m; path = Braintree/Coinbase/BTCoinbase.m; sourceTree = ""; }; + 62B0BB423C9C2A608B6AEC2BF10D0B6A /* BTPostalAddress.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTPostalAddress.h; path = "Braintree/API/@Public/BTPostalAddress.h"; sourceTree = ""; }; + 63011F41D5833B1C5A9DE71DC0C418AF /* SwiftSpinner-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SwiftSpinner-prefix.pch"; sourceTree = ""; }; + 6394260A02F7F70C36756C55B0009ED3 /* BTKeychain.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTKeychain.h; path = Braintree/API/Utility/BTKeychain.h; sourceTree = ""; }; + 63CCBA680A289348E44695F0F37C90D9 /* BTClientCardTokenizationRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTClientCardTokenizationRequest.h; path = "Braintree/API/@Public/BTClientCardTokenizationRequest.h"; sourceTree = ""; }; + 6523AA06B7329D80F5763688BFA13DEC /* BTPaymentProviderErrors.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTPaymentProviderErrors.m; path = Braintree/Payments/BTPaymentProviderErrors.m; sourceTree = ""; }; + 653EF65C2437BFCE4E38CB83A94316A6 /* BTUIPayPalButton.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTUIPayPalButton.m; path = "Braintree/UI/Views/Payments Components/BTUIPayPalButton.m"; sourceTree = ""; }; + 65F787787D72E2E7077B921CF1DB444B /* BTUILocalizedString.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTUILocalizedString.m; path = Braintree/UI/Localization/BTUILocalizedString.m; sourceTree = ""; }; + 67B3F589263A763A9DEB7EFB58215F4B /* BTMutablePayPalPaymentMethod.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTMutablePayPalPaymentMethod.m; path = Braintree/API/Models/BTMutablePayPalPaymentMethod.m; sourceTree = ""; }; + 68300CC717163E25B0F0AB6087F9CFCC /* PayPalMobile.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PayPalMobile.h; path = Braintree/PayPal/mSDK/PayPalMobile.h; sourceTree = ""; }; + 688FE6D209F39F7A256D0F2A12337999 /* BTOfflineClientBackend.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTOfflineClientBackend.m; path = "Braintree/API/Offline Mode/BTOfflineClientBackend.m"; sourceTree = ""; }; + 68A1FC01AD2ED0E190E0A33D1B2C47FA /* pl.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = pl.lproj; path = Braintree/UI/Localization/pl.lproj; sourceTree = ""; }; + 694A103F30D18E471F70ADD4A35A84C8 /* BTUIMasterCardVectorArtView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTUIMasterCardVectorArtView.m; path = "Braintree/UI/Views/Vector Art/BTUIMasterCardVectorArtView.m"; sourceTree = ""; }; + 6A3C7F88E85C1764B0867C13C19D4FFB /* BTUIMaestroVectorArtView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTUIMaestroVectorArtView.m; path = "Braintree/UI/Views/Vector Art/BTUIMaestroVectorArtView.m"; sourceTree = ""; }; + 6B27628B12E9CE50F9989886608877C5 /* BTUIVectorArtView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTUIVectorArtView.h; path = "Braintree/UI/Views/Custom Views/BTUIVectorArtView.h"; sourceTree = ""; }; + 6C876C4B9A775AF89F019D590FD95E8C /* nb.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = nb.lproj; path = "Braintree/Drop-In/Localization/nb.lproj"; sourceTree = ""; }; + 6C9A938174D6C38984C9124BC7E2DB3D /* BTUICardNumberField.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTUICardNumberField.h; path = "Braintree/UI/Views/Form Fields/BTUICardNumberField.h"; sourceTree = ""; }; + 6DC7DBADACBBC773B6F99C7FB872EB7A /* BTPaymentButton.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTPaymentButton.h; path = "Braintree/Drop-In/BTPaymentButton.h"; sourceTree = ""; }; + 6E72A1A7E5A6580A3E1747FE6966F20D /* SwiftSpinner.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = SwiftSpinner.modulemap; sourceTree = ""; }; + 6F4DF2508F1E5E978DC32BFFD3041847 /* BTClientStore.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTClientStore.m; path = Braintree/API/Client/BTClientStore.m; sourceTree = ""; }; + 70985FCA1C9E59CCB4866246DAC7855B /* BTUIDiscoverVectorArtView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTUIDiscoverVectorArtView.h; path = "Braintree/UI/Views/Vector Art/BTUIDiscoverVectorArtView.h"; sourceTree = ""; }; + 71214C1B37618129CB903F4D905796EB /* BTUIUtil.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTUIUtil.m; path = Braintree/UI/Models/BTUIUtil.m; sourceTree = ""; }; + 714F20D066D22CA3AF71E0A70350A397 /* tr.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = tr.lproj; path = "Braintree/Drop-In/Localization/tr.lproj"; sourceTree = ""; }; + 720FBB83349770228F46E2E15AE03023 /* BTUIViewUtil.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTUIViewUtil.h; path = Braintree/UI/Views/BTUIViewUtil.h; sourceTree = ""; }; + 722318ED38AF5EAA4C340215AD7F61DA /* Pods-e-shop-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-e-shop-acknowledgements.markdown"; sourceTree = ""; }; + 73CF74A7F811FE03E151D926E9944AD6 /* BTUIViewUtil.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTUIViewUtil.m; path = Braintree/UI/Views/BTUIViewUtil.m; sourceTree = ""; }; + 75385C1B03ED0A5780BF3955C1B95119 /* BTPayPalButton.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTPayPalButton.m; path = Braintree/PayPal/BTPayPalButton.m; sourceTree = ""; }; + 75F26B7BB170442F02FE9921F44DF42D /* BTVenmoAppSwitchRequestURL.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTVenmoAppSwitchRequestURL.m; path = Braintree/Venmo/BTVenmoAppSwitchRequestURL.m; sourceTree = ""; }; + 77429DCF8526AAB784F235ECDE320FC2 /* BTVenmoAppSwitchReturnURL.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTVenmoAppSwitchReturnURL.h; path = Braintree/Venmo/BTVenmoAppSwitchReturnURL.h; sourceTree = ""; }; + 775F09A6B9DC2B9AEA9C2FE6D60F5747 /* BTConfiguration.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTConfiguration.m; path = Braintree/API/Client/BTConfiguration.m; sourceTree = ""; }; + 77637EB3CCCB595FA220660128ED543A /* BTOfflineClientBackend.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTOfflineClientBackend.h; path = "Braintree/API/Offline Mode/BTOfflineClientBackend.h"; sourceTree = ""; }; + 7799743193946F7CE4DD2E5CE5F89B62 /* da.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = da.lproj; path = Braintree/UI/Localization/da.lproj; sourceTree = ""; }; + 784CE60F68D6EC7D1A6C4B6F8652162F /* BTUIHorizontalButtonStackSeparatorLineView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTUIHorizontalButtonStackSeparatorLineView.h; path = "Braintree/UI/Views/Collection Views/BTUIHorizontalButtonStackSeparatorLineView.h"; sourceTree = ""; }; + 79322495BDDD1678ACBA8143E3368A9A /* Braintree.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Braintree.framework; path = Braintree.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 79A1C156097E1AF87DA1E3E907139E49 /* UIColor+BTUI.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIColor+BTUI.m"; path = "Braintree/UI/Theme/UIColor+BTUI.m"; sourceTree = ""; }; + 7A0A6114376E2FCBE679CFA43BD07803 /* BTMutablePaymentMethod.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTMutablePaymentMethod.h; path = Braintree/API/Models/BTMutablePaymentMethod.h; sourceTree = ""; }; + 7A730547CBDA9A8E42DC8EA5CFD24276 /* es.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = es.lproj; path = Braintree/UI/Localization/es.lproj; sourceTree = ""; }; + 7AD9D2C396ECB47269F3E1D078B6A850 /* ru.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = ru.lproj; path = Braintree/UI/Localization/ru.lproj; sourceTree = ""; }; + 7AF1ED6E74B939727F427787AA2D51AC /* BTVenmoAppSwitchReturnURL.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTVenmoAppSwitchReturnURL.m; path = Braintree/Venmo/BTVenmoAppSwitchReturnURL.m; sourceTree = ""; }; + 7BB80206B0AF9C9413BE3D3E332D8C93 /* BTUICoinbaseMonogramCardView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTUICoinbaseMonogramCardView.h; path = "Braintree/UI/Views/Vector Art/BTUICoinbaseMonogramCardView.h"; sourceTree = ""; }; + 7C50B491A41B80AC46B684160F84B99D /* BTPayPalHorizontalSignatureWhiteView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTPayPalHorizontalSignatureWhiteView.m; path = Braintree/PayPal/Views/BTPayPalHorizontalSignatureWhiteView.m; sourceTree = ""; }; + 7C71F7ACE14F1DDAA838EA8B19056F05 /* BTUIVenmoWordmarkVectorArtView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTUIVenmoWordmarkVectorArtView.h; path = "Braintree/UI/Views/Vector Art/BTUIVenmoWordmarkVectorArtView.h"; sourceTree = ""; }; + 7DA807C0D8BEC5D8630D22D3DD470EF0 /* BTUICVVFrontVectorArtView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTUICVVFrontVectorArtView.m; path = "Braintree/UI/Views/Vector Art/BTUICVVFrontVectorArtView.m"; sourceTree = ""; }; + 7DCF3C69ED019540C45D3D14EF10D7C5 /* BTCoinbase.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTCoinbase.h; path = "Braintree/Coinbase/@Public/BTCoinbase.h"; sourceTree = ""; }; + 7F290ED3B8BD1FAFC27B7000A204C2A6 /* BTUIScrollView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTUIScrollView.h; path = "Braintree/UI/Views/Custom Views/BTUIScrollView.h"; sourceTree = ""; }; + 7F60B0A270601DD3CFC6AD5AB821EFEC /* Braintree-Payments.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "Braintree-Payments.h"; path = "Braintree/Payments/@Public/Braintree-Payments.h"; sourceTree = ""; }; + 7F9EE9C0A5705AC33E76B38F7130B6F1 /* BTClientTokenApplePayPaymentNetworksValueTransformer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTClientTokenApplePayPaymentNetworksValueTransformer.m; path = Braintree/API/Client/BTClientTokenApplePayPaymentNetworksValueTransformer.m; sourceTree = ""; }; + 7FC4513465404253B2DE1D3F2FF98124 /* BTUIVisaVectorArtView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTUIVisaVectorArtView.h; path = "Braintree/UI/Views/Vector Art/BTUIVisaVectorArtView.h"; sourceTree = ""; }; + 80B489031BD0D111868318889F96C03F /* BTUIPaymentButtonCollectionViewCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTUIPaymentButtonCollectionViewCell.h; path = "Braintree/UI/Views/Collection Views/BTUIPaymentButtonCollectionViewCell.h"; sourceTree = ""; }; + 80D649CA236C3245685E5EDDD17EDFB2 /* BTUIAmExVectorArtView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTUIAmExVectorArtView.m; path = "Braintree/UI/Views/Vector Art/BTUIAmExVectorArtView.m"; sourceTree = ""; }; + 81193EB1BBC61FC01DA61A2123184012 /* BTUIVenmoButton.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTUIVenmoButton.m; path = "Braintree/UI/Views/Payments Components/BTUIVenmoButton.m"; sourceTree = ""; }; + 819053F6192524A32EF90C7EC510DEEA /* BTClient+Offline.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "BTClient+Offline.m"; path = "Braintree/API/Client/BTClient+Offline.m"; sourceTree = ""; }; + 82602B693A3179FD535B134B5ABA7CAB /* Braintree.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Braintree.h; path = Braintree/Braintree.h; sourceTree = ""; }; + 82DD1B6EEBE1353D0F0B1E2B03B41AF2 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/CoreMedia.framework; sourceTree = DEVELOPER_DIR; }; + 832DE7B4D5DEBFA5CC8F496CC06582A6 /* BTThreeDSecureLookupResult.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTThreeDSecureLookupResult.m; path = Braintree/API/Models/BTThreeDSecureLookupResult.m; sourceTree = ""; }; + 840EC85EAFF70975F482AE31322728C2 /* Pods-e-shop.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-e-shop.release.xcconfig"; sourceTree = ""; }; + 84229BCEDC65E86549AD82200811BB6C /* BTAPIResponseParser.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTAPIResponseParser.m; path = Braintree/API/Client/BTAPIResponseParser.m; sourceTree = ""; }; + 85400FE5327281FF119C83A4D782CF4A /* BTErrors.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTErrors.m; path = Braintree/API/Utility/BTErrors.m; sourceTree = ""; }; + 85423B9058CC53C505631E22B8147991 /* BTUILocalizedString.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTUILocalizedString.h; path = Braintree/UI/Localization/BTUILocalizedString.h; sourceTree = ""; }; + 8597562CF06A51DDD65FDFAFB804F004 /* BTPayPalHorizontalSignatureWhiteView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTPayPalHorizontalSignatureWhiteView.h; path = Braintree/PayPal/Views/BTPayPalHorizontalSignatureWhiteView.h; sourceTree = ""; }; + 86343D1F7AD70E3CCE07435CD5EFA091 /* BTCoinbasePaymentMethod.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTCoinbasePaymentMethod.m; path = Braintree/API/Models/BTCoinbasePaymentMethod.m; sourceTree = ""; }; + 88494260CEDE63A821B3C2CCC634B20B /* BTVenmoAppSwitchHandler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTVenmoAppSwitchHandler.h; path = Braintree/Venmo/BTVenmoAppSwitchHandler.h; sourceTree = ""; }; + 88F844B1049EA76C84663E937172CA57 /* nl.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = nl.lproj; path = "Braintree/Drop-In/Localization/nl.lproj"; sourceTree = ""; }; + 8ABDA8C06787D322B5084616451C6936 /* fr_CA.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = fr_CA.lproj; path = Braintree/UI/Localization/fr_CA.lproj; sourceTree = ""; }; + 8E14FBA54202A7F4153D802DA448CE8C /* BTClientCardTokenizationRequest.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTClientCardTokenizationRequest.m; path = Braintree/API/Models/BTClientCardTokenizationRequest.m; sourceTree = ""; }; + 90FF84C5A7A3C3E4578B4A6949C6D2EF /* BTPayPalViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTPayPalViewController.m; path = Braintree/PayPal/BTPayPalViewController.m; sourceTree = ""; }; + 92544AE6012DB19BF917FB3E17284666 /* Braintree-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Braintree-prefix.pch"; sourceTree = ""; }; + 939504379DEC44E80052E319CFC42A8C /* Pods-e-shopUITests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-e-shopUITests-umbrella.h"; sourceTree = ""; }; + 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 93E6C4D2142EEBC4D26A038B04BCC48C /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 93EBAF18FE8D49AB0EEBE7F0CAA62A16 /* BTUIFloatLabel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTUIFloatLabel.h; path = "Braintree/UI/Views/Custom Views/BTUIFloatLabel.h"; sourceTree = ""; }; + 9543199E600B193849BF206E36D1A34D /* BTPaymentMethod_Mutable.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTPaymentMethod_Mutable.h; path = Braintree/API/Models/BTPaymentMethod_Mutable.h; sourceTree = ""; }; + 956841DDBCE82016D9066E0F991B0EB5 /* en_AU.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = en_AU.lproj; path = Braintree/UI/Localization/en_AU.lproj; sourceTree = ""; }; + 95D6D49CDB41434D467C0D3DAAE387E9 /* BTUICardCvvField.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTUICardCvvField.m; path = "Braintree/UI/Views/Form Fields/BTUICardCvvField.m"; sourceTree = ""; }; + 9685C71CFBA0D13147F47D2A49FEF131 /* BTErrors+BTPayPal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "BTErrors+BTPayPal.h"; path = "Braintree/PayPal/@Public/BTErrors+BTPayPal.h"; sourceTree = ""; }; + 979D23B77BE016F44E0D3EEB7552BCF6 /* BTClientToken.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTClientToken.h; path = "Braintree/API/@Public/BTClientToken.h"; sourceTree = ""; }; + 98039649B9D8AC5797338D4DE532B90B /* BTUICoinbaseWordmarkVectorArtView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTUICoinbaseWordmarkVectorArtView.h; path = "Braintree/UI/Views/Vector Art/BTUICoinbaseWordmarkVectorArtView.h"; sourceTree = ""; }; + 98043705638654CC26FB15592F5F8EE4 /* BTClient+BTVenmo.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "BTClient+BTVenmo.m"; path = "Braintree/Venmo/BTClient+BTVenmo.m"; sourceTree = ""; }; + 988CA6375666F26C9A42230E6D45E6E4 /* BTClientTokenBooleanValueTransformer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTClientTokenBooleanValueTransformer.h; path = Braintree/API/Client/BTClientTokenBooleanValueTransformer.h; sourceTree = ""; }; + 99A2993695AB373FA5F755C068F9C2AD /* BTApplePayPaymentMethod.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTApplePayPaymentMethod.m; path = Braintree/API/Models/BTApplePayPaymentMethod.m; sourceTree = ""; }; + 9A03E4FEEE63A93CD2ECA7C1A400345D /* BTUIVectorArtView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTUIVectorArtView.m; path = "Braintree/UI/Views/Custom Views/BTUIVectorArtView.m"; sourceTree = ""; }; + 9A3C1BB7E7CBF60E7F64E810B13C5301 /* BTUICardVectorArtView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTUICardVectorArtView.h; path = "Braintree/UI/Views/Vector Art/BTUICardVectorArtView.h"; sourceTree = ""; }; + 9B1300E38A06658936C39F2D5BFC90DA /* he.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = he.lproj; path = "Braintree/Drop-In/Localization/he.lproj"; sourceTree = ""; }; + 9B3381A9BABE613864B2BF4B1B2B94C5 /* BTUITextField.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTUITextField.h; path = "Braintree/UI/Views/Custom Views/BTUITextField.h"; sourceTree = ""; }; + 9B98C94559C9215A815E2C9233766930 /* Pods_e_shopUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_e_shopUITests.framework; path = "Pods-e-shopUITests.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + 9BA7C40835000B356B6654BD1C05A12F /* BTUICTAControl.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTUICTAControl.m; path = "Braintree/UI/Views/Payments Components/BTUICTAControl.m"; sourceTree = ""; }; + 9C044B5E30C3AE3D5F74022C87A3AA01 /* BTPaymentMethod.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTPaymentMethod.h; path = "Braintree/API/@Public/BTPaymentMethod.h"; sourceTree = ""; }; + 9C73C62B2ECB0CE0CECCC01E74E47A1E /* BTPaymentApplePayProvider_Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTPaymentApplePayProvider_Internal.h; path = Braintree/Payments/BTPaymentApplePayProvider_Internal.h; sourceTree = ""; }; + 9CCBD56BC88FCF4F70833F459D431DF1 /* SwiftSpinner-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SwiftSpinner-umbrella.h"; sourceTree = ""; }; + 9CE6233E17E02B84FFA70B5D796EE1B0 /* SwiftSpinner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SwiftSpinner.framework; path = SwiftSpinner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 9CE6DEAA87580380AA134D62C62D87EF /* BTUIPaymentMethodView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTUIPaymentMethodView.m; path = "Braintree/UI/Views/Payments Components/BTUIPaymentMethodView.m"; sourceTree = ""; }; + 9F3A5B9B673C12EE866AE0C244F2D991 /* es_ES.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = es_ES.lproj; path = Braintree/UI/Localization/es_ES.lproj; sourceTree = ""; }; + A048C7BFDD6316EB3FE744AE90701508 /* Pods-e-shopUITests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-e-shopUITests-resources.sh"; sourceTree = ""; }; + A089368B5410E2C3A8A298903F6220A5 /* BTMutablePaymentMethod.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTMutablePaymentMethod.m; path = Braintree/API/Models/BTMutablePaymentMethod.m; sourceTree = ""; }; + A0CA53D5DD63BF0F7AD430CAA9BFF36C /* BTUICardHint.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTUICardHint.h; path = "Braintree/UI/Views/Payments Components/BTUICardHint.h"; sourceTree = ""; }; + A10093E5A41EEAEEA097F52B0BBBDCA7 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; + A197B3CECA30AEA5DA8364242F5DDC02 /* BTDropInErrorAlert.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTDropInErrorAlert.h; path = "Braintree/Drop-In/BTDropInErrorAlert.h"; sourceTree = ""; }; + A22B43DBCB0A18EFD9B8C099421B41CC /* Braintree_Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Braintree_Internal.h; path = Braintree/Braintree_Internal.h; sourceTree = ""; }; + A3AFC1B73339D9ADE9E90863068E91EA /* BTURLUtils.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTURLUtils.m; path = Braintree/API/Networking/BTURLUtils.m; sourceTree = ""; }; + A6575B29A37D967CEE189167D3C457A7 /* BTUIHorizontalButtonStackCollectionViewFlowLayout.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTUIHorizontalButtonStackCollectionViewFlowLayout.m; path = "Braintree/UI/Views/Collection Views/BTUIHorizontalButtonStackCollectionViewFlowLayout.m"; sourceTree = ""; }; + A677CDC0EA5C6A0A3CD01237AF72E718 /* BTUIUtil.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTUIUtil.h; path = Braintree/UI/Models/BTUIUtil.h; sourceTree = ""; }; + A76FC5DFFDF753013EFCF8D6BC99276F /* BTOfflineModeURLProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTOfflineModeURLProtocol.h; path = "Braintree/API/Offline Mode/BTOfflineModeURLProtocol.h"; sourceTree = ""; }; + A77E9D0565540646549A928543B0683F /* Braintree.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = Braintree.m; path = Braintree/Braintree.m; sourceTree = ""; }; + A824FDE36FB7B6E37BC93EF415BF5653 /* BTClientToken.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTClientToken.m; path = Braintree/API/Client/BTClientToken.m; sourceTree = ""; }; + A96C65B99B475FB331C34043F3BD68D4 /* SwiftSpinner.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SwiftSpinner.h; path = SwiftSpinner/SwiftSpinner.h; sourceTree = ""; }; + AAA6A4289AC766442F994D8C7545BA94 /* BTUIVenmoWordmarkVectorArtView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTUIVenmoWordmarkVectorArtView.m; path = "Braintree/UI/Views/Vector Art/BTUIVenmoWordmarkVectorArtView.m"; sourceTree = ""; }; + ACC621E7611D04F6A93ECF9774B43EF8 /* BTAppSwitchErrors.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTAppSwitchErrors.h; path = "Braintree/API/@Public/BTAppSwitchErrors.h"; sourceTree = ""; }; + ACD534ACF774326E0F7220A607FE4738 /* Pods-e-shopTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-e-shopTests.release.xcconfig"; sourceTree = ""; }; + AD3932CD20EE7F354476511FD8FB7998 /* BTUIPaymentButtonCollectionViewCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTUIPaymentButtonCollectionViewCell.m; path = "Braintree/UI/Views/Collection Views/BTUIPaymentButtonCollectionViewCell.m"; sourceTree = ""; }; + AD7A112BD36337152384E6A68B51076C /* BTUICVVBackVectorArtView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTUICVVBackVectorArtView.h; path = "Braintree/UI/Views/Vector Art/BTUICVVBackVectorArtView.h"; sourceTree = ""; }; + ADB887C884655DE01B5FDCC5171D8742 /* BTClient.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTClient.h; path = "Braintree/API/@Public/BTClient.h"; sourceTree = ""; }; + AE7DFABF6FADBCF5FFE59CABE6952CBC /* Braintree-UI-Localization.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "Braintree-UI-Localization.bundle"; path = "Braintree-UI-Localization.bundle"; sourceTree = BUILT_PRODUCTS_DIR; }; + AEDF19FC5F1AC56653F9035CA6DC59FB /* Pods-e-shop-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-e-shop-resources.sh"; sourceTree = ""; }; + B00A1C86D45FE95FC5D86A95DE13B3D2 /* BTCardPaymentMethod.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTCardPaymentMethod.m; path = Braintree/API/Models/BTCardPaymentMethod.m; sourceTree = ""; }; + B1AB57A8E3CDD4C876A2E77336B7C001 /* es.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = es.lproj; path = "Braintree/Drop-In/Localization/es.lproj"; sourceTree = ""; }; + B490350F03D817F809E81AB5A45DEE45 /* BTErrors.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTErrors.h; path = "Braintree/API/@Public/BTErrors.h"; sourceTree = ""; }; + B4BB3E39DF2D084B2FE1AF985AF66A3A /* pt.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = pt.lproj; path = Braintree/UI/Localization/pt.lproj; sourceTree = ""; }; + B5331627F4B869AB13FD99EA7EC32607 /* BTCoinbasePaymentMethod_Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTCoinbasePaymentMethod_Internal.h; path = Braintree/API/Models/BTCoinbasePaymentMethod_Internal.h; sourceTree = ""; }; + B54F2A5604BC653624FC45B5385132EF /* BTHTTP.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTHTTP.m; path = Braintree/API/Networking/BTHTTP.m; sourceTree = ""; }; + B571FC95A338FF23B17F310C9D361CAA /* BTUICardType.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTUICardType.m; path = Braintree/UI/Models/BTUICardType.m; sourceTree = ""; }; + B582ACCD853C62DFAA23EB29E2942E91 /* BTUIPayPalButton.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTUIPayPalButton.h; path = "Braintree/UI/Views/Payments Components/BTUIPayPalButton.h"; sourceTree = ""; }; + B7495CA1FCAEEB002802D635E24A4329 /* BTDropInLocalizedString.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTDropInLocalizedString.h; path = "Braintree/Drop-In/Localization/BTDropInLocalizedString.h"; sourceTree = ""; }; + B7B6F2BAE251CE03A1F9402EA267DFC2 /* BTDropInViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTDropInViewController.m; path = "Braintree/Drop-In/BTDropInViewController.m"; sourceTree = ""; }; + B8A7F1ECBFF1BAFC3F06993ACE5DFEC9 /* BTDropInViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTDropInViewController.h; path = "Braintree/Drop-In/BTDropInViewController.h"; sourceTree = ""; }; + B9B0F25F6E9A76BCAB8CD3EF3D7D081D /* BTClient+Testing.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "BTClient+Testing.h"; path = "Braintree/API/@Public/BTClient+Testing.h"; sourceTree = ""; }; + B9D49F9BB9851BD128ACB53CE36503B0 /* BTClientMetadata.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTClientMetadata.h; path = Braintree/API/Client/BTClientMetadata.h; sourceTree = ""; }; + BA0CE2DAD4DFA8346D116A2EE71D3637 /* BTUICardPostalCodeField.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTUICardPostalCodeField.m; path = "Braintree/UI/Views/Form Fields/BTUICardPostalCodeField.m"; sourceTree = ""; }; + BABA5736281031AB62A71A3E32C059F7 /* BTUIVisaVectorArtView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTUIVisaVectorArtView.m; path = "Braintree/UI/Views/Vector Art/BTUIVisaVectorArtView.m"; sourceTree = ""; }; + BBC95A3F395AB0BB5BD092E8D3B9B422 /* BTCoinbaseOAuth.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTCoinbaseOAuth.m; path = Braintree/Coinbase/Vendor/BTCoinbaseOAuth.m; sourceTree = ""; }; + BC02B5732729F561557DA9D4BD777945 /* BTUI.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTUI.m; path = Braintree/UI/Theme/BTUI.m; sourceTree = ""; }; + BD3263E8248FEB304BFDF33A920C5439 /* PayPalConfiguration.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PayPalConfiguration.h; path = Braintree/PayPal/mSDK/PayPalConfiguration.h; sourceTree = ""; }; + BE1B38C04D469D2ADDF12AA9341B3860 /* BTDropInUtil.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTDropInUtil.m; path = "Braintree/Drop-In/BTDropInUtil.m"; sourceTree = ""; }; + BE9F23152548348322AF3D1620883345 /* BTClient+Offline.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "BTClient+Offline.h"; path = "Braintree/API/@Public/BTClient+Offline.h"; sourceTree = ""; }; + BF15EE451A59879C62649818CB96D4B8 /* BTHTTPResponse.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTHTTPResponse.h; path = Braintree/API/Networking/BTHTTPResponse.h; sourceTree = ""; }; + BF70395B9B5FFB6DE32DF90297887FA2 /* BTUICardFormView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTUICardFormView.m; path = Braintree/UI/Views/Forms/BTUICardFormView.m; sourceTree = ""; }; + BFEE3C0C4D89BD01CC7B467E89F49AED /* ru.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = ru.lproj; path = "Braintree/Drop-In/Localization/ru.lproj"; sourceTree = ""; }; + C00B82E35FFE19E69BF5B770CE2039BE /* pt.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = pt.lproj; path = "Braintree/Drop-In/Localization/pt.lproj"; sourceTree = ""; }; + C0B7EBED640216CB3F4EDA6671F9930C /* BTUICardVectorArtView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTUICardVectorArtView.m; path = "Braintree/UI/Views/Vector Art/BTUICardVectorArtView.m"; sourceTree = ""; }; + C0BFFED27052394953FB3D0A30E95D3F /* BTUICardExpirationValidator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTUICardExpirationValidator.m; path = Braintree/UI/Models/BTUICardExpirationValidator.m; sourceTree = ""; }; + C16B4967E831370ECDF6DD487BA26AFD /* BTUICVVBackVectorArtView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTUICVVBackVectorArtView.m; path = "Braintree/UI/Views/Vector Art/BTUICVVBackVectorArtView.m"; sourceTree = ""; }; + C1B93F668D0CE0CBEE23A6A5B24E85B0 /* zh-Hans.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "zh-Hans.lproj"; path = "Braintree/Drop-In/Localization/zh-Hans.lproj"; sourceTree = ""; }; + C57EE3A7CA81BD870AD8A66CD4B7F8A2 /* BTConfiguration.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTConfiguration.h; path = Braintree/API/Client/BTConfiguration.h; sourceTree = ""; }; + C9241063783B2A4F06F9DE3D2D00658B /* BTPayPalViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTPayPalViewController.h; path = "Braintree/PayPal/@Public/BTPayPalViewController.h"; sourceTree = ""; }; + CA399B8A2A00ED43A7F736003AA65D4A /* PayPalProfileSharingViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PayPalProfileSharingViewController.h; path = Braintree/PayPal/mSDK/PayPalProfileSharingViewController.h; sourceTree = ""; }; + CA66D8CBCC939CDCD1F3040E18DE8B2C /* BTUICardCvvField.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTUICardCvvField.h; path = "Braintree/UI/Views/Form Fields/BTUICardCvvField.h"; sourceTree = ""; }; + CAAECE01529235276AB1638EF733196C /* BTClientPaymentMethodValueTransformer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTClientPaymentMethodValueTransformer.h; path = Braintree/API/Client/BTClientPaymentMethodValueTransformer.h; sourceTree = ""; }; + CB8FE086E8F31429BC1F0DEDD9A5DBD8 /* da.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = da.lproj; path = "Braintree/Drop-In/Localization/da.lproj"; sourceTree = ""; }; + CC7EA5A3803D08028AAFFCF6CFB02859 /* BTPayPalButton.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTPayPalButton.h; path = "Braintree/PayPal/@Public/BTPayPalButton.h"; sourceTree = ""; }; + CC9C64948CEC6CCA8C1ACA1FE8D41B2D /* BTUIHorizontalButtonStackCollectionViewFlowLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTUIHorizontalButtonStackCollectionViewFlowLayout.h; path = "Braintree/UI/Views/Collection Views/BTUIHorizontalButtonStackCollectionViewFlowLayout.h"; sourceTree = ""; }; + CCD735CE9A359DA7EC3902A5A000AE6E /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/SystemConfiguration.framework; sourceTree = DEVELOPER_DIR; }; + CE930A04E0EEFFD21ED098CAEB205B33 /* Pods-e-shop-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-e-shop-acknowledgements.plist"; sourceTree = ""; }; + CFDB88C42A99A599C063053E474E533B /* BTLogger.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTLogger.h; path = "Braintree/API/@Public/BTLogger.h"; sourceTree = ""; }; + D05209FFEB64AA107E1887F513E3FD83 /* BTLogger.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTLogger.m; path = Braintree/API/Utility/BTLogger.m; sourceTree = ""; }; + D1766E2FA8DE5FB43E70FBFDEFE37243 /* BTUIPayPalMonogramCardView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTUIPayPalMonogramCardView.h; path = "Braintree/UI/Views/Vector Art/BTUIPayPalMonogramCardView.h"; sourceTree = ""; }; + D325902D803D782B5B8A5C45D7F4187F /* BTClientTokenApplePayStatusValueTransformer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTClientTokenApplePayStatusValueTransformer.m; path = Braintree/API/Client/BTClientTokenApplePayStatusValueTransformer.m; sourceTree = ""; }; + D34D5E9E0B8DE5874864A5DEA5B34237 /* libPayPalMobile-BT.a */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = archive.ar; name = "libPayPalMobile-BT.a"; path = "Braintree/PayPal/mSDK/libPayPalMobile-BT.a"; sourceTree = ""; }; + D514B7D36023356484EDBD7EC25AEB2D /* BTUICardFormView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTUICardFormView.h; path = Braintree/UI/Views/Forms/BTUICardFormView.h; sourceTree = ""; }; + D55C501E3CDF57AFBBBB23C99C9FBA22 /* BTPayPalViewController_Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTPayPalViewController_Internal.h; path = Braintree/PayPal/BTPayPalViewController_Internal.h; sourceTree = ""; }; + D9416AB33B5BCFF233E535E92430B61E /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/AVFoundation.framework; sourceTree = DEVELOPER_DIR; }; + DA007ADB023A2431F55D2312CB52C32F /* BTUIMasterCardVectorArtView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTUIMasterCardVectorArtView.h; path = "Braintree/UI/Views/Vector Art/BTUIMasterCardVectorArtView.h"; sourceTree = ""; }; + DB48DC12CBE117C8ED6A220CB3E529D6 /* pl.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = pl.lproj; path = "Braintree/Drop-In/Localization/pl.lproj"; sourceTree = ""; }; + DB8CA49FF18003C4F1AC98CAD3D47EDC /* sv.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = sv.lproj; path = Braintree/UI/Localization/sv.lproj; sourceTree = ""; }; + DBBE990A0E887DE563DD89D9E6AD33AD /* BTDropInContentView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTDropInContentView.h; path = "Braintree/Drop-In/BTDropInContentView.h"; sourceTree = ""; }; + DC4B34EC7CD169478D3EA0AFE5560242 /* AddressBook.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBook.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/AddressBook.framework; sourceTree = DEVELOPER_DIR; }; + DCA3EB6ACCDF017065BE82C0CD77274D /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + DD938CFF98BF1E75D59D5819D578CB58 /* BTAPIPinnedCertificates.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTAPIPinnedCertificates.m; path = Braintree/API/Networking/Certificates/BTAPIPinnedCertificates.m; sourceTree = ""; }; + DDA27200595CF304AFDE92EF1CAF6583 /* BTLogger_Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTLogger_Internal.h; path = Braintree/API/Utility/BTLogger_Internal.h; sourceTree = ""; }; + DEDA6C813BA0A4A4B5553BE6A7D8204F /* BTUICardNumberField.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTUICardNumberField.m; path = "Braintree/UI/Views/Form Fields/BTUICardNumberField.m"; sourceTree = ""; }; + DEF6B666D5D948D1A4559074848CE494 /* BTPaymentProvider.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTPaymentProvider.h; path = "Braintree/Payments/@Public/BTPaymentProvider.h"; sourceTree = ""; }; + DF777EC545F15D6B1624FA3FF08253F9 /* BTUICardExpirationValidator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTUICardExpirationValidator.h; path = Braintree/UI/Models/BTUICardExpirationValidator.h; sourceTree = ""; }; + E0C8DD2DF21D62EE888D2C733E8DE642 /* BTUIVenmoButton.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTUIVenmoButton.h; path = "Braintree/UI/Views/Payments Components/BTUIVenmoButton.h"; sourceTree = ""; }; + E164768FA28AA99365AB933D18682C35 /* BTPayPalAppSwitchHandler_Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTPayPalAppSwitchHandler_Internal.h; path = Braintree/PayPal/BTPayPalAppSwitchHandler_Internal.h; sourceTree = ""; }; + E30FECFD9A464CB0A16FB6482C06FA57 /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/CoreLocation.framework; sourceTree = DEVELOPER_DIR; }; + E34A50FCF7072CC5FC1335047A9A393F /* BTClient.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTClient.m; path = Braintree/API/Client/BTClient.m; sourceTree = ""; }; + E35DFD19292443931C3B8A4911074AEC /* BTCoinbaseDefines.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTCoinbaseDefines.m; path = Braintree/Coinbase/Vendor/BTCoinbaseDefines.m; sourceTree = ""; }; + E435D48A4924EA03FB6C535B8FC5E3FC /* BTUISummaryView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTUISummaryView.h; path = "Braintree/UI/Views/Payments Components/BTUISummaryView.h"; sourceTree = ""; }; + E498E8D39CB5D3D1ED6B8B028ACCA1ED /* Pods-e-shopUITests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-e-shopUITests-dummy.m"; sourceTree = ""; }; + E55A634A2AE923AFD1C2AC9508216EE6 /* BTAPIResponseParser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTAPIResponseParser.h; path = Braintree/API/Client/BTAPIResponseParser.h; sourceTree = ""; }; + E570598F11EA7ED168263D87DED8A248 /* Braintree-Coinbase.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "Braintree-Coinbase.h"; path = "Braintree/Coinbase/@Public/Braintree-Coinbase.h"; sourceTree = ""; }; + E5A4416474EB72E5A6B1166676293002 /* BTUICardExpiryFormat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTUICardExpiryFormat.m; path = Braintree/UI/Models/BTUICardExpiryFormat.m; sourceTree = ""; }; + E5BBD6B3E3AFD7B358DC56DD22ED5C4F /* BTPayPalPaymentMethod.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTPayPalPaymentMethod.h; path = "Braintree/API/@Public/BTPayPalPaymentMethod.h"; sourceTree = ""; }; + E73890F7E6FDD399B996CD90C78DA870 /* PayPalPaymentViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PayPalPaymentViewController.h; path = Braintree/PayPal/mSDK/PayPalPaymentViewController.h; sourceTree = ""; }; + E78EDCF9E3DC08796CAB90804BEA45E1 /* Pods-e-shopTests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-e-shopTests-acknowledgements.plist"; sourceTree = ""; }; + E7A96E376CC4DC753049097ACF01F4DD /* Braintree-API.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "Braintree-API.h"; path = "Braintree/API/@Public/Braintree-API.h"; sourceTree = ""; }; + E7C46E1218663FBE61153E8D8564E198 /* BTUICardExpiryFormat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTUICardExpiryFormat.h; path = Braintree/UI/Models/BTUICardExpiryFormat.h; sourceTree = ""; }; + E8C349E139987FAC8BDD38B1864C9356 /* sv.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = sv.lproj; path = "Braintree/Drop-In/Localization/sv.lproj"; sourceTree = ""; }; + E956C3CD5E0CA6C461C51BE2C83D0DD6 /* SwiftSpinner-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SwiftSpinner-dummy.m"; sourceTree = ""; }; + E9A927568F262BFFA45D0597F6C13B17 /* fr.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = fr.lproj; path = Braintree/UI/Localization/fr.lproj; sourceTree = ""; }; + EA7A90C03C66D822583F5216584C046D /* BTUI.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTUI.h; path = Braintree/UI/Theme/BTUI.h; sourceTree = ""; }; + EAE057D3D7D45E4DE75FAEDF2E6239EC /* BTUIPaymentMethodView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTUIPaymentMethodView.h; path = "Braintree/UI/Views/Payments Components/BTUIPaymentMethodView.h"; sourceTree = ""; }; + EB1673F8882EB5606298635536C6864B /* BTPostalAddress.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTPostalAddress.m; path = Braintree/API/Models/BTPostalAddress.m; sourceTree = ""; }; + EC8B00183631D00F1F43318BEB98132D /* BTMutableCardPaymentMethod.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTMutableCardPaymentMethod.m; path = Braintree/API/Models/BTMutableCardPaymentMethod.m; sourceTree = ""; }; + ECE18B767032811839CA8B5FDEA5F45D /* BTClient+BTPayPal.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "BTClient+BTPayPal.m"; path = "Braintree/PayPal/Models/BTClient+BTPayPal.m"; sourceTree = ""; }; + EEB5D21C6D6AEC94C37E49AD0269D0C3 /* BTDropInErrorAlert.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTDropInErrorAlert.m; path = "Braintree/Drop-In/BTDropInErrorAlert.m"; sourceTree = ""; }; + EFF28BCE039436F567FFA5A7FEB4D910 /* UIColor+BTUI.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIColor+BTUI.h"; path = "Braintree/UI/Theme/UIColor+BTUI.h"; sourceTree = ""; }; + F1C8D8C9BA56772C7F16B6F7D9310CB0 /* es_ES.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = es_ES.lproj; path = "Braintree/Drop-In/Localization/es_ES.lproj"; sourceTree = ""; }; + F1D4FEEBECE3C6D3E0A498E89CDA2775 /* BTCardPaymentMethod.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTCardPaymentMethod.h; path = "Braintree/API/@Public/BTCardPaymentMethod.h"; sourceTree = ""; }; + F235EC4573E3BC035067BE9F6946BAB7 /* BTAppSwitching.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTAppSwitching.h; path = "Braintree/API/@Public/BTAppSwitching.h"; sourceTree = ""; }; + F4C8A0661199460635BABB64AF57A197 /* PayPalOAuthScopes.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PayPalOAuthScopes.h; path = Braintree/PayPal/mSDK/PayPalOAuthScopes.h; sourceTree = ""; }; + F5F6F99BC90E0712B27FA75A9866708C /* BTVenmoAppSwitchHandler_Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTVenmoAppSwitchHandler_Internal.h; path = Braintree/Venmo/BTVenmoAppSwitchHandler_Internal.h; sourceTree = ""; }; + F89F82156FC911C202F8D5ADAD77EAA4 /* BTPaymentMethodCreationDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTPaymentMethodCreationDelegate.h; path = "Braintree/Payments/@Public/BTPaymentMethodCreationDelegate.h"; sourceTree = ""; }; + F96048B5D15CDD64A609C90F302D61D9 /* MessageUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MessageUI.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/MessageUI.framework; sourceTree = DEVELOPER_DIR; }; + FADFACB740A2CE3BCF97B82C0F016B23 /* BTDropInUtil.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTDropInUtil.h; path = "Braintree/Drop-In/BTDropInUtil.h"; sourceTree = ""; }; + FAE82116866AB5704265E9661D13387A /* BTAppSwitchErrors.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTAppSwitchErrors.m; path = "Braintree/API/App Switch/BTAppSwitchErrors.m"; sourceTree = ""; }; + FB7925B5379F9FCA4B0DE750B9D2F831 /* Braintree-Version.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "Braintree-Version.h"; path = "Braintree/API/@Public/Braintree-Version.h"; sourceTree = ""; }; + FBBE53C0A036DEFB6380F5F46AA2823B /* BTVenmoAppSwitchHandler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTVenmoAppSwitchHandler.m; path = Braintree/Venmo/BTVenmoAppSwitchHandler.m; sourceTree = ""; }; + FC0B507535E0F11C99F40F093E0E26A4 /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/MobileCoreServices.framework; sourceTree = DEVELOPER_DIR; }; + FC4DB6D24B321D7FAA44BE1ADF7BD0CC /* de.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = de.lproj; path = Braintree/UI/Localization/de.lproj; sourceTree = ""; }; + FCFABB4AF3184938602F532831B1FE45 /* BTUIUnknownCardVectorArtView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTUIUnknownCardVectorArtView.h; path = "Braintree/UI/Views/Vector Art/BTUIUnknownCardVectorArtView.h"; sourceTree = ""; }; + FD4A9EF2EE705D6BB3D182B92AA9F881 /* en.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = en.lproj; path = "Braintree/Drop-In/Localization/en.lproj"; sourceTree = ""; }; + FDFABD53E21583B698FBACD77A41FF99 /* BTClient_Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTClient_Internal.h; path = Braintree/API/Client/BTClient_Internal.h; sourceTree = ""; }; + FE3B5147B5A79D36E832208526B02E2F /* BTUIUnknownCardVectorArtView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BTUIUnknownCardVectorArtView.m; path = "Braintree/UI/Views/Vector Art/BTUIUnknownCardVectorArtView.m"; sourceTree = ""; }; + FFC08737A8DBCF87AFB26B4E27EFAB90 /* BTUIPaymentMethodType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BTUIPaymentMethodType.h; path = Braintree/UI/BTUIPaymentMethodType.h; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 03505C269D09D153C4C9C92BF245787C /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 04AF66993000A4670E5FBD618B8D5468 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + A30B68038EF488B71EC6B5C056E2F88A /* Accelerate.framework in Frameworks */, + 681EEFC23322A1EA52F45F18E84A5D7B /* AddressBook.framework in Frameworks */, + DFED5A9C29E7FE35C9C5F0D7B8519638 /* AudioToolbox.framework in Frameworks */, + 6282FDB409CF0E95F4D051A03BACB6B4 /* AVFoundation.framework in Frameworks */, + 37039D01213F8B631E8EB55BBF6E077E /* CoreLocation.framework in Frameworks */, + AA0D425F5331728AE9F3DF940B127891 /* CoreMedia.framework in Frameworks */, + D8E1B7FA35873BE1A547B39353970C0B /* Foundation.framework in Frameworks */, + 052D1A134823A339DD7DA67F2CCE8458 /* MessageUI.framework in Frameworks */, + C7C231720D2DE26FFEA66C8557C739B1 /* MobileCoreServices.framework in Frameworks */, + C6F76AFD9BDFE79026E4C2BD4062ECEC /* SystemConfiguration.framework in Frameworks */, + 39D6342A2B13825805AE103DAA8F12C8 /* UIKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 10E8677ABC32A1231696DCBB18C19C95 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 8C0FFB167E67DB4F4F675CD1784D91B7 /* Foundation.framework in Frameworks */, + F2CE1BB75F9959467C6238A0EF1E94F2 /* UIKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 84D3D49007D5EAFFA0283EC3FE30A725 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 579DDD3F2D763D7BCC28F44A5422223A /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C4F6B2BD740E5C0DA0248479851098AC /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F0B49D15AF92D3B5C8AB35FBEE7D52DF /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + D932A90E15F7179C673C19FA75297F21 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F52CEDCB62F0B1EBAC59600E56502087 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 460D9D8121753347BAD686364E0D7B22 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 03930FC9F8AE1EBBA1B0A351C9463362 /* Pods */ = { + isa = PBXGroup; + children = ( + CC99E5DF368B54C525F05238C9EE05C8 /* Braintree */, + 9669AC57C17AA3F4DF69716024FE7071 /* SwiftSpinner */, + ); + name = Pods; + sourceTree = ""; + }; + 0DB2D128649786CD78A9D844ADB12F24 /* UI */ = { + isa = PBXGroup; + children = ( + 2934321B6ACEBA4413BCEB00A6BE0DA7 /* Braintree-Payments-UI.h */, + 01FB766884043484E21C6BA24ACB20E5 /* BTMockApplePayPaymentAuthorizationView.h */, + 5A78BEF1089D75FCC370923D325BF50B /* BTMockApplePayPaymentAuthorizationView.m */, + 03EF47CEAF1FF53F7E0EAFEA132E870D /* BTMockApplePayPaymentAuthorizationViewController.h */, + 21773FC5C4C76C2B03E4420F846657FF /* BTMockApplePayPaymentAuthorizationViewController.m */, + EA7A90C03C66D822583F5216584C046D /* BTUI.h */, + BC02B5732729F561557DA9D4BD777945 /* BTUI.m */, + 4D452844708367AA4BF25041312750CA /* BTUIAmExVectorArtView.h */, + 80D649CA236C3245685E5EDDD17EDFB2 /* BTUIAmExVectorArtView.m */, + CA66D8CBCC939CDCD1F3040E18DE8B2C /* BTUICardCvvField.h */, + 95D6D49CDB41434D467C0D3DAAE387E9 /* BTUICardCvvField.m */, + DF777EC545F15D6B1624FA3FF08253F9 /* BTUICardExpirationValidator.h */, + C0BFFED27052394953FB3D0A30E95D3F /* BTUICardExpirationValidator.m */, + 577BAD514739A215A7ABC33969EECCF8 /* BTUICardExpiryField.h */, + 56BFBE219E208BCB2B17DA7D33B7FF8D /* BTUICardExpiryField.m */, + E7C46E1218663FBE61153E8D8564E198 /* BTUICardExpiryFormat.h */, + E5A4416474EB72E5A6B1166676293002 /* BTUICardExpiryFormat.m */, + D514B7D36023356484EDBD7EC25AEB2D /* BTUICardFormView.h */, + BF70395B9B5FFB6DE32DF90297887FA2 /* BTUICardFormView.m */, + A0CA53D5DD63BF0F7AD430CAA9BFF36C /* BTUICardHint.h */, + 488D8A86345502CC02EE4B10F45D682A /* BTUICardHint.m */, + 6C9A938174D6C38984C9124BC7E2DB3D /* BTUICardNumberField.h */, + DEDA6C813BA0A4A4B5553BE6A7D8204F /* BTUICardNumberField.m */, + 4A5958E162829C1F2845853FAFF21271 /* BTUICardPostalCodeField.h */, + BA0CE2DAD4DFA8346D116A2EE71D3637 /* BTUICardPostalCodeField.m */, + 594270856579ECA7C38587B869C11103 /* BTUICardType.h */, + B571FC95A338FF23B17F310C9D361CAA /* BTUICardType.m */, + 9A3C1BB7E7CBF60E7F64E810B13C5301 /* BTUICardVectorArtView.h */, + C0B7EBED640216CB3F4EDA6671F9930C /* BTUICardVectorArtView.m */, + 28780614EB7DE7D069114EB18953C5FF /* BTUICoinbaseButton.h */, + 0FB6287A9B8F3568FA2A3EFB55B0B656 /* BTUICoinbaseButton.m */, + 7BB80206B0AF9C9413BE3D3E332D8C93 /* BTUICoinbaseMonogramCardView.h */, + 2D76B816E171EA5ECFCFA0479824FE93 /* BTUICoinbaseMonogramCardView.m */, + 98039649B9D8AC5797338D4DE532B90B /* BTUICoinbaseWordmarkVectorArtView.h */, + 600C9ADF11A0A743A3FCA0A13484039D /* BTUICoinbaseWordmarkVectorArtView.m */, + 0B87FA025DBA2C2D7B4A5B45991CDE0F /* BTUICTAControl.h */, + 9BA7C40835000B356B6654BD1C05A12F /* BTUICTAControl.m */, + AD7A112BD36337152384E6A68B51076C /* BTUICVVBackVectorArtView.h */, + C16B4967E831370ECDF6DD487BA26AFD /* BTUICVVBackVectorArtView.m */, + 4FC818130C25A7E32674B34981C1CF2E /* BTUICVVFrontVectorArtView.h */, + 7DA807C0D8BEC5D8630D22D3DD470EF0 /* BTUICVVFrontVectorArtView.m */, + 01CAFF76BD30D2C3837E6314DF821568 /* BTUIDinersClubVectorArtView.h */, + 4481F7249B693A4A3D291377E5FCB768 /* BTUIDinersClubVectorArtView.m */, + 70985FCA1C9E59CCB4866246DAC7855B /* BTUIDiscoverVectorArtView.h */, + 61029895D3F931847911CF97A9E12D7B /* BTUIDiscoverVectorArtView.m */, + 93EBAF18FE8D49AB0EEBE7F0CAA62A16 /* BTUIFloatLabel.h */, + 067CDB65089644D30CD950DFF8EDFC04 /* BTUIFloatLabel.m */, + 0BB9259B8D88E6A62A6D191BB74524C5 /* BTUIFormField.h */, + 60A885AA6480DEB46CD8F548C8495DCB /* BTUIFormField.m */, + 60C3D0D869C4C0881520EFDB9816EC12 /* BTUIFormField_Protected.h */, + CC9C64948CEC6CCA8C1ACA1FE8D41B2D /* BTUIHorizontalButtonStackCollectionViewFlowLayout.h */, + A6575B29A37D967CEE189167D3C457A7 /* BTUIHorizontalButtonStackCollectionViewFlowLayout.m */, + 784CE60F68D6EC7D1A6C4B6F8652162F /* BTUIHorizontalButtonStackSeparatorLineView.h */, + 11900D1FFFE4774B5CA381BCFCB2F744 /* BTUIHorizontalButtonStackSeparatorLineView.m */, + 37F26233EB66AF1BEB06FEC2AE28741D /* BTUIJCBVectorArtView.h */, + 4C4EE17A51CF5CEC71F494A79BFF2EF2 /* BTUIJCBVectorArtView.m */, + 85423B9058CC53C505631E22B8147991 /* BTUILocalizedString.h */, + 65F787787D72E2E7077B921CF1DB444B /* BTUILocalizedString.m */, + 175F9B42B7C5445F2CFE949571BBA5A3 /* BTUIMaestroVectorArtView.h */, + 6A3C7F88E85C1764B0867C13C19D4FFB /* BTUIMaestroVectorArtView.m */, + DA007ADB023A2431F55D2312CB52C32F /* BTUIMasterCardVectorArtView.h */, + 694A103F30D18E471F70ADD4A35A84C8 /* BTUIMasterCardVectorArtView.m */, + 80B489031BD0D111868318889F96C03F /* BTUIPaymentButtonCollectionViewCell.h */, + AD3932CD20EE7F354476511FD8FB7998 /* BTUIPaymentButtonCollectionViewCell.m */, + FFC08737A8DBCF87AFB26B4E27EFAB90 /* BTUIPaymentMethodType.h */, + EAE057D3D7D45E4DE75FAEDF2E6239EC /* BTUIPaymentMethodView.h */, + 9CE6DEAA87580380AA134D62C62D87EF /* BTUIPaymentMethodView.m */, + B582ACCD853C62DFAA23EB29E2942E91 /* BTUIPayPalButton.h */, + 653EF65C2437BFCE4E38CB83A94316A6 /* BTUIPayPalButton.m */, + D1766E2FA8DE5FB43E70FBFDEFE37243 /* BTUIPayPalMonogramCardView.h */, + 3D03732FE41CAB86E3E2FCF4474A7771 /* BTUIPayPalMonogramCardView.m */, + 114ADCFD9A777215EBDA6A176AD70872 /* BTUIPayPalWordmarkVectorArtView.h */, + 032F5C4BC554AD71736338EE0BE53DED /* BTUIPayPalWordmarkVectorArtView.m */, + 7F290ED3B8BD1FAFC27B7000A204C2A6 /* BTUIScrollView.h */, + 5F86210A64EAB41DBCD768668D9836BD /* BTUIScrollView.m */, + E435D48A4924EA03FB6C535B8FC5E3FC /* BTUISummaryView.h */, + 19A2914D7A65E3CAAA4FF3A219AFCC70 /* BTUISummaryView.m */, + 9B3381A9BABE613864B2BF4B1B2B94C5 /* BTUITextField.h */, + 25BFDDDCACA702F2D3DA1D64A812DCF1 /* BTUITextField.m */, + 2E6CB3CBCB2613479547D5A2E89CFD3D /* BTUIThemedView.h */, + 19E123B367CEC880A941D83B356DA6A0 /* BTUIThemedView.m */, + FCFABB4AF3184938602F532831B1FE45 /* BTUIUnknownCardVectorArtView.h */, + FE3B5147B5A79D36E832208526B02E2F /* BTUIUnknownCardVectorArtView.m */, + A677CDC0EA5C6A0A3CD01237AF72E718 /* BTUIUtil.h */, + 71214C1B37618129CB903F4D905796EB /* BTUIUtil.m */, + 6B27628B12E9CE50F9989886608877C5 /* BTUIVectorArtView.h */, + 9A03E4FEEE63A93CD2ECA7C1A400345D /* BTUIVectorArtView.m */, + E0C8DD2DF21D62EE888D2C733E8DE642 /* BTUIVenmoButton.h */, + 81193EB1BBC61FC01DA61A2123184012 /* BTUIVenmoButton.m */, + 7C71F7ACE14F1DDAA838EA8B19056F05 /* BTUIVenmoWordmarkVectorArtView.h */, + AAA6A4289AC766442F994D8C7545BA94 /* BTUIVenmoWordmarkVectorArtView.m */, + 720FBB83349770228F46E2E15AE03023 /* BTUIViewUtil.h */, + 73CF74A7F811FE03E151D926E9944AD6 /* BTUIViewUtil.m */, + 7FC4513465404253B2DE1D3F2FF98124 /* BTUIVisaVectorArtView.h */, + BABA5736281031AB62A71A3E32C059F7 /* BTUIVisaVectorArtView.m */, + EFF28BCE039436F567FFA5A7FEB4D910 /* UIColor+BTUI.h */, + 79A1C156097E1AF87DA1E3E907139E49 /* UIColor+BTUI.m */, + 37821A41BEC6B4445166781A02A616DD /* Resources */, + ); + name = UI; + sourceTree = ""; + }; + 0EDB9CE982EEBC46C9DB70D63C13FC09 /* Products */ = { + isa = PBXGroup; + children = ( + 79322495BDDD1678ACBA8143E3368A9A /* Braintree.framework */, + 1AC0A4B9F1806BEA03BAC7410174E0F4 /* Braintree-Drop-In-Localization.bundle */, + AE7DFABF6FADBCF5FFE59CABE6952CBC /* Braintree-UI-Localization.bundle */, + 48A1C02ABA368650D28C1C473EE3EF3C /* Pods_e_shop.framework */, + 1711A2FBC6D611770ABF04EF33B6C77B /* Pods_e_shopTests.framework */, + 9B98C94559C9215A815E2C9233766930 /* Pods_e_shopUITests.framework */, + 9CE6233E17E02B84FFA70B5D796EE1B0 /* SwiftSpinner.framework */, + ); + name = Products; + sourceTree = ""; + }; + 2886503AC3884DA51D31A4071B039075 /* Pods-e-shop */ = { + isa = PBXGroup; + children = ( + 37DAFD7538A1B3907DE72CF45D0DBCCB /* Info.plist */, + 23585019CE9A43FB294C8F2D768AE842 /* Pods-e-shop.modulemap */, + 722318ED38AF5EAA4C340215AD7F61DA /* Pods-e-shop-acknowledgements.markdown */, + CE930A04E0EEFFD21ED098CAEB205B33 /* Pods-e-shop-acknowledgements.plist */, + 1604B7739F25FDC3D4FE2EF3C6EB6549 /* Pods-e-shop-dummy.m */, + 5C15B7822472D6710B6595BD6DEBFF4E /* Pods-e-shop-frameworks.sh */, + AEDF19FC5F1AC56653F9035CA6DC59FB /* Pods-e-shop-resources.sh */, + 5E96E8626E8AAE007B4BF6CEA7D677B3 /* Pods-e-shop-umbrella.h */, + 46E4FD02D9A21DC83B6C03DDB4965853 /* Pods-e-shop.debug.xcconfig */, + 840EC85EAFF70975F482AE31322728C2 /* Pods-e-shop.release.xcconfig */, + ); + name = "Pods-e-shop"; + path = "Target Support Files/Pods-e-shop"; + sourceTree = ""; + }; + 371585E9EF92DE5C59F3AE5331D2E924 /* Venmo */ = { + isa = PBXGroup; + children = ( + 58D4AE93C14A08E6E6EDBAFAC2E49A0E /* BTClient+BTVenmo.h */, + 98043705638654CC26FB15592F5F8EE4 /* BTClient+BTVenmo.m */, + 88494260CEDE63A821B3C2CCC634B20B /* BTVenmoAppSwitchHandler.h */, + FBBE53C0A036DEFB6380F5F46AA2823B /* BTVenmoAppSwitchHandler.m */, + F5F6F99BC90E0712B27FA75A9866708C /* BTVenmoAppSwitchHandler_Internal.h */, + 3D48F14534A461E2E9FF76C8B8DD4888 /* BTVenmoAppSwitchRequestURL.h */, + 75F26B7BB170442F02FE9921F44DF42D /* BTVenmoAppSwitchRequestURL.m */, + 77429DCF8526AAB784F235ECDE320FC2 /* BTVenmoAppSwitchReturnURL.h */, + 7AF1ED6E74B939727F427787AA2D51AC /* BTVenmoAppSwitchReturnURL.m */, + ); + name = Venmo; + sourceTree = ""; + }; + 37821A41BEC6B4445166781A02A616DD /* Resources */ = { + isa = PBXGroup; + children = ( + 7799743193946F7CE4DD2E5CE5F89B62 /* da.lproj */, + FC4DB6D24B321D7FAA44BE1ADF7BD0CC /* de.lproj */, + 50A64708B60E8B8714D4769A38C356C0 /* en.lproj */, + 956841DDBCE82016D9066E0F991B0EB5 /* en_AU.lproj */, + 5404CB6D5E865BA59F3454655C4A11EE /* en_CA.lproj */, + 00E95348D27C4FAE23FB9B9112FB3C2A /* en_GB.lproj */, + 7A730547CBDA9A8E42DC8EA5CFD24276 /* es.lproj */, + 9F3A5B9B673C12EE866AE0C244F2D991 /* es_ES.lproj */, + E9A927568F262BFFA45D0597F6C13B17 /* fr.lproj */, + 8ABDA8C06787D322B5084616451C6936 /* fr_CA.lproj */, + 50FB0AA4BE794DB09F45437E2D4B6D39 /* fr_FR.lproj */, + 1FBD085AA2BA94AEDF8B9C4F123AA10C /* he.lproj */, + 2094F4BA7CE19E837D0E8F4CC3884F1B /* it.lproj */, + 2633231F53A3326ACA0A5781CFE1C860 /* nb.lproj */, + 5D4C5DB82C67B76F560917B0A876013C /* nl.lproj */, + 68A1FC01AD2ED0E190E0A33D1B2C47FA /* pl.lproj */, + B4BB3E39DF2D084B2FE1AF985AF66A3A /* pt.lproj */, + 7AD9D2C396ECB47269F3E1D078B6A850 /* ru.lproj */, + DB8CA49FF18003C4F1AC98CAD3D47EDC /* sv.lproj */, + 043097C8D4BE5AC049DC55C22D749599 /* tr.lproj */, + 066EEADDB26FADD359C2DA65EACA05EC /* zh-Hans.lproj */, + ); + name = Resources; + sourceTree = ""; + }; + 454B54AA09B7C7BC331E71D287CC589C /* Drop-In */ = { + isa = PBXGroup; + children = ( + DBBE990A0E887DE563DD89D9E6AD33AD /* BTDropInContentView.h */, + 2AF975CD57617548EB8CAF807C539719 /* BTDropInContentView.m */, + A197B3CECA30AEA5DA8364242F5DDC02 /* BTDropInErrorAlert.h */, + EEB5D21C6D6AEC94C37E49AD0269D0C3 /* BTDropInErrorAlert.m */, + 546F7E81A9D28C3471BAF3E70FD070CC /* BTDropInErrorState.h */, + 5001697A29FDCA7C353DBBFFBB9B88C6 /* BTDropInErrorState.m */, + B7495CA1FCAEEB002802D635E24A4329 /* BTDropInLocalizedString.h */, + 1F0351A88A244718952AEF13EB926369 /* BTDropInLocalizedString.m */, + 3818BD5DAD016542493A4D8A7A9FCFEE /* BTDropInSelectPaymentMethodViewController.h */, + 2FC342C88932A914345F1AE99162B3A9 /* BTDropInSelectPaymentMethodViewController.m */, + FADFACB740A2CE3BCF97B82C0F016B23 /* BTDropInUtil.h */, + BE1B38C04D469D2ADDF12AA9341B3860 /* BTDropInUtil.m */, + B8A7F1ECBFF1BAFC3F06993ACE5DFEC9 /* BTDropInViewController.h */, + B7B6F2BAE251CE03A1F9402EA267DFC2 /* BTDropInViewController.m */, + 6DC7DBADACBBC773B6F99C7FB872EB7A /* BTPaymentButton.h */, + 45833D23B83E1BC5637395DF13A3BE0C /* BTPaymentButton.m */, + 6E62C2B83256A8690A0C5BCD72F11DB1 /* Resources */, + ); + name = "Drop-In"; + sourceTree = ""; + }; + 592E4ABC53015AFE66FC1B808EEEF8A4 /* iOS */ = { + isa = PBXGroup; + children = ( + 0D55B55B686E4781B2E301AFE6796DCF /* Accelerate.framework */, + DC4B34EC7CD169478D3EA0AFE5560242 /* AddressBook.framework */, + 212C02BC3A0F549AA7007FA335483131 /* AudioToolbox.framework */, + D9416AB33B5BCFF233E535E92430B61E /* AVFoundation.framework */, + E30FECFD9A464CB0A16FB6482C06FA57 /* CoreLocation.framework */, + 82DD1B6EEBE1353D0F0B1E2B03B41AF2 /* CoreMedia.framework */, + DCA3EB6ACCDF017065BE82C0CD77274D /* Foundation.framework */, + F96048B5D15CDD64A609C90F302D61D9 /* MessageUI.framework */, + FC0B507535E0F11C99F40F093E0E26A4 /* MobileCoreServices.framework */, + CCD735CE9A359DA7EC3902A5A000AE6E /* SystemConfiguration.framework */, + A10093E5A41EEAEEA097F52B0BBBDCA7 /* UIKit.framework */, + ); + name = iOS; + sourceTree = ""; + }; + 613CFA67444818369ED997483B981855 /* Frameworks */ = { + isa = PBXGroup; + children = ( + D34D5E9E0B8DE5874864A5DEA5B34237 /* libPayPalMobile-BT.a */, + ); + name = Frameworks; + sourceTree = ""; + }; + 63C7544069C3F087EE250EC08C101FA0 /* Pods-e-shopUITests */ = { + isa = PBXGroup; + children = ( + 0BCD646F95BFFBF375A5569F1F0B20C8 /* Info.plist */, + 50739A4F1DA2CB922A66AC58F3C48B62 /* Pods-e-shopUITests.modulemap */, + 2470D2EA1A7E96AFD62FA39CA16D8194 /* Pods-e-shopUITests-acknowledgements.markdown */, + 4EDF156EE4D0274C4825A3F7C6CDBB90 /* Pods-e-shopUITests-acknowledgements.plist */, + E498E8D39CB5D3D1ED6B8B028ACCA1ED /* Pods-e-shopUITests-dummy.m */, + 4D6A254E59968B8255EAE1D19030744E /* Pods-e-shopUITests-frameworks.sh */, + A048C7BFDD6316EB3FE744AE90701508 /* Pods-e-shopUITests-resources.sh */, + 939504379DEC44E80052E319CFC42A8C /* Pods-e-shopUITests-umbrella.h */, + 14CC8C25872857E2437A3EB145237BC0 /* Pods-e-shopUITests.debug.xcconfig */, + 388BECC735B9D25364849EA98E582665 /* Pods-e-shopUITests.release.xcconfig */, + ); + name = "Pods-e-shopUITests"; + path = "Target Support Files/Pods-e-shopUITests"; + sourceTree = ""; + }; + 647EA055BAB6D567E3E28943FD757EBE /* Support Files */ = { + isa = PBXGroup; + children = ( + 0B417138C097DE0997C0EC21B5A8E848 /* Braintree.modulemap */, + 5B4B6A3653A4DE2CF6421EDA25D3A543 /* Braintree.xcconfig */, + 04931217C691F5E1DD2EDE99C0325C35 /* Braintree-dummy.m */, + 92544AE6012DB19BF917FB3E17284666 /* Braintree-prefix.pch */, + 0FE5360F4AD5267FF4C71E4A7198DA9E /* Braintree-umbrella.h */, + 5F33D1E4FD76F4DB2CCFC55509473316 /* Info.plist */, + 181523FA161A058C87B6A9A7B28DCBEF /* ResourceBundle-Braintree-Drop-In-Localization-Info.plist */, + 0D837DD190669BD78364E00A2E961F7F /* ResourceBundle-Braintree-UI-Localization-Info.plist */, + ); + name = "Support Files"; + path = "../Target Support Files/Braintree"; + sourceTree = ""; + }; + 6E62C2B83256A8690A0C5BCD72F11DB1 /* Resources */ = { + isa = PBXGroup; + children = ( + CB8FE086E8F31429BC1F0DEDD9A5DBD8 /* da.lproj */, + 2FF6F4FE92FEC1EF0B24FE4EE9985B45 /* de.lproj */, + FD4A9EF2EE705D6BB3D182B92AA9F881 /* en.lproj */, + 075D140B788A472C0A778560567C807D /* en_AU.lproj */, + 4A0E2D4A0ACA366F0ED438B0511EB080 /* en_CA.lproj */, + 3D3C912A0C3A76D257046AE6CE6F0B97 /* en_GB.lproj */, + B1AB57A8E3CDD4C876A2E77336B7C001 /* es.lproj */, + F1C8D8C9BA56772C7F16B6F7D9310CB0 /* es_ES.lproj */, + 46A707DFC330422413D91ABE98FBBA93 /* fr.lproj */, + 0AE7B8063870B0DFE124D407F77F705F /* fr_CA.lproj */, + 5CBB67D9AC81740B4A603338EEC9F6A7 /* fr_FR.lproj */, + 9B1300E38A06658936C39F2D5BFC90DA /* he.lproj */, + 401F1D5F7BBE42B7721F0A362382442F /* it.lproj */, + 6C876C4B9A775AF89F019D590FD95E8C /* nb.lproj */, + 88F844B1049EA76C84663E937172CA57 /* nl.lproj */, + DB48DC12CBE117C8ED6A220CB3E529D6 /* pl.lproj */, + C00B82E35FFE19E69BF5B770CE2039BE /* pt.lproj */, + BFEE3C0C4D89BD01CC7B467E89F49AED /* ru.lproj */, + E8C349E139987FAC8BDD38B1864C9356 /* sv.lproj */, + 714F20D066D22CA3AF71E0A70350A397 /* tr.lproj */, + C1B93F668D0CE0CBEE23A6A5B24E85B0 /* zh-Hans.lproj */, + ); + name = Resources; + sourceTree = ""; + }; + 7DB346D0F39D3F0E887471402A8071AB = { + isa = PBXGroup; + children = ( + 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */, + EB57DDB3388FBC701046A1E93218737F /* Frameworks */, + 03930FC9F8AE1EBBA1B0A351C9463362 /* Pods */, + 0EDB9CE982EEBC46C9DB70D63C13FC09 /* Products */, + F82B3B07A66F0A9B9C0D8D4EBC71C21C /* Targets Support Files */, + ); + sourceTree = ""; + }; + 83E16529AE244B5D4777BA184249AEB9 /* API */ = { + isa = PBXGroup; + children = ( + E7A96E376CC4DC753049097ACF01F4DD /* Braintree-API.h */, + FB7925B5379F9FCA4B0DE750B9D2F831 /* Braintree-Version.h */, + 38339BE4A246641306C1C261F490E1E6 /* BTAnalyticsMetadata.h */, + 55296B2A90B8BA9CE61A7784F72C7A36 /* BTAnalyticsMetadata.m */, + 39E3F487370716DD29B6FA35F46BEC88 /* BTAPIPinnedCertificates.h */, + DD938CFF98BF1E75D59D5819D578CB58 /* BTAPIPinnedCertificates.m */, + E55A634A2AE923AFD1C2AC9508216EE6 /* BTAPIResponseParser.h */, + 84229BCEDC65E86549AD82200811BB6C /* BTAPIResponseParser.m */, + 5CEF4595973ED6613C9610B47C78F04C /* BTApplePayPaymentMethod.h */, + 99A2993695AB373FA5F755C068F9C2AD /* BTApplePayPaymentMethod.m */, + 3E4C7FB83CB7290FB9DBA63FD8FEBD82 /* BTApplePayPaymentMethod_Internal.h */, + 5BD414275D72D8669FDF826623F56E6C /* BTAppSwitch.h */, + 0B8D7F581901C097E1D25EADCA40F5D9 /* BTAppSwitch.m */, + ACC621E7611D04F6A93ECF9774B43EF8 /* BTAppSwitchErrors.h */, + FAE82116866AB5704265E9661D13387A /* BTAppSwitchErrors.m */, + F235EC4573E3BC035067BE9F6946BAB7 /* BTAppSwitching.h */, + 3F3888077748753B1CFDB79BE515AE6E /* BTAppSwitchingDelegate.h */, + F1D4FEEBECE3C6D3E0A498E89CDA2775 /* BTCardPaymentMethod.h */, + B00A1C86D45FE95FC5D86A95DE13B3D2 /* BTCardPaymentMethod.m */, + 165461E34E990BA54002EB1FFA72AF73 /* BTCardPaymentMethod_Mutable.h */, + ADB887C884655DE01B5FDCC5171D8742 /* BTClient.h */, + E34A50FCF7072CC5FC1335047A9A393F /* BTClient.m */, + BE9F23152548348322AF3D1620883345 /* BTClient+Offline.h */, + 819053F6192524A32EF90C7EC510DEEA /* BTClient+Offline.m */, + B9B0F25F6E9A76BCAB8CD3EF3D7D081D /* BTClient+Testing.h */, + 588089A8E5B3CB02611C38CC9A220F67 /* BTClient+Testing.m */, + FDFABD53E21583B698FBACD77A41FF99 /* BTClient_Internal.h */, + 18DC6C9559099F7280B732FC7883D614 /* BTClientCardRequest.h */, + 4A6D7E099F80840093E44F7B6ECCAFE1 /* BTClientCardRequest.m */, + 63CCBA680A289348E44695F0F37C90D9 /* BTClientCardTokenizationRequest.h */, + 8E14FBA54202A7F4153D802DA448CE8C /* BTClientCardTokenizationRequest.m */, + B9D49F9BB9851BD128ACB53CE36503B0 /* BTClientMetadata.h */, + 5CD135A55C33A2DA8EA129362C445EDB /* BTClientMetadata.m */, + CAAECE01529235276AB1638EF733196C /* BTClientPaymentMethodValueTransformer.h */, + 5D9D68D7B6CA34D60B16509BB8084743 /* BTClientPaymentMethodValueTransformer.m */, + 324DDB86681B65C762C06882B6D1D84E /* BTClientStore.h */, + 6F4DF2508F1E5E978DC32BFFD3041847 /* BTClientStore.m */, + 979D23B77BE016F44E0D3EEB7552BCF6 /* BTClientToken.h */, + A824FDE36FB7B6E37BC93EF415BF5653 /* BTClientToken.m */, + 12EFFEFFE960B5FA829A41E523D05F25 /* BTClientTokenApplePayPaymentNetworksValueTransformer.h */, + 7F9EE9C0A5705AC33E76B38F7130B6F1 /* BTClientTokenApplePayPaymentNetworksValueTransformer.m */, + 1C29EDD397FE9B8F21CB8C97A626FF12 /* BTClientTokenApplePayStatusValueTransformer.h */, + D325902D803D782B5B8A5C45D7F4187F /* BTClientTokenApplePayStatusValueTransformer.m */, + 988CA6375666F26C9A42230E6D45E6E4 /* BTClientTokenBooleanValueTransformer.h */, + 1698D7585E515C9AB4D0411B74E2B4E4 /* BTClientTokenBooleanValueTransformer.m */, + 28CF6E6C9FACE4E7F81D2177C76738F9 /* BTCoinbasePaymentMethod.h */, + 86343D1F7AD70E3CCE07435CD5EFA091 /* BTCoinbasePaymentMethod.m */, + B5331627F4B869AB13FD99EA7EC32607 /* BTCoinbasePaymentMethod_Internal.h */, + C57EE3A7CA81BD870AD8A66CD4B7F8A2 /* BTConfiguration.h */, + 775F09A6B9DC2B9AEA9C2FE6D60F5747 /* BTConfiguration.m */, + B490350F03D817F809E81AB5A45DEE45 /* BTErrors.h */, + 85400FE5327281FF119C83A4D782CF4A /* BTErrors.m */, + 38931941A12871EC3C1363DC8FF8BAAD /* BTHTTP.h */, + B54F2A5604BC653624FC45B5385132EF /* BTHTTP.m */, + BF15EE451A59879C62649818CB96D4B8 /* BTHTTPResponse.h */, + 56BB7A3269887D5EE6BC12C11FD8E664 /* BTHTTPResponse.m */, + 6394260A02F7F70C36756C55B0009ED3 /* BTKeychain.h */, + 5776C7684A9A82717EEEBF7A82F5EE9B /* BTKeychain.m */, + CFDB88C42A99A599C063053E474E533B /* BTLogger.h */, + D05209FFEB64AA107E1887F513E3FD83 /* BTLogger.m */, + DDA27200595CF304AFDE92EF1CAF6583 /* BTLogger_Internal.h */, + 0F5F2E3A36831346D29F3C5D6785668E /* BTMutableApplePayPaymentMethod.h */, + 510CE6410A513B6BFFF8C0F0E4CB93C8 /* BTMutableApplePayPaymentMethod.m */, + 119400E00337107F48840956E71CA79E /* BTMutableCardPaymentMethod.h */, + EC8B00183631D00F1F43318BEB98132D /* BTMutableCardPaymentMethod.m */, + 7A0A6114376E2FCBE679CFA43BD07803 /* BTMutablePaymentMethod.h */, + A089368B5410E2C3A8A298903F6220A5 /* BTMutablePaymentMethod.m */, + 329C7B359C10DC47768653FA76DA9DDB /* BTMutablePayPalPaymentMethod.h */, + 67B3F589263A763A9DEB7EFB58215F4B /* BTMutablePayPalPaymentMethod.m */, + 77637EB3CCCB595FA220660128ED543A /* BTOfflineClientBackend.h */, + 688FE6D209F39F7A256D0F2A12337999 /* BTOfflineClientBackend.m */, + A76FC5DFFDF753013EFCF8D6BC99276F /* BTOfflineModeURLProtocol.h */, + 21F4388F5207051CC72548F4FEEF347A /* BTOfflineModeURLProtocol.m */, + 9C044B5E30C3AE3D5F74022C87A3AA01 /* BTPaymentMethod.h */, + 1E016DD89C30590C856A83E17100F313 /* BTPaymentMethod.m */, + 9543199E600B193849BF206E36D1A34D /* BTPaymentMethod_Mutable.h */, + E5BBD6B3E3AFD7B358DC56DD22ED5C4F /* BTPayPalPaymentMethod.h */, + 1D821072A6751EBF76EB0B856B45203D /* BTPayPalPaymentMethod.m */, + 5FCDE9F7794B3AEDB30920A893FAF444 /* BTPayPalPaymentMethod_Mutable.h */, + 62B0BB423C9C2A608B6AEC2BF10D0B6A /* BTPostalAddress.h */, + EB1673F8882EB5606298635536C6864B /* BTPostalAddress.m */, + 1DE2F6908E2F404FB726399340D2CC5D /* BTPostalAddress_Internal.h */, + 4EA2FF0C08B5444735AE639C147FDDE6 /* BTThreeDSecureLookupResult.h */, + 832DE7B4D5DEBFA5CC8F496CC06582A6 /* BTThreeDSecureLookupResult.m */, + 3BBD5AB1BCE700F6F5D05B202E4F75A4 /* BTURLUtils.h */, + A3AFC1B73339D9ADE9E90863068E91EA /* BTURLUtils.m */, + ); + name = API; + sourceTree = ""; + }; + 9669AC57C17AA3F4DF69716024FE7071 /* SwiftSpinner */ = { + isa = PBXGroup; + children = ( + A96C65B99B475FB331C34043F3BD68D4 /* SwiftSpinner.h */, + 5AAB4900836AD65A1892863D8C0CA45B /* SwiftSpinner.swift */, + C7B36A7B670E90C7979622D12D0D18B2 /* Support Files */, + ); + name = SwiftSpinner; + path = SwiftSpinner; + sourceTree = ""; + }; + A3C11CA5C037511B45E2E6C70746DDED /* Pods-e-shopTests */ = { + isa = PBXGroup; + children = ( + 93E6C4D2142EEBC4D26A038B04BCC48C /* Info.plist */, + 5AFF2A936820938E8C8142C1F2F70AB1 /* Pods-e-shopTests.modulemap */, + 038579BB75506D588A94589079AFAFEA /* Pods-e-shopTests-acknowledgements.markdown */, + E78EDCF9E3DC08796CAB90804BEA45E1 /* Pods-e-shopTests-acknowledgements.plist */, + 0DA4BBF696E01D7790FA1BDF810A2DB5 /* Pods-e-shopTests-dummy.m */, + 622714C087AFE696F4655B126EC33A6E /* Pods-e-shopTests-frameworks.sh */, + 012E49B7C3466A32BD319E4E4F815995 /* Pods-e-shopTests-resources.sh */, + 59839D5BB7E4F9791FCB5E15667FA62D /* Pods-e-shopTests-umbrella.h */, + 1DFCC9C897110F540B125AF084648C47 /* Pods-e-shopTests.debug.xcconfig */, + ACD534ACF774326E0F7220A607FE4738 /* Pods-e-shopTests.release.xcconfig */, + ); + name = "Pods-e-shopTests"; + path = "Target Support Files/Pods-e-shopTests"; + sourceTree = ""; + }; + BEBBF0D6A2CE3C2180F4455B28A97945 /* PayPal */ = { + isa = PBXGroup; + children = ( + 097017296FA40F78C707EE0190C35231 /* Braintree-PayPal.h */, + 094825D2CBD1C90DD3F755AD2E86E503 /* BTClient+BTPayPal.h */, + ECE18B767032811839CA8B5FDEA5F45D /* BTClient+BTPayPal.m */, + 9685C71CFBA0D13147F47D2A49FEF131 /* BTErrors+BTPayPal.h */, + 272E73B615778A260640FD438FDC8C27 /* BTErrors+BTPayPal.m */, + 03A8AD28BDC14C140B367746A2BE4A0A /* BTPayPalAppSwitchHandler.h */, + 50B09AD41FD73EB6829C6C051E5DA582 /* BTPayPalAppSwitchHandler.m */, + E164768FA28AA99365AB933D18682C35 /* BTPayPalAppSwitchHandler_Internal.h */, + CC7EA5A3803D08028AAFFCF6CFB02859 /* BTPayPalButton.h */, + 75385C1B03ED0A5780BF3955C1B95119 /* BTPayPalButton.m */, + 8597562CF06A51DDD65FDFAFB804F004 /* BTPayPalHorizontalSignatureWhiteView.h */, + 7C50B491A41B80AC46B684160F84B99D /* BTPayPalHorizontalSignatureWhiteView.m */, + C9241063783B2A4F06F9DE3D2D00658B /* BTPayPalViewController.h */, + 90FF84C5A7A3C3E4578B4A6949C6D2EF /* BTPayPalViewController.m */, + D55C501E3CDF57AFBBBB23C99C9FBA22 /* BTPayPalViewController_Internal.h */, + BD3263E8248FEB304BFDF33A920C5439 /* PayPalConfiguration.h */, + 2D68062F2216FC2C7826ABA03C486BDD /* PayPalFuturePaymentViewController.h */, + 68300CC717163E25B0F0AB6087F9CFCC /* PayPalMobile.h */, + F4C8A0661199460635BABB64AF57A197 /* PayPalOAuthScopes.h */, + 056D3F8945FBB82058AD7E35388DE3E0 /* PayPalPayment.h */, + E73890F7E6FDD399B996CD90C78DA870 /* PayPalPaymentViewController.h */, + CA399B8A2A00ED43A7F736003AA65D4A /* PayPalProfileSharingViewController.h */, + 5E4476C5C32A4F37503EAC3EDBC172AB /* PayPalTouch.h */, + 613CFA67444818369ED997483B981855 /* Frameworks */, + ); + name = PayPal; + sourceTree = ""; + }; + C7B36A7B670E90C7979622D12D0D18B2 /* Support Files */ = { + isa = PBXGroup; + children = ( + 2E6C0FA679EA247471ADDEAC839E6AA8 /* Info.plist */, + 6E72A1A7E5A6580A3E1747FE6966F20D /* SwiftSpinner.modulemap */, + 490EA4531DE545600917DC344F674F12 /* SwiftSpinner.xcconfig */, + E956C3CD5E0CA6C461C51BE2C83D0DD6 /* SwiftSpinner-dummy.m */, + 63011F41D5833B1C5A9DE71DC0C418AF /* SwiftSpinner-prefix.pch */, + 9CCBD56BC88FCF4F70833F459D431DF1 /* SwiftSpinner-umbrella.h */, + ); + name = "Support Files"; + path = "../Target Support Files/SwiftSpinner"; + sourceTree = ""; + }; + CC99E5DF368B54C525F05238C9EE05C8 /* Braintree */ = { + isa = PBXGroup; + children = ( + 82602B693A3179FD535B134B5ABA7CAB /* Braintree.h */, + A77E9D0565540646549A928543B0683F /* Braintree.m */, + A22B43DBCB0A18EFD9B8C099421B41CC /* Braintree_Internal.h */, + 83E16529AE244B5D4777BA184249AEB9 /* API */, + E85F5C7AD91372EA677D69E7538CE97E /* Coinbase */, + 454B54AA09B7C7BC331E71D287CC589C /* Drop-In */, + ED7C3CA69627C07D88EDB3DDAC5B13B1 /* Payments */, + BEBBF0D6A2CE3C2180F4455B28A97945 /* PayPal */, + 647EA055BAB6D567E3E28943FD757EBE /* Support Files */, + 0DB2D128649786CD78A9D844ADB12F24 /* UI */, + 371585E9EF92DE5C59F3AE5331D2E924 /* Venmo */, + ); + name = Braintree; + path = Braintree; + sourceTree = ""; + }; + E85F5C7AD91372EA677D69E7538CE97E /* Coinbase */ = { + isa = PBXGroup; + children = ( + E570598F11EA7ED168263D87DED8A248 /* Braintree-Coinbase.h */, + 7DCF3C69ED019540C45D3D14EF10D7C5 /* BTCoinbase.h */, + 62AD6757B6CB10F9A2C81E886CC8139F /* BTCoinbase.m */, + 1C9F71CBD7CA9479312170E45F8F166F /* BTCoinbaseDefines.h */, + E35DFD19292443931C3B8A4911074AEC /* BTCoinbaseDefines.m */, + 0667C1FB298D61186B389479268D6B0C /* BTCoinbaseOAuth.h */, + BBC95A3F395AB0BB5BD092E8D3B9B422 /* BTCoinbaseOAuth.m */, + ); + name = Coinbase; + sourceTree = ""; + }; + EB57DDB3388FBC701046A1E93218737F /* Frameworks */ = { + isa = PBXGroup; + children = ( + 592E4ABC53015AFE66FC1B808EEEF8A4 /* iOS */, + ); + name = Frameworks; + sourceTree = ""; + }; + ED7C3CA69627C07D88EDB3DDAC5B13B1 /* Payments */ = { + isa = PBXGroup; + children = ( + 7F60B0A270601DD3CFC6AD5AB821EFEC /* Braintree-Payments.h */, + 266CF3644F1760A681ED8A53A10DB322 /* BTPaymentApplePayProvider.h */, + 189866804C8C538C2C2C70527D4EF12A /* BTPaymentApplePayProvider.m */, + 9C73C62B2ECB0CE0CECCC01E74E47A1E /* BTPaymentApplePayProvider_Internal.h */, + F89F82156FC911C202F8D5ADAD77EAA4 /* BTPaymentMethodCreationDelegate.h */, + DEF6B666D5D948D1A4559074848CE494 /* BTPaymentProvider.h */, + 1AF70CB69D28D4BE0538BE8735B1D2E9 /* BTPaymentProvider.m */, + 3E9241BF24149C9BC653839B8ABDD8F7 /* BTPaymentProviderErrors.h */, + 6523AA06B7329D80F5763688BFA13DEC /* BTPaymentProviderErrors.m */, + ); + name = Payments; + sourceTree = ""; + }; + F82B3B07A66F0A9B9C0D8D4EBC71C21C /* Targets Support Files */ = { + isa = PBXGroup; + children = ( + 2886503AC3884DA51D31A4071B039075 /* Pods-e-shop */, + A3C11CA5C037511B45E2E6C70746DDED /* Pods-e-shopTests */, + 63C7544069C3F087EE250EC08C101FA0 /* Pods-e-shopUITests */, + ); + name = "Targets Support Files"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 092C49D7C6A5263A104245101872DA8E /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 647527B3DB41311B73B7B10F46F6B55F /* Pods-e-shopTests-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 3E291486F9C8E49A425349EB349C377A /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + EF0FF8ADAECB92C7DA007A6217115CD3 /* SwiftSpinner-umbrella.h in Headers */, + 977DC6C1DCC8E0D369F05F10F585EBF8 /* SwiftSpinner.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 5659C32C4401E203FA5679A505D774A0 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 934007A3CA57E7EF6BC660EFF85CCA27 /* Pods-e-shop-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 81769B571FAE5B6C9C13A00AFEA8EFBA /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 474508DDB7C9EC13FFBF3E656DD243F9 /* Pods-e-shopUITests-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F39259E62F2BD47A099FD56C84134C93 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 86F709465ACFC28F8721C030FBA47D40 /* Braintree-API.h in Headers */, + 41B53A4175641222884BC63716ECF23F /* Braintree-Coinbase.h in Headers */, + 2C3CF14F665CF54C3E99F232753664A0 /* Braintree-Payments-UI.h in Headers */, + 7DC30CFFE701226449C5142FC6EFDA2E /* Braintree-Payments.h in Headers */, + ADA952B413187B4533D9E9EDC34C9C83 /* Braintree-PayPal.h in Headers */, + 4869301401DB2ADFC2878BC75D4A9192 /* Braintree-umbrella.h in Headers */, + B763C2782E9FF45D1540D1EFA74AEE14 /* Braintree-Version.h in Headers */, + DB13A8EB65353073EEA052F473FCCB1F /* Braintree.h in Headers */, + B2D28B26DA954F26A56636A20C911699 /* Braintree_Internal.h in Headers */, + 53926534C006EAE348C55306A74DEC7F /* BTAnalyticsMetadata.h in Headers */, + BF65F3C21B552FE98DAE07C599C292DD /* BTAPIPinnedCertificates.h in Headers */, + 967ADD44A2C2557582D536C8304E94BB /* BTAPIResponseParser.h in Headers */, + 23A6071B93E7C2894C08E3367F0585D8 /* BTApplePayPaymentMethod.h in Headers */, + B0293D5793834E6213A2AE6F9BC41AD6 /* BTApplePayPaymentMethod_Internal.h in Headers */, + A1305FED42367F89A376A32C334D2E7A /* BTAppSwitch.h in Headers */, + EFEAD82DA248824F65AC8AC4F9EF44F7 /* BTAppSwitchErrors.h in Headers */, + 7560576B67084B42FD0DFA86FF78F2E8 /* BTAppSwitching.h in Headers */, + CA537B8DD934FA88DC9417D4E0D8BC1B /* BTAppSwitchingDelegate.h in Headers */, + 93AE9E1AAEA950D48F9991F1917CC893 /* BTCardPaymentMethod.h in Headers */, + 0FF013B34979F08BAECC1CC3DC8EF4D5 /* BTCardPaymentMethod_Mutable.h in Headers */, + E120DA63D67CCD143B189A1192A7C3AB /* BTClient+BTPayPal.h in Headers */, + 7E74F319D1559686F9BB782D29E81EC1 /* BTClient+BTVenmo.h in Headers */, + A976576315BDF2B1C377560CF524052C /* BTClient+Offline.h in Headers */, + EB82BCEB186F6C251A725EF362E3FC1F /* BTClient+Testing.h in Headers */, + 0E5078043E1FCB628E40AAA04251E4D7 /* BTClient.h in Headers */, + 49ADBAFE0BF2B24476B218A2497CF808 /* BTClient_Internal.h in Headers */, + 8CE3DD3A8E09999D608A408193118FA9 /* BTClientCardRequest.h in Headers */, + FB4E25A35B7C2504623AF32EC742A088 /* BTClientCardTokenizationRequest.h in Headers */, + 54AC6F9A3A262EF735AD07B432AADCB4 /* BTClientMetadata.h in Headers */, + A485C3388E41D0BB601DC12F8A249ED2 /* BTClientPaymentMethodValueTransformer.h in Headers */, + 77DF7FA1633F6F245E03A1C054EECFB6 /* BTClientStore.h in Headers */, + 701D85B0A034A8781917D8A6C69C9CF8 /* BTClientToken.h in Headers */, + 239FA1C065D8DCFE48C75F96A67E25E2 /* BTClientTokenApplePayPaymentNetworksValueTransformer.h in Headers */, + 1534E95100D283E399FDA272BF61FCE0 /* BTClientTokenApplePayStatusValueTransformer.h in Headers */, + 035810C779B461BA0A6090A256BDA9BA /* BTClientTokenBooleanValueTransformer.h in Headers */, + 191CDF15075A3823BE551FC271E876AA /* BTCoinbase.h in Headers */, + D4648C856CF78B388AFF7F22B4F0443E /* BTCoinbaseDefines.h in Headers */, + 8C2E8333AB2626DC4DD608FDA9799164 /* BTCoinbaseOAuth.h in Headers */, + 8B54F81845C666039B207D770FF29994 /* BTCoinbasePaymentMethod.h in Headers */, + 91211978A597404D19512DE0B708276B /* BTCoinbasePaymentMethod_Internal.h in Headers */, + 111B9031393CE3EF35EC8E25F44FB164 /* BTConfiguration.h in Headers */, + C70838A6EED4B04DBAA5FC4C5D0CB3C8 /* BTDropInContentView.h in Headers */, + 605108BBF9F1D2B33EEE075CE1FB90B2 /* BTDropInErrorAlert.h in Headers */, + 70CBB3A6B9662554CDA578FFE0CEC37E /* BTDropInErrorState.h in Headers */, + 75CF4892ABD30E8013384DF425D2CDED /* BTDropInLocalizedString.h in Headers */, + AEA2242F3C3E608C69FE879C7C520430 /* BTDropInSelectPaymentMethodViewController.h in Headers */, + 35AF9CCF89ECA7B4ABC0EAD6FC467E16 /* BTDropInUtil.h in Headers */, + 918652015DA5026ED20FDB64024358BD /* BTDropInViewController.h in Headers */, + F2A7536CDFA5C058E424417F18725924 /* BTErrors+BTPayPal.h in Headers */, + 2C6474FA8A68742C00CDB186BA817D2A /* BTErrors.h in Headers */, + 1BFE6EE562D3CAF911159BA134ED07DD /* BTHTTP.h in Headers */, + 3D080178540ED70237145805A3C7FFCA /* BTHTTPResponse.h in Headers */, + 6990821B9BBBA3463C2044119DF969D7 /* BTKeychain.h in Headers */, + C710F3BE76AC1D84469BDB993314C3E1 /* BTLogger.h in Headers */, + D6C3F5F4CAF07EE0C815B31C6814C1DE /* BTLogger_Internal.h in Headers */, + 51082C97BA8B2C099BD88A8AF510B566 /* BTMockApplePayPaymentAuthorizationView.h in Headers */, + AF6473DFE5D8F45D44929DCE1C093CFD /* BTMockApplePayPaymentAuthorizationViewController.h in Headers */, + FD92F07ABE3944D130A0983557CA09D8 /* BTMutableApplePayPaymentMethod.h in Headers */, + 8C087B97D3F4039C55559543C97D513D /* BTMutableCardPaymentMethod.h in Headers */, + BD1694D094559052F4F6ADC246235664 /* BTMutablePaymentMethod.h in Headers */, + 6B4FFB66AD666EC7ADE0F4DDA9DB5EC3 /* BTMutablePayPalPaymentMethod.h in Headers */, + 1284C16AA7D0E5C5299B34ABBE6D107C /* BTOfflineClientBackend.h in Headers */, + C2794C72B1FFD41AF86B4D68CC54401F /* BTOfflineModeURLProtocol.h in Headers */, + F5966432955C011639486B4C10349D14 /* BTPaymentApplePayProvider.h in Headers */, + 3B7E1804D06F0101659B6AAF9A234DAB /* BTPaymentApplePayProvider_Internal.h in Headers */, + DEF64AEF3D519E608FB93C6E57E4D9E6 /* BTPaymentButton.h in Headers */, + 264AB122FEA657D85578F15AB25F1DBD /* BTPaymentMethod.h in Headers */, + 0EEB5BCE500AFF7A25B00BB9E92A762D /* BTPaymentMethod_Mutable.h in Headers */, + 44FD01E042AD9FA6907C9D4E0E848082 /* BTPaymentMethodCreationDelegate.h in Headers */, + 623F3A97DD96FEE1D1C9A46A1BB924A3 /* BTPaymentProvider.h in Headers */, + 5C2A2630B357FC65678F47D4E9A1B54A /* BTPaymentProviderErrors.h in Headers */, + 685A49F8CF817EF5E0C5D479142DC351 /* BTPayPalAppSwitchHandler.h in Headers */, + D9CB7B64829D28B7C57D035197159635 /* BTPayPalAppSwitchHandler_Internal.h in Headers */, + 04EA5618B9AE5E2C713E2A83789A2CC2 /* BTPayPalButton.h in Headers */, + A2437A1E496CDC233FEAE0A4C1C2D3FB /* BTPayPalHorizontalSignatureWhiteView.h in Headers */, + 0AB28F5215C4EBBA7BE68089ABB696A4 /* BTPayPalPaymentMethod.h in Headers */, + 617C2654BBBEA85161540B92FB9D4BF7 /* BTPayPalPaymentMethod_Mutable.h in Headers */, + 93143E50BB2F31A9EA706939EF632FD2 /* BTPayPalViewController.h in Headers */, + ECD094D2F8B422024A14583A295FF694 /* BTPayPalViewController_Internal.h in Headers */, + 43E6305D216CA6C65211BEC11ECFBF99 /* BTPostalAddress.h in Headers */, + 067374CBEEEABCF20B9B2D8C473799E5 /* BTPostalAddress_Internal.h in Headers */, + 591880F8FBAD47EE12B9C3986900198C /* BTThreeDSecureLookupResult.h in Headers */, + 118D4FA4912709E2FDCAD40173D8D50C /* BTUI.h in Headers */, + BF1960B0D33DC80D8EE2CCC2DB691C7A /* BTUIAmExVectorArtView.h in Headers */, + 1D37463E69B60ADB0057BDA1A2BAFB14 /* BTUICardCvvField.h in Headers */, + D443055B24A7A60E45CA2B2CBB1FF2EC /* BTUICardExpirationValidator.h in Headers */, + 974BB4774F1C8E302B86B4F2F6956191 /* BTUICardExpiryField.h in Headers */, + A68A5CD3EB7584AB70237106B472684B /* BTUICardExpiryFormat.h in Headers */, + FED22AFBB2E25CB0E0BC5213FD2FBB58 /* BTUICardFormView.h in Headers */, + 5B9F146CCE8AAD63B54B103746E6F897 /* BTUICardHint.h in Headers */, + 11E8FA3D9F87D632F9ADE53680EEDB79 /* BTUICardNumberField.h in Headers */, + AD264C901BBBB2970758A174B818D906 /* BTUICardPostalCodeField.h in Headers */, + FC4C75E716B7CEA82F159CFCF924AA7A /* BTUICardType.h in Headers */, + D7904DEA41F64DA0B1568F887922D837 /* BTUICardVectorArtView.h in Headers */, + E3D87B102A319A1D6CE0EECE64A54DB3 /* BTUICoinbaseButton.h in Headers */, + 1E08C180ECF569EB570BA0E2F378F03F /* BTUICoinbaseMonogramCardView.h in Headers */, + 732E8E5B14A461E3E91F9BF7E0268587 /* BTUICoinbaseWordmarkVectorArtView.h in Headers */, + 422C8B9A8605254001CA7370C8998089 /* BTUICTAControl.h in Headers */, + 2490377F810D06CBC36B4D9804ECAB10 /* BTUICVVBackVectorArtView.h in Headers */, + 52FDD6C385AF853DB8E1BA5B9ADD0AB5 /* BTUICVVFrontVectorArtView.h in Headers */, + 7F49096048F910343D56A064AE1E3B41 /* BTUIDinersClubVectorArtView.h in Headers */, + 4443F897B2D3B37F0D94D413A47129E7 /* BTUIDiscoverVectorArtView.h in Headers */, + 1A60C277C859D503ED77A397447077AF /* BTUIFloatLabel.h in Headers */, + 9A039E74BC1944DE875586F8BC4C76D0 /* BTUIFormField.h in Headers */, + 54984BEA7A91366D4C92121785E37C5F /* BTUIFormField_Protected.h in Headers */, + ABA2B3FB5C302B189679AD2964313B0B /* BTUIHorizontalButtonStackCollectionViewFlowLayout.h in Headers */, + 410D9DDF91433A8C6EBFD29B00359754 /* BTUIHorizontalButtonStackSeparatorLineView.h in Headers */, + 4E02312EE9DA60BB30A26A29EBFA9684 /* BTUIJCBVectorArtView.h in Headers */, + 0E50F5A8DB478F38E3EAF4FC0BEB26DC /* BTUILocalizedString.h in Headers */, + 6FE2E45567F4B6C3DB1CCBEA8D169B16 /* BTUIMaestroVectorArtView.h in Headers */, + B25912208BEAE7A81B0E5CC68DCE018B /* BTUIMasterCardVectorArtView.h in Headers */, + 47F4F40A11F7C0F57018A4912D3C01DA /* BTUIPaymentButtonCollectionViewCell.h in Headers */, + 0BE3642A7BD1D6B03CBFB7BECEE20913 /* BTUIPaymentMethodType.h in Headers */, + 7E59F78D60FE0890223C8D9CB14A3806 /* BTUIPaymentMethodView.h in Headers */, + DF3091B83B00A194B07E7EAB8E477F06 /* BTUIPayPalButton.h in Headers */, + 09D429EA5AD100D6A4BEAFA6C5BB6BE9 /* BTUIPayPalMonogramCardView.h in Headers */, + FF8F745FAD9319A79BEDF31983FA1948 /* BTUIPayPalWordmarkVectorArtView.h in Headers */, + 2AF77E4B1C8127D51490DA189B1EE815 /* BTUIScrollView.h in Headers */, + B112A375A949A67219A079F8E33B3003 /* BTUISummaryView.h in Headers */, + D4F54E6DB3D5AC6672679CB0846585C6 /* BTUITextField.h in Headers */, + 04347D78E7DC2707553E56F173A0EE51 /* BTUIThemedView.h in Headers */, + 885AD76D683873B09A8E5906EDC3454A /* BTUIUnknownCardVectorArtView.h in Headers */, + E31AB6322A16D2A553B4E36FE15AE118 /* BTUIUtil.h in Headers */, + 315DCD6291FBE472DFB976167CF11A73 /* BTUIVectorArtView.h in Headers */, + 782661D4DBB3C991B767B5DEBC97C331 /* BTUIVenmoButton.h in Headers */, + 28A25EADF2A5821C05CC50303615792D /* BTUIVenmoWordmarkVectorArtView.h in Headers */, + 2197C262BD8A2BACA3292B767CAAB02C /* BTUIViewUtil.h in Headers */, + CDC5FADA4F5255447E345BDC733768F8 /* BTUIVisaVectorArtView.h in Headers */, + B4F2C29C6D91EFC194EA981E566471E6 /* BTURLUtils.h in Headers */, + 933E740D7E92065D841E4FC381A85DBF /* BTVenmoAppSwitchHandler.h in Headers */, + 758E38D19D2B4E11949CCB86D396EEC0 /* BTVenmoAppSwitchHandler_Internal.h in Headers */, + A4B7448022BF3E87D25DBD2C363650A6 /* BTVenmoAppSwitchRequestURL.h in Headers */, + B25B8A33C10B1C4ED92206AFDFA61BD8 /* BTVenmoAppSwitchReturnURL.h in Headers */, + E055AD90401C4FCEBB07C1215152C930 /* PayPalConfiguration.h in Headers */, + E44EE860CEFFFEF3487F596F9D559AF0 /* PayPalFuturePaymentViewController.h in Headers */, + 0E5F8BCEA98FB45E8EED42363C92B1A6 /* PayPalMobile.h in Headers */, + 3E3E5515D355160B0CA66ECE39463525 /* PayPalOAuthScopes.h in Headers */, + 7FB3D2B561194E5AE69501F5A2E77D92 /* PayPalPayment.h in Headers */, + AFDAF94E54EAA1261EC00F3997AD7A0B /* PayPalPaymentViewController.h in Headers */, + 4FD9481CF1583ABA043399FF496ADE83 /* PayPalProfileSharingViewController.h in Headers */, + 19A7301E7A538B28C0D7BC52F8636643 /* PayPalTouch.h in Headers */, + 2097702CD19D3117418E547EB2D23760 /* UIColor+BTUI.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 0216A666A53FA91B434D78FFF3844A15 /* Braintree-Braintree-Drop-In-Localization */ = { + isa = PBXNativeTarget; + buildConfigurationList = 745C63AD1066659184D2430762B2A763 /* Build configuration list for PBXNativeTarget "Braintree-Braintree-Drop-In-Localization" */; + buildPhases = ( + 584541C4F5D5D33F65567610F2F5A44E /* Sources */, + 03505C269D09D153C4C9C92BF245787C /* Frameworks */, + 878230E8AA2962F10D2B1CCC6A31D4CD /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "Braintree-Braintree-Drop-In-Localization"; + productName = "Braintree-Braintree-Drop-In-Localization"; + productReference = 1AC0A4B9F1806BEA03BAC7410174E0F4 /* Braintree-Drop-In-Localization.bundle */; + productType = "com.apple.product-type.bundle"; + }; + 2A2D068CE32D48F476DF6D1978B80935 /* Braintree-Braintree-UI-Localization */ = { + isa = PBXNativeTarget; + buildConfigurationList = 95AC0B65C56A945798EDB0747BD98A9D /* Build configuration list for PBXNativeTarget "Braintree-Braintree-UI-Localization" */; + buildPhases = ( + 91791EEA0B62C166E4A54A6AAC7A7A1B /* Sources */, + C4F6B2BD740E5C0DA0248479851098AC /* Frameworks */, + 0352343281F16A92092CC72A78F096AA /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "Braintree-Braintree-UI-Localization"; + productName = "Braintree-Braintree-UI-Localization"; + productReference = AE7DFABF6FADBCF5FFE59CABE6952CBC /* Braintree-UI-Localization.bundle */; + productType = "com.apple.product-type.bundle"; + }; + 2A9A92AA5AECBE7AB765B63EA01ECB19 /* Pods-e-shopUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = E14E204FB69EB54EAFB6AC0BE099BA7D /* Build configuration list for PBXNativeTarget "Pods-e-shopUITests" */; + buildPhases = ( + E3EE41AA23B6350E8DF4BD351A619A91 /* Sources */, + 84D3D49007D5EAFFA0283EC3FE30A725 /* Frameworks */, + 81769B571FAE5B6C9C13A00AFEA8EFBA /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "Pods-e-shopUITests"; + productName = "Pods-e-shopUITests"; + productReference = 9B98C94559C9215A815E2C9233766930 /* Pods_e_shopUITests.framework */; + productType = "com.apple.product-type.framework"; + }; + 328427FD56364DBB2EE98EC86923B0FE /* Braintree */ = { + isa = PBXNativeTarget; + buildConfigurationList = ACCBDCCFD925D3A8A2EDC5B4532BBCE9 /* Build configuration list for PBXNativeTarget "Braintree" */; + buildPhases = ( + 9A6DFE664030EF9A732CCF54762D715B /* Sources */, + 04AF66993000A4670E5FBD618B8D5468 /* Frameworks */, + 97B3B9057067FD1289118515B7C75A5F /* Resources */, + F39259E62F2BD47A099FD56C84134C93 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + 197BCE384A95B846E74B33EF756E9729 /* PBXTargetDependency */, + F4EE019C73CA5383C138E5CC884038C5 /* PBXTargetDependency */, + ); + name = Braintree; + productName = Braintree; + productReference = 79322495BDDD1678ACBA8143E3368A9A /* Braintree.framework */; + productType = "com.apple.product-type.framework"; + }; + C2783BCF7301BD742137490834C910F1 /* Pods-e-shop */ = { + isa = PBXNativeTarget; + buildConfigurationList = E7307C0CEA7B3363D461FBC3978EE049 /* Build configuration list for PBXNativeTarget "Pods-e-shop" */; + buildPhases = ( + 0502956E5E38ECE861DCE68A850F6CF2 /* Sources */, + F52CEDCB62F0B1EBAC59600E56502087 /* Frameworks */, + 5659C32C4401E203FA5679A505D774A0 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + 308F42B8D0C1198A28DDF7243E67D167 /* PBXTargetDependency */, + 661BD92993C6C80058217120ECAA9D25 /* PBXTargetDependency */, + ); + name = "Pods-e-shop"; + productName = "Pods-e-shop"; + productReference = 48A1C02ABA368650D28C1C473EE3EF3C /* Pods_e_shop.framework */; + productType = "com.apple.product-type.framework"; + }; + C4183235EAFE92F8936576B47AC14369 /* SwiftSpinner */ = { + isa = PBXNativeTarget; + buildConfigurationList = F825C672CA7E6EE2A36A6EAF1A79D61E /* Build configuration list for PBXNativeTarget "SwiftSpinner" */; + buildPhases = ( + 4748BB2F7F4FBFF552173A09D9DEFE68 /* Sources */, + 10E8677ABC32A1231696DCBB18C19C95 /* Frameworks */, + 3E291486F9C8E49A425349EB349C377A /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = SwiftSpinner; + productName = SwiftSpinner; + productReference = 9CE6233E17E02B84FFA70B5D796EE1B0 /* SwiftSpinner.framework */; + productType = "com.apple.product-type.framework"; + }; + E31A724F1028A504ECB99D9576735949 /* Pods-e-shopTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = B4686FFFFDC280590C8FECE50E3BEF5D /* Build configuration list for PBXNativeTarget "Pods-e-shopTests" */; + buildPhases = ( + 7F89BF9BB8441871CEFA31DAA6C96A2E /* Sources */, + F0B49D15AF92D3B5C8AB35FBEE7D52DF /* Frameworks */, + 092C49D7C6A5263A104245101872DA8E /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "Pods-e-shopTests"; + productName = "Pods-e-shopTests"; + productReference = 1711A2FBC6D611770ABF04EF33B6C77B /* Pods_e_shopTests.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + D41D8CD98F00B204E9800998ECF8427E /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0830; + LastUpgradeCheck = 0700; + }; + buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 7DB346D0F39D3F0E887471402A8071AB; + productRefGroup = 0EDB9CE982EEBC46C9DB70D63C13FC09 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 328427FD56364DBB2EE98EC86923B0FE /* Braintree */, + 0216A666A53FA91B434D78FFF3844A15 /* Braintree-Braintree-Drop-In-Localization */, + 2A2D068CE32D48F476DF6D1978B80935 /* Braintree-Braintree-UI-Localization */, + C2783BCF7301BD742137490834C910F1 /* Pods-e-shop */, + E31A724F1028A504ECB99D9576735949 /* Pods-e-shopTests */, + 2A9A92AA5AECBE7AB765B63EA01ECB19 /* Pods-e-shopUITests */, + C4183235EAFE92F8936576B47AC14369 /* SwiftSpinner */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 0352343281F16A92092CC72A78F096AA /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2B5F97CD50D3721BECFE62E0BF3CE088 /* da.lproj in Resources */, + 37C77FC2AD9EA18BBBFB455C1230CCBA /* de.lproj in Resources */, + F99C9D7C2FBF02DAE8A3FE0DDD482D68 /* en.lproj in Resources */, + 3C2C9D68771F4279557D1D198FD278D0 /* en_AU.lproj in Resources */, + 37524EE6CD6558AD6C77D5FB37978E8A /* en_CA.lproj in Resources */, + ADD8E4B619CCAC596C15D8F0A8090934 /* en_GB.lproj in Resources */, + 350DF7E50A99CE68E44BB05E8B93BF86 /* es.lproj in Resources */, + 1EE89B817C7718862363E44085669395 /* es_ES.lproj in Resources */, + 083C1E3205BC1430E97C897FF38884AD /* fr.lproj in Resources */, + AD30DECFFD51A0041656D35771E397E8 /* fr_CA.lproj in Resources */, + B1A9B693C570D9E1680EC55DB00D7D6A /* fr_FR.lproj in Resources */, + 4CACA04CA000D7AAE6A1931C475A2D29 /* he.lproj in Resources */, + 2D34AE57358A9B72E667B0A52ABA70F8 /* it.lproj in Resources */, + 23937BD3CAC019588D4C366702C8BD63 /* nb.lproj in Resources */, + F63339A2325D7B95BE965EFA6701C5B3 /* nl.lproj in Resources */, + 8F38F69DA2C63028F81E0E765A418124 /* pl.lproj in Resources */, + 50883323C727321EFEA4E191CF17769F /* pt.lproj in Resources */, + 33E15FD25BA051AC5853051447D69028 /* ru.lproj in Resources */, + B41AFD009B9A1FA73BDA91AC802C57C0 /* sv.lproj in Resources */, + EF7DFB4E253EC3D6C25F09C603CD1F67 /* tr.lproj in Resources */, + 8F8BAA84A024F991E5346F2EF278C9B5 /* zh-Hans.lproj in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 878230E8AA2962F10D2B1CCC6A31D4CD /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + FF18A00D997DB584A063BF5BA0BA228D /* da.lproj in Resources */, + 79C9E907DC73AC18E7740278014581B8 /* de.lproj in Resources */, + 4D343EDCA8E7B9AE5887785E6132C8CB /* en.lproj in Resources */, + BC3ED9FDE83722EFB40561BF2E858C0D /* en_AU.lproj in Resources */, + 9F44CB6B1EB9F0270F6A5DDCFEA84774 /* en_CA.lproj in Resources */, + C4BDFD9BA454AE8C2451F03DE6ED3F0F /* en_GB.lproj in Resources */, + 949A869D49936AE4BBC923FC1207F250 /* es.lproj in Resources */, + B597D34BC1B89FC75E5FB71B6BA7DA64 /* es_ES.lproj in Resources */, + 653E89428F4305188C04E3382B8C2412 /* fr.lproj in Resources */, + D3AAF0E0BA3438A93B68844D24F2A649 /* fr_CA.lproj in Resources */, + 4E87699A62DF67CAA9BCDF66E99A3706 /* fr_FR.lproj in Resources */, + 615E09444C5E8F8498F82FA21AFE9C24 /* he.lproj in Resources */, + 522EA7E1220C62C8CF8CCE83013308B0 /* it.lproj in Resources */, + E749EAF04A3706FE0FF0883CD3005EF0 /* nb.lproj in Resources */, + 457AF8F653D310BF1F86D365EDB5C163 /* nl.lproj in Resources */, + 80D8EBDE40F7014FF27A69B554EC6F36 /* pl.lproj in Resources */, + 184C5D357AB10C012DEA43C7A3AD9ED9 /* pt.lproj in Resources */, + 630C846FB6B99E47CD3C913E2FEE00DE /* ru.lproj in Resources */, + 12693E630284EC96E090A101FDFAF8D1 /* sv.lproj in Resources */, + EA86255C849CE35E395D21ABA95B14AF /* tr.lproj in Resources */, + DAC7A1BC8783D09931A1387E8A5BF618 /* zh-Hans.lproj in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97B3B9057067FD1289118515B7C75A5F /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 6FC9FBF0266CC8BC0C83FC7F8055C244 /* Braintree-Drop-In-Localization.bundle in Resources */, + 6700837ACF7E098AA03924D913770F3B /* Braintree-UI-Localization.bundle in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 0502956E5E38ECE861DCE68A850F6CF2 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 856ED1EF0ACFE136AF89CEAB86990D79 /* Pods-e-shop-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4748BB2F7F4FBFF552173A09D9DEFE68 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8A32D0A5DBC5E9C8C2B54981AACA1525 /* SwiftSpinner-dummy.m in Sources */, + 3A1BA76AA1A5B81ED6E3066E29465F95 /* SwiftSpinner.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 584541C4F5D5D33F65567610F2F5A44E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7F89BF9BB8441871CEFA31DAA6C96A2E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 01CF0E2ECF9E3528A7DE12E592F94432 /* Pods-e-shopTests-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 91791EEA0B62C166E4A54A6AAC7A7A1B /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 9A6DFE664030EF9A732CCF54762D715B /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B53CFE42A31F00F9260D5E088AFD3BF3 /* Braintree-dummy.m in Sources */, + A5F4780B5651A42D48AC505142854F64 /* Braintree.m in Sources */, + 5A0651F31CAFB48A681CC8C274D89C27 /* BTAnalyticsMetadata.m in Sources */, + 4F929620824A72CD7D640D4D8674FBF5 /* BTAPIPinnedCertificates.m in Sources */, + 01A6FF1DF4A5436D09208FE37B321143 /* BTAPIResponseParser.m in Sources */, + 801ED50A940F49B21DE5FAA3B80C13A4 /* BTApplePayPaymentMethod.m in Sources */, + 298536B813885F244D4247FCD3527100 /* BTAppSwitch.m in Sources */, + 1AE550245E28630098B9116D8560EE5E /* BTAppSwitchErrors.m in Sources */, + 18E0B9884DB44539CEB02FC0FE9E0782 /* BTCardPaymentMethod.m in Sources */, + C99098B238353FBB1D565EC79DDAFE92 /* BTClient+BTPayPal.m in Sources */, + 2DC28BECC08092A0111A0D2208C7F51D /* BTClient+BTVenmo.m in Sources */, + 6782D47610335064E5FA65C504758698 /* BTClient+Offline.m in Sources */, + 5F7F6050E3E42343DD27871B1079F721 /* BTClient+Testing.m in Sources */, + D17E35A2687AC4E040EAAA83762CCD60 /* BTClient.m in Sources */, + 26BE54BF3F299F32FFC699FEED84ED8B /* BTClientCardRequest.m in Sources */, + 96F63EC3C00D9C1714F34E12AAB99B14 /* BTClientCardTokenizationRequest.m in Sources */, + CE64BF35935FF116CC953ABF3D924F91 /* BTClientMetadata.m in Sources */, + A8C3488F9C845051A76EAC25CBD99F28 /* BTClientPaymentMethodValueTransformer.m in Sources */, + 85FBF5CF24291B3A56A232A85F14EB66 /* BTClientStore.m in Sources */, + 53C6ED3A7E12CF5B8F8C76B679A31E31 /* BTClientToken.m in Sources */, + AA9B56878B9A3D06D1EE5FEDCC0EA1CF /* BTClientTokenApplePayPaymentNetworksValueTransformer.m in Sources */, + 96695D9DB0B0351A76EC25ECD17BAA0D /* BTClientTokenApplePayStatusValueTransformer.m in Sources */, + 54AF321C804398D52091952C55315E85 /* BTClientTokenBooleanValueTransformer.m in Sources */, + DD482DFA05EFB3250B8CE11623613CB3 /* BTCoinbase.m in Sources */, + 24136661E2BB7404C46AA12860083419 /* BTCoinbaseDefines.m in Sources */, + 35FE82C3644DB29264E2557BF460DEAB /* BTCoinbaseOAuth.m in Sources */, + 031CCBE8788463A08EC1E10E134AD128 /* BTCoinbasePaymentMethod.m in Sources */, + 78646BD28EE588D0D00DE812C5C9327E /* BTConfiguration.m in Sources */, + BDA45F570973B50628F6F53C63866D48 /* BTDropInContentView.m in Sources */, + 4A8366A148A09626F23191859F5454A5 /* BTDropInErrorAlert.m in Sources */, + A4996FD6DFAD360297770AECD42AA68E /* BTDropInErrorState.m in Sources */, + 4A91ECD48DB9384F72C015B0DB37BAFE /* BTDropInLocalizedString.m in Sources */, + 015A01DA0B18C5729B23E85934237BAB /* BTDropInSelectPaymentMethodViewController.m in Sources */, + 748A3A1F5807C1FAE16CF7D60EBF0618 /* BTDropInUtil.m in Sources */, + DF7261B45C63F5C4FF0CC3E23FD37347 /* BTDropInViewController.m in Sources */, + 6554D21C6ADABFB17307FBA9F9A5A70C /* BTErrors+BTPayPal.m in Sources */, + 361187D9EB1EFFB68CD57571A2D9BA1A /* BTErrors.m in Sources */, + 01C80D6EA8A74259FEAB26C229174114 /* BTHTTP.m in Sources */, + E05622799EC0C7984445517B418B9411 /* BTHTTPResponse.m in Sources */, + 0B90E5823A2ECB3BB061ADAA69D39D3C /* BTKeychain.m in Sources */, + A6444AB4D993A48CC74EF008771E37FD /* BTLogger.m in Sources */, + CB7F871F9AF0EE636F1C567709FDAC30 /* BTMockApplePayPaymentAuthorizationView.m in Sources */, + F1C618A86B641F152E368F2005AA364E /* BTMockApplePayPaymentAuthorizationViewController.m in Sources */, + 3DA442BE4489FE6D417B9910FAB7FFED /* BTMutableApplePayPaymentMethod.m in Sources */, + 24F15BD3D81308F61DA50A97C49F09C0 /* BTMutableCardPaymentMethod.m in Sources */, + AD2710FAE3DFB1D1234548B163CAA074 /* BTMutablePaymentMethod.m in Sources */, + A0F37D7091C27FF580A1E382AC769D9E /* BTMutablePayPalPaymentMethod.m in Sources */, + B7F870B7F59D3498169B37597396BE0A /* BTOfflineClientBackend.m in Sources */, + 8A1AC83A9ABB8ADA9505F53F4B4CA709 /* BTOfflineModeURLProtocol.m in Sources */, + 14AEBB0A45303DE61C9C8C197585EE73 /* BTPaymentApplePayProvider.m in Sources */, + 207D972EB5FBAD54DF3E03ADA3486C03 /* BTPaymentButton.m in Sources */, + 898D7FAD7C73AB9C205BA4937DDB4C35 /* BTPaymentMethod.m in Sources */, + A66C682EC1AAED7D637F4221E88372C4 /* BTPaymentProvider.m in Sources */, + 62433B9324B3C862A5606432DCAB2462 /* BTPaymentProviderErrors.m in Sources */, + 6FEFEF3F83C2CF57653469105958AB1B /* BTPayPalAppSwitchHandler.m in Sources */, + 1C9C81309F780BE851F892B543FB5F3F /* BTPayPalButton.m in Sources */, + 1E530F112B85AB5866FA07E696BB712F /* BTPayPalHorizontalSignatureWhiteView.m in Sources */, + D239C06F2BB14C43B029074416FC8588 /* BTPayPalPaymentMethod.m in Sources */, + ABE4B076155B4CC8B8716E6612FA77C1 /* BTPayPalViewController.m in Sources */, + 126B89F9FB7CDF04BD4063CF10BAA325 /* BTPostalAddress.m in Sources */, + 1CDBE238AFAF66D7DAFBEF98A3A87916 /* BTThreeDSecureLookupResult.m in Sources */, + 53C13CEE168AE5CE4848EE670AC59BA8 /* BTUI.m in Sources */, + FB2CCF977538C9D9864296FD413218E5 /* BTUIAmExVectorArtView.m in Sources */, + DD3B0BAEB2BFD0C9467D30DD757EC3B4 /* BTUICardCvvField.m in Sources */, + E259F278537DF1A1E1F12B1EAE10DEC8 /* BTUICardExpirationValidator.m in Sources */, + 546AF7EAD530DF010AD0B82158BE5CEB /* BTUICardExpiryField.m in Sources */, + B40FB655E4E8B8BA745C7EFE842A20ED /* BTUICardExpiryFormat.m in Sources */, + A1C717158939552EE693D7E40B212A6A /* BTUICardFormView.m in Sources */, + E99FE3E237DDAFE565951CC47EB5370F /* BTUICardHint.m in Sources */, + 5419084F01982619A0C7CB79326AE206 /* BTUICardNumberField.m in Sources */, + 49BCA60FE356B63E574953DE9D11C70A /* BTUICardPostalCodeField.m in Sources */, + 072CF44F4AEBB03F71D98EBB4F31C8BD /* BTUICardType.m in Sources */, + B3A7EB6E3EB669A2C6F473B33DB8D00C /* BTUICardVectorArtView.m in Sources */, + 06F09D8C89A51D1EF4E65D933D5A1BA6 /* BTUICoinbaseButton.m in Sources */, + 266D46614A12B7D631E64A2756A4FF46 /* BTUICoinbaseMonogramCardView.m in Sources */, + 88E7396FBF2A0C0DF274BE78B998A7E2 /* BTUICoinbaseWordmarkVectorArtView.m in Sources */, + A6DC0E71C58088F5155674CBD0A4EF70 /* BTUICTAControl.m in Sources */, + B3EBC1656A83738E0E300C9005A1655D /* BTUICVVBackVectorArtView.m in Sources */, + 5A44FBED8CA502F1C76DB1270F32E104 /* BTUICVVFrontVectorArtView.m in Sources */, + 1E4332BB0CC32E5E6324D78D0D4E3A5D /* BTUIDinersClubVectorArtView.m in Sources */, + 1342F673418A223C13543A088A9B4DCA /* BTUIDiscoverVectorArtView.m in Sources */, + B9534B03B507850E58C8DDF747AD4D6C /* BTUIFloatLabel.m in Sources */, + F293818AEC2312FD6BCA62DECB40CE79 /* BTUIFormField.m in Sources */, + 3F2D244DFE742225AEBD13B7A2A71E13 /* BTUIHorizontalButtonStackCollectionViewFlowLayout.m in Sources */, + D347B795146C40A6055238B0AE664D28 /* BTUIHorizontalButtonStackSeparatorLineView.m in Sources */, + 024D8B45C2AA12D1464D92CC2F721531 /* BTUIJCBVectorArtView.m in Sources */, + 3188C592DC9F1739DE6656EC2AD93804 /* BTUILocalizedString.m in Sources */, + 03AC7D374266F138AC3D4F1D56D00D66 /* BTUIMaestroVectorArtView.m in Sources */, + 9B515C4659AF2232260C0C151387CF20 /* BTUIMasterCardVectorArtView.m in Sources */, + D9A22298A70A00DEB691CC8BDB639473 /* BTUIPaymentButtonCollectionViewCell.m in Sources */, + 4C661FEC1F17FE7C8B1E559881D3B23A /* BTUIPaymentMethodView.m in Sources */, + 27345DD0DCF42A281430BB43B9041074 /* BTUIPayPalButton.m in Sources */, + CAF1E4235454CE853CACA21D02B5773B /* BTUIPayPalMonogramCardView.m in Sources */, + F2746D4A3B04C409DC8143C585339170 /* BTUIPayPalWordmarkVectorArtView.m in Sources */, + D0D28057F22AE092C919C176B223B6FF /* BTUIScrollView.m in Sources */, + 4A87030416FF55A054B48E9E96C2E4E8 /* BTUISummaryView.m in Sources */, + F7E5D785A9E610F783EAEA6CB4FC2EE2 /* BTUITextField.m in Sources */, + CBFDDA6EA0F2873DD0AD1C68EB9E0674 /* BTUIThemedView.m in Sources */, + 6D49EDD64E06F0F5336B2EEB0F9E1C93 /* BTUIUnknownCardVectorArtView.m in Sources */, + D157EC82CF91F59B26D45A7AA8BCFB14 /* BTUIUtil.m in Sources */, + DBEFE4826FCE56FA6C4B1DDEFAE83126 /* BTUIVectorArtView.m in Sources */, + FB8BD2869860D519B0CC9B79575800DD /* BTUIVenmoButton.m in Sources */, + B366A476300A768AD0B3AA19354C6615 /* BTUIVenmoWordmarkVectorArtView.m in Sources */, + 4B9513792AB6E3DD0FBE802704B001EA /* BTUIViewUtil.m in Sources */, + 26A6F354A799C20B393EAA929F568F97 /* BTUIVisaVectorArtView.m in Sources */, + 0120869DB99BAD06128E40C7B686A54A /* BTURLUtils.m in Sources */, + 8E9B9D69DDD2152E35ADDD5C3AE92AC8 /* BTVenmoAppSwitchHandler.m in Sources */, + 3EF6A1B84385F5F1AD7FC0245F952F80 /* BTVenmoAppSwitchRequestURL.m in Sources */, + 9EDEC6C658043FACC2EA80A059530073 /* BTVenmoAppSwitchReturnURL.m in Sources */, + 41F55DB3E635C7DAD3F88244B9F69DB4 /* UIColor+BTUI.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E3EE41AA23B6350E8DF4BD351A619A91 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 86B2EC2448B317C91B1A61FB308FEA69 /* Pods-e-shopUITests-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 197BCE384A95B846E74B33EF756E9729 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "Braintree-Braintree-Drop-In-Localization"; + target = 0216A666A53FA91B434D78FFF3844A15 /* Braintree-Braintree-Drop-In-Localization */; + targetProxy = 28AF01E37AA3AE5E7D40AFC6A716E1A4 /* PBXContainerItemProxy */; + }; + 308F42B8D0C1198A28DDF7243E67D167 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = Braintree; + target = 328427FD56364DBB2EE98EC86923B0FE /* Braintree */; + targetProxy = F55AC2750C9F308F37DE98B32F662D6F /* PBXContainerItemProxy */; + }; + 661BD92993C6C80058217120ECAA9D25 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = SwiftSpinner; + target = C4183235EAFE92F8936576B47AC14369 /* SwiftSpinner */; + targetProxy = 471BD0AD2BA23C2BB1D29E87E00641E3 /* PBXContainerItemProxy */; + }; + F4EE019C73CA5383C138E5CC884038C5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "Braintree-Braintree-UI-Localization"; + target = 2A2D068CE32D48F476DF6D1978B80935 /* Braintree-Braintree-UI-Localization */; + targetProxy = E85CFF93D5BB9B265A2FF640E1C8C4C3 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 03430C125DE286EE1D7389C191D1559F /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 490EA4531DE545600917DC344F674F12 /* SwiftSpinner.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/SwiftSpinner/SwiftSpinner-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/SwiftSpinner/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/SwiftSpinner/SwiftSpinner.modulemap"; + PRODUCT_NAME = SwiftSpinner; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 0916F9EF9EBDE5852ECFEA5F322DDD7B /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 5B4B6A3653A4DE2CF6421EDA25D3A543 /* Braintree.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = "iPhone Developer"; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Braintree"; + INFOPLIST_FILE = "Target Support Files/Braintree/ResourceBundle-Braintree-Drop-In-Localization-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + PRODUCT_NAME = "Braintree-Drop-In-Localization"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Debug; + }; + 12C4B864767C59600DBFA238F1E2F8BC /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGNING_REQUIRED = NO; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + "POD_CONFIGURATION_RELEASE=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 = 11.0; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/; + STRIP_INSTALLED_PRODUCT = NO; + SYMROOT = "${SRCROOT}/../build"; + }; + name = Release; + }; + 193D345F53E3CFB84DC3625EE5AB9D9A /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 46E4FD02D9A21DC83B6C03DDB4965853 /* Pods-e-shop.debug.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-e-shop/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-e-shop/Pods-e-shop.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = Pods_e_shop; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 2E23C48C09C7731B4F86460BD93E0A32 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 840EC85EAFF70975F482AE31322728C2 /* Pods-e-shop.release.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-e-shop/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-e-shop/Pods-e-shop.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = Pods_e_shop; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 3C15010BD3CC09531622BCFF9D1FD44D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 5B4B6A3653A4DE2CF6421EDA25D3A543 /* Braintree.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = "iPhone Developer"; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Braintree"; + INFOPLIST_FILE = "Target Support Files/Braintree/ResourceBundle-Braintree-Drop-In-Localization-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + PRODUCT_NAME = "Braintree-Drop-In-Localization"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Release; + }; + 5954C6BB653E988DAFA1C7158A0947FA /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 490EA4531DE545600917DC344F674F12 /* SwiftSpinner.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/SwiftSpinner/SwiftSpinner-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/SwiftSpinner/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/SwiftSpinner/SwiftSpinner.modulemap"; + PRODUCT_NAME = SwiftSpinner; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 59F0302F2371FCC6B73EF0A418D40734 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGNING_REQUIRED = NO; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "POD_CONFIGURATION_DEBUG=1", + "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 = 11.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/; + STRIP_INSTALLED_PRODUCT = NO; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SYMROOT = "${SRCROOT}/../build"; + }; + name = Debug; + }; + 83A140B394EA83BC82EF1954F3D63594 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 14CC8C25872857E2437A3EB145237BC0 /* Pods-e-shopUITests.debug.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-e-shopUITests/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-e-shopUITests/Pods-e-shopUITests.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = Pods_e_shopUITests; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 857DBD6546331AF5FCDFDFF0113998A0 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = ACD534ACF774326E0F7220A607FE4738 /* Pods-e-shopTests.release.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-e-shopTests/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-e-shopTests/Pods-e-shopTests.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = Pods_e_shopTests; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 8D676FEE0738C5DE0D919402F7430E6F /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 5B4B6A3653A4DE2CF6421EDA25D3A543 /* Braintree.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/Braintree/Braintree-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Braintree/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/Braintree/Braintree.modulemap"; + PRODUCT_NAME = Braintree; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + BB15FEABE40382583D0E386F40DC6179 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 5B4B6A3653A4DE2CF6421EDA25D3A543 /* Braintree.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = "iPhone Developer"; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Braintree"; + INFOPLIST_FILE = "Target Support Files/Braintree/ResourceBundle-Braintree-UI-Localization-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + PRODUCT_NAME = "Braintree-UI-Localization"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Debug; + }; + C0DB58D3754094DD93044D21CDA169A6 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 1DFCC9C897110F540B125AF084648C47 /* Pods-e-shopTests.debug.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-e-shopTests/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-e-shopTests/Pods-e-shopTests.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = Pods_e_shopTests; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + C59448BD7D43C1A5B983818D60629756 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 5B4B6A3653A4DE2CF6421EDA25D3A543 /* Braintree.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/Braintree/Braintree-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Braintree/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/Braintree/Braintree.modulemap"; + PRODUCT_NAME = Braintree; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + CF4D675A39ED45F1C7C53B12F5679863 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 388BECC735B9D25364849EA98E582665 /* Pods-e-shopUITests.release.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-e-shopUITests/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-e-shopUITests/Pods-e-shopUITests.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = Pods_e_shopUITests; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + F4A9004E3448EE495A432F9358B9ACFB /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 5B4B6A3653A4DE2CF6421EDA25D3A543 /* Braintree.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = "iPhone Developer"; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Braintree"; + INFOPLIST_FILE = "Target Support Files/Braintree/ResourceBundle-Braintree-UI-Localization-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + PRODUCT_NAME = "Braintree-UI-Localization"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 59F0302F2371FCC6B73EF0A418D40734 /* Debug */, + 12C4B864767C59600DBFA238F1E2F8BC /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 745C63AD1066659184D2430762B2A763 /* Build configuration list for PBXNativeTarget "Braintree-Braintree-Drop-In-Localization" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 0916F9EF9EBDE5852ECFEA5F322DDD7B /* Debug */, + 3C15010BD3CC09531622BCFF9D1FD44D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 95AC0B65C56A945798EDB0747BD98A9D /* Build configuration list for PBXNativeTarget "Braintree-Braintree-UI-Localization" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BB15FEABE40382583D0E386F40DC6179 /* Debug */, + F4A9004E3448EE495A432F9358B9ACFB /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + ACCBDCCFD925D3A8A2EDC5B4532BBCE9 /* Build configuration list for PBXNativeTarget "Braintree" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C59448BD7D43C1A5B983818D60629756 /* Debug */, + 8D676FEE0738C5DE0D919402F7430E6F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + B4686FFFFDC280590C8FECE50E3BEF5D /* Build configuration list for PBXNativeTarget "Pods-e-shopTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C0DB58D3754094DD93044D21CDA169A6 /* Debug */, + 857DBD6546331AF5FCDFDFF0113998A0 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + E14E204FB69EB54EAFB6AC0BE099BA7D /* Build configuration list for PBXNativeTarget "Pods-e-shopUITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 83A140B394EA83BC82EF1954F3D63594 /* Debug */, + CF4D675A39ED45F1C7C53B12F5679863 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + E7307C0CEA7B3363D461FBC3978EE049 /* Build configuration list for PBXNativeTarget "Pods-e-shop" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 193D345F53E3CFB84DC3625EE5AB9D9A /* Debug */, + 2E23C48C09C7731B4F86460BD93E0A32 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + F825C672CA7E6EE2A36A6EAF1A79D61E /* Build configuration list for PBXNativeTarget "SwiftSpinner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 5954C6BB653E988DAFA1C7158A0947FA /* Debug */, + 03430C125DE286EE1D7389C191D1559F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = D41D8CD98F00B204E9800998ECF8427E /* Project object */; +} diff --git a/Pods/Pods.xcodeproj/xcuserdata/surendrakumar.xcuserdatad/xcschemes/Braintree-Braintree-Drop-In-Localization.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/surendrakumar.xcuserdatad/xcschemes/Braintree-Braintree-Drop-In-Localization.xcscheme new file mode 100644 index 0000000..9d01a23 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/surendrakumar.xcuserdatad/xcschemes/Braintree-Braintree-Drop-In-Localization.xcscheme @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/surendrakumar.xcuserdatad/xcschemes/Braintree-Braintree-UI-Localization.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/surendrakumar.xcuserdatad/xcschemes/Braintree-Braintree-UI-Localization.xcscheme new file mode 100644 index 0000000..05bafb6 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/surendrakumar.xcuserdatad/xcschemes/Braintree-Braintree-UI-Localization.xcscheme @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/surendrakumar.xcuserdatad/xcschemes/Braintree.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/surendrakumar.xcuserdatad/xcschemes/Braintree.xcscheme new file mode 100644 index 0000000..2949585 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/surendrakumar.xcuserdatad/xcschemes/Braintree.xcscheme @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/surendrakumar.xcuserdatad/xcschemes/Pods-e-shop.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/surendrakumar.xcuserdatad/xcschemes/Pods-e-shop.xcscheme new file mode 100644 index 0000000..de757a2 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/surendrakumar.xcuserdatad/xcschemes/Pods-e-shop.xcscheme @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/surendrakumar.xcuserdatad/xcschemes/Pods-e-shopTests.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/surendrakumar.xcuserdatad/xcschemes/Pods-e-shopTests.xcscheme new file mode 100644 index 0000000..e6b6162 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/surendrakumar.xcuserdatad/xcschemes/Pods-e-shopTests.xcscheme @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/surendrakumar.xcuserdatad/xcschemes/Pods-e-shopUITests.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/surendrakumar.xcuserdatad/xcschemes/Pods-e-shopUITests.xcscheme new file mode 100644 index 0000000..cb426b4 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/surendrakumar.xcuserdatad/xcschemes/Pods-e-shopUITests.xcscheme @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/surendrakumar.xcuserdatad/xcschemes/SwiftSpinner.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/surendrakumar.xcuserdatad/xcschemes/SwiftSpinner.xcscheme new file mode 100644 index 0000000..642ac29 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/surendrakumar.xcuserdatad/xcschemes/SwiftSpinner.xcscheme @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/surendrakumar.xcuserdatad/xcschemes/xcschememanagement.plist b/Pods/Pods.xcodeproj/xcuserdata/surendrakumar.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..9e4fad0 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/surendrakumar.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,60 @@ + + + + + SchemeUserState + + Braintree-Braintree-Drop-In-Localization.xcscheme + + isShown + + orderHint + 1 + + Braintree-Braintree-UI-Localization.xcscheme + + isShown + + orderHint + 2 + + Braintree.xcscheme + + isShown + + orderHint + 0 + + Pods-e-shop.xcscheme + + isShown + + orderHint + 3 + + Pods-e-shopTests.xcscheme + + isShown + + orderHint + 4 + + Pods-e-shopUITests.xcscheme + + isShown + + orderHint + 5 + + SwiftSpinner.xcscheme + + isShown + + orderHint + 6 + + + SuppressBuildableAutocreation + + + diff --git a/Pods/SwiftSpinner/LICENSE b/Pods/SwiftSpinner/LICENSE new file mode 100644 index 0000000..bbe5874 --- /dev/null +++ b/Pods/SwiftSpinner/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2015 Marin Todorov + +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/SwiftSpinner/README.md b/Pods/SwiftSpinner/README.md new file mode 100644 index 0000000..661861e --- /dev/null +++ b/Pods/SwiftSpinner/README.md @@ -0,0 +1,160 @@ +# SwiftSpinner + +[![Version](https://img.shields.io/cocoapods/v/SwiftSpinner.svg?style=flat)](http://cocoadocs.org/docsets/SwiftSpinner) +[![License](https://img.shields.io/cocoapods/l/SwiftSpinner.svg?style=flat)](http://cocoadocs.org/docsets/SwiftSpinner) +[![Platform](https://img.shields.io/cocoapods/p/SwiftSpinner.svg?style=flat)](http://cocoadocs.org/docsets/SwiftSpinner) + +SwiftSpinner is an extra beautiful activity indicator with plain and bold style fitting iOS 8 design very well. It uses dynamic blur and translucency to overlay the current screen contents and display an activity indicator with text (or the so called “spinner”). + +SwiftSpinner is now **swift3**. +- - - + +I developed it for my Swift app called **Doodle Doodle** and wanted to share it with everyone. + +This is how the activity looks like (from the demo app): + +![SwiftSpinner Screenshot](https://raw.githubusercontent.com/icanzilb/SwiftSpinner/master/etc/spinner-preview.gif) + +## Usage + +To run the example project, clone the repo, and run `pod install` from the DemoApp directory first. That’ll run the demo program which shows you how the spinner looks like and what it can do. + +#### Code samples + +The simple code to get `SwiftSpinner` running in your own app. + + * In case you installed SwiftSpinner via CocoaPods you need to import it (add this somewhere at the top of your source code file): + +```swift + import SwiftSpinner +``` + + * When you want to show an animated activity (eg. rings are randomly rotating around): + +```swift + SwiftSpinner.show("Connecting to satellite...") +``` + + * If you want to show a static activity indicator (eg. a message with two complete rings around it) + +```swift + SwiftSpinner.show("Failed to connect, waiting...", animated: false) +``` + + * When you want to hide the activity: + +```swift + SwiftSpinner.hide() +``` + +In case you want to do something after the hiding animation completes you can provide a closure to the `hide()` method: + +```swift + SwiftSpinner.hide({ + //do stuff + }) +``` + + +That's all. If you want to change the text of the current activity, just call `show(...)` again, this will animate the old text into the new text. + +## Beyond the basics + +If you are using `SwiftSpinner` to show an alert message you can also easily add a dismiss handler: + +```swift + SwiftSpinner.show("Connecting \nto satellite...").addTapHandler({ + SwiftSpinner.hide() + }) +``` + +Or even add a subtitle to let the user know they can tap to do stuff: + +```swift + SwiftSpinner.show("Connecting \nto satellite...").addTapHandler({ + SwiftSpinner.hide() + }, subtitle: "Tap to hide while connecting! This will affect only the current operation.") +``` + +In case you want to adjust the font of the spinner title: + +```swift + SwiftSpinner.setTitleFont(UIFont(name: "Futura", size: 22.0)) +``` + +To reset back to the default font: + +```swift + SwiftSpinner.setTitleFont(nil) +``` + +In case you want to change an arbitrary aspect of the text on screen access directly: + +```swift + SwiftSpinner.sharedInstance.titleLabel + SwiftSpinner.sharedInstance.subtitleLabel +``` + +You can show a spinner only if certain amount of time has passed (e.g. if you are downloading a file - show a message only if the operation takes longer than certain amount of time): + +```swift + SwiftSpinner.show(delay: 2.0, title: "It's taking longer than expected") +``` + +If you call `show(…)` or `hide()` before the `delay` time has passed - this will clear the call to `show(delay: …)`. + +You show a message for a certain duration: +```swift + SwiftSpinner.show(duration: 4.0, title: "It's taking longer than expected") +``` + +Or you can use `SwiftSpinner` as a progress bar by directly setting the current progress like so: + +```swift + SwiftSpinner.show(progress: 0.2, title: "Downloading Data...") // 20% trough the process +``` + +## Requirements + +UIKit must be imported. If you are using SwiftSpinner in an App Extension, you must add `EXTENSION` to your `Other Swift Flags` Build Settings. + +![Extension Setting Screenshot](https://user-images.githubusercontent.com/444725/26855417-a7a8241a-4acf-11e7-8528-b37a28448113.png) + +## Installation + +`SwiftSpinner` is available through [CocoaPods](http://cocoapods.org). To install +it, simply add the following line to your Podfile: + +``` + pod "SwiftSpinner" +``` + +In case you don’t want to use CocoaPods - just copy the file **SwiftSpinner/SwiftSpinner.swift** to your Xcode project. + +Credit +======== + +Author: **Marin Todorov** + +* [http://www.underplot.com](http://www.underplot.com) +* [https://twitter.com/icanzilb](https://twitter.com/icanzilb) + +More about Marin: + + + + + + +
+
+iOS Animations by Tutorials, Author
+
+
+iOS Animations by Emails Newsletter, Author
+
+ +## License + +`SwiftSpinner` is available under the MIT license. See the LICENSE file for more info. + diff --git a/Pods/SwiftSpinner/SwiftSpinner/SwiftSpinner.h b/Pods/SwiftSpinner/SwiftSpinner/SwiftSpinner.h new file mode 100644 index 0000000..aefab26 --- /dev/null +++ b/Pods/SwiftSpinner/SwiftSpinner/SwiftSpinner.h @@ -0,0 +1,19 @@ +// +// SwiftSpinner.h +// SwiftSpinner +// +// Created by Doug Woodgate (GE) on 2/19/16. +// Copyright © 2016 Dwoodgate. All rights reserved. +// + +#import + +//! Project version number for SwiftSpinner. +FOUNDATION_EXPORT double SwiftSpinnerVersionNumber; + +//! Project version string for SwiftSpinner. +FOUNDATION_EXPORT const unsigned char SwiftSpinnerVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + diff --git a/Pods/SwiftSpinner/SwiftSpinner/SwiftSpinner.swift b/Pods/SwiftSpinner/SwiftSpinner/SwiftSpinner.swift new file mode 100644 index 0000000..5b7d336 --- /dev/null +++ b/Pods/SwiftSpinner/SwiftSpinner/SwiftSpinner.swift @@ -0,0 +1,505 @@ +// +// Copyright (c) 2015-present Marin Todorov, Underplot ltd. +// This code is distributed under the terms and conditions of the MIT license. +// +// 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 UIKit + +public class SwiftSpinner: UIView { + // MARK: - Singleton + + // + // Access the singleton instance + // + public class var sharedInstance: SwiftSpinner { + struct Singleton { + static let instance = SwiftSpinner(frame: CGRect.zero) + } + return Singleton.instance + } + + // MARK: - Init + + // + // Custom init to build the spinner UI + // + + public override init(frame: CGRect) { + + currentTitleFont = defaultTitleFont // By default we initialize to the same. + + super.init(frame: frame) + + blurEffect = UIBlurEffect(style: blurEffectStyle) + blurView = UIVisualEffectView() + addSubview(blurView) + + vibrancyView = UIVisualEffectView(effect: UIVibrancyEffect(blurEffect: blurEffect)) + addSubview(vibrancyView) + + let titleScale: CGFloat = 0.85 + titleLabel.frame.size = CGSize(width: frameSize.width * titleScale, height: frameSize.height * titleScale) + titleLabel.font = currentTitleFont + titleLabel.numberOfLines = 0 + titleLabel.textAlignment = .center + titleLabel.lineBreakMode = .byWordWrapping + titleLabel.adjustsFontSizeToFitWidth = true + titleLabel.textColor = UIColor.white + + + blurView.contentView.addSubview(titleLabel) + blurView.contentView.addSubview(vibrancyView) + + outerCircleView.frame.size = frameSize + + outerCircle.path = UIBezierPath(ovalIn: CGRect(x: 0.0, y: 0.0, width: frameSize.width, height: frameSize.height)).cgPath + outerCircle.lineWidth = 8.0 + outerCircle.strokeStart = 0.0 + outerCircle.strokeEnd = 0.45 + outerCircle.lineCap = kCALineCapRound + outerCircle.fillColor = UIColor.clear.cgColor + outerCircle.strokeColor = outerCircleDefaultColor + outerCircleView.layer.addSublayer(outerCircle) + + outerCircle.strokeStart = 0.0 + outerCircle.strokeEnd = 1.0 + + blurView.contentView.addSubview(outerCircleView) + + innerCircleView.frame.size = frameSize + + let innerCirclePadding: CGFloat = 12 + innerCircle.path = UIBezierPath(ovalIn: CGRect(x: innerCirclePadding, y: innerCirclePadding, width: frameSize.width - 2*innerCirclePadding, height: frameSize.height - 2*innerCirclePadding)).cgPath + innerCircle.lineWidth = 4.0 + innerCircle.strokeStart = 0.5 + innerCircle.strokeEnd = 0.9 + innerCircle.lineCap = kCALineCapRound + innerCircle.fillColor = UIColor.clear.cgColor + innerCircle.strokeColor = innerCircleDefaultColor + innerCircleView.layer.addSublayer(innerCircle) + + innerCircle.strokeStart = 0.0 + innerCircle.strokeEnd = 1.0 + + blurView.contentView.addSubview(innerCircleView) + + isUserInteractionEnabled = true + } + + public override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { + return self + } + + // MARK: - Public interface + + public lazy var titleLabel = UILabel() + public var subtitleLabel: UILabel? + + private let outerCircleDefaultColor = UIColor.white.cgColor + fileprivate var _outerColor: UIColor? + public var outerColor: UIColor? { + get { return _outerColor } + set(newColor) { + _outerColor = newColor + outerCircle.strokeColor = newColor?.cgColor ?? outerCircleDefaultColor + } + } + + private let innerCircleDefaultColor = UIColor.gray.cgColor + fileprivate var _innerColor: UIColor? + public var innerColor: UIColor? { + get { return _innerColor } + set(newColor) { + _innerColor = newColor + innerCircle.strokeColor = newColor?.cgColor ?? innerCircleDefaultColor + } + } + + // + // Custom superview for the spinner + // + private static weak var customSuperview: UIView? = nil + private static func containerView() -> UIView? { + + #if EXTENSION + return customSuperview + #else + return customSuperview ?? UIApplication.shared.keyWindow + #endif + } + public class func useContainerView(_ sv: UIView?) { + customSuperview = sv + } + + // + // Show the spinner activity on screen, if visible only update the title + // + @discardableResult + public class func show(_ title: String, animated: Bool = true) -> SwiftSpinner { + + let spinner = SwiftSpinner.sharedInstance + + spinner.clearTapHandler() + + spinner.updateFrame() + + if spinner.superview == nil { + //show the spinner + spinner.blurView.contentView.alpha = 0 + + guard let containerView = containerView() else { + #if EXTENSION + fatalError("\n`containerView` is `nil`. `UIApplication.keyWindow` is not available in extensions and so, a containerView is required. Use `useContainerView` to set a view where the spinner should show") + #else + fatalError("\n`UIApplication.keyWindow` is `nil`. If you're trying to show a spinner from your view controller's `viewDidLoad` method, do that from `viewWillAppear` instead. Alternatively use `useContainerView` to set a view where the spinner should show") + #endif + } + + containerView.addSubview(spinner) + + UIView.animate(withDuration: 0.33, delay: 0.0, options: .curveEaseOut, animations: { + + spinner.blurView.contentView.alpha = 1 + spinner.blurView.effect = spinner.blurEffect + + }, completion: nil) + + #if os(iOS) + // Orientation change observer + NotificationCenter.default.addObserver( + spinner, + selector: #selector(SwiftSpinner.updateFrame), + name: NSNotification.Name.UIApplicationDidChangeStatusBarOrientation, + object: nil) + #endif + } + + spinner.title = title + spinner.animating = animated + + return spinner + } + + // + // Show the spinner activity on screen with duration, if visible only update the title + // + @discardableResult + public class func show(duration: Double, title: String, animated: Bool = true) -> SwiftSpinner { + let spinner = SwiftSpinner.show(title, animated: animated) + spinner.delay(duration) { + SwiftSpinner.hide() + } + return spinner + } + + private static var delayedTokens = [String]() + // + // Show the spinner activity on screen, after delay. If new call to show, + // showWithDelay or hide is maked before execution this call is discarded + // + public class func show(delay: Double, title: String, animated: Bool = true) { + let token = UUID().uuidString + delayedTokens.append(token) + SwiftSpinner.sharedInstance.delay(delay, completion: { + if let index = delayedTokens.index(of: token) { + delayedTokens.remove(at: index) + _ = SwiftSpinner.show(title, animated: animated) + } + }) + } + + /// + /// Show the spinner with the outer circle representing progress (0 to 1) + /// + @discardableResult + public class func show(progress: Double, title: String) -> SwiftSpinner { + let spinner = SwiftSpinner.show(title, animated: false) + spinner.outerCircle.strokeEnd = CGFloat(progress) + return spinner + } + + // + // Hide the spinner + // + public static var hideCancelsScheduledSpinners = true + public class func hide(_ completion: (() -> Void)? = nil) { + + let spinner = SwiftSpinner.sharedInstance + + NotificationCenter.default.removeObserver(spinner) + if hideCancelsScheduledSpinners { + delayedTokens.removeAll() + } + + DispatchQueue.main.async(execute: { + spinner.clearTapHandler() + + if spinner.superview == nil { + return + } + + UIView.animate(withDuration: 0.33, delay: 0.0, options: .curveEaseOut, animations: { + + spinner.blurView.contentView.alpha = 0 + spinner.blurView.effect = nil + + }, completion: {_ in + spinner.blurView.contentView.alpha = 1 + spinner.removeFromSuperview() + spinner.titleLabel.text = nil + + completion?() + }) + + spinner.animating = false + }) + } + + // + // Set the default title font + // + public class func setTitleFont(_ font: UIFont?) { + let spinner = SwiftSpinner.sharedInstance + + if let font = font { + spinner.currentTitleFont = font + spinner.titleLabel.font = font + } else { + spinner.currentTitleFont = spinner.defaultTitleFont + spinner.titleLabel.font = spinner.defaultTitleFont + } + } + + // + // Set the default title color + // + public class func setTitleColor(_ color: UIColor?) { + let spinner = SwiftSpinner.sharedInstance + + if let color = color { + spinner.titleLabel.textColor = color + } else { + spinner.titleLabel.textColor = spinner.defaultTitleColor + } + } + + // + // The spinner title + // + public var title: String = "" { + didSet { + let spinner = SwiftSpinner.sharedInstance + + guard spinner.animating else { + spinner.titleLabel.transform = CGAffineTransform.identity + spinner.titleLabel.alpha = 1.0 + spinner.titleLabel.text = self.title + return + } + + UIView.animate(withDuration: 0.15, delay: 0.0, options: .curveEaseOut, animations: { + spinner.titleLabel.transform = CGAffineTransform(scaleX: 0.75, y: 0.75) + spinner.titleLabel.alpha = 0.2 + }, completion: {_ in + spinner.titleLabel.text = self.title + UIView.animate(withDuration: 0.35, delay: 0.0, usingSpringWithDamping: 0.35, initialSpringVelocity: 0.0, options: [], animations: { + spinner.titleLabel.transform = CGAffineTransform.identity + spinner.titleLabel.alpha = 1.0 + }, completion: nil) + }) + } + } + + // + // observe the view frame and update the subviews layout + // + public override var frame: CGRect { + didSet { + if frame == CGRect.zero { + return + } + blurView.frame = bounds + vibrancyView.frame = blurView.bounds + titleLabel.center = vibrancyView.center + outerCircleView.center = vibrancyView.center + innerCircleView.center = vibrancyView.center + if let subtitle = subtitleLabel { + subtitle.bounds.size = subtitle.sizeThatFits(bounds.insetBy(dx: 20.0, dy: 0.0).size) + subtitle.center = CGPoint(x: bounds.midX, y: bounds.maxY - subtitle.bounds.midY - subtitle.font.pointSize) + } + } + } + + // + // Start the spinning animation + // + + public var animating: Bool = false { + + willSet (shouldAnimate) { + if shouldAnimate && !animating { + spinInner() + spinOuter() + } + } + + didSet { + // update UI + if animating { + self.outerCircle.strokeStart = 0.0 + self.outerCircle.strokeEnd = 0.45 + self.innerCircle.strokeStart = 0.5 + self.innerCircle.strokeEnd = 0.9 + } else { + self.outerCircle.strokeStart = 0.0 + self.outerCircle.strokeEnd = 1.0 + self.innerCircle.strokeStart = 0.0 + self.innerCircle.strokeEnd = 1.0 + } + } + } + + // + // Tap handler + // + public func addTapHandler(_ tap: @escaping (()->()), subtitle subtitleText: String? = nil) { + clearTapHandler() + + //vibrancyView.contentView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: Selector("didTapSpinner"))) + tapHandler = tap + + if subtitleText != nil { + subtitleLabel = UILabel() + if let subtitle = subtitleLabel { + subtitle.text = subtitleText + subtitle.font = UIFont(name: self.currentTitleFont.familyName, size: currentTitleFont.pointSize * 0.8) + subtitle.textColor = UIColor.white + subtitle.numberOfLines = 0 + subtitle.textAlignment = .center + subtitle.lineBreakMode = .byWordWrapping + subtitle.bounds.size = subtitle.sizeThatFits(bounds.insetBy(dx: 20.0, dy: 0.0).size) + subtitle.center = CGPoint(x: bounds.midX, y: bounds.maxY - subtitle.bounds.midY - subtitle.font.pointSize) + vibrancyView.contentView.addSubview(subtitle) + } + } + } + + public override func touchesBegan(_ touches: Set, with event: UIEvent?) { + super.touchesBegan(touches, with: event) + + if tapHandler != nil { + tapHandler?() + tapHandler = nil + } + } + + public func clearTapHandler() { + isUserInteractionEnabled = false + subtitleLabel?.removeFromSuperview() + tapHandler = nil + } + + // MARK: - Private interface + + // + // layout elements + // + + private var blurEffectStyle: UIBlurEffectStyle = .dark + private var blurEffect: UIBlurEffect! + private var blurView: UIVisualEffectView! + private var vibrancyView: UIVisualEffectView! + + private let defaultTitleFont = UIFont(name: "HelveticaNeue", size: 22.0)! + private var currentTitleFont : UIFont + + private var defaultTitleColor = UIColor.white + + let frameSize = CGSize(width: 200.0, height: 200.0) + + private lazy var outerCircleView = UIView() + private lazy var innerCircleView = UIView() + + private let outerCircle = CAShapeLayer() + private let innerCircle = CAShapeLayer() + + required public init?(coder aDecoder: NSCoder) { + fatalError("Not coder compliant") + } + + private var currentOuterRotation: CGFloat = 0.0 + private var currentInnerRotation: CGFloat = 0.1 + + private func spinOuter() { + + if superview == nil { + return + } + + let duration = Double(Float(arc4random()) / Float(UInt32.max)) * 2.0 + 1.5 + let randomRotation = Double(Float(arc4random()) / Float(UInt32.max)) * (Double.pi / 4) + (Double.pi / 4) + + //outer circle + UIView.animate(withDuration: duration, delay: 0.0, usingSpringWithDamping: 0.4, initialSpringVelocity: 0.0, options: [], animations: { + self.currentOuterRotation -= CGFloat(randomRotation) + self.outerCircleView.transform = CGAffineTransform(rotationAngle: self.currentOuterRotation) + }, completion: {_ in + let waitDuration = Double(Float(arc4random()) / Float(UInt32.max)) * 1.0 + 1.0 + self.delay(waitDuration, completion: { + if self.animating { + self.spinOuter() + } + }) + }) + } + + private func spinInner() { + if superview == nil { + return + } + + //inner circle + UIView.animate(withDuration: 0.5, delay: 0.0, usingSpringWithDamping: 0.5, initialSpringVelocity: 0.0, options: [], animations: { + self.currentInnerRotation += CGFloat(Double.pi / 4) + self.innerCircleView.transform = CGAffineTransform(rotationAngle: self.currentInnerRotation) + }, completion: {_ in + self.delay(0.5, completion: { + if self.animating { + self.spinInner() + } + }) + }) + } + + @objc public func updateFrame() { + if let containerView = SwiftSpinner.containerView() { + SwiftSpinner.sharedInstance.frame = containerView.bounds + containerView.bringSubview(toFront: SwiftSpinner.sharedInstance) + } + } + + // MARK: - Util methods + + func delay(_ seconds: Double, completion:@escaping ()->()) { + let popTime = DispatchTime.now() + Double(Int64( Double(NSEC_PER_SEC) * seconds )) / Double(NSEC_PER_SEC) + + DispatchQueue.main.asyncAfter(deadline: popTime) { + completion() + } + } + + override public func layoutSubviews() { + super.layoutSubviews() + updateFrame() + } + + // MARK: - Tap handler + private var tapHandler: (()->())? + func didTapSpinner() { + tapHandler?() + } +} diff --git a/Pods/Target Support Files/Braintree/Braintree-dummy.m b/Pods/Target Support Files/Braintree/Braintree-dummy.m new file mode 100644 index 0000000..f34e4bc --- /dev/null +++ b/Pods/Target Support Files/Braintree/Braintree-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Braintree : NSObject +@end +@implementation PodsDummy_Braintree +@end diff --git a/Pods/Target Support Files/Braintree/Braintree-prefix.pch b/Pods/Target Support Files/Braintree/Braintree-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/Pods/Target Support Files/Braintree/Braintree-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/Pods/Target Support Files/Braintree/Braintree-umbrella.h b/Pods/Target Support Files/Braintree/Braintree-umbrella.h new file mode 100644 index 0000000..6547cb8 --- /dev/null +++ b/Pods/Target Support Files/Braintree/Braintree-umbrella.h @@ -0,0 +1,111 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + +#import "Braintree.h" +#import "Braintree_Internal.h" +#import "Braintree-API.h" +#import "Braintree-Version.h" +#import "BTApplePayPaymentMethod.h" +#import "BTAppSwitchErrors.h" +#import "BTAppSwitching.h" +#import "BTAppSwitchingDelegate.h" +#import "BTCardPaymentMethod.h" +#import "BTClient+Offline.h" +#import "BTClient+Testing.h" +#import "BTClient.h" +#import "BTClientCardRequest.h" +#import "BTClientCardTokenizationRequest.h" +#import "BTClientToken.h" +#import "BTCoinbasePaymentMethod.h" +#import "BTErrors.h" +#import "BTLogger.h" +#import "BTPaymentMethod.h" +#import "BTPayPalPaymentMethod.h" +#import "BTPostalAddress.h" +#import "Braintree-Coinbase.h" +#import "BTCoinbase.h" +#import "BTDropInContentView.h" +#import "BTDropInErrorAlert.h" +#import "BTDropInErrorState.h" +#import "BTDropInSelectPaymentMethodViewController.h" +#import "BTDropInUtil.h" +#import "BTDropInViewController.h" +#import "BTPaymentButton.h" +#import "BTDropInLocalizedString.h" +#import "Braintree-PayPal.h" +#import "BTClient+BTPayPal.h" +#import "BTErrors+BTPayPal.h" +#import "BTPayPalButton.h" +#import "BTPayPalViewController.h" +#import "Braintree-Payments.h" +#import "BTPaymentMethodCreationDelegate.h" +#import "BTPaymentProvider.h" +#import "BTPaymentProviderErrors.h" +#import "Braintree-Payments-UI.h" +#import "BTUIPaymentMethodType.h" +#import "BTUILocalizedString.h" +#import "BTUICardExpirationValidator.h" +#import "BTUICardExpiryFormat.h" +#import "BTUICardType.h" +#import "BTUIUtil.h" +#import "BTUI.h" +#import "UIColor+BTUI.h" +#import "BTMockApplePayPaymentAuthorizationView.h" +#import "BTMockApplePayPaymentAuthorizationViewController.h" +#import "BTUIViewUtil.h" +#import "BTUIHorizontalButtonStackCollectionViewFlowLayout.h" +#import "BTUIHorizontalButtonStackSeparatorLineView.h" +#import "BTUIPaymentButtonCollectionViewCell.h" +#import "BTUIFloatLabel.h" +#import "BTUIFormField.h" +#import "BTUIFormField_Protected.h" +#import "BTUIScrollView.h" +#import "BTUITextField.h" +#import "BTUIThemedView.h" +#import "BTUIVectorArtView.h" +#import "BTUICardCvvField.h" +#import "BTUICardExpiryField.h" +#import "BTUICardNumberField.h" +#import "BTUICardPostalCodeField.h" +#import "BTUICardFormView.h" +#import "BTUICardHint.h" +#import "BTUICoinbaseButton.h" +#import "BTUICTAControl.h" +#import "BTUIPaymentMethodView.h" +#import "BTUIPayPalButton.h" +#import "BTUISummaryView.h" +#import "BTUIVenmoButton.h" +#import "BTUIAmExVectorArtView.h" +#import "BTUICardVectorArtView.h" +#import "BTUICoinbaseMonogramCardView.h" +#import "BTUICoinbaseWordmarkVectorArtView.h" +#import "BTUICVVBackVectorArtView.h" +#import "BTUICVVFrontVectorArtView.h" +#import "BTUIDinersClubVectorArtView.h" +#import "BTUIDiscoverVectorArtView.h" +#import "BTUIJCBVectorArtView.h" +#import "BTUIMaestroVectorArtView.h" +#import "BTUIMasterCardVectorArtView.h" +#import "BTUIPayPalMonogramCardView.h" +#import "BTUIPayPalWordmarkVectorArtView.h" +#import "BTUIUnknownCardVectorArtView.h" +#import "BTUIVenmoWordmarkVectorArtView.h" +#import "BTUIVisaVectorArtView.h" +#import "BTClient+BTVenmo.h" +#import "BTVenmoAppSwitchHandler.h" +#import "BTVenmoAppSwitchHandler_Internal.h" +#import "BTVenmoAppSwitchRequestURL.h" +#import "BTVenmoAppSwitchReturnURL.h" + +FOUNDATION_EXPORT double BraintreeVersionNumber; +FOUNDATION_EXPORT const unsigned char BraintreeVersionString[]; + diff --git a/Pods/Target Support Files/Braintree/Braintree.modulemap b/Pods/Target Support Files/Braintree/Braintree.modulemap new file mode 100644 index 0000000..1e11588 --- /dev/null +++ b/Pods/Target Support Files/Braintree/Braintree.modulemap @@ -0,0 +1,6 @@ +framework module Braintree { + umbrella header "Braintree-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/Braintree/Braintree.xcconfig b/Pods/Target Support Files/Braintree/Braintree.xcconfig new file mode 100644 index 0000000..a7b3fc2 --- /dev/null +++ b/Pods/Target Support Files/Braintree/Braintree.xcconfig @@ -0,0 +1,11 @@ +CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/Braintree +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" +LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Braintree/Braintree/PayPal/mSDK" +OTHER_LDFLAGS = -ObjC -l"PayPalMobile-BT" -l"c++" -framework "AVFoundation" -framework "Accelerate" -framework "AddressBook" -framework "AudioToolbox" -framework "CoreLocation" -framework "CoreMedia" -framework "MessageUI" -framework "MobileCoreServices" -framework "SystemConfiguration" -framework "UIKit" -weak_framework "PassKit" +PODS_BUILD_DIR = $BUILD_DIR +PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/Braintree +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/Braintree/Info.plist b/Pods/Target Support Files/Braintree/Info.plist new file mode 100644 index 0000000..85643eb --- /dev/null +++ b/Pods/Target Support Files/Braintree/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 3.9.9 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/Braintree/ResourceBundle-Braintree-Drop-In-Localization-Info.plist b/Pods/Target Support Files/Braintree/ResourceBundle-Braintree-Drop-In-Localization-Info.plist new file mode 100644 index 0000000..129fcf9 --- /dev/null +++ b/Pods/Target Support Files/Braintree/ResourceBundle-Braintree-Drop-In-Localization-Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + BNDL + CFBundleShortVersionString + 3.9.9 + CFBundleSignature + ???? + CFBundleVersion + 1 + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/Braintree/ResourceBundle-Braintree-UI-Localization-Info.plist b/Pods/Target Support Files/Braintree/ResourceBundle-Braintree-UI-Localization-Info.plist new file mode 100644 index 0000000..129fcf9 --- /dev/null +++ b/Pods/Target Support Files/Braintree/ResourceBundle-Braintree-UI-Localization-Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + BNDL + CFBundleShortVersionString + 3.9.9 + CFBundleSignature + ???? + CFBundleVersion + 1 + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/Pods-e-shop/Info.plist b/Pods/Target Support Files/Pods-e-shop/Info.plist new file mode 100644 index 0000000..2243fe6 --- /dev/null +++ b/Pods/Target Support Files/Pods-e-shop/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/Pods-e-shop/Pods-e-shop-acknowledgements.markdown b/Pods/Target Support Files/Pods-e-shop/Pods-e-shop-acknowledgements.markdown new file mode 100644 index 0000000..f0934a0 --- /dev/null +++ b/Pods/Target Support Files/Pods-e-shop/Pods-e-shop-acknowledgements.markdown @@ -0,0 +1,49 @@ +# Acknowledgements +This application makes use of the following third party libraries: + +## Braintree + +Copyright (c) 2015 Braintree, a division of PayPal, Inc. + +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. + + +## SwiftSpinner + +Copyright (c) 2015 Marin Todorov + +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. + +Generated by CocoaPods - https://cocoapods.org diff --git a/Pods/Target Support Files/Pods-e-shop/Pods-e-shop-acknowledgements.plist b/Pods/Target Support Files/Pods-e-shop/Pods-e-shop-acknowledgements.plist new file mode 100644 index 0000000..fd8631a --- /dev/null +++ b/Pods/Target Support Files/Pods-e-shop/Pods-e-shop-acknowledgements.plist @@ -0,0 +1,87 @@ + + + + + PreferenceSpecifiers + + + FooterText + This application makes use of the following third party libraries: + Title + Acknowledgements + Type + PSGroupSpecifier + + + FooterText + Copyright (c) 2015 Braintree, a division of PayPal, Inc. + +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. + + License + MIT + Title + Braintree + Type + PSGroupSpecifier + + + FooterText + Copyright (c) 2015 Marin Todorov <touch-code-magazine@underplot.com> + +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. + + License + MIT + Title + SwiftSpinner + Type + PSGroupSpecifier + + + FooterText + Generated by CocoaPods - https://cocoapods.org + Title + + Type + PSGroupSpecifier + + + StringsTable + Acknowledgements + Title + Acknowledgements + + diff --git a/Pods/Target Support Files/Pods-e-shop/Pods-e-shop-dummy.m b/Pods/Target Support Files/Pods-e-shop/Pods-e-shop-dummy.m new file mode 100644 index 0000000..7886370 --- /dev/null +++ b/Pods/Target Support Files/Pods-e-shop/Pods-e-shop-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_e_shop : NSObject +@end +@implementation PodsDummy_Pods_e_shop +@end diff --git a/Pods/Target Support Files/Pods-e-shop/Pods-e-shop-frameworks.sh b/Pods/Target Support Files/Pods-e-shop/Pods-e-shop-frameworks.sh new file mode 100755 index 0000000..ff50f6f --- /dev/null +++ b/Pods/Target Support Files/Pods-e-shop/Pods-e-shop-frameworks.sh @@ -0,0 +1,114 @@ +#!/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}" + +# This protects against multiple targets copying the same framework dependency at the same time. The solution +# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html +RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") + +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 don't throw errors. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --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 +} + +# Copies the dSYM of a vendored framework +install_dsym() { + local source="$1" + if [ -r "$source" ]; then + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DWARF_DSYM_FOLDER_PATH}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DWARF_DSYM_FOLDER_PATH}" + 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}" + local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements '$1'" + + if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + code_sign_cmd="$code_sign_cmd &" + fi + echo "$code_sign_cmd" + eval "$code_sign_cmd" + 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 ! [[ "${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 +} + + +if [[ "$CONFIGURATION" == "Debug" ]]; then + install_framework "${BUILT_PRODUCTS_DIR}/Braintree/Braintree.framework" + install_framework "${BUILT_PRODUCTS_DIR}/SwiftSpinner/SwiftSpinner.framework" +fi +if [[ "$CONFIGURATION" == "Release" ]]; then + install_framework "${BUILT_PRODUCTS_DIR}/Braintree/Braintree.framework" + install_framework "${BUILT_PRODUCTS_DIR}/SwiftSpinner/SwiftSpinner.framework" +fi +if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + wait +fi diff --git a/Pods/Target Support Files/Pods-e-shop/Pods-e-shop-resources.sh b/Pods/Target Support Files/Pods-e-shop/Pods-e-shop-resources.sh new file mode 100755 index 0000000..a7df440 --- /dev/null +++ b/Pods/Target Support Files/Pods-e-shop/Pods-e-shop-resources.sh @@ -0,0 +1,106 @@ +#!/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=() + +# This protects against multiple targets copying the same framework dependency at the same time. The solution +# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html +RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") + +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" + ;; + 3) + TARGET_DEVICE_ARGS="--target-device tv" + ;; + 4) + TARGET_DEVICE_ARGS="--target-device watch" + ;; + *) + TARGET_DEVICE_ARGS="--target-device mac" + ;; +esac + +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}" || true + 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} ${TARGET_DEVICE_ARGS}" || true + 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}" ${TARGET_DEVICE_ARGS} + ;; + *.framework) + echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true + mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" "$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\"" || true + 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\"" || true + 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\"" || true + xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" + ;; + *.xcassets) + ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" + XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") + ;; + *) + echo "$RESOURCE_PATH" || true + 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 != "${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-e-shop/Pods-e-shop-umbrella.h b/Pods/Target Support Files/Pods-e-shop/Pods-e-shop-umbrella.h new file mode 100644 index 0000000..25b288f --- /dev/null +++ b/Pods/Target Support Files/Pods-e-shop/Pods-e-shop-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double Pods_e_shopVersionNumber; +FOUNDATION_EXPORT const unsigned char Pods_e_shopVersionString[]; + diff --git a/Pods/Target Support Files/Pods-e-shop/Pods-e-shop.debug.xcconfig b/Pods/Target Support Files/Pods-e-shop/Pods-e-shop.debug.xcconfig new file mode 100644 index 0000000..4d24750 --- /dev/null +++ b/Pods/Target Support Files/Pods-e-shop/Pods-e-shop.debug.xcconfig @@ -0,0 +1,11 @@ +ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES +FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Braintree" "$PODS_CONFIGURATION_BUILD_DIR/SwiftSpinner" +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/Braintree/Braintree.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/SwiftSpinner/SwiftSpinner.framework/Headers" +OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -framework "Braintree" -framework "SwiftSpinner" +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" +PODS_BUILD_DIR = $BUILD_DIR +PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. +PODS_ROOT = ${SRCROOT}/Pods diff --git a/Pods/Target Support Files/Pods-e-shop/Pods-e-shop.modulemap b/Pods/Target Support Files/Pods-e-shop/Pods-e-shop.modulemap new file mode 100644 index 0000000..21244c8 --- /dev/null +++ b/Pods/Target Support Files/Pods-e-shop/Pods-e-shop.modulemap @@ -0,0 +1,6 @@ +framework module Pods_e_shop { + umbrella header "Pods-e-shop-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/Pods-e-shop/Pods-e-shop.release.xcconfig b/Pods/Target Support Files/Pods-e-shop/Pods-e-shop.release.xcconfig new file mode 100644 index 0000000..4d24750 --- /dev/null +++ b/Pods/Target Support Files/Pods-e-shop/Pods-e-shop.release.xcconfig @@ -0,0 +1,11 @@ +ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES +FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Braintree" "$PODS_CONFIGURATION_BUILD_DIR/SwiftSpinner" +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/Braintree/Braintree.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/SwiftSpinner/SwiftSpinner.framework/Headers" +OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -framework "Braintree" -framework "SwiftSpinner" +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" +PODS_BUILD_DIR = $BUILD_DIR +PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. +PODS_ROOT = ${SRCROOT}/Pods diff --git a/Pods/Target Support Files/Pods-e-shopTests/Info.plist b/Pods/Target Support Files/Pods-e-shopTests/Info.plist new file mode 100644 index 0000000..2243fe6 --- /dev/null +++ b/Pods/Target Support Files/Pods-e-shopTests/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/Pods-e-shopTests/Pods-e-shopTests-acknowledgements.markdown b/Pods/Target Support Files/Pods-e-shopTests/Pods-e-shopTests-acknowledgements.markdown new file mode 100644 index 0000000..102af75 --- /dev/null +++ b/Pods/Target Support Files/Pods-e-shopTests/Pods-e-shopTests-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-e-shopTests/Pods-e-shopTests-acknowledgements.plist b/Pods/Target Support Files/Pods-e-shopTests/Pods-e-shopTests-acknowledgements.plist new file mode 100644 index 0000000..7acbad1 --- /dev/null +++ b/Pods/Target Support Files/Pods-e-shopTests/Pods-e-shopTests-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-e-shopTests/Pods-e-shopTests-dummy.m b/Pods/Target Support Files/Pods-e-shopTests/Pods-e-shopTests-dummy.m new file mode 100644 index 0000000..aa1af4f --- /dev/null +++ b/Pods/Target Support Files/Pods-e-shopTests/Pods-e-shopTests-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_e_shopTests : NSObject +@end +@implementation PodsDummy_Pods_e_shopTests +@end diff --git a/Pods/Target Support Files/Pods-e-shopTests/Pods-e-shopTests-frameworks.sh b/Pods/Target Support Files/Pods-e-shopTests/Pods-e-shopTests-frameworks.sh new file mode 100755 index 0000000..88dd537 --- /dev/null +++ b/Pods/Target Support Files/Pods-e-shopTests/Pods-e-shopTests-frameworks.sh @@ -0,0 +1,105 @@ +#!/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}" + +# This protects against multiple targets copying the same framework dependency at the same time. The solution +# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html +RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") + +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 don't throw errors. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --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 +} + +# Copies the dSYM of a vendored framework +install_dsym() { + local source="$1" + if [ -r "$source" ]; then + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DWARF_DSYM_FOLDER_PATH}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DWARF_DSYM_FOLDER_PATH}" + 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}" + local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements '$1'" + + if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + code_sign_cmd="$code_sign_cmd &" + fi + echo "$code_sign_cmd" + eval "$code_sign_cmd" + 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 ! [[ "${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 +} + +if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + wait +fi diff --git a/Pods/Target Support Files/Pods-e-shopTests/Pods-e-shopTests-resources.sh b/Pods/Target Support Files/Pods-e-shopTests/Pods-e-shopTests-resources.sh new file mode 100755 index 0000000..a7df440 --- /dev/null +++ b/Pods/Target Support Files/Pods-e-shopTests/Pods-e-shopTests-resources.sh @@ -0,0 +1,106 @@ +#!/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=() + +# This protects against multiple targets copying the same framework dependency at the same time. The solution +# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html +RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") + +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" + ;; + 3) + TARGET_DEVICE_ARGS="--target-device tv" + ;; + 4) + TARGET_DEVICE_ARGS="--target-device watch" + ;; + *) + TARGET_DEVICE_ARGS="--target-device mac" + ;; +esac + +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}" || true + 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} ${TARGET_DEVICE_ARGS}" || true + 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}" ${TARGET_DEVICE_ARGS} + ;; + *.framework) + echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true + mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" "$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\"" || true + 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\"" || true + 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\"" || true + xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" + ;; + *.xcassets) + ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" + XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") + ;; + *) + echo "$RESOURCE_PATH" || true + 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 != "${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-e-shopTests/Pods-e-shopTests-umbrella.h b/Pods/Target Support Files/Pods-e-shopTests/Pods-e-shopTests-umbrella.h new file mode 100644 index 0000000..f7c4487 --- /dev/null +++ b/Pods/Target Support Files/Pods-e-shopTests/Pods-e-shopTests-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double Pods_e_shopTestsVersionNumber; +FOUNDATION_EXPORT const unsigned char Pods_e_shopTestsVersionString[]; + diff --git a/Pods/Target Support Files/Pods-e-shopTests/Pods-e-shopTests.debug.xcconfig b/Pods/Target Support Files/Pods-e-shopTests/Pods-e-shopTests.debug.xcconfig new file mode 100644 index 0000000..a507b7e --- /dev/null +++ b/Pods/Target Support Files/Pods-e-shopTests/Pods-e-shopTests.debug.xcconfig @@ -0,0 +1,8 @@ +FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Braintree" "$PODS_CONFIGURATION_BUILD_DIR/SwiftSpinner" +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/Braintree/Braintree.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/SwiftSpinner/SwiftSpinner.framework/Headers" +PODS_BUILD_DIR = $BUILD_DIR +PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. +PODS_ROOT = ${SRCROOT}/Pods diff --git a/Pods/Target Support Files/Pods-e-shopTests/Pods-e-shopTests.modulemap b/Pods/Target Support Files/Pods-e-shopTests/Pods-e-shopTests.modulemap new file mode 100644 index 0000000..50080e8 --- /dev/null +++ b/Pods/Target Support Files/Pods-e-shopTests/Pods-e-shopTests.modulemap @@ -0,0 +1,6 @@ +framework module Pods_e_shopTests { + umbrella header "Pods-e-shopTests-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/Pods-e-shopTests/Pods-e-shopTests.release.xcconfig b/Pods/Target Support Files/Pods-e-shopTests/Pods-e-shopTests.release.xcconfig new file mode 100644 index 0000000..a507b7e --- /dev/null +++ b/Pods/Target Support Files/Pods-e-shopTests/Pods-e-shopTests.release.xcconfig @@ -0,0 +1,8 @@ +FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Braintree" "$PODS_CONFIGURATION_BUILD_DIR/SwiftSpinner" +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/Braintree/Braintree.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/SwiftSpinner/SwiftSpinner.framework/Headers" +PODS_BUILD_DIR = $BUILD_DIR +PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. +PODS_ROOT = ${SRCROOT}/Pods diff --git a/Pods/Target Support Files/Pods-e-shopUITests/Info.plist b/Pods/Target Support Files/Pods-e-shopUITests/Info.plist new file mode 100644 index 0000000..2243fe6 --- /dev/null +++ b/Pods/Target Support Files/Pods-e-shopUITests/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/Pods-e-shopUITests/Pods-e-shopUITests-acknowledgements.markdown b/Pods/Target Support Files/Pods-e-shopUITests/Pods-e-shopUITests-acknowledgements.markdown new file mode 100644 index 0000000..102af75 --- /dev/null +++ b/Pods/Target Support Files/Pods-e-shopUITests/Pods-e-shopUITests-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-e-shopUITests/Pods-e-shopUITests-acknowledgements.plist b/Pods/Target Support Files/Pods-e-shopUITests/Pods-e-shopUITests-acknowledgements.plist new file mode 100644 index 0000000..7acbad1 --- /dev/null +++ b/Pods/Target Support Files/Pods-e-shopUITests/Pods-e-shopUITests-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-e-shopUITests/Pods-e-shopUITests-dummy.m b/Pods/Target Support Files/Pods-e-shopUITests/Pods-e-shopUITests-dummy.m new file mode 100644 index 0000000..531748a --- /dev/null +++ b/Pods/Target Support Files/Pods-e-shopUITests/Pods-e-shopUITests-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_e_shopUITests : NSObject +@end +@implementation PodsDummy_Pods_e_shopUITests +@end diff --git a/Pods/Target Support Files/Pods-e-shopUITests/Pods-e-shopUITests-frameworks.sh b/Pods/Target Support Files/Pods-e-shopUITests/Pods-e-shopUITests-frameworks.sh new file mode 100755 index 0000000..88dd537 --- /dev/null +++ b/Pods/Target Support Files/Pods-e-shopUITests/Pods-e-shopUITests-frameworks.sh @@ -0,0 +1,105 @@ +#!/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}" + +# This protects against multiple targets copying the same framework dependency at the same time. The solution +# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html +RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") + +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 don't throw errors. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --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 +} + +# Copies the dSYM of a vendored framework +install_dsym() { + local source="$1" + if [ -r "$source" ]; then + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DWARF_DSYM_FOLDER_PATH}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DWARF_DSYM_FOLDER_PATH}" + 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}" + local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements '$1'" + + if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + code_sign_cmd="$code_sign_cmd &" + fi + echo "$code_sign_cmd" + eval "$code_sign_cmd" + 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 ! [[ "${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 +} + +if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + wait +fi diff --git a/Pods/Target Support Files/Pods-e-shopUITests/Pods-e-shopUITests-resources.sh b/Pods/Target Support Files/Pods-e-shopUITests/Pods-e-shopUITests-resources.sh new file mode 100755 index 0000000..a7df440 --- /dev/null +++ b/Pods/Target Support Files/Pods-e-shopUITests/Pods-e-shopUITests-resources.sh @@ -0,0 +1,106 @@ +#!/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=() + +# This protects against multiple targets copying the same framework dependency at the same time. The solution +# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html +RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") + +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" + ;; + 3) + TARGET_DEVICE_ARGS="--target-device tv" + ;; + 4) + TARGET_DEVICE_ARGS="--target-device watch" + ;; + *) + TARGET_DEVICE_ARGS="--target-device mac" + ;; +esac + +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}" || true + 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} ${TARGET_DEVICE_ARGS}" || true + 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}" ${TARGET_DEVICE_ARGS} + ;; + *.framework) + echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true + mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" "$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\"" || true + 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\"" || true + 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\"" || true + xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" + ;; + *.xcassets) + ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" + XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") + ;; + *) + echo "$RESOURCE_PATH" || true + 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 != "${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-e-shopUITests/Pods-e-shopUITests-umbrella.h b/Pods/Target Support Files/Pods-e-shopUITests/Pods-e-shopUITests-umbrella.h new file mode 100644 index 0000000..7865a5a --- /dev/null +++ b/Pods/Target Support Files/Pods-e-shopUITests/Pods-e-shopUITests-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double Pods_e_shopUITestsVersionNumber; +FOUNDATION_EXPORT const unsigned char Pods_e_shopUITestsVersionString[]; + diff --git a/Pods/Target Support Files/Pods-e-shopUITests/Pods-e-shopUITests.debug.xcconfig b/Pods/Target Support Files/Pods-e-shopUITests/Pods-e-shopUITests.debug.xcconfig new file mode 100644 index 0000000..a507b7e --- /dev/null +++ b/Pods/Target Support Files/Pods-e-shopUITests/Pods-e-shopUITests.debug.xcconfig @@ -0,0 +1,8 @@ +FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Braintree" "$PODS_CONFIGURATION_BUILD_DIR/SwiftSpinner" +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/Braintree/Braintree.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/SwiftSpinner/SwiftSpinner.framework/Headers" +PODS_BUILD_DIR = $BUILD_DIR +PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. +PODS_ROOT = ${SRCROOT}/Pods diff --git a/Pods/Target Support Files/Pods-e-shopUITests/Pods-e-shopUITests.modulemap b/Pods/Target Support Files/Pods-e-shopUITests/Pods-e-shopUITests.modulemap new file mode 100644 index 0000000..6c39aef --- /dev/null +++ b/Pods/Target Support Files/Pods-e-shopUITests/Pods-e-shopUITests.modulemap @@ -0,0 +1,6 @@ +framework module Pods_e_shopUITests { + umbrella header "Pods-e-shopUITests-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/Pods-e-shopUITests/Pods-e-shopUITests.release.xcconfig b/Pods/Target Support Files/Pods-e-shopUITests/Pods-e-shopUITests.release.xcconfig new file mode 100644 index 0000000..a507b7e --- /dev/null +++ b/Pods/Target Support Files/Pods-e-shopUITests/Pods-e-shopUITests.release.xcconfig @@ -0,0 +1,8 @@ +FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Braintree" "$PODS_CONFIGURATION_BUILD_DIR/SwiftSpinner" +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/Braintree/Braintree.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/SwiftSpinner/SwiftSpinner.framework/Headers" +PODS_BUILD_DIR = $BUILD_DIR +PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. +PODS_ROOT = ${SRCROOT}/Pods diff --git a/Pods/Target Support Files/SwiftSpinner/Info.plist b/Pods/Target Support Files/SwiftSpinner/Info.plist new file mode 100644 index 0000000..a7a6daf --- /dev/null +++ b/Pods/Target Support Files/SwiftSpinner/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.5.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/SwiftSpinner/SwiftSpinner-dummy.m b/Pods/Target Support Files/SwiftSpinner/SwiftSpinner-dummy.m new file mode 100644 index 0000000..3c8b222 --- /dev/null +++ b/Pods/Target Support Files/SwiftSpinner/SwiftSpinner-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_SwiftSpinner : NSObject +@end +@implementation PodsDummy_SwiftSpinner +@end diff --git a/Pods/Target Support Files/SwiftSpinner/SwiftSpinner-prefix.pch b/Pods/Target Support Files/SwiftSpinner/SwiftSpinner-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/Pods/Target Support Files/SwiftSpinner/SwiftSpinner-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/Pods/Target Support Files/SwiftSpinner/SwiftSpinner-umbrella.h b/Pods/Target Support Files/SwiftSpinner/SwiftSpinner-umbrella.h new file mode 100644 index 0000000..ded61be --- /dev/null +++ b/Pods/Target Support Files/SwiftSpinner/SwiftSpinner-umbrella.h @@ -0,0 +1,17 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + +#import "SwiftSpinner.h" + +FOUNDATION_EXPORT double SwiftSpinnerVersionNumber; +FOUNDATION_EXPORT const unsigned char SwiftSpinnerVersionString[]; + diff --git a/Pods/Target Support Files/SwiftSpinner/SwiftSpinner.modulemap b/Pods/Target Support Files/SwiftSpinner/SwiftSpinner.modulemap new file mode 100644 index 0000000..0446909 --- /dev/null +++ b/Pods/Target Support Files/SwiftSpinner/SwiftSpinner.modulemap @@ -0,0 +1,6 @@ +framework module SwiftSpinner { + umbrella header "SwiftSpinner-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/SwiftSpinner/SwiftSpinner.xcconfig b/Pods/Target Support Files/SwiftSpinner/SwiftSpinner.xcconfig new file mode 100644 index 0000000..2ba7bcb --- /dev/null +++ b/Pods/Target Support Files/SwiftSpinner/SwiftSpinner.xcconfig @@ -0,0 +1,11 @@ +CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/SwiftSpinner +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" +OTHER_LDFLAGS = -framework "UIKit" +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_TARGET_SRCROOT = ${PODS_ROOT}/SwiftSpinner +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES diff --git a/Stripe.framework/Headers/STPAPIClient+ApplePay.h b/Stripe.framework/Headers/STPAPIClient+ApplePay.h new file mode 100755 index 0000000..485f39e --- /dev/null +++ b/Stripe.framework/Headers/STPAPIClient+ApplePay.h @@ -0,0 +1,48 @@ +// +// STPAPIClient+ApplePay.h +// Stripe +// +// Created by Jack Flintermann on 12/19/14. +// + +#import +#import + +#import "STPAPIClient.h" + +#define FAUXPAS_IGNORED_IN_FILE(...) +FAUXPAS_IGNORED_IN_FILE(APIAvailability) + +/** + STPAPIClient extensions to create Stripe tokens from Apple Pay PKPayment objects. + */ +@interface STPAPIClient (ApplePay) + +/** + Converts a PKPayment object into a Stripe token using the Stripe API. + + @param payment The user's encrypted payment information as returned from a PKPaymentAuthorizationViewController. Cannot be nil. + @param completion The callback to run with the returned Stripe token (and any errors that may have occurred). + */ +- (void)createTokenWithPayment:(nonnull PKPayment *)payment + completion:(nonnull STPTokenCompletionBlock)completion; + +/** + Converts a PKPayment object into a Stripe source using the Stripe API. + + @param payment The user's encrypted payment information as returned from a PKPaymentAuthorizationViewController. Cannot be nil. + @param completion The callback to run with the returned Stripe source (and any errors that may have occurred). + */ +- (void)createSourceWithPayment:(nonnull PKPayment *)payment + completion:(nonnull STPSourceCompletionBlock)completion; + +@end + +/** + This function should not be called directly. + + It is used by the SDK when it is built as a static library to force the + compiler to link in category methods regardless of the integrating + app's compiler flags. + */ +void linkSTPAPIClientApplePayCategory(void); diff --git a/Stripe.framework/Headers/STPAPIClient.h b/Stripe.framework/Headers/STPAPIClient.h new file mode 100755 index 0000000..5ac4996 --- /dev/null +++ b/Stripe.framework/Headers/STPAPIClient.h @@ -0,0 +1,333 @@ +// +// STPAPIClient.h +// StripeExample +// +// Created by Jack Flintermann on 12/18/14. +// Copyright (c) 2014 Stripe. All rights reserved. +// + +#import +#import +#import "STPBlocks.h" +#import "STPFile.h" + +NS_ASSUME_NONNULL_BEGIN + +#define FAUXPAS_IGNORED_ON_LINE(...) +#define FAUXPAS_IGNORED_IN_FILE(...) +FAUXPAS_IGNORED_IN_FILE(APIAvailability) + +/** + The current version of this library. + */ +static NSString *const STPSDKVersion = @"11.5.0"; + +@class STPBankAccount, STPBankAccountParams, STPCard, STPCardParams, STPSourceParams, STPToken, STPPaymentConfiguration; + +/** + A top-level class that imports the rest of the Stripe SDK. + */ +@interface Stripe : NSObject FAUXPAS_IGNORED_ON_LINE(UnprefixedClass); + +/** + Set your Stripe API key with this method. New instances of STPAPIClient will be initialized with this value. You should call this method as early as + possible in your application's lifecycle, preferably in your AppDelegate. + + @param publishableKey Your publishable key, obtained from https://stripe.com/account/apikeys + @warning Make sure not to ship your test API keys to the App Store! This will log a warning if you use your test key in a release build. + */ ++ (void)setDefaultPublishableKey:(NSString *)publishableKey; + +/** + The current default publishable key. + */ ++ (nullable NSString *)defaultPublishableKey; + +@end + +/** + A client for making connections to the Stripe API. + */ +@interface STPAPIClient : NSObject + +/** + A shared singleton API client. Its API key will be initially equal to [Stripe defaultPublishableKey]. + */ ++ (instancetype)sharedClient; + + +/** + Initializes an API client with the given configuration. Its API key will be + set to the configuration's publishable key. + + @param configuration The configuration to use. + @return An instance of STPAPIClient. + */ +- (instancetype)initWithConfiguration:(STPPaymentConfiguration *)configuration NS_DESIGNATED_INITIALIZER; + +/** + Initializes an API client with the given publishable key. + + @param publishableKey The publishable key to use. + @return An instance of STPAPIClient. + */ +- (instancetype)initWithPublishableKey:(NSString *)publishableKey; + +/** + The client's publishable key. + */ +@property (nonatomic, copy, nullable) NSString *publishableKey; + +/** + The client's configuration. + */ +@property (nonatomic, copy) STPPaymentConfiguration *configuration; + + +/** + In order to perform API requests on behalf of a connected account, e.g. to + create a source on a connected account, set this property to the ID of the + account for which this request is being made. + + @see https://stripe.com/docs/connect/authentication#authentication-via-the-stripe-account-header + */ +@property (nonatomic, copy, nullable) NSString *stripeAccount; + +@end + +#pragma mark Bank Accounts + +/** + STPAPIClient extensions to create Stripe tokens from bank accounts. + */ +@interface STPAPIClient (BankAccounts) + +/** + Converts an STPBankAccount object into a Stripe token using the Stripe API. + + @param bankAccount The user's bank account details. Cannot be nil. @see https://stripe.com/docs/api#create_bank_account_token + @param completion The callback to run with the returned Stripe token (and any errors that may have occurred). + */ +- (void)createTokenWithBankAccount:(STPBankAccountParams *)bankAccount completion:(__nullable STPTokenCompletionBlock)completion; + +@end + +#pragma mark Personally Identifiable Information + +/** + STPAPIClient extensions to create Stripe tokens from a personal identification number. + */ +@interface STPAPIClient (PII) + +/** + Converts a personal identification number into a Stripe token using the Stripe API. + + @param pii The user's personal identification number. Cannot be nil. @see https://stripe.com/docs/api#create_pii_token + @param completion The callback to run with the returned Stripe token (and any errors that may have occurred). + */ +- (void)createTokenWithPersonalIDNumber:(NSString *)pii completion:(__nullable STPTokenCompletionBlock)completion; + +@end + +/** + STPAPIClient extensions to upload files. + */ +@interface STPAPIClient (Upload) + + +/** + Uses the Stripe file upload API to upload an image. This can be used for + identity verification and evidence disputes. + + @param image The image to be uploaded. The maximum allowed file size is 4MB + for identity documents and 8MB for evidence disputes. Cannot be nil. + Your image will be automatically resized down if you pass in one that + is too large + @param purpose The purpose of this file. This can be either an identifing + document or an evidence dispute. + @param completion The callback to run with the returned Stripe file + (and any errors that may have occurred). + + @see https://stripe.com/docs/file-upload + */ +- (void)uploadImage:(UIImage *)image + purpose:(STPFilePurpose)purpose + completion:(nullable STPFileCompletionBlock)completion; + +@end + +#pragma mark Credit Cards + +/** + STPAPIClient extensions to create Stripe tokens from credit or debit cards. + */ +@interface STPAPIClient (CreditCards) + +/** + Converts an STPCardParams object into a Stripe token using the Stripe API. + + @param card The user's card details. Cannot be nil. @see https://stripe.com/docs/api#create_card_token + @param completion The callback to run with the returned Stripe token (and any errors that may have occurred). + */ +- (void)createTokenWithCard:(STPCardParams *)card completion:(nullable STPTokenCompletionBlock)completion; + +@end + +/** + Convenience methods for working with Apple Pay. + */ +@interface Stripe(ApplePay) + +/** + Whether or not this device is capable of using Apple Pay. This checks both + whether the device supports Apple Pay, as well as whether or not they have + stored Apple Pay cards on their device. + + @param paymentRequest The return value of this method depends on the + `supportedNetworks` property of this payment request, which by default should be + `@[PKPaymentNetworkAmex, PKPaymentNetworkMasterCard, PKPaymentNetworkVisa, PKPaymentNetworkDiscover]`. + + @return whether or not the user is currently able to pay with Apple Pay. +*/ ++ (BOOL)canSubmitPaymentRequest:(PKPaymentRequest *)paymentRequest; + +/** + Whether or not this can make Apple Pay payments via a card network supported + by Stripe. + + The Stripe supported Apple Pay card networks are: + American Express, Visa, Mastercard, Discover. + + @return YES if the device is currently able to make Apple Pay payments via one + of the supported networks. NO if the user does not have a saved card of a + supported type, or other restrictions prevent payment (such as parental controls). + */ ++ (BOOL)deviceSupportsApplePay; + +/** + A convenience method to build a `PKPaymentRequest` with sane default values. + You will still need to configure the `paymentSummaryItems` property to indicate + what the user is purchasing, as well as the optional `requiredShippingAddressFields`, + `requiredBillingAddressFields`, and `shippingMethods` properties to indicate + what contact information your application requires. + Note that this method sets the payment request's countryCode to "US" and its + currencyCode to "USD". + + @param merchantIdentifier Your Apple Merchant ID. + + @return a `PKPaymentRequest` with proper default values. Returns nil if running on < iOS8. + @deprecated Use `paymentRequestWithMerchantIdentifier:country:currency:` instead. + Apple Pay is available in many countries and currencies, and you should use + the appropriate values for your business. + */ ++ (PKPaymentRequest *)paymentRequestWithMerchantIdentifier:(NSString *)merchantIdentifier __attribute__((deprecated)); + +/** + A convenience method to build a `PKPaymentRequest` with sane default values. + You will still need to configure the `paymentSummaryItems` property to indicate + what the user is purchasing, as well as the optional `requiredShippingAddressFields`, + `requiredBillingAddressFields`, and `shippingMethods` properties to indicate + what contact information your application requires. + + @param merchantIdentifier Your Apple Merchant ID. + @param countryCode The two-letter code for the country where the payment + will be processed. This should be the country of your Stripe account. + @param currencyCode The three-letter code for the currency used by this + payment request. Apple Pay interprets the amounts provided by the summary items + attached to this request as amounts in this currency. + + @return a `PKPaymentRequest` with proper default values. Returns nil if running on < iOS8. + */ ++ (PKPaymentRequest *)paymentRequestWithMerchantIdentifier:(NSString *)merchantIdentifier + country:(NSString *)countryCode + currency:(NSString *)currencyCode NS_AVAILABLE_IOS(8_0); + +@end + +#pragma mark Sources + +/** + STPAPIClient extensions for working with Source objects + */ +@interface STPAPIClient (Sources) + +/** + Creates a Source object using the provided details. + Note: in order to create a source on a connected account, you can set your + API client's `stripeAccount` property to the ID of the account. + @see https://stripe.com/docs/sources/connect#creating-direct-charges + + @param params The details of the source to create. Cannot be nil. @see https://stripe.com/docs/api#create_source + @param completion The callback to run with the returned Source object, or an error. + */ +- (void)createSourceWithParams:(STPSourceParams *)params completion:(STPSourceCompletionBlock)completion; + +/** + Retrieves the Source object with the given ID. @see https://stripe.com/docs/api#retrieve_source + + @param identifier The identifier of the source to be retrieved. Cannot be nil. + @param secret The client secret of the source. Cannot be nil. + @param completion The callback to run with the returned Source object, or an error. + */ +- (void)retrieveSourceWithId:(NSString *)identifier clientSecret:(NSString *)secret completion:(STPSourceCompletionBlock)completion; + +/** + Starts polling the Source object with the given ID. For payment methods that require + additional customer action (e.g. authorizing a payment with their bank), polling + allows you to determine if the action was successful. Polling will stop and the + provided callback will be called once the source's status is no longer `pending`, + or if the given timeout is reached and the source is still `pending`. If polling + stops due to an error, the callback will be fired with the latest retrieved + source and the error. + + Note that if a poll is already running for a source, subsequent calls to `startPolling` + with the same source ID will do nothing. + + @param identifier The identifier of the source to be retrieved. Cannot be nil. + @param secret The client secret of the source. Cannot be nil. + @param timeout The timeout for the polling operation, in seconds. Timeouts are capped at 5 minutes. + @param completion The callback to run with the returned Source object, or an error. + */ +- (void)startPollingSourceWithId:(NSString *)identifier clientSecret:(NSString *)secret timeout:(NSTimeInterval)timeout completion:(STPSourceCompletionBlock)completion NS_EXTENSION_UNAVAILABLE("Source polling is not available in extensions") DEPRECATED_MSG_ATTRIBUTE("You should poll your own backend to update based on source status change webhook events it may receive."); + +/** + Stops polling the Source object with the given ID. Note that the completion block passed to + `startPolling` will not be fired when `stopPolling` is called. + + @param identifier The identifier of the source to be retrieved. Cannot be nil. + */ +- (void)stopPollingSourceWithId:(NSString *)identifier NS_EXTENSION_UNAVAILABLE("Source polling is not available in extensions") DEPRECATED_ATTRIBUTE; + +@end + +#pragma mark URL callbacks + +/** + Stripe extensions for working with URL callbacks + */ +@interface Stripe (STPURLCallbackHandlerAdditions) + +/** + Call this method in your app delegate whenever you receive an URL in your + app delegate for a Stripe callback. + + For convenience, you can pass all URL's you receive in your app delegate + to this method first, and check the return value + to easily determine whether it is a callback URL that Stripe will handle + or if your app should process it normally. + + If you are using a universal link URL, you will receive the callback in `application:continueUserActivity:restorationHandler:` + To learn more about universal links, see https://developer.apple.com/library/content/documentation/General/Conceptual/AppSearch/UniversalLinks.html + + If you are using a native scheme URL, you will receive the callback in `application:openURL:options:` + To learn more about native url schemes, see https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/Inter-AppCommunication/Inter-AppCommunication.html#//apple_ref/doc/uid/TP40007072-CH6-SW10 + + @param url The URL that you received in your app delegate + + @return YES if the URL is expected and will be handled by Stripe. NO otherwise. + */ ++ (BOOL)handleStripeURLCallbackWithURL:(NSURL *)url; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Stripe.framework/Headers/STPAPIResponseDecodable.h b/Stripe.framework/Headers/STPAPIResponseDecodable.h new file mode 100755 index 0000000..b6c18cc --- /dev/null +++ b/Stripe.framework/Headers/STPAPIResponseDecodable.h @@ -0,0 +1,40 @@ +// +// STPAPIResponseDecodable.h +// Stripe +// +// Created by Jack Flintermann on 10/14/15. +// Copyright © 2015 Stripe, Inc. All rights reserved. +// + +#import + +/** + Objects conforming to STPAPIResponseDecodable can be automatically converted + from a JSON dictionary that was returned from the Stripe API. + */ +@protocol STPAPIResponseDecodable + +/** + These fields are required to be present in the API response. If any of them are + nil, `decodedObjectFromAPIResponse` should also return nil. + */ ++ (nonnull NSArray *)requiredFields; + +/** + Parses an response from the Stripe API (in JSON format; represented as + an `NSDictionary`) into an instance of the class. + + @param response The JSON dictionary that represents an object of this type + + @return The object represented by the JSON dictionary, or nil if the object + could not be decoded (i.e. if one of its `requiredFields` is nil). + */ ++ (nullable instancetype)decodedObjectFromAPIResponse:(nullable NSDictionary *)response; + +/** + The raw JSON response used to create the object. This can be useful for accessing + fields that haven't yet been made into native properties in the SDK. + */ +@property (nonatomic, readonly, nonnull, copy) NSDictionary *allResponseFields; + +@end diff --git a/Stripe.framework/Headers/STPAddCardViewController.h b/Stripe.framework/Headers/STPAddCardViewController.h new file mode 100755 index 0000000..bac5d6c --- /dev/null +++ b/Stripe.framework/Headers/STPAddCardViewController.h @@ -0,0 +1,94 @@ +// +// STPAddCardViewController.h +// Stripe +// +// Created by Jack Flintermann on 3/23/16. +// Copyright © 2016 Stripe, Inc. All rights reserved. +// + +#import + +#import "STPAPIClient.h" +#import "STPAddress.h" +#import "STPBlocks.h" +#import "STPCardParams.h" +#import "STPCoreTableViewController.h" +#import "STPPaymentConfiguration.h" +#import "STPTheme.h" +#import "STPUserInformation.h" + +NS_ASSUME_NONNULL_BEGIN + +@class STPAddCardViewController; +@protocol STPAddCardViewControllerDelegate; + +/** This view controller contains a credit card entry form that the user can fill out. On submission, it will use the Stripe API to convert the user's card details to a Stripe token. It renders a right bar button item that submits the form, so it must be shown inside a `UINavigationController`. + */ +@interface STPAddCardViewController : STPCoreTableViewController + +/** + A convenience initializer; equivalent to calling `initWithConfiguration:[STPPaymentConfiguration sharedConfiguration] theme:[STPTheme defaultTheme]`. + */ +- (instancetype)init; + +/** + Initializes a new `STPAddCardViewController` with the provided configuration and theme. Don't forget to set the `delegate` property after initialization. + + @param configuration The configuration to use (this determines the Stripe publishable key to use, the required billing address fields, whether or not to use SMS autofill, etc). @see STPPaymentConfiguration + @param theme The theme to use to inform the view controller's visual appearance. @see STPTheme + */ +- (instancetype)initWithConfiguration:(STPPaymentConfiguration *)configuration + theme:(STPTheme *)theme; + +/** + The view controller's delegate. This must be set before showing the view controller in order for it to work properly. @see STPAddCardViewControllerDelegate + */ +@property (nonatomic, weak, nullable) iddelegate; + +/** + You can set this property to pre-fill any information you've already collected from your user. @see STPUserInformation.h + */ +@property (nonatomic, strong, nullable) STPUserInformation *prefilledInformation; + +/** + If you're using the token generated from STPAddCardViewController to make a Managed Account, you should set this property to the currency that account will use. Otherwise, you should leave it empty. For more information, see https://stripe.com/docs/api#create_card_token-card-currency + */ +@property (nonatomic, copy, nullable) NSString *managedAccountCurrency; + +/** + Provide this view controller with a footer view. + + When the footer view needs to be resized, it will be sent a + `sizeThatFits:` call. The view should respond correctly to this method in order + to be sized and positioned properly. + */ +@property (nonatomic, strong, nullable) UIView *customFooterView; + +@end + +/** + An `STPAddCardViewControllerDelegate` is notified when an `STPAddCardViewController` successfully creates a card token or is cancelled. It has internal error-handling logic, so there's no error case to deal with. + */ +@protocol STPAddCardViewControllerDelegate + +/** + Called when the user cancels adding a card. You should dismiss (or pop) the view controller at this point. + + @param addCardViewController the view controller that has been cancelled + */ +- (void)addCardViewControllerDidCancel:(STPAddCardViewController *)addCardViewController; + +/** + This is called when the user successfully adds a card and tokenizes it with Stripe. You should send the token to your backend to store it on a customer, and then call the provided `completion` block when that call is finished. If an error occurred while talking to your backend, call `completion(error)`, otherwise, dismiss (or pop) the view controller. + + @param addCardViewController the view controller that successfully created a token + @param token the Stripe token that was created. @see STPToken + @param completion call this callback when you're done sending the token to your backend + */ +- (void)addCardViewController:(STPAddCardViewController *)addCardViewController + didCreateToken:(STPToken *)token + completion:(STPErrorBlock)completion; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Stripe.framework/Headers/STPAddress.h b/Stripe.framework/Headers/STPAddress.h new file mode 100755 index 0000000..0e720ef --- /dev/null +++ b/Stripe.framework/Headers/STPAddress.h @@ -0,0 +1,226 @@ +// +// STPAddress.h +// Stripe +// +// Created by Ben Guo on 4/13/16. +// Copyright © 2016 Stripe, Inc. All rights reserved. +// + +#define FAUXPAS_IGNORED_IN_METHOD(...) +#define FAUXPAS_IGNORED_ON_LINE(...) + +#import +#import + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated" +#import +#pragma clang diagnostic pop + +#import "STPAPIResponseDecodable.h" + +@class CNContact; + +NS_ASSUME_NONNULL_BEGIN + +/** + What set of billing address information you need to collect from your user. + + @note If the user is from a country that does not use zip/postal codes, + the user may not be asked for one regardless of this setting. + */ +typedef NS_ENUM(NSUInteger, STPBillingAddressFields) { + /** + No billing address information + */ + STPBillingAddressFieldsNone, + /** + Just request the user's billing ZIP code + */ + STPBillingAddressFieldsZip, + /** + Request the user's full billing address + */ + STPBillingAddressFieldsFull, +}; + +/** + STPAddress Contains an address as represented by the Stripe API. + */ +@interface STPAddress : NSObject + +/** + The user's full name (e.g. "Jane Doe") + */ +@property (nonatomic, copy, nullable) NSString *name; + +/** + The first line of the user's street address (e.g. "123 Fake St") + */ +@property (nonatomic, copy, nullable) NSString *line1; + +/** + The apartment, floor number, etc of the user's street address (e.g. "Apartment 1A") + */ +@property (nonatomic, copy, nullable) NSString *line2; + +/** + The city in which the user resides (e.g. "San Francisco") + */ +@property (nonatomic, copy, nullable) NSString *city; + +/** + The state in which the user resides (e.g. "CA") + */ +@property (nonatomic, copy, nullable) NSString *state; + +/** + The postal code in which the user resides (e.g. "90210") + */ +@property (nonatomic, copy, nullable) NSString *postalCode; + +/** + The ISO country code of the address (e.g. "US") + */ +@property (nonatomic, copy, nullable) NSString *country; + +/** + The phone number of the address (e.g. "8885551212") + */ +@property (nonatomic, copy, nullable) NSString *phone; + +/** + The email of the address (e.g. "jane@doe.com") + */ +@property (nonatomic, copy, nullable) NSString *email; + +/** + When creating a charge on your backend, you can attach shipping information + to prevent fraud on a physical good. You can use this method to turn your user's + shipping address and selected shipping method into a hash suitable for attaching + to a charge. You should pass this to your backend, and use it as the `shipping` + parameter when creating a charge. + @see https://stripe.com/docs/api#create_charge-shipping + + @param address The user's shipping address. If nil, this method will return nil. + @param method The user's selected shipping method. May be nil. + */ ++ (nullable NSDictionary *)shippingInfoForChargeWithAddress:(nullable STPAddress *)address + shippingMethod:(nullable PKShippingMethod *)method; + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated" + +/** + Initializes a new STPAddress with data from an Address Book record. + + @param record The Address Book record you want to populate the STPAddress from. + @return A new STPAddress instance with data copied from the passed in record. + */ +- (instancetype)initWithABRecord:(ABRecordRef)record; + + +/** + Generates an Address Book record representation of this STPAddress. + + @return A new autoreleased Address Book record with data copied from this + STPAddress instance. + */ +- (ABRecordRef)ABRecordValue; +#pragma clang diagnostic pop + +/** + Initializes a new STPAddress with data from an PassKit contact. + + @param contact The PassKit contact you want to populate the STPAddress from. + @return A new STPAddress instance with data copied from the passed in contact. + */ +- (instancetype)initWithPKContact:(PKContact *)contact NS_AVAILABLE_IOS(9_0); FAUXPAS_IGNORED_ON_LINE(APIAvailability); + +/** + Generates a PassKit contact representation of this STPAddress. + + @return A new PassKit contact with data copied from this STPAddress instance. + */ +- (PKContact *)PKContactValue NS_AVAILABLE_IOS(9_0); FAUXPAS_IGNORED_ON_LINE(APIAvailability); + +/** + Initializes a new STPAddress with a contact from the Contacts framework. + + @param contact The CNContact you want to populate the STPAddress from. + + @return A new STPAddress instance with data copied from the passed in contact. + */ +- (instancetype)initWithCNContact:(CNContact *)contact NS_AVAILABLE_IOS(9_0); FAUXPAS_IGNORED_ON_LINE(APIAvailability); + + +/** + Checks if this STPAddress has the level of valid address information + required by the passed in setting. + + @param requiredFields The required level of billing address information to + check against. + + @return YES if this address contains at least the necessary information, + NO otherwise. + */ +- (BOOL)containsRequiredFields:(STPBillingAddressFields)requiredFields; + +/** + Checks if this STPAddress has any content (possibly invalid) in any of the + desired billing address fields. + + Where `containsRequiredFields:` validates that this STPAddress contains valid data in + all of the required fields, this method checks for the existence of *any* data. + + For example, if `desiredFields` is `STPBillingAddressFieldsZip`, this will check + if the postalCode is empty. + + Note: When `desiredFields == STPBillingAddressFieldsNone`, this method always returns + NO. + + @parameter desiredFields The billing address information the caller is interested in. + @return YES if there is any data in this STPAddress that's relevant for those fields. + */ +- (BOOL)containsContentForBillingAddressFields:(STPBillingAddressFields)desiredFields; + +/** + Checks if this STPAddress has the level of valid address information + required by the passed in setting. + + @param requiredFields The required shipping address information to check against. + + @return YES if this address contains at least the necessary information, + NO otherwise. + */ +- (BOOL)containsRequiredShippingAddressFields:(PKAddressField)requiredFields; + +/** + Checks if this STPAddress has any content (possibly invalid) in any of the + desired shipping address fields. + + Where `containsRequiredShippingAddressFields:` validates that this STPAddress + contains valid data in all of the required fields, this method checks for the + existence of *any* data. + + Note: When `desiredFields == PKAddressFieldNone`, this method always returns + NO. + + @parameter desiredFields The shipping address information the caller is interested in. + @return YES if there is any data in this STPAddress that's relevant for those fields. + */ +- (BOOL)containsContentForShippingAddressFields:(PKAddressField)desiredFields; + +/** + Converts an STPBillingAddressFields enum value into the closest equivalent + representation of PKAddressField options + + @param billingAddressFields Stripe billing address fields enum value to convert. + @return The closest represenation of the billing address requirement as + a PKAddressField value. + */ ++ (PKAddressField)applePayAddressFieldsFromBillingAddressFields:(STPBillingAddressFields)billingAddressFields; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Stripe.framework/Headers/STPApplePayPaymentMethod.h b/Stripe.framework/Headers/STPApplePayPaymentMethod.h new file mode 100755 index 0000000..cc2019b --- /dev/null +++ b/Stripe.framework/Headers/STPApplePayPaymentMethod.h @@ -0,0 +1,24 @@ +// +// STPApplePayPaymentMethod.h +// Stripe +// +// Created by Ben Guo on 4/19/16. +// Copyright © 2016 Stripe, Inc. All rights reserved. +// + +#import +#import "STPPaymentMethod.h" + +/** + An empty class representing that the user wishes to pay via Apple Pay. This can + be checked on an `STPPaymentContext`, e.g: + + ``` + if ([paymentContext.selectedPaymentMethod isKindOfClass:[STPApplePayPaymentMethod class]]) { + // Don't ask the user for their card number; they want to pay with apple pay. + } + ``` + */ +@interface STPApplePayPaymentMethod : NSObject + +@end diff --git a/Stripe.framework/Headers/STPBackendAPIAdapter.h b/Stripe.framework/Headers/STPBackendAPIAdapter.h new file mode 100755 index 0000000..8d4e344 --- /dev/null +++ b/Stripe.framework/Headers/STPBackendAPIAdapter.h @@ -0,0 +1,123 @@ +// +// STPBackendAPIAdapter.h +// Stripe +// +// Created by Jack Flintermann on 1/12/16. +// Copyright © 2016 Stripe, Inc. All rights reserved. +// + +#import +#import + +#import "STPAddress.h" +#import "STPBlocks.h" +#import "STPCustomer.h" +#import "STPSourceProtocol.h" + +NS_ASSUME_NONNULL_BEGIN + +@class STPCard, STPToken; + +/** + Typically, you will not need to implement this protocol yourself. You + should instead use `STPCustomerContext`, which implements + and manages retrieving and updating a Stripe customer for you. + @see STPCustomerContext.h + + If you would prefer retrieving and updating your Stripe customer object via + your own backend instead of using `STPCustomerContext`, you should make your + application's API client conform to this interface. It provides a "bridge" from + the prebuilt UI we expose (such as `STPPaymentMethodsViewController`) to your + backend to fetch the information it needs to power those views. + */ +@protocol STPBackendAPIAdapter + +/** + Retrieve the cards to be displayed inside a payment context. + + If you are not using STPCustomerContext: + On your backend, retrieve the Stripe customer associated with your currently + logged-in user ( https://stripe.com/docs/api#retrieve_customer ), and return + the raw JSON response from the Stripe API. Back in your iOS app, after you've + called this API, deserialize your API response into an `STPCustomer` object + (you can use the `STPCustomerDeserializer` class to do this). + + @see STPCard + @param completion call this callback when you're done fetching and parsing the above information from your backend. For example, `completion(customer, nil)` (if your call succeeds) or `completion(nil, error)` if an error is returned. + */ +- (void)retrieveCustomer:(nullable STPCustomerCompletionBlock)completion; + +/** + Adds a payment source to a customer. + + If you are implementing your own : + On your backend, retrieve the Stripe customer associated with your logged-in user. + Then, call the Update Customer method on that customer + ( https://stripe.com/docs/api#update_customer ). If this API call succeeds, + call `completion(nil)`. Otherwise, call `completion(error)` with the error that + occurred. + + @param source a valid payment source, such as a card token. + @param completion call this callback when you're done adding the token to the + customer on your backend. For example, `completion(nil)` (if your call succeeds) + or `completion(error)` if an error is returned. + */ +- (void)attachSourceToCustomer:(id)source completion:(STPErrorBlock)completion; + +/** + Change a customer's `default_source` to be the provided card. + + If you are implementing your own : + On your backend, retrieve the Stripe customer associated with your logged-in user. + Then, call the Customer Update method ( https://stripe.com/docs/api#update_customer ) + specifying default_source to be the value of source.stripeID. If this API call + succeeds, call `completion(nil)`. Otherwise, call `completion(error)` with the + error that occurred. + + @param source The newly-selected default source for the user. + @param completion call this callback when you're done selecting the new default + source for the customer on your backend. For example, `completion(nil)` (if + your call succeeds) or `completion(error)` if an error is returned. + */ +- (void)selectDefaultCustomerSource:(id)source completion:(STPErrorBlock)completion; + +@optional + +/** + Deletes the given source from the customer. + + If you are implementing your own : + On your backend, retrieve the Stripe customer associated with your logged-in user. + Then, call the Delete Card method ( https://stripe.com/docs/api#delete_card ) + specifying id to be the value of source.stripeID. If this API call + succeeds, call `completion(nil)`. Otherwise, call `completion(error)` with the + error that occurred. + + @param source The source to delete from the customer + @param completion call this callback when you're done deleting the source from + the customer on your backend. For example, `completion(nil)` (if your call + succeeds) or `completion(error)` if an error is returned. + */ +- (void)detachSourceFromCustomer:(id)source completion:(nullable STPErrorBlock)completion; + +/** + Sets the given shipping address on the customer. + + If you are implementing your own : + On your backend, retrieve the Stripe customer associated with your logged-in user. + Then, call the Customer Update method ( https://stripe.com/docs/api#update_customer ) + specifying shipping to be the given shipping address. If this API call succeeds, + call `completion(nil)`. Otherwise, call `completion(error)` with the error that occurred. + + @param shipping The shipping address to set on the customer + @param completion call this callback when you're done updating the customer on + your backend. For example, `completion(nil)` (if your call succeeds) or + `completion(error)` if an error is returned. + + @see https://stripe.com/docs/api#update_customer + */ +- (void)updateCustomerWithShippingAddress:(STPAddress *)shipping completion:(nullable STPErrorBlock)completion; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Stripe.framework/Headers/STPBankAccount.h b/Stripe.framework/Headers/STPBankAccount.h new file mode 100755 index 0000000..8b156fe --- /dev/null +++ b/Stripe.framework/Headers/STPBankAccount.h @@ -0,0 +1,124 @@ +// +// STPBankAccount.h +// Stripe +// +// Created by Charles Scalesse on 10/1/14. +// +// + +#import + +#import "STPBankAccountParams.h" +#import "STPAPIResponseDecodable.h" +#import "STPSourceProtocol.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + Possible validation states for a bank account. + */ +typedef NS_ENUM(NSInteger, STPBankAccountStatus) { + /** + The account has had no activity or validation performed + */ + STPBankAccountStatusNew, + + /** + Stripe has determined this bank account exists. + */ + STPBankAccountStatusValidated, + + /** + Bank account verification has succeeded. + */ + STPBankAccountStatusVerified, + + /** + Verification for this bank account has failed. + */ + STPBankAccountStatusVerificationFailed, + + /** + A transfer sent to this bank account has failed. + */ + STPBankAccountStatusErrored, +}; + +/** + Representation of a user's bank account details that have been tokenized with + the Stripe API. + + @see https://stripe.com/docs/api#bank_accounts + */ +@interface STPBankAccount : NSObject + +/** + You cannot directly instantiate an `STPBankAccount`. You should only use one + that has been returned from an `STPAPIClient` callback. + */ +- (instancetype)init __attribute__((unavailable("You cannot directly instantiate an STPBankAccount. You should only use one that has been returned from an STPAPIClient callback."))); + +/** + The routing number for the bank account. This should be the ACH routing number, + not the wire routing number. + */ +@property (nonatomic, nullable, readonly) NSString *routingNumber; + +/** + Two-letter ISO code representing the country the bank account is located in. + */ +@property (nonatomic, readonly) NSString *country; + +/** + The default currency for the bank account. + */ +@property (nonatomic, readonly) NSString *currency; + +/** + The last 4 digits of the account number. + */ +@property (nonatomic, readonly) NSString *last4; + +/** + The name of the bank that owns the account. + */ +@property (nonatomic, readonly) NSString *bankName; + +/** + The name of the person or business that owns the bank account. + */ +@property (nonatomic, nullable, readonly) NSString *accountHolderName; + +/** + The type of entity that holds the account. + */ +@property (nonatomic, readonly) STPBankAccountHolderType accountHolderType; + +/** + A proxy for the account number, this uniquely identifies the account and can be + used to compare equality of different bank accounts. + */ +@property (nonatomic, nullable, readonly) NSString *fingerprint; + +/** + A set of key/value pairs associated with the bank account object. + + @see https://stripe.com/docs/api#metadata + */ +@property (nonatomic, copy, nullable, readonly) NSDictionary *metadata; + +/** + The validation status of the bank account. @see STPBankAccountStatus + */ +@property (nonatomic, readonly) STPBankAccountStatus status; + +#pragma mark - Deprecated methods + +/** + The Stripe ID for the bank account. + */ +@property (nonatomic, readonly) NSString *bankAccountId DEPRECATED_MSG_ATTRIBUTE("Use stripeID (defined in STPSourceProtocol)"); + +@end + +NS_ASSUME_NONNULL_END diff --git a/Stripe.framework/Headers/STPBankAccountParams.h b/Stripe.framework/Headers/STPBankAccountParams.h new file mode 100755 index 0000000..117c973 --- /dev/null +++ b/Stripe.framework/Headers/STPBankAccountParams.h @@ -0,0 +1,77 @@ +// +// STPBankAccountParams.h +// Stripe +// +// Created by Jack Flintermann on 10/4/15. +// Copyright © 2015 Stripe, Inc. All rights reserved. +// + +#import + +#import "STPFormEncodable.h" + + +/** + The type of entity that holds a bank account. + */ +typedef NS_ENUM(NSInteger, STPBankAccountHolderType) { + /** + An individual holds this bank account. + */ + STPBankAccountHolderTypeIndividual, + + /** + A company holds this bank account. + */ + STPBankAccountHolderTypeCompany, +}; + +/** + Representation of a user's bank account details. You can assemble these with + information that your user enters and then create Stripe tokens with them using + an STPAPIClient. + + @see https://stripe.com/docs/api#create_bank_account_token + */ +@interface STPBankAccountParams : NSObject + +/** + The account number for the bank account. Currently must be a checking account. + */ +@property (nonatomic, copy, nullable) NSString *accountNumber; + +/** + The last 4 digits of the bank account's account number, if it's been set, + otherwise nil. + */ +@property (nonatomic, nullable, readonly) NSString *last4; + +/** + The routing number for the bank account. This should be the ACH routing number, + not the wire routing number. + */ +@property (nonatomic, copy, nullable) NSString *routingNumber; + +/** + Two-letter ISO code representing the country the bank account is located in. + */ +@property (nonatomic, copy, nullable) NSString *country; + +/** + The default currency for the bank account. + */ +@property (nonatomic, copy, nullable) NSString *currency; + +/** + The name of the person or business that owns the bank account. + */ +@property (nonatomic, copy, nullable) NSString *accountHolderName; + +/** + The type of entity that holds the account. + + Defaults to STPBankAccountHolderTypeIndividual. + */ +@property (nonatomic, assign) STPBankAccountHolderType accountHolderType; + +@end diff --git a/Stripe.framework/Headers/STPBlocks.h b/Stripe.framework/Headers/STPBlocks.h new file mode 100755 index 0000000..90df496 --- /dev/null +++ b/Stripe.framework/Headers/STPBlocks.h @@ -0,0 +1,134 @@ +// +// STPBlocks.h +// Stripe +// +// Created by Jack Flintermann on 3/23/16. +// Copyright © 2016 Stripe, Inc. All rights reserved. +// + +#import +#import + +@class STPToken; +@class STPFile; +@class STPSource; +@class STPCustomer; +@protocol STPSourceProtocol; + +/** + These values control the labels used in the shipping info collection form. + */ +typedef NS_ENUM(NSUInteger, STPShippingType) { + /** + Shipping the purchase to the provided address using a third-party + shipping company. + */ + STPShippingTypeShipping, + /** + Delivering the purchase by the seller. + */ + STPShippingTypeDelivery, +}; + +/** + An enum representing the status of a shipping address validation. + */ +typedef NS_ENUM(NSUInteger, STPShippingStatus) { + /** + The shipping address is valid. + */ + STPShippingStatusValid, + /** + The shipping address is invalid. + */ + STPShippingStatusInvalid, +}; + +/** + An enum representing the status of a payment requested from the user. + */ +typedef NS_ENUM(NSUInteger, STPPaymentStatus) { + /** + The payment succeeded. + */ + STPPaymentStatusSuccess, + /** + The payment failed due to an unforeseen error, such as the user's Internet connection being offline. + */ + STPPaymentStatusError, + /** + The user cancelled the payment (for example, by hitting "cancel" in the Apple Pay dialog). + */ + STPPaymentStatusUserCancellation, +}; + +/** + An empty block, called with no arguments, returning nothing. + */ +typedef void (^STPVoidBlock)(void); + +/** + A block that may optionally be called with an error. + + @param error The error that occurred, if any. + */ +typedef void (^STPErrorBlock)(NSError * __nullable error); + +/** + A callback to be run with a JSON response. + + @param jsonResponse The JSON response, or nil if an error occured. + @param error The error that occurred, if any. + */ +typedef void (^STPJSONResponseCompletionBlock)(NSDictionary * __nullable jsonResponse, NSError * __nullable error); + +/** + A callback to be run with a token response from the Stripe API. + + @param token The Stripe token from the response. Will be nil if an error occurs. @see STPToken + @param error The error returned from the response, or nil in one occurs. @see StripeError.h for possible values. + */ +typedef void (^STPTokenCompletionBlock)(STPToken * __nullable token, NSError * __nullable error); + +/** + A callback to be run with a source response from the Stripe API. + + @param source The Stripe source from the response. Will be nil if an error occurs. @see STPSource + @param error The error returned from the response, or nil in one occurs. @see StripeError.h for possible values. + */ +typedef void (^STPSourceCompletionBlock)(STPSource * __nullable source, NSError * __nullable error); + +/** + A callback to be run with a source or card response from the Stripe API. + + @param source The Stripe source from the response. Will be nil if an error occurs. @see STPSourceProtocol + @param error The error returned from the response, or nil in one occurs. @see StripeError.h for possible values. + */ +typedef void (^STPSourceProtocolCompletionBlock)(id __nullable source, NSError * __nullable error); + +/** + A callback to be run with a validation result and shipping methods for a + shipping address. + + @param status An enum representing whether the shipping address is valid. + @param shippingValidationError If the shipping address is invalid, an error describing the issue with the address. If no error is given and the address is invalid, the default error message will be used. + @param shippingMethods The shipping methods available for the address. + @param selectedShippingMethod The default selected shipping method for the address. + */ +typedef void (^STPShippingMethodsCompletionBlock)(STPShippingStatus status, NSError * __nullable shippingValidationError, NSArray* __nullable shippingMethods, PKShippingMethod * __nullable selectedShippingMethod); + +/** + A callback to be run with a file response from the Stripe API. + + @param file The Stripe file from the response. Will be nil if an error occurs. @see STPFile + @param error The error returned from the response, or nil in none occurs. @see StripeError.h for possible values. + */ +typedef void (^STPFileCompletionBlock)(STPFile * __nullable file, NSError * __nullable error); + +/** + A callback to be run with a customer response from the Stripe API. + + @param customer The Stripe customer from the response, or nil if an error occurred. @see STPCustomer + @param error The error returned from the response, or nil in none occurs. + */ +typedef void (^STPCustomerCompletionBlock)(STPCustomer * __nullable customer, NSError * __nullable error); diff --git a/Stripe.framework/Headers/STPCard.h b/Stripe.framework/Headers/STPCard.h new file mode 100755 index 0000000..93f04f1 --- /dev/null +++ b/Stripe.framework/Headers/STPCard.h @@ -0,0 +1,225 @@ +// +// STPCard.h +// Stripe +// +// Created by Saikat Chakrabarti on 11/2/12. +// +// + +#import + +#import "STPAPIResponseDecodable.h" +#import "STPCardBrand.h" +#import "STPCardParams.h" +#import "STPPaymentMethod.h" +#import "STPSourceProtocol.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + The various funding sources for a payment card. + */ +typedef NS_ENUM(NSInteger, STPCardFundingType) { + /** + Debit card funding + */ + STPCardFundingTypeDebit, + + /** + Credit card funding + */ + STPCardFundingTypeCredit, + + /** + Prepaid card funding + */ + STPCardFundingTypePrepaid, + + /** + An other or unknown type of funding source. + */ + STPCardFundingTypeOther, +}; + +/** + Representation of a user's credit card details that have been tokenized with + the Stripe API + + @see https://stripe.com/docs/api#cards + */ +@interface STPCard : NSObject + +/** + You cannot directly instantiate an `STPCard`. You should only use one that has + been returned from an `STPAPIClient` callback. + */ +- (instancetype) init __attribute__((unavailable("You cannot directly instantiate an STPCard. You should only use one that has been returned from an STPAPIClient callback."))); + +/** + The last 4 digits of the card. + */ +@property (nonatomic, readonly) NSString *last4; + +/** + For cards made with Apple Pay, this refers to the last 4 digits of the + "Device Account Number" for the tokenized card. For regular cards, it will + be nil. + */ +@property (nonatomic, nullable, readonly) NSString *dynamicLast4; + +/** + Whether or not the card originated from Apple Pay. + */ +@property (nonatomic, readonly) BOOL isApplePayCard; + +/** + The card's expiration month. 1-indexed (i.e. 1 == January) + */ +@property (nonatomic, readonly) NSUInteger expMonth; + +/** + The card's expiration year. + */ +@property (nonatomic, readonly) NSUInteger expYear; + +/** + The cardholder's name. + */ +@property (nonatomic, nullable, readonly) NSString *name; + +/** + The cardholder's address. + */ +@property (nonatomic, readonly) STPAddress *address; + +/** + The issuer of the card. + */ +@property (nonatomic, readonly) STPCardBrand brand; + +/** + The funding source for the card (credit, debit, prepaid, or other) + */ +@property (nonatomic, readonly) STPCardFundingType funding; + +/** + Two-letter ISO code representing the issuing country of the card. + */ +@property (nonatomic, nullable, readonly) NSString *country; + +/** + This is only applicable when tokenizing debit cards to issue payouts to managed + accounts. You should not set it otherwise. The card can then be used as a + transfer destination for funds in this currency. + */ +@property (nonatomic, nullable, readonly) NSString *currency; + +/** + A set of key/value pairs associated with the card object. + + @see https://stripe.com/docs/api#metadata + */ +@property (nonatomic, copy, nullable, readonly) NSDictionary *metadata; + +/** + Returns a string representation for the provided card brand; + i.e. `[NSString stringFromBrand:STPCardBrandVisa] == @"Visa"`. + + @param brand the brand you want to convert to a string + + @return A string representing the brand, suitable for displaying to a user. + */ ++ (NSString *)stringFromBrand:(STPCardBrand)brand; + +/** + This parses a string representing a card's brand into the appropriate + STPCardBrand enum value, + i.e. `[STPCard brandFromString:@"American Express"] == STPCardBrandAmex`. + + The string values themselves are specific to Stripe as listed in the Stripe API + documentation. + + @see https://stripe.com/docs/api#card_object-brand + + @param string a string representing the card's brand as returned from + the Stripe API + + @return an enum value mapped to that string. If the string is unrecognized, + returns STPCardBrandUnknown. + */ ++ (STPCardBrand)brandFromString:(NSString *)string; + +#pragma mark - Deprecated methods + +/** + The Stripe ID for the card. + */ +@property (nonatomic, readonly) NSString *cardId DEPRECATED_MSG_ATTRIBUTE("Use stripeID (defined in STPSourceProtocol)"); + +/** + The first line of the cardholder's address + */ +@property (nonatomic, nullable, readonly) NSString *addressLine1 DEPRECATED_MSG_ATTRIBUTE("Use address.line1"); + +/** + The second line of the cardholder's address + */ +@property (nonatomic, nullable, readonly) NSString *addressLine2 DEPRECATED_MSG_ATTRIBUTE("Use address.line2"); + +/** + The city of the cardholder's address + */ +@property (nonatomic, nullable, readonly) NSString *addressCity DEPRECATED_MSG_ATTRIBUTE("Use address.city"); + +/** + The state of the cardholder's address + */ +@property (nonatomic, nullable, readonly) NSString *addressState DEPRECATED_MSG_ATTRIBUTE("Use address.state"); + +/** + The zip code of the cardholder's address + */ +@property (nonatomic, nullable, readonly) NSString *addressZip DEPRECATED_MSG_ATTRIBUTE("Use address.postalCode"); + +/** + The country of the cardholder's address + */ +@property (nonatomic, nullable, readonly) NSString *addressCountry DEPRECATED_MSG_ATTRIBUTE("Use address.country"); + +/** + Create an STPCard from a Stripe API response. + + @param cardID The Stripe ID of the card, e.g. `card_185iQx4JYtv6MPZKfcuXwkOx` + @param brand The brand of the card (e.g. "Visa". To obtain this enum value + from a string, use `[STPCardBrand brandFromString:string]`; + @param last4 The last 4 digits of the card, e.g. 4242 + @param expMonth The card's expiration month, 1-indexed (i.e. 1 = January) + @param expYear The card's expiration year + @param funding The card's funding type (credit, debit, or prepaid). To obtain + this enum value from a string, use `[STPCardBrand fundingFromString:string]`. + + @return an STPCard instance populated with the provided values. + */ +- (instancetype)initWithID:(NSString *)cardID + brand:(STPCardBrand)brand + last4:(NSString *)last4 + expMonth:(NSUInteger)expMonth + expYear:(NSUInteger)expYear + funding:(STPCardFundingType)funding DEPRECATED_MSG_ATTRIBUTE("You cannot directly instantiate an STPCard. You should only use one that has been returned from an STPAPIClient callback."); + +/** + This parses a string representing a card's funding type into the appropriate + `STPCardFundingType` enum value, + i.e. `[STPCard fundingFromString:@"prepaid"] == STPCardFundingTypePrepaid`. + + @param string a string representing the card's funding type as returned from + the Stripe API + + @return an enum value mapped to that string. If the string is unrecognized, + returns `STPCardFundingTypeOther`. + */ ++ (STPCardFundingType)fundingFromString:(NSString *)string DEPRECATED_ATTRIBUTE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Stripe.framework/Headers/STPCardBrand.h b/Stripe.framework/Headers/STPCardBrand.h new file mode 100755 index 0000000..fae345b --- /dev/null +++ b/Stripe.framework/Headers/STPCardBrand.h @@ -0,0 +1,50 @@ +// +// STPCardBrand.h +// Stripe +// +// Created by Jack Flintermann on 7/24/15. +// Copyright (c) 2015 Stripe, Inc. All rights reserved. +// + +#import + +/** + The various card brands to which a payment card can belong. + */ +typedef NS_ENUM(NSInteger, STPCardBrand) { + + /** + Visa card + */ + STPCardBrandVisa, + + /** + American Express card + */ + STPCardBrandAmex, + + /** + MasterCard card + */ + STPCardBrandMasterCard, + + /** + Discover card + */ + STPCardBrandDiscover, + + /** + JCB card + */ + STPCardBrandJCB, + + /** + Diners Club card + */ + STPCardBrandDinersClub, + + /** + An unknown card brand type + */ + STPCardBrandUnknown, +}; diff --git a/Stripe.framework/Headers/STPCardParams.h b/Stripe.framework/Headers/STPCardParams.h new file mode 100755 index 0000000..d54495f --- /dev/null +++ b/Stripe.framework/Headers/STPCardParams.h @@ -0,0 +1,108 @@ +// +// STPCardParams.h +// Stripe +// +// Created by Jack Flintermann on 10/4/15. +// Copyright © 2015 Stripe, Inc. All rights reserved. +// + +#import + +#import "STPFormEncodable.h" +#if TARGET_OS_IPHONE +#import "STPAddress.h" +#endif + +/** + Representation of a user's credit card details. You can assemble these with + information that your user enters and then create Stripe tokens with them using + an STPAPIClient. + + @see https://stripe.com/docs/api#cards + */ +@interface STPCardParams : NSObject + +/** + The card's number. + */ +@property (nonatomic, copy, nullable) NSString *number; + +/** + The last 4 digits of the card's number, if it's been set, otherwise nil. + */ +- (nullable NSString *)last4; + +/** + The card's expiration month. + */ +@property (nonatomic) NSUInteger expMonth; + +/** + The card's expiration year. + */ +@property (nonatomic) NSUInteger expYear; + +/** + The card's security code, found on the back. + */ +@property (nonatomic, copy, nullable) NSString *cvc; + +/** + The cardholder's name. + + @note Changing this property will also changing the name of the + param's `address` property. + */ +@property (nonatomic, copy, nullable) NSString *name; + +/** + The cardholder's address. + + @note Changing this property will also changing the name of the + param's `name` property + */ +@property (nonatomic, strong, nonnull) STPAddress *address; + +/** + Three-letter ISO currency code representing the currency paid out to the bank + account. This is only applicable when tokenizing debit cards to issue payouts + to managed accounts. You should not set it otherwise. The card can then be + used as a transfer destination for funds in this currency. + */ +@property (nonatomic, copy, nullable) NSString *currency; + + +#pragma mark - Deprecated methods + +/** + The first line of the cardholder's address + */ +@property (nonatomic, copy, nullable) NSString *addressLine1 DEPRECATED_MSG_ATTRIBUTE("Use address.line1"); + +/** + The second line of the cardholder's address + */ +@property (nonatomic, copy, nullable) NSString *addressLine2 DEPRECATED_MSG_ATTRIBUTE("Use address.line2"); + +/** + The city of the cardholder's address + */ +@property (nonatomic, copy, nullable) NSString *addressCity DEPRECATED_MSG_ATTRIBUTE("Use address.city"); + +/** + The state of the cardholder's address + */ +@property (nonatomic, copy, nullable) NSString *addressState DEPRECATED_MSG_ATTRIBUTE("Use address.state"); + +/** + The zip code of the cardholder's address + */ +@property (nonatomic, copy, nullable) NSString *addressZip DEPRECATED_MSG_ATTRIBUTE("Use address.postalCode"); + +/** + The country of the cardholder's address + */ +@property (nonatomic, copy, nullable) NSString *addressCountry DEPRECATED_MSG_ATTRIBUTE("Use address.country"); + + +@end diff --git a/Stripe.framework/Headers/STPCardValidationState.h b/Stripe.framework/Headers/STPCardValidationState.h new file mode 100755 index 0000000..d7b46b6 --- /dev/null +++ b/Stripe.framework/Headers/STPCardValidationState.h @@ -0,0 +1,37 @@ +// +// STPCardValidationState.h +// Stripe +// +// Created by Jack Flintermann on 8/7/15. +// Copyright (c) 2015 Stripe, Inc. All rights reserved. +// + +#import + +/** + These fields indicate whether a card field represents a valid value, invalid + value, or incomplete value. + */ +typedef NS_ENUM(NSInteger, STPCardValidationState) { + + /** + The field's contents are valid. For example, a valid, 16-digit card number. + Note that valid values may not be complete. For example: a US Zip code can + be 5 or 9 digits. A 5-digit code is Valid, but more text could be entered + to transition to incomplete again. American Express CVC codes can be 3 or + 4 digits and both will be treated as Valid. + */ + STPCardValidationStateValid, + + /** + The field's contents are invalid. For example, an expiration date + of "13/42". + */ + STPCardValidationStateInvalid, + + /** + The field's contents are not currently valid, but could be by typing + additional characters. For example, a CVC of "1". + */ + STPCardValidationStateIncomplete +}; diff --git a/Stripe.framework/Headers/STPCardValidator.h b/Stripe.framework/Headers/STPCardValidator.h new file mode 100755 index 0000000..ab5f506 --- /dev/null +++ b/Stripe.framework/Headers/STPCardValidator.h @@ -0,0 +1,193 @@ +// +// STPCardValidator.h +// Stripe +// +// Created by Jack Flintermann on 7/15/15. +// Copyright (c) 2015 Stripe, Inc. All rights reserved. +// + +#import + +#import "STPCardBrand.h" +#import "STPCardParams.h" +#import "STPCardValidationState.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + This class contains static methods to validate card numbers, expiration dates, + and CVCs. For a list of test card numbers to use with this code, + see https://stripe.com/docs/testing + */ +@interface STPCardValidator : NSObject + +/** + Returns a copy of the passed string with all non-numeric characters removed. + */ ++ (NSString *)sanitizedNumericStringForString:(NSString *)string; + +/** + Whether or not the target string contains only numeric characters. + */ ++ (BOOL)stringIsNumeric:(NSString *)string; + +/** + Validates a card number, passed as a string. This will return + STPCardValidationStateInvalid for numbers that are too short or long, contain + invalid characters, do not pass Luhn validation, or (optionally) do not match + a number format issued by a major card brand. + + @param cardNumber The card number to validate. Ex. @"4242424242424242" + @param validatingCardBrand Whether or not to enforce that the number appears to + be issued by a major card brand (or could be). For example, no issuing card + network currently issues card numbers beginning with the digit 9; if an + otherwise correct-length and luhn-valid card number beginning with 9 + (example: 9999999999999995) were passed to this method, it would return + STPCardValidationStateInvalid if this parameter were YES and + STPCardValidationStateValid if this parameter were NO. If unsure, you should + use YES for this value. + + @return STPCardValidationStateValid if the number is valid, + STPCardValidationStateInvalid if the number is invalid, or + STPCardValidationStateIncomplete if the number is a substring of a valid + card (e.g. @"4242"). + */ ++ (STPCardValidationState)validationStateForNumber:(nullable NSString *)cardNumber + validatingCardBrand:(BOOL)validatingCardBrand; + +/** + The card brand for a card number or substring thereof. + + @param cardNumber A card number, or partial card number. For + example, @"4242", @"5555555555554444", or @"123". + + @return The brand for that card number. The example parameters would + return STPCardBrandVisa, STPCardBrandMasterCard, and + STPCardBrandUnknown, respectively. + */ ++ (STPCardBrand)brandForNumber:(NSString *)cardNumber; + +/** + The possible number lengths for cards associated with a card brand. For + example, Discover card numbers contain 16 characters, while American Express + cards contain 15 characters. + + @param brand The brand to return lengths for. + + @return The set of possible lengths cards associated with that brand can be. + */ ++ (NSSet*)lengthsForCardBrand:(STPCardBrand)brand; + + +/** + The maximum possible length the number of a card associated with the specified + brand could be. + + For example, Visa cards could be either 13 or 16 characters, so this method + would return 16 for the that card brand. + + @param brand The brand to return the max length for. + + @return The maximum length card numbers associated with that brand could be. + */ ++ (NSInteger)maxLengthForCardBrand:(STPCardBrand)brand; + +/** + The length of the final grouping of digits to use when formatting a card number + for display. + + For example, Visa cards display their final 4 numbers, e.g. "4242", while + American Express cards display their final 5 digits, e.g. "10005". + + + @param brand The brand to return the fragment length for. + + @return The final fragment length card numbers associated with that brand use. + */ ++ (NSInteger)fragmentLengthForCardBrand:(STPCardBrand)brand; + +/** + Validates an expiration month, passed as an (optionally 0-padded) string. + + Example valid values are "3", "12", and "08". Example invalid values are "99", + "a", and "00". Incomplete values include "0" and "1". + + @param expirationMonth A string representing a 2-digit expiration month for a + payment card. + + @return STPCardValidationStateValid if the month is valid, + STPCardValidationStateInvalid if the month is invalid, or + STPCardValidationStateIncomplete if the month is a substring of a valid + month (e.g. @"0" or @"1"). + */ ++ (STPCardValidationState)validationStateForExpirationMonth:(NSString *)expirationMonth; + +/** + Validates an expiration year, passed as a string representing the final + 2 digits of the year. + + This considers the period between the current year until 2099 as valid times. + An example valid year value would be "16" (assuming the current year, as + determined by [NSDate date], is 2015). + + Will return STPCardValidationStateInvalid for a month/year combination that + is earlier than the current date (i.e. @"15" and @"04" in October 2015). + Example invalid year values are "00", "a", and "13". Any 1-digit year string + will return STPCardValidationStateIncomplete. + + @param expirationYear A string representing a 2-digit expiration year for a + payment card. + @param expirationMonth A string representing a valid 2-digit expiration month + for a payment card. If the month is invalid + (see `validationStateForExpirationMonth`), this will + return STPCardValidationStateInvalid. + + @return STPCardValidationStateValid if the year is valid, + STPCardValidationStateInvalid if the year is invalid, or + STPCardValidationStateIncomplete if the year is a substring of a valid + year (e.g. @"1" or @"2"). + */ ++ (STPCardValidationState)validationStateForExpirationYear:(NSString *)expirationYear + inMonth:(NSString *)expirationMonth; + +/** + The max CVC length for a card brand (for example, American Express CVCs are + 4 digits, while all others are 3). + + @param brand The brand to return the max CVC length for. + + @return The maximum length of CVC numbers for cards associated with that brand. + */ ++ (NSUInteger)maxCVCLengthForCardBrand:(STPCardBrand)brand; + +/** + Validates a card's CVC, passed as a numeric string, for the given card brand. + + @param cvc the CVC to validate + @param brand the card brand (can be determined from the card's number + using `brandForNumber`) + + @return Whether the CVC represents a valid CVC for that card brand. For + example, would return STPCardValidationStateValid for @"123" and + STPCardBrandVisa, STPCardValidationStateValid for @"1234" and + STPCardBrandAmericanExpress, STPCardValidationStateIncomplete for @"12" and + STPCardBrandVisa, and STPCardValidationStateInvalid for @"12345" and any brand. + */ ++ (STPCardValidationState)validationStateForCVC:(NSString *)cvc + cardBrand:(STPCardBrand)brand; + +/** + Validates the given card details. + + @param card The card details to validate. + + @return STPCardValidationStateValid if all fields are valid, + STPCardValidationStateInvalid if any field is invalid, or + STPCardValidationStateIncomplete if all fields are either incomplete or valid. + */ ++ (STPCardValidationState)validationStateForCard:(STPCardParams *)card; + + +@end + +NS_ASSUME_NONNULL_END diff --git a/Stripe.framework/Headers/STPCoreScrollViewController.h b/Stripe.framework/Headers/STPCoreScrollViewController.h new file mode 100755 index 0000000..ea8e833 --- /dev/null +++ b/Stripe.framework/Headers/STPCoreScrollViewController.h @@ -0,0 +1,21 @@ +// +// STPCoreScrollViewController.h +// Stripe +// +// Created by Brian Dorfman on 1/6/17. +// Copyright © 2017 Stripe, Inc. All rights reserved. +// + +#import "STPCoreViewController.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + This is the base class for all Stripe scroll view controllers. It is intended + for use only by Stripe classes, you should not subclass it yourself in your app. + */ +@interface STPCoreScrollViewController : STPCoreViewController + +@end + +NS_ASSUME_NONNULL_END diff --git a/Stripe.framework/Headers/STPCoreTableViewController.h b/Stripe.framework/Headers/STPCoreTableViewController.h new file mode 100755 index 0000000..683c20a --- /dev/null +++ b/Stripe.framework/Headers/STPCoreTableViewController.h @@ -0,0 +1,24 @@ +// +// STPCoreTableViewController.h +// Stripe +// +// Created by Brian Dorfman on 1/6/17. +// Copyright © 2017 Stripe, Inc. All rights reserved. +// + +#import "STPCoreScrollViewController.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + This is the base class for all Stripe scroll view controllers. It is intended + for use only by Stripe classes, you should not subclass it yourself in your app. + + It inherits from STPCoreScrollViewController and changes the type of the + created scroll view to UITableView, as well as other shared table view logic. + */ +@interface STPCoreTableViewController : STPCoreScrollViewController + +@end + +NS_ASSUME_NONNULL_END diff --git a/Stripe.framework/Headers/STPCoreViewController.h b/Stripe.framework/Headers/STPCoreViewController.h new file mode 100755 index 0000000..49dacac --- /dev/null +++ b/Stripe.framework/Headers/STPCoreViewController.h @@ -0,0 +1,54 @@ +// +// STPCoreViewController.h +// Stripe +// +// Created by Brian Dorfman on 1/6/17. +// Copyright © 2017 Stripe, Inc. All rights reserved. +// + +#import + +@class STPTheme; + +NS_ASSUME_NONNULL_BEGIN + +/** + This is the base class for all Stripe view controllers. It is intended for use + only by Stripe classes, you should not subclass it yourself in your app. + + It theming, back/cancel button management, and other shared logic for + Stripe view controllers. + */ +@interface STPCoreViewController : UIViewController + +/** + A convenience initializer; equivalent to calling `initWithTheme:[STPTheme defaultTheme]`. + */ +- (instancetype)init; + + +/** + Initializes a new view controller with the specified theme + + @param theme The theme to use to inform the view controller's visual appearance. @see STPTheme + */ +- (instancetype)initWithTheme:(STPTheme *)theme NS_DESIGNATED_INITIALIZER; + + +/** + Passes through to the default UIViewController behavior for this initializer, + and then also sets the default theme as in `init` + */ +- (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil + bundle:(nullable NSBundle *)nibBundleOrNil NS_DESIGNATED_INITIALIZER; + +/** + Passes through to the default UIViewController behavior for this initializer, + and then also sets the default theme as in `init` + */ +- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder NS_DESIGNATED_INITIALIZER; + +@end + +NS_ASSUME_NONNULL_END + diff --git a/Stripe.framework/Headers/STPCustomer.h b/Stripe.framework/Headers/STPCustomer.h new file mode 100755 index 0000000..95901c5 --- /dev/null +++ b/Stripe.framework/Headers/STPCustomer.h @@ -0,0 +1,102 @@ +// +// STPCustomer.h +// Stripe +// +// Created by Jack Flintermann on 6/9/16. +// Copyright © 2016 Stripe, Inc. All rights reserved. +// + +#import +#import "STPAPIResponseDecodable.h" +#import "STPSourceProtocol.h" + +@class STPAddress; + +NS_ASSUME_NONNULL_BEGIN + +/** + An `STPCustomer` represents a deserialized Customer object from the Stripe API. + You shouldn't need to instantiate an `STPCustomer` – you should instead use + `STPCustomerContext` to manage retrieving and updating a customer. + */ +@interface STPCustomer : NSObject + +/** + Initialize a customer object with the provided values. + + @param stripeID The ID of the customer, e.g. `cus_abc` + @param defaultSource The default source of the customer, such as an `STPCard` object. Can be nil. + @param sources All of the customer's payment sources. This might be an empty array. + + @return an instance of STPCustomer + */ ++ (instancetype)customerWithStripeID:(NSString *)stripeID + defaultSource:(nullable id)defaultSource + sources:(NSArray> *)sources; + +/** + The Stripe ID of the customer, e.g. `cus_1234` + */ +@property (nonatomic, readonly, copy) NSString *stripeID; + +/** + The default source used to charge the customer. + */ +@property (nonatomic, readonly, nullable) id defaultSource; + +/** + The available payment sources the customer has (this may be an empty array). + */ +@property (nonatomic, readonly) NSArray> *sources; + +/** + The customer's shipping address. + */ +@property (nonatomic, readonly, nullable) STPAddress *shippingAddress; + +@end + +/** + Use `STPCustomerDeserializer` to convert a response from the Stripe API into an `STPCustomer` object. `STPCustomerDeserializer` expects the JSON response to be in the exact same format as the Stripe API. + */ +@interface STPCustomerDeserializer : NSObject + +/** + Initialize a customer deserializer. The `data`, `urlResponse`, and `error` + parameters are intended to be passed from an `NSURLSessionDataTask` callback. + After it has been initialized, you can inspect the `error` and `customer` + properties to see if the deserialization was successful. If `error` is nil, + `customer` will be non-nil (and vice versa). + + @param data An `NSData` object representing encoded JSON for a Customer object + @param urlResponse The URL response obtained from the `NSURLSessionTask` + @param error Any error that occurred from the URL session task (if this + is non-nil, the `error` property will be set to this value after initialization). + */ +- (instancetype)initWithData:(nullable NSData *)data + urlResponse:(nullable NSURLResponse *)urlResponse + error:(nullable NSError *)error; + +/** + Initializes a customer deserializer with a JSON dictionary. This JSON should be + in the exact same format as what the Stripe API returns. If it's successfully + parsed, the `customer` parameter will be present after initialization; + otherwise `error` will be present. + + @param json a JSON dictionary. + */ +- (instancetype)initWithJSONResponse:(id)json; + +/** + If a customer was successfully parsed from the response, it will be set here. Otherwise, this value wil be nil (and the `error` property will explain what went wrong). + */ +@property (nonatomic, readonly, nullable) STPCustomer *customer; + +/** + If the deserializer failed to parse a customer, this property will explain why (and the `customer` property will be nil). + */ +@property (nonatomic, readonly, nullable) NSError *error; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Stripe.framework/Headers/STPCustomerContext.h b/Stripe.framework/Headers/STPCustomerContext.h new file mode 100755 index 0000000..827cf8e --- /dev/null +++ b/Stripe.framework/Headers/STPCustomerContext.h @@ -0,0 +1,51 @@ +// +// STPCustomerContext.h +// Stripe +// +// Created by Ben Guo on 5/2/17. +// Copyright © 2017 Stripe, Inc. All rights reserved. +// + +#import + +#import "STPBackendAPIAdapter.h" + +NS_ASSUME_NONNULL_BEGIN + +@protocol STPEphemeralKeyProvider; +@class STPEphemeralKey, STPEphemeralKeyManager; + +/** + An `STPCustomerContext` retrieves and updates a Stripe customer using + an ephemeral key, a short-lived API key scoped to a specific customer object. + If your current user logs out of your app and a new user logs in, be sure to + either create a new instance of `STPCustomerContext` or clear the current + instance's cached customer. On your backend, be sure to create and return a + new ephemeral key for the Customer object associated with the new user. + */ +@interface STPCustomerContext : NSObject + +/** + Initializes a new `STPCustomerContext` with the specified key provider. + Upon initialization, a CustomerContext will fetch a new ephemeral key from + your backend and use it to prefetch the customer object specified in the key. + Subsequent customer retrievals (e.g. by `STPPaymentContext`) will return the + prefetched customer immediately if its age does not exceed `cachedCustomerMaxAge`. + + @param keyProvider The key provider the customer context will use. + @return the newly-instantiated customer context. + */ +- (instancetype)initWithKeyProvider:(id)keyProvider; + +/** + `STPCustomerContext` will cache its customer object for up to 60 seconds. + If your current user logs out of your app and a new user logs in, be sure + to either call this method or create a new instance of `STPCustomerContext`. + On your backend, be sure to create and return a new ephemeral key for the + customer object associated with the new user. + */ +- (void)clearCachedCustomer; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Stripe.framework/Headers/STPEphemeralKeyProvider.h b/Stripe.framework/Headers/STPEphemeralKeyProvider.h new file mode 100755 index 0000000..7da4a4c --- /dev/null +++ b/Stripe.framework/Headers/STPEphemeralKeyProvider.h @@ -0,0 +1,46 @@ +// +// STPEphemeralKeyProvider.h +// Stripe +// +// Created by Ben Guo on 5/9/17. +// Copyright © 2017 Stripe, Inc. All rights reserved. +// + +#import + +#import "STPBlocks.h" + +NS_ASSUME_NONNULL_BEGIN + +@class STPEphemeralKey; + +/** + You should make your application's API client conform to this interface. + It provides a way for `STPCustomerContext` to request a new ephemeral key from + your backend, which it will use to retrieve and update a Stripe customer. + */ +@protocol STPEphemeralKeyProvider + +/** + Creates a new ephemeral key for retrieving and updating a Stripe customer. + On your backend, you should create a new ephemeral key for the Stripe customer + associated with your user, and return the raw JSON response from the Stripe API. + For an example Ruby implementation of this API, refer to our example backend: + https://github.com/stripe/example-ios-backend/blob/master/web.rb + + Back in your iOS app, once you have a response from this API, call the provided + completion block with the JSON response, or an error if one occurred. + + @param apiVersion The Stripe API version to use when creating a key. + You should pass this parameter to your backend, and use it to set the API version + in your key creation request. Passing this version parameter ensures that the + Stripe SDK can always parse the ephemeral key response from your server. + @param completion Call this callback when you're done fetching a new ephemeral + key from your backend. For example, `completion(json, nil)` (if your call succeeds) + or `completion(nil, error)` if an error is returned. + */ +- (void)createCustomerKeyWithAPIVersion:(NSString *)apiVersion completion:(STPJSONResponseCompletionBlock)completion; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Stripe.framework/Headers/STPFile.h b/Stripe.framework/Headers/STPFile.h new file mode 100755 index 0000000..cde4fbc --- /dev/null +++ b/Stripe.framework/Headers/STPFile.h @@ -0,0 +1,77 @@ +// +// STPFile.h +// Stripe +// +// Created by Charles Scalesse on 11/30/16. +// Copyright © 2016 Stripe, Inc. All rights reserved. +// + +#import +#import "STPAPIResponseDecodable.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + The purpose of the uploaded file. + + @see https://stripe.com/docs/file-upload + */ +typedef NS_ENUM(NSInteger, STPFilePurpose) { + + /** + Identity document file + */ + STPFilePurposeIdentityDocument, + + /** + Dispute evidence file + */ + STPFilePurposeDisputeEvidence, + + /** + A file of unknown purpose type + */ + STPFilePurposeUnknown, +}; + +/** + Representation of a file upload object in the Stripe API. + + @see https://stripe.com/docs/api#file_uploads + */ +@interface STPFile : NSObject + +/** + The token for this file. + */ +@property (nonatomic, readonly) NSString *fileId; + +/** + The date this file was created. + */ +@property (nonatomic, readonly) NSDate *created; + +/** + The purpose of this file. This can be either an identifing document or an evidence dispute. + @see https://stripe.com/docs/file-upload + */ +@property (nonatomic, readonly) STPFilePurpose purpose; + +/** + The file size in bytes. + */ +@property (nonatomic, readonly) NSNumber *size; + +/** + The file type. This can be "jpg", "png", or "pdf". + */ +@property (nonatomic, readonly) NSString *type; + +/** + Returns the string value for a purpose. + */ ++ (nullable NSString *)stringFromPurpose:(STPFilePurpose)purpose; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Stripe.framework/Headers/STPFormEncodable.h b/Stripe.framework/Headers/STPFormEncodable.h new file mode 100755 index 0000000..873f9a0 --- /dev/null +++ b/Stripe.framework/Headers/STPFormEncodable.h @@ -0,0 +1,39 @@ +// +// STPFormEncodable.h +// Stripe +// +// Created by Jack Flintermann on 10/14/15. +// Copyright © 2015 Stripe, Inc. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + Objects conforming to STPFormEncodable can be automatically converted to a form-encoded string, which can then be used when making requests to the Stripe API. + */ +@protocol STPFormEncodable + +/** + The root object name to be used when converting this object to a form-encoded string. For example, if this returns @"card", then the form-encoded output will resemble @"card[foo]=bar" (where 'foo' and 'bar' are specified by `propertyNamesToFormFieldNamesMapping` below. + */ ++ (nullable NSString *)rootObjectName; + +/** + This maps properties on an object that is being form-encoded into parameter names in the Stripe API. For example, STPCardParams has a field called `expMonth`, but the Stripe API expects a field called `exp_month`. This dictionary represents a mapping from the former to the latter (in other words, [STPCardParams propertyNamesToFormFieldNamesMapping][@"expMonth"] == @"exp_month".) + */ ++ (NSDictionary *)propertyNamesToFormFieldNamesMapping; + +/** + You can use this property to add additional fields to an API request that are not explicitly defined by the object's interface. This can be useful when using beta features that haven't been added to the Stripe SDK yet. For example, if the /v1/tokens API began to accept a beta field called "test_field", you might do the following: + STPCardParams *cardParams = [STPCardParams new]; + // add card values + cardParams.additionalAPIParameters = @{@"test_field": @"example_value"}; + [[STPAPIClient sharedClient] createTokenWithCard:cardParams completion:...]; + */ +@property (nonatomic, readwrite, copy) NSDictionary *additionalAPIParameters; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Stripe.framework/Headers/STPImageLibrary.h b/Stripe.framework/Headers/STPImageLibrary.h new file mode 100755 index 0000000..fcf6a0d --- /dev/null +++ b/Stripe.framework/Headers/STPImageLibrary.h @@ -0,0 +1,83 @@ +// +// STPImages.h +// Stripe +// +// Created by Jack Flintermann on 6/30/16. +// Copyright © 2016 Stripe, Inc. All rights reserved. +// + +#import +#import +#import "STPCardBrand.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + This class lets you access card icons used by the Stripe SDK. All icons are 32 x 20 points. + */ +@interface STPImageLibrary : NSObject + +/** + An icon representing Apple Pay. + */ ++ (UIImage *)applePayCardImage; + +/** + An icon representing American Express. + */ ++ (UIImage *)amexCardImage; + +/** + An icon representing Diners Club. + */ ++ (UIImage *)dinersClubCardImage; + +/** + An icon representing Discover. + */ ++ (UIImage *)discoverCardImage; + +/** + An icon representing JCB. + */ ++ (UIImage *)jcbCardImage; + +/** + An icon representing MasterCard. + */ ++ (UIImage *)masterCardCardImage; + +/** + An icon representing Visa. + */ ++ (UIImage *)visaCardImage; + +/** + An icon to use when the type of the card is unknown. + */ ++ (UIImage *)unknownCardCardImage; + +/** + This returns the appropriate icon for the specified card brand. + */ ++ (UIImage *)brandImageForCardBrand:(STPCardBrand)brand; + +/** + This returns the appropriate icon for the specified card brand as a + single color template that can be tinted + */ ++ (UIImage *)templatedBrandImageForCardBrand:(STPCardBrand)brand; + +/** + This returns a small icon indicating the CVC location for the given card brand. + */ ++ (UIImage *)cvcImageForCardBrand:(STPCardBrand)brand; + +/** + This returns a small icon indicating a card number error for the given card brand. + */ ++ (UIImage *)errorImageForCardBrand:(STPCardBrand)brand; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Stripe.framework/Headers/STPPaymentActivityIndicatorView.h b/Stripe.framework/Headers/STPPaymentActivityIndicatorView.h new file mode 100755 index 0000000..41cb610 --- /dev/null +++ b/Stripe.framework/Headers/STPPaymentActivityIndicatorView.h @@ -0,0 +1,32 @@ +// +// STPPaymentActivityIndicatorView.h +// Stripe +// +// Created by Jack Flintermann on 5/12/16. +// Copyright © 2016 Stripe, Inc. All rights reserved. +// + +#import + +/** + This class can be used wherever you'd use a `UIActivityIndicatorView` and is intended to have a similar API. It renders as a spinning circle with a gap in it, similar to what you see in the App Store app or in the Apple Pay dialog when making a purchase. To change its color, set the `tintColor` property. + */ +@interface STPPaymentActivityIndicatorView : UIView + +/** + Tell the view to start or stop spinning. If `hidesWhenStopped` is true, it will fade in/out if animated is true. + */ +- (void)setAnimating:(BOOL)animating + animated:(BOOL)animated; + +/** + Whether or not the view is animating. + */ +@property (nonatomic) BOOL animating; + +/** + If true, the view will hide when it is not spinning. Default is true. + */ +@property (nonatomic) BOOL hidesWhenStopped; + +@end diff --git a/Stripe.framework/Headers/STPPaymentCardTextField.h b/Stripe.framework/Headers/STPPaymentCardTextField.h new file mode 100755 index 0000000..0d505d7 --- /dev/null +++ b/Stripe.framework/Headers/STPPaymentCardTextField.h @@ -0,0 +1,379 @@ +// +// STPPaymentCardTextField.h +// Stripe +// +// Created by Jack Flintermann on 7/16/15. +// Copyright (c) 2015 Stripe, Inc. All rights reserved. +// + +#import + +#import "STPCard.h" + +@class STPPaymentCardTextField; +@protocol STPPaymentCardTextFieldDelegate; + +/** + STPPaymentCardTextField is a text field with similar properties to UITextField, + but specialized for collecting credit/debit card information. It manages + multiple UITextFields under the hood to collect this information. It's + designed to fit on a single line, and from a design perspective can be used + anywhere a UITextField would be appropriate. + */ +IB_DESIGNABLE +@interface STPPaymentCardTextField : UIControl + +/** + @see STPPaymentCardTextFieldDelegate + */ +@property (nonatomic, weak, nullable) IBOutlet id delegate; + +/** + The font used in each child field. Default is [UIFont systemFontOfSize:18]. + + Set this property to nil to reset to the default. + */ +@property (nonatomic, copy, null_resettable) UIFont *font UI_APPEARANCE_SELECTOR; + +/** + The text color to be used when entering valid text. Default is [UIColor blackColor]. + + Set this property to nil to reset to the default. + */ +@property (nonatomic, copy, null_resettable) UIColor *textColor UI_APPEARANCE_SELECTOR; + +/** + The text color to be used when the user has entered invalid information, + such as an invalid card number. + + Default is [UIColor redColor]. Set this property to nil to reset to the default. + */ +@property (nonatomic, copy, null_resettable) UIColor *textErrorColor UI_APPEARANCE_SELECTOR; + +/** + The text placeholder color used in each child field. + + This will also set the color of the card placeholder icon. + + Default is [UIColor lightGrayColor]. Set this property to nil to reset to the default. + */ +@property (nonatomic, copy, null_resettable) UIColor *placeholderColor UI_APPEARANCE_SELECTOR; + +/** + The placeholder for the card number field. + + Default is @"4242424242424242". + + If this is set to something that resembles a card number, it will automatically + format it as such (in other words, you don't need to add spaces to this string). + */ +@property (nonatomic, copy, nullable) IBInspectable NSString *numberPlaceholder; + +/** + The placeholder for the expiration field. Defaults to @"MM/YY". + */ +@property (nonatomic, copy, nullable) IBInspectable NSString *expirationPlaceholder; + +/** + The placeholder for the cvc field. Defaults to @"CVC". + */ +@property (nonatomic, copy, nullable) IBInspectable NSString *cvcPlaceholder; + +/** + The placeholder for the postal code field. Defaults to @"ZIP" for United States + or @"Postal" for all other country codes. + */ +@property (nonatomic, copy, nullable) IBInspectable NSString *postalCodePlaceholder; + +/** + The cursor color for the field. + + This is a proxy for the view's tintColor property, exposed for clarity only + (in other words, calling setCursorColor is identical to calling setTintColor). + */ +@property (nonatomic, copy, null_resettable) UIColor *cursorColor UI_APPEARANCE_SELECTOR; + +/** + The border color for the field. + + Can be nil (in which case no border will be drawn). + + Default is [UIColor lightGrayColor]. + */ +@property (nonatomic, copy, nullable) UIColor *borderColor UI_APPEARANCE_SELECTOR; + +/** + The width of the field's border. + + Default is 1.0. + */ +@property (nonatomic, assign) CGFloat borderWidth UI_APPEARANCE_SELECTOR; + +/** + The corner radius for the field's border. + + Default is 5.0. + */ +@property (nonatomic, assign) CGFloat cornerRadius UI_APPEARANCE_SELECTOR; + +/** + The keyboard appearance for the field. + + Default is UIKeyboardAppearanceDefault. + */ +@property (nonatomic, assign) UIKeyboardAppearance keyboardAppearance UI_APPEARANCE_SELECTOR; + +/** + This behaves identically to setting the inputView for each child text field. + */ +@property (nonatomic, strong, nullable) UIView *inputView; + +/** + This behaves identically to setting the inputAccessoryView for each child text field. + */ +@property (nonatomic, strong, nullable) UIView *inputAccessoryView; + +/** +The curent brand image displayed in the receiver. + */ +@property (nonatomic, nullable, readonly) UIImage *brandImage; + +/** + Whether or not the form currently contains a valid card number, + expiration date, CVC, and postal code (if required). + + @see STPCardValidator + */ +@property (nonatomic, readonly) BOOL isValid; + +/** + Enable/disable selecting or editing the field. Useful when submitting card details to Stripe. + */ +@property(nonatomic, getter=isEnabled) BOOL enabled; + +/** + The current card number displayed by the field. + + May or may not be valid, unless `isValid` is true, in which case it is guaranteed + to be valid. + */ +@property (nonatomic, readonly, nullable) NSString *cardNumber; + +/** + The current expiration month displayed by the field (1 = January, etc). + + May or may not be valid, unless `isValid` is true, in which case it is + guaranteed to be valid. + */ +@property (nonatomic, readonly) NSUInteger expirationMonth; + +/** + The current expiration month displayed by the field, as a string. T + + This may or may not be a valid entry (i.e. "0") unless `isValid` is true. + It may be also 0-prefixed (i.e. "01" for January). + */ +@property (nonatomic, readonly, nullable) NSString *formattedExpirationMonth; + +/** + The current expiration year displayed by the field, modulo 100 + (e.g. the year 2015 will be represented as 15). + + May or may not be valid, unless `isValid` is true, in which case it is + guaranteed to be valid. + */ +@property (nonatomic, readonly) NSUInteger expirationYear; + +/** + The current expiration year displayed by the field, as a string. + + This is a 2-digit year (i.e. "15"), and may or may not be a valid entry + unless `isValid` is true. + */ +@property (nonatomic, readonly, nullable) NSString *formattedExpirationYear; + +/** + The current card CVC displayed by the field. + + May or may not be valid, unless `isValid` is true, in which case it + is guaranteed to be valid. + */ +@property (nonatomic, readonly, nullable) NSString *cvc; + +/** + The current card ZIP or postal code displayed by the field. + */ +@property (nonatomic, readonly, nullable) NSString *postalCode; + +/** + Controls if a postal code entry field can be displayed to the user. + + Default is NO (no postal code entry will ever be displayed). + + If YES, the type of code entry shown is controlled by the set `countryCode` + value. Some country codes may result in no postal code entry being shown if + those countries do not commonly use postal codes. + */ +@property (nonatomic, assign, readwrite) BOOL postalCodeEntryEnabled; + + +/** + The two-letter ISO country code that corresponds to the user's billing address. + + If `postalCodeEntryEnabled` is YES, this controls which type of entry is allowed. + If `postalCodeEntryEnabled` is NO, this property currently has no effect. + + If set to nil and postal code entry is enabled, the country from the user's current + locale will be filled in. Otherwise the specific country code set will be used. + + By default this will fetch the user's current country code from NSLocale. + */ +@property (nonatomic, copy, nullable) NSString *countryCode; + +/** + Convenience property for creating an STPCardParams from the currently entered information + or programmatically setting the field's contents. For example, if you're using another library + to scan your user's credit card with a camera, you can assemble that data into an STPCardParams + object and set this property to that object to prefill the fields you've collected. + */ +@property (nonatomic, strong, readwrite, nonnull) STPCardParams *cardParams; + +/** + Causes the text field to begin editing. Presents the keyboard. + + @return Whether or not the text field successfully began editing. + @see UIResponder + */ +- (BOOL)becomeFirstResponder; + +/** + Causes the text field to stop editing. Dismisses the keyboard. + + @return Whether or not the field successfully stopped editing. + @see UIResponder + */ +- (BOOL)resignFirstResponder; + +/** + Resets all of the contents of all of the fields. If the field is currently being edited, the number field will become selected. + */ +- (void)clear; + +/** + Returns the cvc image used for a card brand. + Override this method in a subclass if you would like to provide custom images. + @param cardBrand The brand of card entered. + @return The cvc image used for a card brand. + */ ++ (nullable UIImage *)cvcImageForCardBrand:(STPCardBrand)cardBrand; + +/** + Returns the brand image used for a card brand. + Override this method in a subclass if you would like to provide custom images. + @param cardBrand The brand of card entered. + @return The brand image used for a card brand. + */ ++ (nullable UIImage *)brandImageForCardBrand:(STPCardBrand)cardBrand; + +/** + Returns the error image used for a card brand. + Override this method in a subclass if you would like to provide custom images. + @param cardBrand The brand of card entered. + @return The error image used for a card brand. + */ ++ (nullable UIImage *)errorImageForCardBrand:(STPCardBrand)cardBrand; + +/** + Returns the rectangle in which the receiver draws its brand image. + @param bounds The bounding rectangle of the receiver. + @return the rectangle in which the receiver draws its brand image. + */ +- (CGRect)brandImageRectForBounds:(CGRect)bounds; + +/** + Returns the rectangle in which the receiver draws the text fields. + @param bounds The bounding rectangle of the receiver. + @return The rectangle in which the receiver draws the text fields. + */ +- (CGRect)fieldsRectForBounds:(CGRect)bounds; + +@end + +/** + This protocol allows a delegate to be notified when a payment text field's + contents change, which can in turn be used to take further actions depending + on the validity of its contents. + */ +@protocol STPPaymentCardTextFieldDelegate +@optional +/** + Called when either the card number, expiration, or CVC changes. At this point, + one can call `isValid` on the text field to determine, for example, + whether or not to enable a button to submit the form. Example: + + - (void)paymentCardTextFieldDidChange:(STPPaymentCardTextField *)textField { + self.paymentButton.enabled = textField.isValid; + } + + @param textField the text field that has changed + */ +- (void)paymentCardTextFieldDidChange:(nonnull STPPaymentCardTextField *)textField; + + +/** + Called when editing begins in the text field as a whole. + + After receiving this callback, you will always also receive a callback for which + specific subfield of the view began editing. + */ +- (void)paymentCardTextFieldDidBeginEditing:(nonnull STPPaymentCardTextField *)textField; + + +/** + Called when editing ends in the text field as a whole. + + This callback is always preceded by an callback for which + specific subfield of the view ended its editing. + */ +- (void)paymentCardTextFieldDidEndEditing:(nonnull STPPaymentCardTextField *)textField; + +/** + Called when editing begins in the payment card field's number field. + */ +- (void)paymentCardTextFieldDidBeginEditingNumber:(nonnull STPPaymentCardTextField *)textField; + +/** + Called when editing ends in the payment card field's number field. + */ +- (void)paymentCardTextFieldDidEndEditingNumber:(nonnull STPPaymentCardTextField *)textField; + +/** + Called when editing begins in the payment card field's CVC field. + */ +- (void)paymentCardTextFieldDidBeginEditingCVC:(nonnull STPPaymentCardTextField *)textField; + +/** + Called when editing ends in the payment card field's CVC field. + */ +- (void)paymentCardTextFieldDidEndEditingCVC:(nonnull STPPaymentCardTextField *)textField; + +/** + Called when editing begins in the payment card field's expiration field. + */ +- (void)paymentCardTextFieldDidBeginEditingExpiration:(nonnull STPPaymentCardTextField *)textField; + +/** + Called when editing ends in the payment card field's expiration field. + */ +- (void)paymentCardTextFieldDidEndEditingExpiration:(nonnull STPPaymentCardTextField *)textField; + +/** + Called when editing begins in the payment card field's ZIP/postal code field. + */ +- (void)paymentCardTextFieldDidBeginEditingPostalCode:(nonnull STPPaymentCardTextField *)textField; + +/** + Called when editing ends in the payment card field's ZIP/postal code field. + */ +- (void)paymentCardTextFieldDidEndEditingPostalCode:(nonnull STPPaymentCardTextField *)textField; +@end diff --git a/Stripe.framework/Headers/STPPaymentConfiguration.h b/Stripe.framework/Headers/STPPaymentConfiguration.h new file mode 100755 index 0000000..d4aa8cc --- /dev/null +++ b/Stripe.framework/Headers/STPPaymentConfiguration.h @@ -0,0 +1,112 @@ +// +// STPPaymentConfiguration.h +// Stripe +// +// Created by Jack Flintermann on 5/18/16. +// Copyright © 2016 Stripe, Inc. All rights reserved. +// + +#import +#import "STPBackendAPIAdapter.h" +#import "STPPaymentMethod.h" +#import "STPTheme.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + An `STPPaymentConfiguration` represents all the options you can set or change + around a payment. + + You provide an `STPPaymentConfiguration` object to your `STPPaymentContext` + when making a charge. The configuration generally has settings that + will not change from payment to payment and thus is reusable, while the context + is specific to a single particular payment instance. + */ +@interface STPPaymentConfiguration : NSObject + +/** + This is a convenience singleton configuration that uses the default values for + every property + */ ++ (instancetype)sharedConfiguration; + +/** + Your Stripe publishable key + + @see https://dashboard.stripe.com/account/apikeys + */ +@property (nonatomic, copy, readwrite) NSString *publishableKey; + +/** + An enum value representing which payment methods you will accept from your user + in addition to credit cards. Unless you have a very specific reason not to, you + should leave this at the default, `STPPaymentMethodTypeAll`. + */ +@property (nonatomic, assign, readwrite) STPPaymentMethodType additionalPaymentMethods; + +/** + The billing address fields the user must fill out when prompted for their + payment details. These fields will all be present on the returned token from + Stripe. + + @see https://stripe.com/docs/api#create_card_token + */ +@property (nonatomic, assign, readwrite) STPBillingAddressFields requiredBillingAddressFields; + +/** + The shipping address fields the user must fill out when prompted for their + shipping info. + */ +@property (nonatomic, assign, readwrite) PKAddressField requiredShippingAddressFields; + +/** + Whether the user should be prompted to verify prefilled shipping information. + + The default value is YES. + */ +@property (nonatomic, assign, readwrite) BOOL verifyPrefilledShippingAddress; + +/** + The type of shipping for this purchase. This property sets the labels displayed + when the user is prompted for shipping info, and whether they should also be + asked to select a shipping method. + + The default value is STPShippingTypeShipping. + */ +@property (nonatomic, assign, readwrite) STPShippingType shippingType; + +/** + The name of your company, for displaying to the user during payment flows. For + example, when using Apple Pay, the payment sheet's final line item will read + "PAY {companyName}". + + The default value is the name of your iOS application which is derived from the + `kCFBundleNameKey` of `[NSBundle mainBundle]`. + */ +@property (nonatomic, copy, readwrite) NSString *companyName; + +/** + The Apple Merchant Identifier to use during Apple Pay transactions. To create + one of these, see our guide at https://stripe.com/docs/mobile/apple-pay . You + must set this to a valid identifier in order to automatically enable Apple Pay. + */ +@property (nonatomic, copy, nullable, readwrite) NSString *appleMerchantIdentifier; + +/** + Determines whether or not the user is able to delete payment methods + + This is only relevant to the `STPPaymentMethodsViewController` which, if + enabled, will allow the user to delete payment methods by tapping the "Edit" + button in the navigation bar or by swiping left on a payment method and tapping + "Delete". Currently, the user is not allowed to delete the selected payment + method but this may change in the future. + + Default value is YES but will only work if `STPPaymentMethodsViewController` is + initialized with a `STPCustomerContext` either through the `STPPaymentContext` + or directly as an init parameter. + */ +@property (nonatomic, assign, readwrite) BOOL canDeletePaymentMethods; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Stripe.framework/Headers/STPPaymentContext.h b/Stripe.framework/Headers/STPPaymentContext.h new file mode 100755 index 0000000..b61b4c8 --- /dev/null +++ b/Stripe.framework/Headers/STPPaymentContext.h @@ -0,0 +1,392 @@ +// +// STPPaymentContext.h +// Stripe +// +// Created by Jack Flintermann on 4/20/16. +// Copyright © 2016 Stripe, Inc. All rights reserved. +// + + +#import +#import + +#import "STPAddress.h" +#import "STPBlocks.h" +#import "STPPaymentConfiguration.h" +#import "STPPaymentMethod.h" +#import "STPPaymentResult.h" +#import "STPUserInformation.h" + +NS_ASSUME_NONNULL_BEGIN + +@class STPPaymentContext, STPAPIClient, STPTheme, STPCustomerContext; +@protocol STPBackendAPIAdapter, STPPaymentMethod, STPPaymentContextDelegate; + +/** + An `STPPaymentContext` keeps track of all of the state around a payment. It will manage fetching a user's saved payment methods, tracking any information they select, and prompting them for required additional information before completing their purchase. It can be used to power your application's "payment confirmation" page with just a few lines of code. + + `STPPaymentContext` also provides a unified interface to multiple payment methods - for example, you can write a single integration to accept both credit card payments and Apple Pay. + + `STPPaymentContext` saves information about a user's payment methods to a Stripe customer object, and requires an `STPCustomerContext` to manage retrieving and modifying the customer. + */ +@interface STPPaymentContext : NSObject + +/** + This is a convenience initializer; it is equivalent to calling + `initWithCustomerContext:customerContext + configuration:[STPPaymentConfiguration sharedConfiguration] + theme:[STPTheme defaultTheme]`. + + @param customerContext The customer context the payment context will use to fetch + and modify its Stripe customer. @see STPCustomerContext.h + @return the newly-instantiated payment context + */ +- (instancetype)initWithCustomerContext:(STPCustomerContext *)customerContext; + +/** + Initializes a new Payment Context with the provided customer context, configuration, + and theme. After this class is initialized, you should also make sure to set its + `delegate` and `hostViewController` properties. + + @param customerContext The customer context the payment context will use to fetch + and modify its Stripe customer. @see STPCustomerContext.h + @param configuration The configuration for the payment context to use. This + lets you set your Stripe publishable API key, required billing address fields, etc. + @see STPPaymentConfiguration.h + @param theme The theme describing the visual appearance of all UI + that the payment context automatically creates for you. @see STPTheme.h + @return the newly-instantiated payment context + */ +- (instancetype)initWithCustomerContext:(STPCustomerContext *)customerContext + configuration:(STPPaymentConfiguration *)configuration + theme:(STPTheme *)theme; + +/** + Note: Instead of providing your own backend API adapter, we recommend using + `STPCustomerContext`, which will manage retrieving and updating a + Stripe customer for you. @see STPCustomerContext.h + + This is a convenience initializer; it is equivalent to calling + `initWithAPIAdapter:apiAdapter configuration:[STPPaymentConfiguration sharedConfiguration] theme:[STPTheme defaultTheme]`. + */ +- (instancetype)initWithAPIAdapter:(id)apiAdapter; + +/** + Note: Instead of providing your own backend API adapter, we recommend using + `STPCustomerContext`, which will manage retrieving and updating a + Stripe customer for you. @see STPCustomerContext.h + + Initializes a new Payment Context with the provided API adapter and configuration. + After this class is initialized, you should also make sure to set its `delegate` + and `hostViewController` properties. + + @param apiAdapter The API adapter the payment context will use to fetch and + modify its contents. You need to make a class conforming to this protocol that + talks to your server. @see STPBackendAPIAdapter.h + @param configuration The configuration for the payment context to use. This lets + you set your Stripe publishable API key, required billing address fields, etc. + @see STPPaymentConfiguration.h + @param theme The theme describing the visual appearance of all UI that + the payment context automatically creates for you. @see STPTheme.h + + @return the newly-instantiated payment context + */ +- (instancetype)initWithAPIAdapter:(id)apiAdapter + configuration:(STPPaymentConfiguration *)configuration + theme:(STPTheme *)theme; + +/** + Note: Instead of providing your own backend API adapter, we recommend using + `STPCustomerContext`, which will manage retrieving and updating a + Stripe customer for you. @see STPCustomerContext.h + + The API adapter the payment context will use to fetch and modify its contents. + You need to make a class conforming to this protocol that talks to your server. + @see STPBackendAPIAdapter.h + */ +@property (nonatomic, readonly) id apiAdapter; + +/** + The configuration for the payment context to use internally. @see STPPaymentConfiguration.h + */ +@property (nonatomic, readonly) STPPaymentConfiguration *configuration; + +/** + The visual appearance that will be used by any views that the context generates. @see STPTheme.h + */ +@property (nonatomic, readonly) STPTheme *theme; + +/** + If you've already collected some information from your user, you can set it here and it'll be automatically filled out when possible/appropriate in any UI that the payment context creates. + */ +@property (nonatomic, strong, nullable) STPUserInformation *prefilledInformation; + +/** + The view controller that any additional UI will be presented on. If you have a "checkout view controller" in your app, that should be used as the host view controller. + */ +@property (nonatomic, weak, nullable) UIViewController *hostViewController; + +/** + This delegate will be notified when the payment context's contents change. @see STPPaymentContextDelegate + */ +@property (nonatomic, weak, nullable) id delegate; + +/** + Whether or not the payment context is currently loading information from the network. + */ +@property (nonatomic, readonly) BOOL loading; + +/** + The user's currently selected payment method. May be nil. + */ +@property (nonatomic, readonly, nullable) id selectedPaymentMethod; + +/** + The available payment methods the user can choose between. May be nil. + */ +@property (nonatomic, readonly, nullable) NSArray> *paymentMethods; + +/** + The user's currently selected shipping method. May be nil. + */ +@property (nonatomic, readonly, nullable) PKShippingMethod *selectedShippingMethod; + +/** + An array of STPShippingMethod objects that describe the supported shipping methods. May be nil. + */ +@property (nonatomic, readonly, nullable) NSArray *shippingMethods; + +/** + The user's shipping address. May be nil. + If you've already collected a shipping address from your user, you may + prefill it by setting a shippingAddress in PaymentContext's prefilledInformation. + When your user enters a new shipping address, PaymentContext will save it to + the current customer object. When PaymentContext loads, if you haven't + manually set a prefilled value, any shipping information saved on the customer + will be used to prefill the shipping address form. Note that because your + customer's email may not be the same as the email provided with their shipping + info, PaymentContext will not prefill the shipping form's email using your + customer's email. + + You should not rely on the shipping information stored on the Stripe customer + for order fulfillment, as your user may change this information if they make + multiple purchases. We recommend adding shipping information when you create + a charge (which can also help prevent fraud), or saving it to your own + database. https://stripe.com/docs/api#create_charge-shipping + + Note: by default, your user will still be prompted to verify a prefilled + shipping address. To change this behavior, you can set + `verifyPrefilledShippingAddress` to NO in your `STPPaymentConfiguration`. + */ +@property (nonatomic, readonly, nullable) STPAddress *shippingAddress; + +/** + The amount of money you're requesting from the user, in the smallest currency + unit for the selected currency. For example, to indicate $10 USD, use 1000 + (i.e. 1000 cents). For more information, see https://stripe.com/docs/api#charge_object-amount + + @note This value must be present and greater than zero in order for Apple Pay + to be automatically enabled. + + @note You should only set either this or `paymentSummaryItems`, not both. + The other will be automatically calculated on demand using your `paymentCurrency`. + */ +@property (nonatomic) NSInteger paymentAmount; + +/** + The three-letter currency code for the currency of the payment (i.e. USD, GBP, + JPY, etc). Defaults to "USD". + + @note Changing this property may change the return value of `paymentAmount` + or `paymentSummaryItems` (whichever one you didn't directly set yourself). + */ +@property (nonatomic, copy) NSString *paymentCurrency; + +/** + The two-letter country code for the country where the payment will be processed. + You should set this to the country your Stripe account is in. Defaults to "US". + + @note Changing this property will change the `countryCode` of your Apple Pay + payment requests. + @see PKPaymentRequest for more information. + */ +@property (nonatomic, copy) NSString *paymentCountry; + +/** + If you support Apple Pay, you can optionally set the PKPaymentSummaryItems + you want to display here instead of using `paymentAmount`. Note that the + grand total (the amount of the last summary item) must be greater than zero. + If not set, a single summary item will be automatically generated using + `paymentAmount` and your configuration's `companyName`. + @see PKPaymentRequest for more information + + @note You should only set either this or `paymentAmount`, not both. + The other will be automatically calculated on demand using your `paymentCurrency.` + */ +@property (nonatomic, copy) NSArray *paymentSummaryItems; + +/** + The presentation style used for all view controllers presented modally by the context. + Since custom transition styles are not supported, you should set this to either + `UIModalPresentationFullScreen`, `UIModalPresentationPageSheet`, or `UIModalPresentationFormSheet`. + The default value is `UIModalPresentationFullScreen`. + */ +@property (nonatomic, assign) UIModalPresentationStyle modalPresentationStyle; + +/** + A view that will be placed as the footer of the payment methods selection + view controller. + + When the footer view needs to be resized, it will be sent a + `sizeThatFits:` call. The view should respond correctly to this method in order + to be sized and positioned properly. + */ +@property (nonatomic, strong) UIView *paymentMethodsViewControllerFooterView; + +/** + A view that will be placed as the footer of the add card view controller. + + When the footer view needs to be resized, it will be sent a + `sizeThatFits:` call. The view should respond correctly to this method in order + to be sized and positioned properly. + */ +@property (nonatomic, strong) UIView *addCardViewControllerFooterView; + +/** + If `paymentContext:didFailToLoadWithError:` is called on your delegate, you + can in turn call this method to try loading again (if that hasn't been called, + calling this will do nothing). If retrying in turn fails, `paymentContext:didFailToLoadWithError:` + will be called again (and you can again call this to keep retrying, etc). + */ +- (void)retryLoading; + +/** + This creates, configures, and appropriately presents an `STPPaymentMethodsViewController` + on top of the payment context's `hostViewController`. It'll be dismissed automatically + when the user is done selecting their payment method. + + @note This method will do nothing if it is called while STPPaymentContext is + already showing a view controller or in the middle of requesting a payment. + */ +- (void)presentPaymentMethodsViewController; + +/** + This creates, configures, and appropriately pushes an `STPPaymentMethodsViewController` + onto the navigation stack of the context's `hostViewController`. It'll be popped + automatically when the user is done selecting their payment method. + + @note This method will do nothing if it is called while STPPaymentContext is + already showing a view controller or in the middle of requesting a payment. + */ +- (void)pushPaymentMethodsViewController; + +/** + This creates, configures, and appropriately presents a view controller for + collecting shipping address and shipping method on top of the payment context's + `hostViewController`. It'll be dismissed automatically when the user is done + entering their shipping info. + + @note This method will do nothing if it is called while STPPaymentContext is + already showing a view controller or in the middle of requesting a payment. + */ +- (void)presentShippingViewController; + +/** + This creates, configures, and appropriately pushes a view controller for + collecting shipping address and shipping method onto the navigation stack of + the context's `hostViewController`. It'll be popped automatically when the + user is done entering their shipping info. + + @note This method will do nothing if it is called while STPPaymentContext is + already showing a view controller, or in the middle of requesting a payment. + */ +- (void)pushShippingViewController; + +/** + Requests payment from the user. This may need to present some supplemental UI + to the user, in which case it will be presented on the payment context's + `hostViewController`. For instance, if they've selected Apple Pay as their + payment method, calling this method will show the payment sheet. If the user + has a card on file, this will use that without presenting any additional UI. + After this is called, the `paymentContext:didCreatePaymentResult:completion:` + and `paymentContext:didFinishWithStatus:error:` methods will be called on the + context's `delegate`. + + @note This method will do nothing if it is called while STPPaymentContext is + already showing a view controller, or in the middle of requesting a payment. + */ +- (void)requestPayment; + +@end + +/** + Implement `STPPaymentContextDelegate` to get notified when a payment context changes, finishes, encounters errors, etc. In practice, if your app has a "checkout screen view controller", that is a good candidate to implement this protocol. + */ +@protocol STPPaymentContextDelegate + +/** + Called when the payment context encounters an error when fetching its initial set of data. A few ways to handle this are: + - If you're showing the user a checkout page, dismiss the checkout page when this is called and present the error to the user. + - Present the error to the user using a `UIAlertController` with two buttons: Retry and Cancel. If they cancel, dismiss your UI. If they Retry, call `retryLoading` on the payment context. + + To make it harder to get your UI into a bad state, this won't be called until the context's `hostViewController` has finished appearing. + + @param paymentContext the payment context that encountered the error + @param error the error that was encountered + */ +- (void)paymentContext:(STPPaymentContext *)paymentContext didFailToLoadWithError:(NSError *)error; + +/** + This is called every time the contents of the payment context change. When this is called, you should update your app's UI to reflect the current state of the payment context. For example, if you have a checkout page with a "selected payment method" row, you should update its payment method with `paymentContext.selectedPaymentMethod.label`. If that checkout page has a "buy" button, you should enable/disable it depending on the result of `[paymentContext isReadyForPayment]`. + + @param paymentContext the payment context that changed + */ +- (void)paymentContextDidChange:(STPPaymentContext *)paymentContext; + +/** + Inside this method, you should make a call to your backend API to make a charge with that Customer + source, and invoke the `completion` block when that is done. + + @param paymentContext The context that succeeded + @param paymentResult Information associated with the payment that you can pass to your server. You should go to your backend API with this payment result and make a charge to complete the payment, passing `paymentResult.source.stripeID` as the `source` parameter to the create charge method and your customer's ID as the `customer` parameter (see stripe.com/docs/api#charge_create for more info). Once that's done call the `completion` block with any error that occurred (or none, if the charge succeeded). @see STPPaymentResult.h + @param completion Call this block when you're done creating a charge (or subscription, etc) on your backend. If it succeeded, call `completion(nil)`. If it failed with an error, call `completion(error)`. + */ +- (void)paymentContext:(STPPaymentContext *)paymentContext +didCreatePaymentResult:(STPPaymentResult *)paymentResult + completion:(STPErrorBlock)completion; + +/** + This is invoked by an `STPPaymentContext` when it is finished. This will be called after the payment is done and all necessary UI has been dismissed. You should inspect the returned `status` and behave appropriately. For example: if it's `STPPaymentStatusSuccess`, show the user a receipt. If it's `STPPaymentStatusError`, inform the user of the error. If it's `STPPaymentStatusUserCanceled`, do nothing. + + @param paymentContext The payment context that finished + @param status The status of the payment - `STPPaymentStatusSuccess` if it succeeded, `STPPaymentStatusError` if it failed with an error (in which case the `error` parameter will be non-nil), `STPPaymentStatusUserCanceled` if the user canceled the payment. + @param error An error that occurred, if any. + */ +- (void)paymentContext:(STPPaymentContext *)paymentContext + didFinishWithStatus:(STPPaymentStatus)status + error:(nullable NSError *)error; + +@optional +/** + Inside this method, you should verify that you can ship to the given address. + You should call the completion block with the results of your validation + and the available shipping methods for the given address. If you don't implement + this method, the user won't be prompted to select a shipping method and all + addresses will be valid. + + @note If a user updates their shipping address within the Apple Pay dialog, + this address will be anonymized. For example, in the US, it will only include the + city, state, and zip code. The payment context will have the user's complete + shipping address by the time `paymentContext:didFinishWithStatus:error` is + called. + + @param paymentContext The context that updated its shipping address + @param address The current shipping address + @param completion Call this block when you're done validating the shipping address and calculating available shipping methods. + */ +- (void)paymentContext:(STPPaymentContext *)paymentContext +didUpdateShippingAddress:(STPAddress *)address + completion:(STPShippingMethodsCompletionBlock)completion; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Stripe.framework/Headers/STPPaymentMethod.h b/Stripe.framework/Headers/STPPaymentMethod.h new file mode 100755 index 0000000..8a94163 --- /dev/null +++ b/Stripe.framework/Headers/STPPaymentMethod.h @@ -0,0 +1,64 @@ +// +// STPPaymentMethod.h +// Stripe +// +// Created by Ben Guo on 4/19/16. +// Copyright © 2016 Stripe, Inc. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + This represents all of the payment methods available to your user when + configuring an `STPPaymentContext`. This is in addition to card payments, which + are always enabled. + */ +typedef NS_OPTIONS(NSUInteger, STPPaymentMethodType) { + /** + Don't allow any payment methods except for cards. + */ + STPPaymentMethodTypeNone = 0, + + /** + The user is allowed to pay with Apple Pay if it's configured and available + on their device. + */ + STPPaymentMethodTypeApplePay = 1 << 0, + + /** + The user is allowed to use any available payment method to pay. + */ + STPPaymentMethodTypeAll = STPPaymentMethodTypeApplePay +}; + +/** + This protocol represents a payment method that a user can select and use to + pay. Currently the only classes that conform to it are `STPCard`, which + represents that the user wants to pay with a specific card, and + `STPApplePayPaymentMethod`, which represents that the user wants to pay with + Apple Pay. + */ +@protocol STPPaymentMethod + +/** + A small (32 x 20 points) logo image representing the payment method. For + example, the Visa logo for a Visa card, or the Apple Pay logo. + */ +@property (nonatomic, strong, readonly) UIImage *image; + +/** + A small (32 x 20 points) logo image representing the payment method that can be + used as template for tinted icons. + */ +@property (nonatomic, strong, readonly) UIImage *templateImage; + +/** + A string describing the payment method, such as "Apple Pay" or "Visa 4242". + */ +@property (nonatomic, strong, readonly) NSString *label; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Stripe.framework/Headers/STPPaymentMethodsViewController.h b/Stripe.framework/Headers/STPPaymentMethodsViewController.h new file mode 100755 index 0000000..31f3bbd --- /dev/null +++ b/Stripe.framework/Headers/STPPaymentMethodsViewController.h @@ -0,0 +1,193 @@ +// +// STPPaymentMethodsViewController.h +// Stripe +// +// Created by Jack Flintermann on 1/12/16. +// Copyright © 2016 Stripe, Inc. All rights reserved. +// + +#import + +#import "STPBackendAPIAdapter.h" +#import "STPCoreViewController.h" +#import "STPPaymentConfiguration.h" +#import "STPPaymentMethod.h" +#import "STPUserInformation.h" + +NS_ASSUME_NONNULL_BEGIN + +@protocol STPPaymentMethod, STPPaymentMethodsViewControllerDelegate; +@class STPPaymentContext, STPPaymentMethodsViewController, STPCustomerContext; + +/** + This view controller presents a list of payment method options to the user, + which they can select between. They can also add credit cards to the list. + + It must be displayed inside a `UINavigationController`, so you can either + create a `UINavigationController` with an `STPPaymentMethodsViewController` + as the `rootViewController` and then present the `UINavigationController`, + or push a new `STPPaymentMethodsViewController` onto an existing + `UINavigationController`'s stack. You can also have `STPPaymentContext` do this + for you automatically, by calling `presentPaymentMethodsViewController` + or `pushPaymentMethodsViewController` on it. + */ +@interface STPPaymentMethodsViewController : STPCoreViewController + +/** + The delegate for the view controller. + + The delegate receives callbacks when the user selects a method or cancels, + and is responsible for dismissing the payments methods view controller when + it is finished. + */ +@property (nonatomic, nullable, weak, readonly) iddelegate; + +/** + Creates a new payment methods view controller. + + @param paymentContext A payment context to power the view controller's view. + The payment context will in turn use its backend API adapter to fetch the + information it needs from your application. + + @return an initialized view controller. + */ +- (instancetype)initWithPaymentContext:(STPPaymentContext *)paymentContext; + +/** + Initializes a new payment methods view controller without using a + payment context. + + @param configuration The configuration to use to determine what types of + payment method to offer your user. @see STPPaymentConfiguration.h + + @param theme The theme to inform the appearance of the UI. + @param customerContext The customer context the view controller will use to + fetch and modify its Stripe customer + @param delegate A delegate that will be notified when the payment + methods view controller's selection changes. + + @return an initialized view controller. + */ +- (instancetype)initWithConfiguration:(STPPaymentConfiguration *)configuration + theme:(STPTheme *)theme + customerContext:(STPCustomerContext *)customerContext + delegate:(id)delegate; + +/** + Note: Instead of providing your own backend API adapter, we recommend using + `STPCustomerContext`, which will manage retrieving and updating a + Stripe customer for you. @see STPCustomerContext.h + + Initializes a new payment methods view controller without using + a payment context. + + @param configuration The configuration to use to determine what types of + payment method to offer your user. + @param theme The theme to inform the appearance of the UI. + @param apiAdapter The API adapter to use to retrieve a customer's stored + payment methods and save new ones. + @param delegate A delegate that will be notified when the payment methods + view controller's selection changes. + */ +- (instancetype)initWithConfiguration:(STPPaymentConfiguration *)configuration + theme:(STPTheme *)theme + apiAdapter:(id)apiAdapter + delegate:(id)delegate; + +/** + If you've already collected some information from your user, you can set it + here and it'll be automatically filled out when possible/appropriate in any UI + that the payment context creates. +*/ +@property (nonatomic, strong, nullable) STPUserInformation *prefilledInformation; + +/** + A view that will be placed as the footer of the view controller when it is + showing a list of saved payment methods to select from. + + When the footer view needs to be resized, it will be sent a + `sizeThatFits:` call. The view should respond correctly to this method in order + to be sized and positioned properly. + */ +@property (nonatomic, strong) UIView *paymentMethodsViewControllerFooterView; + +/** + A view that will be placed as the footer of the view controller when it is + showing the add card view. + + When the footer view needs to be resized, it will be sent a + `sizeThatFits:` call. The view should respond correctly to this method in order + to be sized and positioned properly. + */ +@property (nonatomic, strong) UIView *addCardViewControllerFooterView; + +/** + If you're pushing `STPPaymentMethodsViewController` onto an existing + `UINavigationController`'s stack, you should use this method to dismiss it, + since it may have pushed an additional add card view controller onto the + navigation controller's stack. + + @param completion The callback to run after the view controller is dismissed. + You may specify nil for this parameter. + */ +- (void)dismissWithCompletion:(nullable STPVoidBlock)completion; + +@end + +/** + An `STPPaymentMethodsViewControllerDelegate` responds when a user selects a + payment method from (or cancels) an `STPPaymentMethodsViewController`. In both + of these instances, you should dismiss the view controller (either by popping + it off the navigation stack, or dismissing it). + */ +@protocol STPPaymentMethodsViewControllerDelegate + +/** + This is called when the view controller encounters an error fetching the user's + payment methods from its API adapter. You should dismiss the view controller + when this is called. + + @param paymentMethodsViewController the view controller in question + @param error the error that occurred + */ +- (void)paymentMethodsViewController:(STPPaymentMethodsViewController *)paymentMethodsViewController + didFailToLoadWithError:(NSError *)error; + +/** + This is called when the user selects or adds a payment method, so it will often + be called immediately after calling `paymentMethodsViewController:didSelectPaymentMethod:`. + You should dismiss the view controller when this is called. + + @param paymentMethodsViewController the view controller that has finished + */ +- (void)paymentMethodsViewControllerDidFinish:(STPPaymentMethodsViewController *)paymentMethodsViewController; + +/** + This is called when the user taps "cancel". + You should dismiss the view controller when this is called. + + @param paymentMethodsViewController the view controller that has finished + */ +- (void)paymentMethodsViewControllerDidCancel:(STPPaymentMethodsViewController *)paymentMethodsViewController; + +@optional +/** + This is called when the user either makes a selection, or adds a new card. + This will be triggered after the view controller loads with the user's current + selection (if they have one) and then subsequently when they change their + choice. You should use this callback to update any necessary UI in your app + that displays the user's currently selected payment method. You should *not* + dismiss the view controller at this point, instead do this in + `paymentMethodsViewControllerDidFinish:`. `STPPaymentMethodsViewController` + will also call the necessary methods on your API adapter, so you don't need to + call them directly during this method. + + @param paymentMethodsViewController the view controller in question + @param paymentMethod the selected payment method + */ +- (void)paymentMethodsViewController:(STPPaymentMethodsViewController *)paymentMethodsViewController + didSelectPaymentMethod:(id)paymentMethod; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Stripe.framework/Headers/STPPaymentResult.h b/Stripe.framework/Headers/STPPaymentResult.h new file mode 100755 index 0000000..2b501f0 --- /dev/null +++ b/Stripe.framework/Headers/STPPaymentResult.h @@ -0,0 +1,33 @@ +// +// STPPaymentResult.h +// Stripe +// +// Created by Jack Flintermann on 1/15/16. +// Copyright © 2016 Stripe, Inc. All rights reserved. +// + +#import +#import "STPSourceProtocol.h" + +NS_ASSUME_NONNULL_BEGIN + +@class STPAddress; + +/** + When you're using `STPPaymentContext` to request your user's payment details, this is the object that will be returned to your application when they've successfully made a payment. It currently just contains a `source`, but in the future will include any relevant metadata as well. You should pass `source.stripeID` to your server, and call the charge creation endpoint. This assumes you are charging a Customer, so you should specify the `customer` parameter to be that customer's ID and the `source` parameter to the value returned here. For more information, see https://stripe.com/docs/api#create_charge + */ +@interface STPPaymentResult : NSObject + +/** + The returned source that the user has selected. This may come from a variety of different payment methods, such as an Apple Pay payment or a stored credit card. @see STPSource.h + */ +@property (nonatomic, readonly) id source; + +/** + Initializes the payment result with a given source. This is invoked by `STPPaymentContext` internally; you shouldn't have to call it directly. + */ +- (nonnull instancetype)initWithSource:(id)source; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Stripe.framework/Headers/STPRedirectContext.h b/Stripe.framework/Headers/STPRedirectContext.h new file mode 100755 index 0000000..0cb42c2 --- /dev/null +++ b/Stripe.framework/Headers/STPRedirectContext.h @@ -0,0 +1,182 @@ +// +// STPRedirectContext.h +// Stripe +// +// Created by Brian Dorfman on 3/29/17. +// Copyright © 2017 Stripe, Inc. All rights reserved. +// + +#import +#import "STPBlocks.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + Possible states for the redirect context to be in + */ +typedef NS_ENUM(NSUInteger, STPRedirectContextState) { + /** + Initialized, but redirect not started. + */ + STPRedirectContextStateNotStarted, + + /** + Redirect is in progress. + */ + STPRedirectContextStateInProgress, + + /** + Redirect has been cancelled programmatically before completing. + */ + STPRedirectContextStateCancelled, + + /** + Redirect has completed. + */ + STPRedirectContextStateCompleted +}; + +/** + A callback run when the context believes the redirect action has been completed. + + @param sourceID The stripe id of the source. + @param clientSecret The client secret of the source. + @param error An error if one occured. Note that a lack of an error does not + mean that the action was completed successfully, the presence of one confirms + that it was not. Currently the only possible error the context can know about + is if SFSafariViewController fails its initial load (like the user has no + internet connection, or servers are down). + */ +typedef void (^STPRedirectContextCompletionBlock)(NSString *sourceID, NSString *clientSecret, NSError *error); + +/** + This is a helper class for handling redirect sources. + + Init an instance with the redirect flow source you want to handle, + then choose a redirect method. The context will fire the completion handler + when the redirect completes. + + Due to the nature of iOS, very little concrete information can be gained + during this process, as all actions take place in either the Safari app + or the sandboxed SFSafariViewController class. The context attempts to + detect when the user has completed the necessary redirect action by listening + for both app foregrounds and url callbacks received in the app delegate. + However, it is possible the when the redirect is "completed", the user may + have not actually completed the necessary actions to authorize the charge. + + You can use `STPAPIClient` to listen for state changes on the source + object as a way to identify whether the user action succeeded or not. + @see `[STPAPIClient startPollingSourceWithId:clientSecret:timeout:completion:]` + + You should not use either this class, nor `STPAPIClient`, as a way + to determine when you should charge the source. Use Stripe webhooks on your + backend server to listen for source state changes and to make the charge. + */ +NS_EXTENSION_UNAVAILABLE("Redirect based sources are not available in extensions") +@interface STPRedirectContext : NSObject + +/** + The current state of the context. + */ +@property (nonatomic, readonly) STPRedirectContextState state; + +/** + Initializer for context. + + @note You must ensure that the returnURL set up in the created source + correctly goes to your app so that users can be returned once + they complete the redirect in the web broswer. + + @param source The source that needs user redirect action to be taken. + @param completion A block to fire when the action is believed to have + been completed. + + @return Nil if the specified source is not a redirect-flow source. Otherwise + a new context object. + + @note Firing of the completion block does not necessarily mean the user + successfully performed the redirect action. You should listen for source status + change webhooks on your backend to determine the result of a redirect. + */ +- (nullable instancetype)initWithSource:(STPSource *)source + completion:(STPRedirectContextCompletionBlock)completion; + +/** + Use `initWithSource:completion:` + */ +- (instancetype)init NS_UNAVAILABLE; + +/** + Starts a redirect flow. + + You must ensure that your app delegate listens for the `returnURL` that you + set on your source object, and forwards it to the Stripe SDK so that the + context can be notified when the redirect is completed and dismiss the + view controller. See `[Stripe handleStripeURLCallbackWithURL:]` + + The context will listen for both received URLs and app open notifications + and fire its completion block when either the URL is received, or the next + time the app is foregrounded. + + If the app is running on iOS 9+ it will initiate the flow by presenting + a SFSafariViewController instance from the pass in view controller. + Otherwise, if the app is running on iOS 8 it will initiate the flow by + bouncing the user out to the Safari app. If you want more manual control + over the redirect method, you can use + `startSafariViewControllerRedirectFlowFromViewController` + or `startSafariAppRedirectFlow` + + If the source supports a native app, and that app is is installed on the user's + device, this call will do a direct app-to-app redirect instead of showing + a web url. + + @note This method does nothing if the context is not in the + `STPRedirectContextStateNotStarted` state. + + @param presentingViewController The view controller to present the Safari + view controller from. + */ +- (void)startRedirectFlowFromViewController:(UIViewController *)presentingViewController; + +/** + Starts a redirect flow by presenting an SFSafariViewController in your app + from the passed in view controller. + + You must ensure that your app delegate listens for the `returnURL` that you + set on your source object, and forwards it to the Stripe SDK so that the + context can be notified when the redirect is completed and dismiss the + view controller. See `[Stripe handleStripeURLCallbackWithURL:]` + + The context will listen for both received URLs and app open notifications + and fire its completion block when either the URL is received, or the next + time the app is foregrounded. + + @note This method does nothing if the context is not in the + `STPRedirectContextStateNotStarted` state. + + @param presentingViewController The view controller to present the Safari + view controller from. + */ +- (void)startSafariViewControllerRedirectFlowFromViewController:(UIViewController *)presentingViewController NS_AVAILABLE_IOS(9_0); + +/** + Starts a redirect flow by calling `openURL` to bounce the user out to + the Safari app. + + The context will listen for app open notifications and fire its completion + block the next time the user re-opens the app (either manually or via url) + + @note This method does nothing if the context is not in the + `STPRedirectContextStateNotStarted` state. + */ +- (void)startSafariAppRedirectFlow; + +/** + Dismisses any presented views and stops listening for any + app opens or callbacks. The completion block will not be fired. + */ +- (void)cancel; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Stripe.framework/Headers/STPShippingAddressViewController.h b/Stripe.framework/Headers/STPShippingAddressViewController.h new file mode 100755 index 0000000..d41c664 --- /dev/null +++ b/Stripe.framework/Headers/STPShippingAddressViewController.h @@ -0,0 +1,102 @@ +// +// STPShippingAddressViewController.h +// Stripe +// +// Created by Ben Guo on 8/29/16. +// Copyright © 2016 Stripe, Inc. All rights reserved. +// + +#import +#import + +#import "STPCoreTableViewController.h" +#import "STPPaymentContext.h" + +NS_ASSUME_NONNULL_BEGIN + +@protocol STPShippingAddressViewControllerDelegate; + +/** This view controller contains a shipping address collection form. It renders a right bar button item that submits the form, so it must be shown inside a `UINavigationController`. Depending on your configuration's shippingType, the view controller may present a shipping method selection form after the user enters an address. + */ +@interface STPShippingAddressViewController : STPCoreTableViewController + +/** + A convenience initializer; equivalent to calling `initWithConfiguration:[STPPaymentConfiguration sharedConfiguration] theme:[STPTheme defaultTheme] currency:nil shippingAddress:nil selectedShippingMethod:nil prefilledInformation:nil`. + */ +- (instancetype)init; + +/** + Initializes a new `STPShippingAddressViewController` with the given payment context and sets the payment context as its delegate. + + @param paymentContext The payment context to use. + */ +- (instancetype)initWithPaymentContext:(STPPaymentContext *)paymentContext; + +/** + Initializes a new `STPShippingAddressCardViewController` with the provided parameters. + + @param configuration The configuration to use (this determines the required shipping address fields and shipping type). @see STPPaymentConfiguration + @param theme The theme to use to inform the view controller's visual appearance. @see STPTheme + @param currency The currency to use when displaying amounts for shipping methods. The default is USD. + @param shippingAddress If set, the shipping address view controller will be pre-filled with this address. @see STPAddress + @param selectedShippingMethod If set, the shipping methods view controller will use this method as the selected shipping method. If `selectedShippingMethod` is nil, the first shipping method in the array of methods returned by your delegate will be selected. + @param prefilledInformation If set, the shipping address view controller will be pre-filled with this information. @see STPUserInformation + */ +- (instancetype)initWithConfiguration:(STPPaymentConfiguration *)configuration + theme:(STPTheme *)theme + currency:(nullable NSString *)currency + shippingAddress:(nullable STPAddress *)shippingAddress + selectedShippingMethod:(nullable PKShippingMethod *)selectedShippingMethod + prefilledInformation:(nullable STPUserInformation *)prefilledInformation; + +/** + The view controller's delegate. This must be set before showing the view controller in order for it to work properly. @see STPShippingAddressViewControllerDelegate + */ +@property (nonatomic, weak) id delegate; + +/** + If you're pushing `STPShippingAddressViewController` onto an existing `UINavigationController`'s stack, you should use this method to dismiss it, since it may have pushed an additional shipping method view controller onto the navigation controller's stack. + + @param completion The callback to run after the view controller is dismissed. You may specify nil for this parameter. + */ +- (void)dismissWithCompletion:(nullable STPVoidBlock)completion; + +@end + +/** + An `STPShippingAddressViewControllerDelegate` is notified when an `STPShippingAddressViewController` receives an address, completes with an address, or is cancelled. + */ +@protocol STPShippingAddressViewControllerDelegate + +/** + Called when the user cancels entering a shipping address. You should dismiss (or pop) the view controller at this point. + + @param addressViewController the view controller that has been cancelled + */ +- (void)shippingAddressViewControllerDidCancel:(STPShippingAddressViewController *)addressViewController; + +/** + This is called when the user enters a shipping address and taps next. You should validate the address and determine what shipping methods are available, and call the `completion` block when finished. If an error occurrs, call the `completion` block with the error. Otherwise, call the `completion` block with a nil error and an array of available shipping methods. If you don't need to collect a shipping method, you may pass an empty array. + + @param addressViewController the view controller where the address was entered + @param address the address that was entered. @see STPAddress + @param completion call this callback when you're done validating the address and determining available shipping methods. + */ +- (void)shippingAddressViewController:(STPShippingAddressViewController *)addressViewController + didEnterAddress:(STPAddress *)address + completion:(STPShippingMethodsCompletionBlock)completion; + +/** + This is called when the user selects a shipping method. If no shipping methods are given, or if the shipping type doesn't require a shipping method, this will be called after the user has a shipping address and your validation has succeeded. After updating your app with the user's shipping info, you should dismiss (or pop) the view controller. Note that if `shippingMethod` is non-nil, there will be an additional shipping methods view controller on the navigation controller's stack. + + @param addressViewController the view controller where the address was entered + @param address the address that was entered. @see STPAddress + @param method the shipping method that was selected. + */ +- (void)shippingAddressViewController:(STPShippingAddressViewController *)addressViewController + didFinishWithAddress:(STPAddress *)address + shippingMethod:(nullable PKShippingMethod *)method; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Stripe.framework/Headers/STPSource.h b/Stripe.framework/Headers/STPSource.h new file mode 100755 index 0000000..7e36239 --- /dev/null +++ b/Stripe.framework/Headers/STPSource.h @@ -0,0 +1,131 @@ +// +// STPSource.h +// Stripe +// +// Created by Ben Guo on 1/23/17. +// Copyright © 2017 Stripe, Inc. All rights reserved. +// + +#import + +#import "STPAPIResponseDecodable.h" +#import "STPSourceCardDetails.h" +#import "STPSourceEnums.h" +#import "STPSourceOwner.h" +#import "STPSourceProtocol.h" +#import "STPSourceReceiver.h" +#import "STPSourceRedirect.h" +#import "STPSourceSEPADebitDetails.h" +#import "STPSourceVerification.h" + +NS_ASSUME_NONNULL_BEGIN + +@class STPSourceOwner, STPSourceReceiver, STPSourceRedirect, STPSourceVerification; + +/** + Representation of a customer's payment instrument created with the Stripe API. @see https://stripe.com/docs/api#sources + */ +@interface STPSource : NSObject + +/** + You cannot directly instantiate an `STPSource`. You should only use one that + has been returned from an `STPAPIClient` callback. + */ +- (instancetype)init __attribute__((unavailable("You cannot directly instantiate an STPSource. You should only use one that has been returned from an STPAPIClient callback."))); + +/** + The amount associated with the source. + */ +@property (nonatomic, nullable, readonly) NSNumber *amount; + +/** + The client secret of the source. Used for client-side fetching of a source + using a publishable key. + */ +@property (nonatomic, nullable, readonly) NSString *clientSecret; + +/** + When the source was created. + */ +@property (nonatomic, nullable, readonly) NSDate *created; + +/** + The currency associated with the source. + */ +@property (nonatomic, nullable, readonly) NSString *currency; + +/** + The authentication flow of the source. + */ +@property (nonatomic, readonly) STPSourceFlow flow; + +/** + Whether or not this source was created in livemode. + */ +@property (nonatomic, readonly) BOOL livemode; + +/** + A set of key/value pairs associated with the source object. + + @see https://stripe.com/docs/api#metadata + */ +@property (nonatomic, copy, nullable, readonly) NSDictionary *metadata; + +/** + Information about the owner of the payment instrument. + */ +@property (nonatomic, nullable, readonly) STPSourceOwner *owner; + +/** + Information related to the receiver flow. Present if the source's flow + is receiver. + */ +@property (nonatomic, nullable, readonly) STPSourceReceiver *receiver; + +/** + Information related to the redirect flow. Present if the source's flow + is redirect. + */ +@property (nonatomic, nullable, readonly) STPSourceRedirect *redirect; + +/** + The status of the source. + */ +@property (nonatomic, readonly) STPSourceStatus status; + +/** + The type of the source. + */ +@property (nonatomic, readonly) STPSourceType type; + +/** + Whether this source should be reusable or not. + */ +@property (nonatomic, readonly) STPSourceUsage usage; + +/** + Information related to the verification flow. Present if the source's flow + is verification. + */ +@property (nonatomic, nullable, readonly) STPSourceVerification *verification; + +/** + Information about the source specific to its type + */ +@property (nonatomic, nullable, readonly) NSDictionary *details; + +/** + If this is a card source, this property provides typed access to the + contents of the `details` dictionary. + */ +@property (nonatomic, nullable, readonly) STPSourceCardDetails *cardDetails; + +/** + If this is a SEPA Debit source, this property provides typed access to the + contents of the `details` dictionary. + */ +@property (nonatomic, nullable, readonly) STPSourceSEPADebitDetails *sepaDebitDetails; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Stripe.framework/Headers/STPSourceCardDetails.h b/Stripe.framework/Headers/STPSourceCardDetails.h new file mode 100755 index 0000000..b587f11 --- /dev/null +++ b/Stripe.framework/Headers/STPSourceCardDetails.h @@ -0,0 +1,98 @@ +// +// STPSourceCardDetails.h +// Stripe +// +// Created by Brian Dorfman on 2/23/17. +// Copyright © 2017 Stripe, Inc. All rights reserved. +// + +#import + +#import "STPAPIResponseDecodable.h" +#import "STPCard.h" + +NS_ASSUME_NONNULL_BEGIN + + +/** + The status of this card's 3D Secure support. + */ +typedef NS_ENUM(NSInteger, STPSourceCard3DSecureStatus) { + /** + 3D Secure is required. This card must be converted into a 3D Secure + source for a charge on it to be successful. + */ + STPSourceCard3DSecureStatusRequired, + + /** + 3D Secure is optional. It is not required for successful charging, + but can be performed to help reduce the likelihood of fraud. + */ + STPSourceCard3DSecureStatusOptional, + + /** + 3D Secure is not supported on this card. + */ + STPSourceCard3DSecureStatusNotSupported, + + /** + The status of 3D Secure support on this card is unknown. + */ + STPSourceCard3DSecureStatusUnknown +}; + +/** + This class provides typed access to the contents of an STPSource `details` + dictionary for card sources. + */ +@interface STPSourceCardDetails : NSObject + +/** + You cannot directly instantiate an `STPSourceCardDetails`. You should only + use one that is part of an existing `STPSource` object. + */ +- (instancetype)init __attribute__((unavailable("You cannot directly instantiate an STPSourceCardDetails. You should only use one that is part of an existing STPSource object."))); + +/** + The last 4 digits of the card. + */ +@property (nonatomic, nullable, readonly) NSString *last4; + +/** + The card's expiration month. 1-indexed (i.e. 1 == January) + */ +@property (nonatomic, readonly) NSUInteger expMonth; + +/** + The card's expiration year. + */ +@property (nonatomic, readonly) NSUInteger expYear; + +/** + The issuer of the card. + */ +@property (nonatomic, readonly) STPCardBrand brand; + +/** + The funding source for the card (credit, debit, prepaid, or other) + */ +@property (nonatomic, readonly) STPCardFundingType funding; + +/** + Two-letter ISO code representing the issuing country of the card. + */ +@property (nonatomic, nullable, readonly) NSString *country; + +/** + Whether 3D Secure is supported or required by the card. + */ +@property (nonatomic, readonly) STPSourceCard3DSecureStatus threeDSecure; + +/** + True if this card was created through Apple Pay, false otherwise. + */ +@property (nonatomic, readonly) BOOL isApplePayCard; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Stripe.framework/Headers/STPSourceEnums.h b/Stripe.framework/Headers/STPSourceEnums.h new file mode 100755 index 0000000..b5c500d --- /dev/null +++ b/Stripe.framework/Headers/STPSourceEnums.h @@ -0,0 +1,158 @@ +// +// STPSourceEnums.h +// Stripe +// +// Created by Brian Dorfman on 8/4/17. +// Copyright © 2017 Stripe, Inc. All rights reserved. +// + +/** + Authentication flows for a Source + */ +typedef NS_ENUM(NSInteger, STPSourceFlow) { + /** + No action is required from your customer. + */ + STPSourceFlowNone, + + /** + Your customer must be redirected to their online banking service (either a website or mobile banking app) to approve the payment. + */ + STPSourceFlowRedirect, + + /** + Your customer must verify ownership of their account by providing a code that you post to the Stripe API for authentication. + */ + STPSourceFlowCodeVerification, + + /** + Your customer must push funds to the account information provided. + */ + STPSourceFlowReceiver, + + /** + The source's flow is unknown. + */ + STPSourceFlowUnknown +}; + +/** + Usage types for a Source + */ +typedef NS_ENUM(NSInteger, STPSourceUsage) { + /** + The source can be reused. + */ + STPSourceUsageReusable, + + /** + The source can only be used once. + */ + STPSourceUsageSingleUse, + + /** + The source's usage is unknown. + */ + STPSourceUsageUnknown +}; + +/** + Status types for a Source + */ +typedef NS_ENUM(NSInteger, STPSourceStatus) { + /** + The source has been created and is awaiting customer action. + */ + STPSourceStatusPending, + + /** + The source is ready to use. The customer action has been completed or the + payment method requires no customer action. + */ + STPSourceStatusChargeable, + + /** + The source has been used. This status only applies to single-use sources. + */ + STPSourceStatusConsumed, + + /** + The source, which was chargeable, has expired because it was not used to + make a charge request within a specified amount of time. + */ + STPSourceStatusCanceled, + + /** + Your customer has not taken the required action or revoked your access + (e.g., did not authorize the payment with their bank or canceled their + mandate acceptance for SEPA direct debits). + */ + STPSourceStatusFailed, + + /** + The source status is unknown. + */ + STPSourceStatusUnknown, +}; + +/** + Types for a Source + + @see https://stripe.com/docs/sources + */ +typedef NS_ENUM(NSInteger, STPSourceType) { + /** + A Bancontact source. @see https://stripe.com/docs/sources/bancontact + */ + STPSourceTypeBancontact, + + /** + A Bitcoin source. @see https://stripe.com/docs/sources/bitcoin + */ + STPSourceTypeBitcoin, + + /** + A card source. @see https://stripe.com/docs/sources/cards + */ + STPSourceTypeCard, + + /** + A Giropay source. @see https://stripe.com/docs/sources/giropay + */ + STPSourceTypeGiropay, + + /** + An iDEAL source. @see https://stripe.com/docs/sources/ideal + */ + STPSourceTypeIDEAL, + + /** + A SEPA Direct Debit source. @see https://stripe.com/docs/sources/sepa-debit + */ + STPSourceTypeSEPADebit, + + /** + A SOFORT source. @see https://stripe.com/docs/sources/sofort + */ + STPSourceTypeSofort, + + /** + A 3DS card source. @see https://stripe.com/docs/sources/three-d-secure + */ + STPSourceTypeThreeDSecure, + + /** + An Alipay source. @see https://stripe.com/docs/sources/alipay + */ + STPSourceTypeAlipay, + + /** + A P24 source. @see https://stripe.com/docs/sources/p24 + */ + STPSourceTypeP24, + + /** + An unknown type of source. + */ + STPSourceTypeUnknown, +}; diff --git a/Stripe.framework/Headers/STPSourceOwner.h b/Stripe.framework/Headers/STPSourceOwner.h new file mode 100755 index 0000000..86788ae --- /dev/null +++ b/Stripe.framework/Headers/STPSourceOwner.h @@ -0,0 +1,70 @@ +// +// STPSourceOwner.h +// Stripe +// +// Created by Ben Guo on 1/25/17. +// Copyright © 2017 Stripe, Inc. All rights reserved. +// + +#import + +#import "STPAPIResponseDecodable.h" + +NS_ASSUME_NONNULL_BEGIN + +@class STPAddress; + +/** + Information about a source's owner. + */ +@interface STPSourceOwner : NSObject + +/** + You cannot directly instantiate an `STPSourceOwner`. You should only use one + that is part of an existing `STPSource` object. + */ +- (instancetype)init __attribute__((unavailable("You cannot directly instantiate an STPSourceOwner. You should only use one that is part of an existing STPSource object."))); + +/** + Owner's address. + */ +@property (nonatomic, nullable, readonly) STPAddress *address; + +/** + Owner's email address. + */ +@property (nonatomic, nullable, readonly) NSString *email; + +/** + Owner's full name. + */ +@property (nonatomic, nullable, readonly) NSString *name; + +/** + Owner's phone number. + */ +@property (nonatomic, nullable, readonly) NSString *phone; + +/** + Verified owner's address. + */ +@property (nonatomic, nullable, readonly) STPAddress *verifiedAddress; + +/** + Verified owner's email address. + */ +@property (nonatomic, nullable, readonly) NSString *verifiedEmail; + +/** + Verified owner's full name. + */ +@property (nonatomic, nullable, readonly) NSString *verifiedName; + +/** + Verified owner's phone number. + */ +@property (nonatomic, nullable, readonly) NSString *verifiedPhone; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Stripe.framework/Headers/STPSourceParams.h b/Stripe.framework/Headers/STPSourceParams.h new file mode 100755 index 0000000..fc99d75 --- /dev/null +++ b/Stripe.framework/Headers/STPSourceParams.h @@ -0,0 +1,291 @@ +// +// STPSourceParams.h +// Stripe +// +// Created by Ben Guo on 1/23/17. +// Copyright © 2017 Stripe, Inc. All rights reserved. +// + +#import + +#import "STPFormEncodable.h" +#import "STPSource.h" + +NS_ASSUME_NONNULL_BEGIN + +@class STPCardParams; + +/** + An object representing parameters used to create a Source object. + @see https://stripe.com/docs/api#create_source + */ +@interface STPSourceParams : NSObject + +/** + The type of the source to create. Required. + */ +@property (nonatomic, assign) STPSourceType type; + +/** + The raw underlying type string sent to the server. + + Generally you should use `type` instead unless you have a reason not to. + You can use this if you want to create a param of a type not yet supported + by the current version of the SDK's `STPSourceType` enum. + + Setting this to a value not known by the SDK causes `type` to + return `STPSourceTypeUnknown` + */ +@property (nonatomic, copy) NSString *rawTypeString; + +/** + A positive integer in the smallest currency unit representing the + amount to charge the customer (e.g., @1099 for a €10.99 payment). + Required for `single_use` sources. + */ +@property (nonatomic, copy, nullable) NSNumber *amount; + +/** + The currency associated with the source. This is the currency for which the source + will be chargeable once ready. + */ +@property (nonatomic, copy, nullable) NSString *currency; + +/** + The authentication flow of the source to create. `flow` may be "redirect", + "receiver", "verification", or "none". It is generally inferred unless a type + supports multiple flows. + */ +@property (nonatomic, assign) STPSourceFlow flow; + +/** + A set of key/value pairs that you can attach to a source object. + */ +@property (nonatomic, copy, nullable) NSDictionary *metadata; + +/** + Information about the owner of the payment instrument. May be used or required + by particular source types. + */ +@property (nonatomic, copy, nullable) NSDictionary *owner; + +/** + Parameters required for the redirect flow. Required if the source is + authenticated by a redirect (`flow` is "redirect"). + */ +@property (nonatomic, copy, nullable) NSDictionary *redirect; + +/** + An optional token used to create the source. When passed, token properties will + override source parameters. + */ +@property (nonatomic, copy, nullable) NSString *token; + +/** + Whether this source should be reusable or not. `usage` may be "reusable" or + "single_use". Some source types may or may not be reusable by construction, + while other may leave the option at creation. + */ +@property (nonatomic, assign) STPSourceUsage usage; + +/** + Creates params for a Bancontact source. + @see https://stripe.com/docs/bancontact#create-source + + @param amount The amount to charge the customer in EUR. + @param name The full name of the account holder. + @param returnURL The URL the customer should be redirected to after + they have successfully verified the payment. + @param statementDescriptor (Optional) A custom statement descriptor for + the payment. + + @note The currency for Bancontact must be "eur". This will be set automatically + for you. + + @return an STPSourceParams object populated with the provided values. + */ ++ (STPSourceParams *)bancontactParamsWithAmount:(NSUInteger)amount + name:(NSString *)name + returnURL:(NSString *)returnURL + statementDescriptor:(nullable NSString *)statementDescriptor; + +/** + Creates params for a Bitcoin source. + @see https://stripe.com/docs/bitcoin#creating-and-displaying-a-source-object + + @param amount The amount to charge the customer. + @param currency The currency the payment is being created in. + @param email The customer's email address. + + @return an STPSourceParams object populated with the provided values. + */ ++ (STPSourceParams *)bitcoinParamsWithAmount:(NSUInteger)amount + currency:(NSString *)currency + email:(NSString *)email; + +/** + Creates params for a Card source. + @see https://stripe.com/docs/sources/cards#create-source + + @param card An object containing the user's card details + + @return an STPSourceParams object populated with the provided card details. + */ ++ (STPSourceParams *)cardParamsWithCard:(STPCardParams *)card; + +/** + Creates params for a Giropay source. + @see https://stripe.com/docs/sources/giropay#create-source + + @param amount The amount to charge the customer in EUR. + @param name The full name of the account holder. + @param returnURL The URL the customer should be redirected to after + they have successfully verified the payment. + @param statementDescriptor (Optional) A custom statement descriptor for + the payment. + + @note The currency for Giropay must be "eur". This will be set automatically + for you. + + @return an STPSourceParams object populated with the provided values. + */ ++ (STPSourceParams *)giropayParamsWithAmount:(NSUInteger)amount + name:(NSString *)name + returnURL:(NSString *)returnURL + statementDescriptor:(nullable NSString *)statementDescriptor; + +/** + Creates params for an iDEAL source. + @see https://stripe.com/docs/sources/ideal#create-source + + @param amount The amount to charge the customer in EUR. + @param name The full name of the account holder. + @param returnURL The URL the customer should be redirected to after + they have successfully verified the payment. + @param statementDescriptor (Optional) A custom statement descriptor for t + he payment. + @param bank (Optional) The customer's bank. + + @note The currency for iDEAL must be "eur". This will be set automatically + for you. + + @return an STPSourceParams object populated with the provided values. + */ ++ (STPSourceParams *)idealParamsWithAmount:(NSUInteger)amount + name:(NSString *)name + returnURL:(NSString *)returnURL + statementDescriptor:(nullable NSString *)statementDescriptor + bank:(nullable NSString *)bank; + +/** + Creates params for a SEPA Debit source. + @see https://stripe.com/docs/sources/sepa-debit#create-source + + @param name The full name of the account holder. + @param iban The IBAN number for the bank account you wish to debit. + @param addressLine1 (Optional) The bank account holder's first address line. + @param city (Optional) The bank account holder's city. + @param postalCode (Optional) The bank account holder's postal code. + @param country (Optional) The bank account holder's two-letter + country code. + + @note The currency for SEPA Debit must be "eur". This will be set automatically + for you. + + @return an STPSourceParams object populated with the provided values. + */ ++ (STPSourceParams *)sepaDebitParamsWithName:(NSString *)name + iban:(NSString *)iban + addressLine1:(nullable NSString *)addressLine1 + city:(nullable NSString *)city + postalCode:(nullable NSString *)postalCode + country:(nullable NSString *)country; + +/** + Creates params for a Sofort source. + @see https://stripe.com/docs/sources/sofort#create-source + + @param amount The amount to charge the customer in EUR. + @param returnURL The URL the customer should be redirected to after + they have successfully verified the payment. + @param country The country code of the customer's bank. + @param statementDescriptor (Optional) A custom statement descriptor for + the payment. + + @note The currency for Sofort must be "eur". This will be set automatically + for you. + + @return an STPSourceParams object populated with the provided values. + */ ++ (STPSourceParams *)sofortParamsWithAmount:(NSUInteger)amount + returnURL:(NSString *)returnURL + country:(NSString *)country + statementDescriptor:(nullable NSString *)statementDescriptor; + +/** + Creates params for a 3DS source. + @see https://stripe.com/docs/sources/three-d-secure#create-3ds-source + + @param amount The amount to charge the customer. + @param currency The currency the payment is being created in. + @param returnURL The URL the customer should be redirected to after they have + successfully verified the payment. + @param card The ID of the card source. + + @return an STPSourceParams object populated with the provided card details. + */ ++ (STPSourceParams *)threeDSecureParamsWithAmount:(NSUInteger)amount + currency:(NSString *)currency + returnURL:(NSString *)returnURL + card:(NSString *)card; + +/** + Creates params for a single-use Alipay source + @see https://stripe.com/docs/sources/alipay#create-source + + @param amount The amount to charge the customer. + @param currency The currency the payment is being created in. + @param returnURL The URL the customer should be redirected to after they have + successfully verified the payment. + + @return An STPSourceParams object populated with the provided values + */ ++ (STPSourceParams *)alipayParamsWithAmount:(NSUInteger)amount + currency:(NSString *)currency + returnURL:(NSString *)returnURL; + +/** + Creates params for a reusable Alipay source + @see https://stripe.com/docs/sources/alipay#create-source + + @param currency The currency the payment is being created in. + @param returnURL The URL the customer should be redirected to after they have + successfully verified the payment. + + @return An STPSourceParams object populated with the provided values + */ ++ (STPSourceParams *)alipayReusableParamsWithCurrency:(NSString *)currency + returnURL:(NSString *)returnURL; + +/** + Creates params for a P24 source + @see https://stripe.com/docs/sources/p24#create-source + + @param amount The amount to charge the customer. + @param currency The currency the payment is being created in (this must be + EUR or PLN) + @param email The email address of the account holder. + @param name The full name of the account holder (optional). + @param returnURL The URL the customer should be redirected to after they have + + @return An STPSourceParams object populated with the provided values. + */ ++ (STPSourceParams *)p24ParamsWithAmount:(NSUInteger)amount + currency:(NSString *)currency + email:(NSString *)email + name:(nullable NSString *)name + returnURL:(NSString *)returnURL; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Stripe.framework/Headers/STPSourceProtocol.h b/Stripe.framework/Headers/STPSourceProtocol.h new file mode 100755 index 0000000..996a813 --- /dev/null +++ b/Stripe.framework/Headers/STPSourceProtocol.h @@ -0,0 +1,29 @@ +// +// STPSourceProtocol.h +// Stripe +// +// Created by Jack Flintermann on 1/15/16. +// Copyright © 2016 Stripe, Inc. All rights reserved. +// + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + Objects conforming to this protocol can be attached to a Stripe Customer object + as a payment source. + + @see https://stripe.com/docs/api#customer_object-sources + */ +@protocol STPSourceProtocol + +/** + The Stripe ID of the source. + */ +@property (nonatomic, readonly) NSString *stripeID; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Stripe.framework/Headers/STPSourceReceiver.h b/Stripe.framework/Headers/STPSourceReceiver.h new file mode 100755 index 0000000..4deb312 --- /dev/null +++ b/Stripe.framework/Headers/STPSourceReceiver.h @@ -0,0 +1,46 @@ +// +// STPSourceReceiver.h +// Stripe +// +// Created by Ben Guo on 1/25/17. +// Copyright © 2017 Stripe, Inc. All rights reserved. +// + +#import +#import "STPAPIResponseDecodable.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + Information related to a source's receiver flow. + */ +@interface STPSourceReceiver : NSObject + +/** + You cannot directly instantiate an `STPSourceReceiver`. You should only use one that is part of an existing `STPSource` object. + */ +- (instancetype)init __attribute__((unavailable("You cannot directly instantiate an STPSourceReceiver. You should only use one that is part of an existing STPSource object."))); + +/** + The address of the receiver source. This is the value that should be communicated to the customer to send their funds to. + */ +@property (nonatomic, nullable, readonly) NSString *address; + +/** + The total amount charged by you. + */ +@property (nonatomic, nullable, readonly) NSNumber *amountCharged; + +/** + The total amount received by the receiver source. + */ +@property (nonatomic, nullable, readonly) NSNumber *amountReceived; + +/** + The total amount that was returned to the customer. + */ +@property (nonatomic, nullable, readonly) NSNumber *amountReturned; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Stripe.framework/Headers/STPSourceRedirect.h b/Stripe.framework/Headers/STPSourceRedirect.h new file mode 100755 index 0000000..101d9c8 --- /dev/null +++ b/Stripe.framework/Headers/STPSourceRedirect.h @@ -0,0 +1,68 @@ +// +// STPSourceRedirect.h +// Stripe +// +// Created by Ben Guo on 1/25/17. +// Copyright © 2017 Stripe, Inc. All rights reserved. +// + +#import +#import "STPAPIResponseDecodable.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + Redirect status types for a Source. + */ +typedef NS_ENUM(NSInteger, STPSourceRedirectStatus) { + + /** + The redirect is pending. + */ + STPSourceRedirectStatusPending, + + /** + The redirect has succeeded. + */ + STPSourceRedirectStatusSucceeded, + + /** + The redirect has failed. + */ + STPSourceRedirectStatusFailed, + + /** + The state of the redirect is unknown. + */ + STPSourceRedirectStatusUnknown +}; + +/** + Information related to a source's redirect flow. + */ +@interface STPSourceRedirect : NSObject + +/** + You cannot directly instantiate an `STPSourceRedirect`. You should only use + one that is part of an existing `STPSource` object. + */ +- (instancetype)init __attribute__((unavailable("You cannot directly instantiate an STPSourceRedirect. You should only use one that is part of an existing STPSource object."))); + +/** + The URL you provide to redirect the customer to after they authenticated their payment. + */ +@property (nonatomic, nullable, readonly) NSURL *returnURL; + +/** + The status of the redirect. + */ +@property (nonatomic, readonly) STPSourceRedirectStatus status; + +/** + The URL provided to you to redirect a customer to as part of a redirect authentication flow. + */ +@property (nonatomic, nullable, readonly) NSURL *url; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Stripe.framework/Headers/STPSourceSEPADebitDetails.h b/Stripe.framework/Headers/STPSourceSEPADebitDetails.h new file mode 100755 index 0000000..cec97be --- /dev/null +++ b/Stripe.framework/Headers/STPSourceSEPADebitDetails.h @@ -0,0 +1,59 @@ +// +// STPSourceSEPADebitDetails.h +// Stripe +// +// Created by Brian Dorfman on 2/24/17. +// Copyright © 2017 Stripe, Inc. All rights reserved. +// + +#import + +#import "STPAPIResponseDecodable.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + This class provides typed access to the contents of an STPSource `details` + dictionary for SEPA Debit sources. + */ +@interface STPSourceSEPADebitDetails : NSObject + +/** + You cannot directly instantiate an `STPSourceSEPADebitDetails`. + You should only use one that is part of an existing `STPSource` object. + */ +- (instancetype)init __attribute__((unavailable("You cannot directly instantiate an STPSourceSEPADebitDetails. You should only use one that is part of an existing STPSource object."))); + +/** + The last 4 digits of the account number. + */ +@property (nonatomic, nullable, readonly) NSString *last4; + +/** + The account's bank code. + */ +@property (nonatomic, nullable, readonly) NSString *bankCode; + +/** + Two-letter ISO code representing the country of the bank account. + */ +@property (nonatomic, nullable, readonly) NSString *country; + +/** + The account's fingerprint. + */ +@property (nonatomic, nullable, readonly) NSString *fingerprint; + +/** + The reference of the mandate accepted by your customer. + */ +@property (nonatomic, nullable, readonly) NSString *mandateReference; + +/** + The details of the mandate accepted by your customer. + */ +@property (nonatomic, nullable, readonly) NSURL *mandateURL; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Stripe.framework/Headers/STPSourceVerification.h b/Stripe.framework/Headers/STPSourceVerification.h new file mode 100755 index 0000000..fa20087 --- /dev/null +++ b/Stripe.framework/Headers/STPSourceVerification.h @@ -0,0 +1,64 @@ +// +// STPSourceVerification.h +// Stripe +// +// Created by Ben Guo on 1/25/17. +// Copyright © 2017 Stripe, Inc. All rights reserved. +// + +#import +#import "STPAPIResponseDecodable.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + Verification status types for a Source. + */ +typedef NS_ENUM(NSInteger, STPSourceVerificationStatus) { + + /** + The verification is pending. + */ + STPSourceVerificationStatusPending, + + /** + The verification has succeeeded. + */ + STPSourceVerificationStatusSucceeded, + + /** + The verification has failed. + */ + STPSourceVerificationStatusFailed, + + /** + The state of the verification is unknown. + */ + STPSourceVerificationStatusUnknown +}; + +/** + Information related to a source's verification flow. + */ +@interface STPSourceVerification : NSObject + +/** + You cannot directly instantiate an `STPSourceVerification`. You should only use + one that is part of an existing `STPSource` object. + */ +- (instancetype)init __attribute__((unavailable("You cannot directly instantiate an STPSourceVerification. You should only use one that is part of an existing STPSource object."))); + +/** + The number of attempts remaining to authenticate the source object with a + verification code. + */ +@property (nonatomic, nullable, readonly) NSNumber *attemptsRemaining; + +/** + The status of the verification. + */ +@property (nonatomic, readonly) STPSourceVerificationStatus status; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Stripe.framework/Headers/STPTheme.h b/Stripe.framework/Headers/STPTheme.h new file mode 100755 index 0000000..6c09e46 --- /dev/null +++ b/Stripe.framework/Headers/STPTheme.h @@ -0,0 +1,103 @@ +// +// STPTheme.h +// Stripe +// +// Created by Jack Flintermann on 5/3/16. +// Copyright © 2016 Stripe, Inc. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + STPTheme objects can be used to visually style Stripe-provided UI. See https://stripe.com/docs/mobile/ios/standard#theming for more information. + */ +@interface STPTheme : NSObject + +/** + The default theme used by all Stripe UI. All themable UI classes, such as `STPAddCardViewController`, have one initializer that takes a `theme` and one that does not. If you use the one that does not, the default theme will be used to customize that view controller's appearance. + */ ++ (STPTheme *)defaultTheme; + +/** + The primary background color of the theme. This will be used as the `backgroundColor` for any views with this theme. + */ +@property (nonatomic, copy, null_resettable) UIColor *primaryBackgroundColor; + +/** + The secondary background color of this theme. This will be used as the `backgroundColor` for any supplemental views inside a view with this theme - for example, a `UITableView` will set it's cells' background color to this value. + */ +@property (nonatomic, copy, null_resettable) UIColor *secondaryBackgroundColor; + +/** + This color is automatically derived by reducing the alpha of the `primaryBackgroundColor` and is used as a section border color in table view cells. + */ +@property (nonatomic, readonly) UIColor *tertiaryBackgroundColor; + +/** + This color is automatically derived by reducing the brightness of the `primaryBackgroundColor` and is used as a separator color in table view cells. + */ +@property (nonatomic, readonly) UIColor *quaternaryBackgroundColor; + +/** + The primary foreground color of this theme. This will be used as the text color for any important labels in a view with this theme (such as the text color for a text field that the user needs to fill out). + */ +@property (nonatomic, copy, null_resettable) UIColor *primaryForegroundColor; + +/** + The secondary foreground color of this theme. This will be used as the text color for any supplementary labels in a view with this theme (such as the placeholder color for a text field that the user needs to fill out). + */ +@property (nonatomic, copy, null_resettable) UIColor *secondaryForegroundColor; + +/** + This color is automatically derived from the `secondaryForegroundColor` with a lower alpha component, used for disabled text. + */ +@property (nonatomic, readonly) UIColor *tertiaryForegroundColor; + +/** + The accent color of this theme - it will be used for any buttons and other elements on a view that are important to highlight. + */ +@property (nonatomic, copy, null_resettable) UIColor *accentColor; + +/** + The error color of this theme - it will be used for rendering any error messages or views. + */ +@property (nonatomic, copy, null_resettable) UIColor *errorColor; + +/** + The font to be used for all views using this theme. Make sure to select an appropriate size. + */ +@property (nonatomic, copy, null_resettable) UIFont *font; + +/** + The medium-weight font to be used for all bold text in views using this theme. Make sure to select an appropriate size. + */ +@property (nonatomic, copy, null_resettable) UIFont *emphasisFont; + +/** + The navigation bar style to use for any view controllers presented modally + by the SDK. The default value will be determined based on the brightness + of the theme's `secondaryBackgroundColor`. + */ +@property (nonatomic) UIBarStyle barStyle; + +/** + A Boolean value indicating whether the navigation bar for any view controllers + presented modally by the SDK should be translucent. The default value is NO. + */ +@property (nonatomic) BOOL translucentNavigationBar; + +/** + This font is automatically derived from the font, with a slightly lower point size, and will be used for supplementary labels. + */ +@property (nonatomic, readonly) UIFont *smallFont; + +/** + This font is automatically derived from the font, with a larger point size, and will be used for large labels such as SMS code entry. + */ +@property (nonatomic, readonly) UIFont *largeFont; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Stripe.framework/Headers/STPToken.h b/Stripe.framework/Headers/STPToken.h new file mode 100755 index 0000000..bd89c6e --- /dev/null +++ b/Stripe.framework/Headers/STPToken.h @@ -0,0 +1,53 @@ +// +// STPToken.h +// Stripe +// +// Created by Saikat Chakrabarti on 11/5/12. +// +// + +#import +#import "STPAPIResponseDecodable.h" +#import "STPSourceProtocol.h" + +@class STPCard; +@class STPBankAccount; + +/** + A token returned from submitting payment details to the Stripe API. You should not have to instantiate one of these directly. + */ +@interface STPToken : NSObject + +/** + You cannot directly instantiate an `STPToken`. You should only use one that has been returned from an `STPAPIClient` callback. + */ +- (nonnull instancetype) init __attribute__((unavailable("You cannot directly instantiate an STPToken. You should only use one that has been returned from an STPAPIClient callback."))); + +/** + The value of the token. You can store this value on your server and use it to make charges and customers. + @see https://stripe.com/docs/charges + */ +@property (nonatomic, readonly, nonnull) NSString *tokenId; + +/** + Whether or not this token was created in livemode. Will be YES if you used your Live Publishable Key, and NO if you used your Test Publishable Key. + */ +@property (nonatomic, readonly) BOOL livemode; + +/** + The credit card details that were used to create the token. Will only be set if the token was created via a credit card or Apple Pay, otherwise it will be + nil. + */ +@property (nonatomic, readonly, nullable) STPCard *card; + +/** + The bank account details that were used to create the token. Will only be set if the token was created with a bank account, otherwise it will be nil. + */ +@property (nonatomic, readonly, nullable) STPBankAccount *bankAccount; + +/** + When the token was created. + */ +@property (nonatomic, readonly, nullable) NSDate *created; + +@end diff --git a/Stripe.framework/Headers/STPUserInformation.h b/Stripe.framework/Headers/STPUserInformation.h new file mode 100755 index 0000000..d365d32 --- /dev/null +++ b/Stripe.framework/Headers/STPUserInformation.h @@ -0,0 +1,38 @@ +// +// STPUserInformation.h +// Stripe +// +// Created by Jack Flintermann on 6/15/16. +// Copyright © 2016 Stripe, Inc. All rights reserved. +// + +#import +#import "STPAddress.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + You can use this class to specify information that you've already collected + from your user. You can then set the `prefilledInformation` property on + `STPPaymentContext`, `STPAddCardViewController`, etc and it will pre-fill + this information whenever possible. + */ +@interface STPUserInformation : NSObject + +/** + The user's billing address. When set, the add card form will be filled with + this address. The user will also have the option to fill their shipping address + using this address. + */ +@property (nonatomic, strong, nullable) STPAddress *billingAddress; + +/** + The user's shipping address. When set, the shipping address form will be filled + with this address. The user will also have the option to fill their billing + address using this address. + */ +@property (nonatomic, strong, nullable) STPAddress *shippingAddress; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Stripe.framework/Headers/Stripe.h b/Stripe.framework/Headers/Stripe.h new file mode 100755 index 0000000..40a8527 --- /dev/null +++ b/Stripe.framework/Headers/Stripe.h @@ -0,0 +1,56 @@ +// +// Stripe.h +// Stripe +// +// Created by Saikat Chakrabarti on 10/30/12. +// Copyright (c) 2012 Stripe. All rights reserved. +// + +#import "STPAddCardViewController.h" +#import "STPAddress.h" +#import "STPAPIClient+ApplePay.h" +#import "STPAPIClient.h" +#import "STPAPIResponseDecodable.h" +#import "STPApplePayPaymentMethod.h" +#import "STPBackendAPIAdapter.h" +#import "STPBankAccount.h" +#import "STPBankAccountParams.h" +#import "STPBlocks.h" +#import "STPCard.h" +#import "STPCardBrand.h" +#import "STPCardParams.h" +#import "STPCardValidationState.h" +#import "STPCardValidator.h" +#import "STPCoreScrollViewController.h" +#import "STPCoreTableViewController.h" +#import "STPCoreViewController.h" +#import "STPCustomer.h" +#import "STPCustomerContext.h" +#import "STPEphemeralKeyProvider.h" +#import "STPFile.h" +#import "STPFormEncodable.h" +#import "STPImageLibrary.h" +#import "STPPaymentActivityIndicatorView.h" +#import "STPPaymentCardTextField.h" +#import "STPPaymentConfiguration.h" +#import "STPPaymentContext.h" +#import "STPPaymentMethod.h" +#import "STPPaymentMethodsViewController.h" +#import "STPPaymentResult.h" +#import "STPRedirectContext.h" +#import "STPShippingAddressViewController.h" +#import "STPSource.h" +#import "STPSourceCardDetails.h" +#import "STPSourceEnums.h" +#import "STPSourceOwner.h" +#import "STPSourceParams.h" +#import "STPSourceProtocol.h" +#import "STPSourceReceiver.h" +#import "STPSourceRedirect.h" +#import "STPSourceSEPADebitDetails.h" +#import "STPSourceVerification.h" +#import "STPTheme.h" +#import "STPToken.h" +#import "STPUserInformation.h" +#import "StripeError.h" +#import "UINavigationBar+Stripe_Theme.h" diff --git a/Stripe.framework/Headers/StripeError.h b/Stripe.framework/Headers/StripeError.h new file mode 100755 index 0000000..86f3141 --- /dev/null +++ b/Stripe.framework/Headers/StripeError.h @@ -0,0 +1,179 @@ +// +// StripeError.h +// Stripe +// +// Created by Saikat Chakrabarti on 11/4/12. +// +// + +#import + +/** + All Stripe iOS errors will be under this domain. + */ +FOUNDATION_EXPORT NSString * __nonnull const StripeDomain; + +// ObjC <-> Swift error bridging code from https://gist.github.com/bdash/bf29e26c429b78cc155f1a2e1d851f8b +#if __has_attribute(ns_error_domain) +#define STP_ERROR_ENUM(type, name, domain) \ +_Pragma("clang diagnostic push") \ +_Pragma("clang diagnostic ignored \"-Wignored-attributes\"") \ +NS_ENUM(type, __attribute__((ns_error_domain(domain))) name) \ +_Pragma("clang diagnostic pop") +#else +#define STP_ERROR_ENUM(type, name, domain) NS_ENUM(type, name) +#endif + +/** + Possible error code values for NSError's with the `StripeDomain` domain + */ +typedef STP_ERROR_ENUM(NSInteger, STPErrorCode, StripeDomain) { + /** + Trouble connecting to Stripe. + */ + STPConnectionError = 40, + + /** + Your request had invalid parameters. + */ + STPInvalidRequestError = 50, + + /** + General-purpose API error. + */ + STPAPIError = 60, + + /** + Something was wrong with the given card details. + */ + STPCardError = 70, + + /** + The operation was cancelled. + */ + STPCancellationError = 80, + + /** + The ephemeral key could not be decoded. Make sure your backend is sending + the unmodified JSON of the ephemeral key to your app. + https://stripe.com/docs/mobile/ios/standard#prepare-your-api + */ + STPEphemeralKeyDecodingError = 1000, +}; + +#pragma mark userInfo keys + +/** + A developer-friendly error message that explains what went wrong. You probably + shouldn't show this to your users, but might want to use it yourself. + */ +FOUNDATION_EXPORT NSString * __nonnull const STPErrorMessageKey; + +/** + What went wrong with your STPCard (e.g., STPInvalidCVC. See below for full list). + */ +FOUNDATION_EXPORT NSString * __nonnull const STPCardErrorCodeKey; + +/** + Which parameter on the STPCard had an error (e.g., "cvc"). Useful for marking up the + right UI element. + */ +FOUNDATION_EXPORT NSString * __nonnull const STPErrorParameterKey; + +/** + The error code returned by the Stripe API. + @see https://stripe.com/docs/api#errors-type + */ +FOUNDATION_EXPORT NSString * __nonnull const STPStripeErrorCodeKey; + +/** + The error type returned by the Stripe API. + + @see https://stripe.com/docs/api#errors-code + */ +FOUNDATION_EXPORT NSString * __nonnull const STPStripeErrorTypeKey; + +#pragma mark STPCardErrorCodeKeys + +/** + Possible string values you may receive when there was an error tokenizing + a card. These values will come back in the error `userInfo` dictionary + under the `STPCardErrorCodeKey` key. + */ +typedef NSString * STPCardErrorCode +#ifdef NS_STRING_ENUM +NS_STRING_ENUM +#endif +; + +/** + The card number is not a valid credit card number. + */ +FOUNDATION_EXPORT STPCardErrorCode __nonnull const STPInvalidNumber; + +/** + The card has an invalid expiration month. + */ +FOUNDATION_EXPORT STPCardErrorCode __nonnull const STPInvalidExpMonth; + +/** + The card has an invalid expiration year. + */ +FOUNDATION_EXPORT STPCardErrorCode __nonnull const STPInvalidExpYear; + +/** + The card has an invalid CVC. + */ +FOUNDATION_EXPORT STPCardErrorCode __nonnull const STPInvalidCVC; + +/** + The card number is incorrect. + */ +FOUNDATION_EXPORT STPCardErrorCode __nonnull const STPIncorrectNumber; + +/** + The card is expired. + */ +FOUNDATION_EXPORT STPCardErrorCode __nonnull const STPExpiredCard; + +/** + The card was declined. + */ +FOUNDATION_EXPORT STPCardErrorCode __nonnull const STPCardDeclined; + +/** + The card has an incorrect CVC. + */ +FOUNDATION_EXPORT STPCardErrorCode __nonnull const STPIncorrectCVC; + +/** + An error occured while processing this card. + */ +FOUNDATION_EXPORT STPCardErrorCode __nonnull const STPProcessingError; + +/** + NSError extensions for creating error objects from Stripe API responses. + */ +@interface NSError(Stripe) + +/** + Creates an NSError object from a given Stripe API json response. + + @param jsonDictionary The root dictionary from the JSON response. + + @return An NSError object with the error information from the JSON response, + or nil if there was no error information included in the JSON dictionary. + */ ++ (nullable NSError *)stp_errorFromStripeResponse:(nullable NSDictionary *)jsonDictionary; + +@end + +/** + This function should not be called directly. + + It is used by the SDK when it is built as a static library to force the + compiler to link in category methods regardless of the integrating + app's compiler flags. + */ +void linkNSErrorCategory(void); + diff --git a/Stripe.framework/Headers/UINavigationBar+Stripe_Theme.h b/Stripe.framework/Headers/UINavigationBar+Stripe_Theme.h new file mode 100755 index 0000000..34b489c --- /dev/null +++ b/Stripe.framework/Headers/UINavigationBar+Stripe_Theme.h @@ -0,0 +1,50 @@ +// +// UINavigationBar+Stripe_Theme.h +// Stripe +// +// Created by Jack Flintermann on 5/17/16. +// Copyright © 2016 Stripe, Inc. All rights reserved. +// + +#import +#import "STPTheme.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + This allows quickly setting the appearance of a `UINavigationBar` to match your + application. This is useful if you're presenting an `STPAddCardViewController` + or `STPPaymentMethodsViewController` inside a `UINavigationController`. + */ +@interface UINavigationBar (Stripe_Theme) + +/** + Sets the navigation bar's appearance to the desired theme. This will affect the + bar's `tintColor` and `barTintColor` properties, as well as the color of the + single-pixel line at the bottom of the navbar. + + @param theme the theme to use to style the navigation bar. @see STPTheme.h + @deprecated Use the `stp_theme` property instead + */ +- (void)stp_setTheme:(STPTheme *)theme DEPRECATED_MSG_ATTRIBUTE("Use the `stp_theme` property."); + +/** + Sets the navigation bar's appearance to the desired theme. This will affect the bar's `tintColor` and `barTintColor` properties, as well as the color of the single-pixel line at the bottom of the navbar. + Stripe view controllers will use their navigation bar's theme for their UIBarButtonItems instead of their own theme if it is not nil. + + @see STPTheme.h + */ +@property (nonatomic, nullable, strong) STPTheme *stp_theme; + +@end + +NS_ASSUME_NONNULL_END + +/** + This function should not be called directly. + + It is used by the SDK when it is built as a static library to force the + compiler to link in category methods regardless of the integrating + app's compiler flags. + */ +void linkUINavigationBarThemeCategory(void); diff --git a/Stripe.framework/Info.plist b/Stripe.framework/Info.plist new file mode 100644 index 0000000..0eabf2a Binary files /dev/null and b/Stripe.framework/Info.plist differ diff --git a/Stripe.framework/Modules/module.modulemap b/Stripe.framework/Modules/module.modulemap new file mode 100644 index 0000000..0a49680 --- /dev/null +++ b/Stripe.framework/Modules/module.modulemap @@ -0,0 +1,6 @@ +framework module Stripe { + umbrella header "Stripe.h" + + export * + module * { export * } +} diff --git a/Stripe.framework/Stripe b/Stripe.framework/Stripe new file mode 100755 index 0000000..226846d Binary files /dev/null and b/Stripe.framework/Stripe differ diff --git a/Stripe.framework/_CodeSignature/CodeResources b/Stripe.framework/_CodeSignature/CodeResources new file mode 100644 index 0000000..6067c8e --- /dev/null +++ b/Stripe.framework/_CodeSignature/CodeResources @@ -0,0 +1,2097 @@ + + + + + files + + Headers/STPAPIClient+ApplePay.h + + HKI8c33yk9S4WufZDuRk3TcL4aA= + + Headers/STPAPIClient.h + + mzFzxKCKAqyZ7+r5+oyGrESxHx8= + + Headers/STPAPIResponseDecodable.h + + 1Lth/JtJOx7hcjFrS9IL8uOrvys= + + Headers/STPAddCardViewController.h + + bemUruN9tYtjrHwGhvxLdrC5nYA= + + Headers/STPAddress.h + + RIJhwuSdt0aMyOQbB2tm6674Z1o= + + Headers/STPApplePayPaymentMethod.h + + RDLCad7PMdXPLtN1+kTabsQuBuk= + + Headers/STPBackendAPIAdapter.h + + IFHfTx6uESL3rqmbyxAhz6SA9yY= + + Headers/STPBankAccount.h + + KYAIiL3D2RLqHmWNeyXlc4rRe3A= + + Headers/STPBankAccountParams.h + + EHrlnglAolLYPhG46JVi2aUp1W4= + + Headers/STPBlocks.h + + Zdw04B1DCOafqVIYHdPCfDp/WeA= + + Headers/STPCard.h + + rX/H4OH3i5p0nmNkck8JkwC5lRs= + + Headers/STPCardBrand.h + + X3R6Sg5EcnNhwgi2DxlZiW1HiTQ= + + Headers/STPCardParams.h + + fxAgMkXYT5oPA85AiE04J3YMx6M= + + Headers/STPCardValidationState.h + + qOv109MEnRBq3KDSghzSHKQJus4= + + Headers/STPCardValidator.h + + 2UXHuZbgyVH0szfpOR7cR+dJj7s= + + Headers/STPCoreScrollViewController.h + + aQ9AmkaYNjjgkYNfeDrbrblATcM= + + Headers/STPCoreTableViewController.h + + snpayvyHgw5mKnxutN5qx2Jw0cY= + + Headers/STPCoreViewController.h + + dFzlatitYdtNKj3teDBCPCaIwIY= + + Headers/STPCustomer.h + + 6m37Bhssb/aLrBubjGesBCWi2QA= + + Headers/STPCustomerContext.h + + 5Ro7urvKD+aSUlPv0qDtZBdilsk= + + Headers/STPEphemeralKeyProvider.h + + 2DKybMIJy0v3stiI93yiMU4n334= + + Headers/STPFile.h + + T781BYiR6YhxZkyRF54NyrppI8I= + + Headers/STPFormEncodable.h + + oezwWAYSvkK+WqGwx+2HRSy4qb0= + + Headers/STPImageLibrary.h + + QRH7KmMRKribtb9qZ6U7rBGxWMo= + + Headers/STPPaymentActivityIndicatorView.h + + A2AdKAZ9tiXpnuakLu13KJzGfl0= + + Headers/STPPaymentCardTextField.h + + bSjiumOIQMYRPMufM35MSO01f5s= + + Headers/STPPaymentConfiguration.h + + 7RvXxscLT1vGIP+wa82hcwTDlCc= + + Headers/STPPaymentContext.h + + Mg3NZDkMlVMSXYdM+ZL6tuixwP0= + + Headers/STPPaymentMethod.h + + ow95N+sEI3NbcUlQRJAPio2Vn2g= + + Headers/STPPaymentMethodsViewController.h + + NzxWW8+4DNBpMxHai15isgQmrL4= + + Headers/STPPaymentResult.h + + VgiiRCMrg+uYpLj9lHYxIu9XaMc= + + Headers/STPRedirectContext.h + + edlBN7Pb1XcjZqVWgCYIqDhKUs0= + + Headers/STPShippingAddressViewController.h + + PO2PaVOmF1spN4RziKTZ4hT+oCE= + + Headers/STPSource.h + + fEVpp3yBWzm6I1vkXYIQyNKErQk= + + Headers/STPSourceCardDetails.h + + JIwp4XsACp2a3HnKRkEXcBF8beA= + + Headers/STPSourceEnums.h + + 9pOOZ0Ubkz/4+w0ljJ1U5scAjNQ= + + Headers/STPSourceOwner.h + + wnIJlxYJH4FZEm9e+0CgvyIUvzU= + + Headers/STPSourceParams.h + + 7s2gB1Ui4cqRNE39aIQzPr0nfjU= + + Headers/STPSourceProtocol.h + + 6TRjq9DPLuLyRcmhMida+L15ZEc= + + Headers/STPSourceReceiver.h + + /lqJnm6oUaVAUfSHtypQ4XKVddM= + + Headers/STPSourceRedirect.h + + 6spaHd91GgXGA1Ys3cs/xiRZDAY= + + Headers/STPSourceSEPADebitDetails.h + + +UfifSLx6iYRpunCnz3lanU07wQ= + + Headers/STPSourceVerification.h + + BWA0t2tgPe4GqCsf+eY/YRuWAPg= + + Headers/STPTheme.h + + kYkkWNZHvMLVkd6C6FhqPPXhJXc= + + Headers/STPToken.h + + MhCz5zmIz/Udm2xbjCzsTDkJ64Q= + + Headers/STPUserInformation.h + + 4YiGkkyQyBR3JuE0ZOSUTy8osrs= + + Headers/Stripe.h + + ClzxmssHft0bJuSnVwf2w/ZiT2E= + + Headers/StripeError.h + + Lk8b+R6fYCcdq9YepJfW8FzCWJg= + + Headers/UINavigationBar+Stripe_Theme.h + + AHTOXR3EACrTtKs/klT59R88lP8= + + Info.plist + + 3LANptTTJGnBWD+GQngvW/3xuRU= + + Modules/module.modulemap + + TuAoaUKneYLDSjY5l1Y9pGiaYQA= + + de.lproj/Localizable.strings + + hash + + agY1WG3+DKHhBm8Mv8A1wdLLmbI= + + optional + + + en.lproj/Localizable.strings + + hash + + ndehyabjTQEwe8RVrbeE4XSYLQY= + + optional + + + es.lproj/Localizable.strings + + hash + + j/uYIqswdI8FYOXlc7xkSaoIl/o= + + optional + + + fr.lproj/Localizable.strings + + hash + + G1X76mFOY3YWeQAaoKcGWfd6gXU= + + optional + + + integrate-dynamic-framework.sh + + bENFeKfMHTdHyWS5AygjhdAo44Q= + + it.lproj/Localizable.strings + + hash + + HhN/EdaQKd8k6YbsdjOeXfm7frM= + + optional + + + ja.lproj/Localizable.strings + + hash + + YYwmYm6Dpt8mqINQRNbcBYst5a8= + + optional + + + nl.lproj/Localizable.strings + + hash + + oIxNCN9lkzvzCND6snHpB4znsJ4= + + optional + + + stp_card_amex.png + + sk9jX4Apn3xX9ONixp4x2ju5wQM= + + stp_card_amex@2x.png + + 60jHxSadPreZdZt7jZTvxhb17Pw= + + stp_card_amex@3x.png + + usx4I3AqXJWMabSAzUyvwKhUn3U= + + stp_card_amex_template.png + + TnGnQY8KrJl45IqRPQ9EMXJCM5I= + + stp_card_amex_template@2x.png + + 55jt7FCCTTYVPuV4aVPFN2vSykI= + + stp_card_amex_template@3x.png + + 09XBdV8mk7GtfVtrPm+3/cgmGFc= + + stp_card_applepay.png + + GQKB6tEV+i0BcCHsFXWKmMshjJo= + + stp_card_applepay@2x.png + + j4/hnigxQQ6bT5k1GQN/RCCYeHk= + + stp_card_applepay@3x.png + + 7/d8kDCnhugVtlacj9QMy3AR78c= + + stp_card_cvc.png + + hds+hnk2tWfhKetfAVdauZdaHsQ= + + stp_card_cvc@2x.png + + lYo40bU/z6jD3Py8t5TGrKsTs2w= + + stp_card_cvc@3x.png + + urKIxSGeE83wfaj/QWDgjNc98Jc= + + stp_card_cvc_amex.png + + LChnFX0FsU7zIiA9YVKBQEkdqbM= + + stp_card_cvc_amex@2x.png + + wu3sglP+dc7DaNO/IIWzF6YAACU= + + stp_card_cvc_amex@3x.png + + 2F9GpkQY+nEettR5wFc5GrwGSAA= + + stp_card_diners.png + + acP/q8hd1jvUjivV+0DpbjdyccM= + + stp_card_diners@2x.png + + b93X8h7+C8CUCn1gvKrNMXMvswg= + + stp_card_diners@3x.png + + HodzoD0Lt0VtIQpN3vkhH+2bzPs= + + stp_card_diners_template.png + + uDqYJ1nYqRYHwI5hJdxXY2PPON8= + + stp_card_diners_template@2x.png + + tXDxVavWwo6d1XCe+pLzBCzlCrI= + + stp_card_diners_template@3x.png + + qa2wivb+4BUZuV0MjtoGyLWatMA= + + stp_card_discover.png + + ziahmSwOcigNvbGQDF7VJczJpDo= + + stp_card_discover@2x.png + + NbcaYOtaVD4orzv57nODSPPU8kY= + + stp_card_discover@3x.png + + +SJlO67GhacQmO2ymj/UwRgYXfo= + + stp_card_discover_template.png + + fritjsUVVFP7SHXj6Iu3MznGMJE= + + stp_card_discover_template@2x.png + + F3S7aSxRpo5qoFJp5Rcro8CJb44= + + stp_card_discover_template@3x.png + + uO/bJUs8kRhMaFMfUmqZk9Awerk= + + stp_card_error.png + + dJHtEjCof/xV0FE8VUg/DzlIcDA= + + stp_card_error@2x.png + + F7TNBbI4SU+fZUty2rekNr656yI= + + stp_card_error@3x.png + + jm1O1Z3A5ZS9/WvZl5gy6Lla3n8= + + stp_card_error_amex.png + + fcNpj5t0yPh1zpWYegJ9G9sElAU= + + stp_card_error_amex@2x.png + + 9cHRf+a8+VRD0fbQNHDCz1SNAEE= + + stp_card_error_amex@3x.png + + redAbFzaqrp3lChrlvbdnBDmnnM= + + stp_card_form_back.png + + arYL6258S9MXvJjFsCCEt9TDc4c= + + stp_card_form_back@2x.png + + 7HaunxnPYvF+G2ZSy9PA+ze3ef4= + + stp_card_form_back@3x.png + + o4soBcRRvck+BmmhDuQJBCFaYMY= + + stp_card_form_front.png + + FUvSd23IUAdKk1wB4DKeOyFG3iY= + + stp_card_form_front@2x.png + + y/F52HByKH9H1YeRTRTPcANT/jY= + + stp_card_form_front@3x.png + + Mo+YJ6OyS3/4c8VH4yVYjQHklq4= + + stp_card_jcb.png + + 9Qqr6gF1fVXQoHQ47se8T+JIksE= + + stp_card_jcb@2x.png + + BTiJkm0wsS3pMnUm5uv3Oh1fpj0= + + stp_card_jcb@3x.png + + SjeEJrRq5qqUUtLX9nkvKHBUONA= + + stp_card_jcb_template.png + + gncctvKW/Rzg/w1idi+mYZZtkto= + + stp_card_jcb_template@2x.png + + y32rpZjFkwGvpEZm/aqno0BIpY4= + + stp_card_jcb_template@3x.png + + uDP9Pjd8IblfTi8ryiw32raPoQM= + + stp_card_mastercard.png + + J5dlu3O/oUROuHVhL6rLXLahvGM= + + stp_card_mastercard@2x.png + + 3D2j3r0BLWaIeO+NoUtjaLDkF3k= + + stp_card_mastercard@3x.png + + kfpbxYzy8lmKkIOsRbKciEVTZWg= + + stp_card_mastercard_template.png + + 2pRKoYqiI0bSMEXMEgHql6n8EJ0= + + stp_card_mastercard_template@2x.png + + OAE0d/QocycHrrkJTKFLhJo9yys= + + stp_card_mastercard_template@3x.png + + uF0rsVBHgkVIxcGMiVLJdfqnsUA= + + stp_card_unknown.png + + ozQ16kISiRJaR/qkdpMjE7nax+4= + + stp_card_unknown@2x.png + + 60WDmnEXxahflWuE6RWSYGlqbt0= + + stp_card_unknown@3x.png + + Touf4iR7hjOSysxfUwV4i8KffLA= + + stp_card_visa.png + + 1l1DgI4Fl56UxmIEG3wJGLqgHoA= + + stp_card_visa@2x.png + + EasaxBK4jHzjQtEET1nV8KU6jI4= + + stp_card_visa@3x.png + + GCIO3SaxQBLDQ0HjQWypMVkYUOc= + + stp_card_visa_template.png + + VJhgmIyGBZIb79dKkbEGnBwf44s= + + stp_card_visa_template@2x.png + + S4shcF/6tuIH4ZCOUMuJmBykxq4= + + stp_card_visa_template@3x.png + + 5mns9YpSOMAnW1cytzW1k0eAzkU= + + stp_icon_add.png + + WVhVJrpxz+hy8upNdPrmx3XDxV0= + + stp_icon_add@2x.png + + 7pN2kVv1eafTYzjeakFEgQoF68Q= + + stp_icon_add@3x.png + + I2/zUOCVYrCFXA6Qc5u+U6bhl58= + + stp_icon_checkmark.png + + 92/pr1m6QRRxBvTJx3Iox4ikoYU= + + stp_icon_checkmark@2x.png + + a5QcogSP6Nk7eSuf5HL1GkFrBMM= + + stp_icon_checkmark@3x.png + + 3+MbJQzrSylhATDPNGHm2GdpgDw= + + stp_shipping_form.png + + sHk6zeVOeieab+Rl2UlmQ3bmEFw= + + stp_shipping_form@2x.png + + QV5/dCpHS8EIN9KoSadU8bKUsAE= + + stp_shipping_form@3x.png + + nmDDwoJPaMVz7b0hIOy008ZVKgU= + + zh-Hans.lproj/Localizable.strings + + hash + + uXz3EfP2UFMWB9tDKEpVV9Hjmrc= + + optional + + + + files2 + + Headers/STPAPIClient+ApplePay.h + + hash + + HKI8c33yk9S4WufZDuRk3TcL4aA= + + hash2 + + klrEruki8N3p1LNpPeGLltkWP/hgWgY8BzdFdDZaEAM= + + + Headers/STPAPIClient.h + + hash + + mzFzxKCKAqyZ7+r5+oyGrESxHx8= + + hash2 + + YLUjFw0HnaDdxFSKaD8AWsViqxXIYV4l5aYwj3rMs9Y= + + + Headers/STPAPIResponseDecodable.h + + hash + + 1Lth/JtJOx7hcjFrS9IL8uOrvys= + + hash2 + + EOQGWnnFe9fHmTsi9+lByoeitxlWdiClLBiOQph/DsQ= + + + Headers/STPAddCardViewController.h + + hash + + bemUruN9tYtjrHwGhvxLdrC5nYA= + + hash2 + + Q2uVbRUlUKs8UOvd6q81mnmPasKy5dck1O/AjbiPiFc= + + + Headers/STPAddress.h + + hash + + RIJhwuSdt0aMyOQbB2tm6674Z1o= + + hash2 + + vpyIGY7/f4eGkT7IMJNojlqKq1PCSJvcrRWvy+zx7DU= + + + Headers/STPApplePayPaymentMethod.h + + hash + + RDLCad7PMdXPLtN1+kTabsQuBuk= + + hash2 + + KpZML7b3VEXQJUy8FyWzds7VKXzTI4d8OXvIWXOkB/M= + + + Headers/STPBackendAPIAdapter.h + + hash + + IFHfTx6uESL3rqmbyxAhz6SA9yY= + + hash2 + + PigeelBD7kU+0PQ7T0QmLTUFnwslKPnXTFbcG2MDYps= + + + Headers/STPBankAccount.h + + hash + + KYAIiL3D2RLqHmWNeyXlc4rRe3A= + + hash2 + + dIWQsizU49AaJnDR20t1afhy7RVE746eam160LIami4= + + + Headers/STPBankAccountParams.h + + hash + + EHrlnglAolLYPhG46JVi2aUp1W4= + + hash2 + + AhMXvnlGJeZEf/nY2Vp7k+b7CjMxOJRMXR5P0gV3wkQ= + + + Headers/STPBlocks.h + + hash + + Zdw04B1DCOafqVIYHdPCfDp/WeA= + + hash2 + + YLn9+pfzmFnazzRs7h3/LeWTJyA1COvQ6lrhqKsFHwg= + + + Headers/STPCard.h + + hash + + rX/H4OH3i5p0nmNkck8JkwC5lRs= + + hash2 + + rzzXGlhc2THswNnzDXfiMsIqopG7i8izyGFZlhBR6+4= + + + Headers/STPCardBrand.h + + hash + + X3R6Sg5EcnNhwgi2DxlZiW1HiTQ= + + hash2 + + 6mblvvKfL0qRVKbPENVopZcz54+jIqWAlLgw66Lz8n0= + + + Headers/STPCardParams.h + + hash + + fxAgMkXYT5oPA85AiE04J3YMx6M= + + hash2 + + 6hpRv/+E07vgoZ43g1o0/uj5ZxDnjMBwP4GZWEejLBs= + + + Headers/STPCardValidationState.h + + hash + + qOv109MEnRBq3KDSghzSHKQJus4= + + hash2 + + vQ7U2E6SNTQBXvE+BnDg6nxCjQwjnU4Z4qElNa9ru3Q= + + + Headers/STPCardValidator.h + + hash + + 2UXHuZbgyVH0szfpOR7cR+dJj7s= + + hash2 + + 8DTt/qO0GW/vJjtOBaEkOEqa9kSJdlGlvbictfnU5QU= + + + Headers/STPCoreScrollViewController.h + + hash + + aQ9AmkaYNjjgkYNfeDrbrblATcM= + + hash2 + + r8ux+tisvuVSCyUGDdb2UUNSsE0uy6gcNAp94AKbRY0= + + + Headers/STPCoreTableViewController.h + + hash + + snpayvyHgw5mKnxutN5qx2Jw0cY= + + hash2 + + CoWdsoj/iimvZlDgpzOme8yX/onzP/lJWs1n8Zttd3o= + + + Headers/STPCoreViewController.h + + hash + + dFzlatitYdtNKj3teDBCPCaIwIY= + + hash2 + + CZyJ0XG49wLacp1IN9N/rrzFmU0JpzmaTox0lix+Eb0= + + + Headers/STPCustomer.h + + hash + + 6m37Bhssb/aLrBubjGesBCWi2QA= + + hash2 + + flS1ovAb9FyAcLZhcStI8kJcFd1eGuB8ousLW9TaIbo= + + + Headers/STPCustomerContext.h + + hash + + 5Ro7urvKD+aSUlPv0qDtZBdilsk= + + hash2 + + crYEpGBnSDG3aJx1QGUxQcH3Naa0OEzjadd8g5dq3TI= + + + Headers/STPEphemeralKeyProvider.h + + hash + + 2DKybMIJy0v3stiI93yiMU4n334= + + hash2 + + pgpa4faSbkv+eZykKouc1dlZdlPJ5tmXXzbwUzUQkt0= + + + Headers/STPFile.h + + hash + + T781BYiR6YhxZkyRF54NyrppI8I= + + hash2 + + 1jLxUfT34fP8mq9YSYp9sO43tMHgDPfOZQjFoqIjf6M= + + + Headers/STPFormEncodable.h + + hash + + oezwWAYSvkK+WqGwx+2HRSy4qb0= + + hash2 + + mCHN6kYf7PL647CQVJGE7wikPQOPOqLZXHg4CjXm45c= + + + Headers/STPImageLibrary.h + + hash + + QRH7KmMRKribtb9qZ6U7rBGxWMo= + + hash2 + + uTT1ERMilewj0b3FxMmDjKABsHxwsOXlUF1ct3zAR8U= + + + Headers/STPPaymentActivityIndicatorView.h + + hash + + A2AdKAZ9tiXpnuakLu13KJzGfl0= + + hash2 + + 21JxeJyAmBIIP3C5bzeeLkR5EvaNRCIrSKLa+9EhrrM= + + + Headers/STPPaymentCardTextField.h + + hash + + bSjiumOIQMYRPMufM35MSO01f5s= + + hash2 + + obk3OiemGDN70Y9nzxQB/+RDz9amHZCHfMaCKTawxa4= + + + Headers/STPPaymentConfiguration.h + + hash + + 7RvXxscLT1vGIP+wa82hcwTDlCc= + + hash2 + + iZPtSG0mFPNF0UlTbSDNPitbuwHSt5wIdwJR07pFOUo= + + + Headers/STPPaymentContext.h + + hash + + Mg3NZDkMlVMSXYdM+ZL6tuixwP0= + + hash2 + + vQoddXZbg+Di0nwT0wCX6dWRtXmUd3xWzYyCh98CuMY= + + + Headers/STPPaymentMethod.h + + hash + + ow95N+sEI3NbcUlQRJAPio2Vn2g= + + hash2 + + 7Xo8AA93jlGseNkOBwtnlBZoZVQYjGiZbEcWO3X05P4= + + + Headers/STPPaymentMethodsViewController.h + + hash + + NzxWW8+4DNBpMxHai15isgQmrL4= + + hash2 + + 7GbtrDUmBOPAI74+CLFojiCSwvbe7J4laPe1S9wr/9k= + + + Headers/STPPaymentResult.h + + hash + + VgiiRCMrg+uYpLj9lHYxIu9XaMc= + + hash2 + + tk4mBOjlV7lJrV1UJjtzguylssWv64Fks7u4zT8EwMY= + + + Headers/STPRedirectContext.h + + hash + + edlBN7Pb1XcjZqVWgCYIqDhKUs0= + + hash2 + + fW24P+S1HL9hKz3QpXLHL5U7dCSHZIFjCqPX096qRoU= + + + Headers/STPShippingAddressViewController.h + + hash + + PO2PaVOmF1spN4RziKTZ4hT+oCE= + + hash2 + + a9RtyIiGGTlxT9aPvWum8dwp5gVzfyJ0kLYoAJ9CYTI= + + + Headers/STPSource.h + + hash + + fEVpp3yBWzm6I1vkXYIQyNKErQk= + + hash2 + + 5KR9hSUzQW5waNkXGR6eVsBF3AtOz4HuC+Z/DVttpFs= + + + Headers/STPSourceCardDetails.h + + hash + + JIwp4XsACp2a3HnKRkEXcBF8beA= + + hash2 + + 25B3LDT3w+sKtDhfoE0v5P3siIJZZZXdzIJAFYDRnSc= + + + Headers/STPSourceEnums.h + + hash + + 9pOOZ0Ubkz/4+w0ljJ1U5scAjNQ= + + hash2 + + 1lYiZL3VYGZf5w3+A/h14LULexlDzE8miRgqyhXO/9Q= + + + Headers/STPSourceOwner.h + + hash + + wnIJlxYJH4FZEm9e+0CgvyIUvzU= + + hash2 + + Ix+8vN54QlG6tdFEGDJGosZrGWyyu+u/ZdzCSC4Bw6U= + + + Headers/STPSourceParams.h + + hash + + 7s2gB1Ui4cqRNE39aIQzPr0nfjU= + + hash2 + + sCgvT0aVhbG1aj4e9NDZh9YRlqr4cyRNRA2cyMCG8BI= + + + Headers/STPSourceProtocol.h + + hash + + 6TRjq9DPLuLyRcmhMida+L15ZEc= + + hash2 + + p17hp3QrwCifgo3cYTOah2DRpXYuhe7KfGYodvP5A3Y= + + + Headers/STPSourceReceiver.h + + hash + + /lqJnm6oUaVAUfSHtypQ4XKVddM= + + hash2 + + YO9o7WMM2Qg8JkshrqFQTO7HqnQ7jUTBD1WgnVCUcwg= + + + Headers/STPSourceRedirect.h + + hash + + 6spaHd91GgXGA1Ys3cs/xiRZDAY= + + hash2 + + qEkXh4mjgI+GdvJRTh5c2WFzIuYbx62M1bsTL/BeXu0= + + + Headers/STPSourceSEPADebitDetails.h + + hash + + +UfifSLx6iYRpunCnz3lanU07wQ= + + hash2 + + ixKEvz3Zpwi+qMgS2zlUholeHK7Ohal0W1eUSqJRu0I= + + + Headers/STPSourceVerification.h + + hash + + BWA0t2tgPe4GqCsf+eY/YRuWAPg= + + hash2 + + AUqHZz0yXf6Do6kbEqN17DjLrHVKKzxU11bDpn+KwWI= + + + Headers/STPTheme.h + + hash + + kYkkWNZHvMLVkd6C6FhqPPXhJXc= + + hash2 + + M8M6Qm5j73KpFTrQEBzDr+IVCyiwoHJWePBhvjuMjH0= + + + Headers/STPToken.h + + hash + + MhCz5zmIz/Udm2xbjCzsTDkJ64Q= + + hash2 + + eZ17apC7bhLjr/8q+zHywzXko3bU1ZllqQaQAOWCTzc= + + + Headers/STPUserInformation.h + + hash + + 4YiGkkyQyBR3JuE0ZOSUTy8osrs= + + hash2 + + 6rpxwvUDXvvjXJKJL8RJ5zc4lMjt6uwP9yDbGKCMkAk= + + + Headers/Stripe.h + + hash + + ClzxmssHft0bJuSnVwf2w/ZiT2E= + + hash2 + + eDIEWz5WSPVucxjnxNfRPpUnIFIb9WeFpco8YL1/Me8= + + + Headers/StripeError.h + + hash + + Lk8b+R6fYCcdq9YepJfW8FzCWJg= + + hash2 + + Z952JhHUsI+z/iLGX44Jeh/oOSHKsZAWXc/0oSXEDc8= + + + Headers/UINavigationBar+Stripe_Theme.h + + hash + + AHTOXR3EACrTtKs/klT59R88lP8= + + hash2 + + Nc3PYZ3YIbfODx2AW/6TFlTH+hQYWa9Q7Cdbkhmprrc= + + + Modules/module.modulemap + + hash + + TuAoaUKneYLDSjY5l1Y9pGiaYQA= + + hash2 + + i6C2GnqCjjjwiUWbAppN0V+k2y8yGBfWIj9Qfv69Wn4= + + + de.lproj/Localizable.strings + + hash + + agY1WG3+DKHhBm8Mv8A1wdLLmbI= + + hash2 + + XMusNc0at4Zd7AGyALoWz4i1CNseUGJ9dnM0bv+jpHk= + + optional + + + en.lproj/Localizable.strings + + hash + + ndehyabjTQEwe8RVrbeE4XSYLQY= + + hash2 + + bTH96VpX34S6ZHpe/QZ02nTfxuVCU0wK1Jn5V8XAbwc= + + optional + + + es.lproj/Localizable.strings + + hash + + j/uYIqswdI8FYOXlc7xkSaoIl/o= + + hash2 + + 3IzBUlQkJeyrmWK7obfi2E8RKiFIVVbLlP3ZVAxfjOs= + + optional + + + fr.lproj/Localizable.strings + + hash + + G1X76mFOY3YWeQAaoKcGWfd6gXU= + + hash2 + + G6RlV2dXZIzaXUdstf81Y8XL74DOVhz8ASxthcRgyMk= + + optional + + + integrate-dynamic-framework.sh + + hash + + bENFeKfMHTdHyWS5AygjhdAo44Q= + + hash2 + + TdoX67LzludHG3MJM/ykgPmTswRtyXdokveq/f6XloI= + + + it.lproj/Localizable.strings + + hash + + HhN/EdaQKd8k6YbsdjOeXfm7frM= + + hash2 + + pyyyvEjdy4sdGB2QSh3rCrxaTPY3jABg+hWw4XHB9vA= + + optional + + + ja.lproj/Localizable.strings + + hash + + YYwmYm6Dpt8mqINQRNbcBYst5a8= + + hash2 + + qE+5eTuShlr7Zg7BRIXTjfnNS08UgX29SZtAdOKuDpE= + + optional + + + nl.lproj/Localizable.strings + + hash + + oIxNCN9lkzvzCND6snHpB4znsJ4= + + hash2 + + TTHJ5nDZCxAbORNhQYc8dzt4df1C7ToIe/wvO81LP/8= + + optional + + + stp_card_amex.png + + hash + + sk9jX4Apn3xX9ONixp4x2ju5wQM= + + hash2 + + RoVHLa4oxomkmUqoRRUhOvZ5MZb6QR6iNovJCv8JK4c= + + + stp_card_amex@2x.png + + hash + + 60jHxSadPreZdZt7jZTvxhb17Pw= + + hash2 + + Gm9ZzIG/zoGw5kLcjXCB6TRSgViyelD8JtvG70U1ejI= + + + stp_card_amex@3x.png + + hash + + usx4I3AqXJWMabSAzUyvwKhUn3U= + + hash2 + + cMXLbjoYZBr9biKGg4y0ABLO7hfDweM4ZAyUSvlq9S4= + + + stp_card_amex_template.png + + hash + + TnGnQY8KrJl45IqRPQ9EMXJCM5I= + + hash2 + + k9MfgcP/4WEA+L4oVENIc+1blURSVjoYBQReG9YtxSQ= + + + stp_card_amex_template@2x.png + + hash + + 55jt7FCCTTYVPuV4aVPFN2vSykI= + + hash2 + + QVeT6Abw5uC36D/jcyM+jDAtzs9OnKg75eowHhYH6KI= + + + stp_card_amex_template@3x.png + + hash + + 09XBdV8mk7GtfVtrPm+3/cgmGFc= + + hash2 + + RFMzLkYdwnRsnRNFdpKjfu6bPyWSpUVvEmL8b6O+v48= + + + stp_card_applepay.png + + hash + + GQKB6tEV+i0BcCHsFXWKmMshjJo= + + hash2 + + HLrGc2o9i5ZNHHUhvv6l6WyroG2dpCe9jdap80aBDXg= + + + stp_card_applepay@2x.png + + hash + + j4/hnigxQQ6bT5k1GQN/RCCYeHk= + + hash2 + + oFMc/57Mx9D5aIgBxA/Bl019bF0NEw3sOXhbQ2ep67c= + + + stp_card_applepay@3x.png + + hash + + 7/d8kDCnhugVtlacj9QMy3AR78c= + + hash2 + + akjOHJsFBEhkH5fALYlIeb4z+jZkHBm6wSIloqNVfD0= + + + stp_card_cvc.png + + hash + + hds+hnk2tWfhKetfAVdauZdaHsQ= + + hash2 + + sbUse0EopZC3QOn13BEhDQtHDcEgOXOu2HgiCwjDJvM= + + + stp_card_cvc@2x.png + + hash + + lYo40bU/z6jD3Py8t5TGrKsTs2w= + + hash2 + + 1ebjYqw3WsXOx2RN4OsR40VU9MW2WwPmpOclDMRAR/0= + + + stp_card_cvc@3x.png + + hash + + urKIxSGeE83wfaj/QWDgjNc98Jc= + + hash2 + + rV0yaAqwfhP+G5z+Vc6LZX98jnYZHMgcZAiK8V6nbkg= + + + stp_card_cvc_amex.png + + hash + + LChnFX0FsU7zIiA9YVKBQEkdqbM= + + hash2 + + WvaVewkqN/uVx8yny2QEIG2G+BQjoYsyFegQrQUBSjw= + + + stp_card_cvc_amex@2x.png + + hash + + wu3sglP+dc7DaNO/IIWzF6YAACU= + + hash2 + + DBzg8P0I1KGFueZ6HmUjJBIarUMaiJwpG5KC1y0OWFw= + + + stp_card_cvc_amex@3x.png + + hash + + 2F9GpkQY+nEettR5wFc5GrwGSAA= + + hash2 + + LYnVskjdEjFiUOCGl9WfPjMz0S3ZSw6wuzzPDLYhf4s= + + + stp_card_diners.png + + hash + + acP/q8hd1jvUjivV+0DpbjdyccM= + + hash2 + + +H6FFxdNlhTSZqx0c0dAdPrivfOzqpsTpYWFWd5PXck= + + + stp_card_diners@2x.png + + hash + + b93X8h7+C8CUCn1gvKrNMXMvswg= + + hash2 + + JvwMePC2L2jGsYdPSIDNWd6H/O7iaBXzNTWMn6cbwGk= + + + stp_card_diners@3x.png + + hash + + HodzoD0Lt0VtIQpN3vkhH+2bzPs= + + hash2 + + hv1k8hrNG7zInldxfWH5FtYnXvuUF06GsORf853fXj0= + + + stp_card_diners_template.png + + hash + + uDqYJ1nYqRYHwI5hJdxXY2PPON8= + + hash2 + + a01yc7Jw2opFCjunuugihmoHTo+ohDFfKsqPud56Ge8= + + + stp_card_diners_template@2x.png + + hash + + tXDxVavWwo6d1XCe+pLzBCzlCrI= + + hash2 + + nF3SBFrP6VDlNuZ5Et8wo5qHHyQw9brDnOObtMpcp6Q= + + + stp_card_diners_template@3x.png + + hash + + qa2wivb+4BUZuV0MjtoGyLWatMA= + + hash2 + + GfT4o2iQ/Es5Vr8o+qw783+fFvgQGtpesF93QtDjnMc= + + + stp_card_discover.png + + hash + + ziahmSwOcigNvbGQDF7VJczJpDo= + + hash2 + + 3Qk7ZWM4/+qsbHWZtTSmx1D/lPNhinLfgMl7mDAf0qI= + + + stp_card_discover@2x.png + + hash + + NbcaYOtaVD4orzv57nODSPPU8kY= + + hash2 + + a5vV6phDbE3t8cGD/BWjj9gvea7V/a9IRjiLSx2XcJc= + + + stp_card_discover@3x.png + + hash + + +SJlO67GhacQmO2ymj/UwRgYXfo= + + hash2 + + XJ+V1GdVvMF8sz3oc3F+Gh2gK4/sVJvyPsBEEFqnpfU= + + + stp_card_discover_template.png + + hash + + fritjsUVVFP7SHXj6Iu3MznGMJE= + + hash2 + + SXyz0o+4nqM+ISgi8OnzTU3OJXEXzuk945rMQLhKR/o= + + + stp_card_discover_template@2x.png + + hash + + F3S7aSxRpo5qoFJp5Rcro8CJb44= + + hash2 + + 2Y0RPUFtsy7sTiioLLG5eFoj04GpdUBEQkK2GZsQqiU= + + + stp_card_discover_template@3x.png + + hash + + uO/bJUs8kRhMaFMfUmqZk9Awerk= + + hash2 + + Ov7ve9EGkDHJl9K9QcSImY+nojjOIfsKZ/18zs0IDYU= + + + stp_card_error.png + + hash + + dJHtEjCof/xV0FE8VUg/DzlIcDA= + + hash2 + + 4lNTsQM6fEgHKPg5wmrpGYjsY1/6xYRCoyhBThXeWuQ= + + + stp_card_error@2x.png + + hash + + F7TNBbI4SU+fZUty2rekNr656yI= + + hash2 + + P+tB1cLzj2YonF4tuXCNJ4mDBN0TS6wb/rmvi5viHoE= + + + stp_card_error@3x.png + + hash + + jm1O1Z3A5ZS9/WvZl5gy6Lla3n8= + + hash2 + + 5/WJsQyqV/XBQ9os/3U9UrPaZP3R8HzKf4SozlpNinY= + + + stp_card_error_amex.png + + hash + + fcNpj5t0yPh1zpWYegJ9G9sElAU= + + hash2 + + Td7EWoxio1cQ9jJoB0bs3d9Kygm5yLKz/IE/a4HFsDY= + + + stp_card_error_amex@2x.png + + hash + + 9cHRf+a8+VRD0fbQNHDCz1SNAEE= + + hash2 + + SZ9c6B2OwFbjbabRK0F0rdc2kyfQ4A2Wf4EjbLTn640= + + + stp_card_error_amex@3x.png + + hash + + redAbFzaqrp3lChrlvbdnBDmnnM= + + hash2 + + 9HLHkRWk+g3KQmA/0D3j7TzUJikBkyfRbl4R6dvjUDk= + + + stp_card_form_back.png + + hash + + arYL6258S9MXvJjFsCCEt9TDc4c= + + hash2 + + tW15uRznSo9drAeBI/1aJ8Bbe1NI5DJDp9dNoSkYjzw= + + + stp_card_form_back@2x.png + + hash + + 7HaunxnPYvF+G2ZSy9PA+ze3ef4= + + hash2 + + ao1NRHUnIrIDM968vYojlPbmCvscHPfhBBdPqobLtoM= + + + stp_card_form_back@3x.png + + hash + + o4soBcRRvck+BmmhDuQJBCFaYMY= + + hash2 + + MI+kt9hpWqXcndil4sENgMOFTB8h+MrXRj9PKxU+DX0= + + + stp_card_form_front.png + + hash + + FUvSd23IUAdKk1wB4DKeOyFG3iY= + + hash2 + + pz+4+iuj1VaqHeygNjHMUysh8i7wKsM3Z8Z1WwoXuyw= + + + stp_card_form_front@2x.png + + hash + + y/F52HByKH9H1YeRTRTPcANT/jY= + + hash2 + + gfpo36XBs2ZSNgrO2WqN9A4L1jGCl01sjs3FZ0TM+j0= + + + stp_card_form_front@3x.png + + hash + + Mo+YJ6OyS3/4c8VH4yVYjQHklq4= + + hash2 + + frhe+FddLL+GNW6Jz7R10b0ClPaCp6Iz4+vD5q5M6UM= + + + stp_card_jcb.png + + hash + + 9Qqr6gF1fVXQoHQ47se8T+JIksE= + + hash2 + + wz3qJLNOAOGFNiMoCwiDztWVrI9Hf0WSO7IjxYVEIlk= + + + stp_card_jcb@2x.png + + hash + + BTiJkm0wsS3pMnUm5uv3Oh1fpj0= + + hash2 + + 9hIS1l2WHr7FUnq3nl+dtOfF/MMs+PY1kDlnP7Ldo44= + + + stp_card_jcb@3x.png + + hash + + SjeEJrRq5qqUUtLX9nkvKHBUONA= + + hash2 + + KMgA9SZWoeTDaZ0fWiIuiG4jcgKsEshpVtppY6/JYIw= + + + stp_card_jcb_template.png + + hash + + gncctvKW/Rzg/w1idi+mYZZtkto= + + hash2 + + sB4bSAMo/fXeeSTrJCDd1tTmry7f1BG8WBbJudldMZ0= + + + stp_card_jcb_template@2x.png + + hash + + y32rpZjFkwGvpEZm/aqno0BIpY4= + + hash2 + + Se8aTQPK+OitSTNtMjfq9dizRgAbHmkC6f+oISiYc/o= + + + stp_card_jcb_template@3x.png + + hash + + uDP9Pjd8IblfTi8ryiw32raPoQM= + + hash2 + + MElHqS4nSZi0YTAPuCSC5F1EYztKro6mnoMqjagRzAA= + + + stp_card_mastercard.png + + hash + + J5dlu3O/oUROuHVhL6rLXLahvGM= + + hash2 + + vh8OC+6ZXcnfxP7aJM6Mjdwo3Om3a9TjgxWKWYd+aec= + + + stp_card_mastercard@2x.png + + hash + + 3D2j3r0BLWaIeO+NoUtjaLDkF3k= + + hash2 + + lvSv3U31AxHSfHRkQcttlHBdEqweqsDBJdEJNRfxIvM= + + + stp_card_mastercard@3x.png + + hash + + kfpbxYzy8lmKkIOsRbKciEVTZWg= + + hash2 + + Kaq6UXoBvqbtpa8jm0cy0w0tvsUPoA3+rvOIjDQftKc= + + + stp_card_mastercard_template.png + + hash + + 2pRKoYqiI0bSMEXMEgHql6n8EJ0= + + hash2 + + 3Gd+OTtu6LUjSE2IXf4Sz6EwwBlEVYZYDIcAjs4yW3M= + + + stp_card_mastercard_template@2x.png + + hash + + OAE0d/QocycHrrkJTKFLhJo9yys= + + hash2 + + 9FWWBtds6ENXeKPmz/V1N48qM4Bo4dYCqZMn64Wt5Pc= + + + stp_card_mastercard_template@3x.png + + hash + + uF0rsVBHgkVIxcGMiVLJdfqnsUA= + + hash2 + + fpk6Bssrfl5k/cM4EuxPVfLvP8mqNLXXL3RbDorvmZ0= + + + stp_card_unknown.png + + hash + + ozQ16kISiRJaR/qkdpMjE7nax+4= + + hash2 + + XFCCHi3ebw7ND2MSOGf2bPDnAvW95YWzCY45jbG8wmI= + + + stp_card_unknown@2x.png + + hash + + 60WDmnEXxahflWuE6RWSYGlqbt0= + + hash2 + + fFCszDcnkhnDsa56UgsTALAjFA+THRZ+oDNHkbjMNS4= + + + stp_card_unknown@3x.png + + hash + + Touf4iR7hjOSysxfUwV4i8KffLA= + + hash2 + + JUGZfIiJrdFxAKuBUL2YqABk7oCDqPk1q7gddnVq8B8= + + + stp_card_visa.png + + hash + + 1l1DgI4Fl56UxmIEG3wJGLqgHoA= + + hash2 + + 7gF6MG+QPq19WP4Sqs9+yWsCXw0afcIsGYWltbJCa1w= + + + stp_card_visa@2x.png + + hash + + EasaxBK4jHzjQtEET1nV8KU6jI4= + + hash2 + + PIqNvOZefbpT3fdbqc8qh4CZCRQhFnLfi9f0gs9/kKk= + + + stp_card_visa@3x.png + + hash + + GCIO3SaxQBLDQ0HjQWypMVkYUOc= + + hash2 + + 2eqkpaM4g6c8w6gvKUyLfSnak5dxQdclxk7L55vQhZI= + + + stp_card_visa_template.png + + hash + + VJhgmIyGBZIb79dKkbEGnBwf44s= + + hash2 + + 6pthMxrymD43uva5VSeXY6PW2vKAEgkBraQAPzSM7R8= + + + stp_card_visa_template@2x.png + + hash + + S4shcF/6tuIH4ZCOUMuJmBykxq4= + + hash2 + + doiSADsWq6p16C/fymgR2KRAg4kdLPGEnOmbHqWOwKo= + + + stp_card_visa_template@3x.png + + hash + + 5mns9YpSOMAnW1cytzW1k0eAzkU= + + hash2 + + z71hmhHMY0ls785OusHSORztw7/H103OquucbgiW2QQ= + + + stp_icon_add.png + + hash + + WVhVJrpxz+hy8upNdPrmx3XDxV0= + + hash2 + + KJYAh7qg+8JbMwmTBbZLFhMau2SklzbaAviJgjpwvZs= + + + stp_icon_add@2x.png + + hash + + 7pN2kVv1eafTYzjeakFEgQoF68Q= + + hash2 + + 98cHqn/HmXfoSYI5eaXeMkudlfZNpD/4ZNYH7Ki0u7A= + + + stp_icon_add@3x.png + + hash + + I2/zUOCVYrCFXA6Qc5u+U6bhl58= + + hash2 + + J8xfcgpCtm9HUZOTLGPlhKKrc6GOh2uREHzMZz/PHIM= + + + stp_icon_checkmark.png + + hash + + 92/pr1m6QRRxBvTJx3Iox4ikoYU= + + hash2 + + eDdEyfY25owftLteyZOlqPW5lzd2cLYh6rwyaDxGLn8= + + + stp_icon_checkmark@2x.png + + hash + + a5QcogSP6Nk7eSuf5HL1GkFrBMM= + + hash2 + + qNbjCroBAbV5ASZ2ps1eGx/UmG3s7AS142FjfsR0p88= + + + stp_icon_checkmark@3x.png + + hash + + 3+MbJQzrSylhATDPNGHm2GdpgDw= + + hash2 + + lI4yHTWBdu8egr5JSrKa+cTysfuej0rn2XASbDfeakE= + + + stp_shipping_form.png + + hash + + sHk6zeVOeieab+Rl2UlmQ3bmEFw= + + hash2 + + F57k1WE/vYNPQ+RkVxwsT3wrg58PzmKpRt5IC5Pkwas= + + + stp_shipping_form@2x.png + + hash + + QV5/dCpHS8EIN9KoSadU8bKUsAE= + + hash2 + + hJudOuU623zf4C17sEo8ZDHcwGLdK0tGquuVwSRmf7g= + + + stp_shipping_form@3x.png + + hash + + nmDDwoJPaMVz7b0hIOy008ZVKgU= + + hash2 + + QL1PnjZXC/UmoVdYEy+oJzmchonnpA1wuFRVfdD+qQE= + + + zh-Hans.lproj/Localizable.strings + + hash + + uXz3EfP2UFMWB9tDKEpVV9Hjmrc= + + hash2 + + eCgzvj4qda+0vTkrTPLnhFJk4q4qrYLm1iOkyWQirMA= + + optional + + + + rules + + ^ + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^version.plist$ + + + rules2 + + .*\.dSYM($|/) + + weight + 11 + + ^ + + weight + 20 + + ^(.*/)?\.DS_Store$ + + omit + + weight + 2000 + + ^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/ + + nested + + weight + 10 + + ^.* + + ^.*\.lproj/ + + optional + + weight + 1000 + + ^.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Base\.lproj/ + + weight + 1010 + + ^Info\.plist$ + + omit + + weight + 20 + + ^PkgInfo$ + + omit + + weight + 20 + + ^[^/]+$ + + nested + + weight + 10 + + ^embedded\.provisionprofile$ + + weight + 20 + + ^version\.plist$ + + weight + 20 + + + + diff --git a/Stripe.framework/de.lproj/Localizable.strings b/Stripe.framework/de.lproj/Localizable.strings new file mode 100644 index 0000000..2e4f094 Binary files /dev/null and b/Stripe.framework/de.lproj/Localizable.strings differ diff --git a/Stripe.framework/en.lproj/Localizable.strings b/Stripe.framework/en.lproj/Localizable.strings new file mode 100644 index 0000000..d78db2f Binary files /dev/null and b/Stripe.framework/en.lproj/Localizable.strings differ diff --git a/Stripe.framework/es.lproj/Localizable.strings b/Stripe.framework/es.lproj/Localizable.strings new file mode 100644 index 0000000..aceb56c Binary files /dev/null and b/Stripe.framework/es.lproj/Localizable.strings differ diff --git a/Stripe.framework/fr.lproj/Localizable.strings b/Stripe.framework/fr.lproj/Localizable.strings new file mode 100644 index 0000000..0c248ab Binary files /dev/null and b/Stripe.framework/fr.lproj/Localizable.strings differ diff --git a/Stripe.framework/integrate-dynamic-framework.sh b/Stripe.framework/integrate-dynamic-framework.sh new file mode 100755 index 0000000..80814ab --- /dev/null +++ b/Stripe.framework/integrate-dynamic-framework.sh @@ -0,0 +1,72 @@ +################################################################################ +# +# Copyright 2015 Realm Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +################################################################################ + +# This script strips all non-valid architectures from dynamic libraries in +# the application's `Frameworks` directory. +# +# The following environment variables are required: +# +# BUILT_PRODUCTS_DIR +# FRAMEWORKS_FOLDER_PATH +# VALID_ARCHS +# EXPANDED_CODE_SIGN_IDENTITY + + +# Signs a framework with the provided identity +code_sign() { + # 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} --preserve-metadata=identifier,entitlements $1" + /usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} --preserve-metadata=identifier,entitlements "$1" +} + +# Set working directory to product’s embedded frameworks +cd "${BUILT_PRODUCTS_DIR}/${FRAMEWORKS_FOLDER_PATH}" + +if [ "$ACTION" = "install" ]; then + echo "Copy .bcsymbolmap files to .xcarchive" + find . -name '*.bcsymbolmap' -type f -exec mv {} "${CONFIGURATION_BUILD_DIR}" \; +else + # Delete *.bcsymbolmap files from framework bundle unless archiving + find . -name '*.bcsymbolmap' -type f -exec rm -rf "{}" +\; +fi + +echo "Stripping frameworks" + +for file in $(find . -type f -perm +111); do + # Skip non-dynamic libraries + if ! [[ "$(file "$file")" == *"dynamically linked shared library"* ]]; then + continue + fi + # Get architectures for current file + archs="$(lipo -info "${file}" | 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 "$file" "$file" || exit 1 + stripped="$stripped $arch" + fi + done + if [[ "$stripped" != "" ]]; then + echo "Stripped $file of architectures:$stripped" + if [ "${CODE_SIGNING_REQUIRED}" == "YES" ]; then + code_sign "${file}" + fi + fi +done diff --git a/Stripe.framework/it.lproj/Localizable.strings b/Stripe.framework/it.lproj/Localizable.strings new file mode 100644 index 0000000..940cc95 Binary files /dev/null and b/Stripe.framework/it.lproj/Localizable.strings differ diff --git a/Stripe.framework/ja.lproj/Localizable.strings b/Stripe.framework/ja.lproj/Localizable.strings new file mode 100644 index 0000000..9e17e6f Binary files /dev/null and b/Stripe.framework/ja.lproj/Localizable.strings differ diff --git a/Stripe.framework/nl.lproj/Localizable.strings b/Stripe.framework/nl.lproj/Localizable.strings new file mode 100644 index 0000000..d2a029d Binary files /dev/null and b/Stripe.framework/nl.lproj/Localizable.strings differ diff --git a/Stripe.framework/stp_card_amex.png b/Stripe.framework/stp_card_amex.png new file mode 100644 index 0000000..43ffa0f Binary files /dev/null and b/Stripe.framework/stp_card_amex.png differ diff --git a/Stripe.framework/stp_card_amex@2x.png b/Stripe.framework/stp_card_amex@2x.png new file mode 100644 index 0000000..0ec400e Binary files /dev/null and b/Stripe.framework/stp_card_amex@2x.png differ diff --git a/Stripe.framework/stp_card_amex@3x.png b/Stripe.framework/stp_card_amex@3x.png new file mode 100644 index 0000000..1a16fe4 Binary files /dev/null and b/Stripe.framework/stp_card_amex@3x.png differ diff --git a/Stripe.framework/stp_card_amex_template.png b/Stripe.framework/stp_card_amex_template.png new file mode 100644 index 0000000..0fcec50 Binary files /dev/null and b/Stripe.framework/stp_card_amex_template.png differ diff --git a/Stripe.framework/stp_card_amex_template@2x.png b/Stripe.framework/stp_card_amex_template@2x.png new file mode 100644 index 0000000..c525c07 Binary files /dev/null and b/Stripe.framework/stp_card_amex_template@2x.png differ diff --git a/Stripe.framework/stp_card_amex_template@3x.png b/Stripe.framework/stp_card_amex_template@3x.png new file mode 100644 index 0000000..856eb4f Binary files /dev/null and b/Stripe.framework/stp_card_amex_template@3x.png differ diff --git a/Stripe.framework/stp_card_applepay.png b/Stripe.framework/stp_card_applepay.png new file mode 100644 index 0000000..bf2503a Binary files /dev/null and b/Stripe.framework/stp_card_applepay.png differ diff --git a/Stripe.framework/stp_card_applepay@2x.png b/Stripe.framework/stp_card_applepay@2x.png new file mode 100644 index 0000000..211cf46 Binary files /dev/null and b/Stripe.framework/stp_card_applepay@2x.png differ diff --git a/Stripe.framework/stp_card_applepay@3x.png b/Stripe.framework/stp_card_applepay@3x.png new file mode 100644 index 0000000..b5c0cc8 Binary files /dev/null and b/Stripe.framework/stp_card_applepay@3x.png differ diff --git a/Stripe.framework/stp_card_cvc.png b/Stripe.framework/stp_card_cvc.png new file mode 100644 index 0000000..30c2e31 Binary files /dev/null and b/Stripe.framework/stp_card_cvc.png differ diff --git a/Stripe.framework/stp_card_cvc@2x.png b/Stripe.framework/stp_card_cvc@2x.png new file mode 100644 index 0000000..f365352 Binary files /dev/null and b/Stripe.framework/stp_card_cvc@2x.png differ diff --git a/Stripe.framework/stp_card_cvc@3x.png b/Stripe.framework/stp_card_cvc@3x.png new file mode 100644 index 0000000..7cdb3c2 Binary files /dev/null and b/Stripe.framework/stp_card_cvc@3x.png differ diff --git a/Stripe.framework/stp_card_cvc_amex.png b/Stripe.framework/stp_card_cvc_amex.png new file mode 100644 index 0000000..3d4a584 Binary files /dev/null and b/Stripe.framework/stp_card_cvc_amex.png differ diff --git a/Stripe.framework/stp_card_cvc_amex@2x.png b/Stripe.framework/stp_card_cvc_amex@2x.png new file mode 100644 index 0000000..6dde446 Binary files /dev/null and b/Stripe.framework/stp_card_cvc_amex@2x.png differ diff --git a/Stripe.framework/stp_card_cvc_amex@3x.png b/Stripe.framework/stp_card_cvc_amex@3x.png new file mode 100644 index 0000000..b26e42b Binary files /dev/null and b/Stripe.framework/stp_card_cvc_amex@3x.png differ diff --git a/Stripe.framework/stp_card_diners.png b/Stripe.framework/stp_card_diners.png new file mode 100644 index 0000000..4a2e23d Binary files /dev/null and b/Stripe.framework/stp_card_diners.png differ diff --git a/Stripe.framework/stp_card_diners@2x.png b/Stripe.framework/stp_card_diners@2x.png new file mode 100644 index 0000000..c171d5a Binary files /dev/null and b/Stripe.framework/stp_card_diners@2x.png differ diff --git a/Stripe.framework/stp_card_diners@3x.png b/Stripe.framework/stp_card_diners@3x.png new file mode 100644 index 0000000..f2efaa1 Binary files /dev/null and b/Stripe.framework/stp_card_diners@3x.png differ diff --git a/Stripe.framework/stp_card_diners_template.png b/Stripe.framework/stp_card_diners_template.png new file mode 100644 index 0000000..4f4ad2d Binary files /dev/null and b/Stripe.framework/stp_card_diners_template.png differ diff --git a/Stripe.framework/stp_card_diners_template@2x.png b/Stripe.framework/stp_card_diners_template@2x.png new file mode 100644 index 0000000..2856d01 Binary files /dev/null and b/Stripe.framework/stp_card_diners_template@2x.png differ diff --git a/Stripe.framework/stp_card_diners_template@3x.png b/Stripe.framework/stp_card_diners_template@3x.png new file mode 100644 index 0000000..ceb0abd Binary files /dev/null and b/Stripe.framework/stp_card_diners_template@3x.png differ diff --git a/Stripe.framework/stp_card_discover.png b/Stripe.framework/stp_card_discover.png new file mode 100644 index 0000000..336395b Binary files /dev/null and b/Stripe.framework/stp_card_discover.png differ diff --git a/Stripe.framework/stp_card_discover@2x.png b/Stripe.framework/stp_card_discover@2x.png new file mode 100644 index 0000000..2144d09 Binary files /dev/null and b/Stripe.framework/stp_card_discover@2x.png differ diff --git a/Stripe.framework/stp_card_discover@3x.png b/Stripe.framework/stp_card_discover@3x.png new file mode 100644 index 0000000..e759bab Binary files /dev/null and b/Stripe.framework/stp_card_discover@3x.png differ diff --git a/Stripe.framework/stp_card_discover_template.png b/Stripe.framework/stp_card_discover_template.png new file mode 100644 index 0000000..28e282e Binary files /dev/null and b/Stripe.framework/stp_card_discover_template.png differ diff --git a/Stripe.framework/stp_card_discover_template@2x.png b/Stripe.framework/stp_card_discover_template@2x.png new file mode 100644 index 0000000..d7893a0 Binary files /dev/null and b/Stripe.framework/stp_card_discover_template@2x.png differ diff --git a/Stripe.framework/stp_card_discover_template@3x.png b/Stripe.framework/stp_card_discover_template@3x.png new file mode 100644 index 0000000..523244f Binary files /dev/null and b/Stripe.framework/stp_card_discover_template@3x.png differ diff --git a/Stripe.framework/stp_card_error.png b/Stripe.framework/stp_card_error.png new file mode 100644 index 0000000..c1dbd96 Binary files /dev/null and b/Stripe.framework/stp_card_error.png differ diff --git a/Stripe.framework/stp_card_error@2x.png b/Stripe.framework/stp_card_error@2x.png new file mode 100644 index 0000000..4b9b8de Binary files /dev/null and b/Stripe.framework/stp_card_error@2x.png differ diff --git a/Stripe.framework/stp_card_error@3x.png b/Stripe.framework/stp_card_error@3x.png new file mode 100644 index 0000000..da35f9a Binary files /dev/null and b/Stripe.framework/stp_card_error@3x.png differ diff --git a/Stripe.framework/stp_card_error_amex.png b/Stripe.framework/stp_card_error_amex.png new file mode 100644 index 0000000..1a7a075 Binary files /dev/null and b/Stripe.framework/stp_card_error_amex.png differ diff --git a/Stripe.framework/stp_card_error_amex@2x.png b/Stripe.framework/stp_card_error_amex@2x.png new file mode 100644 index 0000000..9a8c72d Binary files /dev/null and b/Stripe.framework/stp_card_error_amex@2x.png differ diff --git a/Stripe.framework/stp_card_error_amex@3x.png b/Stripe.framework/stp_card_error_amex@3x.png new file mode 100644 index 0000000..e49ac9e Binary files /dev/null and b/Stripe.framework/stp_card_error_amex@3x.png differ diff --git a/Stripe.framework/stp_card_form_back.png b/Stripe.framework/stp_card_form_back.png new file mode 100644 index 0000000..740112e Binary files /dev/null and b/Stripe.framework/stp_card_form_back.png differ diff --git a/Stripe.framework/stp_card_form_back@2x.png b/Stripe.framework/stp_card_form_back@2x.png new file mode 100644 index 0000000..e7ead5b Binary files /dev/null and b/Stripe.framework/stp_card_form_back@2x.png differ diff --git a/Stripe.framework/stp_card_form_back@3x.png b/Stripe.framework/stp_card_form_back@3x.png new file mode 100644 index 0000000..88b5f3b Binary files /dev/null and b/Stripe.framework/stp_card_form_back@3x.png differ diff --git a/Stripe.framework/stp_card_form_front.png b/Stripe.framework/stp_card_form_front.png new file mode 100644 index 0000000..aa95a0a Binary files /dev/null and b/Stripe.framework/stp_card_form_front.png differ diff --git a/Stripe.framework/stp_card_form_front@2x.png b/Stripe.framework/stp_card_form_front@2x.png new file mode 100644 index 0000000..5dd40a3 Binary files /dev/null and b/Stripe.framework/stp_card_form_front@2x.png differ diff --git a/Stripe.framework/stp_card_form_front@3x.png b/Stripe.framework/stp_card_form_front@3x.png new file mode 100644 index 0000000..da4e433 Binary files /dev/null and b/Stripe.framework/stp_card_form_front@3x.png differ diff --git a/Stripe.framework/stp_card_jcb.png b/Stripe.framework/stp_card_jcb.png new file mode 100644 index 0000000..01e7f87 Binary files /dev/null and b/Stripe.framework/stp_card_jcb.png differ diff --git a/Stripe.framework/stp_card_jcb@2x.png b/Stripe.framework/stp_card_jcb@2x.png new file mode 100644 index 0000000..dc3f674 Binary files /dev/null and b/Stripe.framework/stp_card_jcb@2x.png differ diff --git a/Stripe.framework/stp_card_jcb@3x.png b/Stripe.framework/stp_card_jcb@3x.png new file mode 100644 index 0000000..20c43d7 Binary files /dev/null and b/Stripe.framework/stp_card_jcb@3x.png differ diff --git a/Stripe.framework/stp_card_jcb_template.png b/Stripe.framework/stp_card_jcb_template.png new file mode 100644 index 0000000..24da7b3 Binary files /dev/null and b/Stripe.framework/stp_card_jcb_template.png differ diff --git a/Stripe.framework/stp_card_jcb_template@2x.png b/Stripe.framework/stp_card_jcb_template@2x.png new file mode 100644 index 0000000..37e1943 Binary files /dev/null and b/Stripe.framework/stp_card_jcb_template@2x.png differ diff --git a/Stripe.framework/stp_card_jcb_template@3x.png b/Stripe.framework/stp_card_jcb_template@3x.png new file mode 100644 index 0000000..85bf548 Binary files /dev/null and b/Stripe.framework/stp_card_jcb_template@3x.png differ diff --git a/Stripe.framework/stp_card_mastercard.png b/Stripe.framework/stp_card_mastercard.png new file mode 100644 index 0000000..8578921 Binary files /dev/null and b/Stripe.framework/stp_card_mastercard.png differ diff --git a/Stripe.framework/stp_card_mastercard@2x.png b/Stripe.framework/stp_card_mastercard@2x.png new file mode 100644 index 0000000..140ee2c Binary files /dev/null and b/Stripe.framework/stp_card_mastercard@2x.png differ diff --git a/Stripe.framework/stp_card_mastercard@3x.png b/Stripe.framework/stp_card_mastercard@3x.png new file mode 100644 index 0000000..5f23ee3 Binary files /dev/null and b/Stripe.framework/stp_card_mastercard@3x.png differ diff --git a/Stripe.framework/stp_card_mastercard_template.png b/Stripe.framework/stp_card_mastercard_template.png new file mode 100644 index 0000000..8f86e41 Binary files /dev/null and b/Stripe.framework/stp_card_mastercard_template.png differ diff --git a/Stripe.framework/stp_card_mastercard_template@2x.png b/Stripe.framework/stp_card_mastercard_template@2x.png new file mode 100644 index 0000000..47cb842 Binary files /dev/null and b/Stripe.framework/stp_card_mastercard_template@2x.png differ diff --git a/Stripe.framework/stp_card_mastercard_template@3x.png b/Stripe.framework/stp_card_mastercard_template@3x.png new file mode 100644 index 0000000..5dfa3c2 Binary files /dev/null and b/Stripe.framework/stp_card_mastercard_template@3x.png differ diff --git a/Stripe.framework/stp_card_unknown.png b/Stripe.framework/stp_card_unknown.png new file mode 100644 index 0000000..85b863c Binary files /dev/null and b/Stripe.framework/stp_card_unknown.png differ diff --git a/Stripe.framework/stp_card_unknown@2x.png b/Stripe.framework/stp_card_unknown@2x.png new file mode 100644 index 0000000..1f8ea69 Binary files /dev/null and b/Stripe.framework/stp_card_unknown@2x.png differ diff --git a/Stripe.framework/stp_card_unknown@3x.png b/Stripe.framework/stp_card_unknown@3x.png new file mode 100644 index 0000000..5443c50 Binary files /dev/null and b/Stripe.framework/stp_card_unknown@3x.png differ diff --git a/Stripe.framework/stp_card_visa.png b/Stripe.framework/stp_card_visa.png new file mode 100644 index 0000000..9f98206 Binary files /dev/null and b/Stripe.framework/stp_card_visa.png differ diff --git a/Stripe.framework/stp_card_visa@2x.png b/Stripe.framework/stp_card_visa@2x.png new file mode 100644 index 0000000..40f7af8 Binary files /dev/null and b/Stripe.framework/stp_card_visa@2x.png differ diff --git a/Stripe.framework/stp_card_visa@3x.png b/Stripe.framework/stp_card_visa@3x.png new file mode 100644 index 0000000..b965281 Binary files /dev/null and b/Stripe.framework/stp_card_visa@3x.png differ diff --git a/Stripe.framework/stp_card_visa_template.png b/Stripe.framework/stp_card_visa_template.png new file mode 100644 index 0000000..01cc4be Binary files /dev/null and b/Stripe.framework/stp_card_visa_template.png differ diff --git a/Stripe.framework/stp_card_visa_template@2x.png b/Stripe.framework/stp_card_visa_template@2x.png new file mode 100644 index 0000000..685eaff Binary files /dev/null and b/Stripe.framework/stp_card_visa_template@2x.png differ diff --git a/Stripe.framework/stp_card_visa_template@3x.png b/Stripe.framework/stp_card_visa_template@3x.png new file mode 100644 index 0000000..7d37285 Binary files /dev/null and b/Stripe.framework/stp_card_visa_template@3x.png differ diff --git a/Stripe.framework/stp_icon_add.png b/Stripe.framework/stp_icon_add.png new file mode 100644 index 0000000..2acf080 Binary files /dev/null and b/Stripe.framework/stp_icon_add.png differ diff --git a/Stripe.framework/stp_icon_add@2x.png b/Stripe.framework/stp_icon_add@2x.png new file mode 100644 index 0000000..8b8f17b Binary files /dev/null and b/Stripe.framework/stp_icon_add@2x.png differ diff --git a/Stripe.framework/stp_icon_add@3x.png b/Stripe.framework/stp_icon_add@3x.png new file mode 100644 index 0000000..9ab9ca2 Binary files /dev/null and b/Stripe.framework/stp_icon_add@3x.png differ diff --git a/Stripe.framework/stp_icon_checkmark.png b/Stripe.framework/stp_icon_checkmark.png new file mode 100644 index 0000000..a3ddd63 Binary files /dev/null and b/Stripe.framework/stp_icon_checkmark.png differ diff --git a/Stripe.framework/stp_icon_checkmark@2x.png b/Stripe.framework/stp_icon_checkmark@2x.png new file mode 100644 index 0000000..c7c5610 Binary files /dev/null and b/Stripe.framework/stp_icon_checkmark@2x.png differ diff --git a/Stripe.framework/stp_icon_checkmark@3x.png b/Stripe.framework/stp_icon_checkmark@3x.png new file mode 100644 index 0000000..554ceea Binary files /dev/null and b/Stripe.framework/stp_icon_checkmark@3x.png differ diff --git a/Stripe.framework/stp_shipping_form.png b/Stripe.framework/stp_shipping_form.png new file mode 100644 index 0000000..c3208b0 Binary files /dev/null and b/Stripe.framework/stp_shipping_form.png differ diff --git a/Stripe.framework/stp_shipping_form@2x.png b/Stripe.framework/stp_shipping_form@2x.png new file mode 100644 index 0000000..f81269d Binary files /dev/null and b/Stripe.framework/stp_shipping_form@2x.png differ diff --git a/Stripe.framework/stp_shipping_form@3x.png b/Stripe.framework/stp_shipping_form@3x.png new file mode 100644 index 0000000..605b180 Binary files /dev/null and b/Stripe.framework/stp_shipping_form@3x.png differ diff --git a/Stripe.framework/zh-Hans.lproj/Localizable.strings b/Stripe.framework/zh-Hans.lproj/Localizable.strings new file mode 100644 index 0000000..8e84795 Binary files /dev/null and b/Stripe.framework/zh-Hans.lproj/Localizable.strings differ diff --git a/e-shop.xcodeproj/project.pbxproj b/e-shop.xcodeproj/project.pbxproj index 2f23d9c..ed65ea4 100644 --- a/e-shop.xcodeproj/project.pbxproj +++ b/e-shop.xcodeproj/project.pbxproj @@ -28,6 +28,15 @@ ED667CD51FBB065900B5B75B /* ItemCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED667CD31FBB065900B5B75B /* ItemCell.swift */; }; ED667CD61FBB065900B5B75B /* ItemCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = ED667CD41FBB065900B5B75B /* ItemCell.xib */; }; ED667CDD1FBB0C9E00B5B75B /* Item.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED667CDC1FBB0C9E00B5B75B /* Item.swift */; }; + ED729CEF1FBCA50E0057E6B9 /* StripViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED729CEE1FBCA50E0057E6B9 /* StripViewController.swift */; }; + EDA4E6991FBCB9790022B775 /* Stripe.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EDA4E6981FBCB8F30022B775 /* Stripe.framework */; }; + EDA4E69A1FBCBA2B0022B775 /* Stripe.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EDA4E6981FBCB8F30022B775 /* Stripe.framework */; }; + EDA4E69B1FBCBA2B0022B775 /* Stripe.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = EDA4E6981FBCB8F30022B775 /* Stripe.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + EDA4E69E1FBCC1660022B775 /* StripPay.swift in Sources */ = {isa = PBXBuildFile; fileRef = EDA4E69D1FBCC1660022B775 /* StripPay.swift */; }; + EDA4E6A01FBCC54A0022B775 /* Extention.swift in Sources */ = {isa = PBXBuildFile; fileRef = EDA4E69F1FBCC54A0022B775 /* Extention.swift */; }; + EDAB4FC21FBD669B00E21BB0 /* BrainTreePay.swift in Sources */ = {isa = PBXBuildFile; fileRef = EDAB4FC11FBD669B00E21BB0 /* BrainTreePay.swift */; }; + EDAB4FC51FBD699700E21BB0 /* ApplePaySwagServer.py in Resources */ = {isa = PBXBuildFile; fileRef = EDAB4FC31FBD699700E21BB0 /* ApplePaySwagServer.py */; }; + EDAB4FC61FBD699700E21BB0 /* BrainTree.py in Resources */ = {isa = PBXBuildFile; fileRef = EDAB4FC41FBD699700E21BB0 /* BrainTree.py */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -47,6 +56,20 @@ }; /* End PBXContainerItemProxy section */ +/* Begin PBXCopyFilesBuildPhase section */ + EDA4E69C1FBCBA2C0022B775 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + EDA4E69B1FBCBA2B0022B775 /* Stripe.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + /* Begin PBXFileReference section */ 08369B7DB89D2EC5F3C41893 /* Pods-e-shop.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-e-shop.release.xcconfig"; path = "Pods/Target Support Files/Pods-e-shop/Pods-e-shop.release.xcconfig"; sourceTree = ""; }; 0C143FB395545562F5723130 /* Pods_e_shop.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_e_shop.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -80,6 +103,13 @@ ED667CD31FBB065900B5B75B /* ItemCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemCell.swift; sourceTree = ""; }; ED667CD41FBB065900B5B75B /* ItemCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ItemCell.xib; sourceTree = ""; }; ED667CDC1FBB0C9E00B5B75B /* Item.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Item.swift; sourceTree = ""; }; + ED729CEE1FBCA50E0057E6B9 /* StripViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StripViewController.swift; sourceTree = ""; }; + EDA4E6981FBCB8F30022B775 /* Stripe.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Stripe.framework; sourceTree = ""; }; + EDA4E69D1FBCC1660022B775 /* StripPay.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StripPay.swift; sourceTree = ""; }; + EDA4E69F1FBCC54A0022B775 /* Extention.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Extention.swift; sourceTree = ""; }; + EDAB4FC11FBD669B00E21BB0 /* BrainTreePay.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrainTreePay.swift; sourceTree = ""; }; + EDAB4FC31FBD699700E21BB0 /* ApplePaySwagServer.py */ = {isa = PBXFileReference; lastKnownFileType = text.script.python; path = ApplePaySwagServer.py; sourceTree = SOURCE_ROOT; }; + EDAB4FC41FBD699700E21BB0 /* BrainTree.py */ = {isa = PBXFileReference; lastKnownFileType = text.script.python; path = BrainTree.py; sourceTree = SOURCE_ROOT; }; EF708E367E03BA7BC20496C9 /* Pods-e-shop.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-e-shop.debug.xcconfig"; path = "Pods/Target Support Files/Pods-e-shop/Pods-e-shop.debug.xcconfig"; sourceTree = ""; }; FB6545479EDB20956C8E05CD /* Pods-e-shopTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-e-shopTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-e-shopTests/Pods-e-shopTests.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ @@ -89,7 +119,9 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + EDA4E6991FBCB9790022B775 /* Stripe.framework in Frameworks */, D8BC38F60B16F36E23BB0B89 /* Pods_e_shop.framework in Frameworks */, + EDA4E69A1FBCBA2B0022B775 /* Stripe.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -147,6 +179,7 @@ ED667C971FBB055000B5B75B = { isa = PBXGroup; children = ( + EDA4E6981FBCB8F30022B775 /* Stripe.framework */, ED667CA21FBB055100B5B75B /* e-shop */, ED667CB91FBB055100B5B75B /* e-shopTests */, ED667CC41FBB055100B5B75B /* e-shopUITests */, @@ -225,6 +258,7 @@ ED48BBE11FBB1CA300A74A7F /* DetailsVC.swift */, ED667CA71FBB055100B5B75B /* CartVC.swift */, ED48BBEA1FBB41F800A74A7F /* OrderVC.swift */, + ED729CEE1FBCA50E0057E6B9 /* StripViewController.swift */, ); path = Controller; sourceTree = ""; @@ -232,8 +266,11 @@ ED667CDA1FBB0A9300B5B75B /* Supporting Files */ = { isa = PBXGroup; children = ( + EDAB4FC31FBD699700E21BB0 /* ApplePaySwagServer.py */, + EDAB4FC41FBD699700E21BB0 /* BrainTree.py */, ED667CA31FBB055100B5B75B /* AppDelegate.swift */, ED667CAC1FBB055100B5B75B /* Assets.xcassets */, + EDA4E69F1FBCC54A0022B775 /* Extention.swift */, ); path = "Supporting Files"; sourceTree = ""; @@ -244,6 +281,8 @@ ED667CDC1FBB0C9E00B5B75B /* Item.swift */, ED48BBE31FBB29FB00A74A7F /* Cart.swift */, ED48BBEF1FBB601100A74A7F /* ApplePay.swift */, + EDA4E69D1FBCC1660022B775 /* StripPay.swift */, + EDAB4FC11FBD669B00E21BB0 /* BrainTreePay.swift */, ); name = Model; sourceTree = ""; @@ -261,6 +300,7 @@ ED667C9E1FBB055100B5B75B /* Resources */, 1F2E09F727F147F559021A91 /* [CP] Embed Pods Frameworks */, 6791B5B1453496986CDB04AD /* [CP] Copy Pods Resources */, + EDA4E69C1FBCBA2C0022B775 /* Embed Frameworks */, ); buildRules = ( ); @@ -369,12 +409,14 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + EDAB4FC51FBD699700E21BB0 /* ApplePaySwagServer.py in Resources */, ED667CD61FBB065900B5B75B /* ItemCell.xib in Resources */, ED48BBE81FBB2E0C00A74A7F /* CartCell.xib in Resources */, ED667CB01FBB055100B5B75B /* LaunchScreen.storyboard in Resources */, ED48BBED1FBB41F800A74A7F /* OrderVC.xib in Resources */, ED667CAD1FBB055100B5B75B /* Assets.xcassets in Resources */, ED667CAB1FBB055100B5B75B /* Main.storyboard in Resources */, + EDAB4FC61FBD699700E21BB0 /* BrainTree.py in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -420,11 +462,13 @@ ); inputPaths = ( "${SRCROOT}/Pods/Target Support Files/Pods-e-shop/Pods-e-shop-frameworks.sh", - "${BUILT_PRODUCTS_DIR}/Stripe/Stripe.framework", + "${BUILT_PRODUCTS_DIR}/Braintree/Braintree.framework", + "${BUILT_PRODUCTS_DIR}/SwiftSpinner/SwiftSpinner.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Stripe.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Braintree.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftSpinner.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -554,11 +598,15 @@ ED48BBE21FBB1CA300A74A7F /* DetailsVC.swift in Sources */, ED667CD51FBB065900B5B75B /* ItemCell.swift in Sources */, ED48BBE71FBB2E0C00A74A7F /* CartCell.swift in Sources */, + EDA4E69E1FBCC1660022B775 /* StripPay.swift in Sources */, ED48BBE41FBB29FB00A74A7F /* Cart.swift in Sources */, ED667CA81FBB055100B5B75B /* CartVC.swift in Sources */, + EDA4E6A01FBCC54A0022B775 /* Extention.swift in Sources */, ED667CA41FBB055100B5B75B /* AppDelegate.swift in Sources */, ED667CA61FBB055100B5B75B /* ItemVC.swift in Sources */, ED48BBF01FBB601100A74A7F /* ApplePay.swift in Sources */, + ED729CEF1FBCA50E0057E6B9 /* StripViewController.swift in Sources */, + EDAB4FC21FBD669B00E21BB0 /* BrainTreePay.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -728,6 +776,10 @@ CODE_SIGN_ENTITLEMENTS = "e-shop/e-shop.entitlements"; CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = G5A2E3RMNX; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)", + ); GCC_PREPROCESSOR_DEFINITIONS = ( "$(inherited)", "COCOAPODS=1", @@ -735,6 +787,7 @@ ); INFOPLIST_FILE = "e-shop/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\""; PRODUCT_BUNDLE_IDENTIFIER = "com.weza.e-shop"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 4.0; @@ -750,6 +803,10 @@ CODE_SIGN_ENTITLEMENTS = "e-shop/e-shop.entitlements"; CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = G5A2E3RMNX; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)", + ); GCC_PREPROCESSOR_DEFINITIONS = ( "$(inherited)", "COCOAPODS=1", @@ -757,6 +814,7 @@ ); INFOPLIST_FILE = "e-shop/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\""; PRODUCT_BUNDLE_IDENTIFIER = "com.weza.e-shop"; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 4.0; diff --git a/e-shop.xcodeproj/xcuserdata/surendrakumar.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/e-shop.xcodeproj/xcuserdata/surendrakumar.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 0000000..fe2b454 --- /dev/null +++ b/e-shop.xcodeproj/xcuserdata/surendrakumar.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,5 @@ + + + diff --git a/e-shop.xcodeproj/xcuserdata/surendrakumar.xcuserdatad/xcschemes/xcschememanagement.plist b/e-shop.xcodeproj/xcuserdata/surendrakumar.xcuserdatad/xcschemes/xcschememanagement.plist index 8be82b2..ca8fcbc 100644 --- a/e-shop.xcodeproj/xcuserdata/surendrakumar.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/e-shop.xcodeproj/xcuserdata/surendrakumar.xcuserdatad/xcschemes/xcschememanagement.plist @@ -7,7 +7,7 @@ e-shop.xcscheme orderHint - 4 + 7 diff --git a/e-shop.xcworkspace/contents.xcworkspacedata b/e-shop.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..5e63a64 --- /dev/null +++ b/e-shop.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/e-shop.xcworkspace/xcuserdata/surendrakumar.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/e-shop.xcworkspace/xcuserdata/surendrakumar.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 0000000..ed9a9b4 --- /dev/null +++ b/e-shop.xcworkspace/xcuserdata/surendrakumar.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,5 @@ + + + diff --git a/e-shop/ApplePay.swift b/e-shop/ApplePay.swift index 59e4946..f195cec 100644 --- a/e-shop/ApplePay.swift +++ b/e-shop/ApplePay.swift @@ -10,6 +10,7 @@ import Foundation import PassKit let publisableKey = "pk_test_SrHU35nCqiToGG5R5zfOQKx6" let secrete = "sk_test_4HKKLEaGa6YweA50gknGDYEf" + class ApplePay{ let merchantID = "merchant.com.weza.e-shop" let supportedPaymentNertwork :[ PKPaymentNetwork ] = [.visa,.amex,.masterCard] diff --git a/e-shop/BrainTreePay.swift b/e-shop/BrainTreePay.swift new file mode 100644 index 0000000..1319e2d --- /dev/null +++ b/e-shop/BrainTreePay.swift @@ -0,0 +1,46 @@ +// +// BrainTreePay.swift +// e-shop +// +// Created by surendra kumar on 11/16/17. +// Copyright © 2017 weza. All rights reserved. +// + +import Foundation +import Braintree + +class BraintreePay { + + func getClientToken(completion: @escaping (String?)->()){ + + let url = URL(string: "http://0.0.0.0:5000/client_token") + var request = URLRequest(url: url!) + request.httpMethod = "GET" + + URLSession.shared.dataTask(with: request){ + data, response, error in + let token = String(data: data!, encoding: .utf8) + DispatchQueue.main.async { + completion(token) + } + }.resume() + + } + + func makeFinalPayment(nonce : String,price : Double){ + let paymentURL = URL(string: "http://0.0.0.0:5000/checkout") + var request = URLRequest(url: paymentURL!) + request.httpMethod = "POST" + request.setValue("application/json", forHTTPHeaderField: "Content-Type") + request.setValue("application/json", forHTTPHeaderField: "Accept") + + let body = ["payment_method_nonce":nonce, + "amount": String(price)] + try! request.httpBody = JSONSerialization.data(withJSONObject: body, options: JSONSerialization.WritingOptions()) + + + URLSession.shared.dataTask(with: request) { (data, response, error) -> Void in + print(error ?? "") + }.resume() + } +} diff --git a/e-shop/Controller/OrderVC.swift b/e-shop/Controller/OrderVC.swift index f663c0d..ed1f5c9 100644 --- a/e-shop/Controller/OrderVC.swift +++ b/e-shop/Controller/OrderVC.swift @@ -12,7 +12,7 @@ import Stripe class OrderVC: UIViewController { - + let stripManager = StripPay() let merchantID = "merchant.com.weza.e-shop" let supportedPaymentNertwork :[ PKPaymentNetwork ] = [.visa,.amex,.masterCard] let manager = ApplePay() @@ -64,17 +64,25 @@ class OrderVC: UIViewController { } extension OrderVC : PKPaymentAuthorizationViewControllerDelegate { + func paymentAuthorizationViewControllerDidFinish(_ controller: PKPaymentAuthorizationViewController) { controller.dismiss(animated: true, completion: nil) } func paymentAuthorizationViewController(_ controller: PKPaymentAuthorizationViewController, didAuthorizePayment payment: PKPayment, completion: @escaping (PKPaymentAuthorizationStatus) -> Void) { - self.stripconf(payment: payment) { error in - if (error != nil) { - completion(PKPaymentAuthorizationStatus.failure) - } else { - completion(PKPaymentAuthorizationStatus.success) + stripManager.createSTPToken(forPayment: payment) { (token, error) in + guard error == nil else { + print(error!.localizedDescription) + return } + guard let tokenF = token else {return} + self.stripManager.makeFinalPayment(token: tokenF, price: self.manager.effectivePrice!, completion: { error in + guard error == nil else { + self.Alert(title: "Failed!", message: "payment Failed") + return + } + + }) } } @@ -87,39 +95,5 @@ extension OrderVC : PKPaymentAuthorizationViewControllerDelegate { } - func stripconf(payment : PKPayment, completion : @escaping (Error?)->()){ - Stripe.setDefaultPublishableKey(publisableKey) - STPAPIClient.shared().createToken(with: payment) { (token, error) in - guard error == nil else { - print(error?.localizedDescription) - return - } - - let contact = payment.shippingContact - let url = NSURL(string: "http://0.0.0.0:5000/pay") // Replace with computers local IP Address! - let request = NSMutableURLRequest(url: url! as URL) - request.httpMethod = "POST" - request.setValue("application/json", forHTTPHeaderField: "Content-Type") - request.setValue("application/json", forHTTPHeaderField: "Accept") - - //2 - let body = ["stripeToken": token?.tokenId, - "amount":self.manager.effectivePrice! * 100.0, - "description": "buy using e-shop", - "shipping": [ - "city": "shippingAddress.City!", - "state": "shippingAddress.State!", - "zip": "shippingAddress.Zip!", - "firstName": "shippingAddress.FirstName!", - "lastName": "shippingAddress.LastName!"] ] as [String : Any] - - var error: NSError? - try! request.httpBody = JSONSerialization.data(withJSONObject: body, options: JSONSerialization.WritingOptions()) - //3 - NSURLConnection.sendAsynchronousRequest(request as URLRequest, queue: OperationQueue.main) { (response, data, error) -> Void in - completion(error) - } - - } - } + } diff --git a/e-shop/Controller/StripViewController.swift b/e-shop/Controller/StripViewController.swift new file mode 100644 index 0000000..37513cc --- /dev/null +++ b/e-shop/Controller/StripViewController.swift @@ -0,0 +1,104 @@ +// +// StripViewController.swift +// e-shop +// +// Created by surendra kumar on 11/15/17. +// Copyright © 2017 weza. All rights reserved. +// + +import UIKit +import Stripe +import SwiftSpinner +import Braintree + +class StripViewController: UIViewController{ + + @IBOutlet var cardText: STPPaymentCardTextField! + + let stripManager = StripPay() + let brainTreeManager = BraintreePay() + + // BrainTree + let tokanizationKEY = "sandbox_ymxrpyvm_8vcr8hbq5yknmx7p" + var braintree: Braintree? + + override func viewDidLoad() { + super.viewDidLoad() + } + + @IBAction func pay(_ sender: Any) { +// self.payUsingCard() + self.initializeBrainTreeUI() + } + + // MARK : Strip + func payUsingCard(){ + + let cardParam = STPCardParams() + cardParam.name = "Surendra kumar" + cardParam.number = "4242424242424242" + cardParam.expMonth = 12 + cardParam.expYear = 23 + cardParam.cvc = "424" + SwiftSpinner.show("Connecting....") + // Step 1: + STPAPIClient.shared().createToken(withCard: cardParam) { (token, error) in + guard error == nil else { + self.Alert(title: "TokenError!", message: error!.localizedDescription) + SwiftSpinner.hide() + return + } + print(token!) + SwiftSpinner.show("Making Payment...") + // Step 2: + self.stripManager.makeFinalPayment(token: token!, price: 777, completion: { (error) in + guard error == nil else { + SwiftSpinner.show(progress: 50, title: "Payment \nFailed").addTapHandler({ + SwiftSpinner.hide() + }) + return + } + SwiftSpinner.show(progress: 100, title: "Payment \nSuccessful").addTapHandler({ + SwiftSpinner.hide() + }) + }) + } + } + + // MARK : BrainTree + + func initializeBrainTreeUI(){ + brainTreeManager.getClientToken { token in + guard let clientToken = token else { + self.Alert(title: "Token!", message: "Not found") + return + } + self.braintree = Braintree(clientToken: clientToken) + let dropInViewController = self.braintree?.dropInViewController(with: self) + self.present(dropInViewController!, animated: true, completion: nil) + } + } + + @objc func userDidCancelPayment() { + self.dismiss(animated: true, completion: nil) + } +} + +extension StripViewController: BTDropInViewControllerDelegate{ + + func drop(_ viewController: BTDropInViewController!, didSucceedWith paymentMethod: BTPaymentMethod!) { + let paynonce = paymentMethod.nonce + guard let nonce = paynonce else { + self.Alert(title: "Nonce", message: "nonce is nil") + return + } + brainTreeManager.makeFinalPayment(nonce: nonce, price: 2.0) + dismiss(animated: true, completion: nil) + } + + func drop(inViewControllerDidCancel viewController: BTDropInViewController!) { + viewController.dismiss(animated: true, completion: nil) + } + + +} diff --git a/e-shop/StripPay.swift b/e-shop/StripPay.swift new file mode 100644 index 0000000..fd35e6f --- /dev/null +++ b/e-shop/StripPay.swift @@ -0,0 +1,48 @@ +// +// StripPay.swift +// e-shop +// +// Created by surendra kumar on 11/16/17. +// Copyright © 2017 weza. All rights reserved. +// + +import Foundation +import Stripe +class StripPay{ + + init() { + Stripe.setDefaultPublishableKey(publisableKey) + } + + func createSTPToken(forPayment payment: PKPayment, completion : @escaping (STPToken?,Error?)->()){ + STPAPIClient.shared().createToken(with: payment) { (token, error) in + completion(token,error) + } + } + + func makeFinalPayment(token : STPToken,price : Double, completion : @escaping (Error?)->()){ + + let url = NSURL(string: "http://0.0.0.0:5000/pay") // Replace with computers local IP Address! + let request = NSMutableURLRequest(url: url! as URL) + request.httpMethod = "POST" + request.setValue("application/json", forHTTPHeaderField: "Content-Type") + request.setValue("application/json", forHTTPHeaderField: "Accept") + + //2 + let body = ["stripeToken": token.tokenId, + "amount":price * 100.0, + "description": "buy using e-shop", + "shipping": [ + "city": "shippingAddress.City!", + "state": "shippingAddress.State!", + "zip": "shippingAddress.Zip!", + "firstName": "shippingAddress.FirstName!", + "lastName": "shippingAddress.LastName!"] ] as [String : Any] + + try! request.httpBody = JSONSerialization.data(withJSONObject: body, options: JSONSerialization.WritingOptions()) + //3 + NSURLConnection.sendAsynchronousRequest(request as URLRequest, queue: OperationQueue.main) { (response, data, error) -> Void in + completion(error) + } + } +} diff --git a/e-shop/Supporting Files/AppDelegate.swift b/e-shop/Supporting Files/AppDelegate.swift index 23adf19..b44e8a1 100644 --- a/e-shop/Supporting Files/AppDelegate.swift +++ b/e-shop/Supporting Files/AppDelegate.swift @@ -7,6 +7,7 @@ // import UIKit +import Stripe @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { @@ -16,6 +17,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. + Stripe.setDefaultPublishableKey(publisableKey) return true } diff --git a/e-shop/Supporting Files/Assets.xcassets/Hen.imageset/Contents.json b/e-shop/Supporting Files/Assets.xcassets/Hen.imageset/Contents.json new file mode 100644 index 0000000..c56ae0f --- /dev/null +++ b/e-shop/Supporting Files/Assets.xcassets/Hen.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "d815e816-4664-472e-990b-d880be41499f--chicken-biryani-recipe.jpg", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/e-shop/Supporting Files/Assets.xcassets/Hen.imageset/d815e816-4664-472e-990b-d880be41499f--chicken-biryani-recipe.jpg b/e-shop/Supporting Files/Assets.xcassets/Hen.imageset/d815e816-4664-472e-990b-d880be41499f--chicken-biryani-recipe.jpg new file mode 100644 index 0000000..73c359e Binary files /dev/null and b/e-shop/Supporting Files/Assets.xcassets/Hen.imageset/d815e816-4664-472e-990b-d880be41499f--chicken-biryani-recipe.jpg differ diff --git a/e-shop/Supporting Files/Extention.swift b/e-shop/Supporting Files/Extention.swift new file mode 100644 index 0000000..fa56289 --- /dev/null +++ b/e-shop/Supporting Files/Extention.swift @@ -0,0 +1,19 @@ +// +// Extentions.swift +// e-shop +// +// Created by surendra kumar on 11/16/17. +// Copyright © 2017 weza. All rights reserved. +// + +import Foundation +import UIKit + +extension UIViewController { + func Alert(title : String, message: String){ + let alert = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.alert) + let action = UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil) + alert.addAction(action) + self.present(alert, animated: false, completion: nil) + } +} diff --git a/e-shop/View/Base.lproj/Main.storyboard b/e-shop/View/Base.lproj/Main.storyboard index 0acc915..84061fb 100644 --- a/e-shop/View/Base.lproj/Main.storyboard +++ b/e-shop/View/Base.lproj/Main.storyboard @@ -156,6 +156,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/e-shop/e-shop.entitlements b/e-shop/e-shop.entitlements index 890bd6f..80faf73 100644 --- a/e-shop/e-shop.entitlements +++ b/e-shop/e-shop.entitlements @@ -5,6 +5,7 @@ com.apple.developer.in-app-payments merchant.com.weza.e-shop + merchant.com.weza.Brain