From 64ef3a83842ca2344e42f784bcbab6cf304940e2 Mon Sep 17 00:00:00 2001 From: Mark Murray Date: Wed, 13 May 2026 13:06:30 +0100 Subject: [PATCH] Disable recovery mode --- .../ShopifyCheckoutKit/CheckoutBridge.swift | 33 ++++--- .../ShopifyCheckoutKit/CheckoutWebView.swift | 46 ++++----- .../CheckoutWebViewController.swift | 93 ++++++++++--------- .../ShopifyCheckoutKit/UserAgent.swift | 8 +- .../CheckoutBridgeTests.swift | 20 ++-- .../CheckoutViewControllerTests.swift | 7 +- .../CheckoutWebViewControllerTests.swift | 18 ++-- .../CheckoutWebViewTests.swift | 3 +- .../UserAgentTests.swift | 17 ++-- 9 files changed, 138 insertions(+), 107 deletions(-) diff --git a/platforms/swift/Sources/ShopifyCheckoutKit/CheckoutBridge.swift b/platforms/swift/Sources/ShopifyCheckoutKit/CheckoutBridge.swift index b1a93c69..e4746438 100644 --- a/platforms/swift/Sources/ShopifyCheckoutKit/CheckoutBridge.swift +++ b/platforms/swift/Sources/ShopifyCheckoutKit/CheckoutBridge.swift @@ -53,21 +53,24 @@ enum CheckoutBridge: CheckoutBridgeProtocol { ) } - static var recoveryAgent: String { - return recoveryAgent(entryPoint: nil) - } - - static func recoveryAgent(entryPoint: MetaData.EntryPoint?) -> String { - let colorScheme = ShopifyCheckoutKit.configuration.colorScheme - let platform = mapPlatform(ShopifyCheckoutKit.configuration.platform) - - return UserAgent.string( - type: .recovery, - colorScheme: colorScheme, - platform: platform, - entryPoint: entryPoint - ) - } + // Recovery mode disabled — not supported under UCP. + /* + static var recoveryAgent: String { + return recoveryAgent(entryPoint: nil) + } + + static func recoveryAgent(entryPoint: MetaData.EntryPoint?) -> String { + let colorScheme = ShopifyCheckoutKit.configuration.colorScheme + let platform = mapPlatform(ShopifyCheckoutKit.configuration.platform) + + return UserAgent.string( + type: .recovery, + colorScheme: colorScheme, + platform: platform, + entryPoint: entryPoint + ) + } + */ private static func mapPlatform(_ platform: Platform?) -> MetaData.Platform? { guard let platform else { return nil } diff --git a/platforms/swift/Sources/ShopifyCheckoutKit/CheckoutWebView.swift b/platforms/swift/Sources/ShopifyCheckoutKit/CheckoutWebView.swift index 672073e2..2aa4c892 100644 --- a/platforms/swift/Sources/ShopifyCheckoutKit/CheckoutWebView.swift +++ b/platforms/swift/Sources/ShopifyCheckoutKit/CheckoutWebView.swift @@ -63,10 +63,11 @@ class CheckoutWebView: WKWebView { static func `for`(checkout url: URL, recovery: Bool = false, entryPoint: MetaData.EntryPoint? = nil) -> CheckoutWebView { OSLogger.shared.debug("Creating webview for URL: \(url.absoluteString), recovery: \(recovery)") - if recovery { - CheckoutWebView.invalidate() - return CheckoutWebView(recovery: true, entryPoint: entryPoint) - } + // Recovery mode disabled — not supported under UCP. + // if recovery { + // CheckoutWebView.invalidate() + // return CheckoutWebView(recovery: true, entryPoint: entryPoint) + // } let cacheKey = "\(url.absoluteString)_\(entryPoint?.rawValue ?? "nil")" @@ -134,14 +135,15 @@ class CheckoutWebView: WKWebView { configuration.allowsInlineMediaPlayback = true self.entryPoint = entryPoint - if recovery { - configuration.websiteDataStore = WKWebsiteDataStore.nonPersistent() - configuration.applicationNameForUserAgent = CheckoutBridge.recoveryAgent(entryPoint: entryPoint) - } else { - configuration.applicationNameForUserAgent = CheckoutBridge.applicationName(entryPoint: entryPoint) - } + // Recovery mode disabled — not supported under UCP. + // if recovery { + // configuration.websiteDataStore = WKWebsiteDataStore.nonPersistent() + // configuration.applicationNameForUserAgent = CheckoutBridge.recoveryAgent(entryPoint: entryPoint) + // } else { + configuration.applicationNameForUserAgent = CheckoutBridge.applicationName(entryPoint: entryPoint) + // } - isRecovery = recovery + // isRecovery = recovery super.init(frame: frame, configuration: configuration) #if DEBUG @@ -156,21 +158,23 @@ class CheckoutWebView: WKWebView { setBackgroundColor() - if recovery { - observeNavigationChanges() - } else { - connectBridge() - } + // Recovery mode disabled — not supported under UCP. + // if recovery { + // observeNavigationChanges() + // } else { + connectBridge() + // } } deinit { OSLogger.shared.debug("De-allocating webview") - if isRecovery { - navigationObserver?.invalidate() - } else { - detachBridge() - } + // Recovery mode disabled — not supported under UCP. + // if isRecovery { + // navigationObserver?.invalidate() + // } else { + detachBridge() + // } } @available(*, unavailable) diff --git a/platforms/swift/Sources/ShopifyCheckoutKit/CheckoutWebViewController.swift b/platforms/swift/Sources/ShopifyCheckoutKit/CheckoutWebViewController.swift index a76f11d3..8094373e 100644 --- a/platforms/swift/Sources/ShopifyCheckoutKit/CheckoutWebViewController.swift +++ b/platforms/swift/Sources/ShopifyCheckoutKit/CheckoutWebViewController.swift @@ -184,38 +184,41 @@ class CheckoutWebViewController: UIViewController, UIAdaptivePresentationControl onCancel?() } - package func presentFallbackViewController(url: URL) { - progressObserver?.invalidate() - checkoutView.removeFromSuperview() - - checkoutView = CheckoutWebView.for(checkout: url, recovery: true) - checkoutView.translatesAutoresizingMaskIntoConstraints = false - checkoutView.scrollView.contentInsetAdjustmentBehavior = .never - checkoutView.viewDelegate = self - checkoutView.alpha = 1 - - view.addSubview(checkoutView) - NSLayoutConstraint.activate([ - checkoutView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor), - checkoutView.leadingAnchor.constraint(equalTo: view.leadingAnchor), - checkoutView.trailingAnchor.constraint(equalTo: view.trailingAnchor), - checkoutView.bottomAnchor.constraint(equalTo: view.bottomAnchor) - ]) - - view.addSubview(progressBar) - progressBar.translatesAutoresizingMaskIntoConstraints = false - NSLayoutConstraint.activate([ - progressBar.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor), - progressBar.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor), - progressBar.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor), - progressBar.heightAnchor.constraint(equalToConstant: 1) - ]) - view.bringSubviewToFront(checkoutView) - view.bringSubviewToFront(progressBar) - - observeProgressChanges(checkoutView) - checkoutView.load(checkout: url) - progressBar.startAnimating() + package func presentFallbackViewController(url _: URL) { + // Recovery mode disabled — not supported under UCP. + /* + progressObserver?.invalidate() + checkoutView.removeFromSuperview() + + checkoutView = CheckoutWebView.for(checkout: url, recovery: true) + checkoutView.translatesAutoresizingMaskIntoConstraints = false + checkoutView.scrollView.contentInsetAdjustmentBehavior = .never + checkoutView.viewDelegate = self + checkoutView.alpha = 1 + + view.addSubview(checkoutView) + NSLayoutConstraint.activate([ + checkoutView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor), + checkoutView.leadingAnchor.constraint(equalTo: view.leadingAnchor), + checkoutView.trailingAnchor.constraint(equalTo: view.trailingAnchor), + checkoutView.bottomAnchor.constraint(equalTo: view.bottomAnchor) + ]) + + view.addSubview(progressBar) + progressBar.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([ + progressBar.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor), + progressBar.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor), + progressBar.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor), + progressBar.heightAnchor.constraint(equalToConstant: 1) + ]) + view.bringSubviewToFront(checkoutView) + view.bringSubviewToFront(progressBar) + + observeProgressChanges(checkoutView) + checkoutView.load(checkout: url) + progressBar.startAnimating() + */ } } @@ -235,16 +238,19 @@ extension CheckoutWebViewController: CheckoutWebViewDelegate { CheckoutWebView.invalidate() onFail?(error) - if shouldAttemptRecovery(for: error) { - presentFallbackViewController(url: checkoutURL) - } else { - dismiss(animated: true) - } + // Recovery mode disabled — not supported under UCP. + // if shouldAttemptRecovery(for: error) { + // presentFallbackViewController(url: checkoutURL) + // } else { + dismiss(animated: true) + // } } - func shouldAttemptRecovery(for error: CheckoutError) -> Bool { - let isWithinRetryLimit = checkoutViewDidFailWithErrorCount < 2 - return isRecoverableError() && isWithinRetryLimit && error.isRecoverable + func shouldAttemptRecovery(for _: CheckoutError) -> Bool { + // Recovery mode disabled — not supported under UCP. + return false + // let isWithinRetryLimit = checkoutViewDidFailWithErrorCount < 2 + // return isRecoverableError() && isWithinRetryLimit && error.isRecoverable } func checkoutViewDidClickLink(url: URL) { @@ -253,7 +259,8 @@ extension CheckoutWebViewController: CheckoutWebViewDelegate { } } - private func isRecoverableError() -> Bool { - return !CheckoutURL(from: checkoutURL).isMultipassURL() - } + // Recovery mode disabled — not supported under UCP. + // private func isRecoverableError() -> Bool { + // return !CheckoutURL(from: checkoutURL).isMultipassURL() + // } } diff --git a/platforms/swift/Sources/ShopifyCheckoutKit/UserAgent.swift b/platforms/swift/Sources/ShopifyCheckoutKit/UserAgent.swift index b03764df..e95cd09a 100644 --- a/platforms/swift/Sources/ShopifyCheckoutKit/UserAgent.swift +++ b/platforms/swift/Sources/ShopifyCheckoutKit/UserAgent.swift @@ -38,7 +38,8 @@ public enum UserAgent { package enum CheckoutType { case standard - case recovery + // Recovery mode disabled — not supported under UCP. + // case recovery } private static let baseUserAgent = "ShopifyCheckoutKit/\(MetaData.version)" @@ -54,8 +55,9 @@ public enum UserAgent { switch type { case .standard: parameters = "\(MetaData.schemaVersion);\(colorScheme.rawValue);standard" - case .recovery: - parameters = "noconnect;\(colorScheme.rawValue);standard_recovery" + // Recovery mode disabled — not supported under UCP. + // case .recovery: + // parameters = "noconnect;\(colorScheme.rawValue);standard_recovery" } var userAgentString = "\(baseUserAgent) (\(parameters))" diff --git a/platforms/swift/Tests/ShopifyCheckoutKitTests/CheckoutBridgeTests.swift b/platforms/swift/Tests/ShopifyCheckoutKitTests/CheckoutBridgeTests.swift index e6b4eef2..085d8303 100644 --- a/platforms/swift/Tests/ShopifyCheckoutKitTests/CheckoutBridgeTests.swift +++ b/platforms/swift/Tests/ShopifyCheckoutKitTests/CheckoutBridgeTests.swift @@ -32,9 +32,10 @@ class CheckoutBridgeTests: XCTestCase { XCTAssertEqual(CheckoutBridge.applicationName, "ShopifyCheckoutKit/\(version) (\(schemaVersion);automatic;standard)") } - func testReturnsRecoveryUserAgent() { - let version = ShopifyCheckoutKit.version - XCTAssertEqual(CheckoutBridge.recoveryAgent, "ShopifyCheckoutKit/\(version) (noconnect;automatic;standard_recovery)") + func testReturnsRecoveryUserAgent() throws { + try XCTSkipIf(true, "Recovery mode disabled — not supported under UCP.") + // let version = ShopifyCheckoutKit.version + // XCTAssertEqual(CheckoutBridge.recoveryAgent, "ShopifyCheckoutKit/\(version) (noconnect;automatic;standard_recovery)") } func testReturnsUserAgentWithCustomPlatformSuffix() { @@ -42,7 +43,8 @@ class CheckoutBridgeTests: XCTestCase { let schemaVersion = MetaData.schemaVersion ShopifyCheckoutKit.configuration.platform = Platform.reactNative XCTAssertEqual(CheckoutBridge.applicationName, "ShopifyCheckoutKit/\(version) (\(schemaVersion);automatic;standard) ReactNative") - XCTAssertEqual(CheckoutBridge.recoveryAgent, "ShopifyCheckoutKit/\(version) (noconnect;automatic;standard_recovery) ReactNative") + // Recovery mode disabled — not supported under UCP. + // XCTAssertEqual(CheckoutBridge.recoveryAgent, "ShopifyCheckoutKit/\(version) (noconnect;automatic;standard_recovery) ReactNative") ShopifyCheckoutKit.configuration.platform = nil } @@ -50,10 +52,11 @@ class CheckoutBridgeTests: XCTestCase { let version = ShopifyCheckoutKit.version let schemaVersion = MetaData.schemaVersion let applicationNameWithEntryPoint = CheckoutBridge.applicationName(entryPoint: .acceleratedCheckouts) - let recoveryAgentWithEntryPoint = CheckoutBridge.recoveryAgent(entryPoint: .acceleratedCheckouts) + // Recovery mode disabled — not supported under UCP. + // let recoveryAgentWithEntryPoint = CheckoutBridge.recoveryAgent(entryPoint: .acceleratedCheckouts) XCTAssertEqual(applicationNameWithEntryPoint, "ShopifyCheckoutKit/\(version) (\(schemaVersion);automatic;standard) AcceleratedCheckouts") - XCTAssertEqual(recoveryAgentWithEntryPoint, "ShopifyCheckoutKit/\(version) (noconnect;automatic;standard_recovery) AcceleratedCheckouts") + // XCTAssertEqual(recoveryAgentWithEntryPoint, "ShopifyCheckoutKit/\(version) (noconnect;automatic;standard_recovery) AcceleratedCheckouts") } func testReturnsUserAgentWithEntryPointAndPlatform() { @@ -62,10 +65,11 @@ class CheckoutBridgeTests: XCTestCase { ShopifyCheckoutKit.configuration.platform = Platform.reactNative let applicationNameWithEntryPoint = CheckoutBridge.applicationName(entryPoint: .acceleratedCheckouts) - let recoveryAgentWithEntryPoint = CheckoutBridge.recoveryAgent(entryPoint: .acceleratedCheckouts) + // Recovery mode disabled — not supported under UCP. + // let recoveryAgentWithEntryPoint = CheckoutBridge.recoveryAgent(entryPoint: .acceleratedCheckouts) XCTAssertEqual(applicationNameWithEntryPoint, "ShopifyCheckoutKit/\(version) (\(schemaVersion);automatic;standard) ReactNative AcceleratedCheckouts") - XCTAssertEqual(recoveryAgentWithEntryPoint, "ShopifyCheckoutKit/\(version) (noconnect;automatic;standard_recovery) ReactNative AcceleratedCheckouts") + // XCTAssertEqual(recoveryAgentWithEntryPoint, "ShopifyCheckoutKit/\(version) (noconnect;automatic;standard_recovery) ReactNative AcceleratedCheckouts") ShopifyCheckoutKit.configuration.platform = nil } diff --git a/platforms/swift/Tests/ShopifyCheckoutKitTests/CheckoutViewControllerTests.swift b/platforms/swift/Tests/ShopifyCheckoutKitTests/CheckoutViewControllerTests.swift index e005b39a..af87bfdc 100644 --- a/platforms/swift/Tests/ShopifyCheckoutKitTests/CheckoutViewControllerTests.swift +++ b/platforms/swift/Tests/ShopifyCheckoutKitTests/CheckoutViewControllerTests.swift @@ -71,7 +71,8 @@ class CheckoutViewDelegateTests: XCTestCase { XCTAssertTrue(viewController.dismissCalled) } - func testInstantiatesRecoveryWebviewOnRecoverableError() { + func testInstantiatesRecoveryWebviewOnRecoverableError() throws { + try XCTSkipIf(true, "Recovery mode disabled — not supported under UCP.") let view = CheckoutWebView.for(checkout: checkoutURL) viewController.checkoutViewDidFailWithError(error: .checkoutUnavailable(message: "error", code: CheckoutUnavailable.httpError(statusCode: 500), recoverable: true)) @@ -86,7 +87,8 @@ class CheckoutViewDelegateTests: XCTestCase { XCTAssertEqual(viewController.checkoutView.scrollView.contentInsetAdjustmentBehavior, .never) } - func testDoesNotInstantiateRecoveryWebviewOnNonRecoverableError() { + func testDoesNotInstantiateRecoveryWebviewOnNonRecoverableError() throws { + try XCTSkipIf(true, "Recovery mode disabled — not supported under UCP.") _ = CheckoutWebView.for(checkout: checkoutURL) viewController.checkoutViewDidFailWithError(error: .checkoutUnavailable(message: "error", code: CheckoutUnavailable.httpError(statusCode: 500), recoverable: false)) @@ -95,6 +97,7 @@ class CheckoutViewDelegateTests: XCTestCase { } func testDoesNotInstantiateRecoveryForMultipassURL() throws { + try XCTSkipIf(true, "Recovery mode disabled — not supported under UCP.") let controller = try MockCheckoutWebViewController( checkoutURL: XCTUnwrap(URL(string: "https://checkout-sdk.myshopify.com/account/login/multipass/token")) ) diff --git a/platforms/swift/Tests/ShopifyCheckoutKitTests/CheckoutWebViewControllerTests.swift b/platforms/swift/Tests/ShopifyCheckoutKitTests/CheckoutWebViewControllerTests.swift index c6bdb4c6..f2f39034 100644 --- a/platforms/swift/Tests/ShopifyCheckoutKitTests/CheckoutWebViewControllerTests.swift +++ b/platforms/swift/Tests/ShopifyCheckoutKitTests/CheckoutWebViewControllerTests.swift @@ -81,7 +81,8 @@ class CheckoutWebViewControllerTests: XCTestCase { XCTAssertTrue(failCalled) } - func test_checkoutViewDidFailWithError_attemptsRecoveryWhenRecoverable() { + func test_checkoutViewDidFailWithError_attemptsRecoveryWhenRecoverable() throws { + try XCTSkipIf(true, "Recovery mode disabled — not supported under UCP.") let viewController = TestableCheckoutWebViewController(checkoutURL: url, entryPoint: nil) viewController.checkoutViewDidFailWithError(error: recoverableError) @@ -92,7 +93,8 @@ class CheckoutWebViewControllerTests: XCTestCase { XCTAssertFalse(viewController.dismissCalled) } - func test_checkoutViewDidFailWithError_doesNotAttemptRecoveryWhenCountReachesTwo() { + func test_checkoutViewDidFailWithError_doesNotAttemptRecoveryWhenCountReachesTwo() throws { + try XCTSkipIf(true, "Recovery mode disabled — not supported under UCP.") let viewController = TestableCheckoutWebViewController(checkoutURL: url, entryPoint: nil) viewController.checkoutViewDidFailWithError(error: recoverableError) @@ -107,7 +109,8 @@ class CheckoutWebViewControllerTests: XCTestCase { XCTAssertTrue(viewController.dismissAnimated) } - func test_checkoutViewDidFailWithError_doesNotAttemptRecoveryWhenErrorIsNotRecoverable() { + func test_checkoutViewDidFailWithError_doesNotAttemptRecoveryWhenErrorIsNotRecoverable() throws { + try XCTSkipIf(true, "Recovery mode disabled — not supported under UCP.") let viewController = TestableCheckoutWebViewController(checkoutURL: url, entryPoint: nil) viewController.checkoutViewDidFailWithError(error: nonRecoverableError) @@ -118,7 +121,8 @@ class CheckoutWebViewControllerTests: XCTestCase { XCTAssertFalse(viewController.presentFallbackViewControllerCalled) } - func test_checkoutViewDidFailWithError_doesNotAttemptRecoveryForMultipassURL() { + func test_checkoutViewDidFailWithError_doesNotAttemptRecoveryForMultipassURL() throws { + try XCTSkipIf(true, "Recovery mode disabled — not supported under UCP.") let viewController = TestableCheckoutWebViewController(checkoutURL: multipassURL, entryPoint: nil) viewController.checkoutViewDidFailWithError(error: recoverableError) @@ -129,7 +133,8 @@ class CheckoutWebViewControllerTests: XCTestCase { XCTAssertFalse(viewController.presentFallbackViewControllerCalled) } - func test_checkoutViewDidFailWithError_attemptsRecoveryForFirstFailureThenDismisses() { + func test_checkoutViewDidFailWithError_attemptsRecoveryForFirstFailureThenDismisses() throws { + try XCTSkipIf(true, "Recovery mode disabled — not supported under UCP.") let viewController = TestableCheckoutWebViewController(checkoutURL: url, entryPoint: nil) viewController.checkoutViewDidFailWithError(error: recoverableError) @@ -146,7 +151,8 @@ class CheckoutWebViewControllerTests: XCTestCase { XCTAssertTrue(viewController.dismissAnimated) } - func test_checkoutViewDidFailWithError_respectsErrorRecoverableProperty() { + func test_checkoutViewDidFailWithError_respectsErrorRecoverableProperty() throws { + try XCTSkipIf(true, "Recovery mode disabled — not supported under UCP.") struct TestCase { let name: String let error: CheckoutError diff --git a/platforms/swift/Tests/ShopifyCheckoutKitTests/CheckoutWebViewTests.swift b/platforms/swift/Tests/ShopifyCheckoutKitTests/CheckoutWebViewTests.swift index 15be4376..9700c10d 100644 --- a/platforms/swift/Tests/ShopifyCheckoutKitTests/CheckoutWebViewTests.swift +++ b/platforms/swift/Tests/ShopifyCheckoutKitTests/CheckoutWebViewTests.swift @@ -54,7 +54,8 @@ class CheckoutWebViewTests: XCTestCase { XCTAssertTrue(view.configuration.allowsInlineMediaPlayback) } - func testUsesRecoveryAgent() { + func testUsesRecoveryAgent() throws { + try XCTSkipIf(true, "Recovery mode disabled — not supported under UCP.") let backgroundColor: UIColor = .systemRed ShopifyCheckoutKit.configuration.backgroundColor = backgroundColor ShopifyCheckoutKit.configuration.colorScheme = .automatic diff --git a/platforms/swift/Tests/ShopifyCheckoutKitTests/UserAgentTests.swift b/platforms/swift/Tests/ShopifyCheckoutKitTests/UserAgentTests.swift index c0b51c01..c89fcce0 100644 --- a/platforms/swift/Tests/ShopifyCheckoutKitTests/UserAgentTests.swift +++ b/platforms/swift/Tests/ShopifyCheckoutKitTests/UserAgentTests.swift @@ -55,13 +55,14 @@ class UserAgentTests: XCTestCase { XCTAssertEqual(checkoutKitUA, "ShopifyCheckoutKit/3.8.0 (\(schemaVersion);automatic;standard)") } - func test_string_withRecoveryTypeAndDarkColorScheme_shouldReturnRecoveryUserAgent() { - let schemaVersion = MetaData.schemaVersion - let recoveryUA = UserAgent.string( - type: .recovery, - colorScheme: .dark, - entryPoint: .acceleratedCheckouts - ) - XCTAssertEqual(recoveryUA, "ShopifyCheckoutKit/3.8.0 (noconnect;dark;standard_recovery) AcceleratedCheckouts") + func test_string_withRecoveryTypeAndDarkColorScheme_shouldReturnRecoveryUserAgent() throws { + try XCTSkipIf(true, "Recovery mode disabled — not supported under UCP.") + // let schemaVersion = MetaData.schemaVersion + // let recoveryUA = UserAgent.string( + // type: .recovery, + // colorScheme: .dark, + // entryPoint: .acceleratedCheckouts + // ) + // XCTAssertEqual(recoveryUA, "ShopifyCheckoutKit/3.8.0 (noconnect;dark;standard_recovery) AcceleratedCheckouts") } }