<?xml version="1.0"?>

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <preference for="Airwallex\Payments\Api\ServiceInterface" type="Airwallex\Payments\Model\Service" />
    <preference for="Airwallex\Payments\Api\OrderServiceInterface" type="Airwallex\Payments\Model\OrderService" />
    <preference for="Airwallex\Payments\Api\Data\PlaceOrderResponseInterface" type="Airwallex\Payments\Model\PlaceOrderResponse" />
    <preference for="Airwallex\Payments\Api\PaymentConsentsInterface" type="Airwallex\Payments\Model\PaymentConsents" />
    <preference for="Airwallex\Payments\Api\Data\SavedPaymentResponseInterface" type="Airwallex\Payments\Model\SavedPaymentResponse" />
    <preference for="Airwallex\Payments\Api\Data\ClientSecretResponseInterface" type="Airwallex\Payments\Model\ClientSecretResponse" />
    <type name="Magento\Payment\Block\Form\Container">
        <plugin name="remove_methods_from_admin_reorder" type="Airwallex\Payments\Plugin\RemoveMethodsFromAdminReorder" sortOrder="1" />
    </type>
    <type name="Magento\Sales\Model\Order\Payment\Operations\CaptureOperation">
        <plugin name="airwallex_capture_plugin" type="Airwallex\Payments\Plugin\CapturePlugin"/>
    </type>
    <type name="Magento\ReCaptchaWebapiApi\Model\CompositeWebapiValidationConfigProvider">
        <arguments>
            <argument name="providers" xsi:type="array">
                <item name="airwallex_card" xsi:type="object">Airwallex\Payments\Model\Config\WebapiConfigProvider</item>
            </argument>
        </arguments>
    </type>
    <type name="Magento\ReCaptchaValidation\Model\Validator">
        <plugin name="airwallex_recaptcha_validator"
                type="Airwallex\Payments\Plugin\ReCaptchaValidationPlugin"
                sortOrder="100" />
    </type>
    <type name="Airwallex\Payments\Logger\Handler">
        <arguments>
            <argument name="filesystem" xsi:type="object">Magento\Framework\Filesystem\Driver\File</argument>
        </arguments>
    </type>
    <type name="Airwallex\Payments\Logger\Logger">
        <arguments>
            <argument name="name" xsi:type="string">Airwallex_Payments_Logger</argument>
            <argument name="handlers"  xsi:type="array">
                <item name="system" xsi:type="object">Airwallex\Payments\Logger\Handler</item>
            </argument>
        </arguments>
    </type>
    <!-- Card Method -->
    <virtualType name="AirwallexPaymentCardCountryValidator" type="Magento\Payment\Gateway\Validator\CountryValidator">
        <arguments>
            <argument name="config" xsi:type="object">AirwallexPaymentCardConfig</argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentCardValidatorPool" type="Magento\Payment\Gateway\Validator\ValidatorPool">
        <arguments>
            <argument name="validators" xsi:type="array">
                <item name="country" xsi:type="string">AirwallexPaymentCardCountryValidator</item>
            </argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentCardConfig" type="Magento\Payment\Gateway\Config\Config">
        <arguments>
            <argument name="methodCode" xsi:type="const">Airwallex\Payments\Model\Methods\CardMethod::CODE</argument>
        </arguments>
    </virtualType>

    <virtualType name="AirwallexPaymentCardConfigValueHandler" type="Magento\Payment\Gateway\Config\ConfigValueHandler">
        <arguments>
            <argument name="configInterface" xsi:type="object">AirwallexPaymentCardConfig</argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentCardValueHandlerPool" type="Magento\Payment\Gateway\Config\ValueHandlerPool">
        <arguments>
            <argument name="handlers" xsi:type="array">
                <item name="default" xsi:type="string">AirwallexPaymentCardConfigValueHandler</item>
            </argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentsCardsGatewayFacade" type="Airwallex\Payments\Model\Methods\CardMethod">
        <arguments>
            <argument name="eventManager" xsi:type="object">Magento\Framework\Event\ManagerInterface</argument>
            <argument name="valueHandlerPool" xsi:type="object">AirwallexPaymentCardValueHandlerPool</argument>
            <argument name="paymentDataObjectFactory" xsi:type="object">Magento\Payment\Gateway\Data\PaymentDataObjectFactory</argument>
            <argument name="code" xsi:type="const">Airwallex\Payments\Model\Methods\CardMethod::CODE</argument>
            <argument name="formBlockType" xsi:type="string">Magento\Payment\Block\Form</argument>
            <argument name="infoBlockType" xsi:type="string">Magento\Payment\Block\Info</argument>
            <argument name="logger" xsi:type="object">Airwallex\Payments\Logger\Logger</argument>
            <argument name="validatorPool" xsi:type="object">AirwallexPaymentCardValidatorPool</argument>
        </arguments>
    </virtualType>
    <!-- Vault -->
    <virtualType name="AirwallexPaymentCardVaultCountryValidator" type="Magento\Payment\Gateway\Validator\CountryValidator">
        <arguments>
            <argument name="config" xsi:type="object">AirwallexPaymentCardVaultConfig</argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentCardVaultValidatorPool" type="Magento\Payment\Gateway\Validator\ValidatorPool">
        <arguments>
            <argument name="validators" xsi:type="array">
                <item name="country" xsi:type="string">AirwallexPaymentCardVaultCountryValidator</item>
            </argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentCardVaultConfig" type="Magento\Payment\Gateway\Config\Config">
        <arguments>
            <argument name="methodCode" xsi:type="const">Airwallex\Payments\Model\Methods\CardMethod::CODE</argument>
        </arguments>
    </virtualType>

    <virtualType name="AirwallexPaymentCardVaultConfigValueHandler" type="Magento\Payment\Gateway\Config\ConfigValueHandler">
        <arguments>
            <argument name="configInterface" xsi:type="object">AirwallexPaymentCardVaultConfig</argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentCardVaultValueHandlerPool" type="Magento\Payment\Gateway\Config\ValueHandlerPool">
        <arguments>
            <argument name="handlers" xsi:type="array">
                <item name="default" xsi:type="string">AirwallexPaymentCardVaultConfigValueHandler</item>
            </argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentsCardsVaultFacade" type="Airwallex\Payments\Model\Methods\Vault">
        <arguments>
            <argument name="eventManager" xsi:type="object">Magento\Framework\Event\ManagerInterface</argument>
            <argument name="valueHandlerPool" xsi:type="object">AirwallexPaymentCardVaultValueHandlerPool</argument>
            <argument name="paymentDataObjectFactory" xsi:type="object">Magento\Payment\Gateway\Data\PaymentDataObjectFactory</argument>
            <argument name="code" xsi:type="const">Airwallex\Payments\Model\Methods\Vault::CODE</argument>
            <argument name="formBlockType" xsi:type="string">Magento\Payment\Block\Form</argument>
            <argument name="infoBlockType" xsi:type="string">Magento\Payment\Block\Info</argument>
            <argument name="logger" xsi:type="object">Airwallex\Payments\Logger\Logger</argument>
            <argument name="validatorPool" xsi:type="object">AirwallexPaymentCardVaultValidatorPool</argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexVaultPaymentConfig" type="Magento\Payment\Gateway\Config\Config">
        <arguments>
            <argument name="methodCode" xsi:type="const">Airwallex\Payments\Model\Methods\Vault::CODE</argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexVaultPaymentValueHandler" type="VaultPaymentDefaultValueHandler">
        <arguments>
            <argument name="configInterface" xsi:type="object">AirwallexVaultPaymentConfig</argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexVaultPaymentValueHandlerPool" type="VaultPaymentValueHandlerPool">
        <arguments>
            <argument name="handlers" xsi:type="array">
                <item name="default" xsi:type="string">AirwallexVaultPaymentValueHandler</item>
            </argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexCreditCardVaultFacade" type="Magento\Vault\Model\Method\Vault">
        <arguments>
            <argument name="config" xsi:type="object">AirwallexVaultPaymentConfig</argument>
            <argument name="valueHandlerPool" xsi:type="object">AirwallexVaultPaymentValueHandlerPool</argument>
            <argument name="vaultProvider" xsi:type="object">AirwallexPaymentsCardsVaultFacade</argument>
            <argument name="code" xsi:type="const">Airwallex\Payments\Model\Methods\Vault::CODE</argument>
        </arguments>
    </virtualType>
    <!-- Express Checkout -->
    <virtualType name="AirwallexPaymentExpressCountryValidator" type="Magento\Payment\Gateway\Validator\CountryValidator">
        <arguments>
            <argument name="config" xsi:type="object">AirwallexPaymentExpressConfig</argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentExpressValidatorPool" type="Magento\Payment\Gateway\Validator\ValidatorPool">
        <arguments>
            <argument name="validators" xsi:type="array">
                <item name="country" xsi:type="string">AirwallexPaymentExpressCountryValidator</item>
            </argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentExpressConfig" type="Magento\Payment\Gateway\Config\Config">
        <arguments>
            <argument name="methodCode" xsi:type="const">Airwallex\Payments\Model\Methods\ExpressCheckout::CODE</argument>
        </arguments>
    </virtualType>

    <virtualType name="AirwallexPaymentExpressConfigValueHandler" type="Magento\Payment\Gateway\Config\ConfigValueHandler">
        <arguments>
            <argument name="configInterface" xsi:type="object">AirwallexPaymentExpressConfig</argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentExpressValueHandlerPool" type="Magento\Payment\Gateway\Config\ValueHandlerPool">
        <arguments>
            <argument name="handlers" xsi:type="array">
                <item name="default" xsi:type="string">AirwallexPaymentExpressConfigValueHandler</item>
            </argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentsExpressGatewayFacade" type="Airwallex\Payments\Model\Methods\ExpressCheckout">
        <arguments>
            <argument name="eventManager" xsi:type="object">Magento\Framework\Event\ManagerInterface</argument>
            <argument name="valueHandlerPool" xsi:type="object">AirwallexPaymentExpressValueHandlerPool</argument>
            <argument name="paymentDataObjectFactory" xsi:type="object">Magento\Payment\Gateway\Data\PaymentDataObjectFactory</argument>
            <argument name="code" xsi:type="const">Airwallex\Payments\Model\Methods\ExpressCheckout::CODE</argument>
            <argument name="formBlockType" xsi:type="string">Magento\Payment\Block\Form</argument>
            <argument name="infoBlockType" xsi:type="string">Magento\Payment\Block\Info</argument>
            <argument name="logger" xsi:type="object">Airwallex\Payments\Logger\Logger</argument>
            <argument name="validatorPool" xsi:type="object">AirwallexPaymentExpressValidatorPool</argument>
        </arguments>
    </virtualType>
    <!-- Wechat Method -->
    <virtualType name="AirwallexPaymentWechatCountryValidator" type="Magento\Payment\Gateway\Validator\CountryValidator">
        <arguments>
            <argument name="config" xsi:type="object">AirwallexPaymentWechatConfig</argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentsWechatValidatorPool" type="Magento\Payment\Gateway\Validator\ValidatorPool">
        <arguments>
            <argument name="validators" xsi:type="array">
                <item name="country" xsi:type="string">AirwallexPaymentWechatCountryValidator</item>
            </argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentWechatConfig" type="Magento\Payment\Gateway\Config\Config">
        <arguments>
            <argument name="methodCode" xsi:type="const">Airwallex\Payments\Model\Methods\RedirectMethod::WECHAT_CODE</argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentWechatConfigValueHandler" type="Magento\Payment\Gateway\Config\ConfigValueHandler">
        <arguments>
            <argument name="configInterface" xsi:type="object">AirwallexPaymentWechatConfig</argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentWechatValueHandlerPool" type="Magento\Payment\Gateway\Config\ValueHandlerPool">
        <arguments>
            <argument name="handlers" xsi:type="array">
                <item name="default" xsi:type="string">AirwallexPaymentWechatConfigValueHandler</item>
            </argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentsWechatGatewayFacade" type="Airwallex\Payments\Model\Methods\RedirectMethod">
        <arguments>
            <argument name="eventManager" xsi:type="object">Magento\Framework\Event\ManagerInterface</argument>
            <argument name="valueHandlerPool" xsi:type="object">AirwallexPaymentWechatValueHandlerPool</argument>
            <argument name="paymentDataObjectFactory" xsi:type="object">Magento\Payment\Gateway\Data\PaymentDataObjectFactory</argument>
            <argument name="code" xsi:type="const">Airwallex\Payments\Model\Methods\RedirectMethod::WECHAT_CODE</argument>
            <argument name="formBlockType" xsi:type="string">Magento\Payment\Block\Form</argument>
            <argument name="infoBlockType" xsi:type="string">Magento\Payment\Block\Info</argument>
            <argument name="logger" xsi:type="object">Airwallex\Payments\Logger\Logger</argument>
            <argument name="validatorPool" xsi:type="object">AirwallexPaymentsWechatValidatorPool</argument>
        </arguments>
    </virtualType>
    <!-- AlipayCN Method -->
    <virtualType name="AirwallexPaymentAlipayCNCountryValidator" type="Magento\Payment\Gateway\Validator\CountryValidator">
        <arguments>
            <argument name="config" xsi:type="object">AirwallexPaymentAlipayCNConfig</argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentsAlipayCNValidatorPool" type="Magento\Payment\Gateway\Validator\ValidatorPool">
        <arguments>
            <argument name="validators" xsi:type="array">
                <item name="country" xsi:type="string">AirwallexPaymentAlipayCNCountryValidator</item>
            </argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentAlipayCNConfig" type="Magento\Payment\Gateway\Config\Config">
        <arguments>
            <argument name="methodCode" xsi:type="const">Airwallex\Payments\Model\Methods\RedirectMethod::ALIPAYCN_CODE</argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentAlipayCNConfigValueHandler" type="Magento\Payment\Gateway\Config\ConfigValueHandler">
        <arguments>
            <argument name="configInterface" xsi:type="object">AirwallexPaymentAlipayCNConfig</argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentAlipayCNValueHandlerPool" type="Magento\Payment\Gateway\Config\ValueHandlerPool">
        <arguments>
            <argument name="handlers" xsi:type="array">
                <item name="default" xsi:type="string">AirwallexPaymentAlipayCNConfigValueHandler</item>
            </argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentsAlipayCNGatewayFacade" type="Airwallex\Payments\Model\Methods\RedirectMethod">
        <arguments>
            <argument name="eventManager" xsi:type="object">Magento\Framework\Event\ManagerInterface</argument>
            <argument name="valueHandlerPool" xsi:type="object">AirwallexPaymentAlipayCNValueHandlerPool</argument>
            <argument name="paymentDataObjectFactory" xsi:type="object">Magento\Payment\Gateway\Data\PaymentDataObjectFactory</argument>
            <argument name="code" xsi:type="const">Airwallex\Payments\Model\Methods\RedirectMethod::ALIPAYCN_CODE</argument>
            <argument name="formBlockType" xsi:type="string">Magento\Payment\Block\Form</argument>
            <argument name="infoBlockType" xsi:type="string">Magento\Payment\Block\Info</argument>
            <argument name="logger" xsi:type="object">Airwallex\Payments\Logger\Logger</argument>
            <argument name="validatorPool" xsi:type="object">AirwallexPaymentsAlipayCNValidatorPool</argument>
        </arguments>
    </virtualType>
    <!-- Dana Method -->
    <virtualType name="AirwallexPaymentDanaCountryValidator" type="Magento\Payment\Gateway\Validator\CountryValidator">
        <arguments>
            <argument name="config" xsi:type="object">AirwallexPaymentDanaConfig</argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentsDanaValidatorPool" type="Magento\Payment\Gateway\Validator\ValidatorPool">
        <arguments>
            <argument name="validators" xsi:type="array">
                <item name="country" xsi:type="string">AirwallexPaymentDanaCountryValidator</item>
            </argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentDanaConfig" type="Magento\Payment\Gateway\Config\Config">
        <arguments>
            <argument name="methodCode" xsi:type="const">Airwallex\Payments\Model\Methods\RedirectMethod::DANA_CODE</argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentDanaConfigValueHandler" type="Magento\Payment\Gateway\Config\ConfigValueHandler">
        <arguments>
            <argument name="configInterface" xsi:type="object">AirwallexPaymentDanaConfig</argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentDanaValueHandlerPool" type="Magento\Payment\Gateway\Config\ValueHandlerPool">
        <arguments>
            <argument name="handlers" xsi:type="array">
                <item name="default" xsi:type="string">AirwallexPaymentDanaConfigValueHandler</item>
            </argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentsDanaGatewayFacade" type="Airwallex\Payments\Model\Methods\RedirectMethod">
        <arguments>
            <argument name="eventManager" xsi:type="object">Magento\Framework\Event\ManagerInterface</argument>
            <argument name="valueHandlerPool" xsi:type="object">AirwallexPaymentDanaValueHandlerPool</argument>
            <argument name="paymentDataObjectFactory" xsi:type="object">Magento\Payment\Gateway\Data\PaymentDataObjectFactory</argument>
            <argument name="code" xsi:type="const">Airwallex\Payments\Model\Methods\RedirectMethod::DANA_CODE</argument>
            <argument name="formBlockType" xsi:type="string">Magento\Payment\Block\Form</argument>
            <argument name="infoBlockType" xsi:type="string">Magento\Payment\Block\Info</argument>
            <argument name="logger" xsi:type="object">Airwallex\Payments\Logger\Logger</argument>
            <argument name="validatorPool" xsi:type="object">AirwallexPaymentsDanaValidatorPool</argument>
        </arguments>
    </virtualType>
    <!-- AlipayHK Method -->
    <virtualType name="AirwallexPaymentAlipayHKCountryValidator" type="Magento\Payment\Gateway\Validator\CountryValidator">
        <arguments>
            <argument name="config" xsi:type="object">AirwallexPaymentAlipayHKConfig</argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentsAlipayHKValidatorPool" type="Magento\Payment\Gateway\Validator\ValidatorPool">
        <arguments>
            <argument name="validators" xsi:type="array">
                <item name="country" xsi:type="string">AirwallexPaymentAlipayHKCountryValidator</item>
            </argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentAlipayHKConfig" type="Magento\Payment\Gateway\Config\Config">
        <arguments>
            <argument name="methodCode" xsi:type="const">Airwallex\Payments\Model\Methods\RedirectMethod::ALIPAYHK_CODE</argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentAlipayHKConfigValueHandler" type="Magento\Payment\Gateway\Config\ConfigValueHandler">
        <arguments>
            <argument name="configInterface" xsi:type="object">AirwallexPaymentAlipayHKConfig</argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentAlipayHKValueHandlerPool" type="Magento\Payment\Gateway\Config\ValueHandlerPool">
        <arguments>
            <argument name="handlers" xsi:type="array">
                <item name="default" xsi:type="string">AirwallexPaymentAlipayHKConfigValueHandler</item>
            </argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentsAlipayHKGatewayFacade" type="Airwallex\Payments\Model\Methods\RedirectMethod">
        <arguments>
            <argument name="eventManager" xsi:type="object">Magento\Framework\Event\ManagerInterface</argument>
            <argument name="valueHandlerPool" xsi:type="object">AirwallexPaymentAlipayHKValueHandlerPool</argument>
            <argument name="paymentDataObjectFactory" xsi:type="object">Magento\Payment\Gateway\Data\PaymentDataObjectFactory</argument>
            <argument name="code" xsi:type="const">Airwallex\Payments\Model\Methods\RedirectMethod::ALIPAYHK_CODE</argument>
            <argument name="formBlockType" xsi:type="string">Magento\Payment\Block\Form</argument>
            <argument name="infoBlockType" xsi:type="string">Magento\Payment\Block\Info</argument>
            <argument name="logger" xsi:type="object">Airwallex\Payments\Logger\Logger</argument>
            <argument name="validatorPool" xsi:type="object">AirwallexPaymentsAlipayHKValidatorPool</argument>
        </arguments>
    </virtualType>
    <!-- GCash Method -->
    <virtualType name="AirwallexPaymentGCashCountryValidator" type="Magento\Payment\Gateway\Validator\CountryValidator">
        <arguments>
            <argument name="config" xsi:type="object">AirwallexPaymentGCashConfig</argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentsGCashValidatorPool" type="Magento\Payment\Gateway\Validator\ValidatorPool">
        <arguments>
            <argument name="validators" xsi:type="array">
                <item name="country" xsi:type="string">AirwallexPaymentGCashCountryValidator</item>
            </argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentGCashConfig" type="Magento\Payment\Gateway\Config\Config">
        <arguments>
            <argument name="methodCode" xsi:type="const">Airwallex\Payments\Model\Methods\RedirectMethod::GCASH_CODE</argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentGCashConfigValueHandler" type="Magento\Payment\Gateway\Config\ConfigValueHandler">
        <arguments>
            <argument name="configInterface" xsi:type="object">AirwallexPaymentGCashConfig</argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentGCashValueHandlerPool" type="Magento\Payment\Gateway\Config\ValueHandlerPool">
        <arguments>
            <argument name="handlers" xsi:type="array">
                <item name="default" xsi:type="string">AirwallexPaymentGCashConfigValueHandler</item>
            </argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentsGCashGatewayFacade" type="Airwallex\Payments\Model\Methods\RedirectMethod">
        <arguments>
            <argument name="eventManager" xsi:type="object">Magento\Framework\Event\ManagerInterface</argument>
            <argument name="valueHandlerPool" xsi:type="object">AirwallexPaymentGCashValueHandlerPool</argument>
            <argument name="paymentDataObjectFactory" xsi:type="object">Magento\Payment\Gateway\Data\PaymentDataObjectFactory</argument>
            <argument name="code" xsi:type="const">Airwallex\Payments\Model\Methods\RedirectMethod::GCASH_CODE</argument>
            <argument name="formBlockType" xsi:type="string">Magento\Payment\Block\Form</argument>
            <argument name="infoBlockType" xsi:type="string">Magento\Payment\Block\Info</argument>
            <argument name="logger" xsi:type="object">Airwallex\Payments\Logger\Logger</argument>
            <argument name="validatorPool" xsi:type="object">AirwallexPaymentsGCashValidatorPool</argument>
        </arguments>
    </virtualType>
    <!-- Kakao Method -->
    <virtualType name="AirwallexPaymentKakaoCountryValidator" type="Magento\Payment\Gateway\Validator\CountryValidator">
        <arguments>
            <argument name="config" xsi:type="object">AirwallexPaymentKakaoConfig</argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentsKakaoValidatorPool" type="Magento\Payment\Gateway\Validator\ValidatorPool">
        <arguments>
            <argument name="validators" xsi:type="array">
                <item name="country" xsi:type="string">AirwallexPaymentKakaoCountryValidator</item>
            </argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentKakaoConfig" type="Magento\Payment\Gateway\Config\Config">
        <arguments>
            <argument name="methodCode" xsi:type="const">Airwallex\Payments\Model\Methods\RedirectMethod::KAKAO_CODE</argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentKakaoConfigValueHandler" type="Magento\Payment\Gateway\Config\ConfigValueHandler">
        <arguments>
            <argument name="configInterface" xsi:type="object">AirwallexPaymentKakaoConfig</argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentKakaoValueHandlerPool" type="Magento\Payment\Gateway\Config\ValueHandlerPool">
        <arguments>
            <argument name="handlers" xsi:type="array">
                <item name="default" xsi:type="string">AirwallexPaymentKakaoConfigValueHandler</item>
            </argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentsKakaoGatewayFacade" type="Airwallex\Payments\Model\Methods\RedirectMethod">
        <arguments>
            <argument name="eventManager" xsi:type="object">Magento\Framework\Event\ManagerInterface</argument>
            <argument name="valueHandlerPool" xsi:type="object">AirwallexPaymentKakaoValueHandlerPool</argument>
            <argument name="paymentDataObjectFactory" xsi:type="object">Magento\Payment\Gateway\Data\PaymentDataObjectFactory</argument>
            <argument name="code" xsi:type="const">Airwallex\Payments\Model\Methods\RedirectMethod::KAKAO_CODE</argument>
            <argument name="formBlockType" xsi:type="string">Magento\Payment\Block\Form</argument>
            <argument name="infoBlockType" xsi:type="string">Magento\Payment\Block\Info</argument>
            <argument name="logger" xsi:type="object">Airwallex\Payments\Logger\Logger</argument>
            <argument name="validatorPool" xsi:type="object">AirwallexPaymentsKakaoValidatorPool</argument>
        </arguments>
    </virtualType>
    <!-- TouchNGo Method -->
    <virtualType name="AirwallexPaymentTouchNGoCountryValidator" type="Magento\Payment\Gateway\Validator\CountryValidator">
        <arguments>
            <argument name="config" xsi:type="object">AirwallexPaymentTouchNGoConfig</argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentsTouchNGoValidatorPool" type="Magento\Payment\Gateway\Validator\ValidatorPool">
        <arguments>
            <argument name="validators" xsi:type="array">
                <item name="country" xsi:type="string">AirwallexPaymentTouchNGoCountryValidator</item>
            </argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentTouchNGoConfig" type="Magento\Payment\Gateway\Config\Config">
        <arguments>
            <argument name="methodCode" xsi:type="const">Airwallex\Payments\Model\Methods\RedirectMethod::TOUCH_N_GO_CODE</argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentTouchNGoConfigValueHandler" type="Magento\Payment\Gateway\Config\ConfigValueHandler">
        <arguments>
            <argument name="configInterface" xsi:type="object">AirwallexPaymentTouchNGoConfig</argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentTouchNGoValueHandlerPool" type="Magento\Payment\Gateway\Config\ValueHandlerPool">
        <arguments>
            <argument name="handlers" xsi:type="array">
                <item name="default" xsi:type="string">AirwallexPaymentTouchNGoConfigValueHandler</item>
            </argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentsTouchNGoGatewayFacade" type="Airwallex\Payments\Model\Methods\RedirectMethod">
        <arguments>
            <argument name="eventManager" xsi:type="object">Magento\Framework\Event\ManagerInterface</argument>
            <argument name="valueHandlerPool" xsi:type="object">AirwallexPaymentTouchNGoValueHandlerPool</argument>
            <argument name="paymentDataObjectFactory" xsi:type="object">Magento\Payment\Gateway\Data\PaymentDataObjectFactory</argument>
            <argument name="code" xsi:type="const">Airwallex\Payments\Model\Methods\RedirectMethod::TOUCH_N_GO_CODE</argument>
            <argument name="formBlockType" xsi:type="string">Magento\Payment\Block\Form</argument>
            <argument name="infoBlockType" xsi:type="string">Magento\Payment\Block\Info</argument>
            <argument name="logger" xsi:type="object">Airwallex\Payments\Logger\Logger</argument>
            <argument name="validatorPool" xsi:type="object">AirwallexPaymentsTouchNGoValidatorPool</argument>
        </arguments>
    </virtualType>
    <!-- Paynow Method -->
    <virtualType name="AirwallexPaymentPaynowCountryValidator" type="Magento\Payment\Gateway\Validator\CountryValidator">
        <arguments>
            <argument name="config" xsi:type="object">AirwallexPaymentPaynowConfig</argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentsPaynowValidatorPool" type="Magento\Payment\Gateway\Validator\ValidatorPool">
        <arguments>
            <argument name="validators" xsi:type="array">
                <item name="country" xsi:type="string">AirwallexPaymentPaynowCountryValidator</item>
            </argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentPaynowConfig" type="Magento\Payment\Gateway\Config\Config">
        <arguments>
            <argument name="methodCode" xsi:type="const">Airwallex\Payments\Model\Methods\RedirectMethod::PAY_NOW_CODE</argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentPaynowConfigValueHandler" type="Magento\Payment\Gateway\Config\ConfigValueHandler">
        <arguments>
            <argument name="configInterface" xsi:type="object">AirwallexPaymentPaynowConfig</argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentPaynowValueHandlerPool" type="Magento\Payment\Gateway\Config\ValueHandlerPool">
        <arguments>
            <argument name="handlers" xsi:type="array">
                <item name="default" xsi:type="string">AirwallexPaymentPaynowConfigValueHandler</item>
            </argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentsPaynowGatewayFacade" type="Airwallex\Payments\Model\Methods\RedirectMethod">
        <arguments>
            <argument name="eventManager" xsi:type="object">Magento\Framework\Event\ManagerInterface</argument>
            <argument name="valueHandlerPool" xsi:type="object">AirwallexPaymentPaynowValueHandlerPool</argument>
            <argument name="paymentDataObjectFactory" xsi:type="object">Magento\Payment\Gateway\Data\PaymentDataObjectFactory</argument>
            <argument name="code" xsi:type="const">Airwallex\Payments\Model\Methods\RedirectMethod::PAY_NOW_CODE</argument>
            <argument name="formBlockType" xsi:type="string">Magento\Payment\Block\Form</argument>
            <argument name="infoBlockType" xsi:type="string">Magento\Payment\Block\Info</argument>
            <argument name="logger" xsi:type="object">Airwallex\Payments\Logger\Logger</argument>
            <argument name="validatorPool" xsi:type="object">AirwallexPaymentsPaynowValidatorPool</argument>
        </arguments>
    </virtualType>
    <!-- Klarnaa Method -->
    <virtualType name="AirwallexPaymentKlarnaCountryValidator" type="Magento\Payment\Gateway\Validator\CountryValidator">
        <arguments>
            <argument name="config" xsi:type="object">AirwallexPaymentKlarnaConfig</argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentsKlarnaValidatorPool" type="Magento\Payment\Gateway\Validator\ValidatorPool">
        <arguments>
            <argument name="validators" xsi:type="array">
                <item name="country" xsi:type="string">AirwallexPaymentKlarnaCountryValidator</item>
            </argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentKlarnaConfig" type="Magento\Payment\Gateway\Config\Config">
        <arguments>
            <argument name="methodCode" xsi:type="const">Airwallex\Payments\Model\Methods\KlarnaMethod::CODE</argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentKlarnaConfigValueHandler" type="Magento\Payment\Gateway\Config\ConfigValueHandler">
        <arguments>
            <argument name="configInterface" xsi:type="object">AirwallexPaymentKlarnaConfig</argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentKlarnaValueHandlerPool" type="Magento\Payment\Gateway\Config\ValueHandlerPool">
        <arguments>
            <argument name="handlers" xsi:type="array">
                <item name="default" xsi:type="string">AirwallexPaymentKlarnaConfigValueHandler</item>
            </argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentsKlarnaGatewayFacade" type="Airwallex\Payments\Model\Methods\KlarnaMethod">
        <arguments>
            <argument name="eventManager" xsi:type="object">Magento\Framework\Event\ManagerInterface</argument>
            <argument name="valueHandlerPool" xsi:type="object">AirwallexPaymentKlarnaValueHandlerPool</argument>
            <argument name="paymentDataObjectFactory" xsi:type="object">Magento\Payment\Gateway\Data\PaymentDataObjectFactory</argument>
            <argument name="code" xsi:type="const">Airwallex\Payments\Model\Methods\KlarnaMethod::CODE</argument>
            <argument name="formBlockType" xsi:type="string">Magento\Payment\Block\Form</argument>
            <argument name="infoBlockType" xsi:type="string">Magento\Payment\Block\Info</argument>
            <argument name="logger" xsi:type="object">Airwallex\Payments\Logger\Logger</argument>
            <argument name="validatorPool" xsi:type="object">AirwallexPaymentsKlarnaValidatorPool</argument>
        </arguments>
    </virtualType>
    <!-- Afterpay Method -->
    <virtualType name="AirwallexPaymentAfterpayCountryValidator" type="Magento\Payment\Gateway\Validator\CountryValidator">
        <arguments>
            <argument name="config" xsi:type="object">AirwallexPaymentAfterpayConfig</argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentsAfterpayValidatorPool" type="Magento\Payment\Gateway\Validator\ValidatorPool">
        <arguments>
            <argument name="validators" xsi:type="array">
                <item name="country" xsi:type="string">AirwallexPaymentAfterpayCountryValidator</item>
            </argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentAfterpayConfig" type="Magento\Payment\Gateway\Config\Config">
        <arguments>
            <argument name="methodCode" xsi:type="const">Airwallex\Payments\Model\Methods\AfterpayMethod::CODE</argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentAfterpayConfigValueHandler" type="Magento\Payment\Gateway\Config\ConfigValueHandler">
        <arguments>
            <argument name="configInterface" xsi:type="object">AirwallexPaymentAfterpayConfig</argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentAfterpayValueHandlerPool" type="Magento\Payment\Gateway\Config\ValueHandlerPool">
        <arguments>
            <argument name="handlers" xsi:type="array">
                <item name="default" xsi:type="string">AirwallexPaymentAfterpayConfigValueHandler</item>
            </argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentsAfterpayGatewayFacade" type="Airwallex\Payments\Model\Methods\AfterpayMethod">
        <arguments>
            <argument name="eventManager" xsi:type="object">Magento\Framework\Event\ManagerInterface</argument>
            <argument name="valueHandlerPool" xsi:type="object">AirwallexPaymentAfterpayValueHandlerPool</argument>
            <argument name="paymentDataObjectFactory" xsi:type="object">Magento\Payment\Gateway\Data\PaymentDataObjectFactory</argument>
            <argument name="code" xsi:type="const">Airwallex\Payments\Model\Methods\AfterpayMethod::CODE</argument>
            <argument name="formBlockType" xsi:type="string">Magento\Payment\Block\Form</argument>
            <argument name="infoBlockType" xsi:type="string">Magento\Payment\Block\Info</argument>
            <argument name="logger" xsi:type="object">Airwallex\Payments\Logger\Logger</argument>
            <argument name="validatorPool" xsi:type="object">AirwallexPaymentsAfterpayValidatorPool</argument>
        </arguments>
    </virtualType>
    <!-- BankTransfer Method -->
    <virtualType name="AirwallexPaymentBankTransferCountryValidator" type="Magento\Payment\Gateway\Validator\CountryValidator">
        <arguments>
            <argument name="config" xsi:type="object">AirwallexPaymentBankTransferConfig</argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentsBankTransferValidatorPool" type="Magento\Payment\Gateway\Validator\ValidatorPool">
        <arguments>
            <argument name="validators" xsi:type="array">
                <item name="country" xsi:type="string">AirwallexPaymentBankTransferCountryValidator</item>
            </argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentBankTransferConfig" type="Magento\Payment\Gateway\Config\Config">
        <arguments>
            <argument name="methodCode" xsi:type="const">Airwallex\Payments\Model\Methods\RedirectMethod::BANK_TRANSFER_CODE</argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentBankTransferConfigValueHandler" type="Magento\Payment\Gateway\Config\ConfigValueHandler">
        <arguments>
            <argument name="configInterface" xsi:type="object">AirwallexPaymentBankTransferConfig</argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentBankTransferValueHandlerPool" type="Magento\Payment\Gateway\Config\ValueHandlerPool">
        <arguments>
            <argument name="handlers" xsi:type="array">
                <item name="default" xsi:type="string">AirwallexPaymentBankTransferConfigValueHandler</item>
            </argument>
        </arguments>
    </virtualType>
    <virtualType name="AirwallexPaymentsBankTransferGatewayFacade" type="Airwallex\Payments\Model\Methods\RedirectMethod">
        <arguments>
            <argument name="eventManager" xsi:type="object">Magento\Framework\Event\ManagerInterface</argument>
            <argument name="valueHandlerPool" xsi:type="object">AirwallexPaymentBankTransferValueHandlerPool</argument>
            <argument name="paymentDataObjectFactory" xsi:type="object">Magento\Payment\Gateway\Data\PaymentDataObjectFactory</argument>
            <argument name="code" xsi:type="const">Airwallex\Payments\Model\Methods\RedirectMethod::BANK_TRANSFER_CODE</argument>
            <argument name="formBlockType" xsi:type="string">Magento\Payment\Block\Form</argument>
            <argument name="infoBlockType" xsi:type="string">Magento\Payment\Block\Info</argument>
            <argument name="logger" xsi:type="object">Airwallex\Payments\Logger\Logger</argument>
            <argument name="validatorPool" xsi:type="object">AirwallexPaymentsBankTransferValidatorPool</argument>
        </arguments>
    </virtualType>
</config>
