@jimrising/easymerchantsdk-react-native 2.3.3 → 2.3.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/android/build/.transforms/20e1216b87bd06eaab3c9e5c68d4267a/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/reactlibrary/RNEasymerchantsdkModule.dex +0 -0
- package/android/build/.transforms/e9a664a11ce12edf79cd87b1e07aa243/transformed/classes/classes_dex/classes.dex +0 -0
- package/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties +1 -1
- package/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin +0 -0
- package/android/build.gradle +1 -1
- package/ios/ApiManager/APIRequest.swift +1 -4
- package/ios/Bundle/EasyPayBundle.swift +1 -1
- package/ios/Classes/EasyMerchantSdk.m +2 -2
- package/ios/Classes/EasyMerchantSdk.swift +3 -3
- package/ios/CustomComponents/PlanSelector.swift +1 -1
- package/ios/Example/Base.lproj/Main.storyboard +183 -22
- package/ios/Example/ViewController.swift +208 -182
- package/ios/Helper/GrailPayHelper.swift +0 -1
- package/ios/Models/Request.swift +242 -51
- package/ios/Models/SDKResult.swift +32 -25
- package/ios/Pods/UserDefaults/UserStoreSingleton.swift +59 -60
- package/ios/Pods/ViewControllers/AdditionalInfoVC.swift +360 -150
- package/ios/Pods/ViewControllers/BaseVC.swift +2 -1
- package/ios/Pods/ViewControllers/BillingInfoVC/BillingInfoVC.swift +401 -196
- package/ios/Pods/ViewControllers/Clean Runner_2025-07-23T14-58-05.txt +13 -0
- package/ios/Pods/ViewControllers/EmailVerificationVC.swift +0 -7
- package/ios/Pods/ViewControllers/GrailPayVC.swift +11 -3
- package/ios/Pods/ViewControllers/OTPVerificationVC.swift +252 -105
- package/ios/Pods/ViewControllers/PaymentDoneVC.swift +20 -5
- package/ios/Pods/ViewControllers/PaymentErrorVC.swift +2 -2
- package/ios/Pods/ViewControllers/PaymentInformation/PaymentInfoVC.swift +804 -347
- package/ios/Pods/ViewControllers/PaymentInformation/SavedAccountsTVC/SavedAccountTVC.swift +0 -1
- package/ios/Pods/ViewControllers/PaymentStatusWebViewVC.swift +1 -1
- package/ios/Pods/ViewControllers/ThreeDSecurePaymentDoneVC.swift +68 -66
- package/ios/Resources/Assets.xcassets/payment_done_icon.imageset/Contents.json +3 -0
- package/ios/easymerchantsdk.podspec +1 -1
- package/package.json +1 -1
- package/ios/CustomComponents/CheckboxButton.swift +0 -66
- package/ios/Models/AdditionalInfo.swift +0 -53
- package/ios/Models/BillingInfo.swift +0 -60
- package/ios/Pods/ViewControllers/CustomOverlay.swift +0 -199
- package/ios/Resources/Assets.xcassets/Card/Amex.imageset/206682_american_express_method_card_payment_icon.svg +0 -1
- package/ios/Resources/Assets.xcassets/Card/Amex.imageset/Contents.json +0 -12
- package/ios/Resources/Assets.xcassets/Card/Contents.json +0 -6
- package/ios/Resources/Assets.xcassets/Card/DinersClub.imageset/472318_card_club_diners_dinner_payment_icon.svg +0 -1
- package/ios/Resources/Assets.xcassets/Card/DinersClub.imageset/Contents.json +0 -12
- package/ios/Resources/Assets.xcassets/Card/Discover.imageset/206686_network_payment_discover_card_method_icon.svg +0 -1
- package/ios/Resources/Assets.xcassets/Card/Discover.imageset/Contents.json +0 -12
- package/ios/Resources/Assets.xcassets/Card/JCB.imageset/358102_card_jcb_payment_icon.svg +0 -1
- package/ios/Resources/Assets.xcassets/Card/JCB.imageset/Contents.json +0 -12
- package/ios/Resources/Assets.xcassets/Card/MasterCard.imageset/206680_master_method_card_payment_icon.svg +0 -1
- package/ios/Resources/Assets.xcassets/Card/MasterCard.imageset/Contents.json +0 -12
- package/ios/Resources/Assets.xcassets/Card/UnionPay.imageset/1468976_card_payment_unionpay_icon.svg +0 -1
- package/ios/Resources/Assets.xcassets/Card/UnionPay.imageset/Contents.json +0 -12
- package/ios/Resources/Assets.xcassets/Card/Visa.imageset/206684_visa_method_card_payment_icon.svg +0 -1
- package/ios/Resources/Assets.xcassets/Card/Visa.imageset/Contents.json +0 -12
- package/ios/Resources/Assets.xcassets/Card/maestro.imageset/Contents.json +0 -12
- package/ios/Resources/Assets.xcassets/Card/maestro.imageset/maestro.svg +0 -1
- package/ios/Resources/Assets.xcassets/Card/paypal.imageset/206675_paypal_method_payment_icon.svg +0 -1
- package/ios/Resources/Assets.xcassets/Card/paypal.imageset/Contents.json +0 -12
- package/ios/Resources/Assets.xcassets/Card/rupay.imageset/Contents.json +0 -12
- package/ios/Resources/Assets.xcassets/Card/rupay.imageset/rupay.svg +0 -1
- package/ios/Resources/Assets.xcassets/Card/unknown_card.imageset/4635000_card_credit_digital_money_icon.svg +0 -1
- package/ios/Resources/Assets.xcassets/Card/unknown_card.imageset/Contents.json +0 -12
- package/ios/Resources/Assets.xcassets/Card/worldpay.imageset/Contents.json +0 -12
- package/ios/Resources/Assets.xcassets/Card/worldpay.imageset/worldpay.svg +0 -1
|
@@ -38,7 +38,6 @@ class SavedAccountTVC: UITableViewCell {
|
|
|
38
38
|
if let primaryFontColor = UserStoreSingleton.shared.primary_font_col,
|
|
39
39
|
let uiColor = UIColor(hex: primaryFontColor) {
|
|
40
40
|
lblAccountNumber.textColor = uiColor
|
|
41
|
-
btnThreeDotBank.tintColor = uiColor
|
|
42
41
|
imgViewBank.tintColor = uiColor
|
|
43
42
|
}
|
|
44
43
|
|
|
@@ -69,7 +69,7 @@ class PaymentStatusWebViewVC: UIViewController, WKNavigationDelegate {
|
|
|
69
69
|
closeButton.setImage(closeImage, for: .normal)
|
|
70
70
|
closeButton.tintColor = .systemGray
|
|
71
71
|
} else {
|
|
72
|
-
closeButton.setTitle("
|
|
72
|
+
closeButton.setTitle("X", for: .normal)
|
|
73
73
|
closeButton.setTitleColor(.systemGray, for: .normal)
|
|
74
74
|
closeButton.titleLabel?.font = UIFont.systemFont(ofSize: 24, weight: .bold)
|
|
75
75
|
}
|
|
@@ -51,7 +51,7 @@ class ThreeDSecurePaymentDoneVC: BaseVC {
|
|
|
51
51
|
var apiStatusCheckTimer: Timer?
|
|
52
52
|
// New property for the 1-minute countdown
|
|
53
53
|
var oneMinuteCountdownTimer: DispatchSourceTimer?
|
|
54
|
-
var countdownRemaining: Int =
|
|
54
|
+
var countdownRemaining: Int = 180 // 120 seconds
|
|
55
55
|
|
|
56
56
|
var additionalInfoData: [FieldItem]?
|
|
57
57
|
var billingInfoData: [FieldItem]?
|
|
@@ -154,19 +154,19 @@ class ThreeDSecurePaymentDoneVC: BaseVC {
|
|
|
154
154
|
// override func viewWillAppear(_ animated: Bool) {
|
|
155
155
|
// super.viewWillAppear(animated)
|
|
156
156
|
// uiFinishingTouchElements()
|
|
157
|
-
//
|
|
157
|
+
//
|
|
158
158
|
// // Restart rotating animation if missing
|
|
159
159
|
// if !imgViewLoading.isHidden && imgViewLoading.layer.animation(forKey: "rotationAnimation") == nil {
|
|
160
160
|
// startRotatingImage()
|
|
161
161
|
// }
|
|
162
|
-
//
|
|
162
|
+
//
|
|
163
163
|
// // Check if chargeId already exists (success)
|
|
164
164
|
// if let chargeId = (threeDSecureStatusResponse?["data"] as? [String: Any])?["charge_id"] as? String,
|
|
165
165
|
// !chargeId.isEmpty {
|
|
166
166
|
// // ✅ Charge already found - no further API checks needed
|
|
167
167
|
// return
|
|
168
168
|
// }
|
|
169
|
-
//
|
|
169
|
+
//
|
|
170
170
|
// // If user came back after tapping Continue
|
|
171
171
|
// if didTapContinue {
|
|
172
172
|
// lblCompleteAuthentication.text = "Waiting for 3DS Authentication..."
|
|
@@ -179,10 +179,10 @@ class ThreeDSecurePaymentDoneVC: BaseVC {
|
|
|
179
179
|
// lblCompleteAuthentication.text = "Tap Continue to proceed with 3D Secure authentication."
|
|
180
180
|
// btnContinue.isHidden = false
|
|
181
181
|
// }
|
|
182
|
-
//
|
|
182
|
+
//
|
|
183
183
|
// btnDone.isHidden = true
|
|
184
184
|
// viewPaymentDetails.isHidden = true
|
|
185
|
-
//
|
|
185
|
+
//
|
|
186
186
|
// if countdownRemaining > 0 {
|
|
187
187
|
// if apiStatusCheckTimer == nil {
|
|
188
188
|
// apiStatusCheckTimer = Timer.scheduledTimer(withTimeInterval: 5.0, repeats: true) { [weak self] _ in
|
|
@@ -196,13 +196,13 @@ class ThreeDSecurePaymentDoneVC: BaseVC {
|
|
|
196
196
|
// // Countdown expired, stop API check
|
|
197
197
|
// apiStatusCheckTimer?.invalidate()
|
|
198
198
|
// apiStatusCheckTimer = nil
|
|
199
|
-
//
|
|
199
|
+
//
|
|
200
200
|
// imgViewLoading.layer.removeAllAnimations()
|
|
201
201
|
// imgViewLoading.isHidden = true
|
|
202
202
|
// imgViewPaymentDone.isHidden = false
|
|
203
203
|
// imgViewPaymentDone.image = UIImage(systemName: "exclamationmark.circle.fill")
|
|
204
204
|
// imgViewPaymentDone.tintColor = .systemRed
|
|
205
|
-
//
|
|
205
|
+
//
|
|
206
206
|
// lblCompleteAuthentication.text = "Tap Continue to proceed with 3D Secure authentication."
|
|
207
207
|
// btnDone.isHidden = false
|
|
208
208
|
// viewPaymentDetails.isHidden = false
|
|
@@ -300,7 +300,7 @@ class ThreeDSecurePaymentDoneVC: BaseVC {
|
|
|
300
300
|
self?.initialAPIGroup.leave()
|
|
301
301
|
}
|
|
302
302
|
|
|
303
|
-
countdownRemaining =
|
|
303
|
+
countdownRemaining = 180
|
|
304
304
|
|
|
305
305
|
oneMinuteCountdownTimer = DispatchSource.makeTimerSource(queue: .main)
|
|
306
306
|
oneMinuteCountdownTimer?.schedule(deadline: .now(), repeating: .seconds(1))
|
|
@@ -369,51 +369,67 @@ class ThreeDSecurePaymentDoneVC: BaseVC {
|
|
|
369
369
|
}
|
|
370
370
|
|
|
371
371
|
@IBAction func actionBtnDone(_ sender: UIButton) {
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
chargeData: chargeData,
|
|
401
|
-
billingInfo: resultBillingInfo,
|
|
402
|
-
additionalInfo: resultAdditionalInfo
|
|
403
|
-
)
|
|
404
|
-
|
|
405
|
-
// Notify delegate and dismiss
|
|
406
|
-
easyPayDelegate?.easyPayController(self.navigationController as! EasyPayViewController, didFinishWith: result)
|
|
407
|
-
|
|
408
|
-
if let easyPayVC = self.navigationController as? EasyPayViewController {
|
|
409
|
-
easyPayVC.dismiss(animated: true, completion: {
|
|
410
|
-
if let delegate = easyPayVC.easyPayDelegate {
|
|
411
|
-
UserStoreSingleton.shared.isLoggedIn = false
|
|
412
|
-
delegate.easyPayController(easyPayVC, didFinishWith: result)
|
|
372
|
+
var resultBillingInfo: [String: Any]? = nil
|
|
373
|
+
// var resultAdditionalInfo: [String: Any]? = nil
|
|
374
|
+
|
|
375
|
+
// Extract last 4 digits and format as ****4242
|
|
376
|
+
if let cardNumber = cardApiParams?["card_number"] as? String, cardNumber.count >= 4 {
|
|
377
|
+
let last4 = String(cardNumber.suffix(4))
|
|
378
|
+
let masked = "****\(last4)"
|
|
379
|
+
chargeData["card_number_last_4"] = masked
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
// Assign billing info if non-empty
|
|
383
|
+
if let billing = billingInfo, !billing.isEmpty {
|
|
384
|
+
resultBillingInfo = billing
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
// Create response dictionary
|
|
388
|
+
var response: [String: Any] = [:]
|
|
389
|
+
|
|
390
|
+
// Add 3DS status response data if available, otherwise use charge data
|
|
391
|
+
if let threeDS = threeDSecureStatusResponse {
|
|
392
|
+
// Add all 3DS response data directly, preserving the "data" key structure
|
|
393
|
+
for (key, value) in threeDS {
|
|
394
|
+
response[key] = value
|
|
395
|
+
}
|
|
396
|
+
} else {
|
|
397
|
+
// Fallback to older charge data if 3DS status response is not available
|
|
398
|
+
for (key, value) in chargeData {
|
|
399
|
+
response[key] = value
|
|
413
400
|
}
|
|
414
|
-
}
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
// Add billing info if available
|
|
404
|
+
if let billing = resultBillingInfo {
|
|
405
|
+
response["billingInfo"] = billing
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
// Add additional info if available
|
|
409
|
+
if let additional = additionalInfo {
|
|
410
|
+
response["additionalInfo"] = additional
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
// Add card number last 4 if available (from chargeData) - only if not already in response
|
|
414
|
+
if let last4 = chargeData["card_number_last_4"] as? String, response["card_number_last_4"] == nil {
|
|
415
|
+
response["card_number_last_4"] = last4
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
// Create SDK result with combined data
|
|
419
|
+
let result = SDKResult(type: .success, data: response as NSDictionary)
|
|
420
|
+
|
|
421
|
+
// Notify delegate and dismiss
|
|
422
|
+
easyPayDelegate?.easyPayController(self.navigationController as! EasyPayViewController, didFinishWith: result)
|
|
423
|
+
|
|
424
|
+
if let easyPayVC = self.navigationController as? EasyPayViewController {
|
|
425
|
+
easyPayVC.dismiss(animated: true, completion: {
|
|
426
|
+
if let delegate = easyPayVC.easyPayDelegate {
|
|
427
|
+
UserStoreSingleton.shared.isLoggedIn = false
|
|
428
|
+
delegate.easyPayController(easyPayVC, didFinishWith: result)
|
|
429
|
+
}
|
|
430
|
+
})
|
|
431
|
+
}
|
|
415
432
|
}
|
|
416
|
-
}
|
|
417
433
|
|
|
418
434
|
func uiFinishingTouchElements() {
|
|
419
435
|
// Set background color for the main view
|
|
@@ -519,23 +535,9 @@ class ThreeDSecurePaymentDoneVC: BaseVC {
|
|
|
519
535
|
uRLRequest.httpMethod = "GET"
|
|
520
536
|
uRLRequest.addValue("application/json", forHTTPHeaderField: "Content-Type")
|
|
521
537
|
|
|
522
|
-
// if let token = UserStoreSingleton.shared.customerToken {
|
|
523
|
-
// uRLRequest.addValue(token, forHTTPHeaderField: "Customer-Token")
|
|
524
|
-
// }
|
|
525
|
-
// if let token = UserStoreSingleton.shared.clientToken {
|
|
526
|
-
// uRLRequest.addValue(token, forHTTPHeaderField: "Customer-Token")
|
|
527
|
-
// }
|
|
528
|
-
|
|
529
538
|
let token = UserStoreSingleton.shared.clientToken ?? ""
|
|
530
539
|
uRLRequest.addValue(token, forHTTPHeaderField: "clientToken")
|
|
531
540
|
|
|
532
|
-
// // Add API key/secret headers
|
|
533
|
-
// if let apiKey = EnvironmentConfig.apiKey,
|
|
534
|
-
// let apiSecret = EnvironmentConfig.apiSecret {
|
|
535
|
-
// uRLRequest.addValue(apiKey, forHTTPHeaderField: "x-api-key")
|
|
536
|
-
// uRLRequest.addValue(apiSecret, forHTTPHeaderField: "x-api-secret")
|
|
537
|
-
// }
|
|
538
|
-
|
|
539
541
|
let task = URLSession.shared.dataTask(with: uRLRequest) { [weak self] data, response, error in
|
|
540
542
|
defer { completion?() }
|
|
541
543
|
|
package/package.json
CHANGED
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// CheckboxButton.swift
|
|
3
|
-
// EasyPay
|
|
4
|
-
//
|
|
5
|
-
// Created by iftekhar on 14/07/24.
|
|
6
|
-
//
|
|
7
|
-
|
|
8
|
-
//import Foundation
|
|
9
|
-
//
|
|
10
|
-
//final class CheckboxButton: UIButton {
|
|
11
|
-
//
|
|
12
|
-
// override func awakeFromNib() {
|
|
13
|
-
// super.awakeFromNib()
|
|
14
|
-
// self.addTarget(self, action: #selector(tapAction(_:)), for: .touchUpInside)
|
|
15
|
-
// }
|
|
16
|
-
//
|
|
17
|
-
// @objc private func tapAction(_ sender: UIButton) {
|
|
18
|
-
// self.isSelected.toggle()
|
|
19
|
-
// }
|
|
20
|
-
//}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
import UIKit
|
|
24
|
-
|
|
25
|
-
final class CheckboxButton: UIButton {
|
|
26
|
-
|
|
27
|
-
override func awakeFromNib() {
|
|
28
|
-
super.awakeFromNib()
|
|
29
|
-
self.addTarget(self, action: #selector(tapAction(_:)), for: .touchUpInside)
|
|
30
|
-
applyPrimaryColor() // Apply primary color when the button initializes
|
|
31
|
-
applySecondaryFontColor()
|
|
32
|
-
applyFontSize()
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
@objc private func tapAction(_ sender: UIButton) {
|
|
36
|
-
self.isSelected.toggle()
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
private func applyPrimaryColor() {
|
|
40
|
-
if let primaryBtnBackgroundColor = UserStoreSingleton.shared.primary_btn_bg_col,
|
|
41
|
-
let primaryUIColor = UIColor(hex: primaryBtnBackgroundColor) {
|
|
42
|
-
|
|
43
|
-
// Apply tintColor to the image
|
|
44
|
-
self.imageView?.tintColor = primaryUIColor
|
|
45
|
-
self.setImage(self.image(for: .normal)?.withRenderingMode(.alwaysTemplate), for: .normal)
|
|
46
|
-
self.setImage(self.image(for: .selected)?.withRenderingMode(.alwaysTemplate), for: .selected)
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
private func applySecondaryFontColor() {
|
|
51
|
-
if let secondaryFontColor = UserStoreSingleton.shared.secondary_font_col,
|
|
52
|
-
let fontUIColor = UIColor(hex: secondaryFontColor) {
|
|
53
|
-
self.setTitleColor(fontUIColor, for: .normal)
|
|
54
|
-
self.setTitleColor(fontUIColor, for: .selected)
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
private func applyFontSize() {
|
|
59
|
-
if let fontSizeString = UserStoreSingleton.shared.fontSize,
|
|
60
|
-
let fontSizeDouble = Double(fontSizeString) {
|
|
61
|
-
let fontSize = CGFloat(fontSizeDouble)
|
|
62
|
-
self.titleLabel?.font = UIFont.systemFont(ofSize: fontSize) // Apply font size to the button title
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
}
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// AdditionalInfo.swift
|
|
3
|
-
// EasyPay
|
|
4
|
-
//
|
|
5
|
-
// Created by iftekhar on 14/07/24.
|
|
6
|
-
//
|
|
7
|
-
|
|
8
|
-
import Foundation
|
|
9
|
-
|
|
10
|
-
//struct AdditionalInfo {
|
|
11
|
-
// let name: String
|
|
12
|
-
// let email: String
|
|
13
|
-
// let phone: String
|
|
14
|
-
// let description: String
|
|
15
|
-
//}
|
|
16
|
-
|
|
17
|
-
//public struct AdditionalInfo: Codable {
|
|
18
|
-
// public let name: String
|
|
19
|
-
// public let email: String
|
|
20
|
-
// public let phone_number: String
|
|
21
|
-
// public let country_code: String
|
|
22
|
-
// public let description: String
|
|
23
|
-
//
|
|
24
|
-
// public init(name: String, email: String, phone_number: String, country_code: String, description: String) {
|
|
25
|
-
// self.name = name
|
|
26
|
-
// self.email = email
|
|
27
|
-
// self.phone_number = phone_number
|
|
28
|
-
// self.country_code = country_code
|
|
29
|
-
// self.description = description
|
|
30
|
-
// }
|
|
31
|
-
//}
|
|
32
|
-
|
|
33
|
-
public struct AdditionalInfo: Codable {
|
|
34
|
-
public let name: String?
|
|
35
|
-
public let email: String?
|
|
36
|
-
public let phone_number: String?
|
|
37
|
-
public let country_code: String?
|
|
38
|
-
public let description: String?
|
|
39
|
-
|
|
40
|
-
public init(
|
|
41
|
-
name: String? = nil,
|
|
42
|
-
email: String? = nil,
|
|
43
|
-
phone_number: String? = nil,
|
|
44
|
-
country_code: String? = nil,
|
|
45
|
-
description: String? = nil
|
|
46
|
-
) {
|
|
47
|
-
self.name = name
|
|
48
|
-
self.email = email
|
|
49
|
-
self.phone_number = phone_number
|
|
50
|
-
self.country_code = country_code
|
|
51
|
-
self.description = description
|
|
52
|
-
}
|
|
53
|
-
}
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// BillingInfo.swift
|
|
3
|
-
// EasyPay
|
|
4
|
-
//
|
|
5
|
-
// Created by iftekhar on 14/07/24.
|
|
6
|
-
//
|
|
7
|
-
|
|
8
|
-
import Foundation
|
|
9
|
-
|
|
10
|
-
//struct BillingInfo {
|
|
11
|
-
// let address: String
|
|
12
|
-
// let country: String
|
|
13
|
-
// let state: String
|
|
14
|
-
// let city: String
|
|
15
|
-
// let postalCode: String
|
|
16
|
-
//}
|
|
17
|
-
|
|
18
|
-
//public struct BillingInfo: Codable {
|
|
19
|
-
// public let address: String
|
|
20
|
-
// public let country: String
|
|
21
|
-
// public let state: String
|
|
22
|
-
// public let city: String
|
|
23
|
-
// public let postal_code: String
|
|
24
|
-
// public let additional_info: AdditionalInfo
|
|
25
|
-
//
|
|
26
|
-
// public init(address: String, country: String, state: String, city: String, postal_code: String, additional_info: AdditionalInfo) {
|
|
27
|
-
// self.address = address
|
|
28
|
-
// self.country = country
|
|
29
|
-
// self.state = state
|
|
30
|
-
// self.city = city
|
|
31
|
-
// self.postal_code = postal_code
|
|
32
|
-
// self.additional_info = additional_info
|
|
33
|
-
// }
|
|
34
|
-
//}
|
|
35
|
-
|
|
36
|
-
public struct BillingInfo: Codable {
|
|
37
|
-
public let address: String?
|
|
38
|
-
public let country: String?
|
|
39
|
-
public let state: String?
|
|
40
|
-
public let city: String?
|
|
41
|
-
public let postal_code: String?
|
|
42
|
-
public let additional_info: AdditionalInfo?
|
|
43
|
-
|
|
44
|
-
public init(
|
|
45
|
-
address: String? = nil,
|
|
46
|
-
country: String? = nil,
|
|
47
|
-
state: String? = nil,
|
|
48
|
-
city: String? = nil,
|
|
49
|
-
postal_code: String? = nil,
|
|
50
|
-
additional_info: AdditionalInfo? = nil
|
|
51
|
-
) {
|
|
52
|
-
self.address = address
|
|
53
|
-
self.country = country
|
|
54
|
-
self.state = state
|
|
55
|
-
self.city = city
|
|
56
|
-
self.postal_code = postal_code
|
|
57
|
-
self.additional_info = additional_info
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
@@ -1,199 +0,0 @@
|
|
|
1
|
-
////
|
|
2
|
-
//// CustomOverlay.swift
|
|
3
|
-
//// EasyPay
|
|
4
|
-
////
|
|
5
|
-
//// Created by Mony's Mac on 21/03/25.
|
|
6
|
-
////
|
|
7
|
-
//
|
|
8
|
-
////import BlinkCard
|
|
9
|
-
//
|
|
10
|
-
//protocol CustomOverlayDelegate: AnyObject {
|
|
11
|
-
// func didFinishScanningCard(cardNumber: String, expiryDate: String, cvv: String, nameOnCard: String)
|
|
12
|
-
//}
|
|
13
|
-
//
|
|
14
|
-
//class CustomOverlay: MBCCustomOverlayViewController, MBCScanningRecognizerRunnerViewControllerDelegate,
|
|
15
|
-
// MBCFirstSideFinishedRecognizerRunnerViewControllerDelegate {
|
|
16
|
-
//
|
|
17
|
-
// @IBOutlet weak var tooltipLabel: UILabel!
|
|
18
|
-
// @IBOutlet weak var centerView: UIView!
|
|
19
|
-
// @IBOutlet weak var lblScanCardCount: UILabel!
|
|
20
|
-
// @IBOutlet weak var btnRotate: UIButton!
|
|
21
|
-
// @IBOutlet weak var imgProcessing: UIImageView!
|
|
22
|
-
//
|
|
23
|
-
// var currentScanStep = 1 // Start with 1 for the first scan step
|
|
24
|
-
//
|
|
25
|
-
// var blinkCardEditScreen: MBCBlinkCardEditViewController?
|
|
26
|
-
// var blinkcardNavigationViewController: MBCBlinkCardEditNavigationController?
|
|
27
|
-
// var blinkCardRecognizerResult: MBCBlinkCardRecognizerResult?
|
|
28
|
-
//
|
|
29
|
-
// static func initFromStoryboard() -> CustomOverlay {
|
|
30
|
-
// let viewController = UIStoryboard(name: "easymerchantsdk", bundle: .easyPayBundle).instantiateViewController(withIdentifier: "CustomOverlay")
|
|
31
|
-
//
|
|
32
|
-
// guard let customOverlay = viewController as? CustomOverlay else {
|
|
33
|
-
// fatalError("CustomOverlay should always be an instance of \(CustomOverlay.self) here because we instantiate it from the Storyboard")
|
|
34
|
-
// }
|
|
35
|
-
//
|
|
36
|
-
// return customOverlay
|
|
37
|
-
// }
|
|
38
|
-
//
|
|
39
|
-
// weak var delegate: CustomOverlayDelegate?
|
|
40
|
-
//
|
|
41
|
-
// override func viewDidLoad() {
|
|
42
|
-
// super.viewDidLoad()
|
|
43
|
-
//
|
|
44
|
-
// super.scanningRecognizerRunnerViewControllerDelegate = self
|
|
45
|
-
// super.metadataDelegates.firstSideFinishedRecognizerRunnerViewControllerDelegate = self
|
|
46
|
-
//
|
|
47
|
-
// lblScanCardCount.text = "Scan Card (1/2)"
|
|
48
|
-
//
|
|
49
|
-
// centerView.layer.borderColor = UIColor.white.cgColor
|
|
50
|
-
// centerView.layer.borderWidth = 2.0
|
|
51
|
-
// centerView.layer.cornerRadius = 8.0
|
|
52
|
-
//
|
|
53
|
-
// imgProcessing.image = UIImage(systemName: "exclamationmark.circle")
|
|
54
|
-
// tooltipLabel.text = "Place the front side of your card inside the frame"
|
|
55
|
-
// }
|
|
56
|
-
//
|
|
57
|
-
// func updateScanProgress() {
|
|
58
|
-
// if currentScanStep < 2 {
|
|
59
|
-
// currentScanStep += 1
|
|
60
|
-
// lblScanCardCount.text = "Scan Card (\(currentScanStep)/2)"
|
|
61
|
-
// }
|
|
62
|
-
// }
|
|
63
|
-
//
|
|
64
|
-
// func showBorderColorForOneSeconds() {
|
|
65
|
-
// centerView.layer.borderColor = UIColor.green.cgColor
|
|
66
|
-
// centerView.layer.borderWidth = 2.0
|
|
67
|
-
// centerView.layer.cornerRadius = 8.0
|
|
68
|
-
//
|
|
69
|
-
// DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
|
|
70
|
-
// self.centerView.layer.borderColor = UIColor.white.cgColor
|
|
71
|
-
// self.centerView.layer.borderWidth = 2.0
|
|
72
|
-
// }
|
|
73
|
-
// }
|
|
74
|
-
//
|
|
75
|
-
// func recognizerRunnerViewControllerDidFinishScanning(_ recognizerRunnerViewController: UIViewController & MBCRecognizerRunnerViewController, state: MBCRecognizerResultState) {
|
|
76
|
-
// if state == .valid {
|
|
77
|
-
// recognizerRunnerViewController.pauseScanning()
|
|
78
|
-
//
|
|
79
|
-
// DispatchQueue.main.async {
|
|
80
|
-
// self.showBorderColorForOneSeconds()
|
|
81
|
-
//
|
|
82
|
-
// // Show loader while processing final results
|
|
83
|
-
// self.imgProcessing.image = UIImage(named: "loaderImage")
|
|
84
|
-
// self.tooltipLabel.text = "Keep it in frame while we’re processing..."
|
|
85
|
-
// self.startRotationAnimation(on: self.imgProcessing)
|
|
86
|
-
//
|
|
87
|
-
// for recognizer in self.recognizerCollection.recognizerList where recognizer.baseResult?.resultState == .valid {
|
|
88
|
-
// if recognizer is MBCBlinkCardRecognizer {
|
|
89
|
-
// let blinkCardRecognizer = recognizer as? MBCBlinkCardRecognizer
|
|
90
|
-
// self.blinkCardRecognizerResult = blinkCardRecognizer?.result
|
|
91
|
-
// }
|
|
92
|
-
// }
|
|
93
|
-
//
|
|
94
|
-
// self.imgProcessing.image = UIImage(named: "check")
|
|
95
|
-
// self.tooltipLabel.text = "Done"
|
|
96
|
-
// self.stopRotationAnimation(on: self.imgProcessing)
|
|
97
|
-
//
|
|
98
|
-
// guard let blinkCardResult = self.blinkCardRecognizerResult else { return }
|
|
99
|
-
//
|
|
100
|
-
// // Extract card details
|
|
101
|
-
// let cardNumber = blinkCardResult.cardNumber
|
|
102
|
-
// let expiryDate = "\(blinkCardResult.expiryDate.month)/\(blinkCardResult.expiryDate.year)"
|
|
103
|
-
// let cvv = blinkCardResult.cvv
|
|
104
|
-
// let nameOnCard = blinkCardResult.owner
|
|
105
|
-
//
|
|
106
|
-
// // Pass data to delegate
|
|
107
|
-
// self.delegate?.didFinishScanningCard(cardNumber: cardNumber, expiryDate: expiryDate, cvv: cvv, nameOnCard: nameOnCard)
|
|
108
|
-
//
|
|
109
|
-
// // Dismiss the scanner
|
|
110
|
-
// recognizerRunnerViewController.dismiss(animated: true, completion: nil)
|
|
111
|
-
// }
|
|
112
|
-
// }
|
|
113
|
-
// }
|
|
114
|
-
//
|
|
115
|
-
// func recognizerRunnerViewControllerDidFinishRecognition(ofFirstSide recognizerRunnerViewController: UIViewController & MBCRecognizerRunnerViewController) {
|
|
116
|
-
// DispatchQueue.main.async {
|
|
117
|
-
// // Show loader image during scanning
|
|
118
|
-
// self.imgProcessing.image = UIImage(named: "loaderImage", in: .easyPayBundle, with: nil)
|
|
119
|
-
// self.tooltipLabel.text = "Keep it in frame while we’re processing..."
|
|
120
|
-
// self.startRotationAnimation(on: self.imgProcessing)
|
|
121
|
-
//
|
|
122
|
-
// self.updateScanProgress()
|
|
123
|
-
// self.showBorderColorForOneSeconds()
|
|
124
|
-
//
|
|
125
|
-
// // Update tooltip and show check image after completing the first side
|
|
126
|
-
// DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
|
|
127
|
-
// self.imgProcessing.image = UIImage(named: "check", in: .easyPayBundle, with: nil)
|
|
128
|
-
// self.tooltipLabel.text = "Done"
|
|
129
|
-
// self.stopRotationAnimation(on: self.imgProcessing)
|
|
130
|
-
//
|
|
131
|
-
// DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
|
|
132
|
-
// self.imgProcessing.image = UIImage(systemName: "exclamationmark.circle")
|
|
133
|
-
// self.tooltipLabel.text = "Place the back side of your card inside the frame"
|
|
134
|
-
// self.stopRotationAnimation(on: self.imgProcessing)
|
|
135
|
-
// }
|
|
136
|
-
// }
|
|
137
|
-
// }
|
|
138
|
-
// }
|
|
139
|
-
//
|
|
140
|
-
// func startRotationAnimation(on imageView: UIImageView) {
|
|
141
|
-
// let rotationAnimation = CABasicAnimation(keyPath: "transform.rotation")
|
|
142
|
-
// rotationAnimation.fromValue = 0
|
|
143
|
-
// rotationAnimation.toValue = CGFloat.pi * 2
|
|
144
|
-
// rotationAnimation.duration = 1.0 // Duration of one full rotation
|
|
145
|
-
// rotationAnimation.repeatCount = Float.infinity // Repeat indefinitely
|
|
146
|
-
// imageView.layer.add(rotationAnimation, forKey: "rotationAnimation")
|
|
147
|
-
// }
|
|
148
|
-
//
|
|
149
|
-
// func stopRotationAnimation(on imageView: UIImageView) {
|
|
150
|
-
// imageView.layer.removeAnimation(forKey: "rotationAnimation")
|
|
151
|
-
// }
|
|
152
|
-
//
|
|
153
|
-
// @IBAction func didTapClose(_ sender: Any) {
|
|
154
|
-
// self.recognizerRunnerViewController?.overlayViewControllerWillCloseCamera(self)
|
|
155
|
-
// self.dismiss(animated: true, completion: nil)
|
|
156
|
-
// }
|
|
157
|
-
//
|
|
158
|
-
// func showEditScreen(blinkCardRecognizerResult: MBCBlinkCardRecognizerResult) {
|
|
159
|
-
// blinkCardEditScreen = MBCBlinkCardEditViewController(blinkCardRecognizerResult: blinkCardRecognizerResult, fieldConfiguration: MBCBlinkCardEditFieldConfiguration(), delegate: self)
|
|
160
|
-
// blinkcardNavigationViewController = MBCBlinkCardEditNavigationController(rootViewController: blinkCardEditScreen!)
|
|
161
|
-
// self.present(blinkcardNavigationViewController!, animated: true, completion: nil)
|
|
162
|
-
// }
|
|
163
|
-
//
|
|
164
|
-
// @IBAction func actionBtnRotate(_ sender: UIButton) {
|
|
165
|
-
// UIView.animate(withDuration: 0.5, animations: {
|
|
166
|
-
// // Rotate the centerView by 180 degrees
|
|
167
|
-
// self.centerView.transform = self.centerView.transform.rotated(by: .pi/2)
|
|
168
|
-
// })
|
|
169
|
-
// }
|
|
170
|
-
//
|
|
171
|
-
//}
|
|
172
|
-
//
|
|
173
|
-
//extension CustomOverlay: MBCBlinkCardEditViewControllerDelegate {
|
|
174
|
-
// func blinkCardEditViewControllerDidFinishEditing(_ blinkCardEditViewController: MBCBlinkCardEditViewController, editResult: MBCBlinkCardEditResult) {
|
|
175
|
-
// self.recognizerRunnerViewController?.pauseScanning()
|
|
176
|
-
//
|
|
177
|
-
// DispatchQueue.main.async {
|
|
178
|
-
// let alertController: UIAlertController = UIAlertController.init(title: "BlinkCard Edit Results", message: editResult.description, preferredStyle: .alert)
|
|
179
|
-
//
|
|
180
|
-
// let okAction: UIAlertAction = UIAlertAction.init(title: "OK", style: .default, handler: { (action) -> Void in
|
|
181
|
-
// self.blinkCardEditScreen?.dismiss(animated: true, completion: nil)
|
|
182
|
-
// self.dismiss(animated: true, completion: nil)
|
|
183
|
-
// })
|
|
184
|
-
// alertController.addAction(okAction)
|
|
185
|
-
// blinkCardEditViewController.present(alertController, animated: true, completion: nil)
|
|
186
|
-
// }
|
|
187
|
-
// }
|
|
188
|
-
//
|
|
189
|
-
// func blinkCardEditViewControllerDidTapClose(_ blinkCardEditViewController: MBCBlinkCardEditViewController) {
|
|
190
|
-
// DispatchQueue.main.async {
|
|
191
|
-
// blinkCardEditViewController.dismiss(animated: true, completion: nil)
|
|
192
|
-
// }
|
|
193
|
-
// }
|
|
194
|
-
//}
|
|
195
|
-
//
|
|
196
|
-
//
|
|
197
|
-
//
|
|
198
|
-
//
|
|
199
|
-
//
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
<?xml version="1.0" ?><svg height="100px" version="1.1" viewBox="0 0 160 100" width="160px" xmlns="http://www.w3.org/2000/svg" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns" xmlns:xlink="http://www.w3.org/1999/xlink"><title/><defs/><g fill="none" fill-rule="evenodd" id="Page-1" stroke="none" stroke-width="1"><g id="american-express" transform="translate(-1.000000, 0.000000)"><path d="M149,1.01146687e-06 C141,1.76644588e-06 56.3007812,-1.60318373e-06 9,1.01146687e-06 C5,1.23257532e-06 1,4.00000101 1,8.00000101 L1,88.000001 C0.999999537,96.000001 5,100.000001 13,100.000001 C57.6232096,100.000001 141,100.000002 149,100.000001 C157,100.000001 161,96.000001 161,88.000001 L161,12.000001 C161,4.00000101 157,1.01146687e-06 149,1.01146687e-06 Z M149,1.01146687e-06" fill="#306FC5" id="Rectangle-1"/><path d="M14.5198284,36.625336 L11.4210462,29.0743396 L8.33997461,36.625336 L14.5198284,36.625336 Z M82.7855885,33.6185346 C82.1634325,33.9961701 81.427586,34.0087389 80.5460556,34.0087389 L75.04606,34.0087389 L75.04606,29.8016165 L80.6208972,29.8016165 C81.4098754,29.8016165 82.2331323,29.8370377 82.7678779,30.1432595 C83.3551839,30.419202 83.7185367,31.006508 83.7185367,31.8177674 C83.7185367,32.6455947 83.3728945,33.3117414 82.7855885,33.6185346 C82.7855885,33.6185346 83.3728945,33.3117414 82.7855885,33.6185346 L82.7855885,33.6185346 L82.7855885,33.6185346 Z M122.021975,36.625336 L118.888915,29.0743396 L115.772993,36.625336 L122.021975,36.625336 L122.021975,36.625336 L122.021975,36.625336 L122.021975,36.625336 Z M48.8829461,44.7984882 L44.2416286,44.7984882 L44.2244893,29.9638684 L37.659573,44.7984882 L33.6844022,44.7984882 L27.1023466,29.9507282 L27.1023466,44.7984882 L17.8939817,44.7984882 L16.1543446,40.5736552 L6.72773948,40.5736552 L4.97039177,44.7984882 L0.0531317741,44.7984882 L8.16058346,25.8572964 L14.8871803,25.8572964 L22.5872884,43.7906984 L22.5872884,25.8572964 L29.9766042,25.8572964 L35.9016539,38.7066161 L41.3445186,25.8572964 L48.8823748,25.8572964 L48.8823748,44.7984882 L48.8823748,44.7984882 L48.8829461,44.7984882 L48.8829461,44.7984882 Z M67.3813731,44.7984882 L52.2570994,44.7984882 L52.2570994,25.8572964 L67.3813731,25.8572964 L67.3813731,29.8016165 L56.7847264,29.8016165 L56.7847264,33.2157615 L67.1271405,33.2157615 L67.1271405,37.0983801 L56.7847264,37.0983801 L56.7847264,40.8810197 L67.3813731,40.8810197 L67.3813731,44.7984882 L67.3813731,44.7984882 L67.3813731,44.7984882 L67.3813731,44.7984882 Z M88.7060678,30.958518 C88.7060678,33.9784595 86.6904882,35.5387055 85.5158761,36.0071792 C86.5065266,36.3842434 87.3526358,37.0503901 87.7554089,37.602275 C88.3947041,38.5443642 88.5049669,39.385903 88.5049669,41.0775501 L88.5049669,44.7984882 L83.9384908,44.7984882 L83.9213516,42.4098436 C83.9213516,41.2700814 84.0304716,39.6309947 83.2066435,38.7197562 C82.5450672,38.0536095 81.5367061,37.9090682 79.9067604,37.9090682 L75.0466313,37.9090682 L75.0466313,44.7984882 L70.5195757,44.7984882 L70.5195757,25.8572964 L80.9328321,25.8572964 C83.2466352,25.8572964 84.9514224,25.9184265 86.4151171,26.7645357 C87.8473897,27.6106449 88.7060678,28.8458159 88.7060678,30.958518 C88.7060678,30.958518 88.7060678,28.8458159 88.7060678,30.958518 L88.7060678,30.958518 L88.7060678,30.958518 Z M95.9514136,44.7984882 L91.3318058,44.7984882 L91.3318058,25.8572964 L95.9514136,25.8572964 L95.9514136,44.7984882 L95.9514136,44.7984882 L95.9514136,44.7984882 L95.9514136,44.7984882 Z M149.544806,44.7984882 L143.129001,44.7984882 L134.547363,30.5820251 L134.547363,44.7984882 L125.327,44.7984882 L123.565082,40.5736552 L114.160187,40.5736552 L112.450829,44.7984882 L107.153077,44.7984882 C104.952393,44.7984882 102.166117,44.3117326 100.588161,42.7034967 C98.997064,41.0952607 98.1692367,38.916858 98.1692367,35.4724336 C98.1692367,32.6633053 98.6639906,30.0952695 100.60987,28.0659785 C102.073565,26.5542939 104.365658,25.8572964 107.485579,25.8572964 L111.868665,25.8572964 L111.868665,29.9158784 L107.57756,29.9158784 C105.925333,29.9158784 104.992385,30.1615414 104.093715,31.03793 C103.321876,31.835478 102.792272,33.3431635 102.792272,35.3284636 C102.792272,37.3577546 103.195617,38.820878 104.037155,39.7766786 C104.734153,40.5262365 106.000746,40.7536177 107.192497,40.7536177 L109.225787,40.7536177 L115.606742,25.8578677 L122.39047,25.8578677 L130.055728,43.7735592 L130.055728,25.8578677 L136.949147,25.8578677 L144.907487,39.0494017 L144.907487,25.8578677 L149.544806,25.8578677 L149.544806,44.7984882 L149.544806,44.7984882 L149.544806,44.7984882 L149.544806,44.7984882 Z M0.000571309399,48.518855 L7.73610057,48.518855 L9.48030817,44.3117326 L13.3852079,44.3117326 L15.124845,48.518855 L30.3450987,48.518855 L30.3450987,45.3023831 L31.7036725,48.5325664 L39.6048815,48.5325664 L40.9634552,45.2543931 L40.9634552,48.518855 L78.7887079,48.518855 L78.7709973,41.612867 L79.5028447,41.612867 C80.0153092,41.6305776 80.1649923,41.6779963 80.1649923,42.5241055 L80.1649923,48.518855 L99.72834,48.518855 L99.72834,46.9111904 C101.306297,47.7567283 103.760642,48.518855 106.990254,48.518855 L115.220537,48.518855 L116.981884,44.3117326 L120.886784,44.3117326 L122.609281,48.518855 L138.469402,48.518855 L138.469402,44.5225458 L140.871186,48.518855 L153.580535,48.518855 L153.580535,22.1015084 L141.002588,22.1015084 L141.002588,25.221429 L139.241241,22.1015084 L126.33479,22.1015084 L126.33479,25.221429 L124.717413,22.1015084 L107.283907,22.1015084 C104.365658,22.1015084 101.800479,22.508852 99.72834,23.6440438 L99.72834,22.1015084 L87.6977067,22.1015084 L87.6977067,23.6440438 C86.3791246,22.4740021 84.5823565,22.1015084 82.5844876,22.1015084 L38.6319416,22.1015084 L35.6828424,28.9246566 L32.6543313,22.1015084 L18.810362,22.1015084 L18.810362,25.221429 L17.2895363,22.1015084 L5.4828563,22.1015084 L0,34.6617456 L0,48.518855 L0.000571309399,48.518855 Z M161.039551,62.4668027 L152.788129,62.4668027 C151.964301,62.4668027 151.416987,62.4976534 150.95594,62.809017 C150.478325,63.1158102 150.294364,63.5711438 150.294364,64.1721612 C150.294364,64.8868693 150.697708,65.3730536 151.284443,65.5832955 C151.762057,65.7495465 152.275093,65.7981078 153.029222,65.7981078 L155.482996,65.8638084 C157.959051,65.9249385 159.611849,66.350564 160.619638,67.3886332 C160.803029,67.5331744 160.913291,67.6954263 161.039551,67.8576782 L161.039551,62.4668027 Z M161.039551,74.9573401 C159.93978,76.565576 157.796799,77.3808346 154.89569,77.3808346 L146.15237,77.3808346 L146.15237,73.3182534 L154.860268,73.3182534 C155.724088,73.3182534 156.328533,73.2045628 156.692458,72.8492084 C157.00782,72.5561267 157.227774,72.1305012 157.227774,71.6134662 C157.227774,71.0615813 157.00782,70.623387 156.674747,70.3605847 C156.346244,70.0715021 155.868058,69.9401009 155.079651,69.9401009 C150.828538,69.7955597 145.525073,70.0715021 145.525073,64.0761813 C145.525073,61.3281831 147.269852,58.4356436 152.020861,58.4356436 L161.038979,58.4356436 L161.038979,54.6661442 L152.660156,54.6661442 C150.13154,54.6661442 148.294781,55.2717321 146.993909,56.21325 L146.993909,54.6661442 L134.600494,54.6661442 C132.618622,54.6661442 130.29225,55.1574702 129.191908,56.21325 L129.191908,54.6661442 L107.060525,54.6661442 L107.060525,56.21325 C105.299178,54.9426579 102.327226,54.6661442 100.955513,54.6661442 L86.3574148,54.6661442 L86.3574148,56.21325 C84.9639912,54.8638172 81.865209,54.6661442 79.9764602,54.6661442 L63.6387253,54.6661442 L59.9000766,58.7121573 L56.3985213,54.6661442 L31.9933263,54.6661442 L31.9933263,81.1017727 L55.9391885,81.1017727 L59.7915278,76.9917729 L63.4204851,81.1017727 L78.1808347,81.1149128 L78.1808347,74.89621 L79.6319606,74.89621 C81.5904092,74.9264894 83.9002131,74.8476487 85.9380737,73.9666896 L85.9380737,81.1012014 L98.112677,81.1012014 L98.112677,74.21121 L98.6999831,74.21121 C99.449541,74.21121 99.5232399,74.2420607 99.5232399,74.9910473 L99.5232399,81.1006301 L136.507525,81.1006301 C138.855607,81.1006301 141.309952,80.4996126 142.669097,79.4089829 L142.669097,81.1006301 L154.400364,81.1006301 C156.841569,81.1006301 159.225643,80.7584157 161.039551,79.8820271 L161.039551,74.9573401 L161.039551,74.9573401 L161.039551,74.9573401 L161.039551,74.9573401 Z M142.979889,67.3886332 C143.86142,68.3010143 144.333893,69.452774 144.333893,71.402653 C144.333893,75.4783743 141.787567,77.3808346 137.221662,77.3808346 L128.403501,77.3808346 L128.403501,73.3182534 L137.186241,73.3182534 C138.044919,73.3182534 138.653935,73.2045628 139.035569,72.8492084 C139.346933,72.5561267 139.570315,72.1305012 139.570315,71.6134662 C139.570315,71.0615813 139.328651,70.623387 139.017859,70.3605847 C138.671645,70.0715021 138.194031,69.9401009 137.405624,69.9401009 C133.17165,69.7955597 127.869327,70.0715021 127.869327,64.0761813 C127.869327,61.3281831 129.595824,58.4356436 134.342263,58.4356436 L143.418655,58.4356436 L143.418655,62.4679453 L135.11353,62.4679453 C134.290273,62.4679453 133.754957,62.498796 133.299623,62.8101596 C132.803726,63.1169528 132.619765,63.5722864 132.619765,64.1733039 C132.619765,64.8880119 133.04082,65.3741962 133.610415,65.5844381 C134.08803,65.7506891 134.601066,65.7992504 135.372333,65.7992504 L137.809539,65.864951 C140.267312,65.9249385 141.954389,66.3499927 142.979889,67.3886332 C142.979889,67.3886332 141.954389,66.3499927 142.979889,67.3886332 L142.979889,67.3886332 L142.979889,67.3886332 Z M102.126697,66.2185915 C101.521109,66.5779451 100.772122,66.6087958 99.8911632,66.6087958 L94.3911676,66.6087958 L94.3911676,62.3536834 L99.9660047,62.3536834 C100.772122,62.3536834 101.578811,62.3708227 102.126697,62.6958978 C102.713432,63.0026909 103.064216,63.5894257 103.064216,64.4001137 C103.064216,65.2108017 102.713432,65.8638084 102.126697,66.2185915 C102.126697,66.2185915 102.713432,65.8638084 102.126697,66.2185915 L102.126697,66.2185915 L102.126697,66.2185915 Z M104.860984,68.5763854 C105.868773,68.9483078 106.692602,69.6150259 107.078807,70.1669108 C107.718102,71.0918607 107.810654,71.9551092 107.828936,73.6250466 L107.828936,77.3808346 L103.283598,77.3808346 L103.283598,75.0104719 C103.283598,73.8707096 103.39329,72.1830616 102.551751,71.3021025 C101.890175,70.623387 100.881814,70.4611351 99.2301582,70.4611351 L94.3917389,70.4611351 L94.3917389,77.3808346 L89.8424022,77.3808346 L89.8424022,58.4350723 L100.295079,58.4350723 C102.587172,58.4350723 104.256538,58.536194 105.742514,59.3291715 C107.171359,60.19242 108.070029,61.3750304 108.070029,63.5362939 C108.069457,66.5602345 106.052735,68.1033412 104.860984,68.5763854 C104.860984,68.5763854 106.052735,68.1033412 104.860984,68.5763854 L104.860984,68.5763854 L104.860984,68.5763854 Z M110.580362,58.4350723 L125.690924,58.4350723 L125.690924,62.3531121 L115.089136,62.3531121 L115.089136,65.7975365 L125.432121,65.7975365 L125.432121,69.6630159 L115.089136,69.6630159 L115.089136,73.4325153 L125.690924,73.4496546 L125.690924,77.3808346 L110.580362,77.3808346 L110.580362,58.4350723 L110.580362,58.4350723 L110.580362,58.4350723 L110.580362,58.4350723 Z M80.0341624,67.1783913 L74.1833828,67.1783913 L74.1833828,62.3536834 L80.0867229,62.3536834 C81.7212391,62.3536834 82.8558595,63.0198302 82.8558595,64.6766274 C82.8558595,66.3151428 81.7737995,67.1783913 80.0341624,67.1783913 L80.0341624,67.1783913 L80.0341624,67.1783913 L80.0341624,67.1783913 Z M69.6740378,75.6577654 L62.7229163,67.940518 L69.6740378,60.4683624 L69.6740378,75.6577654 L69.6740378,75.6577654 L69.6740378,75.6577654 L69.6740378,75.6577654 Z M51.7229251,73.4325153 L40.5915328,73.4325153 L40.5915328,69.6630159 L50.5311737,69.6630159 L50.5311737,65.7975365 L40.5915328,65.7975365 L40.5915328,62.3531121 L51.9423079,62.3531121 L56.8944178,67.8742462 L51.7229251,73.4325153 L51.7229251,73.4325153 L51.7229251,73.4325153 L51.7229251,73.4325153 Z M87.7165599,64.6766274 C87.7165599,69.9395296 83.7899504,71.0261601 79.8324902,71.0261601 L74.1833828,71.0261601 L74.1833828,77.3808346 L65.3835042,77.3808346 L59.8086671,71.109 L54.0150184,77.3808346 L36.0816164,77.3808346 L36.0816164,58.4350723 L54.2909609,58.4350723 L59.8612275,64.6452054 L65.6200263,58.4350723 L80.0867229,58.4350723 C83.6796877,58.4350723 87.7165599,59.4297219 87.7165599,64.6766274 C87.7165599,64.6766274 87.7165599,59.4297219 87.7165599,64.6766274 L87.7165599,64.6766274 L87.7165599,64.6766274 Z M87.7165599,64.6766274" fill="#FFFFFF" id="Shape"/></g></g></svg>
|