From ea7d6ff9b29bd5f65e24d81b4c90ed8c3ff9aff6 Mon Sep 17 00:00:00 2001 From: Mark Pinkster Date: Wed, 31 Dec 2025 11:41:37 +0100 Subject: [PATCH] Basic functionality --- api.php | 137 + composer.json | 6 + composer.lock | 478 +++ index.html | 204 + vendor/autoload.php | 22 + vendor/automattic/woocommerce/LICENSE | 21 + vendor/automattic/woocommerce/README.md | 169 + vendor/automattic/woocommerce/composer.json | 38 + .../woocommerce/src/WooCommerce/Client.php | 109 + .../src/WooCommerce/HttpClient/BasicAuth.php | 96 + .../src/WooCommerce/HttpClient/HttpClient.php | 487 +++ .../HttpClient/HttpClientException.php | 71 + .../src/WooCommerce/HttpClient/OAuth.php | 268 ++ .../src/WooCommerce/HttpClient/Options.php | 182 + .../src/WooCommerce/HttpClient/Request.php | 187 + .../src/WooCommerce/HttpClient/Response.php | 127 + vendor/composer/ClassLoader.php | 579 +++ vendor/composer/InstalledVersions.php | 396 ++ vendor/composer/LICENSE | 21 + vendor/composer/autoload_classmap.php | 10 + vendor/composer/autoload_namespaces.php | 9 + vendor/composer/autoload_psr4.php | 15 + vendor/composer/autoload_real.php | 38 + vendor/composer/autoload_static.php | 74 + vendor/composer/ca-bundle/LICENSE | 19 + vendor/composer/ca-bundle/README.md | 85 + vendor/composer/ca-bundle/composer.json | 54 + vendor/composer/ca-bundle/res/cacert.pem | 3511 +++++++++++++++++ vendor/composer/ca-bundle/src/CaBundle.php | 322 ++ vendor/composer/installed.json | 486 +++ vendor/composer/installed.php | 104 + vendor/composer/platform_check.php | 25 + vendor/mollie/mollie-api-php/CHANGELOG.md | 214 + vendor/mollie/mollie-api-php/LICENSE | 8 + vendor/mollie/mollie-api-php/README.md | 117 + vendor/mollie/mollie-api-php/UPGRADING.md | 204 + vendor/mollie/mollie-api-php/bin/release | 158 + vendor/mollie/mollie-api-php/composer.json | 87 + .../mollie/mollie-api-php/docs/debugging.md | 103 + .../docs/endpoint-collections.md | 730 ++++ .../mollie/mollie-api-php/docs/exceptions.md | 137 + .../mollie-api-php/docs/http-adapters.md | 46 + .../mollie/mollie-api-php/docs/idempotency.md | 60 + vendor/mollie/mollie-api-php/docs/payments.md | 94 + .../mollie-api-php/docs/recipes/README.md | 32 + .../recipes/capabilities/list-capabilities.md | 67 + .../create-balance-transfer.md | 151 + .../get-balance-transfer.md | 105 + .../list-balance-transfers.md | 177 + .../recipes/customers/customer-payments.md | 138 + .../recipes/customers/manage-customers.md | 125 + .../docs/recipes/invoices/list-invoices.md | 84 + .../docs/recipes/mandates/manage-mandates.md | 97 + .../recipes/onboarding/create-client-link.md | 84 + .../payment-links/manage-payment-links.md | 71 + .../payments/create-capturable-payment.md | 60 + .../docs/recipes/payments/create-capture.md | 49 + .../recipes/payments/create-ideal-payment.md | 56 + .../recipes/payments/create-payment-oauth.md | 64 + .../docs/recipes/payments/create-payment.md | 50 + .../recipes/payments/create-routed-payment.md | 94 + .../docs/recipes/payments/handle-webhook.md | 98 + .../docs/recipes/payments/list-methods.md | 49 + .../docs/recipes/payments/list-payments.md | 69 + .../docs/recipes/payments/refund-payment.md | 66 + .../recipes/payments/retrieve-captures.md | 74 + .../docs/recipes/payments/update-payment.md | 65 + .../docs/recipes/profiles/manage-profiles.md | 112 + .../sales-invoices/manage-sales-invoices.md | 47 + .../docs/recipes/sessions/manage-sessions.md | 55 + .../recipes/settlements/list-settlements.md | 66 + .../subscriptions/manage-subscriptions.md | 112 + .../docs/recipes/webhooks/create-webhook.md | 102 + .../docs/recipes/webhooks/manage-webhooks.md | 205 + .../webhooks/signature-verification.md | 91 + .../docs/recipes/webhooks/webhook-events.md | 162 + vendor/mollie/mollie-api-php/docs/requests.md | 53 + .../mollie/mollie-api-php/docs/responses.md | 84 + vendor/mollie/mollie-api-php/docs/retries.md | 91 + vendor/mollie/mollie-api-php/docs/testing.md | 239 ++ vendor/mollie/mollie-api-php/docs/webhooks.md | 136 + .../src/CompatibilityChecker.php | 67 + vendor/mollie/mollie-api-php/src/Config.php | 45 + .../src/Contracts/Arrayable.php | 8 + .../src/Contracts/Authenticatable.php | 12 + .../src/Contracts/Authenticator.php | 10 + .../src/Contracts/Connector.php | 28 + .../Contracts/EmbeddedResourcesContract.php | 8 + .../src/Contracts/HasPayload.php | 8 + .../src/Contracts/HttpAdapterContract.php | 26 + .../src/Contracts/IdempotencyContract.php | 12 + .../IdempotencyKeyGeneratorContract.php | 8 + .../src/Contracts/IsIteratable.php | 10 + .../src/Contracts/IsResponseAware.php | 15 + .../src/Contracts/IsWrapper.php | 16 + .../MollieHttpAdapterPickerContract.php | 11 + .../src/Contracts/PayloadRepository.php | 14 + .../src/Contracts/Repository.php | 64 + .../src/Contracts/RequestMiddleware.php | 13 + .../src/Contracts/Resolvable.php | 7 + .../src/Contracts/ResponseMiddleware.php | 14 + .../src/Contracts/RetryStrategyContract.php | 21 + .../src/Contracts/Stringable.php | 13 + .../Contracts/SupportsDebuggingContract.php | 12 + .../src/Contracts/SupportsTestmode.php | 8 + .../Contracts/SupportsTestmodeInPayload.php | 8 + .../src/Contracts/SupportsTestmodeInQuery.php | 8 + .../mollie-api-php/src/Contracts/Testable.php | 8 + .../src/Contracts/ViableResponse.php | 11 + .../BalanceEndpointCollection.php | 98 + .../BalanceReportEndpointCollection.php | 49 + .../BalanceTransactionEndpointCollection.php | 102 + .../CapabilityEndpointCollection.php | 36 + .../ChargebackEndpointCollection.php | 62 + .../ClientEndpointCollection.php | 77 + .../ClientLinkEndpointCollection.php | 27 + ...nnectBalanceTransferEndpointCollection.php | 91 + .../CustomerEndpointCollection.php | 122 + .../CustomerPaymentsEndpointCollection.php | 119 + .../EndpointCollection/EndpointCollection.php | 24 + .../InvoiceEndpointCollection.php | 70 + .../MandateEndpointCollection.php | 169 + .../MethodEndpointCollection.php | 80 + .../MethodIssuerEndpointCollection.php | 31 + .../OnboardingEndpointCollection.php | 14 + .../OrganizationEndpointCollection.php | 53 + .../OrganizationPartnerEndpointCollection.php | 17 + .../PaymentCaptureEndpointCollection.php | 136 + .../PaymentChargebackEndpointCollection.php | 108 + .../PaymentEndpointCollection.php | 199 + .../PaymentLinkEndpointCollection.php | 115 + .../PaymentLinkPaymentEndpointCollection.php | 101 + .../PaymentRefundEndpointCollection.php | 167 + .../PaymentRouteEndpointCollection.php | 98 + .../PermissionEndpointCollection.php | 41 + .../ProfileEndpointCollection.php | 126 + .../ProfileMethodEndpointCollection.php | 153 + .../RefundEndpointCollection.php | 65 + .../SalesInvoiceEndpointCollection.php | 92 + .../SessionEndpointCollection.php | 125 + .../SettlementCaptureEndpointCollection.php | 87 + ...SettlementChargebackEndpointCollection.php | 87 + .../SettlementEndpointCollection.php | 83 + .../SettlementPaymentEndpointCollection.php | 85 + .../SettlementRefundEndpointCollection.php | 80 + .../SubscriptionEndpointCollection.php | 209 + .../SubscriptionPaymentEndpointCollection.php | 89 + .../TerminalEndpointCollection.php | 70 + .../WalletEndpointCollection.php | 30 + .../WebhookEndpointCollection.php | 135 + .../WebhookEventEndpointCollection.php | 23 + .../src/Exceptions/ApiException.php | 129 + .../src/Exceptions/ClientException.php | 7 + ...EmbeddedResourcesNotParseableException.php | 7 + .../src/Exceptions/ForbiddenException.php | 21 + .../IncompatiblePlatformException.php | 16 + .../InvalidAuthenticationException.php | 19 + .../Exceptions/InvalidSignatureException.php | 7 + .../src/Exceptions/JsonParseException.php | 20 + .../src/Exceptions/LogicException.php | 7 + .../Exceptions/MethodNotAllowedException.php | 21 + .../MissingAuthenticationException.php | 11 + .../src/Exceptions/MollieException.php | 9 + .../Exceptions/NetworkRequestException.php | 47 + .../src/Exceptions/NotFoundException.php | 21 + .../src/Exceptions/RequestException.php | 45 + .../Exceptions/RequestTimeoutException.php | 23 + .../RetryableNetworkRequestException.php | 27 + .../src/Exceptions/ServerException.php | 7 + .../ServiceUnavailableException.php | 25 + .../Exceptions/TooManyRequestsException.php | 21 + .../src/Exceptions/UnauthorizedException.php | 21 + .../UnrecognizedClientException.php | 7 + .../src/Exceptions/ValidationException.php | 42 + .../ApplePayPaymentSessionRequestFactory.php | 17 + .../src/Factories/ApplicationFeeFactory.php | 16 + .../CreateClientLinkRequestFactory.php | 21 + ...teConnectBalanceTransferRequestFactory.php | 20 + .../CreateCustomerPaymentRequestFactory.php | 56 + .../CreateCustomerRequestFactory.php | 18 + ...reateDelayedPaymentRouteRequestFactory.php | 33 + .../Factories/CreateMandateRequestFactory.php | 36 + .../CreatePaymentCaptureRequestFactory.php | 25 + .../CreatePaymentLinkRequestFactory.php | 57 + .../CreatePaymentRefundRequestFactory.php | 31 + .../Factories/CreatePaymentRequestFactory.php | 49 + .../Factories/CreateProfileRequestFactory.php | 21 + .../CreateSalesInvoiceRequestFactory.php | 41 + .../Factories/CreateSessionRequestFactory.php | 20 + .../CreateSubscriptionRequestFactory.php | 35 + .../Factories/CreateWebhookRequestFactory.php | 17 + .../mollie-api-php/src/Factories/Factory.php | 85 + ...llPaginatedSubscriptionsRequestFactory.php | 17 + .../GetAllPaymentMethodsRequestFactory.php | 23 + .../GetBalanceReportRequestFactory.php | 36 + .../src/Factories/GetClientRequestFactory.php | 28 + .../GetEnabledMethodsRequestFactory.php | 27 + .../src/Factories/GetMethodRequestFactory.php | 29 + .../GetPaginatedChargebacksRequestFactory.php | 21 + .../GetPaginatedClientRequestFactory.php | 22 + ...aginatedCustomerPaymentsRequestFactory.php | 26 + .../GetPaginatedInvoiceRequestFactory.php | 18 + ...PaginatedPaymentCapturesRequestFactory.php | 28 + ...inatedPaymentChargebacksRequestFactory.php | 28 + ...tPaginatedPaymentRefundsRequestFactory.php | 28 + .../GetPaginatedRefundsRequestFactory.php | 21 + ...inatedSettlementCapturesRequestFactory.php | 29 + ...tedSettlementChargebacksRequestFactory.php | 29 + ...PaginatedSettlementRefundsQueryFactory.php | 29 + .../GetPaginatedSettlementsRequestFactory.php | 17 + .../GetPaymentCaptureRequestFactory.php | 30 + .../GetPaymentChargebackRequestFactory.php | 30 + .../GetPaymentRefundRequestFactory.php | 30 + .../Factories/GetPaymentRequestFactory.php | 34 + .../InvoiceLineCollectionFactory.php | 16 + .../src/Factories/InvoiceLineFactory.php | 20 + .../src/Factories/MoneyFactory.php | 20 + .../Factories/OrderLineCollectionFactory.php | 16 + .../src/Factories/OrderLineFactory.php | 27 + .../src/Factories/PaginatedQueryFactory.php | 16 + .../PaymentRouteCollectionFactory.php | 38 + .../src/Factories/RecipientFactory.php | 30 + .../RecurringBillingCycleFactory.php | 20 + .../RefundRouteCollectionFactory.php | 31 + .../src/Factories/RequestFactory.php | 83 + .../SortablePaginatedQueryFactory.php | 17 + .../UpdateCustomerRequestFactory.php | 26 + .../UpdatePaymentLinkRequestFactory.php | 25 + .../Factories/UpdatePaymentRequestFactory.php | 32 + .../UpdatePaymentRouteRequestFactory.php | 33 + .../Factories/UpdateProfileRequestFactory.php | 30 + .../UpdateSalesInvoiceRequestFactory.php | 40 + .../UpdateSubscriptionRequestFactory.php | 35 + .../Factories/UpdateWebhookRequestFactory.php | 25 + .../src/Fake/ErrorResponseBuilder.php | 51 + .../src/Fake/Events/blueprint.json | 17 + .../src/Fake/FakeResponseLoader.php | 35 + .../src/Fake/ListResponseBuilder.php | 54 + .../mollie-api-php/src/Fake/MockEvent.php | 84 + .../src/Fake/MockMollieClient.php | 33 + .../src/Fake/MockMollieHttpAdapter.php | 149 + .../mollie-api-php/src/Fake/MockResponse.php | 153 + .../src/Fake/ResourceResponseBuilder.php | 102 + .../src/Fake/Responses/apple-pay-session.json | 10 + .../src/Fake/Responses/balance-list.json | 98 + .../src/Fake/Responses/balance-report.json | 149 + .../Responses/balance-transaction-list.json | 63 + .../Fake/Responses/balance-transaction.json | 31 + .../src/Fake/Responses/balance.json | 42 + .../src/Fake/Responses/capability-list.json | 70 + .../src/Fake/Responses/capability.json | 28 + .../src/Fake/Responses/capture-list.json | 45 + .../src/Fake/Responses/capture.json | 27 + .../src/Fake/Responses/chargeback-list.json | 210 + .../src/Fake/Responses/chargeback.json | 33 + .../src/Fake/Responses/client-link.json | 14 + .../src/Fake/Responses/client-list.json | 33 + .../src/Fake/Responses/client.json | 52 + .../connect-balance-transfer-list.json | 82 + .../Responses/connect-balance-transfer.json | 24 + .../src/Fake/Responses/current-profile.json | 47 + .../Responses/cursor-collection-next.json | 18 + .../src/Fake/Responses/cursor-collection.json | 15 + .../src/Fake/Responses/customer-list.json | 36 + .../src/Fake/Responses/customer.json | 27 + .../src/Fake/Responses/empty-list.json | 18 + .../src/Fake/Responses/error.json | 12 + .../src/Fake/Responses/invoice-list.json | 61 + .../src/Fake/Responses/invoice.json | 47 + .../src/Fake/Responses/issuer.json | 16 + .../src/Fake/Responses/mandate-list.json | 44 + .../src/Fake/Responses/mandate.json | 30 + .../src/Fake/Responses/method-list.json | 55 + .../src/Fake/Responses/method.json | 29 + .../src/Fake/Responses/onboarding.json | 26 + .../src/Fake/Responses/organization.json | 29 + .../src/Fake/Responses/partner-status.json | 19 + .../src/Fake/Responses/payment-link-list.json | 49 + .../src/Fake/Responses/payment-link.json | 31 + .../src/Fake/Responses/payment-list.json | 57 + .../src/Fake/Responses/payment-route.json | 13 + .../src/Fake/Responses/payment.json | 37 + .../src/Fake/Responses/permission-list.json | 41 + .../src/Fake/Responses/permission.json | 16 + .../src/Fake/Responses/profile-list.json | 43 + .../src/Fake/Responses/profile.json | 29 + .../src/Fake/Responses/refund-list.json | 48 + .../src/Fake/Responses/refund.json | 28 + .../src/Fake/Responses/route-list.json | 67 + .../src/Fake/Responses/route.json | 13 + .../Fake/Responses/sales-invoice-list.json | 83 + .../src/Fake/Responses/sales-invoice.json | 81 + .../src/Fake/Responses/session-list.json | 53 + .../src/Fake/Responses/session.json | 31 + .../src/Fake/Responses/settlement-list.json | 41 + .../src/Fake/Responses/settlement.json | 125 + .../src/Fake/Responses/subscription-list.json | 53 + .../src/Fake/Responses/subscription.json | 35 + .../src/Fake/Responses/terminal-list.json | 41 + .../src/Fake/Responses/terminal.json | 23 + .../Fake/Responses/unprocessable-entity.json | 5 + .../src/Fake/Responses/webhook-event.json | 30 + .../src/Fake/Responses/webhook-list.json | 54 + .../src/Fake/Responses/webhook-test.json | 6 + .../src/Fake/Responses/webhook.json | 20 + .../src/Fake/SequenceMockResponse.php | 46 + .../src/Http/Adapter/CurlErrorMapper.php | 72 + .../src/Http/Adapter/CurlFactory.php | 116 + .../Adapter/CurlInitializationException.php | 39 + .../Http/Adapter/CurlMollieHttpAdapter.php | 110 + .../Http/Adapter/GuzzleMollieHttpAdapter.php | 112 + .../Http/Adapter/MollieHttpAdapterPicker.php | 46 + .../Http/Adapter/PSR18MollieHttpAdapter.php | 119 + .../Http/Auth/AccessTokenAuthenticator.php | 18 + .../src/Http/Auth/ApiKeyAuthenticator.php | 27 + .../Http/Auth/BearerTokenAuthenticator.php | 22 + .../src/Http/Auth/TokenValidator.php | 19 + .../mollie-api-php/src/Http/Data/Address.php | 81 + .../src/Http/Data/ApplicationFee.php | 28 + .../src/Http/Data/DataCollection.php | 132 + .../mollie-api-php/src/Http/Data/Date.php | 13 + .../mollie-api-php/src/Http/Data/DateTime.php | 13 + .../mollie-api-php/src/Http/Data/Discount.php | 31 + .../src/Http/Data/EmailDetails.php | 31 + .../src/Http/Data/InvoiceLine.php | 43 + .../mollie-api-php/src/Http/Data/Money.php | 31 + .../src/Http/Data/OrderLine.php | 83 + .../mollie-api-php/src/Http/Data/Owner.php | 41 + .../src/Http/Data/OwnerAddress.php | 46 + .../src/Http/Data/PaginatedQuery.php | 28 + .../src/Http/Data/PaymentDetails.php | 31 + .../src/Http/Data/PaymentRoute.php | 40 + .../src/Http/Data/Recipient.php | 98 + .../src/Http/Data/RecurringBillingCycle.php | 49 + .../src/Http/Data/RefundRoute.php | 31 + .../src/Http/Data/SortablePaginatedQuery.php | 28 + .../mollie-api-php/src/Http/Data/Temporal.php | 50 + .../src/Http/Data/TransferParty.php | 36 + .../src/Http/LinearRetryStrategy.php | 34 + .../mollie-api-php/src/Http/Middleware.php | 115 + .../Http/Middleware/ApplyIdempotencyKey.php | 42 + .../Middleware/ConvertResponseToException.php | 49 + .../src/Http/Middleware/Handler.php | 36 + .../src/Http/Middleware/Handlers.php | 81 + .../src/Http/Middleware/Hydrate.php | 23 + .../Http/Middleware/MiddlewarePriority.php | 12 + .../Http/Middleware/ResetIdempotencyKey.php | 17 + .../src/Http/PendingRequest.php | 153 + .../PendingRequest/AuthenticateRequest.php | 22 + .../Http/PendingRequest/HandleTestmode.php | 64 + .../src/Http/PendingRequest/MergeBody.php | 28 + .../PendingRequest/MergeRequestProperties.php | 30 + .../src/Http/PendingRequest/SetUserAgent.php | 25 + .../mollie-api-php/src/Http/Request.php | 39 + .../src/Http/RequestSanitizer.php | 48 + .../ApplePayPaymentSessionRequest.php | 44 + .../Requests/CancelPaymentRefundRequest.php | 30 + .../Http/Requests/CancelPaymentRequest.php | 29 + .../Http/Requests/CancelSessionRequest.php | 25 + .../Requests/CancelSubscriptionRequest.php | 41 + .../Http/Requests/CreateClientLinkRequest.php | 65 + .../CreateConnectBalanceTransferRequest.php | 69 + .../Requests/CreateCustomerPaymentRequest.php | 74 + .../Http/Requests/CreateCustomerRequest.php | 53 + .../CreateDelayedPaymentRouteRequest.php | 54 + .../Http/Requests/CreateMandateRequest.php | 88 + .../Requests/CreatePaymentCaptureRequest.php | 59 + .../Requests/CreatePaymentLinkRequest.php | 98 + .../Requests/CreatePaymentRefundRequest.php | 70 + .../Http/Requests/CreatePaymentRequest.php | 186 + .../Http/Requests/CreateProfileRequest.php | 76 + .../Requests/CreateSalesInvoiceRequest.php | 130 + .../Http/Requests/CreateSessionRequest.php | 64 + .../Requests/CreateSubscriptionRequest.php | 116 + .../Http/Requests/CreateWebhookRequest.php | 61 + .../Http/Requests/DeleteCustomerRequest.php | 27 + .../Requests/DeletePaymentLinkRequest.php | 27 + .../Http/Requests/DeleteProfileRequest.php | 26 + .../Requests/DeleteSalesInvoiceRequest.php | 27 + .../Http/Requests/DeleteWebhookRequest.php | 32 + .../Requests/DisableMethodIssuerRequest.php | 32 + .../Http/Requests/DisableMethodRequest.php | 29 + .../Http/Requests/DynamicDeleteRequest.php | 26 + .../src/Http/Requests/DynamicGetRequest.php | 23 + .../Http/Requests/DynamicPaginatedRequest.php | 12 + .../src/Http/Requests/DynamicPostRequest.php | 29 + .../src/Http/Requests/DynamicPutRequest.php | 29 + .../src/Http/Requests/DynamicRequest.php | 22 + .../Requests/EnableMethodIssuerRequest.php | 55 + .../src/Http/Requests/EnableMethodRequest.php | 34 + .../Http/Requests/GetAllMethodsRequest.php | 64 + .../GetAllPaginatedSubscriptionsRequest.php | 51 + .../Http/Requests/GetBalanceReportRequest.php | 54 + .../src/Http/Requests/GetBalanceRequest.php | 29 + .../Http/Requests/GetCapabilityRequest.php | 28 + .../src/Http/Requests/GetClientRequest.php | 49 + .../GetConnectBalanceTransferRequest.php | 35 + .../Requests/GetCurrentProfileRequest.php | 22 + .../src/Http/Requests/GetCustomerRequest.php | 29 + .../Requests/GetEnabledMethodsRequest.php | 108 + .../src/Http/Requests/GetInvoiceRequest.php | 28 + .../src/Http/Requests/GetMandateRequest.php | 35 + .../src/Http/Requests/GetMethodRequest.php | 54 + .../Requests/GetOnboardingStatusRequest.php | 18 + .../GetOrganizationPartnerStatusRequest.php | 18 + .../Http/Requests/GetOrganizationRequest.php | 26 + .../Requests/GetPaginatedBalanceRequest.php | 20 + .../GetPaginatedBalanceTransactionRequest.php | 34 + .../GetPaginatedChargebacksRequest.php | 37 + .../Requests/GetPaginatedClientRequest.php | 39 + .../GetPaginatedCustomerPaymentsRequest.php | 40 + .../Requests/GetPaginatedCustomerRequest.php | 20 + .../Requests/GetPaginatedInvoiceRequest.php | 35 + .../Requests/GetPaginatedMandateRequest.php | 32 + .../GetPaginatedPaymentCapturesRequest.php | 40 + .../GetPaginatedPaymentChargebacksRequest.php | 36 + ...GetPaginatedPaymentLinkPaymentsRequest.php | 35 + .../GetPaginatedPaymentLinksRequest.php | 23 + .../GetPaginatedPaymentRefundsRequest.php | 40 + .../Requests/GetPaginatedPaymentsRequest.php | 26 + .../Requests/GetPaginatedProfilesRequest.php | 25 + .../Requests/GetPaginatedRefundsRequest.php | 37 + .../GetPaginatedSalesInvoicesRequest.php | 20 + .../GetPaginatedSettlementCapturesRequest.php | 44 + ...tPaginatedSettlementChargebacksRequest.php | 31 + .../GetPaginatedSettlementPaymentsRequest.php | 35 + .../GetPaginatedSettlementRefundsRequest.php | 43 + .../GetPaginatedSettlementsRequest.php | 36 + ...etPaginatedSubscriptionPaymentsRequest.php | 38 + .../GetPaginatedSubscriptionsRequest.php | 35 + .../Requests/GetPaginatedTerminalsRequest.php | 23 + .../Requests/GetPaginatedWebhooksRequest.php | 48 + .../Requests/GetPaymentCaptureRequest.php | 47 + .../Requests/GetPaymentChargebackRequest.php | 46 + .../Http/Requests/GetPaymentLinkRequest.php | 35 + .../Http/Requests/GetPaymentRefundRequest.php | 49 + .../src/Http/Requests/GetPaymentRequest.php | 76 + .../Http/Requests/GetPermissionRequest.php | 29 + .../src/Http/Requests/GetProfileRequest.php | 29 + .../Http/Requests/GetSalesInvoiceRequest.php | 32 + .../src/Http/Requests/GetSessionRequest.php | 25 + .../Http/Requests/GetSettlementRequest.php | 26 + .../Http/Requests/GetSubscriptionRequest.php | 35 + .../src/Http/Requests/GetTerminalRequest.php | 32 + .../Http/Requests/GetWebhookEventRequest.php | 34 + .../src/Http/Requests/GetWebhookRequest.php | 35 + .../Http/Requests/ListCapabilitiesRequest.php | 21 + .../ListConnectBalanceTransfersRequest.php | 26 + .../Requests/ListPaymentRoutesRequest.php | 29 + .../Http/Requests/ListPermissionsRequest.php | 21 + .../src/Http/Requests/PaginatedRequest.php | 33 + .../ReleasePaymentAuthorizationRequest.php | 24 + .../Requests/ResourceHydratableRequest.php | 64 + .../Http/Requests/RevokeMandateRequest.php | 33 + .../Requests/SortablePaginatedRequest.php | 16 + .../src/Http/Requests/TestWebhookRequest.php | 38 + .../Http/Requests/UpdateCustomerRequest.php | 59 + .../Requests/UpdatePaymentLinkRequest.php | 51 + .../Http/Requests/UpdatePaymentRequest.php | 89 + .../Requests/UpdatePaymentRouteRequest.php | 59 + .../Http/Requests/UpdateProfileRequest.php | 79 + .../Requests/UpdateSalesInvoiceRequest.php | 101 + .../Requests/UpdateSubscriptionRequest.php | 99 + .../Http/Requests/UpdateWebhookRequest.php | 75 + .../mollie-api-php/src/Http/Response.php | 142 + .../src/Http/ResponseStatusCode.php | 132 + .../DefaultIdempotencyKeyGenerator.php | 45 + .../FakeIdempotencyKeyGenerator.php | 22 + .../mollie-api-php/src/MollieApiClient.php | 204 + .../src/Repositories/ArrayStore.php | 73 + .../Repositories/JsonPayloadRepository.php | 21 + .../src/Resources/AnyResource.php | 36 + .../mollie-api-php/src/Resources/Balance.php | 127 + .../src/Resources/BalanceCollection.php | 16 + .../src/Resources/BalanceReport.php | 86 + .../src/Resources/BalanceTransaction.php | 93 + .../BalanceTransactionCollection.php | 18 + .../src/Resources/BaseCollection.php | 103 + .../src/Resources/BaseResource.php | 32 + .../src/Resources/Capability.php | 66 + .../src/Resources/CapabilityCollection.php | 16 + .../mollie-api-php/src/Resources/Capture.php | 102 + .../src/Resources/CaptureCollection.php | 16 + .../src/Resources/Chargeback.php | 81 + .../src/Resources/ChargebackCollection.php | 16 + .../mollie-api-php/src/Resources/Client.php | 50 + .../src/Resources/ClientCollection.php | 16 + .../src/Resources/ClientLink.php | 53 + .../src/Resources/ConnectBalanceTransfer.php | 99 + .../ConnectBalanceTransferCollection.php | 16 + .../src/Resources/CurrentProfile.php | 30 + .../src/Resources/CursorCollection.php | 92 + .../mollie-api-php/src/Resources/Customer.php | 213 + .../src/Resources/CustomerCollection.php | 16 + .../mollie-api-php/src/Resources/Invoice.php | 104 + .../src/Resources/InvoiceCollection.php | 16 + .../mollie-api-php/src/Resources/Issuer.php | 39 + .../src/Resources/IssuerCollection.php | 16 + .../src/Resources/LazyCollection.php | 195 + .../mollie-api-php/src/Resources/Mandate.php | 100 + .../src/Resources/MandateCollection.php | 24 + .../mollie-api-php/src/Resources/Method.php | 125 + .../src/Resources/MethodCollection.php | 13 + .../src/Resources/MethodPrice.php | 32 + .../src/Resources/MethodPriceCollection.php | 16 + .../src/Resources/Onboarding.php | 59 + .../src/Resources/Organization.php | 76 + .../mollie-api-php/src/Resources/Partner.php | 60 + .../mollie-api-php/src/Resources/Payment.php | 779 ++++ .../src/Resources/PaymentCollection.php | 16 + .../src/Resources/PaymentLink.php | 177 + .../src/Resources/PaymentLinkCollection.php | 16 + .../src/Resources/Permission.php | 31 + .../src/Resources/PermissionCollection.php | 13 + .../mollie-api-php/src/Resources/Profile.php | 204 + .../src/Resources/ProfileCollection.php | 16 + .../mollie-api-php/src/Resources/Refund.php | 174 + .../src/Resources/RefundCollection.php | 16 + .../src/Resources/ResourceCollection.php | 40 + .../src/Resources/ResourceFactory.php | 47 + .../src/Resources/ResourceHydrator.php | 115 + .../src/Resources/ResourceRegistry.php | 187 + .../src/Resources/ResourceResolver.php | 102 + .../src/Resources/ResourceWrapper.php | 51 + .../mollie-api-php/src/Resources/Route.php | 46 + .../src/Resources/RouteCollection.php | 16 + .../src/Resources/SalesInvoice.php | 173 + .../src/Resources/SalesInvoiceCollection.php | 16 + .../mollie-api-php/src/Resources/Session.php | 184 + .../src/Resources/SessionCollection.php | 16 + .../src/Resources/Settlement.php | 161 + .../src/Resources/SettlementCollection.php | 16 + .../src/Resources/Subscription.php | 209 + .../src/Resources/SubscriptionCollection.php | 16 + .../mollie-api-php/src/Resources/Terminal.php | 161 + .../src/Resources/TerminalCollection.php | 16 + .../mollie-api-php/src/Resources/Webhook.php | 152 + .../src/Resources/WebhookCollection.php | 16 + .../src/Resources/WebhookEvent.php | 81 + .../src/Resources/WrapperResource.php | 24 + .../src/Traits/ComposableFromArray.php | 36 + .../src/Traits/ForwardsCalls.php | 44 + .../src/Traits/GetAllConstants.php | 13 + .../src/Traits/HandlesAuthentication.php | 42 + .../src/Traits/HandlesDebugging.php | 109 + .../src/Traits/HandlesIdempotency.php | 80 + .../src/Traits/HandlesTestmode.php | 20 + .../src/Traits/HandlesVersions.php | 38 + .../src/Traits/HasDefaultFactories.php | 27 + .../src/Traits/HasEndpoints.php | 143 + .../mollie-api-php/src/Traits/HasHeaders.php | 21 + .../src/Traits/HasJsonPayload.php | 20 + .../src/Traits/HasMiddleware.php | 15 + .../mollie-api-php/src/Traits/HasMode.php | 19 + .../mollie-api-php/src/Traits/HasQuery.php | 21 + .../src/Traits/HasRequestProperties.php | 9 + .../mollie-api-php/src/Traits/HasResponse.php | 31 + .../src/Traits/Initializable.php | 22 + .../src/Traits/IsIteratableRequest.php | 39 + .../src/Traits/ManagesPsrRequests.php | 61 + .../src/Traits/SendsRequests.php | 81 + .../src/Types/ApprovalPrompt.php | 14 + .../src/Types/BalanceTransferFrequency.php | 28 + .../src/Types/BusinessCategory.php | 302 ++ .../src/Types/CapabilityStatus.php | 12 + .../mollie-api-php/src/Types/CaptureMode.php | 10 + .../mollie-api-php/src/Types/CheckoutFlow.php | 8 + .../mollie-api-php/src/Types/ClientQuery.php | 10 + .../Types/ConnectBalanceTransferCategory.php | 50 + .../src/Types/InvoiceStatus.php | 21 + .../src/Types/MandateMethod.php | 32 + .../src/Types/MandateStatus.php | 12 + .../mollie-api-php/src/Types/Method.php | 24 + .../mollie-api-php/src/Types/MethodQuery.php | 30 + .../src/Types/OnboardingStatus.php | 21 + .../src/Types/OrderLineCategory.php | 27 + .../src/Types/OrderLineStatus.php | 36 + .../src/Types/OrderLineType.php | 20 + .../Types/OrderLineUpdateOperationType.php | 14 + .../src/Types/PaymentIncludesQuery.php | 12 + .../src/Types/PaymentMethod.php | 205 + .../src/Types/PaymentMethodStatus.php | 51 + .../mollie-api-php/src/Types/PaymentQuery.php | 27 + .../src/Types/PaymentStatus.php | 46 + .../mollie-api-php/src/Types/PaymentTerm.php | 20 + .../src/Types/ProfileStatus.php | 21 + .../src/Types/RecipientType.php | 10 + .../mollie-api-php/src/Types/RefundStatus.php | 36 + .../src/Types/SalesInvoiceStatus.php | 21 + .../mollie-api-php/src/Types/SequenceType.php | 17 + .../src/Types/SessionStatus.php | 26 + .../src/Types/SettlementStatus.php | 26 + .../src/Types/SubscriptionStatus.php | 20 + .../src/Types/TerminalStatus.php | 21 + .../src/Types/TransferPartyType.php | 11 + .../mollie-api-php/src/Types/VatMode.php | 10 + .../mollie-api-php/src/Types/VatScheme.php | 10 + .../src/Types/WebhookStatus.php | 26 + .../mollie/mollie-api-php/src/Utils/Arr.php | 179 + .../src/Utils/DataTransformer.php | 119 + .../mollie-api-php/src/Utils/Debugger.php | 70 + .../mollie-api-php/src/Utils/Factories.php | 31 + .../mollie/mollie-api-php/src/Utils/Str.php | 49 + .../mollie/mollie-api-php/src/Utils/Url.php | 53 + .../mollie-api-php/src/Utils/Utility.php | 138 + .../Events/BalanceTransactionCreated.php | 13 + .../src/Webhooks/Events/BaseEvent.php | 62 + .../Events/ConnectBalanceTransferFailed.php | 15 + .../ConnectBalanceTransferSucceeded.php | 15 + .../src/Webhooks/Events/PaymentLinkPaid.php | 13 + .../Webhooks/Events/SalesInvoiceCanceled.php | 13 + .../Webhooks/Events/SalesInvoiceCreated.php | 13 + .../Webhooks/Events/SalesInvoiceIssued.php | 13 + .../src/Webhooks/Events/SalesInvoicePaid.php | 13 + .../src/Webhooks/SignatureValidator.php | 161 + .../src/Webhooks/WebhookEntity.php | 153 + .../src/Webhooks/WebhookEventMapper.php | 141 + .../src/Webhooks/WebhookEventType.php | 68 + vendor/nyholm/psr7/CHANGELOG.md | 172 + vendor/nyholm/psr7/LICENSE | 21 + vendor/nyholm/psr7/README.md | 108 + vendor/nyholm/psr7/composer.json | 49 + .../psr7/src/Factory/HttplugFactory.php | 53 + .../nyholm/psr7/src/Factory/Psr17Factory.php | 78 + vendor/nyholm/psr7/src/MessageTrait.php | 235 ++ vendor/nyholm/psr7/src/Request.php | 47 + vendor/nyholm/psr7/src/RequestTrait.php | 127 + vendor/nyholm/psr7/src/Response.php | 93 + vendor/nyholm/psr7/src/ServerRequest.php | 201 + vendor/nyholm/psr7/src/Stream.php | 399 ++ vendor/nyholm/psr7/src/StreamTrait.php | 57 + vendor/nyholm/psr7/src/UploadedFile.php | 179 + vendor/nyholm/psr7/src/Uri.php | 356 ++ vendor/psr/http-client/CHANGELOG.md | 31 + vendor/psr/http-client/LICENSE | 19 + vendor/psr/http-client/README.md | 12 + vendor/psr/http-client/composer.json | 30 + .../src/ClientExceptionInterface.php | 10 + .../psr/http-client/src/ClientInterface.php | 20 + .../src/NetworkExceptionInterface.php | 24 + .../src/RequestExceptionInterface.php | 24 + vendor/psr/http-factory/LICENSE | 21 + vendor/psr/http-factory/README.md | 12 + vendor/psr/http-factory/composer.json | 38 + .../src/RequestFactoryInterface.php | 18 + .../src/ResponseFactoryInterface.php | 18 + .../src/ServerRequestFactoryInterface.php | 24 + .../src/StreamFactoryInterface.php | 45 + .../src/UploadedFileFactoryInterface.php | 34 + .../http-factory/src/UriFactoryInterface.php | 17 + vendor/psr/http-message/CHANGELOG.md | 36 + vendor/psr/http-message/LICENSE | 19 + vendor/psr/http-message/README.md | 16 + vendor/psr/http-message/composer.json | 26 + .../psr/http-message/docs/PSR7-Interfaces.md | 130 + vendor/psr/http-message/docs/PSR7-Usage.md | 159 + .../psr/http-message/src/MessageInterface.php | 187 + .../psr/http-message/src/RequestInterface.php | 130 + .../http-message/src/ResponseInterface.php | 68 + .../src/ServerRequestInterface.php | 261 ++ .../psr/http-message/src/StreamInterface.php | 158 + .../src/UploadedFileInterface.php | 123 + vendor/psr/http-message/src/UriInterface.php | 324 ++ 663 files changed, 44977 insertions(+) create mode 100644 api.php create mode 100644 composer.json create mode 100644 composer.lock create mode 100644 index.html create mode 100644 vendor/autoload.php create mode 100644 vendor/automattic/woocommerce/LICENSE create mode 100644 vendor/automattic/woocommerce/README.md create mode 100644 vendor/automattic/woocommerce/composer.json create mode 100644 vendor/automattic/woocommerce/src/WooCommerce/Client.php create mode 100644 vendor/automattic/woocommerce/src/WooCommerce/HttpClient/BasicAuth.php create mode 100644 vendor/automattic/woocommerce/src/WooCommerce/HttpClient/HttpClient.php create mode 100644 vendor/automattic/woocommerce/src/WooCommerce/HttpClient/HttpClientException.php create mode 100644 vendor/automattic/woocommerce/src/WooCommerce/HttpClient/OAuth.php create mode 100644 vendor/automattic/woocommerce/src/WooCommerce/HttpClient/Options.php create mode 100644 vendor/automattic/woocommerce/src/WooCommerce/HttpClient/Request.php create mode 100644 vendor/automattic/woocommerce/src/WooCommerce/HttpClient/Response.php create mode 100644 vendor/composer/ClassLoader.php create mode 100644 vendor/composer/InstalledVersions.php create mode 100644 vendor/composer/LICENSE create mode 100644 vendor/composer/autoload_classmap.php create mode 100644 vendor/composer/autoload_namespaces.php create mode 100644 vendor/composer/autoload_psr4.php create mode 100644 vendor/composer/autoload_real.php create mode 100644 vendor/composer/autoload_static.php create mode 100644 vendor/composer/ca-bundle/LICENSE create mode 100644 vendor/composer/ca-bundle/README.md create mode 100644 vendor/composer/ca-bundle/composer.json create mode 100644 vendor/composer/ca-bundle/res/cacert.pem create mode 100644 vendor/composer/ca-bundle/src/CaBundle.php create mode 100644 vendor/composer/installed.json create mode 100644 vendor/composer/installed.php create mode 100644 vendor/composer/platform_check.php create mode 100644 vendor/mollie/mollie-api-php/CHANGELOG.md create mode 100644 vendor/mollie/mollie-api-php/LICENSE create mode 100644 vendor/mollie/mollie-api-php/README.md create mode 100644 vendor/mollie/mollie-api-php/UPGRADING.md create mode 100755 vendor/mollie/mollie-api-php/bin/release create mode 100644 vendor/mollie/mollie-api-php/composer.json create mode 100644 vendor/mollie/mollie-api-php/docs/debugging.md create mode 100644 vendor/mollie/mollie-api-php/docs/endpoint-collections.md create mode 100644 vendor/mollie/mollie-api-php/docs/exceptions.md create mode 100644 vendor/mollie/mollie-api-php/docs/http-adapters.md create mode 100644 vendor/mollie/mollie-api-php/docs/idempotency.md create mode 100644 vendor/mollie/mollie-api-php/docs/payments.md create mode 100644 vendor/mollie/mollie-api-php/docs/recipes/README.md create mode 100644 vendor/mollie/mollie-api-php/docs/recipes/capabilities/list-capabilities.md create mode 100644 vendor/mollie/mollie-api-php/docs/recipes/connect-balance-transfers/create-balance-transfer.md create mode 100644 vendor/mollie/mollie-api-php/docs/recipes/connect-balance-transfers/get-balance-transfer.md create mode 100644 vendor/mollie/mollie-api-php/docs/recipes/connect-balance-transfers/list-balance-transfers.md create mode 100644 vendor/mollie/mollie-api-php/docs/recipes/customers/customer-payments.md create mode 100644 vendor/mollie/mollie-api-php/docs/recipes/customers/manage-customers.md create mode 100644 vendor/mollie/mollie-api-php/docs/recipes/invoices/list-invoices.md create mode 100644 vendor/mollie/mollie-api-php/docs/recipes/mandates/manage-mandates.md create mode 100644 vendor/mollie/mollie-api-php/docs/recipes/onboarding/create-client-link.md create mode 100644 vendor/mollie/mollie-api-php/docs/recipes/payment-links/manage-payment-links.md create mode 100644 vendor/mollie/mollie-api-php/docs/recipes/payments/create-capturable-payment.md create mode 100644 vendor/mollie/mollie-api-php/docs/recipes/payments/create-capture.md create mode 100644 vendor/mollie/mollie-api-php/docs/recipes/payments/create-ideal-payment.md create mode 100644 vendor/mollie/mollie-api-php/docs/recipes/payments/create-payment-oauth.md create mode 100644 vendor/mollie/mollie-api-php/docs/recipes/payments/create-payment.md create mode 100644 vendor/mollie/mollie-api-php/docs/recipes/payments/create-routed-payment.md create mode 100644 vendor/mollie/mollie-api-php/docs/recipes/payments/handle-webhook.md create mode 100644 vendor/mollie/mollie-api-php/docs/recipes/payments/list-methods.md create mode 100644 vendor/mollie/mollie-api-php/docs/recipes/payments/list-payments.md create mode 100644 vendor/mollie/mollie-api-php/docs/recipes/payments/refund-payment.md create mode 100644 vendor/mollie/mollie-api-php/docs/recipes/payments/retrieve-captures.md create mode 100644 vendor/mollie/mollie-api-php/docs/recipes/payments/update-payment.md create mode 100644 vendor/mollie/mollie-api-php/docs/recipes/profiles/manage-profiles.md create mode 100644 vendor/mollie/mollie-api-php/docs/recipes/sales-invoices/manage-sales-invoices.md create mode 100644 vendor/mollie/mollie-api-php/docs/recipes/sessions/manage-sessions.md create mode 100644 vendor/mollie/mollie-api-php/docs/recipes/settlements/list-settlements.md create mode 100644 vendor/mollie/mollie-api-php/docs/recipes/subscriptions/manage-subscriptions.md create mode 100644 vendor/mollie/mollie-api-php/docs/recipes/webhooks/create-webhook.md create mode 100644 vendor/mollie/mollie-api-php/docs/recipes/webhooks/manage-webhooks.md create mode 100644 vendor/mollie/mollie-api-php/docs/recipes/webhooks/signature-verification.md create mode 100644 vendor/mollie/mollie-api-php/docs/recipes/webhooks/webhook-events.md create mode 100644 vendor/mollie/mollie-api-php/docs/requests.md create mode 100644 vendor/mollie/mollie-api-php/docs/responses.md create mode 100644 vendor/mollie/mollie-api-php/docs/retries.md create mode 100644 vendor/mollie/mollie-api-php/docs/testing.md create mode 100644 vendor/mollie/mollie-api-php/docs/webhooks.md create mode 100644 vendor/mollie/mollie-api-php/src/CompatibilityChecker.php create mode 100644 vendor/mollie/mollie-api-php/src/Config.php create mode 100644 vendor/mollie/mollie-api-php/src/Contracts/Arrayable.php create mode 100644 vendor/mollie/mollie-api-php/src/Contracts/Authenticatable.php create mode 100644 vendor/mollie/mollie-api-php/src/Contracts/Authenticator.php create mode 100644 vendor/mollie/mollie-api-php/src/Contracts/Connector.php create mode 100644 vendor/mollie/mollie-api-php/src/Contracts/EmbeddedResourcesContract.php create mode 100644 vendor/mollie/mollie-api-php/src/Contracts/HasPayload.php create mode 100644 vendor/mollie/mollie-api-php/src/Contracts/HttpAdapterContract.php create mode 100644 vendor/mollie/mollie-api-php/src/Contracts/IdempotencyContract.php create mode 100644 vendor/mollie/mollie-api-php/src/Contracts/IdempotencyKeyGeneratorContract.php create mode 100644 vendor/mollie/mollie-api-php/src/Contracts/IsIteratable.php create mode 100644 vendor/mollie/mollie-api-php/src/Contracts/IsResponseAware.php create mode 100644 vendor/mollie/mollie-api-php/src/Contracts/IsWrapper.php create mode 100644 vendor/mollie/mollie-api-php/src/Contracts/MollieHttpAdapterPickerContract.php create mode 100644 vendor/mollie/mollie-api-php/src/Contracts/PayloadRepository.php create mode 100644 vendor/mollie/mollie-api-php/src/Contracts/Repository.php create mode 100644 vendor/mollie/mollie-api-php/src/Contracts/RequestMiddleware.php create mode 100644 vendor/mollie/mollie-api-php/src/Contracts/Resolvable.php create mode 100644 vendor/mollie/mollie-api-php/src/Contracts/ResponseMiddleware.php create mode 100644 vendor/mollie/mollie-api-php/src/Contracts/RetryStrategyContract.php create mode 100644 vendor/mollie/mollie-api-php/src/Contracts/Stringable.php create mode 100644 vendor/mollie/mollie-api-php/src/Contracts/SupportsDebuggingContract.php create mode 100644 vendor/mollie/mollie-api-php/src/Contracts/SupportsTestmode.php create mode 100644 vendor/mollie/mollie-api-php/src/Contracts/SupportsTestmodeInPayload.php create mode 100644 vendor/mollie/mollie-api-php/src/Contracts/SupportsTestmodeInQuery.php create mode 100644 vendor/mollie/mollie-api-php/src/Contracts/Testable.php create mode 100644 vendor/mollie/mollie-api-php/src/Contracts/ViableResponse.php create mode 100644 vendor/mollie/mollie-api-php/src/EndpointCollection/BalanceEndpointCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/EndpointCollection/BalanceReportEndpointCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/EndpointCollection/BalanceTransactionEndpointCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/EndpointCollection/CapabilityEndpointCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/EndpointCollection/ChargebackEndpointCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/EndpointCollection/ClientEndpointCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/EndpointCollection/ClientLinkEndpointCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/EndpointCollection/ConnectBalanceTransferEndpointCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/EndpointCollection/CustomerEndpointCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/EndpointCollection/CustomerPaymentsEndpointCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/EndpointCollection/EndpointCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/EndpointCollection/InvoiceEndpointCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/EndpointCollection/MandateEndpointCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/EndpointCollection/MethodEndpointCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/EndpointCollection/MethodIssuerEndpointCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/EndpointCollection/OnboardingEndpointCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/EndpointCollection/OrganizationEndpointCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/EndpointCollection/OrganizationPartnerEndpointCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/EndpointCollection/PaymentCaptureEndpointCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/EndpointCollection/PaymentChargebackEndpointCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/EndpointCollection/PaymentEndpointCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/EndpointCollection/PaymentLinkEndpointCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/EndpointCollection/PaymentLinkPaymentEndpointCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/EndpointCollection/PaymentRefundEndpointCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/EndpointCollection/PaymentRouteEndpointCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/EndpointCollection/PermissionEndpointCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/EndpointCollection/ProfileEndpointCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/EndpointCollection/ProfileMethodEndpointCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/EndpointCollection/RefundEndpointCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/EndpointCollection/SalesInvoiceEndpointCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/EndpointCollection/SessionEndpointCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/EndpointCollection/SettlementCaptureEndpointCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/EndpointCollection/SettlementChargebackEndpointCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/EndpointCollection/SettlementEndpointCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/EndpointCollection/SettlementPaymentEndpointCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/EndpointCollection/SettlementRefundEndpointCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/EndpointCollection/SubscriptionEndpointCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/EndpointCollection/SubscriptionPaymentEndpointCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/EndpointCollection/TerminalEndpointCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/EndpointCollection/WalletEndpointCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/EndpointCollection/WebhookEndpointCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/EndpointCollection/WebhookEventEndpointCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/Exceptions/ApiException.php create mode 100644 vendor/mollie/mollie-api-php/src/Exceptions/ClientException.php create mode 100644 vendor/mollie/mollie-api-php/src/Exceptions/EmbeddedResourcesNotParseableException.php create mode 100644 vendor/mollie/mollie-api-php/src/Exceptions/ForbiddenException.php create mode 100644 vendor/mollie/mollie-api-php/src/Exceptions/IncompatiblePlatformException.php create mode 100644 vendor/mollie/mollie-api-php/src/Exceptions/InvalidAuthenticationException.php create mode 100644 vendor/mollie/mollie-api-php/src/Exceptions/InvalidSignatureException.php create mode 100644 vendor/mollie/mollie-api-php/src/Exceptions/JsonParseException.php create mode 100644 vendor/mollie/mollie-api-php/src/Exceptions/LogicException.php create mode 100644 vendor/mollie/mollie-api-php/src/Exceptions/MethodNotAllowedException.php create mode 100644 vendor/mollie/mollie-api-php/src/Exceptions/MissingAuthenticationException.php create mode 100644 vendor/mollie/mollie-api-php/src/Exceptions/MollieException.php create mode 100644 vendor/mollie/mollie-api-php/src/Exceptions/NetworkRequestException.php create mode 100644 vendor/mollie/mollie-api-php/src/Exceptions/NotFoundException.php create mode 100644 vendor/mollie/mollie-api-php/src/Exceptions/RequestException.php create mode 100644 vendor/mollie/mollie-api-php/src/Exceptions/RequestTimeoutException.php create mode 100644 vendor/mollie/mollie-api-php/src/Exceptions/RetryableNetworkRequestException.php create mode 100644 vendor/mollie/mollie-api-php/src/Exceptions/ServerException.php create mode 100644 vendor/mollie/mollie-api-php/src/Exceptions/ServiceUnavailableException.php create mode 100644 vendor/mollie/mollie-api-php/src/Exceptions/TooManyRequestsException.php create mode 100644 vendor/mollie/mollie-api-php/src/Exceptions/UnauthorizedException.php create mode 100644 vendor/mollie/mollie-api-php/src/Exceptions/UnrecognizedClientException.php create mode 100644 vendor/mollie/mollie-api-php/src/Exceptions/ValidationException.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/ApplePayPaymentSessionRequestFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/ApplicationFeeFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/CreateClientLinkRequestFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/CreateConnectBalanceTransferRequestFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/CreateCustomerPaymentRequestFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/CreateCustomerRequestFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/CreateDelayedPaymentRouteRequestFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/CreateMandateRequestFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/CreatePaymentCaptureRequestFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/CreatePaymentLinkRequestFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/CreatePaymentRefundRequestFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/CreatePaymentRequestFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/CreateProfileRequestFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/CreateSalesInvoiceRequestFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/CreateSessionRequestFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/CreateSubscriptionRequestFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/CreateWebhookRequestFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/Factory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/GetAllPaginatedSubscriptionsRequestFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/GetAllPaymentMethodsRequestFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/GetBalanceReportRequestFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/GetClientRequestFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/GetEnabledMethodsRequestFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/GetMethodRequestFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/GetPaginatedChargebacksRequestFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/GetPaginatedClientRequestFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/GetPaginatedCustomerPaymentsRequestFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/GetPaginatedInvoiceRequestFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/GetPaginatedPaymentCapturesRequestFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/GetPaginatedPaymentChargebacksRequestFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/GetPaginatedPaymentRefundsRequestFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/GetPaginatedRefundsRequestFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/GetPaginatedSettlementCapturesRequestFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/GetPaginatedSettlementChargebacksRequestFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/GetPaginatedSettlementRefundsQueryFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/GetPaginatedSettlementsRequestFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/GetPaymentCaptureRequestFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/GetPaymentChargebackRequestFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/GetPaymentRefundRequestFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/GetPaymentRequestFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/InvoiceLineCollectionFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/InvoiceLineFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/MoneyFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/OrderLineCollectionFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/OrderLineFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/PaginatedQueryFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/PaymentRouteCollectionFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/RecipientFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/RecurringBillingCycleFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/RefundRouteCollectionFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/RequestFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/SortablePaginatedQueryFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/UpdateCustomerRequestFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/UpdatePaymentLinkRequestFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/UpdatePaymentRequestFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/UpdatePaymentRouteRequestFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/UpdateProfileRequestFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/UpdateSalesInvoiceRequestFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/UpdateSubscriptionRequestFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Factories/UpdateWebhookRequestFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Fake/ErrorResponseBuilder.php create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Events/blueprint.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/FakeResponseLoader.php create mode 100644 vendor/mollie/mollie-api-php/src/Fake/ListResponseBuilder.php create mode 100644 vendor/mollie/mollie-api-php/src/Fake/MockEvent.php create mode 100644 vendor/mollie/mollie-api-php/src/Fake/MockMollieClient.php create mode 100644 vendor/mollie/mollie-api-php/src/Fake/MockMollieHttpAdapter.php create mode 100644 vendor/mollie/mollie-api-php/src/Fake/MockResponse.php create mode 100644 vendor/mollie/mollie-api-php/src/Fake/ResourceResponseBuilder.php create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/apple-pay-session.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/balance-list.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/balance-report.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/balance-transaction-list.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/balance-transaction.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/balance.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/capability-list.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/capability.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/capture-list.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/capture.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/chargeback-list.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/chargeback.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/client-link.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/client-list.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/client.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/connect-balance-transfer-list.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/connect-balance-transfer.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/current-profile.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/cursor-collection-next.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/cursor-collection.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/customer-list.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/customer.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/empty-list.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/error.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/invoice-list.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/invoice.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/issuer.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/mandate-list.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/mandate.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/method-list.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/method.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/onboarding.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/organization.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/partner-status.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/payment-link-list.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/payment-link.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/payment-list.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/payment-route.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/payment.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/permission-list.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/permission.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/profile-list.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/profile.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/refund-list.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/refund.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/route-list.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/route.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/sales-invoice-list.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/sales-invoice.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/session-list.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/session.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/settlement-list.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/settlement.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/subscription-list.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/subscription.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/terminal-list.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/terminal.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/unprocessable-entity.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/webhook-event.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/webhook-list.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/webhook-test.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/Responses/webhook.json create mode 100644 vendor/mollie/mollie-api-php/src/Fake/SequenceMockResponse.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Adapter/CurlErrorMapper.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Adapter/CurlFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Adapter/CurlInitializationException.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Adapter/CurlMollieHttpAdapter.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Adapter/GuzzleMollieHttpAdapter.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Adapter/MollieHttpAdapterPicker.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Adapter/PSR18MollieHttpAdapter.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Auth/AccessTokenAuthenticator.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Auth/ApiKeyAuthenticator.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Auth/BearerTokenAuthenticator.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Auth/TokenValidator.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Data/Address.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Data/ApplicationFee.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Data/DataCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Data/Date.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Data/DateTime.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Data/Discount.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Data/EmailDetails.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Data/InvoiceLine.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Data/Money.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Data/OrderLine.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Data/Owner.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Data/OwnerAddress.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Data/PaginatedQuery.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Data/PaymentDetails.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Data/PaymentRoute.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Data/Recipient.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Data/RecurringBillingCycle.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Data/RefundRoute.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Data/SortablePaginatedQuery.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Data/Temporal.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Data/TransferParty.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/LinearRetryStrategy.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Middleware.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Middleware/ApplyIdempotencyKey.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Middleware/ConvertResponseToException.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Middleware/Handler.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Middleware/Handlers.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Middleware/Hydrate.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Middleware/MiddlewarePriority.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Middleware/ResetIdempotencyKey.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/PendingRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/PendingRequest/AuthenticateRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/PendingRequest/HandleTestmode.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/PendingRequest/MergeBody.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/PendingRequest/MergeRequestProperties.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/PendingRequest/SetUserAgent.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Request.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/RequestSanitizer.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/ApplePayPaymentSessionRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/CancelPaymentRefundRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/CancelPaymentRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/CancelSessionRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/CancelSubscriptionRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/CreateClientLinkRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/CreateConnectBalanceTransferRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/CreateCustomerPaymentRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/CreateCustomerRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/CreateDelayedPaymentRouteRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/CreateMandateRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/CreatePaymentCaptureRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/CreatePaymentLinkRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/CreatePaymentRefundRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/CreatePaymentRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/CreateProfileRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/CreateSalesInvoiceRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/CreateSessionRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/CreateSubscriptionRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/CreateWebhookRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/DeleteCustomerRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/DeletePaymentLinkRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/DeleteProfileRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/DeleteSalesInvoiceRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/DeleteWebhookRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/DisableMethodIssuerRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/DisableMethodRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/DynamicDeleteRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/DynamicGetRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/DynamicPaginatedRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/DynamicPostRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/DynamicPutRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/DynamicRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/EnableMethodIssuerRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/EnableMethodRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetAllMethodsRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetAllPaginatedSubscriptionsRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetBalanceReportRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetBalanceRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetCapabilityRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetClientRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetConnectBalanceTransferRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetCurrentProfileRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetCustomerRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetEnabledMethodsRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetInvoiceRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetMandateRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetMethodRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetOnboardingStatusRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetOrganizationPartnerStatusRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetOrganizationRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedBalanceRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedBalanceTransactionRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedChargebacksRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedClientRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedCustomerPaymentsRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedCustomerRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedInvoiceRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedMandateRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedPaymentCapturesRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedPaymentChargebacksRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedPaymentLinkPaymentsRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedPaymentLinksRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedPaymentRefundsRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedPaymentsRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedProfilesRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedRefundsRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedSalesInvoicesRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedSettlementCapturesRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedSettlementChargebacksRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedSettlementPaymentsRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedSettlementRefundsRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedSettlementsRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedSubscriptionPaymentsRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedSubscriptionsRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedTerminalsRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedWebhooksRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetPaymentCaptureRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetPaymentChargebackRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetPaymentLinkRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetPaymentRefundRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetPaymentRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetPermissionRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetProfileRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetSalesInvoiceRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetSessionRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetSettlementRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetSubscriptionRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetTerminalRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetWebhookEventRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/GetWebhookRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/ListCapabilitiesRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/ListConnectBalanceTransfersRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/ListPaymentRoutesRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/ListPermissionsRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/PaginatedRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/ReleasePaymentAuthorizationRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/ResourceHydratableRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/RevokeMandateRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/SortablePaginatedRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/TestWebhookRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/UpdateCustomerRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/UpdatePaymentLinkRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/UpdatePaymentRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/UpdatePaymentRouteRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/UpdateProfileRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/UpdateSalesInvoiceRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/UpdateSubscriptionRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Requests/UpdateWebhookRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/Response.php create mode 100644 vendor/mollie/mollie-api-php/src/Http/ResponseStatusCode.php create mode 100644 vendor/mollie/mollie-api-php/src/Idempotency/DefaultIdempotencyKeyGenerator.php create mode 100644 vendor/mollie/mollie-api-php/src/Idempotency/FakeIdempotencyKeyGenerator.php create mode 100644 vendor/mollie/mollie-api-php/src/MollieApiClient.php create mode 100644 vendor/mollie/mollie-api-php/src/Repositories/ArrayStore.php create mode 100644 vendor/mollie/mollie-api-php/src/Repositories/JsonPayloadRepository.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/AnyResource.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/Balance.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/BalanceCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/BalanceReport.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/BalanceTransaction.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/BalanceTransactionCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/BaseCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/BaseResource.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/Capability.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/CapabilityCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/Capture.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/CaptureCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/Chargeback.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/ChargebackCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/Client.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/ClientCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/ClientLink.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/ConnectBalanceTransfer.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/ConnectBalanceTransferCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/CurrentProfile.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/CursorCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/Customer.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/CustomerCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/Invoice.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/InvoiceCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/Issuer.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/IssuerCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/LazyCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/Mandate.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/MandateCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/Method.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/MethodCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/MethodPrice.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/MethodPriceCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/Onboarding.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/Organization.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/Partner.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/Payment.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/PaymentCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/PaymentLink.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/PaymentLinkCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/Permission.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/PermissionCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/Profile.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/ProfileCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/Refund.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/RefundCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/ResourceCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/ResourceFactory.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/ResourceHydrator.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/ResourceRegistry.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/ResourceResolver.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/ResourceWrapper.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/Route.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/RouteCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/SalesInvoice.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/SalesInvoiceCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/Session.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/SessionCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/Settlement.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/SettlementCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/Subscription.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/SubscriptionCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/Terminal.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/TerminalCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/Webhook.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/WebhookCollection.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/WebhookEvent.php create mode 100644 vendor/mollie/mollie-api-php/src/Resources/WrapperResource.php create mode 100644 vendor/mollie/mollie-api-php/src/Traits/ComposableFromArray.php create mode 100644 vendor/mollie/mollie-api-php/src/Traits/ForwardsCalls.php create mode 100644 vendor/mollie/mollie-api-php/src/Traits/GetAllConstants.php create mode 100644 vendor/mollie/mollie-api-php/src/Traits/HandlesAuthentication.php create mode 100644 vendor/mollie/mollie-api-php/src/Traits/HandlesDebugging.php create mode 100644 vendor/mollie/mollie-api-php/src/Traits/HandlesIdempotency.php create mode 100644 vendor/mollie/mollie-api-php/src/Traits/HandlesTestmode.php create mode 100644 vendor/mollie/mollie-api-php/src/Traits/HandlesVersions.php create mode 100644 vendor/mollie/mollie-api-php/src/Traits/HasDefaultFactories.php create mode 100644 vendor/mollie/mollie-api-php/src/Traits/HasEndpoints.php create mode 100644 vendor/mollie/mollie-api-php/src/Traits/HasHeaders.php create mode 100644 vendor/mollie/mollie-api-php/src/Traits/HasJsonPayload.php create mode 100644 vendor/mollie/mollie-api-php/src/Traits/HasMiddleware.php create mode 100644 vendor/mollie/mollie-api-php/src/Traits/HasMode.php create mode 100644 vendor/mollie/mollie-api-php/src/Traits/HasQuery.php create mode 100644 vendor/mollie/mollie-api-php/src/Traits/HasRequestProperties.php create mode 100644 vendor/mollie/mollie-api-php/src/Traits/HasResponse.php create mode 100644 vendor/mollie/mollie-api-php/src/Traits/Initializable.php create mode 100644 vendor/mollie/mollie-api-php/src/Traits/IsIteratableRequest.php create mode 100644 vendor/mollie/mollie-api-php/src/Traits/ManagesPsrRequests.php create mode 100644 vendor/mollie/mollie-api-php/src/Traits/SendsRequests.php create mode 100644 vendor/mollie/mollie-api-php/src/Types/ApprovalPrompt.php create mode 100644 vendor/mollie/mollie-api-php/src/Types/BalanceTransferFrequency.php create mode 100644 vendor/mollie/mollie-api-php/src/Types/BusinessCategory.php create mode 100644 vendor/mollie/mollie-api-php/src/Types/CapabilityStatus.php create mode 100644 vendor/mollie/mollie-api-php/src/Types/CaptureMode.php create mode 100644 vendor/mollie/mollie-api-php/src/Types/CheckoutFlow.php create mode 100644 vendor/mollie/mollie-api-php/src/Types/ClientQuery.php create mode 100644 vendor/mollie/mollie-api-php/src/Types/ConnectBalanceTransferCategory.php create mode 100644 vendor/mollie/mollie-api-php/src/Types/InvoiceStatus.php create mode 100644 vendor/mollie/mollie-api-php/src/Types/MandateMethod.php create mode 100644 vendor/mollie/mollie-api-php/src/Types/MandateStatus.php create mode 100644 vendor/mollie/mollie-api-php/src/Types/Method.php create mode 100644 vendor/mollie/mollie-api-php/src/Types/MethodQuery.php create mode 100644 vendor/mollie/mollie-api-php/src/Types/OnboardingStatus.php create mode 100644 vendor/mollie/mollie-api-php/src/Types/OrderLineCategory.php create mode 100644 vendor/mollie/mollie-api-php/src/Types/OrderLineStatus.php create mode 100644 vendor/mollie/mollie-api-php/src/Types/OrderLineType.php create mode 100644 vendor/mollie/mollie-api-php/src/Types/OrderLineUpdateOperationType.php create mode 100644 vendor/mollie/mollie-api-php/src/Types/PaymentIncludesQuery.php create mode 100644 vendor/mollie/mollie-api-php/src/Types/PaymentMethod.php create mode 100644 vendor/mollie/mollie-api-php/src/Types/PaymentMethodStatus.php create mode 100644 vendor/mollie/mollie-api-php/src/Types/PaymentQuery.php create mode 100644 vendor/mollie/mollie-api-php/src/Types/PaymentStatus.php create mode 100644 vendor/mollie/mollie-api-php/src/Types/PaymentTerm.php create mode 100644 vendor/mollie/mollie-api-php/src/Types/ProfileStatus.php create mode 100644 vendor/mollie/mollie-api-php/src/Types/RecipientType.php create mode 100644 vendor/mollie/mollie-api-php/src/Types/RefundStatus.php create mode 100644 vendor/mollie/mollie-api-php/src/Types/SalesInvoiceStatus.php create mode 100644 vendor/mollie/mollie-api-php/src/Types/SequenceType.php create mode 100644 vendor/mollie/mollie-api-php/src/Types/SessionStatus.php create mode 100644 vendor/mollie/mollie-api-php/src/Types/SettlementStatus.php create mode 100644 vendor/mollie/mollie-api-php/src/Types/SubscriptionStatus.php create mode 100644 vendor/mollie/mollie-api-php/src/Types/TerminalStatus.php create mode 100644 vendor/mollie/mollie-api-php/src/Types/TransferPartyType.php create mode 100644 vendor/mollie/mollie-api-php/src/Types/VatMode.php create mode 100644 vendor/mollie/mollie-api-php/src/Types/VatScheme.php create mode 100644 vendor/mollie/mollie-api-php/src/Types/WebhookStatus.php create mode 100644 vendor/mollie/mollie-api-php/src/Utils/Arr.php create mode 100644 vendor/mollie/mollie-api-php/src/Utils/DataTransformer.php create mode 100644 vendor/mollie/mollie-api-php/src/Utils/Debugger.php create mode 100644 vendor/mollie/mollie-api-php/src/Utils/Factories.php create mode 100644 vendor/mollie/mollie-api-php/src/Utils/Str.php create mode 100644 vendor/mollie/mollie-api-php/src/Utils/Url.php create mode 100644 vendor/mollie/mollie-api-php/src/Utils/Utility.php create mode 100644 vendor/mollie/mollie-api-php/src/Webhooks/Events/BalanceTransactionCreated.php create mode 100644 vendor/mollie/mollie-api-php/src/Webhooks/Events/BaseEvent.php create mode 100644 vendor/mollie/mollie-api-php/src/Webhooks/Events/ConnectBalanceTransferFailed.php create mode 100644 vendor/mollie/mollie-api-php/src/Webhooks/Events/ConnectBalanceTransferSucceeded.php create mode 100644 vendor/mollie/mollie-api-php/src/Webhooks/Events/PaymentLinkPaid.php create mode 100644 vendor/mollie/mollie-api-php/src/Webhooks/Events/SalesInvoiceCanceled.php create mode 100644 vendor/mollie/mollie-api-php/src/Webhooks/Events/SalesInvoiceCreated.php create mode 100644 vendor/mollie/mollie-api-php/src/Webhooks/Events/SalesInvoiceIssued.php create mode 100644 vendor/mollie/mollie-api-php/src/Webhooks/Events/SalesInvoicePaid.php create mode 100644 vendor/mollie/mollie-api-php/src/Webhooks/SignatureValidator.php create mode 100644 vendor/mollie/mollie-api-php/src/Webhooks/WebhookEntity.php create mode 100644 vendor/mollie/mollie-api-php/src/Webhooks/WebhookEventMapper.php create mode 100644 vendor/mollie/mollie-api-php/src/Webhooks/WebhookEventType.php create mode 100644 vendor/nyholm/psr7/CHANGELOG.md create mode 100644 vendor/nyholm/psr7/LICENSE create mode 100644 vendor/nyholm/psr7/README.md create mode 100644 vendor/nyholm/psr7/composer.json create mode 100644 vendor/nyholm/psr7/src/Factory/HttplugFactory.php create mode 100644 vendor/nyholm/psr7/src/Factory/Psr17Factory.php create mode 100644 vendor/nyholm/psr7/src/MessageTrait.php create mode 100644 vendor/nyholm/psr7/src/Request.php create mode 100644 vendor/nyholm/psr7/src/RequestTrait.php create mode 100644 vendor/nyholm/psr7/src/Response.php create mode 100644 vendor/nyholm/psr7/src/ServerRequest.php create mode 100644 vendor/nyholm/psr7/src/Stream.php create mode 100644 vendor/nyholm/psr7/src/StreamTrait.php create mode 100644 vendor/nyholm/psr7/src/UploadedFile.php create mode 100644 vendor/nyholm/psr7/src/Uri.php create mode 100644 vendor/psr/http-client/CHANGELOG.md create mode 100644 vendor/psr/http-client/LICENSE create mode 100644 vendor/psr/http-client/README.md create mode 100644 vendor/psr/http-client/composer.json create mode 100644 vendor/psr/http-client/src/ClientExceptionInterface.php create mode 100644 vendor/psr/http-client/src/ClientInterface.php create mode 100644 vendor/psr/http-client/src/NetworkExceptionInterface.php create mode 100644 vendor/psr/http-client/src/RequestExceptionInterface.php create mode 100644 vendor/psr/http-factory/LICENSE create mode 100644 vendor/psr/http-factory/README.md create mode 100644 vendor/psr/http-factory/composer.json create mode 100644 vendor/psr/http-factory/src/RequestFactoryInterface.php create mode 100644 vendor/psr/http-factory/src/ResponseFactoryInterface.php create mode 100644 vendor/psr/http-factory/src/ServerRequestFactoryInterface.php create mode 100644 vendor/psr/http-factory/src/StreamFactoryInterface.php create mode 100644 vendor/psr/http-factory/src/UploadedFileFactoryInterface.php create mode 100644 vendor/psr/http-factory/src/UriFactoryInterface.php create mode 100644 vendor/psr/http-message/CHANGELOG.md create mode 100644 vendor/psr/http-message/LICENSE create mode 100644 vendor/psr/http-message/README.md create mode 100644 vendor/psr/http-message/composer.json create mode 100644 vendor/psr/http-message/docs/PSR7-Interfaces.md create mode 100644 vendor/psr/http-message/docs/PSR7-Usage.md create mode 100644 vendor/psr/http-message/src/MessageInterface.php create mode 100644 vendor/psr/http-message/src/RequestInterface.php create mode 100644 vendor/psr/http-message/src/ResponseInterface.php create mode 100644 vendor/psr/http-message/src/ServerRequestInterface.php create mode 100644 vendor/psr/http-message/src/StreamInterface.php create mode 100644 vendor/psr/http-message/src/UploadedFileInterface.php create mode 100644 vendor/psr/http-message/src/UriInterface.php diff --git a/api.php b/api.php new file mode 100644 index 0000000..33d14eb --- /dev/null +++ b/api.php @@ -0,0 +1,137 @@ + 'wc/v3', 'timeout' => 400, 'verify_ssl' => false] +); + +$action = $_GET['action'] ?? ''; + +// 1. POSTCODE CHECK +if ($action === 'postcode_check') { + $postcode = str_replace(' ', '', $_GET['postcode']); + $url = "https://postcode.tech/api/v1/postcode?postcode={$postcode}&number=" . $_GET['number']; + $ch = curl_init($url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_HTTPHEADER, ["Authorization: Bearer {$postcode_tech_key}"]); + echo curl_exec($ch); curl_close($ch); exit; +} + +// 2. PRODUCTEN OPHALEN (Inclusief Variatie Details) +if ($action === 'get_products') { + try { + $products = $woocommerce->get('products', ['status' => 'publish', 'per_page' => 100]); + $enriched = []; + foreach ($products as $product) { + $p = (array)$product; + if ($product->type === 'variable') { + $p['variation_details'] = $woocommerce->get("products/{$product->id}/variations", ['per_page' => 100]); + } else { $p['variation_details'] = []; } + $enriched[] = $p; + } + echo json_encode($enriched); + } catch (Exception $e) { echo json_encode(['error' => $e->getMessage()]); } + exit; +} + +// 3. ORDER AANMAKEN +if ($action === 'create_order') { + $input = json_decode(file_get_contents('php://input'), true); + + try { + $method_input = $input['payment_method']; + $mediacode = $input['mediacode_internal'] ?? 'Geen'; + + // Map methoden naar officiële Mollie plugin IDs + if ($method_input === 'mollie_methods_ideal') { + $wc_gateway_id = 'mollie_wc_gateway_ideal'; + $mollie_id = 'ideal'; + } elseif ($method_input === 'rve_riverty') { + $wc_gateway_id = 'mollie_wc_gateway_riverty'; + $mollie_id = 'riverty'; + } elseif ($method_input === 'mollie_methods_creditcard') { + $wc_gateway_id = 'mollie_wc_gateway_creditcard'; + $mollie_id = 'creditcard'; + } + + // --- ATTRIBUTION DATA & ORDER INITIALISATIE --- + $input['payment_method'] = $wc_gateway_id; + $input['payment_method_title'] = 'iDEAL (via Mollie)'; + $input['customer_note'] = "Bron: Sales Panel | Mediacode: " . $mediacode; + + // Metadata toevoegen bij creatie (Direct zichtbaar in Custom Fields) + $input['meta_data'][] = ['key' => 'Mediacode', 'value' => $mediacode]; + $input['meta_data'][] = ['key' => 'Origin', 'value' => 'Sales Panel']; + $input['meta_data'][] = ['key' => '_wc_order_attribution_utm_campaign', 'value' => $mediacode]; + $input['meta_data'][] = ['key' => '_wc_order_attribution_utm_source', 'value' => 'SalesPanel']; + + // A. WooCommerce Order aanmaken + $order = $woocommerce->post('orders', $input); + if (!$order || !isset($order->id)) throw new Exception("WooCommerce order mislukt."); + + // B. Mollie Setup + $mollie = new MollieApiClient(); + $mollie->setApiKey($mollie_api_key); + $is_sub = (stripos(json_encode($order->line_items), 'abonnement') !== false); + $payment_value = number_format((float)$order->total, 2, '.', ''); + if ($mollie_id === 'ideal' && $is_sub) $payment_value = "0.01"; + + // C. Webhook & Redirect URLs + $webhookUrl = "{$site_url}/wc-api/mollie_wc_gateway_ideal?order_id={$order->id}&key={$order->order_key}&filter_flag=1"; + $redirectUrl = "{$site_url}/checkout/order-received/{$order->id}/?key={$order->order_key}&order_id={$order->id}&filter_flag=onMollieReturn&utm_campaign={$mediacode}"; + + $paymentData = [ + "amount" => ["currency" => "EUR", "value" => $payment_value], + "description" => "Order #" . $order->id . " [" . $mediacode . "]", + "redirectUrl" => $redirectUrl, + "webhookUrl" => $webhookUrl, + "method" => $mollie_id, + "metadata" => ["order_id" => (string)$order->id, "mediacode" => $mediacode] + ]; + + $payment = $mollie->payments->create($paymentData); + + // D. MATCHING & PERMANENTE MEDIACODE (Update met Mollie ID) + $woocommerce->put("orders/" . $order->id, [ + 'meta_data' => [ + ['key' => '_mollie_payment_id', 'value' => $payment->id], + ['key' => '_transaction_id', 'value' => $payment->id], + ['key' => '_payment_method', 'value' => $wc_gateway_id], + ['key' => 'Mediacode', 'value' => $mediacode], + ['key' => '_mediacode', 'value' => $mediacode] + ] + ]); + + // E. Email trigger (Customer Note) + $woocommerce->post("orders/{$order->id}/notes", [ + 'note' => "Betaallink voor uw bestelling: " . $payment->getCheckoutUrl(), + 'customer_note' => true + ]); + + echo json_encode(['id' => $order->id, 'payment_url' => $payment->getCheckoutUrl()]); + + } catch (Exception $e) { + http_response_code(422); + echo json_encode(['error' => $e->getMessage()]); + } + exit; +} \ No newline at end of file diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..6a9e6ad --- /dev/null +++ b/composer.json @@ -0,0 +1,6 @@ +{ + "require": { + "automattic/woocommerce": "^3.1", + "mollie/mollie-api-php": "^3.7" + } +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..f8b745c --- /dev/null +++ b/composer.lock @@ -0,0 +1,478 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "7cef855c8b424b0d2fadd4ba6b160e3f", + "packages": [ + { + "name": "automattic/woocommerce", + "version": "3.1.0", + "source": { + "type": "git", + "url": "https://github.com/woocommerce/wc-api-php.git", + "reference": "d3b292f04c0b3b21dced691ebad8be073a83b4ad" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/woocommerce/wc-api-php/zipball/d3b292f04c0b3b21dced691ebad8be073a83b4ad", + "reference": "d3b292f04c0b3b21dced691ebad8be073a83b4ad", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "php": ">= 7.1.0" + }, + "require-dev": { + "overtrue/phplint": "7.4.x-dev", + "phpunit/phpunit": "^8", + "squizlabs/php_codesniffer": "3.*" + }, + "type": "library", + "autoload": { + "psr-4": { + "Automattic\\WooCommerce\\": [ + "src/WooCommerce" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Claudio Sanches", + "email": "claudio.sanches@automattic.com" + } + ], + "description": "A PHP wrapper for the WooCommerce REST API", + "keywords": [ + "api", + "woocommerce" + ], + "support": { + "issues": "https://github.com/woocommerce/wc-api-php/issues", + "source": "https://github.com/woocommerce/wc-api-php/tree/3.1.0" + }, + "time": "2022-03-18T21:46:17+00:00" + }, + { + "name": "composer/ca-bundle", + "version": "1.5.10", + "source": { + "type": "git", + "url": "https://github.com/composer/ca-bundle.git", + "reference": "961a5e4056dd2e4a2eedcac7576075947c28bf63" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/961a5e4056dd2e4a2eedcac7576075947c28bf63", + "reference": "961a5e4056dd2e4a2eedcac7576075947c28bf63", + "shasum": "" + }, + "require": { + "ext-openssl": "*", + "ext-pcre": "*", + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^8 || ^9", + "psr/log": "^1.0 || ^2.0 || ^3.0", + "symfony/process": "^4.0 || ^5.0 || ^6.0 || ^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\CaBundle\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.", + "keywords": [ + "cabundle", + "cacert", + "certificate", + "ssl", + "tls" + ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/ca-bundle/issues", + "source": "https://github.com/composer/ca-bundle/tree/1.5.10" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + } + ], + "time": "2025-12-08T15:06:51+00:00" + }, + { + "name": "mollie/mollie-api-php", + "version": "v3.7.0", + "source": { + "type": "git", + "url": "https://github.com/mollie/mollie-api-php.git", + "reference": "55f843fd3944c4c9ed08ac1d5929084305b82b8b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mollie/mollie-api-php/zipball/55f843fd3944c4c9ed08ac1d5929084305b82b8b", + "reference": "55f843fd3944c4c9ed08ac1d5929084305b82b8b", + "shasum": "" + }, + "require": { + "composer/ca-bundle": "^1.4", + "ext-curl": "*", + "ext-json": "*", + "ext-openssl": "*", + "nyholm/psr7": "^1.8", + "php": "^7.4|^8.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.1", + "psr/http-message": "^1.1|^2.0" + }, + "require-dev": { + "brianium/paratest": "^6.11", + "guzzlehttp/guzzle": "^7.6", + "phpstan/phpstan": "^2.0", + "phpunit/phpunit": "^9.6", + "symfony/var-dumper": "^5.4|^6.4|^7.2" + }, + "suggest": { + "mollie/oauth2-mollie-php": "Use OAuth to authenticate with the Mollie API. This is needed for some endpoints. Visit https://docs.mollie.com/ for more information." + }, + "type": "library", + "autoload": { + "psr-4": { + "Mollie\\Api\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Mollie B.V.", + "email": "info@mollie.com" + } + ], + "description": "Mollie API client library for PHP. Mollie is a European Payment Service provider and offers international payment methods such as Mastercard, VISA, American Express and PayPal, and local payment methods such as iDEAL, Bancontact, SOFORT Banking, SEPA direct debit, Belfius Direct Net, KBC Payment Button and various gift cards such as Podiumcadeaukaart and fashioncheque.", + "homepage": "https://www.mollie.com/en/developers", + "keywords": [ + "Apple Pay", + "CBC", + "Przelewy24", + "api", + "bancontact", + "banktransfer", + "belfius", + "belfius direct net", + "charges", + "creditcard", + "direct debit", + "fashioncheque", + "gateway", + "gift cards", + "ideal", + "inghomepay", + "intersolve", + "kbc", + "klarna", + "mistercash", + "mollie", + "paylater", + "payment", + "payments", + "paypal", + "paysafecard", + "podiumcadeaukaart", + "recurring", + "refunds", + "sepa", + "service", + "sliceit", + "sofort", + "sofortbanking", + "subscriptions" + ], + "support": { + "issues": "https://github.com/mollie/mollie-api-php/issues", + "source": "https://github.com/mollie/mollie-api-php/tree/v3.7.0" + }, + "time": "2025-12-01T09:03:27+00:00" + }, + { + "name": "nyholm/psr7", + "version": "1.8.2", + "source": { + "type": "git", + "url": "https://github.com/Nyholm/psr7.git", + "reference": "a71f2b11690f4b24d099d6b16690a90ae14fc6f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Nyholm/psr7/zipball/a71f2b11690f4b24d099d6b16690a90ae14fc6f3", + "reference": "a71f2b11690f4b24d099d6b16690a90ae14fc6f3", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0" + }, + "provide": { + "php-http/message-factory-implementation": "1.0", + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "http-interop/http-factory-tests": "^0.9", + "php-http/message-factory": "^1.0", + "php-http/psr7-integration-tests": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.4", + "symfony/error-handler": "^4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.8-dev" + } + }, + "autoload": { + "psr-4": { + "Nyholm\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com" + }, + { + "name": "Martijn van der Ven", + "email": "martijn@vanderven.se" + } + ], + "description": "A fast PHP7 implementation of PSR-7", + "homepage": "https://tnyholm.se", + "keywords": [ + "psr-17", + "psr-7" + ], + "support": { + "issues": "https://github.com/Nyholm/psr7/issues", + "source": "https://github.com/Nyholm/psr7/tree/1.8.2" + }, + "funding": [ + { + "url": "https://github.com/Zegnat", + "type": "github" + }, + { + "url": "https://github.com/nyholm", + "type": "github" + } + ], + "time": "2024-09-09T07:06:30+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client" + }, + "time": "2023-09-23T14:17:50+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory" + }, + "time": "2024-04-15T12:06:14+00:00" + }, + { + "name": "psr/http-message", + "version": "2.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/2.0" + }, + "time": "2023-04-04T09:54:51+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": {}, + "prefer-stable": false, + "prefer-lowest": false, + "platform": {}, + "platform-dev": {}, + "plugin-api-version": "2.6.0" +} diff --git a/index.html b/index.html new file mode 100644 index 0000000..5c4eb7b --- /dev/null +++ b/index.html @@ -0,0 +1,204 @@ + + + + + Telvero Sales Dashboard + + + + + + +
+
+

TELVERO ORDER ENTRY

+
+ Bron: + +
+
+ +
+
+

1. Klantgegevens

+
+
+ + +
+
+ + + +
+ + + + +
+
+ +
+

2. Productselectie

+ + +
+ +
+ +
+

Aanbevolen Extra's:

+ +
+
+ +
+
+

Winkelmand

+
+ +
+ +
+ + +
+ +
+ Totaal + +
+ + + +

Vergeet de Mediacode niet!

+
+
+
+
+ + + + \ No newline at end of file diff --git a/vendor/autoload.php b/vendor/autoload.php new file mode 100644 index 0000000..2eb3e70 --- /dev/null +++ b/vendor/autoload.php @@ -0,0 +1,22 @@ + +. + +Check out the WooCommerce API endpoints and data that can be manipulated in . + +## Setup + +Setup for the new WP REST API integration (WooCommerce 2.6 or later): + +```php +require __DIR__ . '/vendor/autoload.php'; + +use Automattic\WooCommerce\Client; + +$woocommerce = new Client( + 'http://example.com', + 'ck_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX', + 'cs_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX', + [ + 'version' => 'wc/v3', + ] +); +``` + +## Client class + +```php +$woocommerce = new Client($url, $consumer_key, $consumer_secret, $options); +``` + +### Options + +| Option | Type | Required | Description | +| ----------------- | -------- | -------- | ------------------------------------------ | +| `url` | `string` | yes | Your Store URL, example: http://woo.dev/ | +| `consumer_key` | `string` | yes | Your API consumer key | +| `consumer_secret` | `string` | yes | Your API consumer secret | +| `options` | `array` | no | Extra arguments (see client options table) | + +#### Client options + +| Option | Type | Required | Description | +| ------------------------ | -------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `version` | `string` | no | API version, default is `wc/v3` | +| `timeout` | `int` | no | Request timeout, default is `15` | +| `verify_ssl` | `bool` | no | Verify SSL when connect, use this option as `false` when need to test with self-signed certificates, default is `true` | +| `follow_redirects` | `bool` | no | Allow the API call to follow redirects | +| `query_string_auth` | `bool` | no | Force Basic Authentication as query string when `true` and using under HTTPS, default is `false` | +| `oauth_timestamp` | `string` | no | Custom oAuth timestamp, default is `time()` | +| `oauth_only` | `bool` | no | Only use oauth for requests, it will disable Basic Auth, default is `false` | +| `user_agent` | `string` | no | Custom user-agent, default is `WooCommerce API Client-PHP` | +| `wp_api_prefix` | `string` | no | Custom WP REST API URL prefix, used to support custom prefixes created with the `rest_url_prefix` filter | +| `wp_api` | `bool` | no | Set to `false` in order to use the legacy WooCommerce REST API (deprecated and not recommended) | +| `method_override_query` | `bool` | no | If true will mask all non-GET/POST methods by using POST method with added query parameter `?_method=METHOD` into URL | +| `method_override_header` | `bool` | no | If true will mask all non-GET/POST methods (PUT/DELETE/etc.) by using POST method with added `X-HTTP-Method-Override: METHOD` HTTP header into request | + +## Client methods + +### GET + +```php +$woocommerce->get($endpoint, $parameters = []); +``` + +### POST + +```php +$woocommerce->post($endpoint, $data); +``` + +### PUT + +```php +$woocommerce->put($endpoint, $data); +``` + +### DELETE + +```php +$woocommerce->delete($endpoint, $parameters = []); +``` + +### OPTIONS + +```php +$woocommerce->options($endpoint); +``` + +#### Arguments + +| Params | Type | Description | +| ------------ | -------- | ------------------------------------------------------------ | +| `endpoint` | `string` | WooCommerce API endpoint, example: `customers` or `order/12` | +| `data` | `array` | Only for POST and PUT, data that will be converted to JSON | +| `parameters` | `array` | Only for GET and DELETE, request query string | + +#### Response + +All methods will return arrays on success or throwing `HttpClientException` errors on failure. + +```php +use Automattic\WooCommerce\HttpClient\HttpClientException; + +try { + // Array of response results. + $results = $woocommerce->get('customers'); + // Example: ['customers' => [[ 'id' => 8, 'created_at' => '2015-05-06T17:43:51Z', 'email' => ... + echo '
' . print_r($results, true) . '
'; // JSON output.
+
+  // Last request data.
+  $lastRequest = $woocommerce->http->getRequest();
+  echo '
' . print_r($lastRequest->getUrl(), true) . '
'; // Requested URL (string).
+  echo '
' .
+    print_r($lastRequest->getMethod(), true) .
+    '
'; // Request method (string).
+  echo '
' .
+    print_r($lastRequest->getParameters(), true) .
+    '
'; // Request parameters (array).
+  echo '
' .
+    print_r($lastRequest->getHeaders(), true) .
+    '
'; // Request headers (array).
+  echo '
' . print_r($lastRequest->getBody(), true) . '
'; // Request body (JSON).
+
+  // Last response data.
+  $lastResponse = $woocommerce->http->getResponse();
+  echo '
' . print_r($lastResponse->getCode(), true) . '
'; // Response code (int).
+  echo '
' .
+    print_r($lastResponse->getHeaders(), true) .
+    '
'; // Response headers (array).
+  echo '
' . print_r($lastResponse->getBody(), true) . '
'; // Response body (JSON).
+} catch (HttpClientException $e) {
+  echo '
' . print_r($e->getMessage(), true) . '
'; // Error message.
+  echo '
' . print_r($e->getRequest(), true) . '
'; // Last request data.
+  echo '
' . print_r($e->getResponse(), true) . '
'; // Last response data.
+}
+```
+
+## Release History
+
+- 2022-03-18 - 3.1.0 - Added new options to support `_method` and `X-HTTP-Method-Override` from WP, supports 7+, dropped support to PHP 5.
+- 2019-01-16 - 3.0.0 - Legacy API turned off by default, and improved JSON error handler.
+- 2018-03-29 - 2.0.1 - Fixed fatal errors on `lookForErrors`.
+- 2018-01-12 - 2.0.0 - Responses changes from arrays to `stdClass` objects. Added `follow_redirects` option.
+- 2017-06-06 - 1.3.0 - Remove BOM before decoding and added support for multi-dimensional arrays for oAuth1.0a.
+- 2017-03-15 - 1.2.0 - Added `user_agent` option.
+- 2016-12-14 - 1.1.4 - Fixed WordPress 4.7 compatibility.
+- 2016-10-26 - 1.1.3 - Allow set `oauth_timestamp` and improved how is handled the response headers.
+- 2016-09-30 - 1.1.2 - Added `wp_api_prefix` option to allow custom WP REST API URL prefix.
+- 2016-05-10 - 1.1.1 - Fixed oAuth and error handler for WP REST API.
+- 2016-05-09 - 1.1.0 - Added support for WP REST API, added method `Automattic\WooCommerce\Client::options` and fixed multiple headers responses.
+- 2016-01-25 - 1.0.2 - Fixed an error when getting data containing non-latin characters.
+- 2016-01-21 - 1.0.1 - Sort all oAuth parameters before build request URLs.
+- 2016-01-11 - 1.0.0 - Stable release.
diff --git a/vendor/automattic/woocommerce/composer.json b/vendor/automattic/woocommerce/composer.json
new file mode 100644
index 0000000..907c910
--- /dev/null
+++ b/vendor/automattic/woocommerce/composer.json
@@ -0,0 +1,38 @@
+{
+  "name": "automattic/woocommerce",
+  "description": "A PHP wrapper for the WooCommerce REST API",
+  "type": "library",
+  "license": "MIT",
+  "authors": [
+    {
+      "name": "Claudio Sanches",
+      "email": "claudio.sanches@automattic.com"
+    }
+  ],
+  "minimum-stability": "dev",
+  "keywords": [
+    "API",
+    "WooCommerce"
+  ],
+  "require": {
+    "php": ">= 7.1.0",
+    "ext-curl": "*",
+    "ext-json": "*"
+  },
+  "require-dev": {
+    "phpunit/phpunit": "^8",
+    "squizlabs/php_codesniffer": "3.*",
+    "overtrue/phplint": "7.4.x-dev"
+  },
+  "autoload": {
+    "psr-4": {
+      "Automattic\\WooCommerce\\": ["src/WooCommerce"]
+    }
+  },
+  "autoload-dev": {
+    "psr-4": { 
+      "Automattic\\WooCommerce\\LegacyTests\\": "tests/legacy-php/WooCommerce/Tests",
+      "Automattic\\WooCommerce\\Tests\\": "tests/php/WooCommerce/Tests"
+    }
+  }
+}
diff --git a/vendor/automattic/woocommerce/src/WooCommerce/Client.php b/vendor/automattic/woocommerce/src/WooCommerce/Client.php
new file mode 100644
index 0000000..537313d
--- /dev/null
+++ b/vendor/automattic/woocommerce/src/WooCommerce/Client.php
@@ -0,0 +1,109 @@
+http = new HttpClient($url, $consumerKey, $consumerSecret, $options);
+    }
+
+    /**
+     * POST method.
+     *
+     * @param string $endpoint API endpoint.
+     * @param array  $data     Request data.
+     *
+     * @return \stdClass
+     */
+    public function post($endpoint, $data)
+    {
+        return $this->http->request($endpoint, 'POST', $data);
+    }
+
+    /**
+     * PUT method.
+     *
+     * @param string $endpoint API endpoint.
+     * @param array  $data     Request data.
+     *
+     * @return \stdClass
+     */
+    public function put($endpoint, $data)
+    {
+        return $this->http->request($endpoint, 'PUT', $data);
+    }
+
+    /**
+     * GET method.
+     *
+     * @param string $endpoint   API endpoint.
+     * @param array  $parameters Request parameters.
+     *
+     * @return \stdClass
+     */
+    public function get($endpoint, $parameters = [])
+    {
+        return $this->http->request($endpoint, 'GET', [], $parameters);
+    }
+
+    /**
+     * DELETE method.
+     *
+     * @param string $endpoint   API endpoint.
+     * @param array  $parameters Request parameters.
+     *
+     * @return \stdClass
+     */
+    public function delete($endpoint, $parameters = [])
+    {
+        return $this->http->request($endpoint, 'DELETE', [], $parameters);
+    }
+
+    /**
+     * OPTIONS method.
+     *
+     * @param string $endpoint API endpoint.
+     *
+     * @return \stdClass
+     */
+    public function options($endpoint)
+    {
+        return $this->http->request($endpoint, 'OPTIONS', [], []);
+    }
+}
diff --git a/vendor/automattic/woocommerce/src/WooCommerce/HttpClient/BasicAuth.php b/vendor/automattic/woocommerce/src/WooCommerce/HttpClient/BasicAuth.php
new file mode 100644
index 0000000..d5fd0ec
--- /dev/null
+++ b/vendor/automattic/woocommerce/src/WooCommerce/HttpClient/BasicAuth.php
@@ -0,0 +1,96 @@
+ch             = $ch;
+        $this->consumerKey    = $consumerKey;
+        $this->consumerSecret = $consumerSecret;
+        $this->doQueryString  = $doQueryString;
+        $this->parameters     = $parameters;
+
+        $this->processAuth();
+    }
+
+    /**
+     * Process auth.
+     */
+    protected function processAuth()
+    {
+        if ($this->doQueryString) {
+            $this->parameters['consumer_key']    = $this->consumerKey;
+            $this->parameters['consumer_secret'] = $this->consumerSecret;
+        } else {
+            \curl_setopt($this->ch, CURLOPT_USERPWD, $this->consumerKey . ':' . $this->consumerSecret);
+        }
+    }
+
+    /**
+     * Get parameters.
+     *
+     * @return array
+     */
+    public function getParameters()
+    {
+        return $this->parameters;
+    }
+}
diff --git a/vendor/automattic/woocommerce/src/WooCommerce/HttpClient/HttpClient.php b/vendor/automattic/woocommerce/src/WooCommerce/HttpClient/HttpClient.php
new file mode 100644
index 0000000..f811324
--- /dev/null
+++ b/vendor/automattic/woocommerce/src/WooCommerce/HttpClient/HttpClient.php
@@ -0,0 +1,487 @@
+options        = new Options($options);
+        $this->url            = $this->buildApiUrl($url);
+        $this->consumerKey    = $consumerKey;
+        $this->consumerSecret = $consumerSecret;
+    }
+
+    /**
+     * Check if is under SSL.
+     *
+     * @return bool
+     */
+    protected function isSsl()
+    {
+        return 'https://' === \substr($this->url, 0, 8);
+    }
+
+    /**
+     * Build API URL.
+     *
+     * @param string $url Store URL.
+     *
+     * @return string
+     */
+    protected function buildApiUrl($url)
+    {
+        $api = $this->options->isWPAPI() ? $this->options->apiPrefix() : '/wc-api/';
+
+        return \rtrim($url, '/') . $api . $this->options->getVersion() . '/';
+    }
+
+    /**
+     * Build URL.
+     *
+     * @param string $url        URL.
+     * @param array  $parameters Query string parameters.
+     *
+     * @return string
+     */
+    protected function buildUrlQuery($url, $parameters = [])
+    {
+        if (!empty($parameters)) {
+            if (false !== strpos($url, '?')) {
+                $url .= '&' . \http_build_query($parameters);
+            } else {
+                $url .= '?' . \http_build_query($parameters);
+            }
+        }
+
+        return $url;
+    }
+
+    /**
+     * Authenticate.
+     *
+     * @param string $url        Request URL.
+     * @param string $method     Request method.
+     * @param array  $parameters Request parameters.
+     *
+     * @return array
+     */
+    protected function authenticate($url, $method, $parameters = [])
+    {
+        // Setup authentication.
+        if (!$this->options->isOAuthOnly() && $this->isSsl()) {
+            $basicAuth = new BasicAuth(
+                $this->ch,
+                $this->consumerKey,
+                $this->consumerSecret,
+                $this->options->isQueryStringAuth(),
+                $parameters
+            );
+            $parameters = $basicAuth->getParameters();
+        } else {
+            $oAuth = new OAuth(
+                $url,
+                $this->consumerKey,
+                $this->consumerSecret,
+                $this->options->getVersion(),
+                $method,
+                $parameters,
+                $this->options->oauthTimestamp()
+            );
+            $parameters = $oAuth->getParameters();
+        }
+
+        return $parameters;
+    }
+
+    /**
+     * Setup method.
+     *
+     * @param string $method Request method.
+     */
+    protected function setupMethod($method)
+    {
+        if ('POST' == $method) {
+            \curl_setopt($this->ch, CURLOPT_POST, true);
+        } elseif (\in_array($method, ['PUT', 'DELETE', 'OPTIONS'])) {
+            \curl_setopt($this->ch, CURLOPT_CUSTOMREQUEST, $method);
+        }
+    }
+
+    /**
+     * Get request headers.
+     *
+     * @param  bool $sendData If request send data or not.
+     *
+     * @return array
+     */
+    protected function getRequestHeaders($sendData = false)
+    {
+        $headers = [
+            'Accept'     => 'application/json',
+            'User-Agent' => $this->options->userAgent() . '/' . Client::VERSION,
+        ];
+
+        if ($sendData) {
+            $headers['Content-Type'] = 'application/json;charset=utf-8';
+        }
+
+        return $headers;
+    }
+
+    /**
+     * Create request.
+     *
+     * @param string $endpoint   Request endpoint.
+     * @param string $method     Request method.
+     * @param array  $data       Request data.
+     * @param array  $parameters Request parameters.
+     *
+     * @return Request
+     */
+    protected function createRequest($endpoint, $method, $data = [], $parameters = [])
+    {
+        $body    = '';
+        $url     = $this->url . $endpoint;
+        $hasData = !empty($data);
+        $headers = $this->getRequestHeaders($hasData);
+
+        // HTTP method override feature which masks PUT and DELETE HTTP methods as POST method with added
+        // ?_method=PUT query parameter and/or X-HTTP-Method-Override HTTP header.
+        if (!in_array($method, ['GET', 'POST'])) {
+            $usePostMethod = false;
+            if ($this->options->isMethodOverrideQuery()) {
+                $parameters = array_merge(['_method' => $method], $parameters);
+                $usePostMethod = true;
+            }
+            if ($this->options->isMethodOverrideHeader()) {
+                $headers['X-HTTP-Method-Override'] = $method;
+                $usePostMethod = true;
+            }
+            if ($usePostMethod) {
+                $method = 'POST';
+            }
+        }
+
+        // Setup authentication.
+        $parameters = $this->authenticate($url, $method, $parameters);
+
+        // Setup method.
+        $this->setupMethod($method);
+
+        // Include post fields.
+        if ($hasData) {
+            $body = \json_encode($data);
+            \curl_setopt($this->ch, CURLOPT_POSTFIELDS, $body);
+        }
+
+        $this->request = new Request(
+            $this->buildUrlQuery($url, $parameters),
+            $method,
+            $parameters,
+            $headers,
+            $body
+        );
+
+        return $this->getRequest();
+    }
+
+    /**
+     * Get response headers.
+     *
+     * @return array
+     */
+    protected function getResponseHeaders()
+    {
+        $headers = [];
+        $lines   = \explode("\n", $this->responseHeaders);
+        $lines   = \array_filter($lines, 'trim');
+
+        foreach ($lines as $index => $line) {
+            // Remove HTTP/xxx params.
+            if (strpos($line, ': ') === false) {
+                continue;
+            }
+
+            list($key, $value) = \explode(': ', $line);
+
+            $headers[$key] = isset($headers[$key]) ? $headers[$key] . ', ' . trim($value) : trim($value);
+        }
+
+        return $headers;
+    }
+
+    /**
+     * Create response.
+     *
+     * @return Response
+     */
+    protected function createResponse()
+    {
+
+        // Set response headers.
+        $this->responseHeaders = '';
+        \curl_setopt($this->ch, CURLOPT_HEADERFUNCTION, function ($_, $headers) {
+            $this->responseHeaders .= $headers;
+            return \strlen($headers);
+        });
+
+        // Get response data.
+        $body    = \curl_exec($this->ch);
+        $code    = \curl_getinfo($this->ch, CURLINFO_HTTP_CODE);
+        $headers = $this->getResponseHeaders();
+
+        // Register response.
+        $this->response = new Response($code, $headers, $body);
+
+        return $this->getResponse();
+    }
+
+    /**
+     * Set default cURL settings.
+     */
+    protected function setDefaultCurlSettings()
+    {
+        $verifySsl       = $this->options->verifySsl();
+        $timeout         = $this->options->getTimeout();
+        $followRedirects = $this->options->getFollowRedirects();
+
+        \curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, $verifySsl);
+        if (!$verifySsl) {
+            \curl_setopt($this->ch, CURLOPT_SSL_VERIFYHOST, $verifySsl);
+        }
+        if ($followRedirects) {
+            \curl_setopt($this->ch, CURLOPT_FOLLOWLOCATION, true);
+        }
+        \curl_setopt($this->ch, CURLOPT_CONNECTTIMEOUT, $timeout);
+        \curl_setopt($this->ch, CURLOPT_TIMEOUT, $timeout);
+        \curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, true);
+        \curl_setopt($this->ch, CURLOPT_HTTPHEADER, $this->request->getRawHeaders());
+        \curl_setopt($this->ch, CURLOPT_URL, $this->request->getUrl());
+
+        foreach ($this->customCurlOptions as $customCurlOptionKey => $customCurlOptionValue) {
+            \curl_setopt($this->ch, $customCurlOptionKey, $customCurlOptionValue);
+        }
+    }
+
+    /**
+     * Look for errors in the request.
+     *
+     * @param array $parsedResponse Parsed body response.
+     */
+    protected function lookForErrors($parsedResponse)
+    {
+        // Any non-200/201/202 response code indicates an error.
+        if (!\in_array($this->response->getCode(), ['200', '201', '202'])) {
+            $errors = isset($parsedResponse->errors) ? $parsedResponse->errors : $parsedResponse;
+            $errorMessage = '';
+            $errorCode = '';
+
+            if (is_array($errors)) {
+                $errorMessage = $errors[0]->message;
+                $errorCode    = $errors[0]->code;
+            } elseif (isset($errors->message, $errors->code)) {
+                $errorMessage = $errors->message;
+                $errorCode    = $errors->code;
+            }
+
+            throw new HttpClientException(
+                \sprintf('Error: %s [%s]', $errorMessage, $errorCode),
+                $this->response->getCode(),
+                $this->request,
+                $this->response
+            );
+        }
+    }
+
+    /**
+     * Process response.
+     *
+     * @return \stdClass
+     */
+    protected function processResponse()
+    {
+        $body = $this->response->getBody();
+
+        // Look for UTF-8 BOM and remove.
+        if (0 === strpos(bin2hex(substr($body, 0, 4)), 'efbbbf')) {
+            $body = substr($body, 3);
+        }
+
+        $parsedResponse = \json_decode($body);
+
+        // Test if return a valid JSON.
+        if (JSON_ERROR_NONE !== json_last_error()) {
+            $message = function_exists('json_last_error_msg') ? json_last_error_msg() : 'Invalid JSON returned';
+            throw new HttpClientException(
+                sprintf('JSON ERROR: %s', $message),
+                $this->response->getCode(),
+                $this->request,
+                $this->response
+            );
+        }
+
+        $this->lookForErrors($parsedResponse);
+
+        return $parsedResponse;
+    }
+
+    /**
+     * Make requests.
+     *
+     * @param string $endpoint   Request endpoint.
+     * @param string $method     Request method.
+     * @param array  $data       Request data.
+     * @param array  $parameters Request parameters.
+     *
+     * @return \stdClass
+     */
+    public function request($endpoint, $method, $data = [], $parameters = [])
+    {
+        // Initialize cURL.
+        $this->ch = \curl_init();
+
+        // Set request args.
+        $request = $this->createRequest($endpoint, $method, $data, $parameters);
+
+        // Default cURL settings.
+        $this->setDefaultCurlSettings();
+
+        // Get response.
+        $response = $this->createResponse();
+
+        // Check for cURL errors.
+        if (\curl_errno($this->ch)) {
+            throw new HttpClientException('cURL Error: ' . \curl_error($this->ch), 0, $request, $response);
+        }
+
+        \curl_close($this->ch);
+
+        return $this->processResponse();
+    }
+
+    /**
+     * Get request data.
+     *
+     * @return Request
+     */
+    public function getRequest()
+    {
+        return $this->request;
+    }
+
+    /**
+     * Get response data.
+     *
+     * @return Response
+     */
+    public function getResponse()
+    {
+        return $this->response;
+    }
+
+    /**
+     * Set custom cURL options to use in requests.
+     *
+     * @param array $curlOptions
+     */
+    public function setCustomCurlOptions(array $curlOptions)
+    {
+        $this->customCurlOptions = $curlOptions;
+    }
+}
diff --git a/vendor/automattic/woocommerce/src/WooCommerce/HttpClient/HttpClientException.php b/vendor/automattic/woocommerce/src/WooCommerce/HttpClient/HttpClientException.php
new file mode 100644
index 0000000..bfd149f
--- /dev/null
+++ b/vendor/automattic/woocommerce/src/WooCommerce/HttpClient/HttpClientException.php
@@ -0,0 +1,71 @@
+request  = $request;
+        $this->response = $response;
+    }
+
+    /**
+     * Get request data.
+     *
+     * @return Request
+     */
+    public function getRequest()
+    {
+        return $this->request;
+    }
+
+    /**
+     * Get response data.
+     *
+     * @return Response
+     */
+    public function getResponse()
+    {
+        return $this->response;
+    }
+}
diff --git a/vendor/automattic/woocommerce/src/WooCommerce/HttpClient/OAuth.php b/vendor/automattic/woocommerce/src/WooCommerce/HttpClient/OAuth.php
new file mode 100644
index 0000000..01005d2
--- /dev/null
+++ b/vendor/automattic/woocommerce/src/WooCommerce/HttpClient/OAuth.php
@@ -0,0 +1,268 @@
+url            = $url;
+        $this->consumerKey    = $consumerKey;
+        $this->consumerSecret = $consumerSecret;
+        $this->apiVersion     = $apiVersion;
+        $this->method         = $method;
+        $this->parameters     = $parameters;
+        $this->timestamp      = $timestamp;
+    }
+
+    /**
+     * Encode according to RFC 3986.
+     *
+     * @param string|array $value Value to be normalized.
+     *
+     * @return string
+     */
+    protected function encode($value)
+    {
+        if (is_array($value)) {
+            return array_map([$this, 'encode'], $value);
+        } else {
+            return str_replace(['+', '%7E'], [' ', '~'], rawurlencode($value));
+        }
+    }
+
+    /**
+     * Normalize parameters.
+     *
+     * @param array $parameters Parameters to normalize.
+     *
+     * @return array
+     */
+    protected function normalizeParameters($parameters)
+    {
+        $normalized = [];
+
+        foreach ($parameters as $key => $value) {
+            // Percent symbols (%) must be double-encoded.
+            $key   = $this->encode($key);
+            $value = $this->encode($value);
+
+            $normalized[$key] = $value;
+        }
+
+        return $normalized;
+    }
+
+    /**
+     * Process filters.
+     *
+     * @param array $parameters Request parameters.
+     *
+     * @return array
+     */
+    protected function processFilters($parameters)
+    {
+        if (isset($parameters['filter'])) {
+            $filters = $parameters['filter'];
+            unset($parameters['filter']);
+            foreach ($filters as $filter => $value) {
+                $parameters['filter[' . $filter . ']'] = $value;
+            }
+        }
+
+        return $parameters;
+    }
+
+    /**
+     * Get secret.
+     *
+     * @return string
+     */
+    protected function getSecret()
+    {
+        $secret = $this->consumerSecret;
+
+        // Fix secret for v3 or later.
+        if (!\in_array($this->apiVersion, ['v1', 'v2'])) {
+            $secret .= '&';
+        }
+
+        return $secret;
+    }
+
+    /**
+     * Generate oAuth1.0 signature.
+     *
+     * @param array $parameters Request parameters including oauth.
+     *
+     * @return string
+     */
+    protected function generateOauthSignature($parameters)
+    {
+        $baseRequestUri = \rawurlencode($this->url);
+
+        // Extract filters.
+        $parameters = $this->processFilters($parameters);
+
+        // Normalize parameter key/values and sort them.
+        $parameters = $this->normalizeParameters($parameters);
+        $parameters = $this->getSortedParameters($parameters);
+
+        // Set query string.
+        $queryString  = \implode('%26', $this->joinWithEqualsSign($parameters)); // Join with ampersand.
+        $stringToSign = $this->method . '&' . $baseRequestUri . '&' . $queryString;
+        $secret       = $this->getSecret();
+
+        return \base64_encode(\hash_hmac(self::HASH_ALGORITHM, $stringToSign, $secret, true));
+    }
+
+    /**
+     * Creates an array of urlencoded strings out of each array key/value pairs.
+     *
+     * @param  array  $params      Array of parameters to convert.
+     * @param  array  $queryParams Array to extend.
+     * @param  string $key         Optional Array key to append
+     * @return string              Array of urlencoded strings
+     */
+    protected function joinWithEqualsSign($params, $queryParams = [], $key = '')
+    {
+        foreach ($params as $paramKey => $paramValue) {
+            if ($key) {
+                $paramKey = $key . '%5B' . $paramKey . '%5D'; // Handle multi-dimensional array.
+            }
+
+            if (is_array($paramValue)) {
+                $queryParams = $this->joinWithEqualsSign($paramValue, $queryParams, $paramKey);
+            } else {
+                $string = $paramKey . '=' . $paramValue; // Join with equals sign.
+                $queryParams[] = $this->encode($string);
+            }
+        }
+
+        return $queryParams;
+    }
+
+    /**
+     * Sort parameters.
+     *
+     * @param array $parameters Parameters to sort in byte-order.
+     *
+     * @return array
+     */
+    protected function getSortedParameters($parameters)
+    {
+        \uksort($parameters, 'strcmp');
+
+        foreach ($parameters as $key => $value) {
+            if (\is_array($value)) {
+                \uksort($parameters[$key], 'strcmp');
+            }
+        }
+
+        return $parameters;
+    }
+
+    /**
+     * Get oAuth1.0 parameters.
+     *
+     * @return string
+     */
+    public function getParameters()
+    {
+        $parameters = \array_merge($this->parameters, [
+            'oauth_consumer_key'     => $this->consumerKey,
+            'oauth_timestamp'        => $this->timestamp,
+            'oauth_nonce'            => \sha1(\microtime()),
+            'oauth_signature_method' => 'HMAC-' . self::HASH_ALGORITHM,
+        ]);
+
+        // The parameters above must be included in the signature generation.
+        $parameters['oauth_signature'] = $this->generateOauthSignature($parameters);
+
+        return $this->getSortedParameters($parameters);
+    }
+}
diff --git a/vendor/automattic/woocommerce/src/WooCommerce/HttpClient/Options.php b/vendor/automattic/woocommerce/src/WooCommerce/HttpClient/Options.php
new file mode 100644
index 0000000..3e2ce6a
--- /dev/null
+++ b/vendor/automattic/woocommerce/src/WooCommerce/HttpClient/Options.php
@@ -0,0 +1,182 @@
+options = $options;
+    }
+
+    /**
+     * Get API version.
+     *
+     * @return string
+     */
+    public function getVersion()
+    {
+        return isset($this->options['version']) ? $this->options['version'] : self::VERSION;
+    }
+
+    /**
+     * Check if need to verify SSL.
+     *
+     * @return bool
+     */
+    public function verifySsl()
+    {
+        return isset($this->options['verify_ssl']) ? (bool) $this->options['verify_ssl'] : true;
+    }
+
+    /**
+     * Only use OAuth.
+     *
+     * @return bool
+     */
+    public function isOAuthOnly()
+    {
+        return isset($this->options['oauth_only']) ? (bool) $this->options['oauth_only'] : false;
+    }
+
+    /**
+     * Get timeout.
+     *
+     * @return int
+     */
+    public function getTimeout()
+    {
+        return isset($this->options['timeout']) ? (int) $this->options['timeout'] : self::TIMEOUT;
+    }
+
+    /**
+     * Basic Authentication as query string.
+     * Some old servers are not able to use CURLOPT_USERPWD.
+     *
+     * @return bool
+     */
+    public function isQueryStringAuth()
+    {
+        return isset($this->options['query_string_auth']) ? (bool) $this->options['query_string_auth'] : false;
+    }
+
+    /**
+     * Check if is WP REST API.
+     *
+     * @return bool
+     */
+    public function isWPAPI()
+    {
+        return isset($this->options['wp_api']) ? (bool) $this->options['wp_api'] : true;
+    }
+
+    /**
+     * Custom API Prefix for WP API.
+     *
+     * @return string
+     */
+    public function apiPrefix()
+    {
+        return isset($this->options['wp_api_prefix']) ? $this->options['wp_api_prefix'] : self::WP_API_PREFIX;
+    }
+
+    /**
+     * oAuth timestamp.
+     *
+     * @return string
+     */
+    public function oauthTimestamp()
+    {
+        return isset($this->options['oauth_timestamp']) ? $this->options['oauth_timestamp'] : \time();
+    }
+
+    /**
+     * Custom user agent.
+     *
+     * @return string
+     */
+    public function userAgent()
+    {
+        return isset($this->options['user_agent']) ? $this->options['user_agent'] : self::USER_AGENT;
+    }
+
+    /**
+     * Get follow redirects.
+     *
+     * @return bool
+     */
+    public function getFollowRedirects()
+    {
+        return isset($this->options['follow_redirects']) ? (bool) $this->options['follow_redirects'] : false;
+    }
+
+    /**
+     * Check is it needed to mask all non-GET/POST methods (PUT/DELETE/etc.) by using POST method with added
+     * query parameter ?_method=METHOD into URL.
+     *
+     * @return bool
+     */
+    public function isMethodOverrideQuery()
+    {
+        return isset($this->options['method_override_query']) && $this->options['method_override_query'];
+    }
+
+    /**
+     * Check is it needed to mask all non-GET/POST methods (PUT/DELETE/etc.) by using POST method with added
+     * "X-HTTP-Method-Override: METHOD" HTTP header into request.
+     *
+     * @return bool
+     */
+    public function isMethodOverrideHeader()
+    {
+        return isset($this->options['method_override_header']) && $this->options['method_override_header'];
+    }
+}
diff --git a/vendor/automattic/woocommerce/src/WooCommerce/HttpClient/Request.php b/vendor/automattic/woocommerce/src/WooCommerce/HttpClient/Request.php
new file mode 100644
index 0000000..81fe79c
--- /dev/null
+++ b/vendor/automattic/woocommerce/src/WooCommerce/HttpClient/Request.php
@@ -0,0 +1,187 @@
+url        = $url;
+        $this->method     = $method;
+        $this->parameters = $parameters;
+        $this->headers    = $headers;
+        $this->body       = $body;
+    }
+
+    /**
+     * Set url.
+     *
+     * @param string $url Request url.
+     */
+    public function setUrl($url)
+    {
+        $this->url = $url;
+    }
+
+    /**
+     * Set method.
+     *
+     * @param string $method Request method.
+     */
+    public function setMethod($method)
+    {
+        $this->method = $method;
+    }
+
+    /**
+     * Set parameters.
+     *
+     * @param array $parameters Request paramenters.
+     */
+    public function setParameters($parameters)
+    {
+        $this->parameters = $parameters;
+    }
+
+    /**
+     * Set headers.
+     *
+     * @param array $headers Request headers.
+     */
+    public function setHeaders($headers)
+    {
+        $this->headers = $headers;
+    }
+
+    /**
+     * Set body.
+     *
+     * @param string $body Request body.
+     */
+    public function setBody($body)
+    {
+        $this->body = $body;
+    }
+
+    /**
+     * Get url.
+     *
+     * @return string
+     */
+    public function getUrl()
+    {
+        return $this->url;
+    }
+
+    /**
+     * Get method.
+     *
+     * @return string
+     */
+    public function getMethod()
+    {
+        return $this->method;
+    }
+
+    /**
+     * Get parameters.
+     *
+     * @return array
+     */
+    public function getParameters()
+    {
+        return $this->parameters;
+    }
+
+    /**
+     * Get headers.
+     *
+     * @return array
+     */
+    public function getHeaders()
+    {
+        return $this->headers;
+    }
+
+    /**
+     * Get raw headers.
+     *
+     * @return array
+     */
+    public function getRawHeaders()
+    {
+        $headers = [];
+
+        foreach ($this->headers as $key => $value) {
+            $headers[] = $key . ': ' . $value;
+        }
+
+        return $headers;
+    }
+
+    /**
+     * Get body.
+     *
+     * @return string
+     */
+    public function getBody()
+    {
+        return $this->body;
+    }
+}
diff --git a/vendor/automattic/woocommerce/src/WooCommerce/HttpClient/Response.php b/vendor/automattic/woocommerce/src/WooCommerce/HttpClient/Response.php
new file mode 100644
index 0000000..b5a5de1
--- /dev/null
+++ b/vendor/automattic/woocommerce/src/WooCommerce/HttpClient/Response.php
@@ -0,0 +1,127 @@
+code    = $code;
+        $this->headers = $headers;
+        $this->body    = $body;
+    }
+
+    /**
+     * To string.
+     *
+     * @return string
+     */
+    public function __toString()
+    {
+        return \json_encode([
+            'code'    => $this->code,
+            'headers' => $this->headers,
+            'body'    => $this->body,
+        ]);
+    }
+
+    /**
+     * Set code.
+     *
+     * @param int $code Response code.
+     */
+    public function setCode($code)
+    {
+        $this->code = (int) $code;
+    }
+
+    /**
+     * Set headers.
+     *
+     * @param array $headers Response headers.
+     */
+    public function setHeaders($headers)
+    {
+        $this->headers = $headers;
+    }
+
+    /**
+     * Set body.
+     *
+     * @param string $body Response body.
+     */
+    public function setBody($body)
+    {
+        $this->body = $body;
+    }
+
+    /**
+     * Get code.
+     *
+     * @return int
+     */
+    public function getCode()
+    {
+        return $this->code;
+    }
+
+    /**
+     * Get headers.
+     *
+     * @return array $headers Response headers.
+     */
+    public function getHeaders()
+    {
+        return $this->headers;
+    }
+
+    /**
+     * Get body.
+     *
+     * @return string $body Response body.
+     */
+    public function getBody()
+    {
+        return $this->body;
+    }
+}
diff --git a/vendor/composer/ClassLoader.php b/vendor/composer/ClassLoader.php
new file mode 100644
index 0000000..7824d8f
--- /dev/null
+++ b/vendor/composer/ClassLoader.php
@@ -0,0 +1,579 @@
+
+ *     Jordi Boggiano 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Autoload;
+
+/**
+ * ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
+ *
+ *     $loader = new \Composer\Autoload\ClassLoader();
+ *
+ *     // register classes with namespaces
+ *     $loader->add('Symfony\Component', __DIR__.'/component');
+ *     $loader->add('Symfony',           __DIR__.'/framework');
+ *
+ *     // activate the autoloader
+ *     $loader->register();
+ *
+ *     // to enable searching the include path (eg. for PEAR packages)
+ *     $loader->setUseIncludePath(true);
+ *
+ * In this example, if you try to use a class in the Symfony\Component
+ * namespace or one of its children (Symfony\Component\Console for instance),
+ * the autoloader will first look for the class under the component/
+ * directory, and it will then fallback to the framework/ directory if not
+ * found before giving up.
+ *
+ * This class is loosely based on the Symfony UniversalClassLoader.
+ *
+ * @author Fabien Potencier 
+ * @author Jordi Boggiano 
+ * @see    https://www.php-fig.org/psr/psr-0/
+ * @see    https://www.php-fig.org/psr/psr-4/
+ */
+class ClassLoader
+{
+    /** @var \Closure(string):void */
+    private static $includeFile;
+
+    /** @var string|null */
+    private $vendorDir;
+
+    // PSR-4
+    /**
+     * @var array>
+     */
+    private $prefixLengthsPsr4 = array();
+    /**
+     * @var array>
+     */
+    private $prefixDirsPsr4 = array();
+    /**
+     * @var list
+     */
+    private $fallbackDirsPsr4 = array();
+
+    // PSR-0
+    /**
+     * List of PSR-0 prefixes
+     *
+     * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2')))
+     *
+     * @var array>>
+     */
+    private $prefixesPsr0 = array();
+    /**
+     * @var list
+     */
+    private $fallbackDirsPsr0 = array();
+
+    /** @var bool */
+    private $useIncludePath = false;
+
+    /**
+     * @var array
+     */
+    private $classMap = array();
+
+    /** @var bool */
+    private $classMapAuthoritative = false;
+
+    /**
+     * @var array
+     */
+    private $missingClasses = array();
+
+    /** @var string|null */
+    private $apcuPrefix;
+
+    /**
+     * @var array
+     */
+    private static $registeredLoaders = array();
+
+    /**
+     * @param string|null $vendorDir
+     */
+    public function __construct($vendorDir = null)
+    {
+        $this->vendorDir = $vendorDir;
+        self::initializeIncludeClosure();
+    }
+
+    /**
+     * @return array>
+     */
+    public function getPrefixes()
+    {
+        if (!empty($this->prefixesPsr0)) {
+            return call_user_func_array('array_merge', array_values($this->prefixesPsr0));
+        }
+
+        return array();
+    }
+
+    /**
+     * @return array>
+     */
+    public function getPrefixesPsr4()
+    {
+        return $this->prefixDirsPsr4;
+    }
+
+    /**
+     * @return list
+     */
+    public function getFallbackDirs()
+    {
+        return $this->fallbackDirsPsr0;
+    }
+
+    /**
+     * @return list
+     */
+    public function getFallbackDirsPsr4()
+    {
+        return $this->fallbackDirsPsr4;
+    }
+
+    /**
+     * @return array Array of classname => path
+     */
+    public function getClassMap()
+    {
+        return $this->classMap;
+    }
+
+    /**
+     * @param array $classMap Class to filename map
+     *
+     * @return void
+     */
+    public function addClassMap(array $classMap)
+    {
+        if ($this->classMap) {
+            $this->classMap = array_merge($this->classMap, $classMap);
+        } else {
+            $this->classMap = $classMap;
+        }
+    }
+
+    /**
+     * Registers a set of PSR-0 directories for a given prefix, either
+     * appending or prepending to the ones previously set for this prefix.
+     *
+     * @param string              $prefix  The prefix
+     * @param list|string $paths   The PSR-0 root directories
+     * @param bool                $prepend Whether to prepend the directories
+     *
+     * @return void
+     */
+    public function add($prefix, $paths, $prepend = false)
+    {
+        $paths = (array) $paths;
+        if (!$prefix) {
+            if ($prepend) {
+                $this->fallbackDirsPsr0 = array_merge(
+                    $paths,
+                    $this->fallbackDirsPsr0
+                );
+            } else {
+                $this->fallbackDirsPsr0 = array_merge(
+                    $this->fallbackDirsPsr0,
+                    $paths
+                );
+            }
+
+            return;
+        }
+
+        $first = $prefix[0];
+        if (!isset($this->prefixesPsr0[$first][$prefix])) {
+            $this->prefixesPsr0[$first][$prefix] = $paths;
+
+            return;
+        }
+        if ($prepend) {
+            $this->prefixesPsr0[$first][$prefix] = array_merge(
+                $paths,
+                $this->prefixesPsr0[$first][$prefix]
+            );
+        } else {
+            $this->prefixesPsr0[$first][$prefix] = array_merge(
+                $this->prefixesPsr0[$first][$prefix],
+                $paths
+            );
+        }
+    }
+
+    /**
+     * Registers a set of PSR-4 directories for a given namespace, either
+     * appending or prepending to the ones previously set for this namespace.
+     *
+     * @param string              $prefix  The prefix/namespace, with trailing '\\'
+     * @param list|string $paths   The PSR-4 base directories
+     * @param bool                $prepend Whether to prepend the directories
+     *
+     * @throws \InvalidArgumentException
+     *
+     * @return void
+     */
+    public function addPsr4($prefix, $paths, $prepend = false)
+    {
+        $paths = (array) $paths;
+        if (!$prefix) {
+            // Register directories for the root namespace.
+            if ($prepend) {
+                $this->fallbackDirsPsr4 = array_merge(
+                    $paths,
+                    $this->fallbackDirsPsr4
+                );
+            } else {
+                $this->fallbackDirsPsr4 = array_merge(
+                    $this->fallbackDirsPsr4,
+                    $paths
+                );
+            }
+        } elseif (!isset($this->prefixDirsPsr4[$prefix])) {
+            // Register directories for a new namespace.
+            $length = strlen($prefix);
+            if ('\\' !== $prefix[$length - 1]) {
+                throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
+            }
+            $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
+            $this->prefixDirsPsr4[$prefix] = $paths;
+        } elseif ($prepend) {
+            // Prepend directories for an already registered namespace.
+            $this->prefixDirsPsr4[$prefix] = array_merge(
+                $paths,
+                $this->prefixDirsPsr4[$prefix]
+            );
+        } else {
+            // Append directories for an already registered namespace.
+            $this->prefixDirsPsr4[$prefix] = array_merge(
+                $this->prefixDirsPsr4[$prefix],
+                $paths
+            );
+        }
+    }
+
+    /**
+     * Registers a set of PSR-0 directories for a given prefix,
+     * replacing any others previously set for this prefix.
+     *
+     * @param string              $prefix The prefix
+     * @param list|string $paths  The PSR-0 base directories
+     *
+     * @return void
+     */
+    public function set($prefix, $paths)
+    {
+        if (!$prefix) {
+            $this->fallbackDirsPsr0 = (array) $paths;
+        } else {
+            $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
+        }
+    }
+
+    /**
+     * Registers a set of PSR-4 directories for a given namespace,
+     * replacing any others previously set for this namespace.
+     *
+     * @param string              $prefix The prefix/namespace, with trailing '\\'
+     * @param list|string $paths  The PSR-4 base directories
+     *
+     * @throws \InvalidArgumentException
+     *
+     * @return void
+     */
+    public function setPsr4($prefix, $paths)
+    {
+        if (!$prefix) {
+            $this->fallbackDirsPsr4 = (array) $paths;
+        } else {
+            $length = strlen($prefix);
+            if ('\\' !== $prefix[$length - 1]) {
+                throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
+            }
+            $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
+            $this->prefixDirsPsr4[$prefix] = (array) $paths;
+        }
+    }
+
+    /**
+     * Turns on searching the include path for class files.
+     *
+     * @param bool $useIncludePath
+     *
+     * @return void
+     */
+    public function setUseIncludePath($useIncludePath)
+    {
+        $this->useIncludePath = $useIncludePath;
+    }
+
+    /**
+     * Can be used to check if the autoloader uses the include path to check
+     * for classes.
+     *
+     * @return bool
+     */
+    public function getUseIncludePath()
+    {
+        return $this->useIncludePath;
+    }
+
+    /**
+     * Turns off searching the prefix and fallback directories for classes
+     * that have not been registered with the class map.
+     *
+     * @param bool $classMapAuthoritative
+     *
+     * @return void
+     */
+    public function setClassMapAuthoritative($classMapAuthoritative)
+    {
+        $this->classMapAuthoritative = $classMapAuthoritative;
+    }
+
+    /**
+     * Should class lookup fail if not found in the current class map?
+     *
+     * @return bool
+     */
+    public function isClassMapAuthoritative()
+    {
+        return $this->classMapAuthoritative;
+    }
+
+    /**
+     * APCu prefix to use to cache found/not-found classes, if the extension is enabled.
+     *
+     * @param string|null $apcuPrefix
+     *
+     * @return void
+     */
+    public function setApcuPrefix($apcuPrefix)
+    {
+        $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null;
+    }
+
+    /**
+     * The APCu prefix in use, or null if APCu caching is not enabled.
+     *
+     * @return string|null
+     */
+    public function getApcuPrefix()
+    {
+        return $this->apcuPrefix;
+    }
+
+    /**
+     * Registers this instance as an autoloader.
+     *
+     * @param bool $prepend Whether to prepend the autoloader or not
+     *
+     * @return void
+     */
+    public function register($prepend = false)
+    {
+        spl_autoload_register(array($this, 'loadClass'), true, $prepend);
+
+        if (null === $this->vendorDir) {
+            return;
+        }
+
+        if ($prepend) {
+            self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders;
+        } else {
+            unset(self::$registeredLoaders[$this->vendorDir]);
+            self::$registeredLoaders[$this->vendorDir] = $this;
+        }
+    }
+
+    /**
+     * Unregisters this instance as an autoloader.
+     *
+     * @return void
+     */
+    public function unregister()
+    {
+        spl_autoload_unregister(array($this, 'loadClass'));
+
+        if (null !== $this->vendorDir) {
+            unset(self::$registeredLoaders[$this->vendorDir]);
+        }
+    }
+
+    /**
+     * Loads the given class or interface.
+     *
+     * @param  string    $class The name of the class
+     * @return true|null True if loaded, null otherwise
+     */
+    public function loadClass($class)
+    {
+        if ($file = $this->findFile($class)) {
+            $includeFile = self::$includeFile;
+            $includeFile($file);
+
+            return true;
+        }
+
+        return null;
+    }
+
+    /**
+     * Finds the path to the file where the class is defined.
+     *
+     * @param string $class The name of the class
+     *
+     * @return string|false The path if found, false otherwise
+     */
+    public function findFile($class)
+    {
+        // class map lookup
+        if (isset($this->classMap[$class])) {
+            return $this->classMap[$class];
+        }
+        if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
+            return false;
+        }
+        if (null !== $this->apcuPrefix) {
+            $file = apcu_fetch($this->apcuPrefix.$class, $hit);
+            if ($hit) {
+                return $file;
+            }
+        }
+
+        $file = $this->findFileWithExtension($class, '.php');
+
+        // Search for Hack files if we are running on HHVM
+        if (false === $file && defined('HHVM_VERSION')) {
+            $file = $this->findFileWithExtension($class, '.hh');
+        }
+
+        if (null !== $this->apcuPrefix) {
+            apcu_add($this->apcuPrefix.$class, $file);
+        }
+
+        if (false === $file) {
+            // Remember that this class does not exist.
+            $this->missingClasses[$class] = true;
+        }
+
+        return $file;
+    }
+
+    /**
+     * Returns the currently registered loaders keyed by their corresponding vendor directories.
+     *
+     * @return array
+     */
+    public static function getRegisteredLoaders()
+    {
+        return self::$registeredLoaders;
+    }
+
+    /**
+     * @param  string       $class
+     * @param  string       $ext
+     * @return string|false
+     */
+    private function findFileWithExtension($class, $ext)
+    {
+        // PSR-4 lookup
+        $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
+
+        $first = $class[0];
+        if (isset($this->prefixLengthsPsr4[$first])) {
+            $subPath = $class;
+            while (false !== $lastPos = strrpos($subPath, '\\')) {
+                $subPath = substr($subPath, 0, $lastPos);
+                $search = $subPath . '\\';
+                if (isset($this->prefixDirsPsr4[$search])) {
+                    $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);
+                    foreach ($this->prefixDirsPsr4[$search] as $dir) {
+                        if (file_exists($file = $dir . $pathEnd)) {
+                            return $file;
+                        }
+                    }
+                }
+            }
+        }
+
+        // PSR-4 fallback dirs
+        foreach ($this->fallbackDirsPsr4 as $dir) {
+            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
+                return $file;
+            }
+        }
+
+        // PSR-0 lookup
+        if (false !== $pos = strrpos($class, '\\')) {
+            // namespaced class name
+            $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
+                . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
+        } else {
+            // PEAR-like class name
+            $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
+        }
+
+        if (isset($this->prefixesPsr0[$first])) {
+            foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
+                if (0 === strpos($class, $prefix)) {
+                    foreach ($dirs as $dir) {
+                        if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
+                            return $file;
+                        }
+                    }
+                }
+            }
+        }
+
+        // PSR-0 fallback dirs
+        foreach ($this->fallbackDirsPsr0 as $dir) {
+            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
+                return $file;
+            }
+        }
+
+        // PSR-0 include paths.
+        if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
+            return $file;
+        }
+
+        return false;
+    }
+
+    /**
+     * @return void
+     */
+    private static function initializeIncludeClosure()
+    {
+        if (self::$includeFile !== null) {
+            return;
+        }
+
+        /**
+         * Scope isolated include.
+         *
+         * Prevents access to $this/self from included files.
+         *
+         * @param  string $file
+         * @return void
+         */
+        self::$includeFile = \Closure::bind(static function($file) {
+            include $file;
+        }, null, null);
+    }
+}
diff --git a/vendor/composer/InstalledVersions.php b/vendor/composer/InstalledVersions.php
new file mode 100644
index 0000000..2052022
--- /dev/null
+++ b/vendor/composer/InstalledVersions.php
@@ -0,0 +1,396 @@
+
+ *     Jordi Boggiano 
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer;
+
+use Composer\Autoload\ClassLoader;
+use Composer\Semver\VersionParser;
+
+/**
+ * This class is copied in every Composer installed project and available to all
+ *
+ * See also https://getcomposer.org/doc/07-runtime.md#installed-versions
+ *
+ * To require its presence, you can require `composer-runtime-api ^2.0`
+ *
+ * @final
+ */
+class InstalledVersions
+{
+    /**
+     * @var string|null if set (by reflection by Composer), this should be set to the path where this class is being copied to
+     * @internal
+     */
+    private static $selfDir = null;
+
+    /**
+     * @var mixed[]|null
+     * @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array}|array{}|null
+     */
+    private static $installed;
+
+    /**
+     * @var bool
+     */
+    private static $installedIsLocalDir;
+
+    /**
+     * @var bool|null
+     */
+    private static $canGetVendors;
+
+    /**
+     * @var array[]
+     * @psalm-var array}>
+     */
+    private static $installedByVendor = array();
+
+    /**
+     * Returns a list of all package names which are present, either by being installed, replaced or provided
+     *
+     * @return string[]
+     * @psalm-return list
+     */
+    public static function getInstalledPackages()
+    {
+        $packages = array();
+        foreach (self::getInstalled() as $installed) {
+            $packages[] = array_keys($installed['versions']);
+        }
+
+        if (1 === \count($packages)) {
+            return $packages[0];
+        }
+
+        return array_keys(array_flip(\call_user_func_array('array_merge', $packages)));
+    }
+
+    /**
+     * Returns a list of all package names with a specific type e.g. 'library'
+     *
+     * @param  string   $type
+     * @return string[]
+     * @psalm-return list
+     */
+    public static function getInstalledPackagesByType($type)
+    {
+        $packagesByType = array();
+
+        foreach (self::getInstalled() as $installed) {
+            foreach ($installed['versions'] as $name => $package) {
+                if (isset($package['type']) && $package['type'] === $type) {
+                    $packagesByType[] = $name;
+                }
+            }
+        }
+
+        return $packagesByType;
+    }
+
+    /**
+     * Checks whether the given package is installed
+     *
+     * This also returns true if the package name is provided or replaced by another package
+     *
+     * @param  string $packageName
+     * @param  bool   $includeDevRequirements
+     * @return bool
+     */
+    public static function isInstalled($packageName, $includeDevRequirements = true)
+    {
+        foreach (self::getInstalled() as $installed) {
+            if (isset($installed['versions'][$packageName])) {
+                return $includeDevRequirements || !isset($installed['versions'][$packageName]['dev_requirement']) || $installed['versions'][$packageName]['dev_requirement'] === false;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * Checks whether the given package satisfies a version constraint
+     *
+     * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call:
+     *
+     *   Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3')
+     *
+     * @param  VersionParser $parser      Install composer/semver to have access to this class and functionality
+     * @param  string        $packageName
+     * @param  string|null   $constraint  A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package
+     * @return bool
+     */
+    public static function satisfies(VersionParser $parser, $packageName, $constraint)
+    {
+        $constraint = $parser->parseConstraints((string) $constraint);
+        $provided = $parser->parseConstraints(self::getVersionRanges($packageName));
+
+        return $provided->matches($constraint);
+    }
+
+    /**
+     * Returns a version constraint representing all the range(s) which are installed for a given package
+     *
+     * It is easier to use this via isInstalled() with the $constraint argument if you need to check
+     * whether a given version of a package is installed, and not just whether it exists
+     *
+     * @param  string $packageName
+     * @return string Version constraint usable with composer/semver
+     */
+    public static function getVersionRanges($packageName)
+    {
+        foreach (self::getInstalled() as $installed) {
+            if (!isset($installed['versions'][$packageName])) {
+                continue;
+            }
+
+            $ranges = array();
+            if (isset($installed['versions'][$packageName]['pretty_version'])) {
+                $ranges[] = $installed['versions'][$packageName]['pretty_version'];
+            }
+            if (array_key_exists('aliases', $installed['versions'][$packageName])) {
+                $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']);
+            }
+            if (array_key_exists('replaced', $installed['versions'][$packageName])) {
+                $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']);
+            }
+            if (array_key_exists('provided', $installed['versions'][$packageName])) {
+                $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']);
+            }
+
+            return implode(' || ', $ranges);
+        }
+
+        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
+    }
+
+    /**
+     * @param  string      $packageName
+     * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
+     */
+    public static function getVersion($packageName)
+    {
+        foreach (self::getInstalled() as $installed) {
+            if (!isset($installed['versions'][$packageName])) {
+                continue;
+            }
+
+            if (!isset($installed['versions'][$packageName]['version'])) {
+                return null;
+            }
+
+            return $installed['versions'][$packageName]['version'];
+        }
+
+        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
+    }
+
+    /**
+     * @param  string      $packageName
+     * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
+     */
+    public static function getPrettyVersion($packageName)
+    {
+        foreach (self::getInstalled() as $installed) {
+            if (!isset($installed['versions'][$packageName])) {
+                continue;
+            }
+
+            if (!isset($installed['versions'][$packageName]['pretty_version'])) {
+                return null;
+            }
+
+            return $installed['versions'][$packageName]['pretty_version'];
+        }
+
+        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
+    }
+
+    /**
+     * @param  string      $packageName
+     * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference
+     */
+    public static function getReference($packageName)
+    {
+        foreach (self::getInstalled() as $installed) {
+            if (!isset($installed['versions'][$packageName])) {
+                continue;
+            }
+
+            if (!isset($installed['versions'][$packageName]['reference'])) {
+                return null;
+            }
+
+            return $installed['versions'][$packageName]['reference'];
+        }
+
+        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
+    }
+
+    /**
+     * @param  string      $packageName
+     * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path.
+     */
+    public static function getInstallPath($packageName)
+    {
+        foreach (self::getInstalled() as $installed) {
+            if (!isset($installed['versions'][$packageName])) {
+                continue;
+            }
+
+            return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null;
+        }
+
+        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
+    }
+
+    /**
+     * @return array
+     * @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}
+     */
+    public static function getRootPackage()
+    {
+        $installed = self::getInstalled();
+
+        return $installed[0]['root'];
+    }
+
+    /**
+     * Returns the raw installed.php data for custom implementations
+     *
+     * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect.
+     * @return array[]
+     * @psalm-return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array}
+     */
+    public static function getRawData()
+    {
+        @trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED);
+
+        if (null === self::$installed) {
+            // only require the installed.php file if this file is loaded from its dumped location,
+            // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
+            if (substr(__DIR__, -8, 1) !== 'C') {
+                self::$installed = include __DIR__ . '/installed.php';
+            } else {
+                self::$installed = array();
+            }
+        }
+
+        return self::$installed;
+    }
+
+    /**
+     * Returns the raw data of all installed.php which are currently loaded for custom implementations
+     *
+     * @return array[]
+     * @psalm-return list}>
+     */
+    public static function getAllRawData()
+    {
+        return self::getInstalled();
+    }
+
+    /**
+     * Lets you reload the static array from another file
+     *
+     * This is only useful for complex integrations in which a project needs to use
+     * this class but then also needs to execute another project's autoloader in process,
+     * and wants to ensure both projects have access to their version of installed.php.
+     *
+     * A typical case would be PHPUnit, where it would need to make sure it reads all
+     * the data it needs from this class, then call reload() with
+     * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure
+     * the project in which it runs can then also use this class safely, without
+     * interference between PHPUnit's dependencies and the project's dependencies.
+     *
+     * @param  array[] $data A vendor/composer/installed.php data set
+     * @return void
+     *
+     * @psalm-param array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $data
+     */
+    public static function reload($data)
+    {
+        self::$installed = $data;
+        self::$installedByVendor = array();
+
+        // when using reload, we disable the duplicate protection to ensure that self::$installed data is
+        // always returned, but we cannot know whether it comes from the installed.php in __DIR__ or not,
+        // so we have to assume it does not, and that may result in duplicate data being returned when listing
+        // all installed packages for example
+        self::$installedIsLocalDir = false;
+    }
+
+    /**
+     * @return string
+     */
+    private static function getSelfDir()
+    {
+        if (self::$selfDir === null) {
+            self::$selfDir = strtr(__DIR__, '\\', '/');
+        }
+
+        return self::$selfDir;
+    }
+
+    /**
+     * @return array[]
+     * @psalm-return list}>
+     */
+    private static function getInstalled()
+    {
+        if (null === self::$canGetVendors) {
+            self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders');
+        }
+
+        $installed = array();
+        $copiedLocalDir = false;
+
+        if (self::$canGetVendors) {
+            $selfDir = self::getSelfDir();
+            foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
+                $vendorDir = strtr($vendorDir, '\\', '/');
+                if (isset(self::$installedByVendor[$vendorDir])) {
+                    $installed[] = self::$installedByVendor[$vendorDir];
+                } elseif (is_file($vendorDir.'/composer/installed.php')) {
+                    /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $required */
+                    $required = require $vendorDir.'/composer/installed.php';
+                    self::$installedByVendor[$vendorDir] = $required;
+                    $installed[] = $required;
+                    if (self::$installed === null && $vendorDir.'/composer' === $selfDir) {
+                        self::$installed = $required;
+                        self::$installedIsLocalDir = true;
+                    }
+                }
+                if (self::$installedIsLocalDir && $vendorDir.'/composer' === $selfDir) {
+                    $copiedLocalDir = true;
+                }
+            }
+        }
+
+        if (null === self::$installed) {
+            // only require the installed.php file if this file is loaded from its dumped location,
+            // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
+            if (substr(__DIR__, -8, 1) !== 'C') {
+                /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $required */
+                $required = require __DIR__ . '/installed.php';
+                self::$installed = $required;
+            } else {
+                self::$installed = array();
+            }
+        }
+
+        if (self::$installed !== array() && !$copiedLocalDir) {
+            $installed[] = self::$installed;
+        }
+
+        return $installed;
+    }
+}
diff --git a/vendor/composer/LICENSE b/vendor/composer/LICENSE
new file mode 100644
index 0000000..f27399a
--- /dev/null
+++ b/vendor/composer/LICENSE
@@ -0,0 +1,21 @@
+
+Copyright (c) Nils Adermann, Jordi Boggiano
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php
new file mode 100644
index 0000000..0fb0a2c
--- /dev/null
+++ b/vendor/composer/autoload_classmap.php
@@ -0,0 +1,10 @@
+ $vendorDir . '/composer/InstalledVersions.php',
+);
diff --git a/vendor/composer/autoload_namespaces.php b/vendor/composer/autoload_namespaces.php
new file mode 100644
index 0000000..15a2ff3
--- /dev/null
+++ b/vendor/composer/autoload_namespaces.php
@@ -0,0 +1,9 @@
+ array($vendorDir . '/psr/http-factory/src', $vendorDir . '/psr/http-message/src'),
+    'Psr\\Http\\Client\\' => array($vendorDir . '/psr/http-client/src'),
+    'Nyholm\\Psr7\\' => array($vendorDir . '/nyholm/psr7/src'),
+    'Mollie\\Api\\' => array($vendorDir . '/mollie/mollie-api-php/src'),
+    'Composer\\CaBundle\\' => array($vendorDir . '/composer/ca-bundle/src'),
+    'Automattic\\WooCommerce\\' => array($vendorDir . '/automattic/woocommerce/src/WooCommerce'),
+);
diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php
new file mode 100644
index 0000000..a14721b
--- /dev/null
+++ b/vendor/composer/autoload_real.php
@@ -0,0 +1,38 @@
+register(true);
+
+        return $loader;
+    }
+}
diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php
new file mode 100644
index 0000000..fba41da
--- /dev/null
+++ b/vendor/composer/autoload_static.php
@@ -0,0 +1,74 @@
+ 
+        array (
+            'Psr\\Http\\Message\\' => 17,
+            'Psr\\Http\\Client\\' => 16,
+        ),
+        'N' => 
+        array (
+            'Nyholm\\Psr7\\' => 12,
+        ),
+        'M' => 
+        array (
+            'Mollie\\Api\\' => 11,
+        ),
+        'C' => 
+        array (
+            'Composer\\CaBundle\\' => 18,
+        ),
+        'A' => 
+        array (
+            'Automattic\\WooCommerce\\' => 23,
+        ),
+    );
+
+    public static $prefixDirsPsr4 = array (
+        'Psr\\Http\\Message\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/psr/http-factory/src',
+            1 => __DIR__ . '/..' . '/psr/http-message/src',
+        ),
+        'Psr\\Http\\Client\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/psr/http-client/src',
+        ),
+        'Nyholm\\Psr7\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/nyholm/psr7/src',
+        ),
+        'Mollie\\Api\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/mollie/mollie-api-php/src',
+        ),
+        'Composer\\CaBundle\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/composer/ca-bundle/src',
+        ),
+        'Automattic\\WooCommerce\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/automattic/woocommerce/src/WooCommerce',
+        ),
+    );
+
+    public static $classMap = array (
+        'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
+    );
+
+    public static function getInitializer(ClassLoader $loader)
+    {
+        return \Closure::bind(function () use ($loader) {
+            $loader->prefixLengthsPsr4 = ComposerStaticInitcd53d4cc421fe0b70226223f299ac0ad::$prefixLengthsPsr4;
+            $loader->prefixDirsPsr4 = ComposerStaticInitcd53d4cc421fe0b70226223f299ac0ad::$prefixDirsPsr4;
+            $loader->classMap = ComposerStaticInitcd53d4cc421fe0b70226223f299ac0ad::$classMap;
+
+        }, null, ClassLoader::class);
+    }
+}
diff --git a/vendor/composer/ca-bundle/LICENSE b/vendor/composer/ca-bundle/LICENSE
new file mode 100644
index 0000000..c5b5220
--- /dev/null
+++ b/vendor/composer/ca-bundle/LICENSE
@@ -0,0 +1,19 @@
+Copyright (C) 2016 Composer
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/vendor/composer/ca-bundle/README.md b/vendor/composer/ca-bundle/README.md
new file mode 100644
index 0000000..d8205ec
--- /dev/null
+++ b/vendor/composer/ca-bundle/README.md
@@ -0,0 +1,85 @@
+composer/ca-bundle
+==================
+
+Small utility library that lets you find a path to the system CA bundle,
+and includes a fallback to the Mozilla CA bundle.
+
+Originally written as part of [composer/composer](https://github.com/composer/composer),
+now extracted and made available as a stand-alone library.
+
+
+Installation
+------------
+
+Install the latest version with:
+
+```bash
+$ composer require composer/ca-bundle
+```
+
+
+Requirements
+------------
+
+* PHP 5.3.2 is required but using the latest version of PHP is highly recommended.
+
+
+Basic usage
+-----------
+
+### `Composer\CaBundle\CaBundle`
+
+- `CaBundle::getSystemCaRootBundlePath()`: Returns the system CA bundle path, or a path to the bundled one as fallback
+- `CaBundle::getBundledCaBundlePath()`: Returns the path to the bundled CA file
+- `CaBundle::validateCaFile($filename)`: Validates a CA file using openssl_x509_parse only if it is safe to use
+- `CaBundle::isOpensslParseSafe()`: Test if it is safe to use the PHP function openssl_x509_parse()
+- `CaBundle::reset()`: Resets the static caches
+
+
+#### To use with curl
+
+```php
+$curl = curl_init("https://example.org/");
+
+$caPathOrFile = \Composer\CaBundle\CaBundle::getSystemCaRootBundlePath();
+if (is_dir($caPathOrFile)) {
+    curl_setopt($curl, CURLOPT_CAPATH, $caPathOrFile);
+} else {
+    curl_setopt($curl, CURLOPT_CAINFO, $caPathOrFile);
+}
+
+$result = curl_exec($curl);
+```
+
+#### To use with php streams
+
+```php
+$opts = array(
+    'http' => array(
+        'method' => "GET"
+    )
+);
+
+$caPathOrFile = \Composer\CaBundle\CaBundle::getSystemCaRootBundlePath();
+if (is_dir($caPathOrFile)) {
+    $opts['ssl']['capath'] = $caPathOrFile;
+} else {
+    $opts['ssl']['cafile'] = $caPathOrFile;
+}
+
+$context = stream_context_create($opts);
+$result = file_get_contents('https://example.com', false, $context);
+```
+
+#### To use with Guzzle
+
+```php
+$client = new \GuzzleHttp\Client([
+    \GuzzleHttp\RequestOptions::VERIFY => \Composer\CaBundle\CaBundle::getSystemCaRootBundlePath()
+]);
+```
+
+License
+-------
+
+composer/ca-bundle is licensed under the MIT License, see the LICENSE file for details.
diff --git a/vendor/composer/ca-bundle/composer.json b/vendor/composer/ca-bundle/composer.json
new file mode 100644
index 0000000..c2ce2bb
--- /dev/null
+++ b/vendor/composer/ca-bundle/composer.json
@@ -0,0 +1,54 @@
+{
+    "name": "composer/ca-bundle",
+    "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.",
+    "type": "library",
+    "license": "MIT",
+    "keywords": [
+        "cabundle",
+        "cacert",
+        "certificate",
+        "ssl",
+        "tls"
+    ],
+    "authors": [
+        {
+            "name": "Jordi Boggiano",
+            "email": "j.boggiano@seld.be",
+            "homepage": "http://seld.be"
+        }
+    ],
+    "support": {
+        "irc": "irc://irc.freenode.org/composer",
+        "issues": "https://github.com/composer/ca-bundle/issues"
+    },
+    "require": {
+        "ext-openssl": "*",
+        "ext-pcre": "*",
+        "php": "^7.2 || ^8.0"
+    },
+    "require-dev": {
+        "phpunit/phpunit": "^8 || ^9",
+        "phpstan/phpstan": "^1.10",
+        "psr/log": "^1.0 || ^2.0 || ^3.0",
+        "symfony/process": "^4.0 || ^5.0 || ^6.0 || ^7.0"
+    },
+    "autoload": {
+        "psr-4": {
+            "Composer\\CaBundle\\": "src"
+        }
+    },
+    "autoload-dev": {
+        "psr-4": {
+            "Composer\\CaBundle\\": "tests"
+        }
+    },
+    "extra": {
+        "branch-alias": {
+            "dev-main": "1.x-dev"
+        }
+    },
+    "scripts": {
+        "test": "@php phpunit",
+        "phpstan": "@php phpstan analyse"
+    }
+}
diff --git a/vendor/composer/ca-bundle/res/cacert.pem b/vendor/composer/ca-bundle/res/cacert.pem
new file mode 100644
index 0000000..65be891
--- /dev/null
+++ b/vendor/composer/ca-bundle/res/cacert.pem
@@ -0,0 +1,3511 @@
+##
+## Bundle of CA Root Certificates
+##
+## Certificate data from Mozilla as of: Tue Dec  2 04:12:02 2025 GMT
+##
+## Find updated versions here: https://curl.se/docs/caextract.html
+##
+## This is a bundle of X.509 certificates of public Certificate Authorities
+## (CA). These were automatically extracted from Mozilla's root certificates
+## file (certdata.txt).  This file can be found in the mozilla source tree:
+## https://raw.githubusercontent.com/mozilla-firefox/firefox/refs/heads/release/security/nss/lib/ckfw/builtins/certdata.txt
+##
+## It contains the certificates in PEM format and therefore
+## can be directly used with curl / libcurl / php_curl, or with
+## an Apache+mod_ssl webserver for SSL client authentication.
+## Just configure this file as the SSLCACertificateFile.
+##
+## Conversion done with mk-ca-bundle.pl version 1.30.
+## SHA256: a903b3cd05231e39332515ef7ebe37e697262f39515a52015c23c62805b73cd0
+##
+
+
+Entrust Root Certification Authority
+====================================
+-----BEGIN CERTIFICATE-----
+MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV
+BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw
+b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG
+A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0
+MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu
+MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu
+Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v
+dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz
+A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww
+Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68
+j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN
+rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw
+DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1
+MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH
+hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
+A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM
+Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa
+v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS
+W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0
+tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8
+-----END CERTIFICATE-----
+
+QuoVadis Root CA 2
+==================
+-----BEGIN CERTIFICATE-----
+MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
+EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx
+ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
+aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC
+DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6
+XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk
+lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB
+lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy
+lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt
+66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn
+wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh
+D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy
+BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie
+J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud
+DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU
+a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT
+ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv
+Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3
+UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm
+VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK
++JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW
+IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1
+WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X
+f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II
+4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8
+VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u
+-----END CERTIFICATE-----
+
+QuoVadis Root CA 3
+==================
+-----BEGIN CERTIFICATE-----
+MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
+EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx
+OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
+aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
+DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg
+DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij
+KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K
+DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv
+BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp
+p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8
+nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX
+MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM
+Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz
+uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT
+BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj
+YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0
+aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB
+BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD
+VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4
+ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE
+AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV
+qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s
+hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z
+POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2
+Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp
+8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC
+bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu
+g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p
+vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr
+qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto=
+-----END CERTIFICATE-----
+
+DigiCert Assured ID Root CA
+===========================
+-----BEGIN CERTIFICATE-----
+MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw
+IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx
+MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
+ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO
+9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy
+UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW
+/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy
+oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf
+GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF
+66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq
+hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc
+EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn
+SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i
+8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
+-----END CERTIFICATE-----
+
+DigiCert Global Root CA
+=======================
+-----BEGIN CERTIFICATE-----
+MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw
+HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw
+MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
+dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq
+hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn
+TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5
+BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H
+4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y
+7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB
+o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm
+8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF
+BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr
+EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt
+tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886
+UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
+CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
+-----END CERTIFICATE-----
+
+DigiCert High Assurance EV Root CA
+==================================
+-----BEGIN CERTIFICATE-----
+MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw
+KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw
+MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ
+MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu
+Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t
+Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS
+OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3
+MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ
+NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe
+h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB
+Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY
+JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ
+V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp
+myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK
+mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
+vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K
+-----END CERTIFICATE-----
+
+SwissSign Gold CA - G2
+======================
+-----BEGIN CERTIFICATE-----
+MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw
+EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN
+MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp
+c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B
+AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq
+t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C
+jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg
+vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF
+ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR
+AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend
+jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO
+peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR
+7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi
+GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw
+AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64
+OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov
+L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm
+5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr
+44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf
+Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m
+Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp
+mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk
+vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf
+KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br
+NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj
+viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ
+-----END CERTIFICATE-----
+
+SecureTrust CA
+==============
+-----BEGIN CERTIFICATE-----
+MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG
+EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy
+dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe
+BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC
+ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX
+OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t
+DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH
+GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b
+01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH
+ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/
+BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj
+aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
+KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu
+SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf
+mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ
+nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR
+3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=
+-----END CERTIFICATE-----
+
+Secure Global CA
+================
+-----BEGIN CERTIFICATE-----
+MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG
+EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH
+bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg
+MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg
+Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx
+YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ
+bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g
+8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV
+HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi
+0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
+EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn
+oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA
+MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+
+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn
+CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5
+3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc
+f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW
+-----END CERTIFICATE-----
+
+COMODO Certification Authority
+==============================
+-----BEGIN CERTIFICATE-----
+MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE
+BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG
+A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1
+dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb
+MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD
+T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH
++7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww
+xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV
+4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA
+1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI
+rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E
+BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k
+b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC
+AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP
+OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
+RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc
+IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN
++8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ==
+-----END CERTIFICATE-----
+
+COMODO ECC Certification Authority
+==================================
+-----BEGIN CERTIFICATE-----
+MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC
+R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE
+ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB
+dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix
+GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR
+Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo
+b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X
+4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni
+wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E
+BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG
+FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA
+U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
+-----END CERTIFICATE-----
+
+Certigna
+========
+-----BEGIN CERTIFICATE-----
+MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw
+EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3
+MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI
+Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q
+XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH
+GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p
+ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg
+DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf
+Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ
+tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ
+BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J
+SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA
+hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+
+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu
+PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY
+1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw
+WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==
+-----END CERTIFICATE-----
+
+ePKI Root Certification Authority
+=================================
+-----BEGIN CERTIFICATE-----
+MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG
+EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg
+Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx
+MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq
+MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B
+AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs
+IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi
+lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv
+qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX
+12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O
+WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+
+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao
+lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/
+vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi
+Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi
+MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH
+ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0
+1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq
+KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV
+xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP
+NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r
+GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE
+xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx
+gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy
+sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD
+BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw=
+-----END CERTIFICATE-----
+
+certSIGN ROOT CA
+================
+-----BEGIN CERTIFICATE-----
+MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD
+VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa
+Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE
+CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I
+JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH
+rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2
+ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD
+0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943
+AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B
+Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB
+AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8
+SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0
+x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt
+vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz
+TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD
+-----END CERTIFICATE-----
+
+NetLock Arany (Class Gold) Főtanúsítvány
+========================================
+-----BEGIN CERTIFICATE-----
+MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G
+A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610
+dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB
+cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx
+MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO
+ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv
+biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6
+c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu
+0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw
+/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk
+H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw
+fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1
+neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB
+BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW
+qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta
+YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC
+bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna
+NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu
+dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=
+-----END CERTIFICATE-----
+
+Microsec e-Szigno Root CA 2009
+==============================
+-----BEGIN CERTIFICATE-----
+MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER
+MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv
+c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o
+dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE
+BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt
+U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw
+DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA
+fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG
+0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA
+pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm
+1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC
+AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf
+QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE
+FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o
+lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX
+I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775
+tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02
+yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi
+LXpUq3DDfSJlgnCW
+-----END CERTIFICATE-----
+
+GlobalSign Root CA - R3
+=======================
+-----BEGIN CERTIFICATE-----
+MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv
+YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
+bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
+aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
+bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt
+iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ
+0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3
+rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl
+OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2
+xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
+FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7
+lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8
+EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E
+bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18
+YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r
+kpeDMdmztcpHWD9f
+-----END CERTIFICATE-----
+
+Izenpe.com
+==========
+-----BEGIN CERTIFICATE-----
+MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG
+EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz
+MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu
+QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ
+03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK
+ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU
++zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC
+PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT
+OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK
+F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK
+0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+
+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB
+leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID
+AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+
+SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG
+NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx
+MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O
+BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l
+Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga
+kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q
+hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs
+g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5
+aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5
+nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC
+ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo
+Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z
+WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw==
+-----END CERTIFICATE-----
+
+Go Daddy Root Certificate Authority - G2
+========================================
+-----BEGIN CERTIFICATE-----
+MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
+B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu
+MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5
+MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6
+b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G
+A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq
+9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD
++qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd
+fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl
+NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC
+MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9
+BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac
+vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r
+5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV
+N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO
+LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1
+-----END CERTIFICATE-----
+
+Starfield Root Certificate Authority - G2
+=========================================
+-----BEGIN CERTIFICATE-----
+MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
+B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
+b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0
+eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw
+DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg
+VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB
+dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv
+W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs
+bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk
+N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf
+ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU
+JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
+AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol
+TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx
+4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw
+F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K
+pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ
+c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0
+-----END CERTIFICATE-----
+
+Starfield Services Root Certificate Authority - G2
+==================================================
+-----BEGIN CERTIFICATE-----
+MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
+B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
+b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl
+IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV
+BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT
+dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg
+Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2
+h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa
+hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP
+LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB
+rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw
+AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG
+SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP
+E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy
+xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd
+iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza
+YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6
+-----END CERTIFICATE-----
+
+AffirmTrust Commercial
+======================
+-----BEGIN CERTIFICATE-----
+MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS
+BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw
+MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
+bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb
+DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV
+C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6
+BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww
+MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV
+HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
+AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG
+hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi
+qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv
+0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh
+sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=
+-----END CERTIFICATE-----
+
+AffirmTrust Networking
+======================
+-----BEGIN CERTIFICATE-----
+MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS
+BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw
+MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
+bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE
+Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI
+dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24
+/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb
+h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV
+HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
+AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu
+UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6
+12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23
+WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9
+/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=
+-----END CERTIFICATE-----
+
+AffirmTrust Premium
+===================
+-----BEGIN CERTIFICATE-----
+MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS
+BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy
+OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy
+dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
+MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn
+BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV
+5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs
++7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd
+GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R
+p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI
+S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04
+6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5
+/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo
++Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB
+/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv
+MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg
+Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC
+6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S
+L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK
++4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV
+BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg
+IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60
+g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb
+zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw==
+-----END CERTIFICATE-----
+
+AffirmTrust Premium ECC
+=======================
+-----BEGIN CERTIFICATE-----
+MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV
+BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx
+MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U
+cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA
+IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ
+N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW
+BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK
+BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X
+57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM
+eQ==
+-----END CERTIFICATE-----
+
+Certum Trusted Network CA
+=========================
+-----BEGIN CERTIFICATE-----
+MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK
+ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv
+biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy
+MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU
+ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
+MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC
+l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J
+J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4
+fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0
+cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB
+Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw
+DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj
+jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1
+mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj
+Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI
+03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=
+-----END CERTIFICATE-----
+
+TWCA Root Certification Authority
+=================================
+-----BEGIN CERTIFICATE-----
+MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ
+VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG
+EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB
+IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
+AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx
+QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC
+oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP
+4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r
+y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB
+BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG
+9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC
+mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW
+QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY
+T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny
+Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==
+-----END CERTIFICATE-----
+
+Security Communication RootCA2
+==============================
+-----BEGIN CERTIFICATE-----
+MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
+U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh
+dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC
+SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy
+aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++
++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R
+3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV
+spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K
+EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8
+QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB
+CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj
+u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk
+3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q
+tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29
+mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03
+-----END CERTIFICATE-----
+
+Actalis Authentication Root CA
+==============================
+-----BEGIN CERTIFICATE-----
+MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM
+BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE
+AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky
+MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz
+IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290
+IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ
+wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa
+by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6
+zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f
+YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2
+oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l
+EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7
+hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8
+EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5
+jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY
+iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt
+ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI
+WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0
+JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx
+K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+
+Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC
+4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo
+2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz
+lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem
+OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9
+vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg==
+-----END CERTIFICATE-----
+
+Buypass Class 2 Root CA
+=======================
+-----BEGIN CERTIFICATE-----
+MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
+QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X
+DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1
+eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw
+DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1
+g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn
+9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b
+/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU
+CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff
+awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI
+zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn
+Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX
+Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs
+M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD
+VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF
+AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s
+A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI
+osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S
+aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd
+DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD
+LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0
+oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC
+wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS
+CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN
+rJgWVqA=
+-----END CERTIFICATE-----
+
+Buypass Class 3 Root CA
+=======================
+-----BEGIN CERTIFICATE-----
+MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
+QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X
+DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1
+eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw
+DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH
+sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR
+5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh
+7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ
+ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH
+2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV
+/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ
+RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA
+Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq
+j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD
+VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF
+AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV
+cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G
+uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG
+Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8
+ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2
+KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz
+6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug
+UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe
+eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi
+Cp/HuZc=
+-----END CERTIFICATE-----
+
+T-TeleSec GlobalRoot Class 3
+============================
+-----BEGIN CERTIFICATE-----
+MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM
+IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU
+cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx
+MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz
+dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD
+ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK
+9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU
+NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF
+iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W
+0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA
+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr
+AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb
+fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT
+ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h
+P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml
+e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw==
+-----END CERTIFICATE-----
+
+D-TRUST Root Class 3 CA 2 2009
+==============================
+-----BEGIN CERTIFICATE-----
+MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK
+DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe
+Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE
+LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw
+DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD
+ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA
+BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv
+KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z
+p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC
+AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ
+4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y
+eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw
+MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G
+PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw
+OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm
+2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0
+o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV
+dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph
+X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I=
+-----END CERTIFICATE-----
+
+D-TRUST Root Class 3 CA 2 EV 2009
+=================================
+-----BEGIN CERTIFICATE-----
+MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK
+DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw
+OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK
+DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw
+OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS
+egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh
+zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T
+7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60
+sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35
+11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv
+cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v
+ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El
+MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp
+b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh
+c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+
+PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05
+nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX
+ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA
+NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv
+w9y4AyHqnxbxLFS1
+-----END CERTIFICATE-----
+
+CA Disig Root R2
+================
+-----BEGIN CERTIFICATE-----
+MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw
+EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp
+ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx
+EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp
+c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC
+w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia
+xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7
+A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S
+GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV
+g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa
+5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE
+koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A
+Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i
+Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV
+HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u
+Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM
+tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV
+sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je
+dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8
+1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx
+mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01
+utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0
+sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg
+UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV
+7+ZtsH8tZ/3zbBt1RqPlShfppNcL
+-----END CERTIFICATE-----
+
+ACCVRAIZ1
+=========
+-----BEGIN CERTIFICATE-----
+MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB
+SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1
+MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH
+UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
+DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM
+jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0
+RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD
+aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ
+0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG
+WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7
+8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR
+5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J
+9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK
+Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw
+Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu
+Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2
+VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM
+Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA
+QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh
+AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA
+YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj
+AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA
+IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk
+aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0
+dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2
+MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI
+hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E
+R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN
+YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49
+nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ
+TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3
+sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h
+I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg
+Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd
+3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p
+EfbRD0tVNEYqi4Y7
+-----END CERTIFICATE-----
+
+TWCA Global Root CA
+===================
+-----BEGIN CERTIFICATE-----
+MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT
+CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD
+QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK
+EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg
+Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C
+nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV
+r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR
+Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV
+tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W
+KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99
+sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p
+yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn
+kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI
+zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC
+AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g
+cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn
+LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M
+8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg
+/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg
+lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP
+A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m
+i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8
+EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3
+zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0=
+-----END CERTIFICATE-----
+
+TeliaSonera Root CA v1
+======================
+-----BEGIN CERTIFICATE-----
+MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE
+CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4
+MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW
+VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+
+6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA
+3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k
+B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn
+Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH
+oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3
+F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ
+oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7
+gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc
+TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB
+AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW
+DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm
+zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx
+0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW
+pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV
+G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc
+c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT
+JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2
+qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6
+Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems
+WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY=
+-----END CERTIFICATE-----
+
+T-TeleSec GlobalRoot Class 2
+============================
+-----BEGIN CERTIFICATE-----
+MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM
+IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU
+cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx
+MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz
+dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD
+ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ
+SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F
+vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970
+2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV
+WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA
+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy
+YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4
+r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf
+vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR
+3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN
+9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg==
+-----END CERTIFICATE-----
+
+Atos TrustedRoot 2011
+=====================
+-----BEGIN CERTIFICATE-----
+MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU
+cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4
+MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG
+A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV
+hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr
+54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+
+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320
+HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR
+z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R
+l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ
+bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB
+CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h
+k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh
+TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9
+61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G
+3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed
+-----END CERTIFICATE-----
+
+QuoVadis Root CA 1 G3
+=====================
+-----BEGIN CERTIFICATE-----
+MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDELMAkG
+A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv
+b3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJN
+MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEg
+RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakE
+PBtVwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWerNrwU8lm
+PNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF34168Xfuw6cwI2H44g4hWf6
+Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoIN
+ofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXpUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/l
+g6AnhF4EwfWQvTA9xO+oabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV
+7qJZjqlc3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/GKubX
+9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1f
+iyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KOTk0k+17kBL5yG6YnLUlamXrXXAkg
+t3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOtzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
+AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZI
+hvcNAQELBQADggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC
+MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2cDMT/uFPpiN3
+GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUNqXsCHKnQO18LwIE6PWThv6ct
+Tr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP
++V04ikkwj+3x6xn0dxoxGE1nVGwvb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh
+3jRJjehZrJ3ydlo28hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fa
+wx/kNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNjZgKAvQU6
+O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhpq1467HxpvMc7hU6eFbm0
+FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFtnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOV
+hMJKzRwuJIczYOXD
+-----END CERTIFICATE-----
+
+QuoVadis Root CA 2 G3
+=====================
+-----BEGIN CERTIFICATE-----
+MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQELBQAwSDELMAkG
+A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv
+b3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJN
+MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIg
+RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFh
+ZiFfqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMWn4rjyduY
+NM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ymc5GQYaYDFCDy54ejiK2t
+oIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+o
+MiwMzAkd056OXbxMmO7FGmh77FOm6RQ1o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+l
+V0POKa2Mq1W/xPtbAd0jIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZo
+L1NesNKqIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz8eQQ
+sSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43ehvNURG3YBZwjgQQvD
+6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l7ZizlWNof/k19N+IxWA1ksB8aRxh
+lRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALGcC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
+AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZI
+hvcNAQELBQADggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66
+AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RCroijQ1h5fq7K
+pVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9
+x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgz
+dWqTHBLmYF5vHX/JHyPLhGGfHoJE+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6X
+U/IyAgkwo1jwDQHVcsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+Nw
+mNtddbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNgKCLjsZWD
+zYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeMHVOyToV7BjjHLPj4sHKN
+JeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4WSr2Rz0ZiC3oheGe7IUIarFsNMkd7Egr
+O3jtZsSOeWmD3n+M
+-----END CERTIFICATE-----
+
+QuoVadis Root CA 3 G3
+=====================
+-----BEGIN CERTIFICATE-----
+MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkG
+A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv
+b3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJN
+MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMg
+RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286
+IxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRL
+Mon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe
+6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3
+I4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3U
+VDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f7
+5li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqi
+Md5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DM
+dyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/Yt
+rQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
+AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZI
+hvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px
+KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzS
+t/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQ
+TXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9Du
+DcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGib
+Ih6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmD
+hPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX
+0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFW
+dSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2
+PpxxVJkES/1Y+Zj0
+-----END CERTIFICATE-----
+
+DigiCert Assured ID Root G2
+===========================
+-----BEGIN CERTIFICATE-----
+MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw
+IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw
+MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
+ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH
+35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq
+bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw
+VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP
+YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn
+lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO
+w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv
+0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz
+d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW
+hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M
+jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo
+IhNzbM8m9Yop5w==
+-----END CERTIFICATE-----
+
+DigiCert Assured ID Root G3
+===========================
+-----BEGIN CERTIFICATE-----
+MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV
+UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD
+VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1
+MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ
+BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb
+RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs
+KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF
+UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy
+YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy
+1vUhZscv6pZjamVFkpUBtA==
+-----END CERTIFICATE-----
+
+DigiCert Global Root G2
+=======================
+-----BEGIN CERTIFICATE-----
+MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw
+HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx
+MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
+dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq
+hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ
+kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO
+3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV
+BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM
+UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB
+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu
+5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr
+F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U
+WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH
+QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/
+iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl
+MrY=
+-----END CERTIFICATE-----
+
+DigiCert Global Root G3
+=======================
+-----BEGIN CERTIFICATE-----
+MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV
+UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD
+VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw
+MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k
+aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C
+AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O
+YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP
+BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp
+Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y
+3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34
+VOKa5Vt8sycX
+-----END CERTIFICATE-----
+
+DigiCert Trusted Root G4
+========================
+-----BEGIN CERTIFICATE-----
+MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw
+HwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1
+MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G
+CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp
+pz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o
+k3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7Fsa
+vOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY
+QJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6
+MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtm
+mnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7
+f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFH
+dL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8
+oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud
+DwEB/wQEAwIBhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD
+ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY
+ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdNOj6PWTkiU0Tr
+yF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy
+7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iah
+ixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN
+5r5N0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb
+/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP0oUA51Aa
+5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tK
+G48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP
+82Z+
+-----END CERTIFICATE-----
+
+COMODO RSA Certification Authority
+==================================
+-----BEGIN CERTIFICATE-----
+MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCBhTELMAkGA1UE
+BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG
+A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlv
+biBBdXRob3JpdHkwHhcNMTAwMTE5MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMC
+R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE
+ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBB
+dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR6FSS0gpWsawNJN3Fz0Rn
+dJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8Xpz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZ
+FGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+
+5eNu/Nio5JIk2kNrYrhV/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pG
+x8cgoLEfZd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z+pUX
+2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7wqP/0uK3pN/u6uPQL
+OvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZahSL0896+1DSJMwBGB7FY79tOi4lu3
+sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVICu9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+C
+GCe01a60y1Dma/RMhnEw6abfFobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5
+WdYgGq/yapiqcrxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E
+FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w
+DQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvlwFTPoCWOAvn9sKIN9SCYPBMt
+rFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+
+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSg
+tZx8jb8uk2IntznaFxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwW
+sRqZCuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiKboHGhfKp
+pC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmckejkk9u+UJueBPSZI9FoJA
+zMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yLS0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHq
+ZJx64SIDqZxubw5lT2yHh17zbqD5daWbQOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk52
+7RH89elWsn2/x20Kk4yl0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7I
+LaZRfyHBNVOFBkpdn627G190
+-----END CERTIFICATE-----
+
+USERTrust RSA Certification Authority
+=====================================
+-----BEGIN CERTIFICATE-----
+MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCBiDELMAkGA1UE
+BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK
+ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UE
+BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK
+ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCAEmUXNg7D2wiz
+0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2j
+Y0K2dvKpOyuR+OJv0OwWIJAJPuLodMkYtJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFn
+RghRy4YUVD+8M/5+bJz/Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O
++T23LLb2VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT79uq
+/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6c0Plfg6lZrEpfDKE
+Y1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmTYo61Zs8liM2EuLE/pDkP2QKe6xJM
+lXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97lc6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8
+yexDJtC/QV9AqURE9JnnV4eeUB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+
+eLf8ZxXhyVeEHg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd
+BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
+MAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPFUp/L+M+ZBn8b2kMVn54CVVeW
+FPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KOVWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ
+7l8wXEskEVX/JJpuXior7gtNn3/3ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQ
+Eg9zKC7F4iRO/Fjs8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM
+8WcRiQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYzeSf7dNXGi
+FSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZXHlKYC6SQK5MNyosycdi
+yA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9c
+J2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRBVXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGw
+sAvgnEzDHNb842m1R0aBL6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gx
+Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9
+-----END CERTIFICATE-----
+
+USERTrust ECC Certification Authority
+=====================================
+-----BEGIN CERTIFICATE-----
+MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC
+VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
+aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv
+biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC
+VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
+aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv
+biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2
+0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez
+nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV
+HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB
+HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu
+9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg=
+-----END CERTIFICATE-----
+
+GlobalSign ECC Root CA - R5
+===========================
+-----BEGIN CERTIFICATE-----
+MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb
+R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
+EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb
+R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
+EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6
+SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS
+h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd
+BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx
+uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7
+yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3
+-----END CERTIFICATE-----
+
+IdenTrust Commercial Root CA 1
+==============================
+-----BEGIN CERTIFICATE-----
+MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG
+EwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBS
+b290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQwMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzES
+MBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENB
+IDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ld
+hNlT3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU+ehcCuz/
+mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gpS0l4PJNgiCL8mdo2yMKi
+1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1bVoE/c40yiTcdCMbXTMTEl3EASX2MN0C
+XZ/g1Ue9tOsbobtJSdifWwLziuQkkORiT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl
+3ZBWzvurpWCdxJ35UrCLvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzy
+NeVJSQjKVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZKdHzV
+WYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHTc+XvvqDtMwt0viAg
+xGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hvl7yTmvmcEpB4eoCHFddydJxVdHix
+uuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5NiGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC
+AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZI
+hvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH
+6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwtLRvM7Kqas6pg
+ghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93nAbowacYXVKV7cndJZ5t+qnt
+ozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmV
+YjzlVYA211QC//G5Xc7UI2/YRYRKW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUX
+feu+h1sXIFRRk0pTAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/ro
+kTLql1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG4iZZRHUe
+2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZmUlO+KWA2yUPHGNiiskz
+Z2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7R
+cGzM7vRX+Bi6hG6H
+-----END CERTIFICATE-----
+
+IdenTrust Public Sector Root CA 1
+=================================
+-----BEGIN CERTIFICATE-----
+MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQG
+EwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3Rv
+ciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcNMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJV
+UzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBS
+b290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTy
+P4o7ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGyRBb06tD6
+Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlSbdsHyo+1W/CD80/HLaXI
+rcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF/YTLNiCBWS2ab21ISGHKTN9T0a9SvESf
+qy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoS
+mJxZZoY+rfGwyj4GD3vwEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFn
+ol57plzy9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9VGxyh
+LrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ2fjXctscvG29ZV/v
+iDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsVWaFHVCkugyhfHMKiq3IXAAaOReyL
+4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gDW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8B
+Af8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMw
+DQYJKoZIhvcNAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj
+t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHVDRDtfULAj+7A
+mgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9TaDKQGXSc3z1i9kKlT/YPyNt
+GtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8GlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFt
+m6/n6J91eEyrRjuazr8FGF1NFTwWmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMx
+NRF4eKLg6TCMf4DfWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4
+Mhn5+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJtshquDDI
+ajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhAGaQdp/lLQzfcaFpPz+vC
+ZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ
+3Wl9af0AVqW3rLatt8o+Ae+c
+-----END CERTIFICATE-----
+
+Entrust Root Certification Authority - G2
+=========================================
+-----BEGIN CERTIFICATE-----
+MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV
+BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy
+bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug
+b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw
+HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT
+DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx
+OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s
+eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi
+MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP
+/vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz
+HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU
+s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y
+TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx
+AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6
+0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z
+iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ
+Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi
+nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+
+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO
+e4pIb4tF9g==
+-----END CERTIFICATE-----
+
+Entrust Root Certification Authority - EC1
+==========================================
+-----BEGIN CERTIFICATE-----
+MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx
+FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn
+YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl
+ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5
+IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw
+FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs
+LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg
+dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt
+IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy
+AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef
+9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
+FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h
+vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8
+kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G
+-----END CERTIFICATE-----
+
+CFCA EV ROOT
+============
+-----BEGIN CERTIFICATE-----
+MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJDTjEwMC4GA1UE
+CgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNB
+IEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkxMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEw
+MC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQD
+DAxDRkNBIEVWIFJPT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnV
+BU03sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpLTIpTUnrD
+7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5/ZOkVIBMUtRSqy5J35DN
+uF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp7hZZLDRJGqgG16iI0gNyejLi6mhNbiyW
+ZXvKWfry4t3uMCz7zEasxGPrb382KzRzEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7
+xzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9f
+py25IGvPa931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqotaK8K
+gWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNgTnYGmE69g60dWIol
+hdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfVPKPtl8MeNPo4+QgO48BdK4PRVmrJ
+tqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hvcWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAf
+BgNVHSMEGDAWgBTj/i39KNALtbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB
+/wQEAwIBBjAdBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB
+ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObTej/tUxPQ4i9q
+ecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdLjOztUmCypAbqTuv0axn96/Ua
+4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBSESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sG
+E5uPhnEFtC+NiWYzKXZUmhH4J/qyP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfX
+BDrDMlI1Dlb4pd19xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjn
+aH9dCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN5mydLIhy
+PDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX
+kbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C
+ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su
+-----END CERTIFICATE-----
+
+OISTE WISeKey Global Root GB CA
+===============================
+-----BEGIN CERTIFICATE-----
+MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG
+EwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl
+ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw
+MzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD
+VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds
+b2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX
+scriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP
+rby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk
+9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o
+Qnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg
+GUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB
+/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI
+hvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD
+dHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0
+VQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui
+HZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic
+Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM=
+-----END CERTIFICATE-----
+
+SZAFIR ROOT CA2
+===============
+-----BEGIN CERTIFICATE-----
+MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQELBQAwUTELMAkG
+A1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4xGDAWBgNV
+BAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkwNzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJ
+BgNVBAYTAlBMMSgwJgYDVQQKDB9LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYD
+VQQDDA9TWkFGSVIgUk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5Q
+qEvNQLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT3PSQ1hNK
+DJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw3gAeqDRHu5rr/gsUvTaE
+2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr63fE9biCloBK0TXC5ztdyO4mTp4CEHCdJ
+ckm1/zuVnsHMyAHs6A6KCpbns6aH5db5BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwi
+ieDhZNRnvDF5YTy7ykHNXGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P
+AQH/BAQDAgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsFAAOC
+AQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw8PRBEew/R40/cof5
+O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOGnXkZ7/e7DDWQw4rtTw/1zBLZpD67
+oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCPoky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul
+4+vJhaAlIDf7js4MNIThPIGyd05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6
++/NNIxuZMzSgLvWpCz/UXeHPhJ/iGcJfitYgHuNztw==
+-----END CERTIFICATE-----
+
+Certum Trusted Network CA 2
+===========================
+-----BEGIN CERTIFICATE-----
+MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCBgDELMAkGA1UE
+BhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1
+bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29y
+ayBDQSAyMCIYDzIwMTExMDA2MDgzOTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQ
+TDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENl
+cnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENB
+IDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWADGSdhhuWZGc/IjoedQF9
+7/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+o
+CgCXhVqqndwpyeI1B+twTUrWwbNWuKFBOJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40b
+Rr5HMNUuctHFY9rnY3lEfktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2p
+uTRZCr+ESv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1mo130
+GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02isx7QBlrd9pPPV3WZ
+9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOWOZV7bIBaTxNyxtd9KXpEulKkKtVB
+Rgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgezTv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pye
+hizKV/Ma5ciSixqClnrDvFASadgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vM
+BhBgu4M1t15n3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
+AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZI
+hvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQF/xlhMcQSZDe28cmk4gmb3DW
+Al45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTfCVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuA
+L55MYIR4PSFk1vtBHxgP58l1cb29XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMo
+clm2q8KMZiYcdywmdjWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tM
+pkT/WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jbAoJnwTnb
+w3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksqP/ujmv5zMnHCnsZy4Ypo
+J/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Kob7a6bINDd82Kkhehnlt4Fj1F4jNy3eFm
+ypnTycUm/Q1oBEauttmbjL4ZvrHG8hnjXALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLX
+is7VmFxWlgPF7ncGNf/P5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7
+zAYspsbiDrW5viSP
+-----END CERTIFICATE-----
+
+Hellenic Academic and Research Institutions RootCA 2015
+=======================================================
+-----BEGIN CERTIFICATE-----
+MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcT
+BkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0
+aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl
+YXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAx
+MTIxWjCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMg
+QWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNV
+BAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIw
+MTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDC+Kk/G4n8PDwEXT2QNrCROnk8Zlrv
+bTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+eh
+iGsxr/CL0BgzuNtFajT0AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+
+6PAQZe104S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06CojXd
+FPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV9Cz82XBST3i4vTwr
+i5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrDgfgXy5I2XdGj2HUb4Ysn6npIQf1F
+GQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2
+fu/Z8VFRfS0myGlZYeCsargqNhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9mu
+iNX6hME6wGkoLfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc
+Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
+AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVdctA4GGqd83EkVAswDQYJKoZI
+hvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0IXtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+
+D1hYc2Ryx+hFjtyp8iY/xnmMsVMIM4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrM
+d/K4kPFox/la/vot9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+y
+d+2VZ5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/eaj8GsGsVn
+82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnhX9izjFk0WaSrT2y7Hxjb
+davYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQl033DlZdwJVqwjbDG2jJ9SrcR5q+ss7F
+Jej6A7na+RZukYT1HCjI/CbM1xyQVqdfbzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVt
+J94Cj8rDtSvK6evIIVM4pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGa
+JI7ZjnHKe7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0vm9q
+p/UsQu0yrbYhnr68
+-----END CERTIFICATE-----
+
+Hellenic Academic and Research Institutions ECC RootCA 2015
+===========================================================
+-----BEGIN CERTIFICATE-----
+MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0
+aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u
+cyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj
+aCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEw
+MzcxMlowgaoxCzAJBgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmlj
+IEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUQwQgYD
+VQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290
+Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKgQehLgoRc4vgxEZmGZE4JJS+dQS8KrjVP
+dJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJajq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoK
+Vlp8aQuqgAkkbH7BRqNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O
+BBYEFLQiC4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaeplSTA
+GiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7SofTUwJCA3sS61kFyjn
+dc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR
+-----END CERTIFICATE-----
+
+ISRG Root X1
+============
+-----BEGIN CERTIFICATE-----
+MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAwTzELMAkGA1UE
+BhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQD
+EwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQG
+EwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMT
+DElTUkcgUm9vdCBYMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54r
+Vygch77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+0TM8ukj1
+3Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6UA5/TR5d8mUgjU+g4rk8K
+b4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sWT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCN
+Aymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyHB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ
+4Q7e2RCOFvu396j3x+UCB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf
+1b0SHzUvKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWnOlFu
+hjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTnjh8BCNAw1FtxNrQH
+usEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbwqHyGO0aoSCqI3Haadr8faqU9GY/r
+OPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CIrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4G
+A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY
+9umbbjANBgkqhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL
+ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ3BebYhtF8GaV
+0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KKNFtY2PwByVS5uCbMiogziUwt
+hDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJw
+TdwJx4nLCgdNbOhdjsnvzqvHu7UrTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nx
+e5AW0wdeRlN8NwdCjNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZA
+JzVcoyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq4RgqsahD
+YVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPAmRGunUHBcnWEvgJBQl9n
+JEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57demyPxgcYxn/eR44/KJ4EBs+lVDR3veyJ
+m+kXQ99b21/+jh5Xos1AnX5iItreGCc=
+-----END CERTIFICATE-----
+
+AC RAIZ FNMT-RCM
+================
+-----BEGIN CERTIFICATE-----
+MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsxCzAJBgNVBAYT
+AkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTAeFw0wODEw
+MjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJD
+TTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC
+ggIBALpxgHpMhm5/yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcf
+qQgfBBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAzWHFctPVr
+btQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxFtBDXaEAUwED653cXeuYL
+j2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z374jNUUeAlz+taibmSXaXvMiwzn15Cou
+08YfxGyqxRxqAQVKL9LFwag0Jl1mpdICIfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mw
+WsXmo8RZZUc1g16p6DULmbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnT
+tOmlcYF7wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peSMKGJ
+47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2ZSysV4999AeU14EC
+ll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMetUqIJ5G+GR4of6ygnXYMgrwTJbFaa
+i0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE
+FPd9xf3E6Jobd2Sn9R2gzL+HYJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1o
+dHRwOi8vd3d3LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD
+nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1RXxlDPiyN8+s
+D8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYMLVN0V2Ue1bLdI4E7pWYjJ2cJ
+j+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrT
+Qfv6MooqtyuGC2mDOL7Nii4LcK2NJpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW
++YJF1DngoABd15jmfZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7
+Ixjp6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp1txyM/1d
+8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B9kiABdcPUXmsEKvU7ANm
+5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wokRqEIr9baRRmW1FMdW4R58MD3R++Lj8UG
+rp1MYp3/RgT408m2ECVAdf4WqslKYIYvuu8wd+RU4riEmViAqhOLUTpPSPaLtrM=
+-----END CERTIFICATE-----
+
+Amazon Root CA 1
+================
+-----BEGIN CERTIFICATE-----
+MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYD
+VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1
+MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv
+bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgH
+FzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQ
+gLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0t
+dHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcce
+VOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB
+/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3
+DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PM
+CCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy
+8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa
+2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2
+xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5
+-----END CERTIFICATE-----
+
+Amazon Root CA 2
+================
+-----BEGIN CERTIFICATE-----
+MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwFADA5MQswCQYD
+VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAyMB4XDTE1
+MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv
+bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC
+ggIBAK2Wny2cSkxKgXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4
+kHbZW0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg1dKmSYXp
+N+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K8nu+NQWpEjTj82R0Yiw9
+AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvd
+fLC6HM783k81ds8P+HgfajZRRidhW+mez/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAEx
+kv8LV/SasrlX6avvDXbR8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSS
+btqDT6ZjmUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz7Mt0
+Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6+XUyo05f7O0oYtlN
+c/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI0u1ufm8/0i2BWSlmy5A5lREedCf+
+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSw
+DPBMMPQFWAJI/TPlUq9LhONmUjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oA
+A7CXDpO8Wqj2LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY
++gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kSk5Nrp+gvU5LE
+YFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl7uxMMne0nxrpS10gxdr9HIcW
+xkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygmbtmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQ
+gj9sAq+uEjonljYE1x2igGOpm/HlurR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbW
+aQbLU8uz/mtBzUF+fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoV
+Yh63n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE76KlXIx3
+KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H9jVlpNMKVv/1F2Rs76gi
+JUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT4PsJYGw=
+-----END CERTIFICATE-----
+
+Amazon Root CA 3
+================
+-----BEGIN CERTIFICATE-----
+MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5MQswCQYDVQQG
+EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAzMB4XDTE1MDUy
+NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ
+MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZB
+f8ANm+gBG1bG8lKlui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjr
+Zt6jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSrttvXBp43
+rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkrBqWTrBqYaGFy+uGh0Psc
+eGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteMYyRIHN8wfdVoOw==
+-----END CERTIFICATE-----
+
+Amazon Root CA 4
+================
+-----BEGIN CERTIFICATE-----
+MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5MQswCQYDVQQG
+EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSA0MB4XDTE1MDUy
+NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ
+MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN
+/sGKe0uoe0ZLY7Bi9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri
+83BkM6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV
+HQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WBMAoGCCqGSM49BAMDA2gA
+MGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlwCkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1
+AE47xDqUEpHJWEadIRNyp4iciuRMStuW1KyLa2tJElMzrdfkviT8tQp21KW8EA==
+-----END CERTIFICATE-----
+
+TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1
+=============================================
+-----BEGIN CERTIFICATE-----
+MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIxGDAWBgNVBAcT
+D0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxpbXNlbCB2ZSBUZWtub2xvamlr
+IEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0wKwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24g
+TWVya2V6aSAtIEthbXUgU00xNjA0BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRp
+ZmlrYXNpIC0gU3VydW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYD
+VQQGEwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXllIEJpbGlt
+c2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklUQUsxLTArBgNVBAsTJEth
+bXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBTTTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11
+IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEAr3UwM6q7a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y8
+6Ij5iySrLqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INrN3wc
+wv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2XYacQuFWQfw4tJzh0
+3+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/iSIzL+aFCr2lqBs23tPcLG07xxO9
+WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4fAJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQU
+ZT/HiobGPN08VFw1+DrtUgxHV8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJ
+KoZIhvcNAQELBQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh
+AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPfIPP54+M638yc
+lNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4lzwDGrpDxpa5RXI4s6ehlj2R
+e37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0j
+q5Rm+K37DwhuJi1/FwcJsoz7UMCflo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM=
+-----END CERTIFICATE-----
+
+GDCA TrustAUTH R5 ROOT
+======================
+-----BEGIN CERTIFICATE-----
+MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UEBhMCQ04xMjAw
+BgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8wHQYDVQQD
+DBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVow
+YjELMAkGA1UEBhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ
+IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0B
+AQEFAAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJjDp6L3TQs
+AlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBjTnnEt1u9ol2x8kECK62p
+OqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+uKU49tm7srsHwJ5uu4/Ts765/94Y9cnrr
+pftZTqfrlYwiOXnhLQiPzLyRuEH3FMEjqcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ
+9Cy5WmYqsBebnh52nUpmMUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQ
+xXABZG12ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloPzgsM
+R6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3GkL30SgLdTMEZeS1SZ
+D2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeCjGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4
+oR24qoAATILnsn8JuLwwoC8N9VKejveSswoAHQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx
+9hoh49pwBiFYFIeFd3mqgnkCAwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlR
+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg
+p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZmDRd9FBUb1Ov9
+H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5COmSdI31R9KrO9b7eGZONn35
+6ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ryL3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd
++PwyvzeG5LuOmCd+uh8W4XAR8gPfJWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQ
+HtZa37dG/OaG+svgIHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBD
+F8Io2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV09tL7ECQ
+8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQXR4EzzffHqhmsYzmIGrv
+/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrqT8p+ck0LcIymSLumoRT2+1hEmRSuqguT
+aaApJUqlyyvdimYHFngVV3Eb7PVHhPOeMTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g==
+-----END CERTIFICATE-----
+
+SSL.com Root Certification Authority RSA
+========================================
+-----BEGIN CERTIFICATE-----
+MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UEBhMCVVMxDjAM
+BgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24x
+MTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYw
+MjEyMTczOTM5WhcNNDEwMjEyMTczOTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx
+EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NM
+LmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcNAQEBBQAD
+ggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2RxFdHaxh3a3by/ZPkPQ/C
+Fp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aXqhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8
+P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcCC52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/ge
+oeOy3ZExqysdBP+lSgQ36YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkp
+k8zruFvh/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrFYD3Z
+fBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93EJNyAKoFBbZQ+yODJ
+gUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVcUS4cK38acijnALXRdMbX5J+tB5O2
+UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi8
+1xtZPCvM8hnIk2snYxnP/Okm+Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4s
+bE6x/c+cCbqiM+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV
+HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4GA1UdDwEB/wQE
+AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGVcpNxJK1ok1iOMq8bs3AD/CUr
+dIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBcHadm47GUBwwyOabqG7B52B2ccETjit3E+ZUf
+ijhDPwGFpUenPUayvOUiaPd7nNgsPgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAsl
+u1OJD7OAUN5F7kR/q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjq
+erQ0cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jra6x+3uxj
+MxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90IH37hVZkLId6Tngr75qNJ
+vTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/YK9f1JmzJBjSWFupwWRoyeXkLtoh/D1JI
+Pb9s2KJELtFOt3JY04kTlf5Eq/jXixtunLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406y
+wKBjYZC6VWg3dGq2ktufoYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NI
+WuuA8ShYIc2wBlX7Jz9TkHCpBB5XJ7k=
+-----END CERTIFICATE-----
+
+SSL.com Root Certification Authority ECC
+========================================
+-----BEGIN CERTIFICATE-----
+MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMCVVMxDjAMBgNV
+BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xMTAv
+BgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEy
+MTgxNDAzWhcNNDEwMjEyMTgxNDAzWjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAO
+BgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv
+bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuBBAAiA2IA
+BEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI7Z4INcgn64mMU1jrYor+
+8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPgCemB+vNH06NjMGEwHQYDVR0OBBYEFILR
+hXMw5zUE044CkvvlpNHEIejNMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTT
+jgKS++Wk0cQh6M0wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCW
+e+0F+S8Tkdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+gA0z
+5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl
+-----END CERTIFICATE-----
+
+SSL.com EV Root Certification Authority RSA R2
+==============================================
+-----BEGIN CERTIFICATE-----
+MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNVBAYTAlVTMQ4w
+DAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9u
+MTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy
+MB4XDTE3MDUzMTE4MTQzN1oXDTQyMDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQI
+DAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYD
+VQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMIICIjAN
+BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvqM0fNTPl9fb69LT3w23jh
+hqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssufOePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7w
+cXHswxzpY6IXFJ3vG2fThVUCAtZJycxa4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTO
+Zw+oz12WGQvE43LrrdF9HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+
+B6KjBSYRaZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcAb9Zh
+CBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQGp8hLH94t2S42Oim
+9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQVPWKchjgGAGYS5Fl2WlPAApiiECto
+RHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMOpgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+Slm
+JuwgUHfbSguPvuUCYHBBXtSuUDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48
++qvWBkofZ6aYMBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV
+HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa49QaAJadz20Zp
+qJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBWs47LCp1Jjr+kxJG7ZhcFUZh1
+++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nx
+Y/hoLVUE0fKNsKTPvDxeH3jnpaAgcLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2G
+guDKBAdRUNf/ktUM79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDz
+OFSz/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXtll9ldDz7
+CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEmKf7GUmG6sXP/wwyc5Wxq
+lD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKKQbNmC1r7fSOl8hqw/96bg5Qu0T/fkreR
+rwU7ZcegbLHNYhLDkBvjJc40vG93drEQw/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1
+hlMYegouCRw2n5H9gooiS9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX
+9hwJ1C07mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w==
+-----END CERTIFICATE-----
+
+SSL.com EV Root Certification Authority ECC
+===========================================
+-----BEGIN CERTIFICATE-----
+MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMCVVMxDjAMBgNV
+BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xNDAy
+BgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYw
+MjEyMTgxNTIzWhcNNDEwMjEyMTgxNTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx
+EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NM
+LmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB
+BAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMAVIbc/R/fALhBYlzccBYy
+3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1KthkuWnBaBu2+8KGwytAJKaNjMGEwHQYDVR0O
+BBYEFFvKXuXe0oGqzagtZFG22XKbl+ZPMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe
+5d7SgarNqC1kUbbZcpuX5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJ
+N+vp1RPZytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZgh5Mm
+m7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg==
+-----END CERTIFICATE-----
+
+GlobalSign Root CA - R6
+=======================
+-----BEGIN CERTIFICATE-----
+MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEgMB4GA1UECxMX
+R2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds
+b2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQxMjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9i
+YWxTaWduIFJvb3QgQ0EgLSBSNjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFs
+U2lnbjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQss
+grRIxutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1kZguSgMpE
+3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxDaNc9PIrFsmbVkJq3MQbF
+vuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJwLnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqM
+PKq0pPbzlUoSB239jLKJz9CgYXfIWHSw1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+
+azayOeSsJDa38O+2HBNXk7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05O
+WgtH8wY2SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/hbguy
+CLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4nWUx2OVvq+aWh2IMP
+0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpYrZxCRXluDocZXFSxZba/jJvcE+kN
+b7gu3GduyYsRtYQUigAZcIN5kZeR1BonvzceMgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQE
+AwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNV
+HSMEGDAWgBSubAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN
+nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGtIxg93eFyRJa0
+lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr6155wsTLxDKZmOMNOsIeDjHfrY
+BzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLjvUYAGm0CuiVdjaExUd1URhxN25mW7xocBFym
+Fe944Hn+Xds+qkxV/ZoVqW/hpvvfcDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr
+3TsTjxKM4kEaSHpzoHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB1
+0jZpnOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfspA9MRf/T
+uTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+vJJUEeKgDu+6B5dpffItK
+oZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+t
+JDfLRVpOoERIyNiwmcUVhAn21klJwGW45hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA=
+-----END CERTIFICATE-----
+
+OISTE WISeKey Global Root GC CA
+===============================
+-----BEGIN CERTIFICATE-----
+MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQswCQYDVQQGEwJD
+SDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEo
+MCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRa
+Fw00MjA1MDkwOTU4MzNaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQL
+ExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh
+bCBSb290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4nieUqjFqdr
+VCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4Wp2OQ0jnUsYd4XxiWD1Ab
+NTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd
+BgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7TrYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0E
+AwMDaAAwZQIwJsdpW9zV57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtk
+AjEA2zQgMgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9
+-----END CERTIFICATE-----
+
+UCA Global G2 Root
+==================
+-----BEGIN CERTIFICATE-----
+MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9MQswCQYDVQQG
+EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBHbG9iYWwgRzIgUm9vdDAeFw0x
+NjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0xCzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlU
+cnVzdDEbMBkGA1UEAwwSVUNBIEdsb2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
+MIICCgKCAgEAxeYrb3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmT
+oni9kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzmVHqUwCoV
+8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/RVogvGjqNO7uCEeBHANBS
+h6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDcC/Vkw85DvG1xudLeJ1uK6NjGruFZfc8o
+LTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIjtm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/
+R+zvWr9LesGtOxdQXGLYD0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBe
+KW4bHAyvj5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6DlNaBa
+4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6iIis7nCs+dwp4wwc
+OxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznPO6Q0ibd5Ei9Hxeepl2n8pndntd97
+8XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O
+BBYEFIHEjMz15DD/pQwIX4wVZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo
+5sOASD0Ee/ojL3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5
+1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl1qnN3e92mI0A
+Ds0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oUb3n09tDh05S60FdRvScFDcH9
+yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LVPtateJLbXDzz2K36uGt/xDYotgIVilQsnLAX
+c47QN6MUPJiVAAwpBVueSUmxX8fjy88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHo
+jhJi6IjMtX9Gl8CbEGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZk
+bxqgDMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI+Vg7RE+x
+ygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGyYiGqhkCyLmTTX8jjfhFn
+RR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bXUB+K+wb1whnw0A==
+-----END CERTIFICATE-----
+
+UCA Extended Validation Root
+============================
+-----BEGIN CERTIFICATE-----
+MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQG
+EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9u
+IFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMxMDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8G
+A1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIi
+MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrs
+iWogD4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvSsPGP2KxF
+Rv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aopO2z6+I9tTcg1367r3CTu
+eUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dksHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR
+59mzLC52LqGj3n5qiAno8geK+LLNEOfic0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH
+0mK1lTnj8/FtDw5lhIpjVMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KR
+el7sFsLzKuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/TuDv
+B0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41Gsx2VYVdWf6/wFlth
+WG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs1+lvK9JKBZP8nm9rZ/+I8U6laUpS
+NwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQDfwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS
+3H5aBZ8eNJr34RQwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQEL
+BQADggIBADaNl8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR
+ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQVBcZEhrxH9cM
+aVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5c6sq1WnIeJEmMX3ixzDx/BR4
+dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb
++7lsq+KePRXBOy5nAliRn+/4Qh8st2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOW
+F3sGPjLtx7dCvHaj2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwi
+GpWOvpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2CxR9GUeOc
+GMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmxcmtpzyKEC2IPrNkZAJSi
+djzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbMfjKaiJUINlK73nZfdklJrX+9ZSCyycEr
+dhh2n1ax
+-----END CERTIFICATE-----
+
+Certigna Root CA
+================
+-----BEGIN CERTIFICATE-----
+MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAwWjELMAkGA1UE
+BhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAwMiA0ODE0NjMwODEwMDAzNjEZ
+MBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0xMzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjda
+MFoxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYz
+MDgxMDAwMzYxGTAXBgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4IC
+DwAwggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sOty3tRQgX
+stmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9MCiBtnyN6tMbaLOQdLNyz
+KNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPuI9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8
+JXrJhFwLrN1CTivngqIkicuQstDuI7pmTLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16
+XdG+RCYyKfHx9WzMfgIhC59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq
+4NYKpkDfePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3YzIoej
+wpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWTCo/1VTp2lc5ZmIoJ
+lXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1kJWumIWmbat10TWuXekG9qxf5kBdI
+jzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp/
+/TBt2dzhauH8XwIDAQABo4IBGjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw
+HQYDVR0OBBYEFBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of
+1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczovL3d3d3cuY2Vy
+dGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilodHRwOi8vY3JsLmNlcnRpZ25h
+LmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYraHR0cDovL2NybC5kaGlteW90aXMuY29tL2Nl
+cnRpZ25hcm9vdGNhLmNybDANBgkqhkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOIt
+OoldaDgvUSILSo3L6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxP
+TGRGHVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH60BGM+RFq
+7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncBlA2c5uk5jR+mUYyZDDl3
+4bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdio2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd
+8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS
+6Cvu5zHbugRqh5jnxV/vfaci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaY
+tlu3zM63Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayhjWZS
+aX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw3kAP+HwV96LOPNde
+E4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0=
+-----END CERTIFICATE-----
+
+emSign Root CA - G1
+===================
+-----BEGIN CERTIFICATE-----
+MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYDVQQGEwJJTjET
+MBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRl
+ZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBHMTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgx
+ODMwMDBaMGcxCzAJBgNVBAYTAklOMRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVk
+aHJhIFRlY2hub2xvZ2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIB
+IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQzf2N4aLTN
+LnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO8oG0x5ZOrRkVUkr+PHB1
+cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aqd7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHW
+DV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhMtTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ
+6DqS0hdW5TUaQBw+jSztOd9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrH
+hQIDAQABo0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQDAgEG
+MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31xPaOfG1vR2vjTnGs2
+vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjMwiI/aTvFthUvozXGaCocV685743Q
+NcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6dGNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q
++Mri/Tm3R7nrft8EI6/6nAYH6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeih
+U80Bv2noWgbyRQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx
+iN66zB+Afko=
+-----END CERTIFICATE-----
+
+emSign ECC Root CA - G3
+=======================
+-----BEGIN CERTIFICATE-----
+MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQGEwJJTjETMBEG
+A1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEg
+MB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4
+MTgzMDAwWjBrMQswCQYDVQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11
+ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g
+RzMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0WXTsuwYc
+58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xySfvalY8L1X44uT6EYGQIr
+MgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuBzhccLikenEhjQjAOBgNVHQ8BAf8EBAMC
+AQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+D
+CBeQyh+KTOgNG3qxrdWBCUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7
+jHvrZQnD+JbNR6iC8hZVdyR+EhCVBCyj
+-----END CERTIFICATE-----
+
+emSign Root CA - C1
+===================
+-----BEGIN CERTIFICATE-----
+MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkGA1UEBhMCVVMx
+EzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNp
+Z24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UE
+BhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQD
+ExNlbVNpZ24gUm9vdCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+up
+ufGZBczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZHdPIWoU/
+Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH3DspVpNqs8FqOp099cGX
+OFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvHGPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4V
+I5b2P/AgNBbeCsbEBEV5f6f9vtKppa+cxSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleooms
+lMuoaJuvimUnzYnu3Yy1aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+
+XJGFehiqTbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQAD
+ggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87/kOXSTKZEhVb3xEp
+/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4kqNPEjE2NuLe/gDEo2APJ62gsIq1
+NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrGYQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9
+wC68AivTxEDkigcxHpvOJpkT+xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQ
+BmIMMMAVSKeoWXzhriKi4gp6D/piq1JM4fHfyr6DDUI=
+-----END CERTIFICATE-----
+
+emSign ECC Root CA - C3
+=======================
+-----BEGIN CERTIFICATE-----
+MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQGEwJVUzETMBEG
+A1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMxIDAeBgNVBAMTF2VtU2lnbiBF
+Q0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UE
+BhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQD
+ExdlbVNpZ24gRUNDIFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd
+6bciMK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4OjavtisIGJAnB9
+SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0OBBYEFPtaSNCAIEDyqOkA
+B2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2gA
+MGUCMQC02C8Cif22TGK6Q04ThHK1rt0c3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwU
+ZOR8loMRnLDRWmFLpg9J0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ==
+-----END CERTIFICATE-----
+
+Hongkong Post Root CA 3
+=======================
+-----BEGIN CERTIFICATE-----
+MIIFzzCCA7egAwIBAgIUCBZfikyl7ADJk0DfxMauI7gcWqQwDQYJKoZIhvcNAQELBQAwbzELMAkG
+A1UEBhMCSEsxEjAQBgNVBAgTCUhvbmcgS29uZzESMBAGA1UEBxMJSG9uZyBLb25nMRYwFAYDVQQK
+Ew1Ib25na29uZyBQb3N0MSAwHgYDVQQDExdIb25na29uZyBQb3N0IFJvb3QgQ0EgMzAeFw0xNzA2
+MDMwMjI5NDZaFw00MjA2MDMwMjI5NDZaMG8xCzAJBgNVBAYTAkhLMRIwEAYDVQQIEwlIb25nIEtv
+bmcxEjAQBgNVBAcTCUhvbmcgS29uZzEWMBQGA1UEChMNSG9uZ2tvbmcgUG9zdDEgMB4GA1UEAxMX
+SG9uZ2tvbmcgUG9zdCBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz
+iNfqzg8gTr7m1gNt7ln8wlffKWihgw4+aMdoWJwcYEuJQwy51BWy7sFOdem1p+/l6TWZ5Mwc50tf
+jTMwIDNT2aa71T4Tjukfh0mtUC1Qyhi+AViiE3CWu4mIVoBc+L0sPOFMV4i707mV78vH9toxdCim
+5lSJ9UExyuUmGs2C4HDaOym71QP1mbpV9WTRYA6ziUm4ii8F0oRFKHyPaFASePwLtVPLwpgchKOe
+sL4jpNrcyCse2m5FHomY2vkALgbpDDtw1VAliJnLzXNg99X/NWfFobxeq81KuEXryGgeDQ0URhLj
+0mRiikKYvLTGCAj4/ahMZJx2Ab0vqWwzD9g/KLg8aQFChn5pwckGyuV6RmXpwtZQQS4/t+TtbNe/
+JgERohYpSms0BpDsE9K2+2p20jzt8NYt3eEV7KObLyzJPivkaTv/ciWxNoZbx39ri1UbSsUgYT2u
+y1DhCDq+sI9jQVMwCFk8mB13umOResoQUGC/8Ne8lYePl8X+l2oBlKN8W4UdKjk60FSh0Tlxnf0h
++bV78OLgAo9uliQlLKAeLKjEiafv7ZkGL7YKTE/bosw3Gq9HhS2KX8Q0NEwA/RiTZxPRN+ZItIsG
+xVd7GYYKecsAyVKvQv83j+GjHno9UKtjBucVtT+2RTeUN7F+8kjDf8V1/peNRY8apxpyKBpADwID
+AQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQXnc0e
+i9Y5K3DTXNSguB+wAPzFYTAdBgNVHQ4EFgQUF53NHovWOStw01zUoLgfsAD8xWEwDQYJKoZIhvcN
+AQELBQADggIBAFbVe27mIgHSQpsY1Q7XZiNc4/6gx5LS6ZStS6LG7BJ8dNVI0lkUmcDrudHr9Egw
+W62nV3OZqdPlt9EuWSRY3GguLmLYauRwCy0gUCCkMpXRAJi70/33MvJJrsZ64Ee+bs7Lo3I6LWld
+y8joRTnU+kLBEUx3XZL7av9YROXrgZ6voJmtvqkBZss4HTzfQx/0TW60uhdG/H39h4F5ag0zD/ov
++BS5gLNdTaqX4fnkGMX41TiMJjz98iji7lpJiCzfeT2OnpA8vUFKOt1b9pq0zj8lMH8yfaIDlNDc
+eqFS3m6TjRgm/VWsvY+b0s+v54Ysyx8Jb6NvqYTUc79NoXQbTiNg8swOqn+knEwlqLJmOzj/2ZQw
+9nKEvmhVEA/GcywWaZMH/rFF7buiVWqw2rVKAiUnhde3t4ZEFolsgCs+l6mc1X5VTMbeRRAc6uk7
+nwNT7u56AQIWeNTowr5GdogTPyK7SBIdUgC0An4hGh6cJfTzPV4e0hz5sy229zdcxsshTrD3mUcY
+hcErulWuBurQB7Lcq9CClnXO0lD+mefPL5/ndtFhKvshuzHQqp9HpLIiyhY6UFfEW0NnxWViA0kB
+60PZ2Pierc+xYw5F9KBaLJstxabArahH9CdMOA0uG0k7UvToiIMrVCjU8jVStDKDYmlkDJGcn5fq
+dBb9HxEGmpv0
+-----END CERTIFICATE-----
+
+Microsoft ECC Root Certificate Authority 2017
+=============================================
+-----BEGIN CERTIFICATE-----
+MIICWTCCAd+gAwIBAgIQZvI9r4fei7FK6gxXMQHC7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV
+UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNyb3NvZnQgRUND
+IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwHhcNMTkxMjE4MjMwNjQ1WhcNNDIwNzE4
+MjMxNjA0WjBlMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYw
+NAYDVQQDEy1NaWNyb3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwdjAQ
+BgcqhkjOPQIBBgUrgQQAIgNiAATUvD0CQnVBEyPNgASGAlEvaqiBYgtlzPbKnR5vSmZRogPZnZH6
+thaxjG7efM3beaYvzrvOcS/lpaso7GMEZpn4+vKTEAXhgShC48Zo9OYbhGBKia/teQ87zvH2RPUB
+eMCjVDBSMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTIy5lycFIM
++Oa+sgRXKSrPQhDtNTAQBgkrBgEEAYI3FQEEAwIBADAKBggqhkjOPQQDAwNoADBlAjBY8k3qDPlf
+Xu5gKcs68tvWMoQZP3zVL8KxzJOuULsJMsbG7X7JNpQS5GiFBqIb0C8CMQCZ6Ra0DvpWSNSkMBaR
+eNtUjGUBiudQZsIxtzm6uBoiB078a1QWIP8rtedMDE2mT3M=
+-----END CERTIFICATE-----
+
+Microsoft RSA Root Certificate Authority 2017
+=============================================
+-----BEGIN CERTIFICATE-----
+MIIFqDCCA5CgAwIBAgIQHtOXCV/YtLNHcB6qvn9FszANBgkqhkiG9w0BAQwFADBlMQswCQYDVQQG
+EwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNyb3NvZnQg
+UlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwHhcNMTkxMjE4MjI1MTIyWhcNNDIw
+NzE4MjMwMDIzWjBlMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u
+MTYwNAYDVQQDEy1NaWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcw
+ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKW76UM4wplZEWCpW9R2LBifOZNt9GkMml
+7Xhqb0eRaPgnZ1AzHaGm++DlQ6OEAlcBXZxIQIJTELy/xztokLaCLeX0ZdDMbRnMlfl7rEqUrQ7e
+S0MdhweSE5CAg2Q1OQT85elss7YfUJQ4ZVBcF0a5toW1HLUX6NZFndiyJrDKxHBKrmCk3bPZ7Pw7
+1VdyvD/IybLeS2v4I2wDwAW9lcfNcztmgGTjGqwu+UcF8ga2m3P1eDNbx6H7JyqhtJqRjJHTOoI+
+dkC0zVJhUXAoP8XFWvLJjEm7FFtNyP9nTUwSlq31/niol4fX/V4ggNyhSyL71Imtus5Hl0dVe49F
+yGcohJUcaDDv70ngNXtk55iwlNpNhTs+VcQor1fznhPbRiefHqJeRIOkpcrVE7NLP8TjwuaGYaRS
+MLl6IE9vDzhTyzMMEyuP1pq9KsgtsRx9S1HKR9FIJ3Jdh+vVReZIZZ2vUpC6W6IYZVcSn2i51BVr
+lMRpIpj0M+Dt+VGOQVDJNE92kKz8OMHY4Xu54+OU4UZpyw4KUGsTuqwPN1q3ErWQgR5WrlcihtnJ
+0tHXUeOrO8ZV/R4O03QK0dqq6mm4lyiPSMQH+FJDOvTKVTUssKZqwJz58oHhEmrARdlns87/I6KJ
+ClTUFLkqqNfs+avNJVgyeY+QW5g5xAgGwax/Dj0ApQIDAQABo1QwUjAOBgNVHQ8BAf8EBAMCAYYw
+DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUCctZf4aycI8awznjwNnpv7tNsiMwEAYJKwYBBAGC
+NxUBBAMCAQAwDQYJKoZIhvcNAQEMBQADggIBAKyvPl3CEZaJjqPnktaXFbgToqZCLgLNFgVZJ8og
+6Lq46BrsTaiXVq5lQ7GPAJtSzVXNUzltYkyLDVt8LkS/gxCP81OCgMNPOsduET/m4xaRhPtthH80
+dK2Jp86519efhGSSvpWhrQlTM93uCupKUY5vVau6tZRGrox/2KJQJWVggEbbMwSubLWYdFQl3JPk
++ONVFT24bcMKpBLBaYVu32TxU5nhSnUgnZUP5NbcA/FZGOhHibJXWpS2qdgXKxdJ5XbLwVaZOjex
+/2kskZGT4d9Mozd2TaGf+G0eHdP67Pv0RR0Tbc/3WeUiJ3IrhvNXuzDtJE3cfVa7o7P4NHmJweDy
+AmH3pvwPuxwXC65B2Xy9J6P9LjrRk5Sxcx0ki69bIImtt2dmefU6xqaWM/5TkshGsRGRxpl/j8nW
+ZjEgQRCHLQzWwa80mMpkg/sTV9HB8Dx6jKXB/ZUhoHHBk2dxEuqPiAppGWSZI1b7rCoucL5mxAyE
+7+WL85MB+GqQk2dLsmijtWKP6T+MejteD+eMuMZ87zf9dOLITzNy4ZQ5bb0Sr74MTnB8G2+NszKT
+c0QWbej09+CVgI+WXTik9KveCjCHk9hNAHFiRSdLOkKEW39lt2c0Ui2cFmuqqNh7o0JMcccMyj6D
+5KbvtwEwXlGjefVwaaZBRA+GsCyRxj3qrg+E
+-----END CERTIFICATE-----
+
+e-Szigno Root CA 2017
+=====================
+-----BEGIN CERTIFICATE-----
+MIICQDCCAeWgAwIBAgIMAVRI7yH9l1kN9QQKMAoGCCqGSM49BAMCMHExCzAJBgNVBAYTAkhVMREw
+DwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMgTHRkLjEXMBUGA1UEYQwOVkFUSFUt
+MjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25vIFJvb3QgQ0EgMjAxNzAeFw0xNzA4MjIxMjA3MDZa
+Fw00MjA4MjIxMjA3MDZaMHExCzAJBgNVBAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UE
+CgwNTWljcm9zZWMgTHRkLjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3pp
+Z25vIFJvb3QgQ0EgMjAxNzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJbcPYrYsHtvxie+RJCx
+s1YVe45DJH0ahFnuY2iyxl6H0BVIHqiQrb1TotreOpCmYF9oMrWGQd+HWyx7xf58etqjYzBhMA8G
+A1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSHERUI0arBeAyxr87GyZDv
+vzAEwDAfBgNVHSMEGDAWgBSHERUI0arBeAyxr87GyZDvvzAEwDAKBggqhkjOPQQDAgNJADBGAiEA
+tVfd14pVCzbhhkT61NlojbjcI4qKDdQvfepz7L9NbKgCIQDLpbQS+ue16M9+k/zzNY9vTlp8tLxO
+svxyqltZ+efcMQ==
+-----END CERTIFICATE-----
+
+certSIGN Root CA G2
+===================
+-----BEGIN CERTIFICATE-----
+MIIFRzCCAy+gAwIBAgIJEQA0tk7GNi02MA0GCSqGSIb3DQEBCwUAMEExCzAJBgNVBAYTAlJPMRQw
+EgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJR04gUk9PVCBDQSBHMjAeFw0xNzAy
+MDYwOTI3MzVaFw00MjAyMDYwOTI3MzVaMEExCzAJBgNVBAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lH
+TiBTQTEcMBoGA1UECxMTY2VydFNJR04gUk9PVCBDQSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP
+ADCCAgoCggIBAMDFdRmRfUR0dIf+DjuW3NgBFszuY5HnC2/OOwppGnzC46+CjobXXo9X69MhWf05
+N0IwvlDqtg+piNguLWkh59E3GE59kdUWX2tbAMI5Qw02hVK5U2UPHULlj88F0+7cDBrZuIt4Imfk
+abBoxTzkbFpG583H+u/E7Eu9aqSs/cwoUe+StCmrqzWaTOTECMYmzPhpn+Sc8CnTXPnGFiWeI8Mg
+wT0PPzhAsP6CRDiqWhqKa2NYOLQV07YRaXseVO6MGiKscpc/I1mbySKEwQdPzH/iV8oScLumZfNp
+dWO9lfsbl83kqK/20U6o2YpxJM02PbyWxPFsqa7lzw1uKA2wDrXKUXt4FMMgL3/7FFXhEZn91Qqh
+ngLjYl/rNUssuHLoPj1PrCy7Lobio3aP5ZMqz6WryFyNSwb/EkaseMsUBzXgqd+L6a8VTxaJW732
+jcZZroiFDsGJ6x9nxUWO/203Nit4ZoORUSs9/1F3dmKh7Gc+PoGD4FapUB8fepmrY7+EF3fxDTvf
+95xhszWYijqy7DwaNz9+j5LP2RIUZNoQAhVB/0/E6xyjyfqZ90bp4RjZsbgyLcsUDFDYg2WD7rlc
+z8sFWkz6GZdr1l0T08JcVLwyc6B49fFtHsufpaafItzRUZ6CeWRgKRM+o/1Pcmqr4tTluCRVLERL
+iohEnMqE0yo7AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1Ud
+DgQWBBSCIS1mxteg4BXrzkwJd8RgnlRuAzANBgkqhkiG9w0BAQsFAAOCAgEAYN4auOfyYILVAzOB
+ywaK8SJJ6ejqkX/GM15oGQOGO0MBzwdw5AgeZYWR5hEit/UCI46uuR59H35s5r0l1ZUa8gWmr4UC
+b6741jH/JclKyMeKqdmfS0mbEVeZkkMR3rYzpMzXjWR91M08KCy0mpbqTfXERMQlqiCA2ClV9+BB
+/AYm/7k29UMUA2Z44RGx2iBfRgB4ACGlHgAoYXhvqAEBj500mv/0OJD7uNGzcgbJceaBxXntC6Z5
+8hMLnPddDnskk7RI24Zf3lCGeOdA5jGokHZwYa+cNywRtYK3qq4kNFtyDGkNzVmf9nGvnAvRCjj5
+BiKDUyUM/FHE5r7iOZULJK2v0ZXkltd0ZGtxTgI8qoXzIKNDOXZbbFD+mpwUHmUUihW9o4JFWklW
+atKcsWMy5WHgUyIOpwpJ6st+H6jiYoD2EEVSmAYY3qXNL3+q1Ok+CHLsIwMCPKaq2LxndD0UF/tU
+Sxfj03k9bWtJySgOLnRQvwzZRjoQhsmnP+mg7H/rpXdYaXHmgwo38oZJar55CJD2AhZkPuXaTH4M
+NMn5X7azKFGnpyuqSfqNZSlO42sTp5SjLVFteAxEy9/eCG/Oo2Sr05WE1LlSVHJ7liXMvGnjSG4N
+0MedJ5qq+BOS3R7fY581qRY27Iy4g/Q9iY/NtBde17MXQRBdJ3NghVdJIgc=
+-----END CERTIFICATE-----
+
+Trustwave Global Certification Authority
+========================================
+-----BEGIN CERTIFICATE-----
+MIIF2jCCA8KgAwIBAgIMBfcOhtpJ80Y1LrqyMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYDVQQGEwJV
+UzERMA8GA1UECAwISWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28xITAfBgNVBAoMGFRydXN0d2F2
+ZSBIb2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1c3R3YXZlIEdsb2JhbCBDZXJ0aWZpY2F0aW9u
+IEF1dGhvcml0eTAeFw0xNzA4MjMxOTM0MTJaFw00MjA4MjMxOTM0MTJaMIGIMQswCQYDVQQGEwJV
+UzERMA8GA1UECAwISWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28xITAfBgNVBAoMGFRydXN0d2F2
+ZSBIb2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1c3R3YXZlIEdsb2JhbCBDZXJ0aWZpY2F0aW9u
+IEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALldUShLPDeS0YLOvR29
+zd24q88KPuFd5dyqCblXAj7mY2Hf8g+CY66j96xz0XznswuvCAAJWX/NKSqIk4cXGIDtiLK0thAf
+LdZfVaITXdHG6wZWiYj+rDKd/VzDBcdu7oaJuogDnXIhhpCujwOl3J+IKMujkkkP7NAP4m1ET4Bq
+stTnoApTAbqOl5F2brz81Ws25kCI1nsvXwXoLG0R8+eyvpJETNKXpP7ScoFDB5zpET71ixpZfR9o
+WN0EACyW80OzfpgZdNmcc9kYvkHHNHnZ9GLCQ7mzJ7Aiy/k9UscwR7PJPrhq4ufogXBeQotPJqX+
+OsIgbrv4Fo7NDKm0G2x2EOFYeUY+VM6AqFcJNykbmROPDMjWLBz7BegIlT1lRtzuzWniTY+HKE40
+Cz7PFNm73bZQmq131BnW2hqIyE4bJ3XYsgjxroMwuREOzYfwhI0Vcnyh78zyiGG69Gm7DIwLdVcE
+uE4qFC49DxweMqZiNu5m4iK4BUBjECLzMx10coos9TkpoNPnG4CELcU9402x/RpvumUHO1jsQkUm
++9jaJXLE9gCxInm943xZYkqcBW89zubWR2OZxiRvchLIrH+QtAuRcOi35hYQcRfO3gZPSEF9NUqj
+ifLJS3tBEW1ntwiYTOURGa5CgNz7kAXU+FDKvuStx8KU1xad5hePrzb7AgMBAAGjQjBAMA8GA1Ud
+EwEB/wQFMAMBAf8wHQYDVR0OBBYEFJngGWcNYtt2s9o9uFvo/ULSMQ6HMA4GA1UdDwEB/wQEAwIB
+BjANBgkqhkiG9w0BAQsFAAOCAgEAmHNw4rDT7TnsTGDZqRKGFx6W0OhUKDtkLSGm+J1WE2pIPU/H
+PinbbViDVD2HfSMF1OQc3Og4ZYbFdada2zUFvXfeuyk3QAUHw5RSn8pk3fEbK9xGChACMf1KaA0H
+ZJDmHvUqoai7PF35owgLEQzxPy0QlG/+4jSHg9bP5Rs1bdID4bANqKCqRieCNqcVtgimQlRXtpla
+4gt5kNdXElE1GYhBaCXUNxeEFfsBctyV3lImIJgm4nb1J2/6ADtKYdkNy1GTKv0WBpanI5ojSP5R
+vbbEsLFUzt5sQa0WZ37b/TjNuThOssFgy50X31ieemKyJo90lZvkWx3SD92YHJtZuSPTMaCm/zjd
+zyBP6VhWOmfD0faZmZ26NraAL4hHT4a/RDqA5Dccprrql5gR0IRiR2Qequ5AvzSxnI9O4fKSTx+O
+856X3vOmeWqJcU9LJxdI/uz0UA9PSX3MReO9ekDFQdxhVicGaeVyQYHTtgGJoC86cnn+OjC/QezH
+Yj6RS8fZMXZC+fc8Y+wmjHMMfRod6qh8h6jCJ3zhM0EPz8/8AKAigJ5Kp28AsEFFtyLKaEjFQqKu
+3R3y4G5OBVixwJAWKqQ9EEC+j2Jjg6mcgn0tAumDMHzLJ8n9HmYAsC7TIS+OMxZsmO0QqAfWzJPP
+29FpHOTKyeC2nOnOcXHebD8WpHk=
+-----END CERTIFICATE-----
+
+Trustwave Global ECC P256 Certification Authority
+=================================================
+-----BEGIN CERTIFICATE-----
+MIICYDCCAgegAwIBAgIMDWpfCD8oXD5Rld9dMAoGCCqGSM49BAMCMIGRMQswCQYDVQQGEwJVUzER
+MA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0d2F2ZSBI
+b2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDI1NiBDZXJ0aWZp
+Y2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMxOTM1MTBaFw00MjA4MjMxOTM1MTBaMIGRMQswCQYD
+VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRy
+dXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDI1
+NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABH77bOYj
+43MyCMpg5lOcunSNGLB4kFKA3TjASh3RqMyTpJcGOMoNFWLGjgEqZZ2q3zSRLoHB5DOSMcT9CTqm
+P62jQzBBMA8GA1UdEwEB/wQFMAMBAf8wDwYDVR0PAQH/BAUDAwcGADAdBgNVHQ4EFgQUo0EGrJBt
+0UrrdaVKEJmzsaGLSvcwCgYIKoZIzj0EAwIDRwAwRAIgB+ZU2g6gWrKuEZ+Hxbb/ad4lvvigtwjz
+RM4q3wghDDcCIC0mA6AFvWvR9lz4ZcyGbbOcNEhjhAnFjXca4syc4XR7
+-----END CERTIFICATE-----
+
+Trustwave Global ECC P384 Certification Authority
+=================================================
+-----BEGIN CERTIFICATE-----
+MIICnTCCAiSgAwIBAgIMCL2Fl2yZJ6SAaEc7MAoGCCqGSM49BAMDMIGRMQswCQYDVQQGEwJVUzER
+MA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0d2F2ZSBI
+b2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDM4NCBDZXJ0aWZp
+Y2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMxOTM2NDNaFw00MjA4MjMxOTM2NDNaMIGRMQswCQYD
+VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRy
+dXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDM4
+NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTB2MBAGByqGSM49AgEGBSuBBAAiA2IABGvaDXU1CDFH
+Ba5FmVXxERMuSvgQMSOjfoPTfygIOiYaOs+Xgh+AtycJj9GOMMQKmw6sWASr9zZ9lCOkmwqKi6vr
+/TklZvFe/oyujUF5nQlgziip04pt89ZF1PKYhDhloKNDMEEwDwYDVR0TAQH/BAUwAwEB/zAPBgNV
+HQ8BAf8EBQMDBwYAMB0GA1UdDgQWBBRVqYSJ0sEyvRjLbKYHTsjnnb6CkDAKBggqhkjOPQQDAwNn
+ADBkAjA3AZKXRRJ+oPM+rRk6ct30UJMDEr5E0k9BpIycnR+j9sKS50gU/k6bpZFXrsY3crsCMGcl
+CrEMXu6pY5Jv5ZAL/mYiykf9ijH3g/56vxC+GCsej/YpHpRZ744hN8tRmKVuSw==
+-----END CERTIFICATE-----
+
+NAVER Global Root Certification Authority
+=========================================
+-----BEGIN CERTIFICATE-----
+MIIFojCCA4qgAwIBAgIUAZQwHqIL3fXFMyqxQ0Rx+NZQTQ0wDQYJKoZIhvcNAQEMBQAwaTELMAkG
+A1UEBhMCS1IxJjAkBgNVBAoMHU5BVkVSIEJVU0lORVNTIFBMQVRGT1JNIENvcnAuMTIwMAYDVQQD
+DClOQVZFUiBHbG9iYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MTgwODU4
+NDJaFw0zNzA4MTgyMzU5NTlaMGkxCzAJBgNVBAYTAktSMSYwJAYDVQQKDB1OQVZFUiBCVVNJTkVT
+UyBQTEFURk9STSBDb3JwLjEyMDAGA1UEAwwpTkFWRVIgR2xvYmFsIFJvb3QgQ2VydGlmaWNhdGlv
+biBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC21PGTXLVAiQqrDZBb
+UGOukJR0F0Vy1ntlWilLp1agS7gvQnXp2XskWjFlqxcX0TM62RHcQDaH38dq6SZeWYp34+hInDEW
++j6RscrJo+KfziFTowI2MMtSAuXaMl3Dxeb57hHHi8lEHoSTGEq0n+USZGnQJoViAbbJAh2+g1G7
+XNr4rRVqmfeSVPc0W+m/6imBEtRTkZazkVrd/pBzKPswRrXKCAfHcXLJZtM0l/aM9BhK4dA9WkW2
+aacp+yPOiNgSnABIqKYPszuSjXEOdMWLyEz59JuOuDxp7W87UC9Y7cSw0BwbagzivESq2M0UXZR4
+Yb8ObtoqvC8MC3GmsxY/nOb5zJ9TNeIDoKAYv7vxvvTWjIcNQvcGufFt7QSUqP620wbGQGHfnZ3z
+VHbOUzoBppJB7ASjjw2i1QnK1sua8e9DXcCrpUHPXFNwcMmIpi3Ua2FzUCaGYQ5fG8Ir4ozVu53B
+A0K6lNpfqbDKzE0K70dpAy8i+/Eozr9dUGWokG2zdLAIx6yo0es+nPxdGoMuK8u180SdOqcXYZai
+cdNwlhVNt0xz7hlcxVs+Qf6sdWA7G2POAN3aCJBitOUt7kinaxeZVL6HSuOpXgRM6xBtVNbv8ejy
+YhbLgGvtPe31HzClrkvJE+2KAQHJuFFYwGY6sWZLxNUxAmLpdIQM201GLQIDAQABo0IwQDAdBgNV
+HQ4EFgQU0p+I36HNLL3s9TsBAZMzJ7LrYEswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMB
+Af8wDQYJKoZIhvcNAQEMBQADggIBADLKgLOdPVQG3dLSLvCkASELZ0jKbY7gyKoNqo0hV4/GPnrK
+21HUUrPUloSlWGB/5QuOH/XcChWB5Tu2tyIvCZwTFrFsDDUIbatjcu3cvuzHV+YwIHHW1xDBE1UB
+jCpD5EHxzzp6U5LOogMFDTjfArsQLtk70pt6wKGm+LUx5vR1yblTmXVHIloUFcd4G7ad6Qz4G3bx
+hYTeodoS76TiEJd6eN4MUZeoIUCLhr0N8F5OSza7OyAfikJW4Qsav3vQIkMsRIz75Sq0bBwcupTg
+E34h5prCy8VCZLQelHsIJchxzIdFV4XTnyliIoNRlwAYl3dqmJLJfGBs32x9SuRwTMKeuB330DTH
+D8z7p/8Dvq1wkNoL3chtl1+afwkyQf3NosxabUzyqkn+Zvjp2DXrDige7kgvOtB5CTh8piKCk5XQ
+A76+AqAF3SAi428diDRgxuYKuQl1C/AH6GmWNcf7I4GOODm4RStDeKLRLBT/DShycpWbXgnbiUSY
+qqFJu3FS8r/2/yehNq+4tneI3TqkbZs0kNwUXTC/t+sX5Ie3cdCh13cV1ELX8vMxmV2b3RZtP+oG
+I/hGoiLtk/bdmuYqh7GYVPEi92tF4+KOdh2ajcQGjTa3FPOdVGm3jjzVpG2Tgbet9r1ke8LJaDmg
+kpzNNIaRkPpkUZ3+/uul9XXeifdy
+-----END CERTIFICATE-----
+
+AC RAIZ FNMT-RCM SERVIDORES SEGUROS
+===================================
+-----BEGIN CERTIFICATE-----
+MIICbjCCAfOgAwIBAgIQYvYybOXE42hcG2LdnC6dlTAKBggqhkjOPQQDAzB4MQswCQYDVQQGEwJF
+UzERMA8GA1UECgwIRk5NVC1SQ00xDjAMBgNVBAsMBUNlcmVzMRgwFgYDVQRhDA9WQVRFUy1RMjgy
+NjAwNEoxLDAqBgNVBAMMI0FDIFJBSVogRk5NVC1SQ00gU0VSVklET1JFUyBTRUdVUk9TMB4XDTE4
+MTIyMDA5MzczM1oXDTQzMTIyMDA5MzczM1oweDELMAkGA1UEBhMCRVMxETAPBgNVBAoMCEZOTVQt
+UkNNMQ4wDAYDVQQLDAVDZXJlczEYMBYGA1UEYQwPVkFURVMtUTI4MjYwMDRKMSwwKgYDVQQDDCNB
+QyBSQUlaIEZOTVQtUkNNIFNFUlZJRE9SRVMgU0VHVVJPUzB2MBAGByqGSM49AgEGBSuBBAAiA2IA
+BPa6V1PIyqvfNkpSIeSX0oNnnvBlUdBeh8dHsVnyV0ebAAKTRBdp20LHsbI6GA60XYyzZl2hNPk2
+LEnb80b8s0RpRBNm/dfF/a82Tc4DTQdxz69qBdKiQ1oKUm8BA06Oi6NCMEAwDwYDVR0TAQH/BAUw
+AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFAG5L++/EYZg8k/QQW6rcx/n0m5JMAoGCCqG
+SM49BAMDA2kAMGYCMQCuSuMrQMN0EfKVrRYj3k4MGuZdpSRea0R7/DjiT8ucRRcRTBQnJlU5dUoD
+zBOQn5ICMQD6SmxgiHPz7riYYqnOK8LZiqZwMR2vsJRM60/G49HzYqc8/5MuB1xJAWdpEgJyv+c=
+-----END CERTIFICATE-----
+
+GlobalSign Root R46
+===================
+-----BEGIN CERTIFICATE-----
+MIIFWjCCA0KgAwIBAgISEdK7udcjGJ5AXwqdLdDfJWfRMA0GCSqGSIb3DQEBDAUAMEYxCzAJBgNV
+BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQDExNHbG9iYWxTaWduIFJv
+b3QgUjQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAX
+BgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBSNDYwggIi
+MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCsrHQy6LNl5brtQyYdpokNRbopiLKkHWPd08Es
+CVeJOaFV6Wc0dwxu5FUdUiXSE2te4R2pt32JMl8Nnp8semNgQB+msLZ4j5lUlghYruQGvGIFAha/
+r6gjA7aUD7xubMLL1aa7DOn2wQL7Id5m3RerdELv8HQvJfTqa1VbkNud316HCkD7rRlr+/fKYIje
+2sGP1q7Vf9Q8g+7XFkyDRTNrJ9CG0Bwta/OrffGFqfUo0q3v84RLHIf8E6M6cqJaESvWJ3En7YEt
+bWaBkoe0G1h6zD8K+kZPTXhc+CtI4wSEy132tGqzZfxCnlEmIyDLPRT5ge1lFgBPGmSXZgjPjHvj
+K8Cd+RTyG/FWaha/LIWFzXg4mutCagI0GIMXTpRW+LaCtfOW3T3zvn8gdz57GSNrLNRyc0NXfeD4
+12lPFzYE+cCQYDdF3uYM2HSNrpyibXRdQr4G9dlkbgIQrImwTDsHTUB+JMWKmIJ5jqSngiCNI/on
+ccnfxkF0oE32kRbcRoxfKWMxWXEM2G/CtjJ9++ZdU6Z+Ffy7dXxd7Pj2Fxzsx2sZy/N78CsHpdls
+eVR2bJ0cpm4O6XkMqCNqo98bMDGfsVR7/mrLZqrcZdCinkqaByFrgY/bxFn63iLABJzjqls2k+g9
+vXqhnQt2sQvHnf3PmKgGwvgqo6GDoLclcqUC4wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYD
+VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA1yrc4GHqMywptWU4jaWSf8FmSwwDQYJKoZIhvcNAQEM
+BQADggIBAHx47PYCLLtbfpIrXTncvtgdokIzTfnvpCo7RGkerNlFo048p9gkUbJUHJNOxO97k4Vg
+JuoJSOD1u8fpaNK7ajFxzHmuEajwmf3lH7wvqMxX63bEIaZHU1VNaL8FpO7XJqti2kM3S+LGteWy
+gxk6x9PbTZ4IevPuzz5i+6zoYMzRx6Fcg0XERczzF2sUyQQCPtIkpnnpHs6i58FZFZ8d4kuaPp92
+CC1r2LpXFNqD6v6MVenQTqnMdzGxRBF6XLE+0xRFFRhiJBPSy03OXIPBNvIQtQ6IbbjhVp+J3pZm
+OUdkLG5NrmJ7v2B0GbhWrJKsFjLtrWhV/pi60zTe9Mlhww6G9kuEYO4Ne7UyWHmRVSyBQ7N0H3qq
+JZ4d16GLuc1CLgSkZoNNiTW2bKg2SnkheCLQQrzRQDGQob4Ez8pn7fXwgNNgyYMqIgXQBztSvwye
+qiv5u+YfjyW6hY0XHgL+XVAEV8/+LbzvXMAaq7afJMbfc2hIkCwU9D9SGuTSyxTDYWnP4vkYxboz
+nxSjBF25cfe1lNj2M8FawTSLfJvdkzrnE6JwYZ+vj+vYxXX4M2bUdGc6N3ec592kD3ZDZopD8p/7
+DEJ4Y9HiD2971KE9dJeFt0g5QdYg/NA6s/rob8SKunE3vouXsXgxT7PntgMTzlSdriVZzH81Xwj3
+QEUxeCp6
+-----END CERTIFICATE-----
+
+GlobalSign Root E46
+===================
+-----BEGIN CERTIFICATE-----
+MIICCzCCAZGgAwIBAgISEdK7ujNu1LzmJGjFDYQdmOhDMAoGCCqGSM49BAMDMEYxCzAJBgNVBAYT
+AkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQDExNHbG9iYWxTaWduIFJvb3Qg
+RTQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNV
+BAoTEEdsb2JhbFNpZ24gbnYtc2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBFNDYwdjAQBgcq
+hkjOPQIBBgUrgQQAIgNiAAScDrHPt+ieUnd1NPqlRqetMhkytAepJ8qUuwzSChDH2omwlwxwEwkB
+jtjqR+q+soArzfwoDdusvKSGN+1wCAB16pMLey5SnCNoIwZD7JIvU4Tb+0cUB+hflGddyXqBPCCj
+QjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQxCpCPtsad0kRL
+gLWi5h+xEk8blTAKBggqhkjOPQQDAwNoADBlAjEA31SQ7Zvvi5QCkxeCmb6zniz2C5GMn0oUsfZk
+vLtoURMMA/cVi4RguYv/Uo7njLwcAjA8+RHUjE7AwWHCFUyqqx0LMV87HOIAl0Qx5v5zli/altP+
+CAezNIm8BZ/3Hobui3A=
+-----END CERTIFICATE-----
+
+GLOBALTRUST 2020
+================
+-----BEGIN CERTIFICATE-----
+MIIFgjCCA2qgAwIBAgILWku9WvtPilv6ZeUwDQYJKoZIhvcNAQELBQAwTTELMAkGA1UEBhMCQVQx
+IzAhBgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVT
+VCAyMDIwMB4XDTIwMDIxMDAwMDAwMFoXDTQwMDYxMDAwMDAwMFowTTELMAkGA1UEBhMCQVQxIzAh
+BgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVTVCAy
+MDIwMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAri5WrRsc7/aVj6B3GyvTY4+ETUWi
+D59bRatZe1E0+eyLinjF3WuvvcTfk0Uev5E4C64OFudBc/jbu9G4UeDLgztzOG53ig9ZYybNpyrO
+VPu44sB8R85gfD+yc/LAGbaKkoc1DZAoouQVBGM+uq/ufF7MpotQsjj3QWPKzv9pj2gOlTblzLmM
+CcpL3TGQlsjMH/1WljTbjhzqLL6FLmPdqqmV0/0plRPwyJiT2S0WR5ARg6I6IqIoV6Lr/sCMKKCm
+fecqQjuCgGOlYx8ZzHyyZqjC0203b+J+BlHZRYQfEs4kUmSFC0iAToexIiIwquuuvuAC4EDosEKA
+A1GqtH6qRNdDYfOiaxaJSaSjpCuKAsR49GiKweR6NrFvG5Ybd0mN1MkGco/PU+PcF4UgStyYJ9OR
+JitHHmkHr96i5OTUawuzXnzUJIBHKWk7buis/UDr2O1xcSvy6Fgd60GXIsUf1DnQJ4+H4xj04KlG
+DfV0OoIu0G4skaMxXDtG6nsEEFZegB31pWXogvziB4xiRfUg3kZwhqG8k9MedKZssCz3AwyIDMvU
+clOGvGBG85hqwvG/Q/lwIHfKN0F5VVJjjVsSn8VoxIidrPIwq7ejMZdnrY8XD2zHc+0klGvIg5rQ
+mjdJBKuxFshsSUktq6HQjJLyQUp5ISXbY9e2nKd+Qmn7OmMCAwEAAaNjMGEwDwYDVR0TAQH/BAUw
+AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFNwuH9FhN3nkq9XVsxJxaD1qaJwiMB8GA1Ud
+IwQYMBaAFNwuH9FhN3nkq9XVsxJxaD1qaJwiMA0GCSqGSIb3DQEBCwUAA4ICAQCR8EICaEDuw2jA
+VC/f7GLDw56KoDEoqoOOpFaWEhCGVrqXctJUMHytGdUdaG/7FELYjQ7ztdGl4wJCXtzoRlgHNQIw
+4Lx0SsFDKv/bGtCwr2zD/cuz9X9tAy5ZVp0tLTWMstZDFyySCstd6IwPS3BD0IL/qMy/pJTAvoe9
+iuOTe8aPmxadJ2W8esVCgmxcB9CpwYhgROmYhRZf+I/KARDOJcP5YBugxZfD0yyIMaK9MOzQ0MAS
+8cE54+X1+NZK3TTN+2/BT+MAi1bikvcoskJ3ciNnxz8RFbLEAwW+uxF7Cr+obuf/WEPPm2eggAe2
+HcqtbepBEX4tdJP7wry+UUTF72glJ4DjyKDUEuzZpTcdN3y0kcra1LGWge9oXHYQSa9+pTeAsRxS
+vTOBTI/53WXZFM2KJVj04sWDpQmQ1GwUY7VA3+vA/MRYfg0UFodUJ25W5HCEuGwyEn6CMUO+1918
+oa2u1qsgEu8KwxCMSZY13At1XrFP1U80DhEgB3VDRemjEdqso5nCtnkn4rnvyOL2NSl6dPrFf4IF
+YqYK6miyeUcGbvJXqBUzxvd4Sj1Ce2t+/vdG6tHrju+IaFvowdlxfv1k7/9nR4hYJS8+hge9+6jl
+gqispdNpQ80xiEmEU5LAsTkbOYMBMMTyqfrQA71yN2BWHzZ8vTmR9W0Nv3vXkg==
+-----END CERTIFICATE-----
+
+ANF Secure Server Root CA
+=========================
+-----BEGIN CERTIFICATE-----
+MIIF7zCCA9egAwIBAgIIDdPjvGz5a7EwDQYJKoZIhvcNAQELBQAwgYQxEjAQBgNVBAUTCUc2MzI4
+NzUxMDELMAkGA1UEBhMCRVMxJzAlBgNVBAoTHkFORiBBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lv
+bjEUMBIGA1UECxMLQU5GIENBIFJhaXoxIjAgBgNVBAMTGUFORiBTZWN1cmUgU2VydmVyIFJvb3Qg
+Q0EwHhcNMTkwOTA0MTAwMDM4WhcNMzkwODMwMTAwMDM4WjCBhDESMBAGA1UEBRMJRzYzMjg3NTEw
+MQswCQYDVQQGEwJFUzEnMCUGA1UEChMeQU5GIEF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uMRQw
+EgYDVQQLEwtBTkYgQ0EgUmFpejEiMCAGA1UEAxMZQU5GIFNlY3VyZSBTZXJ2ZXIgUm9vdCBDQTCC
+AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANvrayvmZFSVgpCjcqQZAZ2cC4Ffc0m6p6zz
+BE57lgvsEeBbphzOG9INgxwruJ4dfkUyYA8H6XdYfp9qyGFOtibBTI3/TO80sh9l2Ll49a2pcbnv
+T1gdpd50IJeh7WhM3pIXS7yr/2WanvtH2Vdy8wmhrnZEE26cLUQ5vPnHO6RYPUG9tMJJo8gN0pcv
+B2VSAKduyK9o7PQUlrZXH1bDOZ8rbeTzPvY1ZNoMHKGESy9LS+IsJJ1tk0DrtSOOMspvRdOoiXse
+zx76W0OLzc2oD2rKDF65nkeP8Nm2CgtYZRczuSPkdxl9y0oukntPLxB3sY0vaJxizOBQ+OyRp1RM
+VwnVdmPF6GUe7m1qzwmd+nxPrWAI/VaZDxUse6mAq4xhj0oHdkLePfTdsiQzW7i1o0TJrH93PB0j
+7IKppuLIBkwC/qxcmZkLLxCKpvR/1Yd0DVlJRfbwcVw5Kda/SiOL9V8BY9KHcyi1Swr1+KuCLH5z
+JTIdC2MKF4EA/7Z2Xue0sUDKIbvVgFHlSFJnLNJhiQcND85Cd8BEc5xEUKDbEAotlRyBr+Qc5RQe
+8TZBAQIvfXOn3kLMTOmJDVb3n5HUA8ZsyY/b2BzgQJhdZpmYgG4t/wHFzstGH6wCxkPmrqKEPMVO
+Hj1tyRRM4y5Bu8o5vzY8KhmqQYdOpc5LMnndkEl/AgMBAAGjYzBhMB8GA1UdIwQYMBaAFJxf0Gxj
+o1+TypOYCK2Mh6UsXME3MB0GA1UdDgQWBBScX9BsY6Nfk8qTmAitjIelLFzBNzAOBgNVHQ8BAf8E
+BAMCAYYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEATh65isagmD9uw2nAalxJ
+UqzLK114OMHVVISfk/CHGT0sZonrDUL8zPB1hT+L9IBdeeUXZ701guLyPI59WzbLWoAAKfLOKyzx
+j6ptBZNscsdW699QIyjlRRA96Gejrw5VD5AJYu9LWaL2U/HANeQvwSS9eS9OICI7/RogsKQOLHDt
+dD+4E5UGUcjohybKpFtqFiGS3XNgnhAY3jyB6ugYw3yJ8otQPr0R4hUDqDZ9MwFsSBXXiJCZBMXM
+5gf0vPSQ7RPi6ovDj6MzD8EpTBNO2hVWcXNyglD2mjN8orGoGjR0ZVzO0eurU+AagNjqOknkJjCb
+5RyKqKkVMoaZkgoQI1YS4PbOTOK7vtuNknMBZi9iPrJyJ0U27U1W45eZ/zo1PqVUSlJZS2Db7v54
+EX9K3BR5YLZrZAPbFYPhor72I5dQ8AkzNqdxliXzuUJ92zg/LFis6ELhDtjTO0wugumDLmsx2d1H
+hk9tl5EuT+IocTUW0fJz/iUrB0ckYyfI+PbZa/wSMVYIwFNCr5zQM378BvAxRAMU8Vjq8moNqRGy
+g77FGr8H6lnco4g175x2MjxNBiLOFeXdntiP2t7SxDnlF4HPOEfrf4htWRvfn0IUrn7PqLBmZdo3
+r5+qPeoott7VMVgWglvquxl1AnMaykgaIZOQCo6ThKd9OyMYkomgjaw=
+-----END CERTIFICATE-----
+
+Certum EC-384 CA
+================
+-----BEGIN CERTIFICATE-----
+MIICZTCCAeugAwIBAgIQeI8nXIESUiClBNAt3bpz9DAKBggqhkjOPQQDAzB0MQswCQYDVQQGEwJQ
+TDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2Vy
+dGlmaWNhdGlvbiBBdXRob3JpdHkxGTAXBgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwHhcNMTgwMzI2
+MDcyNDU0WhcNNDMwMzI2MDcyNDU0WjB0MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERh
+dGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx
+GTAXBgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATEKI6rGFtq
+vm5kN2PkzeyrOvfMobgOgknXhimfoZTy42B4mIF4Bk3y7JoOV2CDn7TmFy8as10CW4kjPMIRBSqn
+iBMY81CE1700LCeJVf/OTOffph8oxPBUw7l8t1Ot68KjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD
+VR0OBBYEFI0GZnQkdjrzife81r1HfS+8EF9LMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNo
+ADBlAjADVS2m5hjEfO/JUG7BJw+ch69u1RsIGL2SKcHvlJF40jocVYli5RsJHrpka/F2tNQCMQC0
+QoSZ/6vnnvuRlydd3LBbMHHOXjgaatkl5+r3YZJW+OraNsKHZZYuciUvf9/DE8k=
+-----END CERTIFICATE-----
+
+Certum Trusted Root CA
+======================
+-----BEGIN CERTIFICATE-----
+MIIFwDCCA6igAwIBAgIQHr9ZULjJgDdMBvfrVU+17TANBgkqhkiG9w0BAQ0FADB6MQswCQYDVQQG
+EwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0g
+Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkxHzAdBgNVBAMTFkNlcnR1bSBUcnVzdGVkIFJvb3QgQ0Ew
+HhcNMTgwMzE2MTIxMDEzWhcNNDMwMzE2MTIxMDEzWjB6MQswCQYDVQQGEwJQTDEhMB8GA1UEChMY
+QXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBB
+dXRob3JpdHkxHzAdBgNVBAMTFkNlcnR1bSBUcnVzdGVkIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEB
+AQUAA4ICDwAwggIKAoICAQDRLY67tzbqbTeRn06TpwXkKQMlzhyC93yZn0EGze2jusDbCSzBfN8p
+fktlL5On1AFrAygYo9idBcEq2EXxkd7fO9CAAozPOA/qp1x4EaTByIVcJdPTsuclzxFUl6s1wB52
+HO8AU5853BSlLCIls3Jy/I2z5T4IHhQqNwuIPMqw9MjCoa68wb4pZ1Xi/K1ZXP69VyywkI3C7Te2
+fJmItdUDmj0VDT06qKhF8JVOJVkdzZhpu9PMMsmN74H+rX2Ju7pgE8pllWeg8xn2A1bUatMn4qGt
+g/BKEiJ3HAVz4hlxQsDsdUaakFjgao4rpUYwBI4Zshfjvqm6f1bxJAPXsiEodg42MEx51UGamqi4
+NboMOvJEGyCI98Ul1z3G4z5D3Yf+xOr1Uz5MZf87Sst4WmsXXw3Hw09Omiqi7VdNIuJGmj8PkTQk
+fVXjjJU30xrwCSss0smNtA0Aq2cpKNgB9RkEth2+dv5yXMSFytKAQd8FqKPVhJBPC/PgP5sZ0jeJ
+P/J7UhyM9uH3PAeXjA6iWYEMspA90+NZRu0PqafegGtaqge2Gcu8V/OXIXoMsSt0Puvap2ctTMSY
+njYJdmZm/Bo/6khUHL4wvYBQv3y1zgD2DGHZ5yQD4OMBgQ692IU0iL2yNqh7XAjlRICMb/gv1SHK
+HRzQ+8S1h9E6Tsd2tTVItQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSM+xx1
+vALTn04uSNn5YFSqxLNP+jAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQENBQADggIBAEii1QAL
+LtA/vBzVtVRJHlpr9OTy4EA34MwUe7nJ+jW1dReTagVphZzNTxl4WxmB82M+w85bj/UvXgF2Ez8s
+ALnNllI5SW0ETsXpD4YN4fqzX4IS8TrOZgYkNCvozMrnadyHncI013nR03e4qllY/p0m+jiGPp2K
+h2RX5Rc64vmNueMzeMGQ2Ljdt4NR5MTMI9UGfOZR0800McD2RrsLrfw9EAUqO0qRJe6M1ISHgCq8
+CYyqOhNf6DR5UMEQGfnTKB7U0VEwKbOukGfWHwpjscWpxkIxYxeU72nLL/qMFH3EQxiJ2fAyQOaA
+4kZf5ePBAFmo+eggvIksDkc0C+pXwlM2/KfUrzHN/gLldfq5Jwn58/U7yn2fqSLLiMmq0Uc9Nneo
+WWRrJ8/vJ8HjJLWG965+Mk2weWjROeiQWMODvA8s1pfrzgzhIMfatz7DP78v3DSk+yshzWePS/Tj
+6tQ/50+6uaWTRRxmHyH6ZF5v4HaUMst19W7l9o/HuKTMqJZ9ZPskWkoDbGs4xugDQ5r3V7mzKWmT
+OPQD8rv7gmsHINFSH5pkAnuYZttcTVoP0ISVoDwUQwbKytu4QTbaakRnh6+v40URFWkIsr4WOZck
+bxJF0WddCajJFdr60qZfE2Efv4WstK2tBZQIgx51F9NxO5NQI1mg7TyRVJ12AMXDuDjb
+-----END CERTIFICATE-----
+
+TunTrust Root CA
+================
+-----BEGIN CERTIFICATE-----
+MIIFszCCA5ugAwIBAgIUEwLV4kBMkkaGFmddtLu7sms+/BMwDQYJKoZIhvcNAQELBQAwYTELMAkG
+A1UEBhMCVE4xNzA1BgNVBAoMLkFnZW5jZSBOYXRpb25hbGUgZGUgQ2VydGlmaWNhdGlvbiBFbGVj
+dHJvbmlxdWUxGTAXBgNVBAMMEFR1blRydXN0IFJvb3QgQ0EwHhcNMTkwNDI2MDg1NzU2WhcNNDQw
+NDI2MDg1NzU2WjBhMQswCQYDVQQGEwJUTjE3MDUGA1UECgwuQWdlbmNlIE5hdGlvbmFsZSBkZSBD
+ZXJ0aWZpY2F0aW9uIEVsZWN0cm9uaXF1ZTEZMBcGA1UEAwwQVHVuVHJ1c3QgUm9vdCBDQTCCAiIw
+DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMPN0/y9BFPdDCA61YguBUtB9YOCfvdZn56eY+hz
+2vYGqU8ftPkLHzmMmiDQfgbU7DTZhrx1W4eI8NLZ1KMKsmwb60ksPqxd2JQDoOw05TDENX37Jk0b
+bjBU2PWARZw5rZzJJQRNmpA+TkBuimvNKWfGzC3gdOgFVwpIUPp6Q9p+7FuaDmJ2/uqdHYVy7BG7
+NegfJ7/Boce7SBbdVtfMTqDhuazb1YMZGoXRlJfXyqNlC/M4+QKu3fZnz8k/9YosRxqZbwUN/dAd
+gjH8KcwAWJeRTIAAHDOFli/LQcKLEITDCSSJH7UP2dl3RxiSlGBcx5kDPP73lad9UKGAwqmDrViW
+VSHbhlnUr8a83YFuB9tgYv7sEG7aaAH0gxupPqJbI9dkxt/con3YS7qC0lH4Zr8GRuR5KiY2eY8f
+Tpkdso8MDhz/yV3A/ZAQprE38806JG60hZC/gLkMjNWb1sjxVj8agIl6qeIbMlEsPvLfe/ZdeikZ
+juXIvTZxi11Mwh0/rViizz1wTaZQmCXcI/m4WEEIcb9PuISgjwBUFfyRbVinljvrS5YnzWuioYas
+DXxU5mZMZl+QviGaAkYt5IPCgLnPSz7ofzwB7I9ezX/SKEIBlYrilz0QIX32nRzFNKHsLA4KUiwS
+VXAkPcvCFDVDXSdOvsC9qnyW5/yeYa1E0wCXAgMBAAGjYzBhMB0GA1UdDgQWBBQGmpsfU33x9aTI
+04Y+oXNZtPdEITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFAaamx9TffH1pMjThj6hc1m0
+90QhMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAqgVutt0Vyb+zxiD2BkewhpMl
+0425yAA/l/VSJ4hxyXT968pk21vvHl26v9Hr7lxpuhbI87mP0zYuQEkHDVneixCwSQXi/5E/S7fd
+Ao74gShczNxtr18UnH1YeA32gAm56Q6XKRm4t+v4FstVEuTGfbvE7Pi1HE4+Z7/FXxttbUcoqgRY
+YdZ2vyJ/0Adqp2RT8JeNnYA/u8EH22Wv5psymsNUk8QcCMNE+3tjEUPRahphanltkE8pjkcFwRJp
+adbGNjHh/PqAulxPxOu3Mqz4dWEX1xAZufHSCe96Qp1bWgvUxpVOKs7/B9dPfhgGiPEZtdmYu65x
+xBzndFlY7wyJz4sfdZMaBBSSSFCp61cpABbjNhzI+L/wM9VBD8TMPN3pM0MBkRArHtG5Xc0yGYuP
+jCB31yLEQtyEFpslbei0VXF/sHyz03FJuc9SpAQ/3D2gu68zngowYI7bnV2UqL1g52KAdoGDDIzM
+MEZJ4gzSqK/rYXHv5yJiqfdcZGyfFoxnNidF9Ql7v/YQCvGwjVRDjAS6oz/v4jXH+XTgbzRB0L9z
+ZVcg+ZtnemZoJE6AZb0QmQZZ8mWvuMZHu/2QeItBcy6vVR/cO5JyboTT0GFMDcx2V+IthSIVNg3r
+AZ3r2OvEhJn7wAzMMujjd9qDRIueVSjAi1jTkD5OGwDxFa2DK5o=
+-----END CERTIFICATE-----
+
+HARICA TLS RSA Root CA 2021
+===========================
+-----BEGIN CERTIFICATE-----
+MIIFpDCCA4ygAwIBAgIQOcqTHO9D88aOk8f0ZIk4fjANBgkqhkiG9w0BAQsFADBsMQswCQYDVQQG
+EwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u
+cyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBSU0EgUm9vdCBDQSAyMDIxMB4XDTIxMDIxOTEwNTUz
+OFoXDTQ1MDIxMzEwNTUzN1owbDELMAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRl
+bWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgUlNB
+IFJvb3QgQ0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAIvC569lmwVnlskN
+JLnQDmT8zuIkGCyEf3dRywQRNrhe7Wlxp57kJQmXZ8FHws+RFjZiPTgE4VGC/6zStGndLuwRo0Xu
+a2s7TL+MjaQenRG56Tj5eg4MmOIjHdFOY9TnuEFE+2uva9of08WRiFukiZLRgeaMOVig1mlDqa2Y
+Ulhu2wr7a89o+uOkXjpFc5gH6l8Cct4MpbOfrqkdtx2z/IpZ525yZa31MJQjB/OCFks1mJxTuy/K
+5FrZx40d/JiZ+yykgmvwKh+OC19xXFyuQnspiYHLA6OZyoieC0AJQTPb5lh6/a6ZcMBaD9YThnEv
+dmn8kN3bLW7R8pv1GmuebxWMevBLKKAiOIAkbDakO/IwkfN4E8/BPzWr8R0RI7VDIp4BkrcYAuUR
+0YLbFQDMYTfBKnya4dC6s1BG7oKsnTH4+yPiAwBIcKMJJnkVU2DzOFytOOqBAGMUuTNe3QvboEUH
+GjMJ+E20pwKmafTCWQWIZYVWrkvL4N48fS0ayOn7H6NhStYqE613TBoYm5EPWNgGVMWX+Ko/IIqm
+haZ39qb8HOLubpQzKoNQhArlT4b4UEV4AIHrW2jjJo3Me1xR9BQsQL4aYB16cmEdH2MtiKrOokWQ
+CPxrvrNQKlr9qEgYRtaQQJKQCoReaDH46+0N0x3GfZkYVVYnZS6NRcUk7M7jAgMBAAGjQjBAMA8G
+A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFApII6ZgpJIKM+qTW8VX6iVNvRLuMA4GA1UdDwEB/wQE
+AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAPpBIqm5iFSVmewzVjIuJndftTgfvnNAUX15QvWiWkKQU
+EapobQk1OUAJ2vQJLDSle1mESSmXdMgHHkdt8s4cUCbjnj1AUz/3f5Z2EMVGpdAgS1D0NTsY9FVq
+QRtHBmg8uwkIYtlfVUKqrFOFrJVWNlar5AWMxajaH6NpvVMPxP/cyuN+8kyIhkdGGvMA9YCRotxD
+QpSbIPDRzbLrLFPCU3hKTwSUQZqPJzLB5UkZv/HywouoCjkxKLR9YjYsTewfM7Z+d21+UPCfDtcR
+j88YxeMn/ibvBZ3PzzfF0HvaO7AWhAw6k9a+F9sPPg4ZeAnHqQJyIkv3N3a6dcSFA1pj1bF1BcK5
+vZStjBWZp5N99sXzqnTPBIWUmAD04vnKJGW/4GKvyMX6ssmeVkjaef2WdhW+o45WxLM0/L5H9MG0
+qPzVMIho7suuyWPEdr6sOBjhXlzPrjoiUevRi7PzKzMHVIf6tLITe7pTBGIBnfHAT+7hOtSLIBD6
+Alfm78ELt5BGnBkpjNxvoEppaZS3JGWg/6w/zgH7IS79aPib8qXPMThcFarmlwDB31qlpzmq6YR/
+PFGoOtmUW4y/Twhx5duoXNTSpv4Ao8YWxw/ogM4cKGR0GQjTQuPOAF1/sdwTsOEFy9EgqoZ0njnn
+kf3/W9b3raYvAwtt41dU63ZTGI0RmLo=
+-----END CERTIFICATE-----
+
+HARICA TLS ECC Root CA 2021
+===========================
+-----BEGIN CERTIFICATE-----
+MIICVDCCAdugAwIBAgIQZ3SdjXfYO2rbIvT/WeK/zjAKBggqhkjOPQQDAzBsMQswCQYDVQQGEwJH
+UjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBD
+QTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBFQ0MgUm9vdCBDQSAyMDIxMB4XDTIxMDIxOTExMDExMFoX
+DTQ1MDIxMzExMDEwOVowbDELMAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWlj
+IGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgRUNDIFJv
+b3QgQ0EgMjAyMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABDgI/rGgltJ6rK9JOtDA4MM7KKrxcm1l
+AEeIhPyaJmuqS7psBAqIXhfyVYf8MLA04jRYVxqEU+kw2anylnTDUR9YSTHMmE5gEYd103KUkE+b
+ECUqqHgtvpBBWJAVcqeht6NCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUyRtTgRL+BNUW
+0aq8mm+3oJUZbsowDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMDA2cAMGQCMBHervjcToiwqfAi
+rcJRQO9gcS3ujwLEXQNwSaSS6sUUiHCm0w2wqsosQJz76YJumgIwK0eaB8bRwoF8yguWGEEbo/Qw
+CZ61IygNnxS2PFOiTAZpffpskcYqSUXm7LcT4Tps
+-----END CERTIFICATE-----
+
+Autoridad de Certificacion Firmaprofesional CIF A62634068
+=========================================================
+-----BEGIN CERTIFICATE-----
+MIIGFDCCA/ygAwIBAgIIG3Dp0v+ubHEwDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCRVMxQjBA
+BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2
+MjYzNDA2ODAeFw0xNDA5MjMxNTIyMDdaFw0zNjA1MDUxNTIyMDdaMFExCzAJBgNVBAYTAkVTMUIw
+QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB
+NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD
+Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P
+B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY
+7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH
+ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI
+plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX
+MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX
+LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK
+bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU
+vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMB0GA1Ud
+DgQWBBRlzeurNR4APn7VdMActHNHDhpkLzASBgNVHRMBAf8ECDAGAQH/AgEBMIGmBgNVHSAEgZ4w
+gZswgZgGBFUdIAAwgY8wLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuZmlybWFwcm9mZXNpb25hbC5j
+b20vY3BzMFwGCCsGAQUFBwICMFAeTgBQAGEAcwBlAG8AIABkAGUAIABsAGEAIABCAG8AbgBhAG4A
+bwB2AGEAIAA0ADcAIABCAGEAcgBjAGUAbABvAG4AYQAgADAAOAAwADEANzAOBgNVHQ8BAf8EBAMC
+AQYwDQYJKoZIhvcNAQELBQADggIBAHSHKAIrdx9miWTtj3QuRhy7qPj4Cx2Dtjqn6EWKB7fgPiDL
+4QjbEwj4KKE1soCzC1HA01aajTNFSa9J8OA9B3pFE1r/yJfY0xgsfZb43aJlQ3CTkBW6kN/oGbDb
+LIpgD7dvlAceHabJhfa9NPhAeGIQcDq+fUs5gakQ1JZBu/hfHAsdCPKxsIl68veg4MSPi3i1O1il
+I45PVf42O+AMt8oqMEEgtIDNrvx2ZnOorm7hfNoD6JQg5iKj0B+QXSBTFCZX2lSX3xZEEAEeiGaP
+cjiT3SC3NL7X8e5jjkd5KAb881lFJWAiMxujX6i6KtoaPc1A6ozuBRWV1aUsIC+nmCjuRfzxuIgA
+LI9C2lHVnOUTaHFFQ4ueCyE8S1wF3BqfmI7avSKecs2tCsvMo2ebKHTEm9caPARYpoKdrcd7b/+A
+lun4jWq9GJAd/0kakFI3ky88Al2CdgtR5xbHV/g4+afNmyJU72OwFW1TZQNKXkqgsqeOSQBZONXH
+9IBk9W6VULgRfhVwOEqwf9DEMnDAGf/JOC0ULGb0QkTmVXYbgBVX/8Cnp6o5qtjTcNAuuuuUavpf
+NIbnYrX9ivAwhZTJryQCL2/W3Wf+47BVTwSYT6RBVuKT0Gro1vP7ZeDOdcQxWQzugsgMYDNKGbqE
+ZycPvEJdvSRUDewdcAZfpLz6IHxV
+-----END CERTIFICATE-----
+
+vTrus ECC Root CA
+=================
+-----BEGIN CERTIFICATE-----
+MIICDzCCAZWgAwIBAgIUbmq8WapTvpg5Z6LSa6Q75m0c1towCgYIKoZIzj0EAwMwRzELMAkGA1UE
+BhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBS
+b290IENBMB4XDTE4MDczMTA3MjY0NFoXDTQzMDczMTA3MjY0NFowRzELMAkGA1UEBhMCQ04xHDAa
+BgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBSb290IENBMHYw
+EAYHKoZIzj0CAQYFK4EEACIDYgAEZVBKrox5lkqqHAjDo6LN/llWQXf9JpRCux3NCNtzslt188+c
+ToL0v/hhJoVs1oVbcnDS/dtitN9Ti72xRFhiQgnH+n9bEOf+QP3A2MMrMudwpremIFUde4BdS49n
+TPEQo0IwQDAdBgNVHQ4EFgQUmDnNvtiyjPeyq+GtJK97fKHbH88wDwYDVR0TAQH/BAUwAwEB/zAO
+BgNVHQ8BAf8EBAMCAQYwCgYIKoZIzj0EAwMDaAAwZQIwV53dVvHH4+m4SVBrm2nDb+zDfSXkV5UT
+QJtS0zvzQBm8JsctBp61ezaf9SXUY2sAAjEA6dPGnlaaKsyh2j/IZivTWJwghfqrkYpwcBE4YGQL
+YgmRWAD5Tfs0aNoJrSEGGJTO
+-----END CERTIFICATE-----
+
+vTrus Root CA
+=============
+-----BEGIN CERTIFICATE-----
+MIIFVjCCAz6gAwIBAgIUQ+NxE9izWRRdt86M/TX9b7wFjUUwDQYJKoZIhvcNAQELBQAwQzELMAkG
+A1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xFjAUBgNVBAMTDXZUcnVzIFJv
+b3QgQ0EwHhcNMTgwNzMxMDcyNDA1WhcNNDMwNzMxMDcyNDA1WjBDMQswCQYDVQQGEwJDTjEcMBoG
+A1UEChMTaVRydXNDaGluYSBDby4sTHRkLjEWMBQGA1UEAxMNdlRydXMgUm9vdCBDQTCCAiIwDQYJ
+KoZIhvcNAQEBBQADggIPADCCAgoCggIBAL1VfGHTuB0EYgWgrmy3cLRB6ksDXhA/kFocizuwZots
+SKYcIrrVQJLuM7IjWcmOvFjai57QGfIvWcaMY1q6n6MLsLOaXLoRuBLpDLvPbmyAhykUAyyNJJrI
+ZIO1aqwTLDPxn9wsYTwaP3BVm60AUn/PBLn+NvqcwBauYv6WTEN+VRS+GrPSbcKvdmaVayqwlHeF
+XgQPYh1jdfdr58tbmnDsPmcF8P4HCIDPKNsFxhQnL4Z98Cfe/+Z+M0jnCx5Y0ScrUw5XSmXX+6KA
+YPxMvDVTAWqXcoKv8R1w6Jz1717CbMdHflqUhSZNO7rrTOiwCcJlwp2dCZtOtZcFrPUGoPc2BX70
+kLJrxLT5ZOrpGgrIDajtJ8nU57O5q4IikCc9Kuh8kO+8T/3iCiSn3mUkpF3qwHYw03dQ+A0Em5Q2
+AXPKBlim0zvc+gRGE1WKyURHuFE5Gi7oNOJ5y1lKCn+8pu8fA2dqWSslYpPZUxlmPCdiKYZNpGvu
+/9ROutW04o5IWgAZCfEF2c6Rsffr6TlP9m8EQ5pV9T4FFL2/s1m02I4zhKOQUqqzApVg+QxMaPnu
+1RcN+HFXtSXkKe5lXa/R7jwXC1pDxaWG6iSe4gUH3DRCEpHWOXSuTEGC2/KmSNGzm/MzqvOmwMVO
+9fSddmPmAsYiS8GVP1BkLFTltvA8Kc9XAgMBAAGjQjBAMB0GA1UdDgQWBBRUYnBj8XWEQ1iO0RYg
+scasGrz2iTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOC
+AgEAKbqSSaet8PFww+SX8J+pJdVrnjT+5hpk9jprUrIQeBqfTNqK2uwcN1LgQkv7bHbKJAs5EhWd
+nxEt/Hlk3ODg9d3gV8mlsnZwUKT+twpw1aA08XXXTUm6EdGz2OyC/+sOxL9kLX1jbhd47F18iMjr
+jld22VkE+rxSH0Ws8HqA7Oxvdq6R2xCOBNyS36D25q5J08FsEhvMKar5CKXiNxTKsbhm7xqC5PD4
+8acWabfbqWE8n/Uxy+QARsIvdLGx14HuqCaVvIivTDUHKgLKeBRtRytAVunLKmChZwOgzoy8sHJn
+xDHO2zTlJQNgJXtxmOTAGytfdELSS8VZCAeHvsXDf+eW2eHcKJfWjwXj9ZtOyh1QRwVTsMo554Wg
+icEFOwE30z9J4nfrI8iIZjs9OXYhRvHsXyO466JmdXTBQPfYaJqT4i2pLr0cox7IdMakLXogqzu4
+sEb9b91fUlV1YvCXoHzXOP0l382gmxDPi7g4Xl7FtKYCNqEeXxzP4padKar9mK5S4fNBUvupLnKW
+nyfjqnN9+BojZns7q2WwMgFLFT49ok8MKzWixtlnEjUwzXYuFrOZnk1PTi07NEPhmg4NpGaXutIc
+SkwsKouLgU9xGqndXHt7CMUADTdA43x7VF8vhV929vensBxXVsFy6K2ir40zSbofitzmdHxghm+H
+l3s=
+-----END CERTIFICATE-----
+
+ISRG Root X2
+============
+-----BEGIN CERTIFICATE-----
+MIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQswCQYDVQQGEwJV
+UzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElT
+UkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00MDA5MTcxNjAwMDBaME8xCzAJBgNVBAYTAlVT
+MSkwJwYDVQQKEyBJbnRlcm5ldCBTZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNS
+RyBSb290IFgyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0H
+ttwW+1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7AlF9ItgKbppb
+d9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV
+HQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZIzj0EAwMDaAAwZQIwe3lORlCEwkSHRhtF
+cP9Ymd70/aTSVaYgLXTWNLxBo1BfASdWtL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5
+U6VR5CmD1/iQMVtCnwr1/q4AaOeMSQ+2b1tbFfLn
+-----END CERTIFICATE-----
+
+HiPKI Root CA - G1
+==================
+-----BEGIN CERTIFICATE-----
+MIIFajCCA1KgAwIBAgIQLd2szmKXlKFD6LDNdmpeYDANBgkqhkiG9w0BAQsFADBPMQswCQYDVQQG
+EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xGzAZBgNVBAMMEkhpUEtJ
+IFJvb3QgQ0EgLSBHMTAeFw0xOTAyMjIwOTQ2MDRaFw0zNzEyMzExNTU5NTlaME8xCzAJBgNVBAYT
+AlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEbMBkGA1UEAwwSSGlQS0kg
+Um9vdCBDQSAtIEcxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA9B5/UnMyDHPkvRN0
+o9QwqNCuS9i233VHZvR85zkEHmpwINJaR3JnVfSl6J3VHiGh8Ge6zCFovkRTv4354twvVcg3Px+k
+wJyz5HdcoEb+d/oaoDjq7Zpy3iu9lFc6uux55199QmQ5eiY29yTw1S+6lZgRZq2XNdZ1AYDgr/SE
+YYwNHl98h5ZeQa/rh+r4XfEuiAU+TCK72h8q3VJGZDnzQs7ZngyzsHeXZJzA9KMuH5UHsBffMNsA
+GJZMoYFL3QRtU6M9/Aes1MU3guvklQgZKILSQjqj2FPseYlgSGDIcpJQ3AOPgz+yQlda22rpEZfd
+hSi8MEyr48KxRURHH+CKFgeW0iEPU8DtqX7UTuybCeyvQqww1r/REEXgphaypcXTT3OUM3ECoWqj
+1jOXTyFjHluP2cFeRXF3D4FdXyGarYPM+l7WjSNfGz1BryB1ZlpK9p/7qxj3ccC2HTHsOyDry+K4
+9a6SsvfhhEvyovKTmiKe0xRvNlS9H15ZFblzqMF8b3ti6RZsR1pl8w4Rm0bZ/W3c1pzAtH2lsN0/
+Vm+h+fbkEkj9Bn8SV7apI09bA8PgcSojt/ewsTu8mL3WmKgMa/aOEmem8rJY5AIJEzypuxC00jBF
+8ez3ABHfZfjcK0NVvxaXxA/VLGGEqnKG/uY6fsI/fe78LxQ+5oXdUG+3Se0CAwEAAaNCMEAwDwYD
+VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ncX+l6o/vY9cdVouslGDDjYr7AwDgYDVR0PAQH/BAQD
+AgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBQUfB13HAE4/+qddRxosuej6ip0691x1TPOhwEmSKsxBHi
+7zNKpiMdDg1H2DfHb680f0+BazVP6XKlMeJ45/dOlBhbQH3PayFUhuaVevvGyuqcSE5XCV0vrPSl
+tJczWNWseanMX/mF+lLFjfiRFOs6DRfQUsJ748JzjkZ4Bjgs6FzaZsT0pPBWGTMpWmWSBUdGSquE
+wx4noR8RkpkndZMPvDY7l1ePJlsMu5wP1G4wB9TcXzZoZjmDlicmisjEOf6aIW/Vcobpf2Lll07Q
+JNBAsNB1CI69aO4I1258EHBGG3zgiLKecoaZAeO/n0kZtCW+VmWuF2PlHt/o/0elv+EmBYTksMCv
+5wiZqAxeJoBF1PhoL5aPruJKHJwWDBNvOIf2u8g0X5IDUXlwpt/L9ZlNec1OvFefQ05rLisY+Gpz
+jLrFNe85akEez3GoorKGB1s6yeHvP2UEgEcyRHCVTjFnanRbEEV16rCf0OY1/k6fi8wrkkVbbiVg
+hUbN0aqwdmaTd5a+g744tiROJgvM7XpWGuDpWsZkrUx6AEhEL7lAuxM+vhV4nYWBSipX3tUZQ9rb
+yltHhoMLP7YNdnhzeSJesYAfz77RP1YQmCuVh6EfnWQUYDksswBVLuT1sw5XxJFBAJw/6KXf6vb/
+yPCtbVKoF6ubYfwSUTXkJf2vqmqGOQ==
+-----END CERTIFICATE-----
+
+GlobalSign ECC Root CA - R4
+===========================
+-----BEGIN CERTIFICATE-----
+MIIB3DCCAYOgAwIBAgINAgPlfvU/k/2lCSGypjAKBggqhkjOPQQDAjBQMSQwIgYDVQQLExtHbG9i
+YWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds
+b2JhbFNpZ24wHhcNMTIxMTEzMDAwMDAwWhcNMzgwMTE5MDMxNDA3WjBQMSQwIgYDVQQLExtHbG9i
+YWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds
+b2JhbFNpZ24wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAS4xnnTj2wlDp8uORkcA6SumuU5BwkW
+ymOxuYb4ilfBV85C+nOh92VC/x7BALJucw7/xyHlGKSq2XE/qNS5zowdo0IwQDAOBgNVHQ8BAf8E
+BAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVLB7rUW44kB/+wpu+74zyTyjhNUwCgYI
+KoZIzj0EAwIDRwAwRAIgIk90crlgr/HmnKAWBVBfw147bmF0774BxL4YSFlhgjICICadVGNA3jdg
+UM/I2O2dgq43mLyjj0xMqTQrbO/7lZsm
+-----END CERTIFICATE-----
+
+GTS Root R1
+===========
+-----BEGIN CERTIFICATE-----
+MIIFVzCCAz+gAwIBAgINAgPlk28xsBNJiGuiFzANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQGEwJV
+UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg
+UjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE
+ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0G
+CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaM
+f/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7wCl7raKb0
+xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjwTcLCeoiKu7rPWRnWr4+w
+B7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0PfyblqAj+lug8aJRT7oM6iCsVlgmy4HqMLnXW
+nOunVmSPlk9orj2XwoSPwLxAwAtcvfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk
+9+aCEI3oncKKiPo4Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zq
+kUspzBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92wO1A
+K/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70paDPvOmbsB4om3xPX
+V2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrNVjzRlwW5y0vtOUucxD/SVRNuJLDW
+cfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0T
+AQH/BAUwAwEB/zAdBgNVHQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQAD
+ggIBAJ+qQibbC5u+/x6Wki4+omVKapi6Ist9wTrYggoGxval3sBOh2Z5ofmmWJyq+bXmYOfg6LEe
+QkEzCzc9zolwFcq1JKjPa7XSQCGYzyI0zzvFIoTgxQ6KfF2I5DUkzps+GlQebtuyh6f88/qBVRRi
+ClmpIgUxPoLW7ttXNLwzldMXG+gnoot7TiYaelpkttGsN/H9oPM47HLwEXWdyzRSjeZ2axfG34ar
+J45JK3VmgRAhpuo+9K4l/3wV3s6MJT/KYnAK9y8JZgfIPxz88NtFMN9iiMG1D53Dn0reWVlHxYci
+NuaCp+0KueIHoI17eko8cdLiA6EfMgfdG+RCzgwARWGAtQsgWSl4vflVy2PFPEz0tv/bal8xa5me
+LMFrUKTX5hgUvYU/Z6tGn6D/Qqc6f1zLXbBwHSs09dR2CQzreExZBfMzQsNhFRAbd03OIozUhfJF
+fbdT6u9AWpQKXCBfTkBdYiJ23//OYb2MI3jSNwLgjt7RETeJ9r/tSQdirpLsQBqvFAnZ0E6yove+
+7u7Y/9waLd64NnHi/Hm3lCXRSHNboTXns5lndcEZOitHTtNCjv0xyBZm2tIMPNuzjsmhDYAPexZ3
+FL//2wmUspO8IFgV6dtxQ/PeEMMA3KgqlbbC1j+Qa3bbbP6MvPJwNQzcmRk13NfIRmPVNnGuV/u3
+gm3c
+-----END CERTIFICATE-----
+
+GTS Root R2
+===========
+-----BEGIN CERTIFICATE-----
+MIIFVzCCAz+gAwIBAgINAgPlrsWNBCUaqxElqjANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQGEwJV
+UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg
+UjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE
+ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0G
+CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3Lv
+CvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3KgGjSY6Dlo7JUl
+e3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9BuXvAuMC6C/Pq8tBcKSOWIm8Wb
+a96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOdre7kRXuJVfeKH2JShBKzwkCX44ofR5GmdFrS
++LFjKBC4swm4VndAoiaYecb+3yXuPuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7M
+kogwTZq9TwtImoS1mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJG
+r61K8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqjx5RWIr9q
+S34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsRnTKaG73VululycslaVNV
+J1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0kzCqgc7dGtxRcw1PcOnlthYhGXmy5okL
+dWTK1au8CcEYof/UVKGFPP0UJAOyh9OktwIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0T
+AQH/BAUwAwEB/zAdBgNVHQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQAD
+ggIBAB/Kzt3HvqGf2SdMC9wXmBFqiN495nFWcrKeGk6c1SuYJF2ba3uwM4IJvd8lRuqYnrYb/oM8
+0mJhwQTtzuDFycgTE1XnqGOtjHsB/ncw4c5omwX4Eu55MaBBRTUoCnGkJE+M3DyCB19m3H0Q/gxh
+swWV7uGugQ+o+MePTagjAiZrHYNSVc61LwDKgEDg4XSsYPWHgJ2uNmSRXbBoGOqKYcl3qJfEycel
+/FVL8/B/uWU9J2jQzGv6U53hkRrJXRqWbTKH7QMgyALOWr7Z6v2yTcQvG99fevX4i8buMTolUVVn
+jWQye+mew4K6Ki3pHrTgSAai/GevHyICc/sgCq+dVEuhzf9gR7A/Xe8bVr2XIZYtCtFenTgCR2y5
+9PYjJbigapordwj6xLEokCZYCDzifqrXPW+6MYgKBesntaFJ7qBFVHvmJ2WZICGoo7z7GJa7Um8M
+7YNRTOlZ4iBgxcJlkoKM8xAfDoqXvneCbT+PHV28SSe9zE8P4c52hgQjxcCMElv924SgJPFI/2R8
+0L5cFtHvma3AH/vLrrw4IgYmZNralw4/KBVEqE8AyvCazM90arQ+POuV7LXTWtiBmelDGDfrs7vR
+WGJB82bSj6p4lVQgw1oudCvV0b4YacCs1aTPObpRhANl6WLAYv7YTVWW4tAR+kg0Eeye7QUd5MjW
+HYbL
+-----END CERTIFICATE-----
+
+GTS Root R3
+===========
+-----BEGIN CERTIFICATE-----
+MIICCTCCAY6gAwIBAgINAgPluILrIPglJ209ZjAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJVUzEi
+MCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMw
+HhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZ
+R29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjO
+PQIBBgUrgQQAIgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout
+736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2ADDL24CejQjBA
+MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTB8Sa6oC2uhYHP0/Eq
+Er24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEA9uEglRR7VKOQFhG/hMjqb2sXnh5GmCCbn9MN2azT
+L818+FsuVbu/3ZL3pAzcMeGiAjEA/JdmZuVDFhOD3cffL74UOO0BzrEXGhF16b0DjyZ+hOXJYKaV
+11RZt+cRLInUue4X
+-----END CERTIFICATE-----
+
+GTS Root R4
+===========
+-----BEGIN CERTIFICATE-----
+MIICCTCCAY6gAwIBAgINAgPlwGjvYxqccpBQUjAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJVUzEi
+MCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQw
+HhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZ
+R29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjO
+PQIBBgUrgQQAIgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzu
+hXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvRHYqjQjBA
+MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSATNbrdP9JNqPV2Py1
+PsVq8JQdjDAKBggqhkjOPQQDAwNpADBmAjEA6ED/g94D9J+uHXqnLrmvT/aDHQ4thQEd0dlq7A/C
+r8deVl5c1RxYIigL9zC2L7F8AjEA8GE8p/SgguMh1YQdc4acLa/KNJvxn7kjNuK8YAOdgLOaVsjh
+4rsUecrNIdSUtUlD
+-----END CERTIFICATE-----
+
+Telia Root CA v2
+================
+-----BEGIN CERTIFICATE-----
+MIIFdDCCA1ygAwIBAgIPAWdfJ9b+euPkrL4JWwWeMA0GCSqGSIb3DQEBCwUAMEQxCzAJBgNVBAYT
+AkZJMRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2
+MjAeFw0xODExMjkxMTU1NTRaFw00MzExMjkxMTU1NTRaMEQxCzAJBgNVBAYTAkZJMRowGAYDVQQK
+DBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2MjCCAiIwDQYJKoZI
+hvcNAQEBBQADggIPADCCAgoCggIBALLQPwe84nvQa5n44ndp586dpAO8gm2h/oFlH0wnrI4AuhZ7
+6zBqAMCzdGh+sq/H1WKzej9Qyow2RCRj0jbpDIX2Q3bVTKFgcmfiKDOlyzG4OiIjNLh9vVYiQJ3q
+9HsDrWj8soFPmNB06o3lfc1jw6P23pLCWBnglrvFxKk9pXSW/q/5iaq9lRdU2HhE8Qx3FZLgmEKn
+pNaqIJLNwaCzlrI6hEKNfdWV5Nbb6WLEWLN5xYzTNTODn3WhUidhOPFZPY5Q4L15POdslv5e2QJl
+tI5c0BE0312/UqeBAMN/mUWZFdUXyApT7GPzmX3MaRKGwhfwAZ6/hLzRUssbkmbOpFPlob/E2wnW
+5olWK8jjfN7j/4nlNW4o6GwLI1GpJQXrSPjdscr6bAhR77cYbETKJuFzxokGgeWKrLDiKca5JLNr
+RBH0pUPCTEPlcDaMtjNXepUugqD0XBCzYYP2AgWGLnwtbNwDRm41k9V6lS/eINhbfpSQBGq6WT0E
+BXWdN6IOLj3rwaRSg/7Qa9RmjtzG6RJOHSpXqhC8fF6CfaamyfItufUXJ63RDolUK5X6wK0dmBR4
+M0KGCqlztft0DbcbMBnEWg4cJ7faGND/isgFuvGqHKI3t+ZIpEYslOqodmJHixBTB0hXbOKSTbau
+BcvcwUpej6w9GU7C7WB1K9vBykLVAgMBAAGjYzBhMB8GA1UdIwQYMBaAFHKs5DN5qkWH9v2sHZ7W
+xy+G2CQ5MB0GA1UdDgQWBBRyrOQzeapFh/b9rB2e1scvhtgkOTAOBgNVHQ8BAf8EBAMCAQYwDwYD
+VR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAoDtZpwmUPjaE0n4vOaWWl/oRrfxn83EJ
+8rKJhGdEr7nv7ZbsnGTbMjBvZ5qsfl+yqwE2foH65IRe0qw24GtixX1LDoJt0nZi0f6X+J8wfBj5
+tFJ3gh1229MdqfDBmgC9bXXYfef6xzijnHDoRnkDry5023X4blMMA8iZGok1GTzTyVR8qPAs5m4H
+eW9q4ebqkYJpCh3DflminmtGFZhb069GHWLIzoBSSRE/yQQSwxN8PzuKlts8oB4KtItUsiRnDe+C
+y748fdHif64W1lZYudogsYMVoe+KTTJvQS8TUoKU1xrBeKJR3Stwbbca+few4GeXVtt8YVMJAygC
+QMez2P2ccGrGKMOF6eLtGpOg3kuYooQ+BXcBlj37tCAPnHICehIv1aO6UXivKitEZU61/Qrowc15
+h2Er3oBXRb9n8ZuRXqWk7FlIEA04x7D6w0RtBPV4UBySllva9bguulvP5fBqnUsvWHMtTy3EHD70
+sz+rFQ47GUGKpMFXEmZxTPpT41frYpUJnlTd0cI8Vzy9OK2YZLe4A5pTVmBds9hCG1xLEooc6+t9
+xnppxyd/pPiL8uSUZodL6ZQHCRJ5irLrdATczvREWeAWysUsWNc8e89ihmpQfTU2Zqf7N+cox9jQ
+raVplI/owd8k+BsHMYeB2F326CjYSlKArBPuUBQemMc=
+-----END CERTIFICATE-----
+
+D-TRUST BR Root CA 1 2020
+=========================
+-----BEGIN CERTIFICATE-----
+MIIC2zCCAmCgAwIBAgIQfMmPK4TX3+oPyWWa00tNljAKBggqhkjOPQQDAzBIMQswCQYDVQQGEwJE
+RTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEJSIFJvb3QgQ0EgMSAy
+MDIwMB4XDTIwMDIxMTA5NDUwMFoXDTM1MDIxMTA5NDQ1OVowSDELMAkGA1UEBhMCREUxFTATBgNV
+BAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBCUiBSb290IENBIDEgMjAyMDB2MBAG
+ByqGSM49AgEGBSuBBAAiA2IABMbLxyjR+4T1mu9CFCDhQ2tuda38KwOE1HaTJddZO0Flax7mNCq7
+dPYSzuht56vkPE4/RAiLzRZxy7+SmfSk1zxQVFKQhYN4lGdnoxwJGT11NIXe7WB9xwy0QVK5buXu
+QqOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFHOREKv/VbNafAkl1bK6CKBrqx9t
+MA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6gPKA6hjhodHRwOi8vY3JsLmQtdHJ1c3Qu
+bmV0L2NybC9kLXRydXN0X2JyX3Jvb3RfY2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVj
+dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwQlIlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxP
+PUQtVHJ1c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjOPQQD
+AwNpADBmAjEAlJAtE/rhY/hhY+ithXhUkZy4kzg+GkHaQBZTQgjKL47xPoFWwKrY7RjEsK70Pvom
+AjEA8yjixtsrmfu3Ubgko6SUeho/5jbiA1czijDLgsfWFBHVdWNbFJWcHwHP2NVypw87
+-----END CERTIFICATE-----
+
+D-TRUST EV Root CA 1 2020
+=========================
+-----BEGIN CERTIFICATE-----
+MIIC2zCCAmCgAwIBAgIQXwJB13qHfEwDo6yWjfv/0DAKBggqhkjOPQQDAzBIMQswCQYDVQQGEwJE
+RTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEVWIFJvb3QgQ0EgMSAy
+MDIwMB4XDTIwMDIxMTEwMDAwMFoXDTM1MDIxMTA5NTk1OVowSDELMAkGA1UEBhMCREUxFTATBgNV
+BAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBFViBSb290IENBIDEgMjAyMDB2MBAG
+ByqGSM49AgEGBSuBBAAiA2IABPEL3YZDIBnfl4XoIkqbz52Yv7QFJsnL46bSj8WeeHsxiamJrSc8
+ZRCC/N/DnU7wMyPE0jL1HLDfMxddxfCxivnvubcUyilKwg+pf3VlSSowZ/Rk99Yad9rDwpdhQntJ
+raOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFH8QARY3OqQo5FD4pPfsazK2/umL
+MA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6gPKA6hjhodHRwOi8vY3JsLmQtdHJ1c3Qu
+bmV0L2NybC9kLXRydXN0X2V2X3Jvb3RfY2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVj
+dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwRVYlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxP
+PUQtVHJ1c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjOPQQD
+AwNpADBmAjEAyjzGKnXCXnViOTYAYFqLwZOZzNnbQTs7h5kXO9XMT8oi96CAy/m0sRtW9XLS/BnR
+AjEAkfcwkz8QRitxpNA7RJvAKQIFskF3UfN5Wp6OFKBOQtJbgfM0agPnIjhQW+0ZT0MW
+-----END CERTIFICATE-----
+
+DigiCert TLS ECC P384 Root G5
+=============================
+-----BEGIN CERTIFICATE-----
+MIICGTCCAZ+gAwIBAgIQCeCTZaz32ci5PhwLBCou8zAKBggqhkjOPQQDAzBOMQswCQYDVQQGEwJV
+UzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJjAkBgNVBAMTHURpZ2lDZXJ0IFRMUyBFQ0MgUDM4
+NCBSb290IEc1MB4XDTIxMDExNTAwMDAwMFoXDTQ2MDExNDIzNTk1OVowTjELMAkGA1UEBhMCVVMx
+FzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMSYwJAYDVQQDEx1EaWdpQ2VydCBUTFMgRUNDIFAzODQg
+Um9vdCBHNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABMFEoc8Rl1Ca3iOCNQfN0MsYndLxf3c1Tzvd
+lHJS7cI7+Oz6e2tYIOyZrsn8aLN1udsJ7MgT9U7GCh1mMEy7H0cKPGEQQil8pQgO4CLp0zVozptj
+n4S1mU1YoI71VOeVyaNCMEAwHQYDVR0OBBYEFMFRRVBZqz7nLFr6ICISB4CIfBFqMA4GA1UdDwEB
+/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQCJao1H5+z8blUD2Wds
+Jk6Dxv3J+ysTvLd6jLRl0mlpYxNjOyZQLgGheQaRnUi/wr4CMEfDFXuxoJGZSZOoPHzoRgaLLPIx
+AJSdYsiJvRmEFOml+wG4DXZDjC5Ty3zfDBeWUA==
+-----END CERTIFICATE-----
+
+DigiCert TLS RSA4096 Root G5
+============================
+-----BEGIN CERTIFICATE-----
+MIIFZjCCA06gAwIBAgIQCPm0eKj6ftpqMzeJ3nzPijANBgkqhkiG9w0BAQwFADBNMQswCQYDVQQG
+EwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0
+MDk2IFJvb3QgRzUwHhcNMjEwMTE1MDAwMDAwWhcNNDYwMTE0MjM1OTU5WjBNMQswCQYDVQQGEwJV
+UzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0MDk2
+IFJvb3QgRzUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz0PTJeRGd/fxmgefM1eS8
+7IE+ajWOLrfn3q/5B03PMJ3qCQuZvWxX2hhKuHisOjmopkisLnLlvevxGs3npAOpPxG02C+JFvuU
+AT27L/gTBaF4HI4o4EXgg/RZG5Wzrn4DReW+wkL+7vI8toUTmDKdFqgpwgscONyfMXdcvyej/Ces
+tyu9dJsXLfKB2l2w4SMXPohKEiPQ6s+d3gMXsUJKoBZMpG2T6T867jp8nVid9E6P/DsjyG244gXa
+zOvswzH016cpVIDPRFtMbzCe88zdH5RDnU1/cHAN1DrRN/BsnZvAFJNY781BOHW8EwOVfH/jXOnV
+DdXifBBiqmvwPXbzP6PosMH976pXTayGpxi0KcEsDr9kvimM2AItzVwv8n/vFfQMFawKsPHTDU9q
+TXeXAaDxZre3zu/O7Oyldcqs4+Fj97ihBMi8ez9dLRYiVu1ISf6nL3kwJZu6ay0/nTvEF+cdLvvy
+z6b84xQslpghjLSR6Rlgg/IwKwZzUNWYOwbpx4oMYIwo+FKbbuH2TbsGJJvXKyY//SovcfXWJL5/
+MZ4PbeiPT02jP/816t9JXkGPhvnxd3lLG7SjXi/7RgLQZhNeXoVPzthwiHvOAbWWl9fNff2C+MIk
+wcoBOU+NosEUQB+cZtUMCUbW8tDRSHZWOkPLtgoRObqME2wGtZ7P6wIDAQABo0IwQDAdBgNVHQ4E
+FgQUUTMc7TZArxfTJc1paPKvTiM+s0EwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8w
+DQYJKoZIhvcNAQEMBQADggIBAGCmr1tfV9qJ20tQqcQjNSH/0GEwhJG3PxDPJY7Jv0Y02cEhJhxw
+GXIeo8mH/qlDZJY6yFMECrZBu8RHANmfGBg7sg7zNOok992vIGCukihfNudd5N7HPNtQOa27PShN
+lnx2xlv0wdsUpasZYgcYQF+Xkdycx6u1UQ3maVNVzDl92sURVXLFO4uJ+DQtpBflF+aZfTCIITfN
+MBc9uPK8qHWgQ9w+iUuQrm0D4ByjoJYJu32jtyoQREtGBzRj7TG5BO6jm5qu5jF49OokYTurWGT/
+u4cnYiWB39yhL/btp/96j1EuMPikAdKFOV8BmZZvWltwGUb+hmA+rYAQCd05JS9Yf7vSdPD3Rh9G
+OUrYU9DzLjtxpdRv/PNn5AeP3SYZ4Y1b+qOTEZvpyDrDVWiakuFSdjjo4bq9+0/V77PnSIMx8IIh
+47a+p6tv75/fTM8BuGJqIz3nCU2AG3swpMPdB380vqQmsvZB6Akd4yCYqjdP//fx4ilwMUc/dNAU
+FvohigLVigmUdy7yWSiLfFCSCmZ4OIN1xLVaqBHG5cGdZlXPU8Sv13WFqUITVuwhd4GTWgzqltlJ
+yqEI8pc7bZsEGCREjnwB8twl2F6GmrE52/WRMmrRpnCKovfepEWFJqgejF0pW8hL2JpqA15w8oVP
+bEtoL8pU9ozaMv7Da4M/OMZ+
+-----END CERTIFICATE-----
+
+Certainly Root R1
+=================
+-----BEGIN CERTIFICATE-----
+MIIFRzCCAy+gAwIBAgIRAI4P+UuQcWhlM1T01EQ5t+AwDQYJKoZIhvcNAQELBQAwPTELMAkGA1UE
+BhMCVVMxEjAQBgNVBAoTCUNlcnRhaW5seTEaMBgGA1UEAxMRQ2VydGFpbmx5IFJvb3QgUjEwHhcN
+MjEwNDAxMDAwMDAwWhcNNDYwNDAxMDAwMDAwWjA9MQswCQYDVQQGEwJVUzESMBAGA1UEChMJQ2Vy
+dGFpbmx5MRowGAYDVQQDExFDZXJ0YWlubHkgUm9vdCBSMTCCAiIwDQYJKoZIhvcNAQEBBQADggIP
+ADCCAgoCggIBANA21B/q3avk0bbm+yLA3RMNansiExyXPGhjZjKcA7WNpIGD2ngwEc/csiu+kr+O
+5MQTvqRoTNoCaBZ0vrLdBORrKt03H2As2/X3oXyVtwxwhi7xOu9S98zTm/mLvg7fMbedaFySpvXl
+8wo0tf97ouSHocavFwDvA5HtqRxOcT3Si2yJ9HiG5mpJoM610rCrm/b01C7jcvk2xusVtyWMOvwl
+DbMicyF0yEqWYZL1LwsYpfSt4u5BvQF5+paMjRcCMLT5r3gajLQ2EBAHBXDQ9DGQilHFhiZ5shGI
+XsXwClTNSaa/ApzSRKft43jvRl5tcdF5cBxGX1HpyTfcX35pe0HfNEXgO4T0oYoKNp43zGJS4YkN
+KPl6I7ENPT2a/Z2B7yyQwHtETrtJ4A5KVpK8y7XdeReJkd5hiXSSqOMyhb5OhaRLWcsrxXiOcVTQ
+AjeZjOVJ6uBUcqQRBi8LjMFbvrWhsFNunLhgkR9Za/kt9JQKl7XsxXYDVBtlUrpMklZRNaBA2Cnb
+rlJ2Oy0wQJuK0EJWtLeIAaSHO1OWzaMWj/Nmqhexx2DgwUMFDO6bW2BvBlyHWyf5QBGenDPBt+U1
+VwV/J84XIIwc/PH72jEpSe31C4SnT8H2TsIonPru4K8H+zMReiFPCyEQtkA6qyI6BJyLm4SGcprS
+p6XEtHWRqSsjAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud
+DgQWBBTgqj8ljZ9EXME66C6ud0yEPmcM9DANBgkqhkiG9w0BAQsFAAOCAgEAuVevuBLaV4OPaAsz
+HQNTVfSVcOQrPbA56/qJYv331hgELyE03fFo8NWWWt7CgKPBjcZq91l3rhVkz1t5BXdm6ozTaw3d
+8VkswTOlMIAVRQdFGjEitpIAq5lNOo93r6kiyi9jyhXWx8bwPWz8HA2YEGGeEaIi1wrykXprOQ4v
+MMM2SZ/g6Q8CRFA3lFV96p/2O7qUpUzpvD5RtOjKkjZUbVwlKNrdrRT90+7iIgXr0PK3aBLXWopB
+GsaSpVo7Y0VPv+E6dyIvXL9G+VoDhRNCX8reU9ditaY1BMJH/5n9hN9czulegChB8n3nHpDYT3Y+
+gjwN/KUD+nsa2UUeYNrEjvn8K8l7lcUq/6qJ34IxD3L/DCfXCh5WAFAeDJDBlrXYFIW7pw0WwfgH
+JBu6haEaBQmAupVjyTrsJZ9/nbqkRxWbRHDxakvWOF5D8xh+UG7pWijmZeZ3Gzr9Hb4DJqPb1OG7
+fpYnKx3upPvaJVQTA945xsMfTZDsjxtK0hzthZU4UHlG1sGQUDGpXJpuHfUzVounmdLyyCwzk5Iw
+x06MZTMQZBf9JBeW0Y3COmor6xOLRPIh80oat3df1+2IpHLlOR+Vnb5nwXARPbv0+Em34yaXOp/S
+X3z7wJl8OSngex2/DaeP0ik0biQVy96QXr8axGbqwua6OV+KmalBWQewLK8=
+-----END CERTIFICATE-----
+
+Certainly Root E1
+=================
+-----BEGIN CERTIFICATE-----
+MIIB9zCCAX2gAwIBAgIQBiUzsUcDMydc+Y2aub/M+DAKBggqhkjOPQQDAzA9MQswCQYDVQQGEwJV
+UzESMBAGA1UEChMJQ2VydGFpbmx5MRowGAYDVQQDExFDZXJ0YWlubHkgUm9vdCBFMTAeFw0yMTA0
+MDEwMDAwMDBaFw00NjA0MDEwMDAwMDBaMD0xCzAJBgNVBAYTAlVTMRIwEAYDVQQKEwlDZXJ0YWlu
+bHkxGjAYBgNVBAMTEUNlcnRhaW5seSBSb290IEUxMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE3m/4
+fxzf7flHh4axpMCK+IKXgOqPyEpeKn2IaKcBYhSRJHpcnqMXfYqGITQYUBsQ3tA3SybHGWCA6TS9
+YBk2QNYphwk8kXr2vBMj3VlOBF7PyAIcGFPBMdjaIOlEjeR2o0IwQDAOBgNVHQ8BAf8EBAMCAQYw
+DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ygYy2R17ikq6+2uI1g4hevIIgcwCgYIKoZIzj0E
+AwMDaAAwZQIxALGOWiDDshliTd6wT99u0nCK8Z9+aozmut6Dacpps6kFtZaSF4fC0urQe87YQVt8
+rgIwRt7qy12a7DLCZRawTDBcMPPaTnOGBtjOiQRINzf43TNRnXCve1XYAS59BWQOhriR
+-----END CERTIFICATE-----
+
+Security Communication ECC RootCA1
+==================================
+-----BEGIN CERTIFICATE-----
+MIICODCCAb6gAwIBAgIJANZdm7N4gS7rMAoGCCqGSM49BAMDMGExCzAJBgNVBAYTAkpQMSUwIwYD
+VQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMSswKQYDVQQDEyJTZWN1cml0eSBDb21t
+dW5pY2F0aW9uIEVDQyBSb290Q0ExMB4XDTE2MDYxNjA1MTUyOFoXDTM4MDExODA1MTUyOFowYTEL
+MAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKzApBgNV
+BAMTIlNlY3VyaXR5IENvbW11bmljYXRpb24gRUNDIFJvb3RDQTEwdjAQBgcqhkjOPQIBBgUrgQQA
+IgNiAASkpW9gAwPDvTH00xecK4R1rOX9PVdu12O/5gSJko6BnOPpR27KkBLIE+CnnfdldB9sELLo
+5OnvbYUymUSxXv3MdhDYW72ixvnWQuRXdtyQwjWpS4g8EkdtXP9JTxpKULGjQjBAMB0GA1UdDgQW
+BBSGHOf+LaVKiwj+KBH6vqNm+GBZLzAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAK
+BggqhkjOPQQDAwNoADBlAjAVXUI9/Lbu9zuxNuie9sRGKEkz0FhDKmMpzE2xtHqiuQ04pV1IKv3L
+snNdo4gIxwwCMQDAqy0Obe0YottT6SXbVQjgUMzfRGEWgqtJsLKB7HOHeLRMsmIbEvoWTSVLY70e
+N9k=
+-----END CERTIFICATE-----
+
+BJCA Global Root CA1
+====================
+-----BEGIN CERTIFICATE-----
+MIIFdDCCA1ygAwIBAgIQVW9l47TZkGobCdFsPsBsIDANBgkqhkiG9w0BAQsFADBUMQswCQYDVQQG
+EwJDTjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRIT1JJVFkxHTAbBgNVBAMMFEJK
+Q0EgR2xvYmFsIFJvb3QgQ0ExMB4XDTE5MTIxOTAzMTYxN1oXDTQ0MTIxMjAzMTYxN1owVDELMAkG
+A1UEBhMCQ04xJjAkBgNVBAoMHUJFSUpJTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQD
+DBRCSkNBIEdsb2JhbCBSb290IENBMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAPFm
+CL3ZxRVhy4QEQaVpN3cdwbB7+sN3SJATcmTRuHyQNZ0YeYjjlwE8R4HyDqKYDZ4/N+AZspDyRhyS
+sTphzvq3Rp4Dhtczbu33RYx2N95ulpH3134rhxfVizXuhJFyV9xgw8O558dnJCNPYwpj9mZ9S1Wn
+P3hkSWkSl+BMDdMJoDIwOvqfwPKcxRIqLhy1BDPapDgRat7GGPZHOiJBhyL8xIkoVNiMpTAK+BcW
+yqw3/XmnkRd4OJmtWO2y3syJfQOcs4ll5+M7sSKGjwZteAf9kRJ/sGsciQ35uMt0WwfCyPQ10WRj
+eulumijWML3mG90Vr4TqnMfK9Q7q8l0ph49pczm+LiRvRSGsxdRpJQaDrXpIhRMsDQa4bHlW/KNn
+MoH1V6XKV0Jp6VwkYe/iMBhORJhVb3rCk9gZtt58R4oRTklH2yiUAguUSiz5EtBP6DF+bHq/pj+b
+OT0CFqMYs2esWz8sgytnOYFcuX6U1WTdno9uruh8W7TXakdI136z1C2OVnZOz2nxbkRs1CTqjSSh
+GL+9V/6pmTW12xB3uD1IutbB5/EjPtffhZ0nPNRAvQoMvfXnjSXWgXSHRtQpdaJCbPdzied9v3pK
+H9MiyRVVz99vfFXQpIsHETdfg6YmV6YBW37+WGgHqel62bno/1Afq8K0wM7o6v0PvY1NuLxxAgMB
+AAGjQjBAMB0GA1UdDgQWBBTF7+3M2I0hxkjk49cULqcWk+WYATAPBgNVHRMBAf8EBTADAQH/MA4G
+A1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAUoKsITQfI/Ki2Pm4rzc2IInRNwPWaZ+4
+YRC6ojGYWUfo0Q0lHhVBDOAqVdVXUsv45Mdpox1NcQJeXyFFYEhcCY5JEMEE3KliawLwQ8hOnThJ
+dMkycFRtwUf8jrQ2ntScvd0g1lPJGKm1Vrl2i5VnZu69mP6u775u+2D2/VnGKhs/I0qUJDAnyIm8
+60Qkmss9vk/Ves6OF8tiwdneHg56/0OGNFK8YT88X7vZdrRTvJez/opMEi4r89fO4aL/3Xtw+zuh
+TaRjAv04l5U/BXCga99igUOLtFkNSoxUnMW7gZ/NfaXvCyUeOiDbHPwfmGcCCtRzRBPbUYQaVQNW
+4AB+dAb/OMRyHdOoP2gxXdMJxy6MW2Pg6Nwe0uxhHvLe5e/2mXZgLR6UcnHGCyoyx5JO1UbXHfmp
+GQrI+pXObSOYqgs4rZpWDW+N8TEAiMEXnM0ZNjX+VVOg4DwzX5Ze4jLp3zO7Bkqp2IRzznfSxqxx
+4VyjHQy7Ct9f4qNx2No3WqB4K/TUfet27fJhcKVlmtOJNBir+3I+17Q9eVzYH6Eze9mCUAyTF6ps
+3MKCuwJXNq+YJyo5UOGwifUll35HaBC07HPKs5fRJNz2YqAo07WjuGS3iGJCz51TzZm+ZGiPTx4S
+SPfSKcOYKMryMguTjClPPGAyzQWWYezyr/6zcCwupvI=
+-----END CERTIFICATE-----
+
+BJCA Global Root CA2
+====================
+-----BEGIN CERTIFICATE-----
+MIICJTCCAaugAwIBAgIQLBcIfWQqwP6FGFkGz7RK6zAKBggqhkjOPQQDAzBUMQswCQYDVQQGEwJD
+TjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRIT1JJVFkxHTAbBgNVBAMMFEJKQ0Eg
+R2xvYmFsIFJvb3QgQ0EyMB4XDTE5MTIxOTAzMTgyMVoXDTQ0MTIxMjAzMTgyMVowVDELMAkGA1UE
+BhMCQ04xJjAkBgNVBAoMHUJFSUpJTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQDDBRC
+SkNBIEdsb2JhbCBSb290IENBMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABJ3LgJGNU2e1uVCxA/jl
+SR9BIgmwUVJY1is0j8USRhTFiy8shP8sbqjV8QnjAyEUxEM9fMEsxEtqSs3ph+B99iK++kpRuDCK
+/eHeGBIK9ke35xe/J4rUQUyWPGCWwf0VHKNCMEAwHQYDVR0OBBYEFNJKsVF/BvDRgh9Obl+rg/xI
+1LCRMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2gAMGUCMBq8
+W9f+qdJUDkpd0m2xQNz0Q9XSSpkZElaA94M04TVOSG0ED1cxMDAtsaqdAzjbBgIxAMvMh1PLet8g
+UXOQwKhbYdDFUDn9hf7B43j4ptZLvZuHjw/l1lOWqzzIQNph91Oj9w==
+-----END CERTIFICATE-----
+
+Sectigo Public Server Authentication Root E46
+=============================================
+-----BEGIN CERTIFICATE-----
+MIICOjCCAcGgAwIBAgIQQvLM2htpN0RfFf51KBC49DAKBggqhkjOPQQDAzBfMQswCQYDVQQGEwJH
+QjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1YmxpYyBTZXJ2
+ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwHhcNMjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1OTU5
+WjBfMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0
+aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwdjAQBgcqhkjOPQIBBgUr
+gQQAIgNiAAR2+pmpbiDt+dd34wc7qNs9Xzjoq1WmVk/WSOrsfy2qw7LFeeyZYX8QeccCWvkEN/U0
+NSt3zn8gj1KjAIns1aeibVvjS5KToID1AZTc8GgHHs3u/iVStSBDHBv+6xnOQ6OjQjBAMB0GA1Ud
+DgQWBBTRItpMWfFLXyY4qp3W7usNw/upYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB
+/zAKBggqhkjOPQQDAwNnADBkAjAn7qRaqCG76UeXlImldCBteU/IvZNeWBj7LRoAasm4PdCkT0RH
+lAFWovgzJQxC36oCMB3q4S6ILuH5px0CMk7yn2xVdOOurvulGu7t0vzCAxHrRVxgED1cf5kDW21U
+SAGKcw==
+-----END CERTIFICATE-----
+
+Sectigo Public Server Authentication Root R46
+=============================================
+-----BEGIN CERTIFICATE-----
+MIIFijCCA3KgAwIBAgIQdY39i658BwD6qSWn4cetFDANBgkqhkiG9w0BAQwFADBfMQswCQYDVQQG
+EwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1YmxpYyBT
+ZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYwHhcNMjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1
+OTU5WjBfMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1T
+ZWN0aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYwggIiMA0GCSqGSIb3
+DQEBAQUAA4ICDwAwggIKAoICAQCTvtU2UnXYASOgHEdCSe5jtrch/cSV1UgrJnwUUxDaef0rty2k
+1Cz66jLdScK5vQ9IPXtamFSvnl0xdE8H/FAh3aTPaE8bEmNtJZlMKpnzSDBh+oF8HqcIStw+Kxwf
+GExxqjWMrfhu6DtK2eWUAtaJhBOqbchPM8xQljeSM9xfiOefVNlI8JhD1mb9nxc4Q8UBUQvX4yMP
+FF1bFOdLvt30yNoDN9HWOaEhUTCDsG3XME6WW5HwcCSrv0WBZEMNvSE6Lzzpng3LILVCJ8zab5vu
+ZDCQOc2TZYEhMbUjUDM3IuM47fgxMMxF/mL50V0yeUKH32rMVhlATc6qu/m1dkmU8Sf4kaWD5Qaz
+Yw6A3OASVYCmO2a0OYctyPDQ0RTp5A1NDvZdV3LFOxxHVp3i1fuBYYzMTYCQNFu31xR13NgESJ/A
+wSiItOkcyqex8Va3e0lMWeUgFaiEAin6OJRpmkkGj80feRQXEgyDet4fsZfu+Zd4KKTIRJLpfSYF
+plhym3kT2BFfrsU4YjRosoYwjviQYZ4ybPUHNs2iTG7sijbt8uaZFURww3y8nDnAtOFr94MlI1fZ
+EoDlSfB1D++N6xybVCi0ITz8fAr/73trdf+LHaAZBav6+CuBQug4urv7qv094PPK306Xlynt8xhW
+6aWWrL3DkJiy4Pmi1KZHQ3xtzwIDAQABo0IwQDAdBgNVHQ4EFgQUVnNYZJX5khqwEioEYnmhQBWI
+IUkwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAC9c
+mTz8Bl6MlC5w6tIyMY208FHVvArzZJ8HXtXBc2hkeqK5Duj5XYUtqDdFqij0lgVQYKlJfp/imTYp
+E0RHap1VIDzYm/EDMrraQKFz6oOht0SmDpkBm+S8f74TlH7Kph52gDY9hAaLMyZlbcp+nv4fjFg4
+exqDsQ+8FxG75gbMY/qB8oFM2gsQa6H61SilzwZAFv97fRheORKkU55+MkIQpiGRqRxOF3yEvJ+M
+0ejf5lG5Nkc/kLnHvALcWxxPDkjBJYOcCj+esQMzEhonrPcibCTRAUH4WAP+JWgiH5paPHxsnnVI
+84HxZmduTILA7rpXDhjvLpr3Etiga+kFpaHpaPi8TD8SHkXoUsCjvxInebnMMTzD9joiFgOgyY9m
+pFuiTdaBJQbpdqQACj7LzTWb4OE4y2BThihCQRxEV+ioratF4yUQvNs+ZUH7G6aXD+u5dHn5Hrwd
+Vw1Hr8Mvn4dGp+smWg9WY7ViYG4A++MnESLn/pmPNPW56MORcr3Ywx65LvKRRFHQV80MNNVIIb/b
+E/FmJUNS0nAiNs2fxBx1IK1jcmMGDw4nztJqDby1ORrp0XZ60Vzk50lJLVU3aPAaOpg+VBeHVOmm
+J1CJeyAvP/+/oYtKR5j/K3tJPsMpRmAYQqszKbrAKbkTidOIijlBO8n9pu0f9GBj39ItVQGL
+-----END CERTIFICATE-----
+
+SSL.com TLS RSA Root CA 2022
+============================
+-----BEGIN CERTIFICATE-----
+MIIFiTCCA3GgAwIBAgIQb77arXO9CEDii02+1PdbkTANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQG
+EwJVUzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQDDBxTU0wuY29tIFRMUyBSU0Eg
+Um9vdCBDQSAyMDIyMB4XDTIyMDgyNTE2MzQyMloXDTQ2MDgxOTE2MzQyMVowTjELMAkGA1UEBhMC
+VVMxGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgUlNBIFJv
+b3QgQ0EgMjAyMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANCkCXJPQIgSYT41I57u
+9nTPL3tYPc48DRAokC+X94xI2KDYJbFMsBFMF3NQ0CJKY7uB0ylu1bUJPiYYf7ISf5OYt6/wNr/y
+7hienDtSxUcZXXTzZGbVXcdotL8bHAajvI9AI7YexoS9UcQbOcGV0insS657Lb85/bRi3pZ7Qcac
+oOAGcvvwB5cJOYF0r/c0WRFXCsJbwST0MXMwgsadugL3PnxEX4MN8/HdIGkWCVDi1FW24IBydm5M
+R7d1VVm0U3TZlMZBrViKMWYPHqIbKUBOL9975hYsLfy/7PO0+r4Y9ptJ1O4Fbtk085zx7AGL0SDG
+D6C1vBdOSHtRwvzpXGk3R2azaPgVKPC506QVzFpPulJwoxJF3ca6TvvC0PeoUidtbnm1jPx7jMEW
+TO6Af77wdr5BUxIzrlo4QqvXDz5BjXYHMtWrifZOZ9mxQnUjbvPNQrL8VfVThxc7wDNY8VLS+YCk
+8OjwO4s4zKTGkH8PnP2L0aPP2oOnaclQNtVcBdIKQXTbYxE3waWglksejBYSd66UNHsef8JmAOSq
+g+qKkK3ONkRN0VHpvB/zagX9wHQfJRlAUW7qglFA35u5CCoGAtUjHBPW6dvbxrB6y3snm/vg1UYk
+7RBLY0ulBY+6uB0rpvqR4pJSvezrZ5dtmi2fgTIFZzL7SAg/2SW4BCUvAgMBAAGjYzBhMA8GA1Ud
+EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU+y437uOEeicuzRk1sTN8/9REQrkwHQYDVR0OBBYEFPsu
+N+7jhHonLs0ZNbEzfP/UREK5MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAjYlt
+hEUY8U+zoO9opMAdrDC8Z2awms22qyIZZtM7QbUQnRC6cm4pJCAcAZli05bg4vsMQtfhWsSWTVTN
+j8pDU/0quOr4ZcoBwq1gaAafORpR2eCNJvkLTqVTJXojpBzOCBvfR4iyrT7gJ4eLSYwfqUdYe5by
+iB0YrrPRpgqU+tvT5TgKa3kSM/tKWTcWQA673vWJDPFs0/dRa1419dvAJuoSc06pkZCmF8NsLzjU
+o3KUQyxi4U5cMj29TH0ZR6LDSeeWP4+a0zvkEdiLA9z2tmBVGKaBUfPhqBVq6+AL8BQx1rmMRTqo
+ENjwuSfr98t67wVylrXEj5ZzxOhWc5y8aVFjvO9nHEMaX3cZHxj4HCUp+UmZKbaSPaKDN7Egkaib
+MOlqbLQjk2UEqxHzDh1TJElTHaE/nUiSEeJ9DU/1172iWD54nR4fK/4huxoTtrEoZP2wAgDHbICi
+vRZQIA9ygV/MlP+7mea6kMvq+cYMwq7FGc4zoWtcu358NFcXrfA/rs3qr5nsLFR+jM4uElZI7xc7
+P0peYNLcdDa8pUNjyw9bowJWCZ4kLOGGgYz+qxcs+sjiMho6/4UIyYOf8kpIEFR3N+2ivEC+5BB0
+9+Rbu7nzifmPQdjH5FCQNYA+HLhNkNPU98OwoX6EyneSMSy4kLGCenROmxMmtNVQZlR4rmA=
+-----END CERTIFICATE-----
+
+SSL.com TLS ECC Root CA 2022
+============================
+-----BEGIN CERTIFICATE-----
+MIICOjCCAcCgAwIBAgIQFAP1q/s3ixdAW+JDsqXRxDAKBggqhkjOPQQDAzBOMQswCQYDVQQGEwJV
+UzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQDDBxTU0wuY29tIFRMUyBFQ0MgUm9v
+dCBDQSAyMDIyMB4XDTIyMDgyNTE2MzM0OFoXDTQ2MDgxOTE2MzM0N1owTjELMAkGA1UEBhMCVVMx
+GDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgRUNDIFJvb3Qg
+Q0EgMjAyMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABEUpNXP6wrgjzhR9qLFNoFs27iosU8NgCTWy
+JGYmacCzldZdkkAZDsalE3D07xJRKF3nzL35PIXBz5SQySvOkkJYWWf9lCcQZIxPBLFNSeR7T5v1
+5wj4A4j3p8OSSxlUgaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBSJjy+j6CugFFR7
+81a4Jl9nOAuc0DAdBgNVHQ4EFgQUiY8vo+groBRUe/NWuCZfZzgLnNAwDgYDVR0PAQH/BAQDAgGG
+MAoGCCqGSM49BAMDA2gAMGUCMFXjIlbp15IkWE8elDIPDAI2wv2sdDJO4fscgIijzPvX6yv/N33w
+7deedWo1dlJF4AIxAMeNb0Igj762TVntd00pxCAgRWSGOlDGxK0tk/UYfXLtqc/ErFc2KAhl3zx5
+Zn6g6g==
+-----END CERTIFICATE-----
+
+Atos TrustedRoot Root CA ECC TLS 2021
+=====================================
+-----BEGIN CERTIFICATE-----
+MIICFTCCAZugAwIBAgIQPZg7pmY9kGP3fiZXOATvADAKBggqhkjOPQQDAzBMMS4wLAYDVQQDDCVB
+dG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgRUNDIFRMUyAyMDIxMQ0wCwYDVQQKDARBdG9zMQswCQYD
+VQQGEwJERTAeFw0yMTA0MjIwOTI2MjNaFw00MTA0MTcwOTI2MjJaMEwxLjAsBgNVBAMMJUF0b3Mg
+VHJ1c3RlZFJvb3QgUm9vdCBDQSBFQ0MgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNVBAYT
+AkRFMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEloZYKDcKZ9Cg3iQZGeHkBQcfl+3oZIK59sRxUM6K
+DP/XtXa7oWyTbIOiaG6l2b4siJVBzV3dscqDY4PMwL502eCdpO5KTlbgmClBk1IQ1SQ4AjJn8ZQS
+b+/Xxd4u/RmAo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR2KCXWfeBmmnoJsmo7jjPX
+NtNPojAOBgNVHQ8BAf8EBAMCAYYwCgYIKoZIzj0EAwMDaAAwZQIwW5kp85wxtolrbNa9d+F851F+
+uDrNozZffPc8dz7kUK2o59JZDCaOMDtuCCrCp1rIAjEAmeMM56PDr9NJLkaCI2ZdyQAUEv049OGY
+a3cpetskz2VAv9LcjBHo9H1/IISpQuQo
+-----END CERTIFICATE-----
+
+Atos TrustedRoot Root CA RSA TLS 2021
+=====================================
+-----BEGIN CERTIFICATE-----
+MIIFZDCCA0ygAwIBAgIQU9XP5hmTC/srBRLYwiqipDANBgkqhkiG9w0BAQwFADBMMS4wLAYDVQQD
+DCVBdG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgUlNBIFRMUyAyMDIxMQ0wCwYDVQQKDARBdG9zMQsw
+CQYDVQQGEwJERTAeFw0yMTA0MjIwOTIxMTBaFw00MTA0MTcwOTIxMDlaMEwxLjAsBgNVBAMMJUF0
+b3MgVHJ1c3RlZFJvb3QgUm9vdCBDQSBSU0EgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNV
+BAYTAkRFMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtoAOxHm9BYx9sKOdTSJNy/BB
+l01Z4NH+VoyX8te9j2y3I49f1cTYQcvyAh5x5en2XssIKl4w8i1mx4QbZFc4nXUtVsYvYe+W/CBG
+vevUez8/fEc4BKkbqlLfEzfTFRVOvV98r61jx3ncCHvVoOX3W3WsgFWZkmGbzSoXfduP9LVq6hdK
+ZChmFSlsAvFr1bqjM9xaZ6cF4r9lthawEO3NUDPJcFDsGY6wx/J0W2tExn2WuZgIWWbeKQGb9Cpt
+0xU6kGpn8bRrZtkh68rZYnxGEFzedUlnnkL5/nWpo63/dgpnQOPF943HhZpZnmKaau1Fh5hnstVK
+PNe0OwANwI8f4UDErmwh3El+fsqyjW22v5MvoVw+j8rtgI5Y4dtXz4U2OLJxpAmMkokIiEjxQGMY
+sluMWuPD0xeqqxmjLBvk1cbiZnrXghmmOxYsL3GHX0WelXOTwkKBIROW1527k2gV+p2kHYzygeBY
+Br3JtuP2iV2J+axEoctr+hbxx1A9JNr3w+SH1VbxT5Aw+kUJWdo0zuATHAR8ANSbhqRAvNncTFd+
+rrcztl524WWLZt+NyteYr842mIycg5kDcPOvdO3GDjbnvezBc6eUWsuSZIKmAMFwoW4sKeFYV+xa
+fJlrJaSQOoD0IJ2azsct+bJLKZWD6TWNp0lIpw9MGZHQ9b8Q4HECAwEAAaNCMEAwDwYDVR0TAQH/
+BAUwAwEB/zAdBgNVHQ4EFgQUdEmZ0f+0emhFdcN+tNzMzjkz2ggwDgYDVR0PAQH/BAQDAgGGMA0G
+CSqGSIb3DQEBDAUAA4ICAQAjQ1MkYlxt/T7Cz1UAbMVWiLkO3TriJQ2VSpfKgInuKs1l+NsW4AmS
+4BjHeJi78+xCUvuppILXTdiK/ORO/auQxDh1MoSf/7OwKwIzNsAQkG8dnK/haZPso0UvFJ/1TCpl
+Q3IM98P4lYsU84UgYt1UU90s3BiVaU+DR3BAM1h3Egyi61IxHkzJqM7F78PRreBrAwA0JrRUITWX
+AdxfG/F851X6LWh3e9NpzNMOa7pNdkTWwhWaJuywxfW70Xp0wmzNxbVe9kzmWy2B27O3Opee7c9G
+slA9hGCZcbUztVdF5kJHdWoOsAgMrr3e97sPWD2PAzHoPYJQyi9eDF20l74gNAf0xBLh7tew2Vkt
+afcxBPTy+av5EzH4AXcOPUIjJsyacmdRIXrMPIWo6iFqO9taPKU0nprALN+AnCng33eU0aKAQv9q
+TFsR0PXNor6uzFFcw9VUewyu1rkGd4Di7wcaaMxZUa1+XGdrudviB0JbuAEFWDlN5LuYo7Ey7Nmj
+1m+UI/87tyll5gfp77YZ6ufCOB0yiJA8EytuzO+rdwY0d4RPcuSBhPm5dDTedk+SKlOxJTnbPP/l
+PqYO5Wue/9vsL3SD3460s6neFE3/MaNFcyT6lSnMEpcEoji2jbDwN/zIIX8/syQbPYtuzE2wFg2W
+HYMfRsCbvUOZ58SWLs5fyQ==
+-----END CERTIFICATE-----
+
+TrustAsia Global Root CA G3
+===========================
+-----BEGIN CERTIFICATE-----
+MIIFpTCCA42gAwIBAgIUZPYOZXdhaqs7tOqFhLuxibhxkw8wDQYJKoZIhvcNAQEMBQAwWjELMAkG
+A1UEBhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dpZXMsIEluYy4xJDAiBgNVBAMM
+G1RydXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHMzAeFw0yMTA1MjAwMjEwMTlaFw00NjA1MTkwMjEw
+MTlaMFoxCzAJBgNVBAYTAkNOMSUwIwYDVQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMu
+MSQwIgYDVQQDDBtUcnVzdEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzMwggIiMA0GCSqGSIb3DQEBAQUA
+A4ICDwAwggIKAoICAQDAMYJhkuSUGwoqZdC+BqmHO1ES6nBBruL7dOoKjbmzTNyPtxNST1QY4Sxz
+lZHFZjtqz6xjbYdT8PfxObegQ2OwxANdV6nnRM7EoYNl9lA+sX4WuDqKAtCWHwDNBSHvBm3dIZwZ
+Q0WhxeiAysKtQGIXBsaqvPPW5vxQfmZCHzyLpnl5hkA1nyDvP+uLRx+PjsXUjrYsyUQE49RDdT/V
+P68czH5GX6zfZBCK70bwkPAPLfSIC7Epqq+FqklYqL9joDiR5rPmd2jE+SoZhLsO4fWvieylL1Ag
+dB4SQXMeJNnKziyhWTXAyB1GJ2Faj/lN03J5Zh6fFZAhLf3ti1ZwA0pJPn9pMRJpxx5cynoTi+jm
+9WAPzJMshH/x/Gr8m0ed262IPfN2dTPXS6TIi/n1Q1hPy8gDVI+lhXgEGvNz8teHHUGf59gXzhqc
+D0r83ERoVGjiQTz+LISGNzzNPy+i2+f3VANfWdP3kXjHi3dqFuVJhZBFcnAvkV34PmVACxmZySYg
+WmjBNb9Pp1Hx2BErW+Canig7CjoKH8GB5S7wprlppYiU5msTf9FkPz2ccEblooV7WIQn3MSAPmea
+mseaMQ4w7OYXQJXZRe0Blqq/DPNL0WP3E1jAuPP6Z92bfW1K/zJMtSU7/xxnD4UiWQWRkUF3gdCF
+TIcQcf+eQxuulXUtgQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEDk5PIj
+7zjKsK5Xf/IhMBY027ySMB0GA1UdDgQWBBRA5OTyI+84yrCuV3/yITAWNNu8kjAOBgNVHQ8BAf8E
+BAMCAQYwDQYJKoZIhvcNAQEMBQADggIBACY7UeFNOPMyGLS0XuFlXsSUT9SnYaP4wM8zAQLpw6o1
+D/GUE3d3NZ4tVlFEbuHGLige/9rsR82XRBf34EzC4Xx8MnpmyFq2XFNFV1pF1AWZLy4jVe5jaN/T
+G3inEpQGAHUNcoTpLrxaatXeL1nHo+zSh2bbt1S1JKv0Q3jbSwTEb93mPmY+KfJLaHEih6D4sTNj
+duMNhXJEIlU/HHzp/LgV6FL6qj6jITk1dImmasI5+njPtqzn59ZW/yOSLlALqbUHM/Q4X6RJpstl
+cHboCoWASzY9M/eVVHUl2qzEc4Jl6VL1XP04lQJqaTDFHApXB64ipCz5xUG3uOyfT0gA+QEEVcys
++TIxxHWVBqB/0Y0n3bOppHKH/lmLmnp0Ft0WpWIp6zqW3IunaFnT63eROfjXy9mPX1onAX1daBli
+2MjN9LdyR75bl87yraKZk62Uy5P2EgmVtqvXO9A/EcswFi55gORngS1d7XB4tmBZrOFdRWOPyN9y
+aFvqHbgB8X7754qz41SgOAngPN5C8sLtLpvzHzW2NtjjgKGLzZlkD8Kqq7HK9W+eQ42EVJmzbsAS
+ZthwEPEGNTNDqJwuuhQxzhB/HIbjj9LV+Hfsm6vxL2PZQl/gZ4FkkfGXL/xuJvYz+NO1+MRiqzFR
+JQJ6+N1rZdVtTTDIZbpoFGWsJwt0ivKH
+-----END CERTIFICATE-----
+
+TrustAsia Global Root CA G4
+===========================
+-----BEGIN CERTIFICATE-----
+MIICVTCCAdygAwIBAgIUTyNkuI6XY57GU4HBdk7LKnQV1tcwCgYIKoZIzj0EAwMwWjELMAkGA1UE
+BhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dpZXMsIEluYy4xJDAiBgNVBAMMG1Ry
+dXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHNDAeFw0yMTA1MjAwMjEwMjJaFw00NjA1MTkwMjEwMjJa
+MFoxCzAJBgNVBAYTAkNOMSUwIwYDVQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMSQw
+IgYDVQQDDBtUcnVzdEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNi
+AATxs8045CVD5d4ZCbuBeaIVXxVjAd7Cq92zphtnS4CDr5nLrBfbK5bKfFJV4hrhPVbwLxYI+hW8
+m7tH5j/uqOFMjPXTNvk4XatwmkcN4oFBButJ+bAp3TPsUKV/eSm4IJijYzBhMA8GA1UdEwEB/wQF
+MAMBAf8wHwYDVR0jBBgwFoAUpbtKl86zK3+kMd6Xg1mDpm9xy94wHQYDVR0OBBYEFKW7SpfOsyt/
+pDHel4NZg6ZvccveMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjBe8usGzEkxn0AA
+bbd+NvBNEU/zy4k6LHiRUKNbwMp1JvK/kF0LgoxgKJ/GcJpo5PECMFxYDlZ2z1jD1xCMuo6u47xk
+dUfFVZDj/bpV6wfEU6s3qe4hsiFbYI89MvHVI5TWWA==
+-----END CERTIFICATE-----
+
+Telekom Security TLS ECC Root 2020
+==================================
+-----BEGIN CERTIFICATE-----
+MIICQjCCAcmgAwIBAgIQNjqWjMlcsljN0AFdxeVXADAKBggqhkjOPQQDAzBjMQswCQYDVQQGEwJE
+RTEnMCUGA1UECgweRGV1dHNjaGUgVGVsZWtvbSBTZWN1cml0eSBHbWJIMSswKQYDVQQDDCJUZWxl
+a29tIFNlY3VyaXR5IFRMUyBFQ0MgUm9vdCAyMDIwMB4XDTIwMDgyNTA3NDgyMFoXDTQ1MDgyNTIz
+NTk1OVowYzELMAkGA1UEBhMCREUxJzAlBgNVBAoMHkRldXRzY2hlIFRlbGVrb20gU2VjdXJpdHkg
+R21iSDErMCkGA1UEAwwiVGVsZWtvbSBTZWN1cml0eSBUTFMgRUNDIFJvb3QgMjAyMDB2MBAGByqG
+SM49AgEGBSuBBAAiA2IABM6//leov9Wq9xCazbzREaK9Z0LMkOsVGJDZos0MKiXrPk/OtdKPD/M1
+2kOLAoC+b1EkHQ9rK8qfwm9QMuU3ILYg/4gND21Ju9sGpIeQkpT0CdDPf8iAC8GXs7s1J8nCG6NC
+MEAwHQYDVR0OBBYEFONyzG6VmUex5rNhTNHLq+O6zd6fMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P
+AQH/BAQDAgEGMAoGCCqGSM49BAMDA2cAMGQCMHVSi7ekEE+uShCLsoRbQuHmKjYC2qBuGT8lv9pZ
+Mo7k+5Dck2TOrbRBR2Diz6fLHgIwN0GMZt9Ba9aDAEH9L1r3ULRn0SyocddDypwnJJGDSA3PzfdU
+ga/sf+Rn27iQ7t0l
+-----END CERTIFICATE-----
+
+Telekom Security TLS RSA Root 2023
+==================================
+-----BEGIN CERTIFICATE-----
+MIIFszCCA5ugAwIBAgIQIZxULej27HF3+k7ow3BXlzANBgkqhkiG9w0BAQwFADBjMQswCQYDVQQG
+EwJERTEnMCUGA1UECgweRGV1dHNjaGUgVGVsZWtvbSBTZWN1cml0eSBHbWJIMSswKQYDVQQDDCJU
+ZWxla29tIFNlY3VyaXR5IFRMUyBSU0EgUm9vdCAyMDIzMB4XDTIzMDMyODEyMTY0NVoXDTQ4MDMy
+NzIzNTk1OVowYzELMAkGA1UEBhMCREUxJzAlBgNVBAoMHkRldXRzY2hlIFRlbGVrb20gU2VjdXJp
+dHkgR21iSDErMCkGA1UEAwwiVGVsZWtvbSBTZWN1cml0eSBUTFMgUlNBIFJvb3QgMjAyMzCCAiIw
+DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAO01oYGA88tKaVvC+1GDrib94W7zgRJ9cUD/h3VC
+KSHtgVIs3xLBGYSJwb3FKNXVS2xE1kzbB5ZKVXrKNoIENqil/Cf2SfHVcp6R+SPWcHu79ZvB7JPP
+GeplfohwoHP89v+1VmLhc2o0mD6CuKyVU/QBoCcHcqMAU6DksquDOFczJZSfvkgdmOGjup5czQRx
+UX11eKvzWarE4GC+j4NSuHUaQTXtvPM6Y+mpFEXX5lLRbtLevOP1Czvm4MS9Q2QTps70mDdsipWo
+l8hHD/BeEIvnHRz+sTugBTNoBUGCwQMrAcjnj02r6LX2zWtEtefdi+zqJbQAIldNsLGyMcEWzv/9
+FIS3R/qy8XDe24tsNlikfLMR0cN3f1+2JeANxdKz+bi4d9s3cXFH42AYTyS2dTd4uaNir73Jco4v
+zLuu2+QVUhkHM/tqty1LkCiCc/4YizWN26cEar7qwU02OxY2kTLvtkCJkUPg8qKrBC7m8kwOFjQg
+rIfBLX7JZkcXFBGk8/ehJImr2BrIoVyxo/eMbcgByU/J7MT8rFEz0ciD0cmfHdRHNCk+y7AO+oML
+KFjlKdw/fKifybYKu6boRhYPluV75Gp6SG12mAWl3G0eQh5C2hrgUve1g8Aae3g1LDj1H/1Joy7S
+WWO/gLCMk3PLNaaZlSJhZQNg+y+TS/qanIA7AgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAdBgNV
+HQ4EFgQUtqeXgj10hZv3PJ+TmpV5dVKMbUcwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS2
+p5eCPXSFm/c8n5OalXl1UoxtRzANBgkqhkiG9w0BAQwFAAOCAgEAqMxhpr51nhVQpGv7qHBFfLp+
+sVr8WyP6Cnf4mHGCDG3gXkaqk/QeoMPhk9tLrbKmXauw1GLLXrtm9S3ul0A8Yute1hTWjOKWi0Fp
+kzXmuZlrYrShF2Y0pmtjxrlO8iLpWA1WQdH6DErwM807u20hOq6OcrXDSvvpfeWxm4bu4uB9tPcy
+/SKE8YXJN3nptT+/XOR0so8RYgDdGGah2XsjX/GO1WfoVNpbOms2b/mBsTNHM3dA+VKq3dSDz4V4
+mZqTuXNnQkYRIer+CqkbGmVps4+uFrb2S1ayLfmlyOw7YqPta9BO1UAJpB+Y1zqlklkg5LB9zVtz
+aL1txKITDmcZuI1CfmwMmm6gJC3VRRvcxAIU/oVbZZfKTpBQCHpCNfnqwmbU+AGuHrS+w6jv/naa
+oqYfRvaE7fzbzsQCzndILIyy7MMAo+wsVRjBfhnu4S/yrYObnqsZ38aKL4x35bcF7DvB7L6Gs4a8
+wPfc5+pbrrLMtTWGS9DiP7bY+A4A7l3j941Y/8+LN+ljX273CXE2whJdV/LItM3z7gLfEdxquVeE
+HVlNjM7IDiPCtyaaEBRx/pOyiriA8A4QntOoUAw3gi/q4Iqd4Sw5/7W0cwDk90imc6y/st53BIe0
+o82bNSQ3+pCTE4FCxpgmdTdmQRCsu/WU48IxK63nI1bMNSWSs1A=
+-----END CERTIFICATE-----
+
+FIRMAPROFESIONAL CA ROOT-A WEB
+==============================
+-----BEGIN CERTIFICATE-----
+MIICejCCAgCgAwIBAgIQMZch7a+JQn81QYehZ1ZMbTAKBggqhkjOPQQDAzBuMQswCQYDVQQGEwJF
+UzEcMBoGA1UECgwTRmlybWFwcm9mZXNpb25hbCBTQTEYMBYGA1UEYQwPVkFURVMtQTYyNjM0MDY4
+MScwJQYDVQQDDB5GSVJNQVBST0ZFU0lPTkFMIENBIFJPT1QtQSBXRUIwHhcNMjIwNDA2MDkwMTM2
+WhcNNDcwMzMxMDkwMTM2WjBuMQswCQYDVQQGEwJFUzEcMBoGA1UECgwTRmlybWFwcm9mZXNpb25h
+bCBTQTEYMBYGA1UEYQwPVkFURVMtQTYyNjM0MDY4MScwJQYDVQQDDB5GSVJNQVBST0ZFU0lPTkFM
+IENBIFJPT1QtQSBXRUIwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARHU+osEaR3xyrq89Zfe9MEkVz6
+iMYiuYMQYneEMy3pA4jU4DP37XcsSmDq5G+tbbT4TIqk5B/K6k84Si6CcyvHZpsKjECcfIr28jlg
+st7L7Ljkb+qbXbdTkBgyVcUgt5SjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUk+FD
+Y1w8ndYn81LsF7Kpryz3dvgwHQYDVR0OBBYEFJPhQ2NcPJ3WJ/NS7Beyqa8s93b4MA4GA1UdDwEB
+/wQEAwIBBjAKBggqhkjOPQQDAwNoADBlAjAdfKR7w4l1M+E7qUW/Runpod3JIha3RxEL2Jq68cgL
+cFBTApFwhVmpHqTm6iMxoAACMQD94vizrxa5HnPEluPBMBnYfubDl94cT7iJLzPrSA8Z94dGXSaQ
+pYXFuXqUPoeovQA=
+-----END CERTIFICATE-----
+
+TWCA CYBER Root CA
+==================
+-----BEGIN CERTIFICATE-----
+MIIFjTCCA3WgAwIBAgIQQAE0jMIAAAAAAAAAATzyxjANBgkqhkiG9w0BAQwFADBQMQswCQYDVQQG
+EwJUVzESMBAGA1UEChMJVEFJV0FOLUNBMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJUV0NB
+IENZQkVSIFJvb3QgQ0EwHhcNMjIxMTIyMDY1NDI5WhcNNDcxMTIyMTU1OTU5WjBQMQswCQYDVQQG
+EwJUVzESMBAGA1UEChMJVEFJV0FOLUNBMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJUV0NB
+IENZQkVSIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDG+Moe2Qkgfh1s
+Ts6P40czRJzHyWmqOlt47nDSkvgEs1JSHWdyKKHfi12VCv7qze33Kc7wb3+szT3vsxxFavcokPFh
+V8UMxKNQXd7UtcsZyoC5dc4pztKFIuwCY8xEMCDa6pFbVuYdHNWdZsc/34bKS1PE2Y2yHer43CdT
+o0fhYcx9tbD47nORxc5zb87uEB8aBs/pJ2DFTxnk684iJkXXYJndzk834H/nY62wuFm40AZoNWDT
+Nq5xQwTxaWV4fPMf88oon1oglWa0zbfuj3ikRRjpJi+NmykosaS3Om251Bw4ckVYsV7r8Cibt4LK
+/c/WMw+f+5eesRycnupfXtuq3VTpMCEobY5583WSjCb+3MX2w7DfRFlDo7YDKPYIMKoNM+HvnKkH
+IuNZW0CP2oi3aQiotyMuRAlZN1vH4xfyIutuOVLF3lSnmMlLIJXcRolftBL5hSmO68gnFSDAS9TM
+fAxsNAwmmyYxpjyn9tnQS6Jk/zuZQXLB4HCX8SS7K8R0IrGsayIyJNN4KsDAoS/xUgXJP+92ZuJF
+2A09rZXIx4kmyA+upwMu+8Ff+iDhcK2wZSA3M2Cw1a/XDBzCkHDXShi8fgGwsOsVHkQGzaRP6AzR
+wyAQ4VRlnrZR0Bp2a0JaWHY06rc3Ga4udfmW5cFZ95RXKSWNOkyrTZpB0F8mAwIDAQABo2MwYTAO
+BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBSdhWEUfMFib5do5E83
+QOGt4A1WNzAdBgNVHQ4EFgQUnYVhFHzBYm+XaORPN0DhreANVjcwDQYJKoZIhvcNAQEMBQADggIB
+AGSPesRiDrWIzLjHhg6hShbNcAu3p4ULs3a2D6f/CIsLJc+o1IN1KriWiLb73y0ttGlTITVX1olN
+c79pj3CjYcya2x6a4CD4bLubIp1dhDGaLIrdaqHXKGnK/nZVekZn68xDiBaiA9a5F/gZbG0jAn/x
+X9AKKSM70aoK7akXJlQKTcKlTfjF/biBzysseKNnTKkHmvPfXvt89YnNdJdhEGoHK4Fa0o635yDR
+IG4kqIQnoVesqlVYL9zZyvpoBJ7tRCT5dEA7IzOrg1oYJkK2bVS1FmAwbLGg+LhBoF1JSdJlBTrq
+/p1hvIbZv97Tujqxf36SNI7JAG7cmL3c7IAFrQI932XtCwP39xaEBDG6k5TY8hL4iuO/Qq+n1M0R
+FxbIQh0UqEL20kCGoE8jypZFVmAGzbdVAaYBlGX+bgUJurSkquLvWL69J1bY73NxW0Qz8ppy6rBe
+Pm6pUlvscG21h483XjyMnM7k8M4MZ0HMzvaAq07MTFb1wWFZk7Q+ptq4NxKfKjLji7gh7MMrZQzv
+It6IKTtM1/r+t+FHvpw+PoP7UV31aPcuIYXcv/Fa4nzXxeSDwWrruoBa3lwtcHb4yOWHh8qgnaHl
+IhInD0Q9HWzq1MKLL295q39QpsQZp6F6t5b5wR9iWqJDB0BeJsas7a5wFsWqynKKTbDPAYsDP27X
+-----END CERTIFICATE-----
+
+SecureSign Root CA12
+====================
+-----BEGIN CERTIFICATE-----
+MIIDcjCCAlqgAwIBAgIUZvnHwa/swlG07VOX5uaCwysckBYwDQYJKoZIhvcNAQELBQAwUTELMAkG
+A1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBMdGQuMR0wGwYDVQQDExRT
+ZWN1cmVTaWduIFJvb3QgQ0ExMjAeFw0yMDA0MDgwNTM2NDZaFw00MDA0MDgwNTM2NDZaMFExCzAJ
+BgNVBAYTAkpQMSMwIQYDVQQKExpDeWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMU
+U2VjdXJlU2lnbiBSb290IENBMTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6OcE3
+emhFKxS06+QT61d1I02PJC0W6K6OyX2kVzsqdiUzg2zqMoqUm048luT9Ub+ZyZN+v/mtp7JIKwcc
+J/VMvHASd6SFVLX9kHrko+RRWAPNEHl57muTH2SOa2SroxPjcf59q5zdJ1M3s6oYwlkm7Fsf0uZl
+fO+TvdhYXAvA42VvPMfKWeP+bl+sg779XSVOKik71gurFzJ4pOE+lEa+Ym6b3kaosRbnhW70CEBF
+EaCeVESE99g2zvVQR9wsMJvuwPWW0v4JhscGWa5Pro4RmHvzC1KqYiaqId+OJTN5lxZJjfU+1Uef
+NzFJM3IFTQy2VYzxV4+Kh9GtxRESOaCtAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P
+AQH/BAQDAgEGMB0GA1UdDgQWBBRXNPN0zwRL1SXm8UC2LEzZLemgrTANBgkqhkiG9w0BAQsFAAOC
+AQEAPrvbFxbS8hQBICw4g0utvsqFepq2m2um4fylOqyttCg6r9cBg0krY6LdmmQOmFxv3Y67ilQi
+LUoT865AQ9tPkbeGGuwAtEGBpE/6aouIs3YIcipJQMPTw4WJmBClnW8Zt7vPemVV2zfrPIpyMpce
+mik+rY3moxtt9XUa5rBouVui7mlHJzWhhpmA8zNL4WukJsPvdFlseqJkth5Ew1DgDzk9qTPxpfPS
+vWKErI4cqc1avTc7bgoitPQV55FYxTpE05Uo2cBl6XLK0A+9H7MV2anjpEcJnuDLN/v9vZfVvhga
+aaI5gdka9at/yOPiZwud9AzqVN/Ssq+xIvEg37xEHA==
+-----END CERTIFICATE-----
+
+SecureSign Root CA14
+====================
+-----BEGIN CERTIFICATE-----
+MIIFcjCCA1qgAwIBAgIUZNtaDCBO6Ncpd8hQJ6JaJ90t8sswDQYJKoZIhvcNAQEMBQAwUTELMAkG
+A1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBMdGQuMR0wGwYDVQQDExRT
+ZWN1cmVTaWduIFJvb3QgQ0ExNDAeFw0yMDA0MDgwNzA2MTlaFw00NTA0MDgwNzA2MTlaMFExCzAJ
+BgNVBAYTAkpQMSMwIQYDVQQKExpDeWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMU
+U2VjdXJlU2lnbiBSb290IENBMTQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDF0nqh
+1oq/FjHQmNE6lPxauG4iwWL3pwon71D2LrGeaBLwbCRjOfHw3xDG3rdSINVSW0KZnvOgvlIfX8xn
+bacuUKLBl422+JX1sLrcneC+y9/3OPJH9aaakpUqYllQC6KxNedlsmGy6pJxaeQp8E+BgQQ8sqVb
+1MWoWWd7VRxJq3qdwudzTe/NCcLEVxLbAQ4jeQkHO6Lo/IrPj8BGJJw4J+CDnRugv3gVEOuGTgpa
+/d/aLIJ+7sr2KeH6caH3iGicnPCNvg9JkdjqOvn90Ghx2+m1K06Ckm9mH+Dw3EzsytHqunQG+bOE
+kJTRX45zGRBdAuVwpcAQ0BB8b8VYSbSwbprafZX1zNoCr7gsfXmPvkPx+SgojQlD+Ajda8iLLCSx
+jVIHvXiby8posqTdDEx5YMaZ0ZPxMBoH064iwurO8YQJzOAUbn8/ftKChazcqRZOhaBgy/ac18iz
+ju3Gm5h1DVXoX+WViwKkrkMpKBGk5hIwAUt1ax5mnXkvpXYvHUC0bcl9eQjs0Wq2XSqypWa9a4X0
+dFbD9ed1Uigspf9mR6XU/v6eVL9lfgHWMI+lNpyiUBzuOIABSMbHdPTGrMNASRZhdCyvjG817XsY
+AFs2PJxQDcqSMxDxJklt33UkN4Ii1+iW/RVLApY+B3KVfqs9TC7XyvDf4Fg/LS8EmjijAQIDAQAB
+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUBpOjCl4oaTeq
+YR3r6/wtbyPk86AwDQYJKoZIhvcNAQEMBQADggIBAJaAcgkGfpzMkwQWu6A6jZJOtxEaCnFxEM0E
+rX+lRVAQZk5KQaID2RFPeje5S+LGjzJmdSX7684/AykmjbgWHfYfM25I5uj4V7Ibed87hwriZLoA
+ymzvftAj63iP/2SbNDefNWWipAA9EiOWWF3KY4fGoweITedpdopTzfFP7ELyk+OZpDc8h7hi2/Ds
+Hzc/N19DzFGdtfCXwreFamgLRB7lUe6TzktuhsHSDCRZNhqfLJGP4xjblJUK7ZGqDpncllPjYYPG
+FrojutzdfhrGe0K22VoF3Jpf1d+42kd92jjbrDnVHmtsKheMYc2xbXIBw8MgAGJoFjHVdqqGuw6q
+nsb58Nn4DSEC5MUoFlkRudlpcyqSeLiSV5sI8jrlL5WwWLdrIBRtFO8KvH7YVdiI2i/6GaX7i+B/
+OfVyK4XELKzvGUWSTLNhB9xNH27SgRNcmvMSZ4PPmz+Ln52kuaiWA3rF7iDeM9ovnhp6dB7h7sxa
+OgTdsxoEqBRjrLdHEoOabPXm6RUVkRqEGQ6UROcSjiVbgGcZ3GOTEAtlLor6CZpO2oYofaphNdgO
+pygau1LgePhsumywbrmHXumZNTfxPWQrqaA0k89jL9WB365jJ6UeTo3cKXhZ+PmhIIynJkBugnLN
+eLLIjzwec+fBH7/PzqUqm9tEZDKgu39cJRNItX+S
+-----END CERTIFICATE-----
+
+SecureSign Root CA15
+====================
+-----BEGIN CERTIFICATE-----
+MIICIzCCAamgAwIBAgIUFhXHw9hJp75pDIqI7fBw+d23PocwCgYIKoZIzj0EAwMwUTELMAkGA1UE
+BhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBMdGQuMR0wGwYDVQQDExRTZWN1
+cmVTaWduIFJvb3QgQ0ExNTAeFw0yMDA0MDgwODMyNTZaFw00NTA0MDgwODMyNTZaMFExCzAJBgNV
+BAYTAkpQMSMwIQYDVQQKExpDeWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMUU2Vj
+dXJlU2lnbiBSb290IENBMTUwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQLUHSNZDKZmbPSYAi4Io5G
+dCx4wCtELW1fHcmuS1Iggz24FG1Th2CeX2yF2wYUleDHKP+dX+Sq8bOLbe1PL0vJSpSRZHX+AezB
+2Ot6lHhWGENfa4HL9rzatAy2KZMIaY+jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD
+AgEGMB0GA1UdDgQWBBTrQciu/NWeUUj1vYv0hyCTQSvT9DAKBggqhkjOPQQDAwNoADBlAjEA2S6J
+fl5OpBEHvVnCB96rMjhTKkZEBhd6zlHp4P9mLQlO4E/0BdGF9jVg3PVys0Z9AjBEmEYagoUeYWmJ
+SwdLZrWeqrqgHkHZAXQ6bkU6iYAZezKYVWOr62Nuk22rGwlgMU4=
+-----END CERTIFICATE-----
+
+D-TRUST BR Root CA 2 2023
+=========================
+-----BEGIN CERTIFICATE-----
+MIIFqTCCA5GgAwIBAgIQczswBEhb2U14LnNLyaHcZjANBgkqhkiG9w0BAQ0FADBIMQswCQYDVQQG
+EwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEJSIFJvb3QgQ0Eg
+MiAyMDIzMB4XDTIzMDUwOTA4NTYzMVoXDTM4MDUwOTA4NTYzMFowSDELMAkGA1UEBhMCREUxFTAT
+BgNVBAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBCUiBSb290IENBIDIgMjAyMzCC
+AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK7/CVmRgApKaOYkP7in5Mg6CjoWzckjYaCT
+cfKri3OPoGdlYNJUa2NRb0kz4HIHE304zQaSBylSa053bATTlfrdTIzZXcFhfUvnKLNEgXtRr90z
+sWh81k5M/itoucpmacTsXld/9w3HnDY25QdgrMBM6ghs7wZ8T1soegj8k12b9py0i4a6Ibn08OhZ
+WiihNIQaJZG2tY/vsvmA+vk9PBFy2OMvhnbFeSzBqZCTRphny4NqoFAjpzv2gTng7fC5v2Xx2Mt6
+++9zA84A9H3X4F07ZrjcjrqDy4d2A/wl2ecjbwb9Z/Pg/4S8R7+1FhhGaRTMBffb00msa8yr5LUL
+QyReS2tNZ9/WtT5PeB+UcSTq3nD88ZP+npNa5JRal1QMNXtfbO4AHyTsA7oC9Xb0n9Sa7YUsOCIv
+x9gvdhFP/Wxc6PWOJ4d/GUohR5AdeY0cW/jPSoXk7bNbjb7EZChdQcRurDhaTyN0dKkSw/bSuREV
+MweR2Ds3OmMwBtHFIjYoYiMQ4EbMl6zWK11kJNXuHA7e+whadSr2Y23OC0K+0bpwHJwh5Q8xaRfX
+/Aq03u2AnMuStIv13lmiWAmlY0cL4UEyNEHZmrHZqLAbWt4NDfTisl01gLmB1IRpkQLLddCNxbU9
+CZEJjxShFHR5PtbJFR2kWVki3PaKRT08EtY+XTIvAgMBAAGjgY4wgYswDwYDVR0TAQH/BAUwAwEB
+/zAdBgNVHQ4EFgQUZ5Dw1t61GNVGKX5cq/ieCLxklRAwDgYDVR0PAQH/BAQDAgEGMEkGA1UdHwRC
+MEAwPqA8oDqGOGh0dHA6Ly9jcmwuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3RfYnJfcm9vdF9jYV8y
+XzIwMjMuY3JsMA0GCSqGSIb3DQEBDQUAA4ICAQA097N3U9swFrktpSHxQCF16+tIFoE9c+CeJyrr
+d6kTpGoKWloUMz1oH4Guaf2Mn2VsNELZLdB/eBaxOqwjMa1ef67nriv6uvw8l5VAk1/DLQOj7aRv
+U9f6QA4w9QAgLABMjDu0ox+2v5Eyq6+SmNMW5tTRVFxDWy6u71cqqLRvpO8NVhTaIasgdp4D/Ca4
+nj8+AybmTNudX0KEPUUDAxxZiMrcLmEkWqTqJwtzEr5SswrPMhfiHocaFpVIbVrg0M8JkiZmkdij
+YQ6qgYF/6FKC0ULn4B0Y+qSFNueG4A3rvNTJ1jxD8V1Jbn6Bm2m1iWKPiFLY1/4nwSPFyysCu7Ff
+/vtDhQNGvl3GyiEm/9cCnnRK3PgTFbGBVzbLZVzRHTF36SXDw7IyN9XxmAnkbWOACKsGkoHU6XCP
+pz+y7YaMgmo1yEJagtFSGkUPFaUA8JR7ZSdXOUPPfH/mvTWze/EZTN46ls/pdu4D58JDUjxqgejB
+WoC9EV2Ta/vH5mQ/u2kc6d0li690yVRAysuTEwrt+2aSEcr1wPrYg1UDfNPFIkZ1cGt5SAYqgpq/
+5usWDiJFAbzdNpQ0qTUmiteXue4Icr80knCDgKs4qllo3UCkGJCy89UDyibK79XH4I9TjvAA46jt
+n/mtd+ArY0+ew+43u3gJhJ65bvspmZDogNOfJA==
+-----END CERTIFICATE-----
+
+TrustAsia TLS ECC Root CA
+=========================
+-----BEGIN CERTIFICATE-----
+MIICMTCCAbegAwIBAgIUNnThTXxlE8msg1UloD5Sfi9QaMcwCgYIKoZIzj0EAwMwWDELMAkGA1UE
+BhMCQ04xJTAjBgNVBAoTHFRydXN0QXNpYSBUZWNobm9sb2dpZXMsIEluYy4xIjAgBgNVBAMTGVRy
+dXN0QXNpYSBUTFMgRUNDIFJvb3QgQ0EwHhcNMjQwNTE1MDU0MTU2WhcNNDQwNTE1MDU0MTU1WjBY
+MQswCQYDVQQGEwJDTjElMCMGA1UEChMcVHJ1c3RBc2lhIFRlY2hub2xvZ2llcywgSW5jLjEiMCAG
+A1UEAxMZVHJ1c3RBc2lhIFRMUyBFQ0MgUm9vdCBDQTB2MBAGByqGSM49AgEGBSuBBAAiA2IABLh/
+pVs/AT598IhtrimY4ZtcU5nb9wj/1WrgjstEpvDBjL1P1M7UiFPoXlfXTr4sP/MSpwDpguMqWzJ8
+S5sUKZ74LYO1644xST0mYekdcouJtgq7nDM1D9rs3qlKH8kzsaNCMEAwDwYDVR0TAQH/BAUwAwEB
+/zAdBgNVHQ4EFgQULIVTu7FDzTLqnqOH/qKYqKaT6RAwDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49
+BAMDA2gAMGUCMFRH18MtYYZI9HlaVQ01L18N9mdsd0AaRuf4aFtOJx24mH1/k78ITcTaRTChD15K
+eAIxAKORh/IRM4PDwYqROkwrULG9IpRdNYlzg8WbGf60oenUoWa2AaU2+dhoYSi3dOGiMQ==
+-----END CERTIFICATE-----
+
+TrustAsia TLS RSA Root CA
+=========================
+-----BEGIN CERTIFICATE-----
+MIIFgDCCA2igAwIBAgIUHBjYz+VTPyI1RlNUJDxsR9FcSpwwDQYJKoZIhvcNAQEMBQAwWDELMAkG
+A1UEBhMCQ04xJTAjBgNVBAoTHFRydXN0QXNpYSBUZWNobm9sb2dpZXMsIEluYy4xIjAgBgNVBAMT
+GVRydXN0QXNpYSBUTFMgUlNBIFJvb3QgQ0EwHhcNMjQwNTE1MDU0MTU3WhcNNDQwNTE1MDU0MTU2
+WjBYMQswCQYDVQQGEwJDTjElMCMGA1UEChMcVHJ1c3RBc2lhIFRlY2hub2xvZ2llcywgSW5jLjEi
+MCAGA1UEAxMZVHJ1c3RBc2lhIFRMUyBSU0EgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP
+ADCCAgoCggIBAMMWuBtqpERz5dZO9LnPWwvB0ZqB9WOwj0PBuwhaGnrhB3YmH49pVr7+NmDQDIPN
+lOrnxS1cLwUWAp4KqC/lYCZUlviYQB2srp10Zy9U+5RjmOMmSoPGlbYJQ1DNDX3eRA5gEk9bNb2/
+mThtfWza4mhzH/kxpRkQcwUqwzIZheo0qt1CHjCNP561HmHVb70AcnKtEj+qpklz8oYVlQwQX1Fk
+zv93uMltrOXVmPGZLmzjyUT5tUMnCE32ft5EebuyjBza00tsLtbDeLdM1aTk2tyKjg7/D8OmYCYo
+zza/+lcK7Fs/6TAWe8TbxNRkoDD75f0dcZLdKY9BWN4ArTr9PXwaqLEX8E40eFgl1oUh63kd0Nyr
+z2I8sMeXi9bQn9P+PN7F4/w6g3CEIR0JwqH8uyghZVNgepBtljhb//HXeltt08lwSUq6HTrQUNoy
+IBnkiz/r1RYmNzz7dZ6wB3C4FGB33PYPXFIKvF1tjVEK2sUYyJtt3LCDs3+jTnhMmCWr8n4uIF6C
+FabW2I+s5c0yhsj55NqJ4js+k8UTav/H9xj8Z7XvGCxUq0DTbE3txci3OE9kxJRMT6DNrqXGJyV1
+J23G2pyOsAWZ1SgRxSHUuPzHlqtKZFlhaxP8S8ySpg+kUb8OWJDZgoM5pl+z+m6Ss80zDoWo8SnT
+q1mt1tve1CuBAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFLgHkXlcBvRG/XtZ
+ylomkadFK/hTMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQwFAAOCAgEAIZtqBSBdGBanEqT3
+Rz/NyjuujsCCztxIJXgXbODgcMTWltnZ9r96nBO7U5WS/8+S4PPFJzVXqDuiGev4iqME3mmL5Dw8
+veWv0BIb5Ylrc5tvJQJLkIKvQMKtuppgJFqBTQUYo+IzeXoLH5Pt7DlK9RME7I10nYEKqG/odv6L
+TytpEoYKNDbdgptvT+Bz3Ul/KD7JO6NXBNiT2Twp2xIQaOHEibgGIOcberyxk2GaGUARtWqFVwHx
+tlotJnMnlvm5P1vQiJ3koP26TpUJg3933FEFlJ0gcXax7PqJtZwuhfG5WyRasQmr2soaB82G39tp
+27RIGAAtvKLEiUUjpQ7hRGU+isFqMB3iYPg6qocJQrmBktwliJiJ8Xw18WLK7nn4GS/+X/jbh87q
+qA8MpugLoDzga5SYnH+tBuYc6kIQX+ImFTw3OffXvO645e8D7r0i+yiGNFjEWn9hongPXvPKnbwb
+PKfILfanIhHKA9jnZwqKDss1jjQ52MjqjZ9k4DewbNfFj8GQYSbbJIweSsCI3zWQzj8C9GRh3sfI
+B5XeMhg6j6JCQCTl1jNdfK7vsU1P1FeQNWrcrgSXSYk0ly4wBOeY99sLAZDBHwo/+ML+TvrbmnNz
+FrwFuHnYWa8G5z9nODmxfKuU4CkUpijy323imttUQ/hHWKNddBWcwauwxzQ=
+-----END CERTIFICATE-----
+
+D-TRUST EV Root CA 2 2023
+=========================
+-----BEGIN CERTIFICATE-----
+MIIFqTCCA5GgAwIBAgIQaSYJfoBLTKCnjHhiU19abzANBgkqhkiG9w0BAQ0FADBIMQswCQYDVQQG
+EwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEVWIFJvb3QgQ0Eg
+MiAyMDIzMB4XDTIzMDUwOTA5MTAzM1oXDTM4MDUwOTA5MTAzMlowSDELMAkGA1UEBhMCREUxFTAT
+BgNVBAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBFViBSb290IENBIDIgMjAyMzCC
+AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANiOo4mAC7JXUtypU0w3uX9jFxPvp1sjW2l1
+sJkKF8GLxNuo4MwxusLyzV3pt/gdr2rElYfXR8mV2IIEUD2BCP/kPbOx1sWy/YgJ25yE7CUXFId/
+MHibaljJtnMoPDT3mfd/06b4HEV8rSyMlD/YZxBTfiLNTiVR8CUkNRFeEMbsh2aJgWi6zCudR3Mf
+vc2RpHJqnKIbGKBv7FD0fUDCqDDPvXPIEysQEx6Lmqg6lHPTGGkKSv/BAQP/eX+1SH977ugpbzZM
+lWGG2Pmic4ruri+W7mjNPU0oQvlFKzIbRlUWaqZLKfm7lVa/Rh3sHZMdwGWyH6FDrlaeoLGPaxK3
+YG14C8qKXO0elg6DpkiVjTujIcSuWMYAsoS0I6SWhjW42J7YrDRJmGOVxcttSEfi8i4YHtAxq910
+7PncjLgcjmgjutDzUNzPZY9zOjLHfP7KgiJPvo5iR2blzYfi6NUPGJ/lBHJLRjwQ8kTCZFZxTnXo
+nMkmdMV9WdEKWw9t/p51HBjGGjp82A0EzM23RWV6sY+4roRIPrN6TagD4uJ+ARZZaBhDM7DS3LAa
+QzXupdqpRlyuhoFBAUp0JuyfBr/CBTdkdXgpaP3F9ev+R/nkhbDhezGdpn9yo7nELC7MmVcOIQxF
+AZRl62UJxmMiCzNJkkg8/M3OsD6Onov4/knFNXJHAgMBAAGjgY4wgYswDwYDVR0TAQH/BAUwAwEB
+/zAdBgNVHQ4EFgQUqvyREBuHkV8Wub9PS5FeAByxMoAwDgYDVR0PAQH/BAQDAgEGMEkGA1UdHwRC
+MEAwPqA8oDqGOGh0dHA6Ly9jcmwuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3RfZXZfcm9vdF9jYV8y
+XzIwMjMuY3JsMA0GCSqGSIb3DQEBDQUAA4ICAQCTy6UfmRHsmg1fLBWTxj++EI14QvBukEdHjqOS
+Mo1wj/Zbjb6JzkcBahsgIIlbyIIQbODnmaprxiqgYzWRaoUlrRc4pZt+UPJ26oUFKidBK7GB0aL2
+QHWpDsvxVUjY7NHss+jOFKE17MJeNRqrphYBBo7q3C+jisosketSjl8MmxfPy3MHGcRqwnNU73xD
+UmPBEcrCRbH0O1P1aa4846XerOhUt7KR/aypH/KH5BfGSah82ApB9PI+53c0BFLd6IHyTS9URZ0V
+4U/M5d40VxDJI3IXcI1QcB9WbMy5/zpaT2N6w25lBx2Eof+pDGOJbbJAiDnXH3dotfyc1dZnaVuo
+dNv8ifYbMvekJKZ2t0dT741Jj6m2g1qllpBFYfXeA08mD6iL8AOWsKwV0HFaanuU5nCT2vFp4LJi
+TZ6P/4mdm13NRemUAiKN4DV/6PEEeXFsVIP4M7kFMhtYVRFP0OUnR3Hs7dpn1mKmS00PaaLJvOwi
+S5THaJQXfuKOKD62xur1NGyfN4gHONuGcfrNlUhDbqNPgofXNJhuS5N5YHVpD/Aa1VP6IQzCP+k/
+HxiMkl14p3ZnGbuy6n/pcAlWVqOwDAstNl7F6cTVg8uGF5csbBNvh1qvSaYd2804BC5f4ko1Di1L
++KIkBI3Y4WNeApI02phhXBxvWHZks/wCuPWdCg==
+-----END CERTIFICATE-----
+
+SwissSign RSA TLS Root CA 2022 - 1
+==================================
+-----BEGIN CERTIFICATE-----
+MIIFkzCCA3ugAwIBAgIUQ/oMX04bgBhE79G0TzUfRPSA7cswDQYJKoZIhvcNAQELBQAwUTELMAkG
+A1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzErMCkGA1UEAxMiU3dpc3NTaWduIFJTQSBU
+TFMgUm9vdCBDQSAyMDIyIC0gMTAeFw0yMjA2MDgxMTA4MjJaFw00NzA2MDgxMTA4MjJaMFExCzAJ
+BgNVBAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxKzApBgNVBAMTIlN3aXNzU2lnbiBSU0Eg
+VExTIFJvb3QgQ0EgMjAyMiAtIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDLKmji
+C8NXvDVjvHClO/OMPE5Xlm7DTjak9gLKHqquuN6orx122ro10JFwB9+zBvKK8i5VUXu7LCTLf5Im
+gKO0lPaCoaTo+nUdWfMHamFk4saMla+ju45vVs9xzF6BYQ1t8qsCLqSX5XH8irCRIFucdFJtrhUn
+WXjyCcplDn/L9Ovn3KlMd/YrFgSVrpxxpT8q2kFC5zyEEPThPYxr4iuRR1VPuFa+Rd4iUU1OKNlf
+GUEGjw5NBuBwQCMBauTLE5tzrE0USJIt/m2n+IdreXXhvhCxqohAWVTXz8TQm0SzOGlkjIHRI36q
+OTw7D59Ke4LKa2/KIj4x0LDQKhySio/YGZxH5D4MucLNvkEM+KRHBdvBFzA4OmnczcNpI/2aDwLO
+EGrOyvi5KaM2iYauC8BPY7kGWUleDsFpswrzd34unYyzJ5jSmY0lpx+Gs6ZUcDj8fV3oT4MM0ZPl
+EuRU2j7yrTrePjxF8CgPBrnh25d7mUWe3f6VWQQvdT/TromZhqwUtKiE+shdOxtYk8EXlFXIC+OC
+eYSf8wCENO7cMdWP8vpPlkwGqnj73mSiI80fPsWMvDdUDrtaclXvyFu1cvh43zcgTFeRc5JzrBh3
+Q4IgaezprClG5QtO+DdziZaKHG29777YtvTKwP1H8K4LWCDFyB02rpeNUIMmJCn3nTsPBQIDAQAB
+o2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBRvjmKLk0Ow
+4UD2p8P98Q+4DxU4pTAdBgNVHQ4EFgQUb45ii5NDsOFA9qfD/fEPuA8VOKUwDQYJKoZIhvcNAQEL
+BQADggIBAKwsKUF9+lz1GpUYvyypiqkkVHX1uECry6gkUSsYP2OprphWKwVDIqO310aewCoSPY6W
+lkDfDDOLazeROpW7OSltwAJsipQLBwJNGD77+3v1dj2b9l4wBlgzHqp41eZUBDqyggmNzhYzWUUo
+8aWjlw5DI/0LIICQ/+Mmz7hkkeUFjxOgdg3XNwwQiJb0Pr6VvfHDffCjw3lHC1ySFWPtUnWK50Zp
+y1FVCypM9fJkT6lc/2cyjlUtMoIcgC9qkfjLvH4YoiaoLqNTKIftV+Vlek4ASltOU8liNr3Cjlvr
+zG4ngRhZi0Rjn9UMZfQpZX+RLOV/fuiJz48gy20HQhFRJjKKLjpHE7iNvUcNCfAWpO2Whi4Z2L6M
+OuhFLhG6rlrnub+xzI/goP+4s9GFe3lmozm1O2bYQL7Pt2eLSMkZJVX8vY3PXtpOpvJpzv1/THfQ
+wUY1mFwjmwJFQ5Ra3bxHrSL+ul4vkSkphnsh3m5kt8sNjzdbowhq6/TdAo9QAwKxuDdollDruF/U
+KIqlIgyKhPBZLtU30WHlQnNYKoH3dtvi4k0NX/a3vgW0rk4N3hY9A4GzJl5LuEsAz/+MF7psYC0n
+hzck5npgL7XTgwSqT0N1osGDsieYK7EOgLrAhV5Cud+xYJHT6xh+cHiudoO+cVrQkOPKwRYlZ0rw
+tnu64ZzZ
+-----END CERTIFICATE-----
+
+OISTE Server Root ECC G1
+========================
+-----BEGIN CERTIFICATE-----
+MIICNTCCAbqgAwIBAgIQI/nD1jWvjyhLH/BU6n6XnTAKBggqhkjOPQQDAzBLMQswCQYDVQQGEwJD
+SDEZMBcGA1UECgwQT0lTVEUgRm91bmRhdGlvbjEhMB8GA1UEAwwYT0lTVEUgU2VydmVyIFJvb3Qg
+RUNDIEcxMB4XDTIzMDUzMTE0NDIyOFoXDTQ4MDUyNDE0NDIyN1owSzELMAkGA1UEBhMCQ0gxGTAX
+BgNVBAoMEE9JU1RFIEZvdW5kYXRpb24xITAfBgNVBAMMGE9JU1RFIFNlcnZlciBSb290IEVDQyBH
+MTB2MBAGByqGSM49AgEGBSuBBAAiA2IABBcv+hK8rBjzCvRE1nZCnrPoH7d5qVi2+GXROiFPqOuj
+vqQycvO2Ackr/XeFblPdreqqLiWStukhEaivtUwL85Zgmjvn6hp4LrQ95SjeHIC6XG4N2xml4z+c
+KrhAS93mT6NjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBQ3TYhlz/w9itWj8UnATgwQ
+b0K0nDAdBgNVHQ4EFgQUN02IZc/8PYrVo/FJwE4MEG9CtJwwDgYDVR0PAQH/BAQDAgGGMAoGCCqG
+SM49BAMDA2kAMGYCMQCpKjAd0MKfkFFRQD6VVCHNFmb3U2wIFjnQEnx/Yxvf4zgAOdktUyBFCxxg
+ZzFDJe0CMQCSia7pXGKDYmH5LVerVrkR3SW+ak5KGoJr3M/TvEqzPNcum9v4KGm8ay3sMaE641c=
+-----END CERTIFICATE-----
+
+ OISTE Server Root RSA G1
+=========================
+-----BEGIN CERTIFICATE-----
+MIIFgzCCA2ugAwIBAgIQVaXZZ5Qoxu0M+ifdWwFNGDANBgkqhkiG9w0BAQwFADBLMQswCQYDVQQG
+EwJDSDEZMBcGA1UECgwQT0lTVEUgRm91bmRhdGlvbjEhMB8GA1UEAwwYT0lTVEUgU2VydmVyIFJv
+b3QgUlNBIEcxMB4XDTIzMDUzMTE0MzcxNloXDTQ4MDUyNDE0MzcxNVowSzELMAkGA1UEBhMCQ0gx
+GTAXBgNVBAoMEE9JU1RFIEZvdW5kYXRpb24xITAfBgNVBAMMGE9JU1RFIFNlcnZlciBSb290IFJT
+QSBHMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKqu9KuCz/vlNwvn1ZatkOhLKdxV
+YOPMvLO8LZK55KN68YG0nnJyQ98/qwsmtO57Gmn7KNByXEptaZnwYx4M0rH/1ow00O7brEi56rAU
+jtgHqSSY3ekJvqgiG1k50SeH3BzN+Puz6+mTeO0Pzjd8JnduodgsIUzkik/HEzxux9UTl7Ko2yRp
+g1bTacuCErudG/L4NPKYKyqOBGf244ehHa1uzjZ0Dl4zO8vbUZeUapU8zhhabkvG/AePLhq5Svdk
+NCncpo1Q4Y2LS+VIG24ugBA/5J8bZT8RtOpXaZ+0AOuFJJkk9SGdl6r7NH8CaxWQrbueWhl/pIzY
++m0o/DjH40ytas7ZTpOSjswMZ78LS5bOZmdTaMsXEY5Z96ycG7mOaES3GK/m5Q9l3JUJsJMStR8+
+lKXHiHUhsd4JJCpM4rzsTGdHwimIuQq6+cF0zowYJmXa92/GjHtoXAvuY8BeS/FOzJ8vD+HomnqT
+8eDI278n5mUpezbgMxVz8p1rhAhoKzYHKyfMeNhqhw5HdPSqoBNdZH702xSu+zrkL8Fl47l6QGzw
+Brd7KJvX4V84c5Ss2XCTLdyEr0YconosP4EmQufU2MVshGYRi3drVByjtdgQ8K4p92cIiBdcuJd5
+z+orKu5YM+Vt6SmqZQENghPsJQtdLEByFSnTkCz3GkPVavBpAgMBAAGjYzBhMA8GA1UdEwEB/wQF
+MAMBAf8wHwYDVR0jBBgwFoAU8snBDw1jALvsRQ5KH7WxszbNDo0wHQYDVR0OBBYEFPLJwQ8NYwC7
+7EUOSh+1sbM2zQ6NMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQwFAAOCAgEANGd5sjrG5T33
+I3K5Ce+SrScfoE4KsvXaFwyihdJ+klH9FWXXXGtkFu6KRcoMQzZENdl//nk6HOjG5D1rd9QhEOP2
+8yBOqb6J8xycqd+8MDoX0TJD0KqKchxRKEzdNsjkLWd9kYccnbz8qyiWXmFcuCIzGEgWUOrKL+ml
+Sdx/PKQZvDatkuK59EvV6wit53j+F8Bdh3foZ3dPAGav9LEDOr4SfEE15fSmG0eLy3n31r8Xbk5l
+8PjaV8GUgeV6Vg27Rn9vkf195hfkgSe7BYhW3SCl95gtkRlpMV+bMPKZrXJAlszYd2abtNUOshD+
+FKrDgHGdPY3ofRRsYWSGRqbXVMW215AWRqWFyp464+YTFrYVI8ypKVL9AMb2kI5Wj4kI3Zaq5tNq
+qYY19tVFeEJKRvwDyF7YZvZFZSS0vod7VSCd9521Kvy5YhnLbDuv0204bKt7ph6N/Ome/msVuduC
+msuY33OhkKCgxeDoAaijFJzIwZqsFVAzje18KotzlUBDJvyBpCpfOZC3J8tRd/iWkx7P8nd9H0aT
+olkelUTFLXVksNb54Dxp6gS1HAviRkRNQzuXSXERvSS2wq1yVAb+axj5d9spLFKebXd7Yv0PTY6Y
+MjAwcRLWJTXjn/hvnLXrahut6hDTlhZyBiElxky8j3C7DOReIoMt0r7+hVu05L0=
+-----END CERTIFICATE-----
diff --git a/vendor/composer/ca-bundle/src/CaBundle.php b/vendor/composer/ca-bundle/src/CaBundle.php
new file mode 100644
index 0000000..6cf3b84
--- /dev/null
+++ b/vendor/composer/ca-bundle/src/CaBundle.php
@@ -0,0 +1,322 @@
+
+ *
+ * For the full copyright and license information, please view
+ * the LICENSE file that was distributed with this source code.
+ */
+
+namespace Composer\CaBundle;
+
+use Psr\Log\LoggerInterface;
+use Symfony\Component\Process\PhpProcess;
+
+/**
+ * @author Chris Smith 
+ * @author Jordi Boggiano 
+ */
+class CaBundle
+{
+    /** @var string|null */
+    private static $caPath;
+    /** @var array */
+    private static $caFileValidity = array();
+
+    /**
+     * Returns the system CA bundle path, or a path to the bundled one
+     *
+     * This method was adapted from Sslurp.
+     * https://github.com/EvanDotPro/Sslurp
+     *
+     * (c) Evan Coury 
+     *
+     * For the full copyright and license information, please see below:
+     *
+     * Copyright (c) 2013, Evan Coury
+     * All rights reserved.
+     *
+     * Redistribution and use in source and binary forms, with or without modification,
+     * are permitted provided that the following conditions are met:
+     *
+     *     * Redistributions of source code must retain the above copyright notice,
+     *       this list of conditions and the following disclaimer.
+     *
+     *     * Redistributions in binary form must reproduce the above copyright notice,
+     *       this list of conditions and the following disclaimer in the documentation
+     *       and/or other materials provided with the distribution.
+     *
+     * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+     * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+     * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+     * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+     * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+     * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+     * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+     * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+     * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+     * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+     *
+     * @param  LoggerInterface $logger optional logger for information about which CA files were loaded
+     * @return string          path to a CA bundle file or directory
+     */
+    public static function getSystemCaRootBundlePath(?LoggerInterface $logger = null)
+    {
+        if (self::$caPath !== null) {
+            return self::$caPath;
+        }
+        $caBundlePaths = array();
+
+        // If SSL_CERT_FILE env variable points to a valid certificate/bundle, use that.
+        // This mimics how OpenSSL uses the SSL_CERT_FILE env variable.
+        $caBundlePaths[] = self::getEnvVariable('SSL_CERT_FILE');
+
+        // If SSL_CERT_DIR env variable points to a valid certificate/bundle, use that.
+        // This mimics how OpenSSL uses the SSL_CERT_FILE env variable.
+        $caBundlePaths[] = self::getEnvVariable('SSL_CERT_DIR');
+
+        $caBundlePaths[] = ini_get('openssl.cafile');
+        $caBundlePaths[] = ini_get('openssl.capath');
+
+        $otherLocations = array(
+            '/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem', // Fedora, RHEL, CentOS (ca-certificates package) - NEW
+            '/etc/pki/tls/certs/ca-bundle.crt', // Fedora, RHEL, CentOS (ca-certificates package) - Deprecated
+            '/etc/ssl/certs/ca-certificates.crt', // Debian, Ubuntu, Gentoo, Arch Linux (ca-certificates package)
+            '/etc/ssl/ca-bundle.pem', // SUSE, openSUSE (ca-certificates package)
+            '/usr/ssl/certs/ca-bundle.crt', // Cygwin
+            '/opt/local/share/curl/curl-ca-bundle.crt', // OS X macports, curl-ca-bundle package
+            '/usr/local/share/curl/curl-ca-bundle.crt', // Default cURL CA bunde path (without --with-ca-bundle option)
+            '/usr/share/ssl/certs/ca-bundle.crt', // Really old RedHat?
+            '/etc/ssl/cert.pem', // OpenBSD
+            '/usr/local/etc/openssl/cert.pem', // OS X homebrew, openssl package
+            '/usr/local/etc/openssl@1.1/cert.pem', // OS X homebrew, openssl@1.1 package
+            '/opt/homebrew/etc/openssl@3/cert.pem', // macOS silicon homebrew, openssl@3 package
+            '/opt/homebrew/etc/openssl@1.1/cert.pem', // macOS silicon homebrew, openssl@1.1 package
+            '/etc/pki/tls/certs',
+            '/etc/ssl/certs', // FreeBSD
+        );
+
+        $caBundlePaths = array_merge($caBundlePaths, $otherLocations);
+
+        foreach ($caBundlePaths as $caBundle) {
+            if ($caBundle && self::caFileUsable($caBundle, $logger)) {
+                return self::$caPath = $caBundle;
+            }
+
+            if ($caBundle && self::caDirUsable($caBundle, $logger)) {
+                return self::$caPath = $caBundle;
+            }
+        }
+
+        return self::$caPath = static::getBundledCaBundlePath(); // Bundled CA file, last resort
+    }
+
+    /**
+     * Returns the path to the bundled CA file
+     *
+     * In case you don't want to trust the user or the system, you can use this directly
+     *
+     * @return string path to a CA bundle file
+     */
+    public static function getBundledCaBundlePath()
+    {
+        $caBundleFile = __DIR__.'/../res/cacert.pem';
+
+        // cURL does not understand 'phar://' paths
+        // see https://github.com/composer/ca-bundle/issues/10
+        if (0 === strpos($caBundleFile, 'phar://')) {
+            $tempCaBundleFile = tempnam(sys_get_temp_dir(), 'openssl-ca-bundle-');
+            if (false === $tempCaBundleFile) {
+                throw new \RuntimeException('Could not create a temporary file to store the bundled CA file');
+            }
+
+            file_put_contents(
+                $tempCaBundleFile,
+                file_get_contents($caBundleFile)
+            );
+
+            register_shutdown_function(function() use ($tempCaBundleFile) {
+                @unlink($tempCaBundleFile);
+            });
+
+            $caBundleFile = $tempCaBundleFile;
+        }
+
+        return $caBundleFile;
+    }
+
+    /**
+     * Validates a CA file using opensl_x509_parse only if it is safe to use
+     *
+     * @param string          $filename
+     * @param LoggerInterface $logger   optional logger for information about which CA files were loaded
+     *
+     * @return bool
+     */
+    public static function validateCaFile($filename, ?LoggerInterface $logger = null)
+    {
+        static $warned = false;
+
+        if (isset(self::$caFileValidity[$filename])) {
+            return self::$caFileValidity[$filename];
+        }
+
+        $contents = file_get_contents($filename);
+
+        if (is_string($contents) && strlen($contents) > 0) {
+            $contents = preg_replace("/^(\\-+(?:BEGIN|END))\\s+TRUSTED\\s+(CERTIFICATE\\-+)\$/m", '$1 $2', $contents);
+            if (null === $contents) {
+                // regex extraction failed
+                $isValid = false;
+            } else {
+                $isValid = (bool) openssl_x509_parse($contents);
+            }
+        } else {
+            $isValid = false;
+        }
+
+        if ($logger) {
+            $logger->debug('Checked CA file '.realpath($filename).': '.($isValid ? 'valid' : 'invalid'));
+        }
+
+        return self::$caFileValidity[$filename] = $isValid;
+    }
+
+    /**
+     * Test if it is safe to use the PHP function openssl_x509_parse().
+     *
+     * This checks if OpenSSL extensions is vulnerable to remote code execution
+     * via the exploit documented as CVE-2013-6420.
+     *
+     * @return bool
+     */
+    public static function isOpensslParseSafe()
+    {
+        return true;
+    }
+
+    /**
+     * Resets the static caches
+     * @return void
+     */
+    public static function reset()
+    {
+        self::$caFileValidity = array();
+        self::$caPath = null;
+    }
+
+    /**
+     * @param  string $name
+     * @return string|false
+     */
+    private static function getEnvVariable($name)
+    {
+        if (isset($_SERVER[$name])) {
+            return (string) $_SERVER[$name];
+        }
+
+        if (PHP_SAPI === 'cli' && ($value = getenv($name)) !== false && $value !== null) {
+            return (string) $value;
+        }
+
+        return false;
+    }
+
+    /**
+     * @param  string|false $certFile
+     * @param  LoggerInterface|null $logger
+     * @return bool
+     */
+    private static function caFileUsable($certFile, ?LoggerInterface $logger = null)
+    {
+        return $certFile
+            && self::isFile($certFile, $logger)
+            && self::isReadable($certFile, $logger)
+            && self::validateCaFile($certFile, $logger);
+    }
+
+    /**
+     * @param  string|false $certDir
+     * @param  LoggerInterface|null $logger
+     * @return bool
+     */
+    private static function caDirUsable($certDir, ?LoggerInterface $logger = null)
+    {
+        return $certDir
+            && self::isDir($certDir, $logger)
+            && self::isReadable($certDir, $logger)
+            && self::glob($certDir . '/*', $logger);
+    }
+
+    /**
+     * @param  string $certFile
+     * @param  LoggerInterface|null $logger
+     * @return bool
+     */
+    private static function isFile($certFile, ?LoggerInterface $logger = null)
+    {
+        $isFile = @is_file($certFile);
+        if (!$isFile && $logger) {
+            $logger->debug(sprintf('Checked CA file %s does not exist or it is not a file.', $certFile));
+        }
+
+        return $isFile;
+    }
+
+    /**
+     * @param  string $certDir
+     * @param  LoggerInterface|null $logger
+     * @return bool
+     */
+    private static function isDir($certDir, ?LoggerInterface $logger = null)
+    {
+        $isDir = @is_dir($certDir);
+        if (!$isDir && $logger) {
+            $logger->debug(sprintf('Checked directory %s does not exist or it is not a directory.', $certDir));
+        }
+
+        return $isDir;
+    }
+
+    /**
+     * @param  string $certFileOrDir
+     * @param  LoggerInterface|null $logger
+     * @return bool
+     */
+    private static function isReadable($certFileOrDir, ?LoggerInterface $logger = null)
+    {
+        $isReadable = @is_readable($certFileOrDir);
+        if (!$isReadable && $logger) {
+            $logger->debug(sprintf('Checked file or directory %s is not readable.', $certFileOrDir));
+        }
+
+        return $isReadable;
+    }
+
+    /**
+     * @param  string $pattern
+     * @param  LoggerInterface|null $logger
+     * @return bool
+     */
+    private static function glob($pattern, ?LoggerInterface $logger = null)
+    {
+        $certs = glob($pattern);
+        if ($certs === false) {
+            if ($logger) {
+                $logger->debug(sprintf("An error occurred while trying to find certificates for pattern: %s", $pattern));
+            }
+            return false;
+        }
+
+        if (count($certs) === 0) {
+            if ($logger) {
+                $logger->debug(sprintf("No CA files found for pattern: %s", $pattern));
+            }
+            return false;
+        }
+
+        return true;
+    }
+}
diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json
new file mode 100644
index 0000000..0e8f6f6
--- /dev/null
+++ b/vendor/composer/installed.json
@@ -0,0 +1,486 @@
+{
+    "packages": [
+        {
+            "name": "automattic/woocommerce",
+            "version": "3.1.0",
+            "version_normalized": "3.1.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/woocommerce/wc-api-php.git",
+                "reference": "d3b292f04c0b3b21dced691ebad8be073a83b4ad"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/woocommerce/wc-api-php/zipball/d3b292f04c0b3b21dced691ebad8be073a83b4ad",
+                "reference": "d3b292f04c0b3b21dced691ebad8be073a83b4ad",
+                "shasum": ""
+            },
+            "require": {
+                "ext-curl": "*",
+                "ext-json": "*",
+                "php": ">= 7.1.0"
+            },
+            "require-dev": {
+                "overtrue/phplint": "7.4.x-dev",
+                "phpunit/phpunit": "^8",
+                "squizlabs/php_codesniffer": "3.*"
+            },
+            "time": "2022-03-18T21:46:17+00:00",
+            "type": "library",
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "Automattic\\WooCommerce\\": [
+                        "src/WooCommerce"
+                    ]
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Claudio Sanches",
+                    "email": "claudio.sanches@automattic.com"
+                }
+            ],
+            "description": "A PHP wrapper for the WooCommerce REST API",
+            "keywords": [
+                "api",
+                "woocommerce"
+            ],
+            "support": {
+                "issues": "https://github.com/woocommerce/wc-api-php/issues",
+                "source": "https://github.com/woocommerce/wc-api-php/tree/3.1.0"
+            },
+            "install-path": "../automattic/woocommerce"
+        },
+        {
+            "name": "composer/ca-bundle",
+            "version": "1.5.10",
+            "version_normalized": "1.5.10.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/composer/ca-bundle.git",
+                "reference": "961a5e4056dd2e4a2eedcac7576075947c28bf63"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/composer/ca-bundle/zipball/961a5e4056dd2e4a2eedcac7576075947c28bf63",
+                "reference": "961a5e4056dd2e4a2eedcac7576075947c28bf63",
+                "shasum": ""
+            },
+            "require": {
+                "ext-openssl": "*",
+                "ext-pcre": "*",
+                "php": "^7.2 || ^8.0"
+            },
+            "require-dev": {
+                "phpstan/phpstan": "^1.10",
+                "phpunit/phpunit": "^8 || ^9",
+                "psr/log": "^1.0 || ^2.0 || ^3.0",
+                "symfony/process": "^4.0 || ^5.0 || ^6.0 || ^7.0"
+            },
+            "time": "2025-12-08T15:06:51+00:00",
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.x-dev"
+                }
+            },
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "Composer\\CaBundle\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Jordi Boggiano",
+                    "email": "j.boggiano@seld.be",
+                    "homepage": "http://seld.be"
+                }
+            ],
+            "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.",
+            "keywords": [
+                "cabundle",
+                "cacert",
+                "certificate",
+                "ssl",
+                "tls"
+            ],
+            "support": {
+                "irc": "irc://irc.freenode.org/composer",
+                "issues": "https://github.com/composer/ca-bundle/issues",
+                "source": "https://github.com/composer/ca-bundle/tree/1.5.10"
+            },
+            "funding": [
+                {
+                    "url": "https://packagist.com",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/composer",
+                    "type": "github"
+                }
+            ],
+            "install-path": "./ca-bundle"
+        },
+        {
+            "name": "mollie/mollie-api-php",
+            "version": "v3.7.0",
+            "version_normalized": "3.7.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/mollie/mollie-api-php.git",
+                "reference": "55f843fd3944c4c9ed08ac1d5929084305b82b8b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/mollie/mollie-api-php/zipball/55f843fd3944c4c9ed08ac1d5929084305b82b8b",
+                "reference": "55f843fd3944c4c9ed08ac1d5929084305b82b8b",
+                "shasum": ""
+            },
+            "require": {
+                "composer/ca-bundle": "^1.4",
+                "ext-curl": "*",
+                "ext-json": "*",
+                "ext-openssl": "*",
+                "nyholm/psr7": "^1.8",
+                "php": "^7.4|^8.0",
+                "psr/http-client": "^1.0",
+                "psr/http-factory": "^1.1",
+                "psr/http-message": "^1.1|^2.0"
+            },
+            "require-dev": {
+                "brianium/paratest": "^6.11",
+                "guzzlehttp/guzzle": "^7.6",
+                "phpstan/phpstan": "^2.0",
+                "phpunit/phpunit": "^9.6",
+                "symfony/var-dumper": "^5.4|^6.4|^7.2"
+            },
+            "suggest": {
+                "mollie/oauth2-mollie-php": "Use OAuth to authenticate with the Mollie API. This is needed for some endpoints. Visit https://docs.mollie.com/ for more information."
+            },
+            "time": "2025-12-01T09:03:27+00:00",
+            "type": "library",
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "Mollie\\Api\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-2-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Mollie B.V.",
+                    "email": "info@mollie.com"
+                }
+            ],
+            "description": "Mollie API client library for PHP. Mollie is a European Payment Service provider and offers international payment methods such as Mastercard, VISA, American Express and PayPal, and local payment methods such as iDEAL, Bancontact, SOFORT Banking, SEPA direct debit, Belfius Direct Net, KBC Payment Button and various gift cards such as Podiumcadeaukaart and fashioncheque.",
+            "homepage": "https://www.mollie.com/en/developers",
+            "keywords": [
+                "Apple Pay",
+                "CBC",
+                "Przelewy24",
+                "api",
+                "bancontact",
+                "banktransfer",
+                "belfius",
+                "belfius direct net",
+                "charges",
+                "creditcard",
+                "direct debit",
+                "fashioncheque",
+                "gateway",
+                "gift cards",
+                "ideal",
+                "inghomepay",
+                "intersolve",
+                "kbc",
+                "klarna",
+                "mistercash",
+                "mollie",
+                "paylater",
+                "payment",
+                "payments",
+                "paypal",
+                "paysafecard",
+                "podiumcadeaukaart",
+                "recurring",
+                "refunds",
+                "sepa",
+                "service",
+                "sliceit",
+                "sofort",
+                "sofortbanking",
+                "subscriptions"
+            ],
+            "support": {
+                "issues": "https://github.com/mollie/mollie-api-php/issues",
+                "source": "https://github.com/mollie/mollie-api-php/tree/v3.7.0"
+            },
+            "install-path": "../mollie/mollie-api-php"
+        },
+        {
+            "name": "nyholm/psr7",
+            "version": "1.8.2",
+            "version_normalized": "1.8.2.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/Nyholm/psr7.git",
+                "reference": "a71f2b11690f4b24d099d6b16690a90ae14fc6f3"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/Nyholm/psr7/zipball/a71f2b11690f4b24d099d6b16690a90ae14fc6f3",
+                "reference": "a71f2b11690f4b24d099d6b16690a90ae14fc6f3",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.2",
+                "psr/http-factory": "^1.0",
+                "psr/http-message": "^1.1 || ^2.0"
+            },
+            "provide": {
+                "php-http/message-factory-implementation": "1.0",
+                "psr/http-factory-implementation": "1.0",
+                "psr/http-message-implementation": "1.0"
+            },
+            "require-dev": {
+                "http-interop/http-factory-tests": "^0.9",
+                "php-http/message-factory": "^1.0",
+                "php-http/psr7-integration-tests": "^1.0",
+                "phpunit/phpunit": "^7.5 || ^8.5 || ^9.4",
+                "symfony/error-handler": "^4.4"
+            },
+            "time": "2024-09-09T07:06:30+00:00",
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.8-dev"
+                }
+            },
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "Nyholm\\Psr7\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Tobias Nyholm",
+                    "email": "tobias.nyholm@gmail.com"
+                },
+                {
+                    "name": "Martijn van der Ven",
+                    "email": "martijn@vanderven.se"
+                }
+            ],
+            "description": "A fast PHP7 implementation of PSR-7",
+            "homepage": "https://tnyholm.se",
+            "keywords": [
+                "psr-17",
+                "psr-7"
+            ],
+            "support": {
+                "issues": "https://github.com/Nyholm/psr7/issues",
+                "source": "https://github.com/Nyholm/psr7/tree/1.8.2"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/Zegnat",
+                    "type": "github"
+                },
+                {
+                    "url": "https://github.com/nyholm",
+                    "type": "github"
+                }
+            ],
+            "install-path": "../nyholm/psr7"
+        },
+        {
+            "name": "psr/http-client",
+            "version": "1.0.3",
+            "version_normalized": "1.0.3.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/http-client.git",
+                "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90",
+                "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.0 || ^8.0",
+                "psr/http-message": "^1.0 || ^2.0"
+            },
+            "time": "2023-09-23T14:17:50+00:00",
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Http\\Client\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "https://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interface for HTTP clients",
+            "homepage": "https://github.com/php-fig/http-client",
+            "keywords": [
+                "http",
+                "http-client",
+                "psr",
+                "psr-18"
+            ],
+            "support": {
+                "source": "https://github.com/php-fig/http-client"
+            },
+            "install-path": "../psr/http-client"
+        },
+        {
+            "name": "psr/http-factory",
+            "version": "1.1.0",
+            "version_normalized": "1.1.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/http-factory.git",
+                "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a",
+                "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1",
+                "psr/http-message": "^1.0 || ^2.0"
+            },
+            "time": "2024-04-15T12:06:14+00:00",
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Http\\Message\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "https://www.php-fig.org/"
+                }
+            ],
+            "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories",
+            "keywords": [
+                "factory",
+                "http",
+                "message",
+                "psr",
+                "psr-17",
+                "psr-7",
+                "request",
+                "response"
+            ],
+            "support": {
+                "source": "https://github.com/php-fig/http-factory"
+            },
+            "install-path": "../psr/http-factory"
+        },
+        {
+            "name": "psr/http-message",
+            "version": "2.0",
+            "version_normalized": "2.0.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/http-message.git",
+                "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71",
+                "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.2 || ^8.0"
+            },
+            "time": "2023-04-04T09:54:51+00:00",
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0.x-dev"
+                }
+            },
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Http\\Message\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "https://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interface for HTTP messages",
+            "homepage": "https://github.com/php-fig/http-message",
+            "keywords": [
+                "http",
+                "http-message",
+                "psr",
+                "psr-7",
+                "request",
+                "response"
+            ],
+            "support": {
+                "source": "https://github.com/php-fig/http-message/tree/2.0"
+            },
+            "install-path": "../psr/http-message"
+        }
+    ],
+    "dev": true,
+    "dev-package-names": []
+}
diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php
new file mode 100644
index 0000000..d19b1e8
--- /dev/null
+++ b/vendor/composer/installed.php
@@ -0,0 +1,104 @@
+ array(
+        'name' => '__root__',
+        'pretty_version' => 'dev-main',
+        'version' => 'dev-main',
+        'reference' => 'fcc8adacf8bb9c105b4b60530c87773c07741996',
+        'type' => 'library',
+        'install_path' => __DIR__ . '/../../',
+        'aliases' => array(),
+        'dev' => true,
+    ),
+    'versions' => array(
+        '__root__' => array(
+            'pretty_version' => 'dev-main',
+            'version' => 'dev-main',
+            'reference' => 'fcc8adacf8bb9c105b4b60530c87773c07741996',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../../',
+            'aliases' => array(),
+            'dev_requirement' => false,
+        ),
+        'automattic/woocommerce' => array(
+            'pretty_version' => '3.1.0',
+            'version' => '3.1.0.0',
+            'reference' => 'd3b292f04c0b3b21dced691ebad8be073a83b4ad',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../automattic/woocommerce',
+            'aliases' => array(),
+            'dev_requirement' => false,
+        ),
+        'composer/ca-bundle' => array(
+            'pretty_version' => '1.5.10',
+            'version' => '1.5.10.0',
+            'reference' => '961a5e4056dd2e4a2eedcac7576075947c28bf63',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/./ca-bundle',
+            'aliases' => array(),
+            'dev_requirement' => false,
+        ),
+        'mollie/mollie-api-php' => array(
+            'pretty_version' => 'v3.7.0',
+            'version' => '3.7.0.0',
+            'reference' => '55f843fd3944c4c9ed08ac1d5929084305b82b8b',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../mollie/mollie-api-php',
+            'aliases' => array(),
+            'dev_requirement' => false,
+        ),
+        'nyholm/psr7' => array(
+            'pretty_version' => '1.8.2',
+            'version' => '1.8.2.0',
+            'reference' => 'a71f2b11690f4b24d099d6b16690a90ae14fc6f3',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../nyholm/psr7',
+            'aliases' => array(),
+            'dev_requirement' => false,
+        ),
+        'php-http/message-factory-implementation' => array(
+            'dev_requirement' => false,
+            'provided' => array(
+                0 => '1.0',
+            ),
+        ),
+        'psr/http-client' => array(
+            'pretty_version' => '1.0.3',
+            'version' => '1.0.3.0',
+            'reference' => 'bb5906edc1c324c9a05aa0873d40117941e5fa90',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../psr/http-client',
+            'aliases' => array(),
+            'dev_requirement' => false,
+        ),
+        'psr/http-factory' => array(
+            'pretty_version' => '1.1.0',
+            'version' => '1.1.0.0',
+            'reference' => '2b4765fddfe3b508ac62f829e852b1501d3f6e8a',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../psr/http-factory',
+            'aliases' => array(),
+            'dev_requirement' => false,
+        ),
+        'psr/http-factory-implementation' => array(
+            'dev_requirement' => false,
+            'provided' => array(
+                0 => '1.0',
+            ),
+        ),
+        'psr/http-message' => array(
+            'pretty_version' => '2.0',
+            'version' => '2.0.0.0',
+            'reference' => '402d35bcb92c70c026d1a6a9883f06b2ead23d71',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../psr/http-message',
+            'aliases' => array(),
+            'dev_requirement' => false,
+        ),
+        'psr/http-message-implementation' => array(
+            'dev_requirement' => false,
+            'provided' => array(
+                0 => '1.0',
+            ),
+        ),
+    ),
+);
diff --git a/vendor/composer/platform_check.php b/vendor/composer/platform_check.php
new file mode 100644
index 0000000..d2225c7
--- /dev/null
+++ b/vendor/composer/platform_check.php
@@ -0,0 +1,25 @@
+= 70400)) {
+    $issues[] = 'Your Composer dependencies require a PHP version ">= 7.4.0". You are running ' . PHP_VERSION . '.';
+}
+
+if ($issues) {
+    if (!headers_sent()) {
+        header('HTTP/1.1 500 Internal Server Error');
+    }
+    if (!ini_get('display_errors')) {
+        if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {
+            fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL);
+        } elseif (!headers_sent()) {
+            echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL;
+        }
+    }
+    throw new \RuntimeException(
+        'Composer detected issues in your platform: ' . implode(' ', $issues)
+    );
+}
diff --git a/vendor/mollie/mollie-api-php/CHANGELOG.md b/vendor/mollie/mollie-api-php/CHANGELOG.md
new file mode 100644
index 0000000..5263192
--- /dev/null
+++ b/vendor/mollie/mollie-api-php/CHANGELOG.md
@@ -0,0 +1,214 @@
+# Changelog
+
+Starting with v3, all notable changes to this project will be documented in this file.
+
+The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
+and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+
+## [Unreleased](https://github.com/mollie/mollie-api-php/compare/v3.6.0...HEAD)
+
+## [v3.6.0](https://github.com/mollie/mollie-api-php/compare/v3.5.0...v3.6.0) - 2025-11-05
+
+### What's Changed
+
+* Feat/add balance transfer webhook events by @sandervanhooft in https://github.com/mollie/mollie-api-php/pull/842
+* Fixed webhook docs typo and explained next-gen webhook focus by @sandervanhooft in https://github.com/mollie/mollie-api-php/pull/841
+
+**Full Changelog**: https://github.com/mollie/mollie-api-php/compare/v3.5.0...v3.6.0
+
+## [v3.5.0](https://github.com/mollie/mollie-api-php/compare/v3.4.0...v3.5.0) - 2025-10-28
+
+### Added
+
+* Feat/add retry logic by @Naoray in https://github.com/mollie/mollie-api-php/pull/826
+* Feat/add fake retain requests option by @Naoray in https://github.com/mollie/mollie-api-php/pull/830
+* feat: add isEInvoice param and add support for testmode in all sales-… by @Naoray in https://github.com/mollie/mollie-api-php/pull/832
+* feat: add customerId and mandateId to create sales invoice request by @Naoray in https://github.com/mollie/mollie-api-php/pull/834
+* Feat/add balance transfer endpoint by @Naoray in https://github.com/mollie/mollie-api-php/pull/831
+* Feat/add webhook mapping and events by @Naoray in https://github.com/mollie/mollie-api-php/pull/829
+  - global Config that serves as a lookup map to easily map resources to their respective collection keys
+  - `MockEvent` to easily test event handling
+  - `Str` utility class
+  - `classBasename` to `Utility`
+  - `WebhookEntity` to serve as Container for Resource data received through webhooks (-> can be transformed into BaseResource)
+  - Webhook Events that are instanced via the `WebhookEventMapper`
+  
+
+### Changed
+
+- Feat/make sequence mock responses consume callables by @Naoray in https://github.com/mollie/mollie-api-php/pull/833
+
+### Fixed
+
+* Change include to embed just like in GetPaginatedChargebacksRequest.php #837 by @Naoray in https://github.com/mollie/mollie-api-php/pull/838
+* Allow description on CreatePaymentRefundRequest to be empty by @Naoray in https://github.com/mollie/mollie-api-php/pull/839
+
+**Full Changelog**: https://github.com/mollie/mollie-api-php/compare/v3.4.0...v3.5.0
+
+## [v3.4.0](https://github.com/mollie/mollie-api-php/compare/v3.3.3...v3.4.0) - 2025-08-13
+
+### What's Changed
+
+* Feat/add new payment route endpoints by @Naoray in https://github.com/mollie/mollie-api-php/pull/825
+
+**Full Changelog**: https://github.com/mollie/mollie-api-php/compare/v3.3.3...v3.4.0
+
+## [v3.3.3](https://github.com/mollie/mollie-api-php/compare/v3.3.2...v3.3.3) - 2025-08-12
+
+## What's Changed
+
+* Fix/823 inconsistencies on payment link request by @Naoray in https://github.com/mollie/mollie-api-php/pull/824
+
+**Full Changelog**: https://github.com/mollie/mollie-api-php/compare/v3.3.2...v3.3.3
+
+## [v3.3.2](https://github.com/mollie/mollie-api-php/compare/v3.3.1...v3.3.2) - 2025-07-25
+
+## What's Changed
+
+* Fix/819 signature date invalid by @Naoray in https://github.com/mollie/mollie-api-php/pull/820
+
+**Full Changelog**: https://github.com/mollie/mollie-api-php/compare/v3.3.1...v3.3.2
+
+## [v3.3.1](https://github.com/mollie/mollie-api-php/compare/v3.3.0...v3.3.1) - 2025-07-25
+
+### What's Changed
+
+* fix: signature validator handling null signatures by @Naoray in https://github.com/mollie/mollie-api-php/pull/822
+
+**Full Changelog**: https://github.com/mollie/mollie-api-php/compare/v3.3.0...v3.3.1
+
+## [v3.3.0](https://github.com/mollie/mollie-api-php/compare/v3.2.0...v3.3.0) - 2025-07-25
+
+## What's Changed
+
+* Feat/expose webhook signature header by @Naoray in https://github.com/mollie/mollie-api-php/pull/821
+* Feat/expose webhook signature creation by @Naoray
+
+## [v3.2.0](https://github.com/mollie/mollie-api-php/compare/v3.1.5...v3.2.0) - 2025-07-23
+
+### What's Changed
+
+* Feat/add create webhook endpoint by @Naoray in https://github.com/mollie/mollie-api-php/pull/812
+* Feat/webhook signature verification by @Naoray in https://github.com/mollie/mollie-api-php/pull/813
+
+**Full Changelog**: https://github.com/mollie/mollie-api-php/compare/v3.1.5...v3.2.0
+
+## [v3.1.5](https://github.com/mollie/mollie-api-php/compare/v3.1.4...v3.1.5) - 2025-07-10
+
+### What's Changed
+
+* Fix: allow array of payment methods when creating a payment by @jockri in https://github.com/mollie/mollie-api-php/pull/811
+* Sandervanhooft fix/recipe classes by @Naoray in https://github.com/mollie/mollie-api-php/pull/815
+* Fix class references on recipes by @sandervanhooft in https://github.com/mollie/mollie-api-php/pull/814
+* Fix payment links expiresAt by @sandervanhooft in https://github.com/mollie/mollie-api-php/pull/817
+* Change "include" into "embed" on GetPaginatedChargebacksRequest by @sandervanhooft in https://github.com/mollie/mollie-api-php/pull/818
+
+### New Contributors
+
+* @jockri made their first contribution in https://github.com/mollie/mollie-api-php/pull/811
+
+**Full Changelog**: https://github.com/mollie/mollie-api-php/compare/v3.1.4...v3.1.5
+
+## [v3.1.4](https://github.com/mollie/mollie-api-php/compare/v3.1.3...v3.1.4) - 2025-06-11
+
+## What's Changed
+
+* Fix 400 Bad Request on DELETE when store array is empty by @cswiers in https://github.com/mollie/mollie-api-php/pull/810
+
+## New Contributors
+
+* @cswiers made their first contribution in https://github.com/mollie/mollie-api-php/pull/810
+
+**Full Changelog**: https://github.com/mollie/mollie-api-php/compare/v3.1.3...v3.1.4
+
+## [v3.1.3](https://github.com/mollie/mollie-api-php/compare/v3.1.2...v3.1.3) - 2025-06-11
+
+**Full Changelog**: https://github.com/mollie/mollie-api-php/compare/v3.1.3...v3.1.3
+
+## [v3.1.2](https://github.com/mollie/mollie-api-php/compare/v3.1.1...v3.1.2) - 2025-06-10
+
+**Full Changelog**: https://github.com/mollie/mollie-api-php/compare/v3.1.1...v3.1.2
+
+## [v3.1.1](https://github.com/mollie/mollie-api-php/compare/v3.1.0...v3.1.1) - 2025-06-10
+
+## What's Changed
+
+* Fix/include resources by @Naoray in https://github.com/mollie/mollie-api-php/pull/808
+
+**Full Changelog**: https://github.com/mollie/mollie-api-php/compare/v3.1.0...v3.1.1
+
+## [v3.1.0](https://github.com/mollie/mollie-api-php/compare/v3.0.6...v3.1.0) - 2025-06-05
+
+### What's Changed
+
+* Main by @Naoray in https://github.com/mollie/mollie-api-php/pull/804
+* feat: add status reason to payment resource by @Naoray in https://github.com/mollie/mollie-api-php/pull/806
+
+**Full Changelog**: https://github.com/mollie/mollie-api-php/compare/v3.0.6...v3.1.0
+
+## [v3.0.6](https://github.com/mollie/mollie-api-php/compare/v1.0.0-test...v3.0.6) - 2025-06-02
+
+### What's Changed
+
+* Amend capturable recipe by @fjbender in https://github.com/mollie/mollie-api-php/pull/796
+* fix: exchange wrong request name by @Naoray in https://github.com/mollie/mollie-api-php/pull/797
+* Removes nullability from delete() method, as it cannot return null by @Sjustein in https://github.com/mollie/mollie-api-php/pull/802
+* fix: use payload instead of query params for testmode by @Naoray in https://github.com/mollie/mollie-api-php/pull/803
+
+### New Contributors
+
+* @Sjustein made their first contribution in https://github.com/mollie/mollie-api-php/pull/802
+
+**Full Changelog**: https://github.com/mollie/mollie-api-php/compare/v3.0.5...v3.0.6
+
+## [v1.0.0-test](https://github.com/mollie/mollie-api-php/compare/v3.0.5...v1.0.0-test) - 2025-06-02
+
+### What's Changed
+
+* Amend capturable recipe by @fjbender in https://github.com/mollie/mollie-api-php/pull/796
+* fix: exchange wrong request name by @Naoray in https://github.com/mollie/mollie-api-php/pull/797
+* Removes nullability from delete() method, as it cannot return null by @Sjustein in https://github.com/mollie/mollie-api-php/pull/802
+* fix: use payload instead of query params for testmode by @Naoray in https://github.com/mollie/mollie-api-php/pull/803
+
+### New Contributors
+
+* @Sjustein made their first contribution in https://github.com/mollie/mollie-api-php/pull/802
+
+**Full Changelog**: https://github.com/mollie/mollie-api-php/compare/v3.0.5...v1.0.0-test
+
+## [v3.0.5](https://github.com/mollie/mollie-api-php/compare/v3.0.4...v3.0.5) - 2025-04-27
+
+### What's Changed
+
+* Fix/791 data types may mess up property order by @Naoray in https://github.com/mollie/mollie-api-php/pull/794
+
+**Full Changelog**: https://github.com/mollie/mollie-api-php/compare/v3.0.4...v3.0.5
+
+## [v3.0.4](https://github.com/mollie/mollie-api-php/compare/v3.0.3...v3.0.4) - 2025-04-25
+
+### What's Changed
+
+* Chore/allow psr message v1 by @Naoray in https://github.com/mollie/mollie-api-php/pull/793
+* Fix/789 remove overhault to resource calls by @Naoray in https://github.com/mollie/mollie-api-php/pull/792
+
+**Full Changelog**: https://github.com/mollie/mollie-api-php/compare/v3.0.3...v3.0.4
+
+## [v3.0.3](https://github.com/mollie/mollie-api-php/compare/v3.0.2...v3.0.3) - 2025-04-23
+
+### What's Changed
+
+* Fixed docs links by @sandervanhooft in https://github.com/mollie/mollie-api-php/pull/787
+* Feat/small improvements by @Naoray in https://github.com/mollie/mollie-api-php/pull/788
+  * make `MockResponse` serializable
+  * add changed `$metadata` handling to upgrade guide
+  
+
+**Full Changelog**: https://github.com/mollie/mollie-api-php/compare/v3.0.2...v3.0.3
+
+## [v3.0.2](https://github.com/mollie/mollie-api-php/compare/v3.0.0...v3.0.2) - 2025-04-17
+
+### What's Changed
+
+* handle nullable 422 exception field by @sandervanhooft in https://github.com/mollie/mollie-api-php/pull/786
+
+**Full Changelog**: https://github.com/mollie/mollie-api-php/compare/v3.0.1...v3.0.2
diff --git a/vendor/mollie/mollie-api-php/LICENSE b/vendor/mollie/mollie-api-php/LICENSE
new file mode 100644
index 0000000..12c9d8d
--- /dev/null
+++ b/vendor/mollie/mollie-api-php/LICENSE
@@ -0,0 +1,8 @@
+Copyright (c) 2013-2016, Mollie B.V.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/mollie/mollie-api-php/README.md b/vendor/mollie/mollie-api-php/README.md
new file mode 100644
index 0000000..5c114a1
--- /dev/null
+++ b/vendor/mollie/mollie-api-php/README.md
@@ -0,0 +1,117 @@
+

+ +

+ +

Mollie API client for PHP

+ +
+ +[![Build Status](https://github.com/mollie/mollie-api-php/workflows/tests/badge.svg)](https://github.com/mollie/mollie-api-php/actions) +[![Latest Stable Version](https://poser.pugx.org/mollie/mollie-api-php/v/stable)](https://packagist.org/packages/mollie/mollie-api-php) +[![Total Downloads](https://poser.pugx.org/mollie/mollie-api-php/downloads)](https://packagist.org/packages/mollie/mollie-api-php) +[![GitHub Code Style Action Status](https://img.shields.io/github/actions/workflow/status/mollie/mollie-api-php/fix-php-code-style-issues.yml?branch=main&label=code%20style&style=flat-square)](https://github.com/mollie/mollie-api-php/actions?query=workflow%3A"Fix+Code+Style"+branch%3Amain) + +
+ +Accepting [iDEAL](https://www.mollie.com/payments/ideal/), [Apple Pay](https://www.mollie.com/payments/apple-pay), [Google Pay](https://www.mollie.com/payments/googlepay), [Creditcard](https://www.mollie.com/payments/credit-card/), [Bancontact](https://www.mollie.com/payments/bancontact/), [SOFORT Banking](https://www.mollie.com/payments/sofort/), [SEPA Bank transfer](https://www.mollie.com/payments/bank-transfer/), [SEPA Direct debit](https://www.mollie.com/payments/direct-debit/), [PayPal](https://www.mollie.com/payments/paypal/), [Belfius Direct Net](https://www.mollie.com/payments/belfius/), [KBC/CBC](https://www.mollie.com/payments/kbc-cbc/), [paysafecard](https://www.mollie.com/payments/paysafecard/), [ING Home'Pay](https://www.mollie.com/payments/ing-homepay/), [Giropay](https://www.mollie.com/payments/giropay/), [EPS](https://www.mollie.com/payments/eps/), [Przelewy24](https://www.mollie.com/payments/przelewy24/), [Postepay](https://www.mollie.com/en/payments/postepay), [In3](https://www.mollie.com/payments/in3/), [Klarna](https://www.mollie.com/payments/klarna-pay-later/) ([Pay now](https://www.mollie.com/payments/klarna-pay-now/), [Pay later](https://www.mollie.com/payments/klarna-pay-later/), [Slice it](https://www.mollie.com/payments/klarna-slice-it/), [Pay in 3](https://www.mollie.com/payments/klarna-pay-in-3/)), [Giftcard](https://www.mollie.com/payments/gift-cards/) and [Voucher](https://www.mollie.com/en/payments/meal-eco-gift-vouchers) online payments without fixed monthly costs or any punishing registration procedures. Just use the Mollie API to receive payments directly on your website or easily refund transactions to your customers. + +## Requirements ## +To use the Mollie API client, the following things are required: + ++ Get yourself a free [Mollie account](https://www.mollie.com/signup). No sign up costs. ++ Now you're ready to use the Mollie API client in test mode. ++ Follow [a few steps](https://www.mollie.com/dashboard/?modal=onboarding) to enable payment methods in live mode, and let us handle the rest. ++ PHP >= 7.4 ++ cUrl >= 7.19.4 ++ Up-to-date OpenSSL (or other SSL/TLS toolkit) + +For leveraging [Mollie Connect](https://docs.mollie.com/oauth/overview) (advanced use cases only), we recommend also installing our [OAuth2 client](https://github.com/mollie/oauth2-mollie-php). + +## Installation ## +### Using Composer ### + +The easiest way to install the Mollie API client is by using [Composer](http://getcomposer.org/doc/00-intro.md). You can require it with the following command: + +```bash +composer require mollie/mollie-api-php +``` + +## Usage ## + +Initializing the Mollie API client, and setting your API key. + +```php +$mollie = new \Mollie\Api\MollieApiClient(); +$mollie->setApiKey("test_dHar4XY7LxsDOtmnkVtjNVWXLSlXsM"); +``` + +Find our full documentation online on [docs.mollie.com](https://docs.mollie.com). + +#### Example usage #### +```php +use Mollie\Api\Http\Data\Money; +use Mollie\Api\Http\Requests\CreatePaymentRequest; + +/** @var Mollie\Api\Resources\Payment $payment */ +$payment = $mollie->send(new CreatePaymentRequest( + description: 'My first API payment', + amount: new Money('EUR', '10.00'), + redirectUrl: 'https://webshop.example.org/order/12345/', + webhookUrl: 'https://webshop.example.org/mollie-webhook/' +)); +``` + +## Documentation +For an in-depth understanding of our API, please explore the [Mollie Developer Portal](https://www.mollie.com/developers). Our API documentation is available in English. + +For detailed documentation about using this PHP client, see the following guides: + +- [Endpoint Collections](docs/endpoint-collections.md) - Learn how to interact with all available API endpoints. +- [HTTP Adapters](docs/http-adapters.md) - Information on customizing HTTP communication. +- [Idempotency](docs/idempotency.md) - Best practices and setup for idempotent requests. +- [Payments](docs/payments.md) - Comprehensive guide on handling payments. +- [Requests](docs/requests.md) - Overview and usage of request objects in the API client. +- [Responses](docs/responses.md) - Handling and understanding responses from the API. +- [Testing](docs/testing.md) - Guidelines for testing with the Mollie API client. +- [Debugging](docs/debugging.md) - How to debug API requests and responses safely. +- [Webhooks](docs/webhooks.md) - How to process Webhook requests + +These guides provide in-depth explanations and examples for advanced usage of the client. + +## Recipes + +The Mollie API client comes with a variety of recipes to help you understand how to implement various API features. These recipes are a great resource for learning how to integrate Mollie payments into your application. + +Here are some of the key recipes included: + +- **Payments**: Demonstrates how to handle various payment scenarios. + - [Create a payment](docs/recipes/payments/create-payment.md) + - [Create a capturable payment](docs/recipes/payments/create-capturable-payment.md) + - [Handle webhooks](docs/recipes/payments/handle-webhook.md) + - [Refund payments](docs/recipes/payments/refund-payment.md) + +- **Customers**: Shows how to manage customers and their payments. + - [Manage customers](docs/recipes/customers/manage-customers.md) + - [Customer payments](docs/recipes/customers/customer-payments.md) + +- **Subscriptions and Recurring Payments**: + - [Manage mandates](docs/recipes/mandates/manage-mandates.md) + - [Manage subscriptions](docs/recipes/subscriptions/manage-subscriptions.md) + +For a full list of recipes, please refer to the [recipes directory](docs/recipes/). + +These recipes are designed to help you integrate Mollie into your application. Make sure to use your test API keys when testing the integration. + +## Upgrading + +Please see [UPGRADING](UPGRADING.md) for details. + +## Contributing to Our API Client ## +Would you like to contribute to improving our API client? We welcome [pull requests](https://github.com/mollie/mollie-api-php/pulls?utf8=%E2%9C%93&q=is%3Apr). But, if you're interested in contributing to a technology-focused organization, Mollie is actively recruiting developers and system engineers. Discover our current [job openings](https://jobs.mollie.com/) or [reach out](mailto:personeel@mollie.com). + +## License ## +[BSD (Berkeley Software Distribution) License](https://opensource.org/licenses/bsd-license.php). +Copyright (c) 2013-2018, Mollie B.V. + +## Support ## +Contact: [www.mollie.com](https://www.mollie.com) — info@mollie.com — +31 20 820 20 70 diff --git a/vendor/mollie/mollie-api-php/UPGRADING.md b/vendor/mollie/mollie-api-php/UPGRADING.md new file mode 100644 index 0000000..cc5eb79 --- /dev/null +++ b/vendor/mollie/mollie-api-php/UPGRADING.md @@ -0,0 +1,204 @@ +# Upgrading from v2 to v3 + +Welcome to Mollie API PHP v3! This guide will help you smoothly transition from v2 to v3. + +The codebase has significant improvements, focusing on modern PHP practices, enhanced type safety, and offers a more intuitive developer experience. + +## Breaking Changes + +### Deprecations + +#### MethodEndpointCollection.allActive() + +The method `MethodEndpointCollection.allActive()` has been removed. Use `MethodEndpointCollection.allEnabled()` instead. + +#### Order endpoint + +Orders: Mollie is deprecating the Order and Shipment endpoints so these have been removed from `mollie-api-php`. The same functionality is now available through the Payment endpoint as well. So, use the Payment endpoint instead. + + - All `/orders/*` endpoints and related classes (`Order*Endpoint`) + - Removed `MollieApiClient` properties: + ```php + $client->orderPayments; // Removed + $client->orderRefunds; // Removed + $client->orderLines; // Removed + $client->shipments; // Removed + ``` + +#### Integration code examples + +To prevent misuse the code samples in `/examples` were replaced by markdown "recipes", which can be found in `/docs/recipes`. + +### Metadata Type Restriction + +In v2, when making API requests, the metadata parameter accepted any type (string, array, object, etc.). In v3, metadata in request payloads is restricted to only accept arrays. Make sure to update your code to provide metadata as arrays when making API requests. + +```php +// Before (v2) - Using legacy array approach +$client->payments->create([ + "amount" => [ + "currency" => "EUR", + "value" => "10.00" + ], + "metadata" => "some string" // Worked in v2 +]); + +// After (v3) - Using legacy array approach +$client->payments->create([ + "amount" => [ + "currency" => "EUR", + "value" => "10.00" + ], + "metadata" => ["key" => "value"] // Only arrays are accepted in v3 +]); + +// After (v3) - Using request class +use Mollie\Api\Http\Data\Money; +use Mollie\Api\Http\Requests\CreatePaymentRequest; + +$request = new CreatePaymentRequest( + description: "My payment", + amount: new Money("EUR", "10.00"), + metadata: ["key" => "value"] // Only arrays are accepted +); +$payment = $client->send($request); +``` + +### Class & Method Renames + +#### Endpoint Class Changes +| Old Class | New Class | Method Changes | +|------------------------------|----------------------------------------|------------------------------------------------------------| +| `MethodEndpoint` | `MethodEndpointCollection` | `allAvailable()` → `all()`
`all()` → `allEnabled()` | +| `BalanceTransactionEndpoint` | `BalanceTransactionEndpointCollection` | `listFor()` → `pageFor()`
`listForId()` → `pageForId()` | +| `CustomerPaymentsEndpoint` | `CustomerPaymentsEndpointCollection` | `listFor()` → `pageFor()`
`listForId()` → `pageForId()` | +| `MandateEndpoint` | `MandateEndpointCollection` | `listFor()` → `pageFor()`
`listForId()` → `pageForId()` | +| `PaymentRefundEndpoint` | `PaymentRefundEndpointCollection` | `listFor()` → `pageFor()`
`listForId()` → `pageForId()` | +| `OnboardingEndpoint` | `OnboardingEndpointCollection` | `get()` → `status()` | +| `SubscriptionEndpoint` | `SubscriptionEndpointCollection` | `page()` → `allFor()` | + +#### Signature Changes +You can now use named parameters for improved readability and flexibility: + +```php +// Before (v2) +$mandates = $client->mandates->listFor($customer, 0, 10); + +// After (v3) +$mandates = $client->mandates->pageForCustomer( + $customer, + from: null, + limit: 10, + testmode: false +); +``` + +### Constant & Collection Changes + +- **Streamlined constants** - Redundant prefixes have been removed for a cleaner API: + ```php + // Before + Payment::STATUS_PAID; + + // After + Payment::PAID; + ``` + +- **Simplified SequenceType constants**: + ```php + // Before + SequenceType::SEQUENCETYPE_FIRST; + + // After + SequenceType::FIRST; + ``` + +- **Cleaner collection initialization**: + ```php + // Before + new PaymentCollection(10, $payments); + + // After + new PaymentCollection($payments); + ``` + +### Test Mode Handling + +- **Automatic detection** with API keys +- **Explicit parameter** for organization credentials: + ```php + // Get payment link in test mode + $link = $client->paymentLinks->get('pl_123', testmode: true); + ``` + +Read the full testing documentation [here](docs/testing.md). + +### Removed Collections + +- `OrganizationCollection` +- `RouteCollection` + +## New Features + +### Modern HTTP Handling + +#### PSR-18 Support +You can now use any PSR-18 compatible HTTP client: + +```php +use Mollie\Api\HttpAdapter\PSR18MollieHttpAdapter; + +$adapter = new PSR18MollieHttpAdapter( + new GuzzleClient(), + new Psr17Factory(), + new Psr17Factory() +); + +$client = new MollieApiClient($adapter); +``` + +### Enhanced Request Handling + +#### Typed Request Objects +You can now say goodbye to array-based payloads and hello to type-safe request objects: + +```php +use Mollie\Api\Http\Requests\CreatePaymentRequest; + +$request = new CreatePaymentRequest( + amount: new Money('EUR', '10.00'), + description: 'Order 123', + redirectUrl: 'https://example.com/redirect' +); + +$payment = $client->send($request); +``` + +Read the full request documentation [here](docs/requests.md). + +### Collection Improvements + +Collections now feature powerful functional methods for more expressive code: + +```php +// New methods +$activePayments = $payments->filter(fn($p) => $p->isActive()); +$hasRefunds = $payments->contains(fn($p) => $p->hasRefunds()); +``` + +### Method Issuer Contracts + +You can now easily manage method issuers with optional contract IDs: + +```php +$client->methodIssuers->enable( + profileId: 'pfl_123', + methodId: 'voucher', + issuerId: 'iss_456', + contractId: 'contract_789' // Optional +); +``` + +## Further reading + +Usage guides for the PHP client can be found in the [docs](docs). For more information on the Mollie API, check out [the official Mollie docs](https://docs.mollie.com). diff --git a/vendor/mollie/mollie-api-php/bin/release b/vendor/mollie/mollie-api-php/bin/release new file mode 100755 index 0000000..ef2dedf --- /dev/null +++ b/vendor/mollie/mollie-api-php/bin/release @@ -0,0 +1,158 @@ +#!/bin/bash + +VERSION=$1 + +# Check if version is provided +if [ -z "$VERSION" ]; then + echo "❌ Error: Version number is required" + echo "Usage: ./bin/release " + echo "Example: ./bin/release 1.0.0" + exit 1 +fi + +# Check if gh CLI is installed +if ! command -v gh &> /dev/null; then + echo "❌ Error: GitHub CLI (gh) is not installed" + echo "Please install it from: https://cli.github.com/" + exit 1 +fi + +# Check if we're in a git repository +if ! git rev-parse --git-dir > /dev/null 2>&1; then + echo "❌ Error: Not in a git repository" + exit 1 +fi + +# Check if there are uncommitted changes +if ! git diff-index --quiet HEAD --; then + echo "❌ Error: There are uncommitted changes. Please commit or stash them first." + exit 1 +fi + +# Get default branch from GitHub with better error handling +echo "🔍 Getting default branch from GitHub..." +DEFAULT_BRANCH_JSON=$(gh repo view --json defaultBranchRef 2>/dev/null) +if [ $? -ne 0 ]; then + echo "❌ Error: Failed to get repository information from GitHub" + echo " Please check your GitHub CLI authentication and repository access" + exit 1 +fi + +DEFAULT_BRANCH=$(echo "$DEFAULT_BRANCH_JSON" | grep -o '"name":"[^"]*"' | cut -d'"' -f4) +if [ -z "$DEFAULT_BRANCH" ]; then + echo "⚠️ Warning: Could not determine default branch, using 'main'" + DEFAULT_BRANCH="main" +fi + +echo "📌 Local HEAD: $(git rev-parse HEAD)" +echo "📌 GitHub default branch: $DEFAULT_BRANCH" + +# Fetch latest changes from remote +echo "🔄 Fetching latest changes from remote..." +git fetch origin + +# Check if local branch is up-to-date with remote +LOCAL_HEAD=$(git rev-parse HEAD) +REMOTE_HEAD=$(git rev-parse origin/$DEFAULT_BRANCH 2>/dev/null) + +if [ -z "$REMOTE_HEAD" ]; then + echo "❌ Error: Could not find remote branch origin/$DEFAULT_BRANCH" + exit 1 +fi + +if [ "$LOCAL_HEAD" != "$REMOTE_HEAD" ]; then + echo "❌ Error: Local branch is not up-to-date with remote" + echo " Local HEAD: $LOCAL_HEAD" + echo " Remote HEAD: $REMOTE_HEAD" + echo " Please pull the latest changes: git pull origin $DEFAULT_BRANCH" + exit 1 +fi + +echo "✅ Local repository is up-to-date with remote" + +# Define the path to MollieApiClient.php +MOLLIE_CLIENT_FILE="src/MollieApiClient.php" + +# Check if MollieApiClient.php exists +if [ ! -f "$MOLLIE_CLIENT_FILE" ]; then + echo "❌ Error: MollieApiClient.php not found at $MOLLIE_CLIENT_FILE" + exit 1 +fi + +# Check if tag already exists +if git tag -l | grep -q "^v$VERSION$"; then + echo "❌ Error: Tag v$VERSION already exists" + exit 1 +fi + +echo "🔄 Updating CLIENT_VERSION to $VERSION in MollieApiClient.php..." + +# Update the CLIENT_VERSION constant in MollieApiClient.php +if sed -i.bak "s/public const CLIENT_VERSION = '[^']*'/public const CLIENT_VERSION = '$VERSION'/g" "$MOLLIE_CLIENT_FILE"; then + echo "✅ CLIENT_VERSION updated successfully" + # Remove backup file created by sed + rm "${MOLLIE_CLIENT_FILE}.bak" +else + echo "❌ Error: Failed to update CLIENT_VERSION" + exit 1 +fi + +# Check if the version was actually updated +if grep -q "CLIENT_VERSION = '$VERSION'" "$MOLLIE_CLIENT_FILE"; then + echo "✅ Version update verified" +else + echo "❌ Error: Version update verification failed" + exit 1 +fi + +# Commit the version update +echo "📝 Committing version update..." +git add "$MOLLIE_CLIENT_FILE" +git commit -m "Update CLIENT_VERSION to $VERSION" + +echo "🏷️ Creating tag v$VERSION..." + +# Create tag and push +git tag -a "v$VERSION" -m "Release $VERSION" +git push origin "v$VERSION" + +echo "⏱️ Waiting for GitHub to recognize the new tag..." +sleep 3 + +# Verify tag exists on GitHub +echo "🔍 Verifying tag exists on GitHub..." +TAG_CHECK=$(gh release list --repo mollie/mollie-api-php 2>/dev/null | grep "v$VERSION" || echo "") +if [ -n "$TAG_CHECK" ]; then + echo "❌ Error: Release v$VERSION already exists on GitHub" + exit 1 +fi + +# Double-check that we can see the tag +GH_TAG_CHECK=$(gh api repos/mollie/mollie-api-php/git/refs/tags/v$VERSION 2>/dev/null || echo "not_found") +if [ "$GH_TAG_CHECK" = "not_found" ]; then + echo "⚠️ Warning: Tag not immediately visible on GitHub, waiting longer..." + sleep 5 +fi + +echo "🚀 Creating GitHub release..." + +# Generate release from current HEAD with better error handling +RELEASE_OUTPUT=$(gh release create "v$VERSION" \ + --target "$(git rev-parse HEAD)" \ + --latest \ + --generate-notes 2>&1) + +if [ $? -eq 0 ]; then + echo "✅ Release v$VERSION created successfully!" + echo "$RELEASE_OUTPUT" +else + echo "❌ Error: Failed to create GitHub release" + echo "$RELEASE_OUTPUT" + echo "" + echo "🔍 Troubleshooting tips:" + echo " 1. Check if you have write permissions to the repository" + echo " 2. Verify your GitHub CLI authentication: gh auth status" + echo " 3. Try creating the release manually on GitHub.com" + echo " 4. Check if the tag was created successfully: git tag -l | grep v$VERSION" + exit 1 +fi diff --git a/vendor/mollie/mollie-api-php/composer.json b/vendor/mollie/mollie-api-php/composer.json new file mode 100644 index 0000000..010f939 --- /dev/null +++ b/vendor/mollie/mollie-api-php/composer.json @@ -0,0 +1,87 @@ +{ + "name": "mollie/mollie-api-php", + "description": "Mollie API client library for PHP. Mollie is a European Payment Service provider and offers international payment methods such as Mastercard, VISA, American Express and PayPal, and local payment methods such as iDEAL, Bancontact, SOFORT Banking, SEPA direct debit, Belfius Direct Net, KBC Payment Button and various gift cards such as Podiumcadeaukaart and fashioncheque.", + "keywords": [ + "mollie", + "payment", + "service", + "ideal", + "creditcard", + "apple pay", + "mistercash", + "bancontact", + "sofort", + "sofortbanking", + "sepa", + "paypal", + "paysafecard", + "podiumcadeaukaart", + "przelewy24", + "banktransfer", + "direct debit", + "belfius", + "belfius direct net", + "refunds", + "api", + "payments", + "gateway", + "subscriptions", + "recurring", + "charges", + "kbc", + "cbc", + "gift cards", + "intersolve", + "fashioncheque", + "inghomepay", + "klarna", + "paylater", + "sliceit" + ], + "homepage": "https://www.mollie.com/en/developers", + "license": "BSD-2-Clause", + "authors": [ + { + "name": "Mollie B.V.", + "email": "info@mollie.com" + } + ], + "require": { + "php": "^7.4|^8.0", + "ext-curl": "*", + "ext-json": "*", + "ext-openssl": "*", + "composer/ca-bundle": "^1.4", + "nyholm/psr7": "^1.8", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.1", + "psr/http-message": "^1.1|^2.0" + }, + "require-dev": { + "brianium/paratest": "^6.11", + "guzzlehttp/guzzle": "^7.6", + "phpstan/phpstan": "^2.0", + "phpunit/phpunit": "^9.6", + "symfony/var-dumper": "^5.4|^6.4|^7.2" + }, + "suggest": { + "mollie/oauth2-mollie-php": "Use OAuth to authenticate with the Mollie API. This is needed for some endpoints. Visit https://docs.mollie.com/ for more information." + }, + "config": { + "sort-packages": true + }, + "autoload": { + "psr-4": { + "Mollie\\Api\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "Tests\\": "tests/", + "Tests\\Mollie\\Api\\": "tests/Mollie/API/" + } + }, + "scripts": { + "test": "./vendor/bin/paratest" + } +} diff --git a/vendor/mollie/mollie-api-php/docs/debugging.md b/vendor/mollie/mollie-api-php/docs/debugging.md new file mode 100644 index 0000000..71fdf78 --- /dev/null +++ b/vendor/mollie/mollie-api-php/docs/debugging.md @@ -0,0 +1,103 @@ +# Debugging with Mollie API Client + +## Overview + +The Mollie API client provides powerful debugging capabilities to help you inspect and troubleshoot API requests and responses. The debugging functionality is implemented through middleware and automatically sanitizes sensitive data to prevent accidental exposure of credentials. + +## Basic Usage + +### Enable All Debugging + +To enable both request and response debugging: + +```php +$mollie = new \Mollie\Api\MollieApiClient(); +$mollie->debug(); // Enables both request and response debugging +``` + +### Enable on Request + +To enable debugging for a specific request: + +```php +$request = new CreatePaymentRequest(...); + +// enable output for request and response +$mollie->send($request->debug()); + +// only debug request +$mollie->send($request->debugRequest(die: true)); + +// only debug response +$mollie->send($request->debugResponse(die: true)); +``` + +### Debug Specific Parts + +You can choose to debug only requests or only responses: + +```php +// Debug only requests +$mollie->debugRequest(); + +// Debug only responses +$mollie->debugResponse(); +``` + +## Custom Debuggers + +You can provide your own debugging functions to customize how debugging information is displayed: + +```php +// Custom request debugger +$mollie->debugRequest(function($pendingRequest, $psrRequest) { + // Your custom debugging logic here +}); + +// Custom response debugger +$mollie->debugResponse(function($response, $psrResponse) { + // Your custom debugging logic here +}); +``` + +## Security Features + +### Automatic Sanitization + +When debugging is enabled, the client automatically: +- Removes sensitive headers (Authorization, User-Agent, etc.) +- Sanitizes request data to prevent credential exposure +- Handles exceptions safely by removing sensitive data + +### Die After Debug + +For development purposes, you can halt execution after debugging output: + +```php +$mollie->debug(die: true); // Will stop execution after debugging output +``` + +## Best Practices + +1. **Development Only**: Never enable debugging in production environments +2. **Custom Debuggers**: When implementing custom debuggers, ensure they handle sensitive data appropriately +3. **Exception Handling**: Debug mode works with exceptions, helping you troubleshoot API errors safely + +## Example Usage + +```php +try { + $mollie = new \Mollie\Api\MollieApiClient(); + $mollie->setApiKey("test_dHar4XY7LxsDOtmnkVtjNVWXLSlXsM"); + + // Enable debugging for development + $mollie->debug(); + + // Your API calls here + $payment = $mollie->payments->create([...]); + +} catch (\Mollie\Api\Exceptions\ApiException $e) { + // Exception will include sanitized debug information + echo "API call failed: " . htmlspecialchars($e->getMessage()); +} +``` diff --git a/vendor/mollie/mollie-api-php/docs/endpoint-collections.md b/vendor/mollie/mollie-api-php/docs/endpoint-collections.md new file mode 100644 index 0000000..3e3e151 --- /dev/null +++ b/vendor/mollie/mollie-api-php/docs/endpoint-collections.md @@ -0,0 +1,730 @@ +# Introduction +Endpoint collections provide a fluent interface for interacting with Mollie's API. Each collection manages specific resource types like payments, customers, and subscriptions, offering methods to create, retrieve, update, and delete these resources. + +## Setup + +1. **Initialize the Mollie Client:** + +```php +$mollie = new \Mollie\Api\MollieApiClient(); +$mollie->setApiKey("test_*************************"); +``` + +2. **Access Endpoints via the Client:** +```php +// Payments endpoint +$mollie->payments->... + +// Customers endpoint +$mollie->customers->... + +// Other endpoints +$mollie->balances->... +$mollie->orders->... +``` + +3. **Call methods** + +**Simple: Using arrays** +This approach is direct but provides less type safety: +```php +$payment = $mollie->payments->create([ + 'amount' => [ + 'currency' => 'EUR', + 'value' => '10.00' + ], + 'description' => 'My first API payment' +]); +``` + +**Advanced: Using typed array params** +You can use dedicated `Data` objects to add partial type safety to your parameters. + +```php +use Mollie\Api\Http\Data\Money; +use Mollie\Api\Http\Data\CreatePaymentPayload; + +$payment = $mollie->payments->create([ + 'description' => 'My first API payment', + 'amount' => new Money('EUR', '10.00') +]); +``` + +If you're starting with an array and need to convert it into a structured request, you can use a specific factory designed for this purpose. + +```php +use Mollie\Api\Http\Data\Money; +use Mollie\Api\Factories\CreatePaymentRequestFactory; + +// Fully untyped data +$createPaymentRequest = CreatePaymentRequestFactory::new([ + 'amount' => [ + 'currency' => 'EUR', + 'value' => '10.00' + ], + 'description' => 'My first API payment' +]); + +// Partially untyped +$createPaymentRequest = CreatePaymentRequestFactory::new([ + 'amount' => new Money('EUR', '10.00'), + 'description' => 'My first API payment' +]); +``` + +This method lets you effortlessly transform arrays into typed objects, thereby enhancing IDE support and increasing type safety while handling your data. + +# Available Endpoints + +## Balances + +[Official Documentation](https://docs.mollie.com/reference/v2/balances-api/get-balance) + +### Balance Information + +```php +// Get primary balance +$balance = $mollie->balances->primary(); + +// Get specific balance +$balance = $mollie->balances->get('bal_12345'); + +// List balances +$balances = $mollie->balances->page(); +``` + +## Balance Reports + +[Official Documentation](https://docs.mollie.com/reference/v2/balance-reports-api/get-balance-report) + +### Balance Report Details + +```php +// Get report for specific balance +$report = $mollie->balanceReports->getForId('bal_12345', [ + 'from' => '2024-01-01', + 'until' => '2024-01-31', + 'grouping' => 'transaction-categories' +]); +``` + +## Balance Transactions + +[Official Documentation](https://docs.mollie.com/reference/v2/balance-transactions-api/list-balance-transactions) + +### Balance Transaction Management + +```php +// Get transactions for a balance +$transactions = $mollie->balanceTransactions->pageFor($balance); + +// Use iterator for all transactions +foreach ($mollie->balanceTransactions->iteratorFor($balance) as $transaction) { + echo $transaction->id; +} +``` + +## Chargebacks + +[Official Documentation](https://docs.mollie.com/reference/v2/chargebacks-api/get-chargeback) + +### Chargeback Management + +```php +// Get all chargebacks +$chargebacks = $mollie->chargebacks->page(); + +// Use iterator for all chargebacks +foreach ($mollie->chargebacks->iterator() as $chargeback) { + echo $chargeback->id; +} +``` + +## Clients + +[Official Documentation](https://docs.mollie.com/reference/v2/clients-api/get-client) + +### Client Management + +```php +// Get a specific client +$client = $mollie->clients->get('org_12345678', [ + 'testmode' => true +]); + +// List all clients +$clients = $mollie->clients->page( + from: 'org_12345678', + limit: 50 +); +``` + +## Customers + +[Official Documentation](https://docs.mollie.com/reference/v2/customers-api/create-customer) + +### Customer Management + +```php +// Create a customer +$customer = $mollie->customers->create([ + 'name' => 'John Doe', + 'email' => 'john@example.org', +]); + +// Get a customer +$customer = $mollie->customers->get('cst_8wmqcHMN4U'); + +// Update a customer +$customer = $mollie->customers->update('cst_8wmqcHMN4U', [ + 'name' => 'Updated Name' +]); + +// Delete a customer +$mollie->customers->delete('cst_8wmqcHMN4U'); + +// List customers +$customers = $mollie->customers->page(); +``` + +## Invoices + +[Official Documentation](https://docs.mollie.com/reference/v2/invoices-api/get-invoice) + +### Invoice Management + +```php +// Get a specific invoice +$invoice = $mollie->invoices->get('inv_xBEbP9rvAq'); + +// List all invoices +$invoices = $mollie->invoices->page( + from: 'inv_xBEbP9rvAq', + limit: 50 +); +``` + +## Mandates + +[Official Documentation](https://docs.mollie.com/reference/v2/mandates-api/create-mandate) + +### Mandate Management + +```php +// Create a mandate for a customer +$mandate = $mollie->mandates->createFor($customer, [ + 'method' => \Mollie\Api\Types\PaymentMethod::DIRECTDEBIT, + 'consumerName' => 'John Doe', + 'consumerAccount' => 'NL55INGB0000000000', + 'consumerBic' => 'INGBNL2A', + 'signatureDate' => '2024-01-01', + 'mandateReference' => 'YOUR-COMPANY-MD13804' +]); + +// Get a mandate +$mandate = $mollie->mandates->getFor($customer, 'mdt_h3gAaD5zP'); + +// Revoke a mandate +$mollie->mandates->revokeFor($customer, 'mdt_h3gAaD5zP'); + +// List mandates +$mandates = $mollie->mandates->pageFor($customer); +``` + +## Methods + +[Official Documentation](https://docs.mollie.com/reference/v2/methods-api/get-method) + +### Payment Methods + +```php +// Get a method +$method = $mollie->methods->get(\Mollie\Api\Types\PaymentMethod::IDEAL); + +// List all methods +$methods = $mollie->methods->all(); + +// List enabled methods +$methods = $mollie->methods->allEnabled([ + 'amount' => [ + 'currency' => 'EUR', + 'value' => '100.00' + ] +]); +``` + +### Method Issuers + +```php +// Enable an issuer +$issuer = $mollie->methodIssuers->enable( + 'pfl_v9hTwCvYqw', + \Mollie\Api\Types\PaymentMethod::IDEAL, + 'ideal_INGBNL2A' +); + +// Disable an issuer +$mollie->methodIssuers->disable( + 'pfl_v9hTwCvYqw', + \Mollie\Api\Types\PaymentMethod::IDEAL, + 'ideal_INGBNL2A' +); +``` + +## Onboarding + +[Official Documentation](https://docs.mollie.com/reference/v2/onboarding-api/get-onboarding-status) + +### Onboarding Management + +```php +// Get onboarding status +$onboarding = $mollie->onboarding->status(); +``` + +## Organizations + +[Official Documentation](https://docs.mollie.com/reference/v2/organizations-api/get-organization) + +### Organization Management + +```php +// Get an organization +$organization = $mollie->organizations->get('org_12345678'); + +// Get current organization +$organization = $mollie->organizations->current(); + +// Get partner status +$partner = $mollie->organizations->partnerStatus(); +``` + +## Permissions + +[Official Documentation](https://docs.mollie.com/reference/v2/permissions-api/get-permission) + +### Permission Management + +```php +// Get a permission +$permission = $mollie->permissions->get('payments.read'); + +// List all permissions +$permissions = $mollie->permissions->list(); +``` + +## Payments + +[Official Documentation](https://docs.mollie.com/reference/v2/payments-api/create-payment) + +### Payment Management + +```php +// Create a payment +$payment = $mollie->payments->create([ + 'description' => 'Order #12345', + 'amount' => [ + 'currency' => 'EUR', + 'value' => '10.00' + ], + 'redirectUrl' => 'https://webshop.example.org/order/12345/', + 'webhookUrl' => 'https://webshop.example.org/mollie-webhook/' +]); + +// Get a payment +$payment = $mollie->payments->get('tr_7UhSN1zuXS'); + +// Update a payment +$payment = $mollie->payments->update('tr_7UhSN1zuXS', [ + 'description' => 'Updated description' +]); + +// Cancel a payment +$mollie->payments->cancel('tr_7UhSN1zuXS'); + +// List payments +$payments = $mollie->payments->page(); +``` + +### Payment Links + +[Official Documentation](https://docs.mollie.com/reference/v2/payment-links-api/create-payment-link) + +### Payment Captures + +[Official Documentation](https://docs.mollie.com/reference/v2/captures-api/get-capture) + +### Payment Chargebacks + +```php +// Get a chargeback +$chargeback = $mollie->paymentChargebacks->getFor($payment, 'chb_n9z0tp'); + +// List chargebacks for payment +$chargebacks = $mollie->paymentChargebacks->pageFor($payment); +``` + +### Payment Routes + +```php +// Create a delayed route +$route = $mollie->paymentRoutes->createFor( + $payment, + ['value' => '10.00', 'currency' => 'EUR'], + ['type' => 'organization', 'organizationId' => 'org_12345'], + '2025-01-01' // optional release date +); + +// List payment routes +$routes = $mollie->paymentRoutes->listFor($payment); + +// Update release date for a route +$route = $mollie->paymentRoutes->updateReleaseDateFor( + $payment, + 'rt_abc123', + '2024-01-01' +); +``` + +## Profiles + +[Official Documentation](https://docs.mollie.com/reference/v2/profiles-api/create-profile) + +### Profile Management + +```php +// Create a profile +$profile = $mollie->profiles->create([ + 'name' => 'My Test Profile', + 'website' => 'https://example.org', + 'email' => 'info@example.org', + 'phone' => '+31612345678', + 'mode' => 'test' +]); + +// Get a profile +$profile = $mollie->profiles->get('pfl_v9hTwCvYqw'); + +// Get current profile +$profile = $mollie->profiles->getCurrent(); + +// Update a profile +$profile = $mollie->profiles->update('pfl_v9hTwCvYqw', [ + 'name' => 'Updated Profile Name' +]); + +// Delete a profile +$mollie->profiles->delete('pfl_v9hTwCvYqw'); + +// List profiles +$profiles = $mollie->profiles->page(); +``` + +### Profile Methods + +```php +// Enable a method +$method = $mollie->profileMethods->enable( + 'pfl_v9hTwCvYqw', + \Mollie\Api\Types\PaymentMethod::IDEAL +); + +// Disable a method +$mollie->profileMethods->disable( + 'pfl_v9hTwCvYqw', + \Mollie\Api\Types\PaymentMethod::IDEAL +); +``` + +## Refunds + +[Official Documentation](https://docs.mollie.com/reference/v2/refunds-api/create-refund) + +### Refund Management + +```php +// Create a refund for a payment +$refund = $mollie->refunds->createForPayment($paymentId, [ + 'amount' => [ + 'currency' => 'EUR', + 'value' => '15.00' + ], + 'description' => 'Refund for returned item' +]); + +// List refunds +$refunds = $mollie->refunds->page(); +``` + +## Sales Invoices + +[Official Documentation TBA] + +### Sales Invoice Management + +```php +use Mollie\Api\Types\VatMode; +use Mollie\Api\Types\VatScheme; +use Mollie\Api\Types\PaymentTerm; +use Mollie\Api\Types\RecipientType; +use Mollie\Api\Types\RecipientType; +use Mollie\Api\Types\SalesInvoiceStatus; + +// Create a sales invoice +$salesInvoice = $mollie->salesInvoices->create([ + 'currency' => 'EUR', + 'status' => SalesInvoiceStatus::DRAFT, + 'vatScheme' => VatScheme::STANDARD, + 'vatMode' => VatMode::INCLUSIVE, + 'paymentTerm' => PaymentTerm::DAYS_30, + 'recipientIdentifier' => 'XXXXX', + 'recipient' => [ + 'type' => RecipientType::CONSUMER, + 'email' => 'darth@vader.deathstar', + 'streetAndNumber' => 'Sample Street 12b', + 'postalCode' => '2000 AA', + 'city' => 'Amsterdam', + 'country' => 'NL', + 'locale' => 'nl_NL' + ], + 'lines' => [ + [ + 'description' => 'Monthly subscription fee', + 'quantity' => 1, + 'vatRate' => '21', + 'unitPrice' => [ + 'currency' => 'EUR', + 'value' => '10,00' + ] + ] + ] +]); + +// Get a sales invoice +$salesInvoice = $mollie->salesInvoices->get('invoice_12345'); + +// Update a sales invoice +$salesInvoice = $mollie->salesInvoices->update('invoice_12345', [ + 'description' => 'Updated description' +]); + +// Delete a sales invoice +$mollie->salesInvoices->delete('invoice_12345'); + +// List sales invoices +$salesInvoices = $mollie->salesInvoices->page(); +``` + +## Sessions + +[Official Documentation](https://docs.mollie.com/reference/v2/sessions-api/create-session) + +### Session Management + +```php +// Create a session +$session = $mollie->sessions->create([ + 'amount' => [ + 'currency' => 'EUR', + 'value' => '100.00' + ], + 'description' => 'Session for service' +]); + +// Get a session +$session = $mollie->sessions->get('sessionId'); +``` + +## Settlements + +[Official Documentation](https://docs.mollie.com/reference/v2/settlements-api/get-settlement) + +### Settlement Management + +```php +// Get a settlement +$settlement = $mollie->settlements->get('settlementId'); + +// List settlements +$settlements = $mollie->settlements->page(); +``` + +### Settlement Captures + +```php +// Get captures for a settlement +$captures = $mollie->settlementCaptures->pageFor($settlement); + +// Use iterator +foreach ($mollie->settlementCaptures->iteratorFor($settlement) as $capture) { + echo $capture->id; +} +``` + +### Settlement Chargebacks + +```php +// List chargebacks for a settlement +$chargebacks = $mollie->settlementChargebacks->pageFor($settlement); + +// Use iterator +foreach ($mollie->settlementChargebacks->iteratorFor($settlement) as $chargeback) { + echo $chargeback->id; +} +``` + +### Settlement Payments + +```php +// List payments in a settlement +$payments = $mollie->settlementPayments->pageFor($settlement); + +// Use iterator +foreach ($mollie->settlementPayments->iteratorFor($settlement) as $payment) { + echo $payment->id; +} +``` + +## Subscriptions + +[Official Documentation](https://docs.mollie.com/reference/v2/subscriptions-api/create-subscription) + +### Subscription Management + +```php +// Create a subscription +$subscription = $mollie->subscriptions->createForCustomer('customerId', [ + 'amount' => [ + 'currency' => 'EUR', + 'value' => '25.00' + ], + 'interval' => '1 month', + 'description' => 'Monthly subscription' +]); + +// List subscriptions +$subscriptions = $mollie->subscriptions->pageForCustomer('customerId'); +``` + +## Terminals + +[Official Documentation](https://docs.mollie.com/reference/v2/terminals-api/get-terminal) + +### Terminal Management + +```php +// Get a terminal +$terminal = $mollie->terminals->get('terminalId'); + +// List terminals +$terminals = $mollie->terminals->page(); +``` + +## Wallets + +[Official Documentation](https://docs.mollie.com/reference/v2/wallets-api/request-apple-pay-payment-session) + +### Wallet Management + +```php +// Request an Apple Pay payment session +$session = $mollie->wallets->requestApplePayPaymentSession([ + 'domainName' => 'example.com', + 'validationUrl' => 'https://apple-pay-gateway.apple.com/paymentservices/startSession' +]); +``` + +## Webhooks + +[Official Documentation](https://docs.mollie.com/reference/v2/webhooks-api/create-webhook) + +### Webhook Management + +```php +use Mollie\Api\Types\WebhookEventType; + +// Create a webhook +$webhook = $mollie->webhooks->create([ + 'url' => 'https://example.com/webhook', + 'description' => 'Payment notifications', + 'events' => [ + WebhookEventType::PAYMENT_LINK_PAID, + WebhookEventType::PROFILE_VERIFIED + ], + 'secret' => 'my-secret-key-123' +]); + +// Get a webhook +$webhook = $mollie->webhooks->get('wh_4KgGJJSZpH'); + +// Update a webhook +$webhook = $mollie->webhooks->update('wh_4KgGJJSZpH', [ + 'url' => 'https://updated-example.com/webhook', + 'description' => 'Updated description' +]); + +// Delete a webhook +$mollie->webhooks->delete('wh_4KgGJJSZpH'); + +// Test a webhook +$mollie->webhooks->test('wh_4KgGJJSZpH'); + +// List webhooks +$webhooks = $mollie->webhooks->page(); + +// Using convenience methods on webhook resource +$webhook = $mollie->webhooks->get('wh_4KgGJJSZpH'); +$webhook->update(['description' => 'New description']); +$webhook->delete(); +$webhook->test(); +``` + +### Webhook Events + +```php +// Get a webhook event +$webhookEvent = $mollie->webhookEvents->get('whev_abc123'); + +// Check event status using helper methods +if ($webhookEvent->wasDelivered()) { + echo "Webhook was successfully delivered\n"; +} elseif ($webhookEvent->failed()) { + echo "Webhook delivery failed: {$webhookEvent->error}\n"; +} elseif ($webhookEvent->hasRetryPending()) { + echo "Retry pending at: {$webhookEvent->nextRetryAt}\n"; +} +``` + +## Common Patterns + +### Pagination + +Most list methods support pagination: + +```php +// Get first page +$payments = $mollie->payments->page(); + +// Get specific page +$payments = $mollie->payments->page( + from: 'tr_7UhSN1zuXS', // Start from this ID + limit: 50 // Items per page +); + +// Get all items using iterator +foreach ($mollie->payments->iterator() as $payment) { + echo $payment->id; +} +``` + +### Error Handling + +Handle errors using `ApiException`: + +```php +try { + $payment = $mollie->payments->get('tr_xxx'); +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo "API call failed: {$e->getMessage()}"; +} +``` diff --git a/vendor/mollie/mollie-api-php/docs/exceptions.md b/vendor/mollie/mollie-api-php/docs/exceptions.md new file mode 100644 index 0000000..fefc0d9 --- /dev/null +++ b/vendor/mollie/mollie-api-php/docs/exceptions.md @@ -0,0 +1,137 @@ +# Exceptions + +This document describes the exceptions that can be thrown by the Mollie API PHP client. + +## Exception Hierarchy + +### `MollieException` + +The abstract base class for **all** exceptions in the Mollie API PHP client. + +### `RequestException` + +The `RequestException` serves as the base for all request-related exceptions. + +### `ApiException` + +Extends `RequestException` and serves as the base for all API-related exceptions. This is the parent class for all specific HTTP status code exceptions. This exception is also thrown when the Mollie API returns an error response that doesn't match any of the more specific exceptions below. + +Properties and methods: +- `getDocumentationUrl()`: Returns the URL to the documentation for this error, if available +- `getDashboardUrl()`: Returns the URL to the dashboard for this error, if available +- `getRaisedAt()`: Returns the timestamp when the exception was raised +- `getPlainMessage()`: Returns the plain exception message without timestamp and metadata + +## HTTP Status Code Exceptions + +The following exceptions all extend `ApiException` and are thrown based on specific HTTP status codes returned by the API: + +### `UnauthorizedException` (401) + +Thrown when authentication fails. This typically happens when using an invalid API key. + +### `ForbiddenException` (403) + +Thrown when the request is understood but refused due to permission issues. + +### `NotFoundException` (404) + +Thrown when the requested resource does not exist. + +### `MethodNotAllowedException` (405) + +Thrown when the HTTP method used is not allowed for the requested endpoint. + +### `RequestTimeoutException` (408) + +Thrown when the request times out. + +### `ValidationException` (422) + +Thrown when the request data fails validation. This typically happens when required fields are missing or have invalid values. + +### `TooManyRequestsException` (429) + +Thrown when rate limiting is applied because too many requests were made in a short period. + +### `ServiceUnavailableException` (503) + +Thrown when the Mollie API service is temporarily unavailable. + +## Network Exceptions + +### `NetworkRequestException` + +Thrown when a network error occurs during the request. + +### `RetryableNetworkRequestException` + +Thrown when a network error occurs that might be resolved by retrying the request. + +## Other Exceptions + +### `ClientException` + +Base exception for client-related errors. + +### `EmbeddedResourcesNotParseableException` + +Thrown when embedded resources cannot be parsed. + +### `IncompatiblePlatformException` + +Thrown when the platform is incompatible with the Mollie API client. + +### `InvalidAuthenticationException` + +Thrown when the authentication method is invalid. + +### `JsonParseException` + +Thrown when JSON parsing fails. + +### `LogicException` + +Thrown when there is a logical error in the client code. + +### `MissingAuthenticationException` + +Thrown when no authentication method is provided. + +### `ServerException` + +Thrown when a server error occurs. + +### `UnrecognizedClientException` + +Thrown when the client is not recognized by the Mollie API. + +## Handling Exceptions + +Here's an example of how to handle exceptions: + +```php +try { + $payment = $mollie->payments->get("tr_xxx"); +} catch (Mollie\Api\Exceptions\UnauthorizedException $e) { + // Invalid API key + echo "Invalid API key: " . $e->getMessage(); +} catch (Mollie\Api\Exceptions\NotFoundException $e) { + // Payment not found + echo "Payment not found: " . $e->getMessage(); +} catch (Mollie\Api\Exceptions\MollieException $e) { + // Other Mollie error + echo "Mollie error: " . $e->getMessage(); +} +``` + +You can also catch all Mollie exceptions at once: + +```php +try { + $payment = $mollie->payments->get("tr_xxx"); +} catch (Mollie\Api\Exceptions\MollieException $e) { + // Any Mollie error + echo "Mollie error: " . $e->getMessage(); +} +``` diff --git a/vendor/mollie/mollie-api-php/docs/http-adapters.md b/vendor/mollie/mollie-api-php/docs/http-adapters.md new file mode 100644 index 0000000..9c65e6b --- /dev/null +++ b/vendor/mollie/mollie-api-php/docs/http-adapters.md @@ -0,0 +1,46 @@ +# HTTP Adapters + +## Overview + +An HTTP adapter is a component that manages the communication between your application and an API. It abstracts the details of making HTTP requests and handling responses, allowing you to use different HTTP clients (like Guzzle, cURL, or custom clients) interchangeably without changing the way you interact with the API. + +## MollieHttpAdapterPicker + +The `MollieHttpAdapterPicker` is responsible for selecting the appropriate HTTP adapter based on the environment or the provided HTTP client. If no client is specified in the `MollieApiClient` constructor, it picks a default adapter. + +### How It Works + +1. **No Client Specified**: If no client is provided, it checks if Guzzle is available and picks the appropriate version of the Guzzle adapter. +2. **Custom Client Provided**: If a custom client is provided and it implements the `HttpAdapterContract`, it is used directly. If it's a Guzzle client, it is wrapped in a `GuzzleMollieHttpAdapter`. +3. **Unrecognized Client**: Throws an `UnrecognizedClientException` if the client is not recognized. + +## Creating a Custom Adapter + +To create a custom HTTP adapter: +1. Implement HttpAdapterContract. +2. Use HasDefaultFactories Trait to simplify adapter implementation. + +```php +use Mollie\Api\Contracts\HttpAdapterContract; +use Mollie\Api\Traits\HasDefaultFactories; + +class MyCustomHttpAdapter implements HttpAdapterContract { + use HasDefaultFactories; + + public function sendRequest(PendingRequest $pendingRequest): Response { + // Implementation for sending HTTP request + } + + public function version(): ?string { + return 'my-custom-adapter/1.0'; + } +} +``` + +## Available Adapters + +Out of the box, the Mollie API client provides several adapters: + +- **GuzzleMollieHttpAdapter**: Wraps a Guzzle HTTP client for sending requests. +- **CurlMollieHttpAdapter**: Uses cURL for sending HTTP requests. This is the default if Guzzle is not available. +- **PSR18MollieHttpAdapter**: [PSR-18](https://www.php-fig.org/psr/psr-18/) compatible HTTP adapter diff --git a/vendor/mollie/mollie-api-php/docs/idempotency.md b/vendor/mollie/mollie-api-php/docs/idempotency.md new file mode 100644 index 0000000..fb03c6a --- /dev/null +++ b/vendor/mollie/mollie-api-php/docs/idempotency.md @@ -0,0 +1,60 @@ +# Idempotency + +## Overview + +Idempotency ensures that multiple identical requests to an API result in the same outcome without creating duplicate resources or effects. This is crucial for operations that involve financial transactions to prevent unintended charges or state changes. + +Mollie API supports idempotent requests for critical operations such as creating payments or refunds. This is automatically managed by the API client using the `ApplyIdempotencyKey` middleware. + +For more detailed information, refer to the [Mollie API Idempotency Documentation](https://docs.mollie.com/reference/api-idempotency). + +> [!Note] +> This package automatically handles idempotency for you. The information below allows you to override the default idempotency behavior. + +## Automatic Idempotency Key Handling + +The Mollie API client automatically handles idempotency for mutating requests (POST, PATCH, DELETE) through the `ApplyIdempotencyKey` middleware. This middleware checks if the request is a mutating type and applies an idempotency key if one is not already provided. + +### How It Works + +1. **Check Request Type**: The middleware checks if the request method is POST, PATCH, or DELETE. +2. **Apply Idempotency Key**: If the request is mutating, the middleware will: + - Use a custom idempotency key if provided. + - Otherwise, generate a key using the configured `IdempotencyKeyGenerator` if available. + - If no generator is set and no key is provided, no idempotency key is applied. + +### Customizing Idempotency Key + +You can customize how idempotency keys are generated or applied in several ways: + +- **Provide a Custom Key**: Manually set an idempotency key for a specific request. +- **Use a Custom Generator**: Implement the `IdempotencyKeyGeneratorContract` to provide a custom method of generating idempotency keys. + +#### Example: Setting a Custom Key + +```php +$mollie->setIdempotencyKey('your_custom_key_here'); +``` + +#### Example: Using a Custom Key Generator + +Implement your key generator: + +```php +class MyCustomKeyGenerator implements IdempotencyKeyGeneratorContract { + public function generate(): string { + return 'custom_' . bin2hex(random_bytes(10)); + } +} + +$mollie->setIdempotencyKeyGenerator(new MyCustomKeyGenerator()); +``` + +## Best Practices + +- **Unique Keys**: Ensure that each idempotency key is unique to each operation. Typically, UUIDs are used for this purpose. +- **Handling Errors**: Handle errors gracefully, especially when an API call with an idempotency key fails. Check the error message to understand whether you should retry the request with the same key or a new key. + +## Conclusionz + +Using idempotency keys in your API requests to Mollie can significantly enhance the reliability of your payment processing system, ensuring that payments are not unintentionally duplicated and that your application behaves predictably even in the face of network and service interruptions. diff --git a/vendor/mollie/mollie-api-php/docs/payments.md b/vendor/mollie/mollie-api-php/docs/payments.md new file mode 100644 index 0000000..1af930b --- /dev/null +++ b/vendor/mollie/mollie-api-php/docs/payments.md @@ -0,0 +1,94 @@ +##### Multicurrency ##### +Since API v2.0 it is now possible to create non-EUR payments for your customers. +A full list of available currencies can be found [in our documentation](https://docs.mollie.com/guides/multicurrency). + +```php +$payment = $mollie->payments->create([ + "amount" => [ + "currency" => "USD", + "value" => "10.00" + ], + //... +]); +``` +_After creation, the `settlementAmount` will contain the EUR amount that will be settled on your account._ + +##### Create fully integrated iDEAL payments ##### +To fully integrate iDEAL payments on your website, follow these additional steps: + +1. Retrieve the list of issuers (banks) that support iDEAL. + +```php +$method = $mollie->methods->get(\Mollie\Api\Types\PaymentMethod::IDEAL, ["include" => "issuers"]); +``` + +Use the `$method->issuers` list to let the customer pick their preferred issuer. + +_`$method->issuers` will be a list of objects. Use the property `$id` of this object in the + API call, and the property `$name` for displaying the issuer to your customer._ + +2. Create a payment with the selected issuer: + +```php +$payment = $mollie->payments->create([ + "amount" => [ + "currency" => "EUR", + "value" => "10.00" + ], + "description" => "My first API payment", + "redirectUrl" => "https://webshop.example.org/order/12345/", + "webhookUrl" => "https://webshop.example.org/mollie-webhook/", + "method" => \Mollie\Api\Types\PaymentMethod::IDEAL, + "issuer" => $selectedIssuerId, // e.g. "ideal_INGBNL2A" +]); +``` + +_The `_links` property of the `$payment` object will contain an object `checkout` with a `href` property, which is a URL that points directly to the online banking environment of the selected issuer. +A short way of retrieving this URL can be achieved by using the `$payment->getCheckoutUrl()`._ + +For a more in-depth example, see [Example - iDEAL payment](./recipes/payments/create-ideal-payment.md). + +#### Retrieving Payments #### +**[Retrieve Payment Documentation](https://docs.mollie.com/reference/v2/payments-api/get-payment)** + +We can use the `$payment->id` to retrieve a payment and check if the payment `isPaid`. + +```php +$payment = $mollie->payments->get($payment->id); + +if ($payment->isPaid()) +{ + echo "Payment received."; +} +``` + +Or retrieve a collection of payments. + +```php +$payments = $mollie->payments->page(); +``` + +For an extensive example of listing payments with the details and status, see [Example - List Payments](./recipes/payments/list-payments.md). + +#### Refunding payments #### +**[Refund Payment Documentation](https://docs.mollie.com/reference/v2/refunds-api/create-payment-refund)** + +Our API provides support for refunding payments. It's important to note that there is no confirmation step, and all refunds are immediate and final. Refunds are available for all payment methods except for paysafecard and gift cards. + +```php +$payment = $mollie->payments->get($payment->id); + +// Refund € 2 of this payment +$refund = $payment->refund([ + "amount" => [ + "currency" => "EUR", + "value" => "2.00" + ] +]); +``` + +#### Payment webhook #### +When the payment status changes, the `webhookUrl` you specified during payment creation will be called. You can use the `id` from the POST parameters to check the status and take appropriate actions. +For more details, refer to [Example - Webhook](./recipes/payments/handle-webhook.md). + +For a working example, see [Example - Refund payment](./recipes/payments/refund-payment.md). diff --git a/vendor/mollie/mollie-api-php/docs/recipes/README.md b/vendor/mollie/mollie-api-php/docs/recipes/README.md new file mode 100644 index 0000000..5277d69 --- /dev/null +++ b/vendor/mollie/mollie-api-php/docs/recipes/README.md @@ -0,0 +1,32 @@ +# Mollie API PHP Recipes + +This directory contains recipes for common use cases with the Mollie API PHP client. Each recipe provides a practical example of how to use the API client for a specific task. + +## Structure + +The recipes are organized by resource type: +- `payments/` - Payment-related operations (create, update, refund, etc.) +- `customers/` - Customer management +- `mandates/` - Mandate operations +- `subscriptions/` - Subscription handling +- `captures/` - Payment capture operations +- `chargebacks/` - Chargeback handling +- `refunds/` - Refund operations +- `connect-balance-transfers/` - Connect balance transfer operations +- `webhooks/` - Webhook management and events + +Each recipe includes: +- Complete code example +- Example response fields +- Additional notes and considerations + +## Getting Started + +Before using any recipe, make sure you have properly initialized the API client: + +```php +use Mollie\Api\MollieApiClient; + +$mollie = new MollieApiClient; +$mollie->setApiKey('test_dHar4XY7LxsDOtmnkVtjNVWXLSlXsM'); +``` diff --git a/vendor/mollie/mollie-api-php/docs/recipes/capabilities/list-capabilities.md b/vendor/mollie/mollie-api-php/docs/recipes/capabilities/list-capabilities.md new file mode 100644 index 0000000..de21f16 --- /dev/null +++ b/vendor/mollie/mollie-api-php/docs/recipes/capabilities/list-capabilities.md @@ -0,0 +1,67 @@ +# List Account Capabilities + +How to retrieve the capabilities of a Mollie account using OAuth. + +## The Code + +```php +use Mollie\Api\Http\Requests\ListCapabilitiesRequest; +use Mollie\Api\Http\Requests\GetCapabilityRequest; + +try { + // Initialize the Mollie client with your OAuth access token + $mollie = new \Mollie\Api\MollieApiClient(); + $mollie->setAccessToken('access_xxx'); + + // List all capabilities + $capabilities = $mollie->send( + new ListCapabilitiesRequest() + ); + + foreach ($capabilities as $capability) { + echo "Capability: {$capability->name}\n"; + echo "- Status: {$capability->status}\n"; + echo "- Description: {$capability->description}\n\n"; + } + + // Get a specific capability + $capability = $mollie->send( + new GetCapabilityRequest( + id: 'payments' + ) + ); + + echo "Payment capability status: {$capability->status}\n"; +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo "API call failed: " . htmlspecialchars($e->getMessage()); +} +``` + +## The Response + +```php +$capability->id; // "payments" +$capability->name; // "Payments" +$capability->description; // "Accept payments from your customers" +$capability->status; // "active", "pending", "inactive" +``` + +## Available Capabilities + +- `payments` - Accept payments from your customers +- `refunds` - Refund payments to your customers +- `settlements` - Receive settlements in your bank account +- `chargebacks` - Handle chargebacks from your customers +- `onboarding` - Complete onboarding to activate your account +- `organizations` - Create and manage organizations + +## Additional Notes + +- You need an OAuth access token to access capabilities +- The status indicates whether a capability is available for use: + - `active`: The capability is enabled and ready to use + - `pending`: The capability is being reviewed or requires additional information + - `inactive`: The capability is disabled or not available +- Some capabilities may require additional verification or documentation +- Capabilities vary by country and account type +- Check capabilities before using certain features to ensure they are available diff --git a/vendor/mollie/mollie-api-php/docs/recipes/connect-balance-transfers/create-balance-transfer.md b/vendor/mollie/mollie-api-php/docs/recipes/connect-balance-transfers/create-balance-transfer.md new file mode 100644 index 0000000..a628dd6 --- /dev/null +++ b/vendor/mollie/mollie-api-php/docs/recipes/connect-balance-transfers/create-balance-transfer.md @@ -0,0 +1,151 @@ +# Create a Connect Balance Transfer + +How to create a balance transfer between two connected Mollie balances using the API. + +## The Code + +```php +use Mollie\Api\Http\Data\Money; +use Mollie\Api\Http\Data\TransferParty; +use Mollie\Api\Http\Requests\CreateConnectBalanceTransferRequest; +use Mollie\Api\Types\ConnectBalanceTransferCategory; + +try { + // Initialize the Mollie client with your OAuth access token + $mollie = new \Mollie\Api\MollieApiClient(); + $mollie->setAccessToken('access_xxx'); + + // Create a balance transfer + $balanceTransfer = $mollie->send( + new CreateConnectBalanceTransferRequest( + amount: new Money( + currency: 'EUR', + value: '100.00' + ), + description: 'Transfer from balance A to balance B', + source: new TransferParty( + id: 'org_12345678', + description: 'Payment from Organization A' + ), + destination: new TransferParty( + id: 'org_87654321', + description: 'Payment to Organization B' + ), + category: ConnectBalanceTransferCategory::MANUAL_CORRECTION + ) + ); + + echo "Balance transfer created: {$balanceTransfer->id}\n"; + echo "Amount: {$balanceTransfer->amount->currency} {$balanceTransfer->amount->value}\n"; + echo "Status: Transfer initiated\n"; +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo "API call failed: " . htmlspecialchars($e->getMessage()); +} +``` + +## Using Endpoint Collections (Legacy Style) + +```php +try { + // Create a balance transfer using endpoint collections + $balanceTransfer = $mollie->connectBalanceTransfers->create([ + 'amount' => [ + 'currency' => 'EUR', + 'value' => '100.00' + ], + 'description' => 'Transfer from balance A to balance B', + 'source' => [ + 'type' => 'organization', + 'id' => 'org_12345678', + 'description' => 'Payment from Organization A' + ], + 'destination' => [ + 'type' => 'organization', + 'id' => 'org_87654321', + 'description' => 'Payment to Organization B' + ], + 'category' => 'manual_correction' + ]); + + echo "Balance transfer created: {$balanceTransfer->id}\n"; +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo "API call failed: " . htmlspecialchars($e->getMessage()); +} +``` + +## The Response + +```php +$balanceTransfer->id; // "cbt_4KgGJJSZpH" +$balanceTransfer->resource; // "connect-balance-transfer" +$balanceTransfer->amount->currency; // "EUR" +$balanceTransfer->amount->value; // "100.00" +$balanceTransfer->description; // "Transfer from balance A to balance B" +$balanceTransfer->status; // "created", "failed", "succeeded" +$balanceTransfer->statusReason; // Object with status reason (if applicable) +$balanceTransfer->category; // "manual_correction", "purchase", "refund", etc. +$balanceTransfer->source->type; // "organization" +$balanceTransfer->source->id; // "org_12345678" +$balanceTransfer->source->description; // "Payment from Organization A" +$balanceTransfer->destination->type; // "organization" +$balanceTransfer->destination->id; // "org_87654321" +$balanceTransfer->destination->description; // "Payment to Organization B" +$balanceTransfer->executedAt; // "2023-12-25T10:31:00+00:00" (null if not executed) +$balanceTransfer->mode; // "live" or "test" +$balanceTransfer->createdAt; // "2023-12-25T10:30:54+00:00" +``` + +## Transfer Status + +The transfer status indicates the current state of the transfer: + +```php +// Check transfer status +if ($balanceTransfer->status === 'succeeded') { + echo "Transfer completed successfully\n"; + echo "Executed at: {$balanceTransfer->executedAt}\n"; +} elseif ($balanceTransfer->status === 'failed') { + echo "Transfer failed\n"; + if ($balanceTransfer->statusReason) { + echo "Reason: " . json_encode($balanceTransfer->statusReason) . "\n"; + } +} +``` + +## Transfer Categories + +Different transfer categories may have different fees: + +- `invoice_collection` - Collecting invoice payments +- `purchase` - Purchase-related transfers +- `chargeback` - Chargeback transfers +- `refund` - Refund transfers +- `service_penalty` - Service penalty fees +- `discount_compensation` - Discount compensations +- `manual_correction` - Manual corrections +- `other_fee` - Other fees + +## Additional Notes + +- **OAuth Required**: You need an OAuth access token to create balance transfers. API keys are not supported for this endpoint. +- **Sub-merchant consent**: You must have a documented consent from your sub-merchants authorizing balance movements. +- **Balance Ownership**: You can only transfer funds between balances that belong to organizations connected through your OAuth app. +- **Transfer Speed**: Balance transfers are processed immediately. The funds are moved instantly between the balances. +- **Status Tracking**: Monitor the `status` field to track transfer completion. Check `executedAt` for the exact completion time. +- **Currency Requirements**: + - Both balances must use the same currency + - The transfer amount must match the balance currency +- **Balance Validation**: + - The source balance must have sufficient available funds + - Both balances must be active and operational +- **Use Cases**: + - Moving funds between merchant balances in a marketplace + - Redistributing funds across different connected accounts + - Managing liquidity between multiple balances +- **Permissions**: Your OAuth app must have the appropriate scopes to access and transfer between the balances +- **Idempotency**: Consider using idempotency keys when creating transfers to prevent duplicate transfers in case of network issues + +## Related Resources + +- [List Connect Balance Transfers](list-balance-transfers.md) +- [Get Connect Balance Transfer](get-balance-transfer.md) diff --git a/vendor/mollie/mollie-api-php/docs/recipes/connect-balance-transfers/get-balance-transfer.md b/vendor/mollie/mollie-api-php/docs/recipes/connect-balance-transfers/get-balance-transfer.md new file mode 100644 index 0000000..4930c73 --- /dev/null +++ b/vendor/mollie/mollie-api-php/docs/recipes/connect-balance-transfers/get-balance-transfer.md @@ -0,0 +1,105 @@ +# Get a Connect Balance Transfer + +How to retrieve details of a specific connect balance transfer using the Mollie API. + +## The Code + +```php +use Mollie\Api\Http\Requests\GetConnectBalanceTransferRequest; + +try { + // Initialize the Mollie client with your OAuth access token + $mollie = new \Mollie\Api\MollieApiClient(); + $mollie->setAccessToken('access_xxx'); + + // Get a specific balance transfer + $balanceTransfer = $mollie->send( + new GetConnectBalanceTransferRequest( + id: 'cbt_4KgGJJSZpH' + ) + ); + + echo "Balance Transfer {$balanceTransfer->id}:\n"; + echo "- Amount: {$balanceTransfer->amount->currency} {$balanceTransfer->amount->value}\n"; + echo "- Description: {$balanceTransfer->description}\n"; + echo "- From: {$balanceTransfer->source->balanceId}\n"; + echo "- To: {$balanceTransfer->destination->balanceId}\n"; + echo "- Created: {$balanceTransfer->createdAt}\n"; +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo "API call failed: " . htmlspecialchars($e->getMessage()); +} +``` + +## Using Endpoint Collections (Legacy Style) + +```php +try { + // Get a balance transfer using endpoint collections + $balanceTransfer = $mollie->connectBalanceTransfers->get('cbt_4KgGJJSZpH'); + + echo "Transfer amount: {$balanceTransfer->amount->value}\n"; + echo "Transfer description: {$balanceTransfer->description}\n"; +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo "API call failed: " . htmlspecialchars($e->getMessage()); +} +``` + +## The Response + +```php +$balanceTransfer->id; // "cbt_4KgGJJSZpH" +$balanceTransfer->resource; // "connect-balance-transfer" +$balanceTransfer->amount->currency; // "EUR" +$balanceTransfer->amount->value; // "100.00" +$balanceTransfer->description; // "Transfer from balance A to balance B" +$balanceTransfer->status; // "created", "failed", "succeeded" +$balanceTransfer->statusReason; // Object with status reason (if applicable) +$balanceTransfer->category; // "manual_correction", "purchase", "refund", etc. +$balanceTransfer->source->type; // "organization" +$balanceTransfer->source->id; // "org_12345678" +$balanceTransfer->source->description; // "Payment from Organization A" +$balanceTransfer->destination->type; // "organization" +$balanceTransfer->destination->id; // "org_87654321" +$balanceTransfer->destination->description; // "Payment to Organization B" +$balanceTransfer->executedAt; // "2023-12-25T10:31:00+00:00" (null if not executed) +$balanceTransfer->mode; // "live" or "test" +$balanceTransfer->createdAt; // "2023-12-25T10:30:54+00:00" +$balanceTransfer->_links; // Object containing relevant URLs +``` + +## Transfer Party Details + +Access the transfer party information: + +```php +// Source party details +echo "Source Organization:\n"; +echo "- Type: {$balanceTransfer->source->type}\n"; // "organization" +echo "- ID: {$balanceTransfer->source->id}\n"; // Organization token +echo "- Description: {$balanceTransfer->source->description}\n"; + +// Destination party details +echo "Destination Organization:\n"; +echo "- Type: {$balanceTransfer->destination->type}\n"; +echo "- ID: {$balanceTransfer->destination->id}\n"; +echo "- Description: {$balanceTransfer->destination->description}\n"; +``` + +## Additional Notes + +- **OAuth Required**: You need an OAuth access token to retrieve balance transfer details +- **Access Control**: You can only retrieve transfers involving balances accessible through your OAuth app +- **Transfer Tracking**: Use the transfer ID to track and audit balance movements +- **Embedded Data**: The response may include embedded balance details for both source and destination balances +- **Links**: The `_links` object contains URLs to related resources: + - `self`: Link to this balance transfer + - `documentation`: Link to API documentation +- **Audit Trail**: Store transfer IDs in your system for reconciliation and reporting purposes +- **Error Handling**: + - Returns 404 if the transfer ID doesn't exist + - Returns 403 if you don't have permission to access this transfer + +## Related Resources + +- [Create Connect Balance Transfer](create-balance-transfer.md) +- [List Connect Balance Transfers](list-balance-transfers.md) diff --git a/vendor/mollie/mollie-api-php/docs/recipes/connect-balance-transfers/list-balance-transfers.md b/vendor/mollie/mollie-api-php/docs/recipes/connect-balance-transfers/list-balance-transfers.md new file mode 100644 index 0000000..fd5af00 --- /dev/null +++ b/vendor/mollie/mollie-api-php/docs/recipes/connect-balance-transfers/list-balance-transfers.md @@ -0,0 +1,177 @@ +# List Connect Balance Transfers + +How to retrieve a list of all connect balance transfers using the Mollie API. + +## The Code + +```php +use Mollie\Api\Http\Requests\ListConnectBalanceTransfersRequest; + +try { + // Initialize the Mollie client with your OAuth access token + $mollie = new \Mollie\Api\MollieApiClient(); + $mollie->setAccessToken('access_xxx'); + + // List all balance transfers + $balanceTransfers = $mollie->send( + new ListConnectBalanceTransfersRequest() + ); + + foreach ($balanceTransfers as $transfer) { + echo "Transfer {$transfer->id}:\n"; + echo "- Amount: {$transfer->amount->currency} {$transfer->amount->value}\n"; + echo "- Description: {$transfer->description}\n"; + echo "- From: {$transfer->source->balanceId}\n"; + echo "- To: {$transfer->destination->balanceId}\n"; + echo "- Created: {$transfer->createdAt}\n\n"; + } + + // Get the next page if available + if ($balanceTransfers->hasNext()) { + $nextPage = $balanceTransfers->next(); + // Process next page... + } +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo "API call failed: " . htmlspecialchars($e->getMessage()); +} +``` + +## With Pagination Parameters + +```php +use Mollie\Api\Http\Requests\ListConnectBalanceTransfersRequest; + +try { + // List balance transfers with pagination + $balanceTransfers = $mollie->send( + new ListConnectBalanceTransfersRequest( + from: 'cbt_8KhHNOSdpL', // Start from this ID + limit: 50, // Limit to 50 results + sort: 'createdAt' // Sort by creation date + ) + ); + + foreach ($balanceTransfers as $transfer) { + // Process each transfer... + } +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo "API call failed: " . htmlspecialchars($e->getMessage()); +} +``` + +## Using Iterator for All Transfers + +```php +use Mollie\Api\Http\Requests\ListConnectBalanceTransfersRequest; + +try { + // Use iterator to automatically handle pagination + $request = new ListConnectBalanceTransfersRequest(); + + $allTransfers = $mollie->send($request->useIterator()); + + foreach ($allTransfers as $transfer) { + echo "Transfer {$transfer->id}: "; + echo "{$transfer->amount->currency} {$transfer->amount->value}\n"; + } +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo "API call failed: " . htmlspecialchars($e->getMessage()); +} +``` + +## Using Endpoint Collections (Legacy Style) + +```php +try { + // List balance transfers using endpoint collections + $balanceTransfers = $mollie->connectBalanceTransfers->page(); + + foreach ($balanceTransfers as $transfer) { + echo "Transfer: {$transfer->description}\n"; + echo "Amount: {$transfer->amount->value}\n\n"; + } + + // Use iterator for automatic pagination + foreach ($mollie->connectBalanceTransfers->iterator() as $transfer) { + // Process each transfer across all pages... + } +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo "API call failed: " . htmlspecialchars($e->getMessage()); +} +``` + +## The Response + +```php +// Collection properties +$balanceTransfers->count; // Number of transfers in current page +$balanceTransfers->_links; // Pagination links + +// Individual transfer properties +$transfer->id; // "cbt_4KgGJJSZpH" +$transfer->resource; // "connect-balance-transfer" +$transfer->amount->currency; // "EUR" +$transfer->amount->value; // "100.00" +$transfer->description; // "Transfer from balance A to balance B" +$transfer->status; // "created", "failed", "succeeded" +$transfer->category; // "manual_correction", "purchase", "refund", etc. +$transfer->source->type; // "organization" +$transfer->source->id; // "org_12345678" +$transfer->source->description; // "Payment from Organization A" +$transfer->destination->type; // "organization" +$transfer->destination->id; // "org_87654321" +$transfer->destination->description; // "Payment to Organization B" +$transfer->executedAt; // "2023-12-25T10:31:00+00:00" (null if not executed) +$transfer->mode; // "live" or "test" +$transfer->createdAt; // "2023-12-25T10:30:54+00:00" +``` + +## Pagination Methods + +```php +// Check if there's a next page +if ($balanceTransfers->hasNext()) { + $nextPage = $balanceTransfers->next(); +} + +// Check if there's a previous page +if ($balanceTransfers->hasPrevious()) { + $previousPage = $balanceTransfers->previous(); +} + +// Get auto-iterator for all transfers +$iterator = $balanceTransfers->getAutoIterator(); +foreach ($iterator as $transfer) { + // Processes all transfers across all pages automatically +} +``` + +## Additional Notes + +- **OAuth Required**: You need an OAuth access token to list balance transfers +- **Access Scope**: The list includes only transfers involving balances accessible through your OAuth app +- **Pagination**: + - Results are paginated with a default limit + - Use `from` parameter to start from a specific transfer ID + - Use `limit` to control the number of results per page (max 250) +- **Sorting**: + - Transfers are returned in descending order by creation date (newest first) + - Use the `sort` parameter to customize ordering +- **Filtering**: Currently, there are no filter parameters available. All accessible transfers are returned. +- **Performance**: + - Use the iterator for processing large numbers of transfers + - The iterator automatically handles pagination + - Set appropriate limits to balance between API calls and memory usage +- **Iteration Direction**: + - By default, iteration goes forward (newest to oldest) + - Set `iterateBackwards: true` to reverse the direction +- **Use Cases**: + - Financial reporting and reconciliation + - Audit trails for balance movements + - Analyzing transfer patterns + - Monitoring platform activity + +## Related Resources + +- [Create Connect Balance Transfer](create-balance-transfer.md) +- [Get Connect Balance Transfer](get-balance-transfer.md) diff --git a/vendor/mollie/mollie-api-php/docs/recipes/customers/customer-payments.md b/vendor/mollie/mollie-api-php/docs/recipes/customers/customer-payments.md new file mode 100644 index 0000000..4393be0 --- /dev/null +++ b/vendor/mollie/mollie-api-php/docs/recipes/customers/customer-payments.md @@ -0,0 +1,138 @@ +# Customer Payments + +How to create and manage payments for customers using the Mollie API. + +## First Payment (For Recurring) + +```php +use Mollie\Api\Http\Data\Money; +use Mollie\Api\Http\Requests\CreateCustomerPaymentRequest; +use Mollie\Api\Types\SequenceType; + +try { + // Create the first payment for a customer + $payment = $mollie->send( + new CreateCustomerPaymentRequest( + customerId: 'cst_8wmqcHMN4U', + description: 'First payment - Order #12345', + amount: new Money( + currency: 'EUR', + value: '29.95' + ), + redirectUrl: 'https://example.com/payments/return?order_id=12345', + webhookUrl: 'https://example.com/payments/webhook', + metadata: [ + 'order_id' => '12345' + ], + sequenceType: SequenceType::FIRST // This creates a mandate for future payments + ) + ); + + // Redirect the customer to complete the payment + header('Location: ' . $payment->getCheckoutUrl(), true, 303); +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo "API call failed: " . htmlspecialchars($e->getMessage()); +} +``` + +## Recurring Payment + +```php +use Mollie\Api\Http\Data\Money; +use Mollie\Api\Http\Requests\CreateCustomerPaymentRequest; +use Mollie\Api\Types\SequenceType; + +try { + // Create a recurring payment using the mandate + $payment = $mollie->send( + new CreateCustomerPaymentRequest( + customerId: 'cst_8wmqcHMN4U', + description: 'Recurring payment - Order #12346', + amount: new Money( + currency: 'EUR', + value: '29.95' + ), + webhookUrl: 'https://example.com/payments/webhook', + metadata: [ + 'order_id' => '12346' + ], + sequenceType: SequenceType::RECURRING // This uses the mandate created by the first payment + ) + ); + + // The payment will be either pending or paid immediately + echo "Payment status: {$payment->status}\n"; + echo "Used mandate: {$payment->mandateId}\n"; +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo "API call failed: " . htmlspecialchars($e->getMessage()); +} +``` + +## List Customer Payments + +```php +use Mollie\Api\Http\Requests\GetPaginatedCustomerPaymentsRequest; +use Mollie\Api\Resources\PaymentCollection; + +try { + // Get all payments for a customer + /** @var PaymentCollection */ + $payments = $mollie->send( + new GetPaginatedCustomerPaymentsRequest( + customerId: 'cst_8wmqcHMN4U' + ) + ); + + foreach ($payments as $payment) { + echo "Payment {$payment->id}:\n"; + echo "- Description: {$payment->description}\n"; + echo "- Amount: {$payment->amount->currency} {$payment->amount->value}\n"; + echo "- Status: {$payment->status}\n"; + + if ($payment->hasRefunds()) { + echo "- Has been (partially) refunded\n"; + } + + if ($payment->hasChargebacks()) { + echo "- Has been charged back\n"; + } + + echo "\n"; + } +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo "API call failed: " . htmlspecialchars($e->getMessage()); +} +``` + +## The Payment Response + +```php +$payment->id; // "tr_7UhSN1zuXS" +$payment->customerId; // "cst_8wmqcHMN4U" +$payment->mode; // "live" or "test" +$payment->description; // "Order #12345" +$payment->metadata; // Object containing custom metadata +$payment->status; // "open", "pending", "paid", "failed", "expired", "canceled" +$payment->isCancelable; // Whether the payment can be canceled +$payment->sequenceType; // "first" or "recurring" +$payment->redirectUrl; // URL to redirect the customer to +$payment->webhookUrl; // URL for webhook notifications +$payment->createdAt; // "2024-02-24T12:13:14+00:00" +``` + +## Additional Notes + +- First create a customer before creating customer payments +- The first payment creates a mandate for future recurring payments +- Sequence types: + - `first`: Creates a mandate for future payments + - `recurring`: Uses an existing mandate +- Recurring payments: + - Don't need a `redirectUrl` as they use the stored mandate + - Will be executed immediately without customer interaction + - May still be pending depending on the payment method +- The mandate status determines if recurring payments can be created +- Store the payment ID and status in your database +- Always implement proper webhook handling +- Available payment methods may differ for first and recurring payments +- Some payment methods don't support recurring payments diff --git a/vendor/mollie/mollie-api-php/docs/recipes/customers/manage-customers.md b/vendor/mollie/mollie-api-php/docs/recipes/customers/manage-customers.md new file mode 100644 index 0000000..59b9654 --- /dev/null +++ b/vendor/mollie/mollie-api-php/docs/recipes/customers/manage-customers.md @@ -0,0 +1,125 @@ +# Manage Customers + +How to create, update, and delete customers using the Mollie API. + +## Create a Customer + +```php +use Mollie\Api\Http\Requests\CreateCustomerRequest; + +try { + // Create a new customer + $customer = $mollie->send( + new CreateCustomerRequest( + name: 'Luke Skywalker', + email: 'luke@example.com', + locale: 'en_US', + metadata: [ + 'isJedi' => true + ] + ) + ); + + echo "New customer created: {$customer->id}\n"; +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo "API call failed: " . htmlspecialchars($e->getMessage()); +} +``` + +## Update a Customer + +```php +use Mollie\Api\Http\Requests\GetCustomerRequest; +use Mollie\Api\Http\Requests\UpdateCustomerRequest; + +try { + // First retrieve the customer you want to update + $customer = $mollie->send( + new GetCustomerRequest( + id: 'cst_8wmqcHMN4U' + ) + ); + + // Update specific customer fields + $customer = $mollie->send( + new UpdateCustomerRequest( + id: $customer->id, + name: 'Luke Sky', + email: 'luke@example.com', + locale: 'en_US', + metadata: [ + 'isJedi' => true + ] + // Fields we don't specify will keep their current values + ) + ); + + echo "Customer updated: {$customer->name}\n"; +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo "API call failed: " . htmlspecialchars($e->getMessage()); +} +``` + +## Delete a Customer + +```php +use Mollie\Api\Http\Requests\DeleteCustomerRequest; + +try { + // Delete a customer + $mollie->send( + new DeleteCustomerRequest( + id: 'cst_8wmqcHMN4U' + ) + ); + + echo "Customer deleted\n"; +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo "API call failed: " . htmlspecialchars($e->getMessage()); +} +``` + +## The Response + +```php +$customer->id; // "cst_8wmqcHMN4U" +$customer->name; // "Luke Skywalker" +$customer->email; // "luke@example.com" +$customer->locale; // "en_US" +$customer->metadata; // Object containing custom metadata +$customer->mode; // "live" or "test" +$customer->createdAt; // "2024-02-24T12:13:14+00:00" +``` + +## Additional Notes + +- Customers are used to store recurring payment details +- Each customer can have multiple mandates for different payment methods +- The customer ID is required for: + - Creating recurring payments + - Creating subscriptions + - Retrieving payment history +- Customer data should be kept in sync with your own database +- Available locales: + - `en_US` English (US) + - `en_GB` English (UK) + - `nl_NL` Dutch (Netherlands) + - `nl_BE` Dutch (Belgium) + - `fr_FR` French (France) + - `fr_BE` French (Belgium) + - `de_DE` German (Germany) + - `de_AT` German (Austria) + - `de_CH` German (Switzerland) + - `es_ES` Spanish (Spain) + - `ca_ES` Catalan (Spain) + - `pt_PT` Portuguese (Portugal) + - `it_IT` Italian (Italy) + - `nb_NO` Norwegian (Norway) + - `sv_SE` Swedish (Sweden) + - `fi_FI` Finnish (Finland) + - `da_DK` Danish (Denmark) + - `is_IS` Icelandic (Iceland) + - `hu_HU` Hungarian (Hungary) + - `pl_PL` Polish (Poland) + - `lv_LV` Latvian (Latvia) + - `lt_LT` Lithuanian (Lithuania) diff --git a/vendor/mollie/mollie-api-php/docs/recipes/invoices/list-invoices.md b/vendor/mollie/mollie-api-php/docs/recipes/invoices/list-invoices.md new file mode 100644 index 0000000..b0d16f9 --- /dev/null +++ b/vendor/mollie/mollie-api-php/docs/recipes/invoices/list-invoices.md @@ -0,0 +1,84 @@ +# List Mollie Invoices + +How to retrieve your Mollie invoices using the API. + +## The Code + +```php +use Mollie\Api\Http\Requests\GetPaginatedInvoiceRequest; + +try { + // Initialize with OAuth (required for invoices) + $mollie = new \Mollie\Api\MollieApiClient(); + $mollie->setAccessToken('access_xxx'); + + // Get all invoices + $response = $mollie->send( + new GetPaginatedInvoiceRequest() + ); + + foreach ($response as $invoice) { + echo "Invoice {$invoice->reference}:\n"; + echo "- Status: {$invoice->status}\n"; + echo "- Issued: {$invoice->issuedAt}\n"; + echo "- Paid: {$invoice->paidAt}\n"; + echo "- Due: {$invoice->dueAt}\n\n"; + + echo "Lines:\n"; + foreach ($invoice->lines as $line) { + echo "- {$line->description}\n"; + echo " Period: {$line->period}\n"; + echo " Count: {$line->count}\n"; + echo " VAT: {$line->vatPercentage}%\n"; + echo " Amount: {$line->amount->currency} {$line->amount->value}\n\n"; + } + + echo "Totals:\n"; + echo "- Net: {$invoice->netAmount->currency} {$invoice->netAmount->value}\n"; + echo "- VAT: {$invoice->vatAmount->currency} {$invoice->vatAmount->value}\n"; + echo "- Gross: {$invoice->grossAmount->currency} {$invoice->grossAmount->value}\n\n"; + + echo "PDF: {$invoice->_links->pdf->href}\n\n"; + } +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo "API call failed: " . htmlspecialchars($e->getMessage()); +} +``` + +## The Response + +```php +$invoice->id; // "inv_xBEbP9rvAq" +$invoice->reference; // "2024.10000" +$invoice->vatNumber; // "NL123456789B01" +$invoice->status; // "paid", "open" +$invoice->issuedAt; // "2024-02-24" +$invoice->paidAt; // "2024-02-24" +$invoice->dueAt; // "2024-03-24" +$invoice->netAmount; // Object containing amount excluding VAT +$invoice->vatAmount; // Object containing VAT amount +$invoice->grossAmount; // Object containing amount including VAT +$invoice->lines; // Array of invoice lines +$invoice->_links->pdf->href; // URL to download PDF invoice +``` + +## Invoice Line Details + +```php +$line->period; // "2024-01" +$line->description; // "iDEAL transaction fees" +$line->count; // 1337 +$line->vatPercentage; // "21.00" +$line->amount; // Object containing line amount +``` + +## Additional Notes + +- OAuth access token is required to access invoices +- Invoices are generated monthly for your Mollie account +- Each invoice line represents a different type of fee: + - Transaction fees per payment method + - Refund fees + - Chargeback fees + - Other service fees +- The PDF invoice is available through the `_links.pdf.href` URL diff --git a/vendor/mollie/mollie-api-php/docs/recipes/mandates/manage-mandates.md b/vendor/mollie/mollie-api-php/docs/recipes/mandates/manage-mandates.md new file mode 100644 index 0000000..b3fa193 --- /dev/null +++ b/vendor/mollie/mollie-api-php/docs/recipes/mandates/manage-mandates.md @@ -0,0 +1,97 @@ +# Manage Customer Mandates + +How to create, list, and revoke mandates for recurring payments using the Mollie API. + +## Create a Mandate + +```php +use Mollie\Api\Http\Requests\CreateMandateRequest; +use Mollie\Api\Types\MandateMethod; + +try { + // Create a SEPA Direct Debit mandate + $mandate = $mollie->send( + new CreateMandateRequest( + customerId: 'cst_8wmqcHMN4U', + method: MandateMethod::DIRECTDEBIT, + consumerName: 'B. A. Example', + consumerAccount: 'NL34ABNA0243341423' + ) + ); + + echo "New mandate created: {$mandate->id}\n"; +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo "API call failed: " . htmlspecialchars($e->getMessage()); +} +``` + +## List Mandates + +```php +use Mollie\Api\Http\Requests\GetPaginatedMandateRequest; + +try { + // List all mandates for a customer + $response = $mollie->send( + new GetPaginatedMandateRequest( + customerId: 'cst_8wmqcHMN4U' + ) + ); + + foreach ($response as $mandate) { + echo "Mandate {$mandate->id}:\n"; + echo "- Method: {$mandate->method}\n"; + echo "- Status: {$mandate->status}\n"; + echo "- Details: {$mandate->details->consumerName}\n"; + echo " {$mandate->details->consumerAccount}\n\n"; + } +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo "API call failed: " . htmlspecialchars($e->getMessage()); +} +``` + +## Revoke a Mandate + +```php +use Mollie\Api\Http\Requests\RevokeMandateRequest; + +try { + // Revoke a specific mandate + $mollie->send( + new RevokeMandateRequest( + customerId: 'cst_8wmqcHMN4U', + mandateId: 'mdt_h3gAaD5zP' + ) + ); + + echo "Mandate revoked\n"; +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo "API call failed: " . htmlspecialchars($e->getMessage()); +} +``` + +## The Response + +```php +$mandate->id; // "mdt_h3gAaD5zP" +$mandate->status; // "valid", "pending", "invalid" +$mandate->method; // "directdebit" +$mandate->details; // Object containing mandate details +$mandate->customerId; // "cst_8wmqcHMN4U" +$mandate->createdAt; // "2024-02-24T12:13:14+00:00" +$mandate->signatureDate; // "2024-02-24" (optional) +$mandate->mandateReference; // "YOUR-COMPANY-MD13804" (optional) +``` + +## Additional Notes + +- Mandates are used for recurring payments +- A customer can have multiple mandates +- Only valid mandates can be used for payments +- Available mandate methods: + - `directdebit`: SEPA Direct Debit + - `creditcard`: Credit card +- Mandate status: + - `valid`: The mandate is valid and can be used for payments + - `pending`: The mandate is pending and cannot be used yet + - `invalid`: The mandate is invalid and cannot be used diff --git a/vendor/mollie/mollie-api-php/docs/recipes/onboarding/create-client-link.md b/vendor/mollie/mollie-api-php/docs/recipes/onboarding/create-client-link.md new file mode 100644 index 0000000..1370622 --- /dev/null +++ b/vendor/mollie/mollie-api-php/docs/recipes/onboarding/create-client-link.md @@ -0,0 +1,84 @@ +# Create a Client Link + +How to create a client link to onboard new merchants to Mollie through your app. + +## The Code + +```php +use Mollie\Api\Http\Data\Owner; +use Mollie\Api\Resources\ClientLink; +use Mollie\Api\Http\Data\OwnerAddress; +use Mollie\Api\Http\Requests\CreateClientLinkRequest; + +try { + // Create a client link for a new merchant + /** @var ClientLink $clientLink */ + $clientLink = $mollie->send( + new CreateClientLinkRequest( + owner: new Owner( + email: 'merchant@example.com', + givenName: 'John', + familyName: 'Doe', + locale: 'en_US' + ), + organizationName: 'Example Store', + address: new OwnerAddress( + countryCode: 'NL', + streetAndNumber: 'Keizersgracht 313', + postalCode: '1016 EE', + city: 'Amsterdam' + ), + registrationNumber: '30204462', + vatNumber: 'NL123456789B01' + ) + ); + + // Generate the redirect URL for the merchant + $redirectUrl = $clientLink->getRedirectUrl( + clientId: 'app_j9Pakf56Ajta6Y65AkdTtAv', + state: bin2hex(random_bytes(8)), // Random state to prevent CSRF + prompt: 'force', // Always show login screen + scopes: [ + 'onboarding.read', + 'onboarding.write' + ] + ); + + // Redirect the merchant to complete their onboarding + header('Location: ' . $redirectUrl, true, 303); +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo "API call failed: " . htmlspecialchars($e->getMessage()); +} +``` + +## The Response + +```php +$clientLink->id; // "csr_wJPGBj7sFr" +$clientLink->resource; // "client-link" +$clientLink->status; // "pending" +$clientLink->createdAt; // "2024-02-24T12:13:14+00:00" +$clientLink->expiresAt; // "2024-02-25T12:13:14+00:00" +``` + +## Additional Notes + +- Client links are used to onboard new merchants to Mollie through your app +- The link expires after 24 hours +- Required merchant information: + - Owner details (name, email, locale) + - Organization details (name, address) + - Registration number (Chamber of Commerce number) + - VAT number (if applicable) +- The `state` parameter should be: + - Random and unique + - Stored in your session + - Verified when the merchant returns to prevent CSRF attacks +- Available scopes: + - `onboarding.read`: View onboarding status + - `onboarding.write`: Update onboarding information +- The merchant will need to: + 1. Create a Mollie account or log in + 2. Connect their account to your app + 3. Complete the onboarding process +- You can track the onboarding status through the OAuth APIs diff --git a/vendor/mollie/mollie-api-php/docs/recipes/payment-links/manage-payment-links.md b/vendor/mollie/mollie-api-php/docs/recipes/payment-links/manage-payment-links.md new file mode 100644 index 0000000..4346e58 --- /dev/null +++ b/vendor/mollie/mollie-api-php/docs/recipes/payment-links/manage-payment-links.md @@ -0,0 +1,71 @@ +# Manage Payment Links + +How to create and list payment links using the Mollie API. + +## Create a Payment Link + +```php +use Mollie\Api\Http\Requests\CreatePaymentLinkRequest; + +try { + // Create a payment link + $paymentLink = $mollie->send( + new CreatePaymentLinkRequest([ + 'amount' => [ + 'currency' => 'EUR', + 'value' => '10.00' + ], + 'description' => 'Bicycle tires', + 'expiresAt' => '2026-01-01T12:00:00', // optional + 'webhookUrl' => 'https://example.com/webhook' // optional + ]) + ); + + // Redirect the customer to the payment link + header('Location: ' . $paymentLink->getCheckoutUrl(), true, 303); +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo "API call failed: " . htmlspecialchars($e->getMessage()); +} +``` + +## List Payment Links + +```php +use Mollie\Api\Http\Requests\GetPaginatedPaymentLinksRequest; + +try { + // List all payment links + $response = $mollie->send(new GetPaginatedPaymentLinksRequest); + + foreach ($response as $paymentLink) { + echo "Payment Link {$paymentLink->id}:\n"; + echo "- Description: {$paymentLink->description}\n"; + echo "- Amount: {$paymentLink->amount->currency} {$paymentLink->amount->value}\n"; + echo "- Status: {$paymentLink->status}\n"; + echo "- Created: {$paymentLink->createdAt}\n"; + echo "- URL: {$paymentLink->getCheckoutUrl()}\n\n"; + } +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo "API call failed: " . htmlspecialchars($e->getMessage()); +} +``` + +## The Response + +```php +$paymentLink->id; // "pl_4Y0eZitmBnQ6IDoMqZQKh" +$paymentLink->description; // "Bicycle tires" +$paymentLink->amount; // Object containing amount and currency +$paymentLink->status; // "paid", "open", "expired" +$paymentLink->createdAt; // "2024-02-24T12:13:14.)Z" +$paymentLink->paidAt; // "2024-02-24T12:15:16.0Z" (optional) +$paymentLink->expiresAt; // "2026-01-01T00:00:00.0Z" (optional) +$paymentLink->webhookUrl; // "https://example.com/webhook" (optional) +``` + +## Additional Notes + +- Payment links are shareable URLs to accept payments +- They never expire unless you specify an `expiresAt` date +- The webhook will be called when the payment status changes +- Payment links can be shared via email, chat, or QR code diff --git a/vendor/mollie/mollie-api-php/docs/recipes/payments/create-capturable-payment.md b/vendor/mollie/mollie-api-php/docs/recipes/payments/create-capturable-payment.md new file mode 100644 index 0000000..6919222 --- /dev/null +++ b/vendor/mollie/mollie-api-php/docs/recipes/payments/create-capturable-payment.md @@ -0,0 +1,60 @@ +# Create a Capturable Payment + +How to create a payment that can be captured manually with the Mollie API. + +## The Code + +```php +use Mollie\Api\Http\Data\Money; +use Mollie\Api\Http\Requests\CreatePaymentRequest; +use Mollie\Api\Types\PaymentMethod; + +try { + // Generate a unique order ID + $orderId = time(); + + // Create the payment + $payment = $mollie->send( + new CreatePaymentRequest( + description: "Order #{$orderId}", + amount: new Money(currency: 'EUR', value: '10.00'), + redirectUrl: "https://example.com/return.php?order_id={$orderId}", + cancelUrl: "https://example.com/cancel.php", + webhookUrl: "https://example.com/webhook.php", + metadata: ['order_id' => $orderId], + method: PaymentMethod::CREDITCARD, + captureMode: 'manual' + ) + ); + + // Store the order in the database + database_write($orderId, $payment->status); + + // Redirect to checkout + header('Location: ' . $payment->getCheckoutUrl(), true, 303); +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo 'API call failed: ' . htmlspecialchars($e->getMessage()); +} +``` + +## The Response + +```php +$payment->id; // "tr_7UhSN1zuXS" +$payment->status; // "open" +$payment->amount->currency; // "EUR" +$payment->amount->value; // "10.00" +$payment->description; // "Order #1234" +$payment->metadata->order_id; // "1234" +$payment->method; // "creditcard" +$payment->captureMode; // "manual" +$payment->getCheckoutUrl(); // "https://www.mollie.com/checkout/select-method/7UhSN1zuXS" +``` + +## Additional Notes + +- Manual capturing is currently only supported for credit card payments, Billie, Riverty, and Klarna +- For Klarna payments, submitting more data like order lines and addresses is required +- After the payment is authorized, you'll need to capture it manually to actually charge the customer +- The payment will remain in the 'authorized' status until you either capture or cancel it +- Make sure to implement the webhook handler to process payment status updates diff --git a/vendor/mollie/mollie-api-php/docs/recipes/payments/create-capture.md b/vendor/mollie/mollie-api-php/docs/recipes/payments/create-capture.md new file mode 100644 index 0000000..662c4ab --- /dev/null +++ b/vendor/mollie/mollie-api-php/docs/recipes/payments/create-capture.md @@ -0,0 +1,49 @@ +# Create a Payment Capture + +How to capture a payment that was created with manual capture using the Mollie API. + +## The Code + +```php +use Mollie\Api\Http\Data\Money; +use Mollie\Api\Resources\Capture; +use Mollie\Api\Http\Requests\CreatePaymentCaptureRequest; + +try { + // Create a capture for the payment + /** @var Capture */ + $capture = $mollie->send( + new CreatePaymentCaptureRequest( + paymentId: 'tr_WDqYK6vllg', + description: 'Order #12345', + amount: new Money(currency: 'EUR', value: '5.00') + ) + ); + + echo "New capture created: {$capture->id}\n"; +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo "API call failed: " . htmlspecialchars($e->getMessage()); +} +``` + +## The Response + +```php +$capture->id; // "cpt_4qqhO89gsT" +$capture->paymentId; // "tr_WDqYK6vllg" +$capture->amount->currency; // "EUR" +$capture->amount->value; // "5.00" +$capture->description; // "Order #12345" +$capture->status; // "pending", "succeeded", "failed" +$capture->createdAt; // "2024-02-24T12:13:14+00:00" +``` + +## Additional Notes + +- The payment must have been created with `captureMode: 'manual'` +- The capture amount can be equal to or lower than the payment amount +- You can create multiple partial captures for a single payment +- The capture will be processed asynchronously +- The payment status will change to `paid` once the capture is successful +- Make sure to handle the webhook to process capture status updates +- Captures are only available for certain payment methods (e.g., credit cards) diff --git a/vendor/mollie/mollie-api-php/docs/recipes/payments/create-ideal-payment.md b/vendor/mollie/mollie-api-php/docs/recipes/payments/create-ideal-payment.md new file mode 100644 index 0000000..f25aa10 --- /dev/null +++ b/vendor/mollie/mollie-api-php/docs/recipes/payments/create-ideal-payment.md @@ -0,0 +1,56 @@ +# Create an iDEAL Payment + +How to prepare a new iDEAL payment with the Mollie API. + +## The Code + +```php +use Mollie\Api\Http\Data\Money; +use Mollie\Api\Http\Requests\CreatePaymentRequest; +use Mollie\Api\Types\PaymentMethod; + +try { + // Generate a unique order ID + $orderId = time(); + + // Create the payment + $payment = $mollie->send( + new CreatePaymentRequest( + description: "Order #{$orderId}", + amount: new Money(currency: 'EUR', value: '27.50'), + redirectUrl: "https://example.com/return.php?order_id={$orderId}", + cancelUrl: "https://example.com/cancel.php", + webhookUrl: "https://example.com/webhook.php", + metadata: ['order_id' => $orderId], + method: PaymentMethod::IDEAL + ) + ); + + // Store the order in the database + database_write($orderId, $payment->status); + + // Redirect to checkout + header('Location: ' . $payment->getCheckoutUrl(), true, 303); +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo 'API call failed: ' . htmlspecialchars($e->getMessage()); +} +``` + +## The Response + +```php +$payment->id; // "tr_7UhSN1zuXS" +$payment->status; // "open" +$payment->amount->currency; // "EUR" +$payment->amount->value; // "27.50" +$payment->description; // "Order #1234" +$payment->metadata->order_id; // "1234" +$payment->method; // "ideal" +$payment->getCheckoutUrl(); // "https://www.mollie.com/checkout/select-method/7UhSN1zuXS" +``` + +## Additional Notes + +- The iDEAL payment method is only available for payments in EUR +- The bank selection is now handled by iDEAL +- The webhook will be called when the payment status changes, so make sure to implement the webhook handler to process status updates diff --git a/vendor/mollie/mollie-api-php/docs/recipes/payments/create-payment-oauth.md b/vendor/mollie/mollie-api-php/docs/recipes/payments/create-payment-oauth.md new file mode 100644 index 0000000..ab3337d --- /dev/null +++ b/vendor/mollie/mollie-api-php/docs/recipes/payments/create-payment-oauth.md @@ -0,0 +1,64 @@ +# Create a Payment with OAuth + +How to create a payment using OAuth authentication with the Mollie API. + +## The Code + +```php +use Mollie\Api\Http\Data\Money; +use Mollie\Api\Http\Requests\CreatePaymentRequest; +use Mollie\Api\Http\Requests\GetPaginatedProfilesRequest; + +try { + // Initialize the Mollie client with your OAuth access token + $mollie = new \Mollie\Api\MollieApiClient(); + $mollie->setAccessToken('access_xxx'); + + // Get the first available profile since OAuth tokens don't belong to a specific profile + $profiles = $mollie->send(new GetPaginatedProfilesRequest); + + $profile = $profiles[0]; // Select the correct profile for this merchant + + // Generate a unique order ID + $orderId = time(); + + // Create the payment + $payment = $mollie->send( + new CreatePaymentRequest( + profileId: $profile->id, // Required when using OAuth + description: "Order #{$orderId}", + amount: new Money(currency: 'EUR', value: '10.00'), + redirectUrl: 'https://example.com/return.php?order_id=' . $orderId, + cancelUrl: 'https://example.com/cancel.php', + webhookUrl: 'https://example.com/webhook.php', + metadata: ['order_id' => $orderId] + ) + ); + + // Redirect the customer to complete the payment + header('Location: ' . $payment->getCheckoutUrl(), true, 303); +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo "API call failed: " . htmlspecialchars($e->getMessage()); +} +``` + +## The Response + +```php +$payment->id; // "tr_7UhSN1zuXS" +$payment->status; // "open" +$payment->amount->currency; // "EUR" +$payment->amount->value; // "10.00" +$payment->description; // "Order #1234" +$payment->metadata; // Object containing order_id +$payment->profileId; // "pfl_v9hTwCvYqw" +$payment->createdAt; // "2024-02-24T12:13:14+00:00" +``` + +## Additional Notes + +- OAuth access tokens don't belong to a specific profile, so you need to specify the `profileId` parameter +- Get the profile ID by listing the available profiles with `GetPaginatedProfilesRequest` +- OAuth tokens are required for certain features like routing payments +- Make sure to handle the webhook to process payment status updates +- Store your OAuth tokens securely and refresh them when needed diff --git a/vendor/mollie/mollie-api-php/docs/recipes/payments/create-payment.md b/vendor/mollie/mollie-api-php/docs/recipes/payments/create-payment.md new file mode 100644 index 0000000..9dd2bfa --- /dev/null +++ b/vendor/mollie/mollie-api-php/docs/recipes/payments/create-payment.md @@ -0,0 +1,50 @@ +# Create a Payment + +How to prepare a new payment with the Mollie API. + +## The Code + +```php +use Mollie\Api\Http\Data\Money; +use Mollie\Api\Http\Requests\CreatePaymentRequest; + +try { + $payment = $mollie->send( + new CreatePaymentRequest( + description: "Order #{$orderId}", + amount: new Money(currency: 'EUR', value: '10.00'), + redirectUrl: 'https://example.org/return', + cancelUrl: 'https://example.org/cancel', + webhookUrl: 'https://example.org/webhook', + metadata: ['order_id' => $orderId] + ) + ); + + // Get the checkout URL to redirect the customer to + $checkoutUrl = $payment->getCheckoutUrl(); +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo "API call failed: " . htmlspecialchars($e->getMessage()); +} +``` + +## The Response + +```php +$payment->id; // "tr_7UhSN1zuXS" +$payment->status; // "open" +$payment->amount->currency; // "EUR" +$payment->amount->value; // "10.00" +$payment->description; // "Order #1234" +$payment->metadata->order_id; // "1234" +$payment->getCheckoutUrl(); // "https://www.mollie.com/checkout/select-method/7UhSN1zuXS" +``` + +## Additional Notes + +- Always use strings for the amount value to ensure correct decimal precision +- The payment `status` will be `open` when initially created +- Store the payment `id` in your database for reference +- Use `webhookUrl` to get notified of payment status changes +- The `redirectUrl` is where your customer will be redirected after the payment +- You can store any custom data in the `metadata` object +- The checkout URL from `getCheckoutUrl()` is where you should redirect your customer to complete the payment diff --git a/vendor/mollie/mollie-api-php/docs/recipes/payments/create-routed-payment.md b/vendor/mollie/mollie-api-php/docs/recipes/payments/create-routed-payment.md new file mode 100644 index 0000000..f1e0422 --- /dev/null +++ b/vendor/mollie/mollie-api-php/docs/recipes/payments/create-routed-payment.md @@ -0,0 +1,94 @@ +# Create a Routed Payment + +How to create a payment with routing rules using the Mollie API. Routed payments allow you to split payments between connected accounts. + +## The Code + +```php +use Mollie\Api\Http\Data\Money; +use Mollie\Api\Http\Data\Route; +use Mollie\Api\Http\Requests\CreatePaymentRequest; + +try { + // Initialize the Mollie client with your OAuth access token + $mollie = new \Mollie\Api\MollieApiClient(); + $mollie->setAccessToken('access_xxx'); + + // Generate a unique order ID + $orderId = time(); + + // Create the payment with routing rules + $payment = $mollie->send( + new CreatePaymentRequest( + profileId: 'pfl_v9hTwCvYqw', + description: "Order #{$orderId}", + amount: new Money(currency: 'EUR', value: '10.00'), + redirectUrl: 'https://example.com/return.php?order_id=' . $orderId, + cancelUrl: 'https://example.com/cancel.php', + webhookUrl: 'https://example.com/webhook.php', + routing: [ + new Route( + amount: new Money(currency: 'EUR', value: '7.50'), + destination: [ + 'type' => 'organization', + 'organizationId' => 'org_23456' + ] + ) + ] + ) + ); + + // Redirect the customer to complete the payment + header('Location: ' . $payment->getCheckoutUrl(), true, 303); +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo "API call failed: " . htmlspecialchars($e->getMessage()); +} +``` + +### With a Future Release Date + +You can also specify when the routed funds should become available on the connected account's balance: + +```php +$payment = $mollie->send( + new CreatePaymentRequest( + profileId: 'pfl_v9hTwCvYqw', + description: "Order #{$orderId}", + amount: new Money(currency: 'EUR', value: '10.00'), + redirectUrl: 'https://example.com/return.php?order_id=' . $orderId, + cancelUrl: 'https://example.com/cancel.php', + webhookUrl: 'https://example.com/webhook.php', + routing: [ + new Route( + amount: new Money(currency: 'EUR', value: '7.50'), + destination: [ + 'type' => 'organization', + 'organizationId' => 'org_23456' + ], + releaseDate: '2025-01-01' + ) + ] + ) +); +``` + +## The Response + +```php +$payment->id; // "tr_7UhSN1zuXS" +$payment->status; // "open" +$payment->amount->currency; // "EUR" +$payment->amount->value; // "10.00" +$payment->description; // "Order #1234" +$payment->routing; // Array containing routing rules +$payment->createdAt; // "2024-02-24T12:13:14+00:00" +``` + +## Additional Notes + +- Split payments (routing) must be enabled on your account first. Contact Mollie support to enable this feature +- You need an OAuth access token to create routed payments +- The sum of routed amounts cannot exceed the payment amount +- The release date must be in the future and in the format 'YYYY-MM-DD' +- Routing rules are only available for certain payment methods +- Make sure to handle the webhook to process payment status updates diff --git a/vendor/mollie/mollie-api-php/docs/recipes/payments/handle-webhook.md b/vendor/mollie/mollie-api-php/docs/recipes/payments/handle-webhook.md new file mode 100644 index 0000000..76b45d3 --- /dev/null +++ b/vendor/mollie/mollie-api-php/docs/recipes/payments/handle-webhook.md @@ -0,0 +1,98 @@ +# Handle Payment Webhooks + +How to handle payment status updates via webhooks from the Mollie API. + +## The Code + +```php +use Mollie\Api\Http\Requests\GetPaymentRequest; + +try { + // Retrieve the payment's current state + $payment = $mollie->send( + new GetPaymentRequest( + id: $_POST['id'] + ) + ); + $orderId = $payment->metadata->order_id; + + + + // First handle status changes + if ($payment->status !== $previousPaymentStatus) { + // Update your order administration with the new status + updateOrder($orderId, $payment->status); + + // Handle the status change + if ($payment->isPaid()) { + // The payment is paid + // Start the process of delivering the product to the customer + startDeliveryProcess($orderId); + } elseif ($payment->isFailed()) { + // The payment has failed + // Notify the customer + notifyCustomerOfFailure($orderId); + } elseif ($payment->isExpired()) { + // The payment is expired + // Notify the customer + notifyCustomerOfExpiration($orderId); + } elseif ($payment->isCanceled()) { + // The payment is canceled + // Notify the customer + notifyCustomerOfCancellation($orderId); + } + } + + // Then handle refunds and chargebacks (these don't change the payment status) + if ($payment->hasRefunds()) { + // The payment has possibly been (partially) refunded + // Note: the payment status remains "paid" + processPotentialRefund($orderId); + } + + if ($payment->hasChargebacks()) { + // The payment has possibly been (partially) charged back + // Note: the payment status remains "paid" + processPotentialChargeback($orderId); + } + + // Always return 200 OK to Mollie + http_response_code(200); +} catch (\Mollie\Api\Exceptions\ApiException $e) { + // Handle the error + logError($e->getMessage()); + http_response_code(500); +} +``` + +## The Response + +```php +$payment->id; // "tr_7UhSN1zuXS" +$payment->status; // "paid" +$payment->amount->currency; // "EUR" +$payment->amount->value; // "10.00" +$payment->description; // "Order #1234" +$payment->metadata; // Object containing order_id +$payment->createdAt; // "2024-02-24T12:13:14+00:00" +$payment->paidAt; // "2024-02-24T12:15:00+00:00" +``` + +## Additional Notes + +- Handle webhooks in the correct order: + 1. First check for payment status changes + 2. Then handle refunds and chargebacks (these don't change the payment status). +- When completing a payment, the webhook may be called _after_ the customer has already been redirected to the payment's `redirectUrl`. +- A payment can have multiple partial refunds and multiple partial chargebacks. +- Always respond with a 200 OK status code, even when the payment status is not successful +- Process the webhook quickly (within 2 seconds) to avoid timeouts +- Use the payment status helper methods (`$payment->isPaid()`, `$payment->isFailed()`, etc.) for reliable status checks +- Store the payment status in your database to track the order status +- The webhook may be called multiple times for the same payment as Mollie will retry the webhook call. +- Webhooks are sent asynchronously, so there might be a delay +- Test your webhook implementation thoroughly with different payment scenarios, including: + - Status changes (paid, failed, expired, etc.) + - Refunds (full and partial) + - Chargebacks + diff --git a/vendor/mollie/mollie-api-php/docs/recipes/payments/list-methods.md b/vendor/mollie/mollie-api-php/docs/recipes/payments/list-methods.md new file mode 100644 index 0000000..60c2d99 --- /dev/null +++ b/vendor/mollie/mollie-api-php/docs/recipes/payments/list-methods.md @@ -0,0 +1,49 @@ +# List Payment Methods + +How to retrieve all available payment methods with the Mollie API. + +## The Code + +```php +try { + $methods = $mollie->send( + new GetAllMethodsRequest( + includeIssuers: false, + includePricing: false, + locale: 'nl_NL', + amount: new Money(currency: 'EUR', value: '100.00') + ) + ); + + foreach ($methods as $method) { + echo '
'; + echo ' '; + echo htmlspecialchars($method->description) . ' (' . htmlspecialchars($method->id) . ')'; + echo '
'; + } +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo "API call failed: " . htmlspecialchars($e->getMessage()); +} +``` + +## The Response + +```php +$method->id; // "ideal" +$method->description; // "iDEAL" +$method->image->size1x; // "https://www.mollie.com/external/icons/payment-methods/ideal.png" +$method->image->size2x; // "https://www.mollie.com/external/icons/payment-methods/ideal%402x.png" +$method->minimumAmount->value; // "0.01" +$method->minimumAmount->currency; // "EUR" +$method->maximumAmount->value; // "50000.00" +$method->maximumAmount->currency; // "EUR" +``` + +## Additional Notes + +- Use `sequenceType` to filter methods available for recurring payments +- The `locale` parameter affects translations of method names and descriptions +- The `amount` parameter filters methods available for that specific amount +- The `billingCountry` parameter filters methods available in that country +- Each method includes image URLs for regular (1x) and retina (2x) displays +- Methods may have minimum and maximum amount constraints diff --git a/vendor/mollie/mollie-api-php/docs/recipes/payments/list-payments.md b/vendor/mollie/mollie-api-php/docs/recipes/payments/list-payments.md new file mode 100644 index 0000000..c167b07 --- /dev/null +++ b/vendor/mollie/mollie-api-php/docs/recipes/payments/list-payments.md @@ -0,0 +1,69 @@ +# List Payments + +How to retrieve a list of payments from the Mollie API. + +## The Code + +```php +use Mollie\Api\Http\Requests\GetPaginatedPaymentsRequest; + +try { + // Get all payments for this API key ordered by newest + $payments = $mollie->send(new GetPaginatedPaymentsRequest); + + // Display the payments + foreach ($payments as $payment) { + echo "Payment {$payment->id}:\n"; + echo "- Description: {$payment->description}\n"; + echo "- Amount: {$payment->amount->currency} {$payment->amount->value}\n"; + echo "- Status: {$payment->status}\n"; + + if ($payment->hasRefunds()) { + echo "- Has been (partially) refunded\n"; + } + + if ($payment->hasChargebacks()) { + echo "- Has been charged back\n"; + } + + if ($payment->canBeRefunded() && $payment->amountRemaining->currency === 'EUR' && floatval($payment->amountRemaining->value) >= 2.00) { + echo "- Can be refunded\n"; + } + + echo "\n"; + } + + // Get the next page of payments if available + $nextPayments = $payments->next(); + + if (!empty($nextPayments)) { + foreach ($nextPayments as $payment) { + // Process next page of payments... + } + } +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo "API call failed: " . htmlspecialchars($e->getMessage()); +} +``` + +## The Response + +```php +$payment->id; // "tr_7UhSN1zuXS" +$payment->status; // "paid" +$payment->amount->currency; // "EUR" +$payment->amount->value; // "10.00" +$payment->description; // "Order #1234" +$payment->metadata; // Object containing any custom metadata +$payment->createdAt; // "2024-02-24T12:13:14+00:00" +$payment->paidAt; // "2024-02-24T12:15:00+00:00" (or null) +$payment->method; // "ideal" (or null) +``` + +## Additional Notes + +- Payments are returned in descending order by creation date (newest first) +- The list is paginated, use the `next()` method to retrieve the next page +- You can check payment status using helper methods like `isPaid()`, `isFailed()`, etc. +- Use `hasRefunds()` and `hasChargebacks()` to check if a payment has been refunded or charged back +- Use `canBeRefunded()` to check if a payment can still be refunded diff --git a/vendor/mollie/mollie-api-php/docs/recipes/payments/refund-payment.md b/vendor/mollie/mollie-api-php/docs/recipes/payments/refund-payment.md new file mode 100644 index 0000000..2d73a02 --- /dev/null +++ b/vendor/mollie/mollie-api-php/docs/recipes/payments/refund-payment.md @@ -0,0 +1,66 @@ +# Refund a Payment + +How to refund a payment using the Mollie API. + +## The Code + +```php +use Mollie\Api\Http\Data\Money; +use Mollie\Api\Http\Requests\GetPaymentRequest; +use Mollie\Api\Http\Requests\CreatePaymentRefundRequest; + +try { + // Retrieve the payment you want to refund + $payment = $mollie->send( + new GetPaymentRequest( + id: 'tr_WDqYK6vllg' + ) + ); + + // Check if the payment can be refunded + if ($payment->canBeRefunded() && $payment->amountRemaining->currency === 'EUR' && floatval($payment->amountRemaining->value) >= 2.00) { + // Refund € 2,00 of the payment + $refund = $mollie->send( + new CreatePaymentRefundRequest( + paymentId: $payment->id, + description: 'Order cancelled by customer', + amount: new Money(currency: 'EUR', value: '2.00') + ) + ); + + echo "{$refund->amount->currency} {$refund->amount->value} of payment {$payment->id} refunded.\n"; + } else { + echo "Payment {$payment->id} cannot be refunded.\n"; + } + + // List all refunds for this payment + foreach ($payment->refunds() as $refund) { + echo "Refund {$refund->id}:\n"; + echo "- Description: {$refund->description}\n"; + echo "- Amount: {$refund->amount->currency} {$refund->amount->value}\n"; + echo "- Status: {$refund->status}\n\n"; + } +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo "API call failed: " . htmlspecialchars($e->getMessage()); +} +``` + +## The Response + +```php +$refund->id; // "re_4qqhO89gsT" +$refund->amount->currency; // "EUR" +$refund->amount->value; // "2.00" +$refund->status; // "pending", "processing", "refunded", "failed" +$refund->description; // "Order cancelled by customer" +$refund->createdAt; // "2024-02-24T12:13:14+00:00" +$refund->paymentId; // "tr_WDqYK6vllg" +``` + +## Additional Notes + +- Not all payments can be refunded. Use `canBeRefunded()` to check if a payment can be refunded +- You can do partial refunds by specifying a lower amount than the payment amount +- Refunds are not instant. Check the refund status to see if it was successful +- The payment must be in the `paid` status to be refundable +- Some payment methods may have additional requirements or limitations for refunds diff --git a/vendor/mollie/mollie-api-php/docs/recipes/payments/retrieve-captures.md b/vendor/mollie/mollie-api-php/docs/recipes/payments/retrieve-captures.md new file mode 100644 index 0000000..6f32a8a --- /dev/null +++ b/vendor/mollie/mollie-api-php/docs/recipes/payments/retrieve-captures.md @@ -0,0 +1,74 @@ +# Retrieve Payment Captures + +How to retrieve and list captures for a payment using the Mollie API. + +## Get a Single Capture + +```php +use Mollie\Api\Resources\Capture; +use Mollie\Api\Http\Requests\GetPaymentCaptureRequest; + +try { + // Retrieve a specific capture + /** @var Capture $capture */ + $capture = $mollie->send( + new GetPaymentCaptureRequest( + paymentId: 'tr_WDqYK6vllg', + captureId: 'cpt_4qqhO89gsT' + ) + ); + + echo "Captured {$capture->amount->currency} {$capture->amount->value}\n"; +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo "API call failed: " . htmlspecialchars($e->getMessage()); +} +``` + +## List All Captures + +```php +use Mollie\Api\Resources\Capture; +use Mollie\Api\Resources\LazyCollection; +use Mollie\Api\Http\Requests\GetPaginatedPaymentCapturesRequest; + +try { + // List all captures for a payment + /** @var LazyCollection $captures */ + $captures = $mollie->send( + (new GetPaginatedPaymentCapturesRequest( + paymentId: 'tr_WDqYK6vllg' + ))->useIterator() + ); + + /** @var Capture $capture */ + foreach ($captures as $capture) { + echo "Capture {$capture->id}:\n"; + echo "- Amount: {$capture->amount->currency} {$capture->amount->value}\n"; + echo "- Status: {$capture->status}\n"; + echo "- Created: {$capture->createdAt}\n\n"; + } +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo "API call failed: " . htmlspecialchars($e->getMessage()); +} +``` + +## The Response + +```php +$capture->id; // "cpt_4qqhO89gsT" +$capture->paymentId; // "tr_WDqYK6vllg" +$capture->amount->currency; // "EUR" +$capture->amount->value; // "5.00" +$capture->description; // "Order #12345" +$capture->status; // "pending", "succeeded", "failed" +$capture->createdAt; // "2024-02-24T12:13:14+00:00" +``` + +## Additional Notes + +- You can only retrieve captures for payments created with `captureMode: 'manual'` +- A payment can have multiple captures if partial captures were used +- The captures list is paginated, use `next()` to get the next page +- The capture status indicates whether the capture was successful +- The payment status will change to `paid` once all captures are successful +- Make sure to handle the webhook to process capture status updates diff --git a/vendor/mollie/mollie-api-php/docs/recipes/payments/update-payment.md b/vendor/mollie/mollie-api-php/docs/recipes/payments/update-payment.md new file mode 100644 index 0000000..5c1fc02 --- /dev/null +++ b/vendor/mollie/mollie-api-php/docs/recipes/payments/update-payment.md @@ -0,0 +1,65 @@ +# Update a Payment + +How to update an existing payment using the Mollie API. + +## The Code + +```php +use Mollie\Api\Http\Requests\GetPaymentRequest; +use Mollie\Api\Http\Requests\UpdatePaymentRequest; + +try { + // First retrieve the payment you want to update + $payment = $mollie->send( + new GetPaymentRequest( + id: 'tr_7UhSN1zuXS' + ) + ); + + // Update specific payment fields + $newOrderId = 98765; + $payment = $mollie->send( + new UpdatePaymentRequest( + id: $payment->id, + description: "Order #{$newOrderId}", + redirectUrl: 'https://example.com/return.php?order_id=' . $newOrderId, + metadata: ['order_id' => $newOrderId] + // Fields we don't specify will keep their current values: + // - webhookUrl + // - cancelUrl + // - etc. + ) + ); + + // Redirect the customer to complete the payment + header('Location: ' . $payment->getCheckoutUrl(), true, 303); +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo "API call failed: " . htmlspecialchars($e->getMessage()); +} +``` + +## The Response + +```php +$payment->id; // "tr_7UhSN1zuXS" +$payment->status; // "open" +$payment->description; // "Order #98765" +$payment->redirectUrl; // "https://example.com/return.php?order_id=98765" +$payment->webhookUrl; // "https://example.com/webhook.php" +$payment->metadata; // Object containing order_id +$payment->createdAt; // "2024-02-24T12:13:14+00:00" +$payment->updatedAt; // "2024-02-24T12:15:00+00:00" +``` + +## Additional Notes + +- Only certain fields can be updated, including: + - description + - redirectUrl + - cancelUrl + - webhookUrl + - metadata +- You cannot update the amount or currency of a payment +- The payment must be in a state that allows updates (e.g., you cannot update a completed payment) +- Make sure to handle the webhook to process payment status updates +- The updatedAt field will be set to the time of the last update diff --git a/vendor/mollie/mollie-api-php/docs/recipes/profiles/manage-profiles.md b/vendor/mollie/mollie-api-php/docs/recipes/profiles/manage-profiles.md new file mode 100644 index 0000000..8157090 --- /dev/null +++ b/vendor/mollie/mollie-api-php/docs/recipes/profiles/manage-profiles.md @@ -0,0 +1,112 @@ +# Manage Profiles + +How to create, update, list, and delete profiles using the Mollie API. + +## Create a Profile + +```php +use Mollie\Api\Http\Requests\CreateProfileRequest; + +try { + // Create a new profile + $profile = $mollie->send( + new CreateProfileRequest([ + 'name' => 'My Website Name', + 'website' => 'https://www.mywebsite.com', + 'email' => 'info@mywebsite.com', + 'phone' => '+31208202070', + 'businessCategory' => 'MARKETPLACES', + 'mode' => 'live' + ]) + ); + + echo "Profile created: {$profile->name}\n"; +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo "API call failed: " . htmlspecialchars($e->getMessage()); +} +``` + +## List Profiles + +```php +use Mollie\Api\Http\Requests\GetPaginatedProfilesRequest; + +try { + // List all profiles + $response = $mollie->send(new GetPaginatedProfilesRequest); + + foreach ($response as $profile) { + echo "Profile {$profile->id}:\n"; + echo "- Name: {$profile->name}\n"; + echo "- Website: {$profile->website}\n"; + echo "- Mode: {$profile->mode}\n"; + echo "- Status: {$profile->status}\n\n"; + } +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo "API call failed: " . htmlspecialchars($e->getMessage()); +} +``` + +## Update a Profile + +```php +use Mollie\Api\Http\Requests\UpdateProfileRequest; + +try { + // Update an existing profile + $profile = $mollie->send( + new UpdateProfileRequest( + id: 'pfl_v9hTwCvYqw', + name: 'Updated Website Name', + website: 'https://www.updated-website.com', + email: 'info@updated-website.com', + phone: '+31208202071', + businessCategory: 'MARKETPLACES' + ) + ); + + echo "Profile updated: {$profile->name}\n"; +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo "API call failed: " . htmlspecialchars($e->getMessage()); +} +``` + +## Delete a Profile + +```php +use Mollie\Api\Http\Requests\DeleteProfileRequest; + +try { + // Delete a profile + $mollie->send( + new DeleteProfileRequest( + profileId: 'pfl_v9hTwCvYqw' + ) + ); + + echo "Profile deleted\n"; +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo "API call failed: " . htmlspecialchars($e->getMessage()); +} +``` + +## The Response + +```php +$profile->id; // "pfl_v9hTwCvYqw" +$profile->mode; // "live" or "test" +$profile->name; // "My Website Name" +$profile->website; // "https://www.mywebsite.com" +$profile->email; // "info@mywebsite.com" +$profile->phone; // "+31208202070" +$profile->businessCategory; // "MARKETPLACES" +$profile->status; // "verified", "unverified" +$profile->review; // Object containing review status (optional) +$profile->createdAt; // "2024-02-24T12:13:14+00:00" +``` + +## Additional Notes + +- OAuth access token is required to manage profiles +- A profile represents your business or website +- Business categories define the type of products/services you offer \ No newline at end of file diff --git a/vendor/mollie/mollie-api-php/docs/recipes/sales-invoices/manage-sales-invoices.md b/vendor/mollie/mollie-api-php/docs/recipes/sales-invoices/manage-sales-invoices.md new file mode 100644 index 0000000..6f481b0 --- /dev/null +++ b/vendor/mollie/mollie-api-php/docs/recipes/sales-invoices/manage-sales-invoices.md @@ -0,0 +1,47 @@ +# Manage Sales Invoices + +How to list and manage sales invoices using the Mollie API. + +## List Sales Invoices + +```php +use Mollie\Api\Http\Requests\GetPaginatedSalesInvoicesRequest; + +try { + // List all sales invoices + $response = $mollie->send(new GetPaginatedSalesInvoicesRequest); + + foreach ($response as $invoice) { + echo "Invoice {$invoice->reference}:\n"; + echo "- Status: {$invoice->status}\n"; + echo "- Issued: {$invoice->issuedAt}\n"; + echo "- Amount: {$invoice->amount->currency} {$invoice->amount->value}\n"; + echo "- PDF: {$invoice->_links->pdf->href}\n\n"; + } +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo "API call failed: " . htmlspecialchars($e->getMessage()); +} +``` + +## The Response + +```php +$invoice->id; // "si_abc123" +$invoice->reference; // "2024.0001" +$invoice->status; // "paid", "open" +$invoice->issuedAt; // "2024-02-24" +$invoice->paidAt; // "2024-02-24" (optional) +$invoice->dueAt; // "2024-03-24" +$invoice->amount; // Object containing amount and currency +$invoice->netAmount; // Object containing amount and currency (excluding VAT) +$invoice->vatAmount; // Object containing amount and currency +$invoice->lines; // Array of invoice lines +$invoice->_links; // Object containing links (e.g., PDF download) +``` + +## Additional Notes + +- OAuth access token is required to access sales invoices +- Sales invoices are generated for your Mollie account +- Each invoice line represents a different type of fee +- The PDF invoice is available through the `_links.pdf.href` URL diff --git a/vendor/mollie/mollie-api-php/docs/recipes/sessions/manage-sessions.md b/vendor/mollie/mollie-api-php/docs/recipes/sessions/manage-sessions.md new file mode 100644 index 0000000..9acd969 --- /dev/null +++ b/vendor/mollie/mollie-api-php/docs/recipes/sessions/manage-sessions.md @@ -0,0 +1,55 @@ +# Manage Sessions + +How to create and manage sessions using the Mollie API. + +## Create a Session + +```php +use Mollie\Api\Http\Requests\CreateSessionRequest; + +try { + // Create a new session + $session = $mollie->send( + new CreateSessionRequest([ + 'paymentData' => [ + 'amount' => [ + 'value' => '10.00', + 'currency' => 'EUR' + ], + 'description' => 'Order #12345' + ], + 'method' => 'paypal', + 'methodDetails' => [ + 'checkoutFlow' => 'express' + ], + 'returnUrl' => 'https://example.com/shipping', + 'cancelUrl' => 'https://example.com/cancel' + ]) + ); + + // Redirect to the session URL + header('Location: ' . $session->getRedirectUrl(), true, 303); +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo "API call failed: " . htmlspecialchars($e->getMessage()); +} +``` + +## The Response + +```php +$session->id; // "ses_abc123" +$session->status; // "created", "completed", "canceled" +$session->method; // "paypal" +$session->methodDetails; // Object containing method-specific details +$session->paymentData; // Object containing payment details +$session->createdAt; // "2024-02-24T12:13:14+00:00" +$session->expiresAt; // "2024-02-24T13:13:14+00:00" +$session->_links; // Object containing links (e.g., redirect URL) +``` + +## Additional Notes + +- Sessions are used for payment methods that require additional steps +- Currently supports PayPal Express Checkout +- The session expires after 1 hour +- Use the redirect URL to send customers to complete their payment diff --git a/vendor/mollie/mollie-api-php/docs/recipes/settlements/list-settlements.md b/vendor/mollie/mollie-api-php/docs/recipes/settlements/list-settlements.md new file mode 100644 index 0000000..2a4742d --- /dev/null +++ b/vendor/mollie/mollie-api-php/docs/recipes/settlements/list-settlements.md @@ -0,0 +1,66 @@ +# List Settlements + +How to list settlements using the Mollie API. + +## List Settlements + +```php +use Mollie\Api\Http\Requests\GetPaginatedSettlementsRequest; + +try { + // List all settlements + $response = $mollie->send(new GetPaginatedSettlementsRequest); + + foreach ($response as $settlement) { + echo "Settlement {$settlement->reference}:\n"; + echo "- Created: {$settlement->createdAt}\n"; + echo "- Status: {$settlement->status}\n"; + echo "- Amount: {$settlement->amount->currency} {$settlement->amount->value}\n\n"; + + // Show settlement periods + foreach ($settlement->periods as $year => $months) { + foreach ($months as $month => $data) { + echo "Period {$year}-{$month}:\n"; + + // Show revenue + foreach ($data->revenue as $revenue) { + echo "Revenue: {$revenue->description}\n"; + echo "- Count: {$revenue->count}\n"; + echo "- Net: {$revenue->amountNet->currency} {$revenue->amountNet->value}\n"; + echo "- VAT: {$revenue->amountVat->currency} {$revenue->amountVat->value}\n"; + echo "- Gross: {$revenue->amountGross->currency} {$revenue->amountGross->value}\n\n"; + } + + // Show costs + foreach ($data->costs as $cost) { + echo "Cost: {$cost->description}\n"; + echo "- Count: {$cost->count}\n"; + echo "- Net: {$cost->amountNet->currency} {$cost->amountNet->value}\n"; + echo "- VAT: {$cost->amountVat->currency} {$cost->amountVat->value}\n"; + echo "- Gross: {$cost->amountGross->currency} {$cost->amountGross->value}\n\n"; + } + } + } + } +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo "API call failed: " . htmlspecialchars($e->getMessage()); +} +``` + +## The Response + +```php +$settlement->id; // "stl_abc123" +$settlement->reference; // "1234567.1804.03" +$settlement->createdAt; // "2024-02-24T12:13:14+00:00" +$settlement->settledAt; // "2024-02-24T12:13:14+00:00" +$settlement->status; // "open", "pending", "paidout", "failed" +$settlement->amount; // Object containing amount and currency +$settlement->periods; // Object containing settlement periods +``` + +## Additional Notes + +- OAuth access token is required to access settlements +- Settlements contain revenue and costs grouped by period +- Each period shows transaction fees, refunds, and chargebacks diff --git a/vendor/mollie/mollie-api-php/docs/recipes/subscriptions/manage-subscriptions.md b/vendor/mollie/mollie-api-php/docs/recipes/subscriptions/manage-subscriptions.md new file mode 100644 index 0000000..e65d06c --- /dev/null +++ b/vendor/mollie/mollie-api-php/docs/recipes/subscriptions/manage-subscriptions.md @@ -0,0 +1,112 @@ +# Manage Subscriptions + +How to create and manage subscriptions using the Mollie API. + +## Create a Subscription + +```php +use Mollie\Api\Http\Requests\CreateSubscriptionRequest; + +try { + // Create a subscription for a customer + $subscription = $mollie->send( + new CreateSubscriptionRequest( + customerId: 'cst_8wmqcHMN4U', + parameters: [ + 'amount' => [ + 'value' => '10.00', + 'currency' => 'EUR' + ], + 'interval' => '1 month', + 'description' => 'Monthly subscription', + 'webhookUrl' => 'https://example.com/webhook', + 'metadata' => [ + 'subscription_id' => time() + ] + ] + ) + ); + + echo "Subscription status: {$subscription->status}\n"; +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo "API call failed: " . htmlspecialchars($e->getMessage()); +} +``` + +## List Subscriptions + +```php +use Mollie\Api\Http\Requests\GetPaginatedSubscriptionsRequest; + +try { + // List all subscriptions for a customer + $response = $mollie->send( + new GetPaginatedSubscriptionsRequest( + customerId: 'cst_8wmqcHMN4U' + ) + ); + + foreach ($response as $subscription) { + echo "Subscription {$subscription->id}:\n"; + echo "- Status: {$subscription->status}\n"; + echo "- Amount: {$subscription->amount->currency} {$subscription->amount->value}\n"; + echo "- Times: {$subscription->times}\n"; + echo "- Interval: {$subscription->interval}\n"; + echo "- Next payment: {$subscription->nextPaymentDate}\n\n"; + } +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo "API call failed: " . htmlspecialchars($e->getMessage()); +} +``` + +## Cancel a Subscription + +```php +use Mollie\Api\Http\Requests\CancelSubscriptionRequest; + +try { + // Cancel a subscription + $mollie->send( + new CancelSubscriptionRequest( + customerId: 'cst_8wmqcHMN4U', + subscriptionId: 'sub_rVKGtNd6s3' + ) + ); + + echo "Subscription canceled\n"; +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo "API call failed: " . htmlspecialchars($e->getMessage()); +} +``` + +## The Response + +```php +$subscription->id; // "sub_rVKGtNd6s3" +$subscription->customerId; // "cst_8wmqcHMN4U" +$subscription->mode; // "live" or "test" +$subscription->createdAt; // "2024-02-24T12:13:14+00:00" +$subscription->status; // "active", "pending", "canceled", "suspended", "completed" +$subscription->amount; // Object containing amount and currency +$subscription->times; // 12 (optional) +$subscription->timesRemaining; // 4 (optional) +$subscription->interval; // "1 month" +$subscription->startDate; // "2024-02-24" +$subscription->nextPaymentDate; // "2024-03-24" +$subscription->description; // "Monthly subscription" +$subscription->method; // null or payment method +$subscription->webhookUrl; // "https://example.com/webhook" +$subscription->metadata; // Object containing custom metadata +``` + +## Additional Notes + +- The customer must have a valid mandate for recurring payments +- Subscriptions can be created with various intervals (e.g., "1 month", "3 months") +- The webhook is called for every subscription payment +- Subscription status can be: + - `pending`: Waiting for a valid mandate + - `active`: The subscription is active + - `canceled`: The subscription is canceled + - `suspended`: The subscription is suspended + - `completed`: The subscription has ended diff --git a/vendor/mollie/mollie-api-php/docs/recipes/webhooks/create-webhook.md b/vendor/mollie/mollie-api-php/docs/recipes/webhooks/create-webhook.md new file mode 100644 index 0000000..097df79 --- /dev/null +++ b/vendor/mollie/mollie-api-php/docs/recipes/webhooks/create-webhook.md @@ -0,0 +1,102 @@ +# Create a Webhook + +How to create webhooks to receive notifications about events using the Mollie API. + +## The Code + +```php +use Mollie\Api\Http\Requests\CreateWebhookRequest; +use Mollie\Api\Types\WebhookEventType; + +try { + // Create a webhook using the direct request (new style) + $webhook = $mollie->send( + new CreateWebhookRequest( + url: 'https://example.com/webhook', + name: 'Payment notifications', + eventTypes: WebhookEventType::PAYMENT_LINK_PAID + ) + ); + + echo "Webhook created: {$webhook->id}\n"; + echo "URL: {$webhook->url}\n"; + echo "Name: {$webhook->name}\n"; + echo "Event Types: {$webhook->eventTypes}\n"; + echo "Status: {$webhook->status}\n"; +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo "API call failed: " . htmlspecialchars($e->getMessage()); +} +``` + +## Using Endpoint Collections (Legacy Style) + +```php +use Mollie\Api\Types\WebhookEventType; + +try { + // Create a webhook using endpoint collections + $webhook = $mollie->webhooks->create([ + 'url' => 'https://example.com/webhook', + 'name' => 'Payment notifications', + 'eventTypes' => WebhookEventType::PAYMENT_LINK_PAID + ]); + + echo "Webhook created: {$webhook->id}\n"; +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo "API call failed: " . htmlspecialchars($e->getMessage()); +} +``` + +## The Response + +```php +$webhook->resource; // "webhook" +$webhook->id; // "wh_4KgGJJSZpH" +$webhook->url; // "https://example.com/webhook" +$webhook->profileId; // "pfl_v9hTwCvYqw" +$webhook->createdAt; // "2023-12-25T10:30:54+00:00" +$webhook->name; // "Payment notifications" +$webhook->eventTypes; // "payment-link.paid" +$webhook->status; // "enabled" +$webhook->_links; // Object containing webhook links +``` + +## Available Event Types + +This endpoint is under active development. Keep an eye on the Mollie documentation to see what events are being supported. +Currently, only one event type is supported: + +```php +use Mollie\Api\Types\WebhookEventType; + +// Currently supported event type +WebhookEventType::PAYMENT_LINK_PAID; // "payment-link.paid" + +// Get all available event types +$allEventTypes = WebhookEventType::getAll(); +// Returns: ["payment-link.paid"] +``` + +## Additional Notes + +- **Webhook URL Requirements**: + - There are no security requirements for test mode. However, in order to receive live mode events, the URL needs to be secured with an up-to-date HTTPS connection. + - Must respond with HTTP 200 status code + - Cannot be `localhost` URLs (use ngrok for local testing) + +- **Event Types**: + - Check out [the Mollie documentation](https://docs.mollie.com/reference/webhooks-new#event-types) to see what events are supported. + - Additional event types will be added in future updates + - Subscribe only to events you need to reduce noise + +- **Webhook URL Best Practices**: + - Use HTTPS for security + - Implement proper authentication/authorization + - Handle webhooks idempotently (same webhook may be sent multiple times) + - Log webhook payloads for debugging + - Return 200 OK as quickly as possible + +- **Testing**: + - Use ngrok or similar tools for local development + - Test webhook handling with the webhook test endpoint + - Verify signature validation works correctly diff --git a/vendor/mollie/mollie-api-php/docs/recipes/webhooks/manage-webhooks.md b/vendor/mollie/mollie-api-php/docs/recipes/webhooks/manage-webhooks.md new file mode 100644 index 0000000..859d580 --- /dev/null +++ b/vendor/mollie/mollie-api-php/docs/recipes/webhooks/manage-webhooks.md @@ -0,0 +1,205 @@ +# Manage Webhooks + +How to retrieve, update, delete, test, and list webhooks using the Mollie API. + +## Get a Webhook + +```php +use Mollie\Api\Http\Requests\GetWebhookRequest; + +try { + // Get a specific webhook using direct request + $webhook = $mollie->send( + new GetWebhookRequest( + id: 'wh_4KgGJJSZpH' + ) + ); + + echo "Webhook {$webhook->id}:\n"; + echo "- URL: {$webhook->url}\n"; + echo "- Name: {$webhook->name}\n"; + echo "- Event Types: {$webhook->eventTypes}\n"; + echo "- Status: {$webhook->status}\n"; +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo "API call failed: " . htmlspecialchars($e->getMessage()); +} +``` + +## Update a Webhook + +```php +use Mollie\Api\Http\Requests\UpdateWebhookRequest; +use Mollie\Api\Webhooks\WebhookEventType; + +try { + // Update webhook properties + $webhook = $mollie->send( + new UpdateWebhookRequest( + id: 'wh_4KgGJJSZpH', + url: 'https://updated-example.com/webhook', + name: 'Updated webhook name', + eventTypes: WebhookEventType::PAYMENT_LINK_PAID + ) + ); + + echo "Webhook updated successfully\n"; + echo "New URL: {$webhook->url}\n"; +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo "API call failed: " . htmlspecialchars($e->getMessage()); +} +``` + +## Delete a Webhook + +```php +use Mollie\Api\Http\Requests\DeleteWebhookRequest; + +try { + // Delete a webhook + $mollie->send( + new DeleteWebhookRequest( + id: 'wh_4KgGJJSZpH' + ) + ); + + echo "Webhook deleted successfully\n"; +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo "API call failed: " . htmlspecialchars($e->getMessage()); +} +``` + +## Test a Webhook + +```php +use Mollie\Api\Http\Requests\TestWebhookRequest; + +try { + // Test webhook delivery + $result = $mollie->send( + new TestWebhookRequest( + id: 'wh_4KgGJJSZpH' + ) + ); + + echo "Webhook test initiated\n"; + echo "Test status: Success\n"; +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo "Webhook test failed: " . htmlspecialchars($e->getMessage()); +} +``` + +## List All Webhooks + +```php +use Mollie\Api\Http\Requests\GetPaginatedWebhooksRequest; + +try { + // List all webhooks with pagination + $webhooks = $mollie->send( + new GetPaginatedWebhooksRequest() + ); + + foreach ($webhooks as $webhook) { + echo "Webhook {$webhook->id}:\n"; + echo "- URL: {$webhook->url}\n"; + echo "- Name: {$webhook->name}\n"; + echo "- Event Types: {$webhook->eventTypes}\n"; + echo "- Status: {$webhook->status}\n"; + echo "- Created: {$webhook->createdAt}\n\n"; + } + + // Handle pagination if needed + if ($webhooks->hasNext()) { + $nextPage = $webhooks->next(); + // Process next page... + } +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo "API call failed: " . htmlspecialchars($e->getMessage()); +} +``` + +## Using Endpoint Collections (Legacy Style) + +```php +try { + // Get a webhook + $webhook = $mollie->webhooks->get('wh_4KgGJJSZpH'); + + // Update a webhook + $webhook = $mollie->webhooks->update('wh_4KgGJJSZpH', [ + 'url' => 'https://updated-example.com/webhook', + 'name' => 'Updated name' + ]); + + // Delete a webhook + $mollie->webhooks->delete('wh_4KgGJJSZpH'); + + // Test a webhook + $mollie->webhooks->test('wh_4KgGJJSZpH'); + + // List webhooks + $webhooks = $mollie->webhooks->page(); + + // Use convenience methods on webhook resource + $webhook = $mollie->webhooks->get('wh_4KgGJJSZpH'); + + // Update using convenience method + $webhook->update([ + 'name' => 'New name' + ]); + + // Delete using convenience method + $webhook->delete(); + + // Test using convenience method + $webhook->test(); +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo "API call failed: " . htmlspecialchars($e->getMessage()); +} +``` + +## The Response + +```php +$webhook->resource; // "webhook" +$webhook->id; // "wh_4KgGJJSZpH" +$webhook->url; // "https://example.com/webhook" +$webhook->profileId; // "pfl_v9hTwCvYqw" +$webhook->createdAt; // "2023-12-25T10:30:54+00:00" +$webhook->name; // "Payment notifications" +$webhook->eventTypes; // "payment-link.paid" +$webhook->status; // "enabled" +$webhook->_links; // Object containing webhook links +``` + +## Additional Notes + +- **Webhook Updates**: + - All parameters are optional when updating + - Only specify fields you want to change + +- **Webhook Testing**: + - Tests webhook delivery by sending a test payload + - Useful for verifying webhook URL accessibility + - Check your webhook endpoint logs to confirm receipt + - Test payloads may differ from actual event payloads + +- **Webhook Deletion**: + - Permanently removes the webhook + - Cannot be undone + - Stop receiving notifications for deleted webhooks immediately + +- **Listing Webhooks**: + - Returns all webhooks in your account + - Results are paginated + - Use `hasNext()` and `next()` for pagination + +- **Convenience Methods**: + - Webhook resources include convenience methods (`update()`, `delete()`, `test()`) + - These methods operate on the current webhook instance + - Simplify common operations without needing to specify the webhook ID again + +- **Error Handling**: + - Webhook operations may fail due to network issues + - Handle `ApiException` to catch and respond to errors appropriately + - Common errors include webhook not found (404) or validation errors (422) diff --git a/vendor/mollie/mollie-api-php/docs/recipes/webhooks/signature-verification.md b/vendor/mollie/mollie-api-php/docs/recipes/webhooks/signature-verification.md new file mode 100644 index 0000000..032043e --- /dev/null +++ b/vendor/mollie/mollie-api-php/docs/recipes/webhooks/signature-verification.md @@ -0,0 +1,91 @@ +# Webhook Signature Verification + +This recipe shows you how to verify Mollie webhook signatures in your application using the `SignatureValidator` class. + +## Basic Example + +```php +use Mollie\Api\Webhooks\SignatureValidator; +use Mollie\Api\Exceptions\InvalidSignatureException; + +$signingSecret = "foobar"; + +$request = \GuzzleHttp\Psr7\ServerRequest::fromGlobals(); +$requestBody = (string)$request->getBody(); +$signature = $request->getHeader("X-Mollie-Signature"); + +try { + $validator = new SignatureValidator($signingSecret); + $isValid = $validator->validatePayload($requestBody, $signature); + + if ($isValid) { + // Process the verified webhook event + } else { + // Legacy webhook without signature + } + + return new \GuzzleHttp\Psr7\Response(200); +} catch (InvalidSignatureException $e) { + return new \GuzzleHttp\Psr7\Response(400); +} +``` + +For more information about webhooks and signature verification, see the [Webhooks Guide](../webhooks.md). + +## Advanced Usage + +### Multiple Signing Secrets + +During key rotation or migration periods, you can verify signatures against multiple secrets: + +```php +use Mollie\Api\Webhooks\SignatureValidator; +use Mollie\Api\Exceptions\InvalidSignatureException; + +$signingSecrets = [ + "current_secret", + "previous_secret" +]; + +try { + $validator = new SignatureValidator($signingSecrets); + $isValid = $validator->validatePayload($requestBody, $signature); + + if ($isValid) { + processWebhook($webhookData); + } else { + // Handle legacy webhook + processLegacyWebhook($webhookData); + } + +} catch (InvalidSignatureException $e) { + http_response_code(400); + echo 'Invalid signature'; +} +``` + +### PSR-7 Request Validation + +If you're using PSR-7 compatible requests: + +```php +use Mollie\Api\Webhooks\SignatureValidator; +use Psr\Http\Message\ServerRequestInterface; + +$signingSecret = "your_webhook_signing_secret"; +$validator = new SignatureValidator($signingSecret); + +try { + $isValid = $validator->validateRequest($request); + + if ($isValid) { + // Signature is valid + } else { + // Legacy webhook (no signature) + } + + return new Response(200, [], 'OK'); +} catch (InvalidSignatureException $e) { + return new Response(400, [], 'Invalid signature'); +} +``` diff --git a/vendor/mollie/mollie-api-php/docs/recipes/webhooks/webhook-events.md b/vendor/mollie/mollie-api-php/docs/recipes/webhooks/webhook-events.md new file mode 100644 index 0000000..353a6b5 --- /dev/null +++ b/vendor/mollie/mollie-api-php/docs/recipes/webhooks/webhook-events.md @@ -0,0 +1,162 @@ +# Webhook Events + +How to retrieve and manage webhook events using the Mollie API. + +## Get a Webhook Event + +```php +use Mollie\Api\Http\Requests\GetWebhookEventRequest; + +try { + // Get a specific webhook event + $webhookEvent = $mollie->send( + new GetWebhookEventRequest( + id: 'whev_abc123' + ) + ); + + echo "Webhook Event {$webhookEvent->id}:\n"; + echo "- Resource: {$webhookEvent->resource}\n"; + echo "- Event Type: {$webhookEvent->type}\n"; + echo "- Entity ID: {$webhookEvent->entityId}\n"; + echo "- Created: {$webhookEvent->createdAt}\n"; + + // Check if event has embedded entity data + if ($webhookEvent->hasEntity()) { + $entity = $webhookEvent->getEntity(); + echo "- Entity Data Available: Yes\n"; + echo "- Entity Type: " . get_class($entity) . "\n"; + } else { + echo "- Entity Data Available: No\n"; + } +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo "API call failed: " . htmlspecialchars($e->getMessage()); +} +``` + +## Using Endpoint Collections (Legacy Style) + +```php +try { + // Get a webhook event using endpoint collections + $webhookEvent = $mollie->webhookEvents->get('whev_abc123'); + + echo "Event Type: {$webhookEvent->type}\n"; + echo "Entity ID: {$webhookEvent->entityId}\n"; + + // Access the embedded entity data + if ($webhookEvent->hasEntity()) { + $entity = $webhookEvent->getEntity(); + echo "Entity data is available\n"; + } +} catch (\Mollie\Api\Exceptions\ApiException $e) { + echo "API call failed: " . htmlspecialchars($e->getMessage()); +} +``` + +## The Response + +```php +$webhookEvent->resource; // "event" +$webhookEvent->id; // "whev_abc123" +$webhookEvent->type; // "payment-link.paid" +$webhookEvent->entityId; // "tr_abc123" (the payment link ID) +$webhookEvent->createdAt; // "2023-12-25T10:30:54+00:00" +$webhookEvent->_embedded; // Object containing embedded entity data +$webhookEvent->_links; // Object containing relevant URLs +``` + +## Working with Embedded Entity Data + +The webhook event contains the full payload of the triggered event in the `_embedded` property: + +```php +// Check if entity data is available +if ($webhookEvent->hasEntity()) { + // Get the embedded entity + $entity = $webhookEvent->getEntity(); + + // For payment-link.paid events, this would be the payment link data + echo "Payment Link ID: {$entity->id}\n"; + echo "Payment Link Status: {$entity->status}\n"; + echo "Amount: {$entity->amount->value} {$entity->amount->currency}\n"; +} + +// Direct access to _embedded structure +$embedded = $webhookEvent->_embedded; +if (!empty($embedded->entity)) { + $entity = $embedded->entity; + echo "Entity ID: {$entity->id}\n"; +} +``` + +## Helper Methods + +The `WebhookEvent` resource includes convenient methods for working with entity data: + +```php +// Check if entity data is available +if ($webhookEvent->hasEntity()) { + echo "Entity data is embedded in this event\n"; +} + +// Get the entity data +$entity = $webhookEvent->getEntity(); +if ($entity) { + echo "Entity ID: {$entity->id}\n"; + echo "Entity Status: {$entity->status}\n"; +} +``` + +## Event Types and Their Payloads + +Currently, only payment link events are supported: + +### Payment Link Events +```php +// payment-link.paid +if ($webhookEvent->type === 'payment-link.paid') { + $paymentLink = $webhookEvent->getEntity(); + echo "Payment Link: {$paymentLink->id}\n"; + echo "Amount: {$paymentLink->amount->value} {$paymentLink->amount->currency}\n"; + echo "Status: {$paymentLink->status}\n"; +} +``` + +## Additional Notes + +- **Event Structure**: + - All webhook events have the `resource` property set to "event" + - The `type` property indicates what kind of event occurred + - The `entityId` references the ID of the object that triggered the event + - The `_embedded.entity` contains the full object data at the time of the event + +- **Entity Data**: + - The embedded entity contains the complete state of the object when the event occurred + - This is useful for getting the full context without making additional API calls + - Entity data may be null for some event types + +- **Event Identification**: + - Use the `id` property to uniquely identify webhook events + - The `entityId` property tells you which object triggered the event + - The `type` property tells you what kind of event occurred + +- **Event Ordering**: + - Webhook events are not guaranteed to be delivered in order + - Use the `createdAt` timestamp to determine the actual order of events + - Handle events idempotently in case duplicates are received + +- **Processing Events**: + - Always check if entity data is available using `hasEntity()` + - Use `getEntity()` to safely access embedded entity data + - The entity data reflects the state at the time the event was created + +- **Security**: + - Always verify webhook signatures when processing events + - The webhook event data shows what was sent, but verify authenticity + - Consider webhook events as notifications, not the primary source of truth + +- **Debugging**: + - Use the webhook event ID to track specific events + - The embedded entity data helps understand what triggered the event + - Check the `_links` property for related URLs and actions diff --git a/vendor/mollie/mollie-api-php/docs/requests.md b/vendor/mollie/mollie-api-php/docs/requests.md new file mode 100644 index 0000000..6f71c9e --- /dev/null +++ b/vendor/mollie/mollie-api-php/docs/requests.md @@ -0,0 +1,53 @@ +# Requests + +## Overview + +The Mollie API client uses request classes to communicate with the Mollie API. Each request class handles specific API endpoints and operations. The response is casted into a dedicated `Mollie\Api\Resources\*` class. + +## Sending a Request + +To send a request using the Mollie API client, you typically need to: + +1. **Create an instance of the client**: + ```php + use Mollie\Api\MollieApiClient; + + $mollie = new MollieApiClient(); + $mollie->setApiKey('test_dHar4XY7LxsDOtmnkVtjNVWXLSlXsM'); + ``` + +2. **Create and configure the request**: + Depending on the operation, you might need to create an instance of a specific request class and configure it with necessary parameters. + +3. **Send the request**: + Use the client to send the request and handle the response. + + ```php + use Mollie\Api\MollieApiClient; + use Mollie\Api\Http\Data\Money; + use Mollie\Api\Http\Requests\CreatePaymentRequest; + + $mollie = new MollieApiClient(); + $createPaymentRequest = new CreatePaymentRequest( + 'Test payment', + new Money('EUR', '10.00'), + 'https://example.org/redirect', + 'https://example.org/webhook' + ); + + /** @var \Mollie\Api\Resources\Payment $payment */ + $payment = $mollie->send($createPaymentRequest); + + $this->assertEquals(200, $payment->getResponse()->status()); + ``` + +## Adding unsupported properties +If the SDK is not up to date with the API, you can manually add a property to a request via the `query()` or `payload()` methods. + +```php +$someRequestUsingPayload = new SomePayloadRequest(...); +$someRequestUsingPayload->payload()->add('foo', 'bar'); + +$someRequestUsingQueryParams = new SomeQueryRequest(...); +$someRequestUsingQueryParams->query()->add('foo', 'bar'); +``` diff --git a/vendor/mollie/mollie-api-php/docs/responses.md b/vendor/mollie/mollie-api-php/docs/responses.md new file mode 100644 index 0000000..340aba3 --- /dev/null +++ b/vendor/mollie/mollie-api-php/docs/responses.md @@ -0,0 +1,84 @@ +# Responses + +Whether you interact with the endpoints using the traditional method (`$mollie->payments->...`) or the new `Request` classes, you can always inspect the raw `Response`. + +## Resource Hydration +By default, all responses from are automatically hydrated into the corresponding `Resource` or `ResourceCollection` objects. You can still access the raw response using the `->getResponse()` method. + +For example, when retrieving a payment you'll receive a Payment resource object, on which you can still access the raw Response class. + +```php +/** + * Legacy approach + * + * @var Mollie\Api\Resources\Payment $payment + */ +$payment = $mollie->payments->get('tr_*********'); + +/** + * New approach + * + * @var Mollie\Api\Resources\Payment $payment + */ +$payment = $mollie->send(new GetPaymentRequest('tr_*********')); + +$response = $payment->getResponse(); +``` + +## Resource Wrappers +Sometimes it's benefitial to directly hydrate a custom class with the information returned by the API. The wrapper resource can be used to define a subset of resource properties used by your app or cast them into your own dedicated Objects. + +The resource wrapper class still has access to the underlying `Resource` it wrapps around. + +### Define a Wrapper + +```php +use Mollie\Api\Utils\Utility; +use Mollie\Api\Resources\Payment; +use Mollie\Api\Resources\ResourceWrapper; + +class PaymentWrapper extends ResourceWrapper +{ + public function __construct( + public Money $amount, + public Timestamp $createdAt, + ) + + public static function fromResource($resource): self + { + /** @var Payment $resource */ + return (new self( + amount: Utility::transform($resource->amount, fn (stdClass $amount) => Money::fromMollieObject($amount)) + createdAt: Utility::transform($resource->createdAt, fn (string $timestamp) => Timestamp::fromIsoString($timestamp)) + ))->setWrapped($resource); + } +} +``` + +The `Utility::transform()` method can be used to transform values into your own objects. + + +### Usage + +A resource wrapper can be used by setting the `setHydratableResource()` to the new `WrapperResource`. + +```php +use Mollie\Api\Resources\WrapperResource; + +$request = new GetPaymentRequest('tr_*********'); + +$request->setHydratableResource(new WrapperResource(PaymentWrapper::class)); + +/** @var PaymentWrapper $paymentWrapper */ +$paymentWrapper = $mollie->send($request); +``` + +The original `Payment` resource properties and methods can be accessed through the wrapper class. + +```php +// access property +$paymentWrapper->status; + +// access method +$paymentWrapper->status(); +``` diff --git a/vendor/mollie/mollie-api-php/docs/retries.md b/vendor/mollie/mollie-api-php/docs/retries.md new file mode 100644 index 0000000..871f509 --- /dev/null +++ b/vendor/mollie/mollie-api-php/docs/retries.md @@ -0,0 +1,91 @@ +# Retry strategies + +The Mollie PHP client automatically retries requests that fail with retryable network errors. You can customize how many retries are performed and how long to wait between attempts by providing a retry strategy. + +## Default behavior + +- Strategy: `LinearRetryStrategy` +- Default max retries: `5` (in addition to the initial attempt) +- Default delay: linear backoff with a 1000ms increase per attempt + - Attempt 1 (first retry): 1000ms + - Attempt 2: 2000ms + - Attempt 3: 3000ms + - … up to the configured maximum + +If all retries are exhausted, the last `Mollie\Api\Exceptions\RetryableNetworkRequestException` is thrown. Fatal middleware hooks, if configured, run once after retries are exhausted. + +## Changing the defaults + +To change the retry behavior, provide your own strategy instance to the client: + +```php +use Mollie\Api\MollieApiClient; +use Mollie\Api\Http\Retry\LinearRetryStrategy; + +$client = new MollieApiClient(); + +// Example: 2 retries with no delay (useful in tests) +$client->setRetryStrategy(new LinearRetryStrategy(2, 0)); + +// Example: 3 retries with 500ms linear increase (0.5s, 1.0s, 1.5s) +$client->setRetryStrategy(new LinearRetryStrategy(3, 500)); +``` + +To effectively disable retries, set the max retries to `0`: + +```php +$client->setRetryStrategy(new LinearRetryStrategy(0, 0)); +``` + +## Creating your own strategy + +Custom strategies implement the `Mollie\Api\Contracts\RetryStrategyContract` interface: + +```php +namespace Mollie\Api\Contracts; + +interface RetryStrategyContract +{ + // Maximum number of retries after the initial attempt + public function maxRetries(): int; + + // Delay in milliseconds before performing the given retry attempt + // $attempt starts at 1 for the first retry + public function delayBeforeAttemptMs(int $attempt): int; +} +``` + +### Example: Fixed delay strategy + +```php +use Mollie\Api\Contracts\RetryStrategyContract; + +class FixedDelayRetryStrategy implements RetryStrategyContract +{ + public function __construct( + private int $maxRetries = 3, + private int $delayMs = 1000, + ) {} + + public function maxRetries(): int + { + return max(0, $this->maxRetries); + } + + public function delayBeforeAttemptMs(int $attempt): int + { + // Same delay for every retry + return max(0, $this->delayMs); + } +} + +// Usage +$client->setRetryStrategy(new FixedDelayRetryStrategy(3, 250)); +``` + +You can implement any retry timing you prefer (e.g., exponential backoff with jitter, capped delays, etc.) as long as you adhere to the contract. + +## When retries happen + +Retries are performed only for exceptions that are considered retryable by the HTTP layer and wrapped as `Mollie\Api\Exceptions\RetryableNetworkRequestException`. Other exceptions are not retried and will be thrown immediately. + diff --git a/vendor/mollie/mollie-api-php/docs/testing.md b/vendor/mollie/mollie-api-php/docs/testing.md new file mode 100644 index 0000000..5b537f3 --- /dev/null +++ b/vendor/mollie/mollie-api-php/docs/testing.md @@ -0,0 +1,239 @@ +# Testing with Mollie API Client + +## Test Mode Configuration + +### Key Concepts +- Test mode is automatically determined by API key prefix (`test_` or `live_`) +- Explicit `testmode` parameter available for OAuth scenarios +- Configure at global client level or per individual request + +### Global Configuration +```php +use Mollie\Api\MollieApiClient; + +$mollie = new MollieApiClient(); +$mollie->setApiKey("test_dHar4XY7LxsDOtmnkVtjNVWXLSlXsM"); +$mollie->test(true); // Applies to all subsequent requests +``` + +### Per-Request Configuration +```php +// Payment request with test mode +$createPaymentRequest = new CreatePaymentRequest(/* ... */); +$mollie->send($createPaymentRequest->test(true)); + +// Endpoint collection example +$customer = $mollie->customers->get('cust_12345678', testmode: true); +``` + +## API Mocking + +### Basic Usage +API responses can be simulated without network calls by using the `MollieApiClient::fake()` method. Each Request/Response pair passed to the fake method is consumed after a matching request. + +> [!NOTE] +> To keep pairs available for reuse after they've been matched, use the `retainRequests` parameter: `MollieApiClient::fake([...], retainRequests: true)` + +```php +use Mollie\Api\MollieApiClient; +use Mollie\Api\Fake\MockResponse; +use Mollie\Api\Http\Requests\GetPaymentRequest; + +$client = MollieApiClient::fake([ + GetPaymentRequest::class => new MockResponse( + body: [ + 'resource' => 'payment', + 'id' => 'tr_xxxxxxxxxxxx', + 'mode' => 'test', + 'amount' => [ + 'value' => '20.00', + 'currency' => 'EUR' + ], + 'description' => 'Test', + 'status' => 'open', + // ... + ], + status: 200 + ) +]); + +$payment = $client->send(new GetPaymentRequest('tr_xxxxxxxxxxxx')); +``` + +### Sequence Mock Responses +To return different responses for the same request type, use `SequenceMockResponse` and pass `MockResponse` or `Closure` (which return `MockResponse` instances) in the order they should occur. + +```php +$client = MollieApiClient::fake([ + DynamicGetRequest::class => new SequenceMockResponse( + MockResponse::ok(['first' => 'response']), + MockResponse::ok(['second' => 'response']), + function (PendingRequest $pendingRequest) { + //... + + return MockResponse::ok(['third' => 'response']); + } + ) +]) + +To verify that a request was sent, use `assertSent` or `assertSentCount`. + +```php +$client->send(new GetPaymentRequest('tr_xxxxxxxxxxxx', embedRefunds: true)); + +$client->assertSent(GetPaymentRequest::class); +$client->assertSent(function (PendingRequest $pendingRequest, Response $response) { + return $pendingRequest->query()->get('embed') === 'refunds'; +}); + +$client->assertSentCount(1); +``` + +### MockResponse Options +Configure responses using: +- **Arrays**: Direct data structure +- **Strings**: JSON payloads or predefined fixture names +- **Callables**: Dynamic response generation *or* intercepting assertions + +```php +// Array response +MockResponse::created([ + 'id' => 'tr_xxxxxxxxxxxx', + 'amount' => ['value' => '20.00', 'currency' => 'EUR'] +]); + +// Fixture response +MockResponse::created('payment'); + +// Dynamic response +MockResponse::created(function (PendingRequest $request) { + return ['amount' => $request->hasParameter('amount') ? 10 : 20]; +}); + +// Intercepting assertions +function (PendingRequest $request) use ($idempotencyKey) { + $this->assertEquals($idempotencyKey, $request->headers()->get('Idempotency-Key')); + + return MockResponse::created('payment'); +} +``` + +### Working with Collections +Create paginated list responses: + +```php +use Mollie\Api\Resources\PaymentCollection; + +$client = MollieApiClient::fake([ + GetPaginatedPaymentsRequest::class => MockResponse::list(PaymentCollection::class) + ->add([ + 'resource' => 'payment', + 'id' => 'tr_xxxxxxxxxxxx', + 'mode' => 'test', + 'amount' => [ + 'value' => '20.00', + 'currency' => 'EUR' + ], + 'description' => 'Test', + 'status' => 'open', + // ... + ]) + ->create() +]); +``` + +### Handling Embedded Resources +Simulate HAL+JSON embedded resources using the `_embedded` property: + +**Key Concepts** +- Use `MockResponse::resource()` to start building a resource response +- Chain `embed()` calls to add related collections +- Maintain resource relationships with a fluent interface + +```php +use Mollie\Api\Resources\Payment; +use Mollie\Api\Resources\RefundCollection; +use Mollie\Api\Resources\ChargebackCollection; + +$client = MollieApiClient::fake([ + GetPaymentRequest::class => MockResponse::resource(Payment::class) + ->with([ // Main resource properties + 'resource' => 'payment', + 'id' => 'tr_xxxxxxxxxxxx', + 'amount' => [ + 'value' => '20.00', + 'currency' => 'EUR' + ] + ]) + ->embed(RefundCollection::class) // First embedded collection + ->add([ + 'resource' => 'refund', + 'id' => 're_12345', + 'amount' => [ + 'value' => '10.00', + 'currency' => 'EUR' + ] + ]) + ->embed(ChargebackCollection::class) // Second embedded collection + ->add([ + 'resource' => 'chargeback', + 'id' => 'chb_12345', + 'amount' => [ + 'value' => '20.00', + 'currency' => 'EUR' + ] + ]) + ->create() +]); + +// Resulting response will contain: +// - Payment details in main body +// - Refunds in _embedded.refunds +// - Chargebacks in _embedded.chargebacks +``` + +### Error Response Mocking +Simulate API error responses using dedicated helper methods or the generic error builder: + +**Common Error Shortcuts** +```php +use Mollie\Api\Fake\MockResponse; + +// 404 Not Found +$client = MollieApiClient::fake([ + GetPaymentRequest::class => MockResponse::notFound('No payment exists with token tr_xxxxxxxxxxx') +]); + +// 422 Validation Error (with optional field reference) +$client = MollieApiClient::fake([ + CreatePaymentRequest::class => MockResponse::unprocessableEntity( + detail: 'Amount must be at least €1.00', + field: 'amount' + ) +]); +``` + +**Generic Error Builder** +```php +// Custom status code example +$response = MockResponse::error( + status: 403, + title: 'Forbidden', + detail: 'Insufficient permissions to access this resource' +); + +// Special characters handling +$detail = 'Invalid parameter "recurringType" - did you mean "sequenceType"?'; +$response = MockResponse::unprocessableEntity($detail, 'field'); +``` + +**Error Response Structure** +All errors follow Mollie's standardized format: +```json +{ + "status": 404, + "title": "Not Found", + "detail": "No payment exists with token tr_xxxxxxxxxxx", + "field": "amount" // Only present for validation errors +} +``` diff --git a/vendor/mollie/mollie-api-php/docs/webhooks.md b/vendor/mollie/mollie-api-php/docs/webhooks.md new file mode 100644 index 0000000..755003f --- /dev/null +++ b/vendor/mollie/mollie-api-php/docs/webhooks.md @@ -0,0 +1,136 @@ +# Webhooks + +Mollie uses webhooks to notify your application about events that occur in your Mollie account. This guide explains how to work with Mollie webhooks in your application securely and efficiently. Mollie currently supports two types of webhooks: the (soon to be labeled) "legacy webhooks" and "next-gen webhooks". This guide is about the next-gen webhooks. + +## Overview + +Webhooks are HTTP POST requests that Mollie sends to your application when specific events occur, such as when a payment is completed, failed, or refunded. This allows your application to respond to these events in real-time without constantly polling the Mollie API. + +## Security + +### Signature Verification + +**Important**: Always verify webhook signatures to ensure requests come from Mollie and haven't been tampered with. + +Mollie signs all webhook requests with an HMAC-SHA256 signature sent in the `X-Mollie-Signature` header. The SDK provides built-in signature verification: + +```php +use Mollie\Api\Webhooks\SignatureValidator; +use Mollie\Api\Exceptions\InvalidSignatureException; + +$signingSecret = "your_webhook_signing_secret_from_dashboard"; + +try { + $validator = new SignatureValidator($signingSecret); + + /** + * Validate the webhook signature + * + * This method will throw an InvalidSignatureException if: + * - A signature header is present but doesn't contain a valid signature + * - The payload has been tampered with + * + * For PSR-7 requests, you can also use validateRequest($psr7Request) + */ + $isValid = $validator->validatePayload($requestBody, $signature); + + if (!$isValid) { + // Handle invalid signature + http_response_code(400); + exit('Invalid signature'); + } + + // Signature is valid - proceed with webhook processing + +} catch (InvalidSignatureException $e) { + // Log the invalid signature attempt for security monitoring + error_log("Invalid webhook signature: " . $e->getMessage()); + http_response_code(400); + exit('Invalid signature'); +} +``` + +#### Key Rotation + +During key rotation or migration periods, you can verify signatures against multiple secrets: + +```php +$signingSecrets = [ + "current_secret", + "previous_secret" // Keep old secret during transition period +]; + +$validator = new SignatureValidator($signingSecrets); +$isValid = $validator->validatePayload($requestBody, $signature); +``` + +### Processing Webhook Payloads + +Once you've verified the webhook signature, you can safely process the payload: + +```php +use Mollie\Api\Webhooks\WebhookEventMapper; +use Mollie\Api\Webhooks\Events\PaymentLinkPaid; + +// Process the webhook payload into an event object +$event = (new WebhookEventMapper())->processPayload($request->getParsedBody()); + +// Extract the entity ID (e.g., payment ID, customer ID, etc.) +$entityId = $event->entityData('id'); + +// Get the full resource object for direct interaction +// This only works if you subscribe to full event payloads +$resource = $event->entity()->asResource($mollie); + +// Handle different event types +match (true) { + $event instanceof PaymentLinkPaid => $this->handlePaymentLinkPaid(), + $event instanceof BalanceTransactionCreated => $this->handleBalanceTransactionCreated(), + // ... handle other event types +}; +``` + +#### Using custom webhook Events +If the API is ahead of this SDK's implementation of new Events, you can create your own Events as temporary workaround and pass it into the `WebhookEventMapper` + +```php +// Event class +use Mollie\Api\Webhooks\Events\BaseEvent; + +class SomeEventHappened extends BaseEvent +{ + public static function type(): string + { + return 'some.event_happened'; // needs to match the eventType from the documentation + } +} + +// passing into event mapper and processing payload +$event = (new WebhookEventMapper([ + 'some.event_happened' => SomeEventHappened::class +]))->processPayload($request->getParsedBody()); +``` + +### Testing Webhooks + +Testing webhooks is crucial to ensure your application handles all event types correctly. The SDK provides several tools to help you test webhook scenarios. + +Use `MockEvent` to create realistic webhook payloads for testing: + +```php +use Mollie\Api\Fake\MockEvent; +use Mollie\Api\Webhooks\Events\PaymentLinkPaid; +use Mollie\Api\Webhooks\Events\BalanceTransactionCreated; + +// Create a mock PaymentLinkPaid event +$paymentLinkEventPayload = MockEvent::for(PaymentLinkPaid::class) + ->entityId('pl_1234567890') + ->full() // Include full resource data + ->create(); + +// Create a mock BalanceTransactionCreated event +$balanceEventPayload = MockEvent::for(BalanceTransactionCreated::class) + ->entityId('bt_9876543210') + ->simple() // Webhook request without any resource data besides entityId + ->create(); +``` diff --git a/vendor/mollie/mollie-api-php/src/CompatibilityChecker.php b/vendor/mollie/mollie-api-php/src/CompatibilityChecker.php new file mode 100644 index 0000000..313f552 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/CompatibilityChecker.php @@ -0,0 +1,67 @@ +satisfiesPhpVersion()) { + throw new IncompatiblePlatformException( + 'The client requires PHP version >= '.self::MIN_PHP_VERSION.', you have '.PHP_VERSION.'.', + IncompatiblePlatformException::INCOMPATIBLE_PHP_VERSION + ); + } + + if (! $this->satisfiesJsonExtension()) { + throw new IncompatiblePlatformException( + "PHP extension json is not enabled. Please make sure to enable 'json' in your PHP configuration.", + IncompatiblePlatformException::INCOMPATIBLE_JSON_EXTENSION + ); + } + } + + /** + * @return bool + * + * @codeCoverageIgnore + */ + public function satisfiesPhpVersion() + { + return (bool) version_compare(PHP_VERSION, self::MIN_PHP_VERSION, '>='); + } + + /** + * @return bool + * + * @codeCoverageIgnore + */ + public function satisfiesJsonExtension() + { + // Check by extension_loaded + if (function_exists('extension_loaded') && extension_loaded('json')) { + return true; + } elseif (function_exists('json_encode')) { + return true; + } + + return false; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Config.php b/vendor/mollie/mollie-api-php/src/Config.php new file mode 100644 index 0000000..7f5be1f --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Config.php @@ -0,0 +1,45 @@ +send((new GetBalanceRequest($id))->test($testmode)); + } + + /** + * Retrieve the primary balance from Mollie. + * + * Will throw an ApiException if the balance id is invalid or the resource cannot be found. + * + * @param bool|array $testmode + * + * @throws RequestException + */ + public function primary($testmode = false): Balance + { + /** @var Balance */ + return $this->get('primary', $testmode); + } + + /** + * Get the balance endpoint. + */ + public function page(?string $from = null, ?int $limit = null, array $filters = []): BalanceCollection + { + $testmode = Utility::extractBool($filters, 'testmode', false); + + $query = SortablePaginatedQueryFactory::new() + ->withQuery([ + 'from' => $from, + 'limit' => $limit, + 'filters' => $filters, + ]) + ->create(); + + return $this->send((new GetPaginatedBalanceRequest( + $query->from, + $query->limit, + $query->sort, + ))->test($testmode)); + } + + /** + * Create an iterator for iterating over balances retrieved from Mollie. + * + * @param string $from The first Balance ID you want to include in your list. + * @param bool $iterateBackwards Set to true for reverse order iteration (default is false). + */ + public function iterator(?string $from = null, ?int $limit = null, array $filters = [], bool $iterateBackwards = false): LazyCollection + { + $testmode = Utility::extractBool($filters, 'testmode', false); + + $query = SortablePaginatedQueryFactory::new() + ->withQuery([ + 'from' => $from, + 'limit' => $limit, + 'filters' => $filters, + ]) + ->create(); + + return $this->send( + (new GetPaginatedBalanceRequest( + $query->from, + $query->limit, + $query->sort, + )) + ->useIterator() + ->setIterationDirection($iterateBackwards) + ->test($testmode) + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/EndpointCollection/BalanceReportEndpointCollection.php b/vendor/mollie/mollie-api-php/src/EndpointCollection/BalanceReportEndpointCollection.php new file mode 100644 index 0000000..2e94650 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/EndpointCollection/BalanceReportEndpointCollection.php @@ -0,0 +1,49 @@ +withQuery($query) + ->create(); + + /** @var BalanceReport */ + return $this->send($request->test($testmode)); + } + + /** + * Retrieve the primary balance. + * This is the balance of your account’s primary currency, where all payments are settled to by default. + * + * @throws \Mollie\Api\Exceptions\RequestException + */ + public function getForPrimary(array $query = []): ?BalanceReport + { + return $this->getForId('primary', $query); + } + + /** + * Retrieve a balance report for the provided balance resource and parameters. + * + * @throws \Mollie\Api\Exceptions\RequestException + */ + public function getFor(Balance $balance, array $query = []): ?BalanceReport + { + return $this->getForId($balance->id, $query); + } +} diff --git a/vendor/mollie/mollie-api-php/src/EndpointCollection/BalanceTransactionEndpointCollection.php b/vendor/mollie/mollie-api-php/src/EndpointCollection/BalanceTransactionEndpointCollection.php new file mode 100644 index 0000000..5ddab46 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/EndpointCollection/BalanceTransactionEndpointCollection.php @@ -0,0 +1,102 @@ +pageForId($balance->id, $query, $testmode); + } + + /** + * List the transactions for the primary Balance. + * + * @throws \Mollie\Api\Exceptions\RequestException + */ + public function pageForPrimary(array $query = [], bool $testmode = false): BalanceTransactionCollection + { + /** @var BalanceTransactionCollection */ + return $this->pageForId('primary', $query, $testmode); + } + + /** + * List the transactions for a specific Balance ID. + * + * @throws \Mollie\Api\Exceptions\RequestException + */ + public function pageForId(string $balanceId, array $query = [], bool $testmode = false): BalanceTransactionCollection + { + $testmode = Utility::extractBool($query, 'testmode', $testmode); + + $query = PaginatedQueryFactory::new() + ->withQuery($query) + ->create(); + + /** @var BalanceTransactionCollection */ + return $this->send((new GetPaginatedBalanceTransactionRequest( + $balanceId, + $query->from, + $query->limit, + ))->test($testmode)); + } + + /** + * Create an iterator for iterating over balance transactions for the given balance retrieved from Mollie. + * + * @param bool $iterateBackwards Set to true for reverse order iteration (default is false). + */ + public function iteratorFor(Balance $balance, array $query = [], bool $iterateBackwards = false, bool $testmode = false): LazyCollection + { + return $this->iteratorForId($balance->id, $query, $iterateBackwards, $testmode); + } + + /** + * Create an iterator for iterating over transactions for the primary balance retrieved from Mollie. + * + * @param bool $iterateBackwards Set to true for reverse order iteration (default is false). + */ + public function iteratorForPrimary(array $query = [], bool $iterateBackwards = false, ?bool $testmode = null): LazyCollection + { + return $this->iteratorForId('primary', $query, $iterateBackwards); + } + + /** + * Create an iterator for iterating over balance transactions for the given balance id retrieved from Mollie. + * + * @param bool $iterateBackwards Set to true for reverse order iteration (default is false). + */ + public function iteratorForId(string $balanceId, array $query = [], bool $iterateBackwards = false, bool $testmode = false): LazyCollection + { + $testmode = Utility::extractBool($query, 'testmode', $testmode); + + $query = PaginatedQueryFactory::new() + ->withQuery($query) + ->create(); + + return $this->send( + (new GetPaginatedBalanceTransactionRequest( + $balanceId, + $query->from, + $query->limit, + )) + ->useIterator() + ->setIterationDirection($iterateBackwards) + ->test($testmode) + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/EndpointCollection/CapabilityEndpointCollection.php b/vendor/mollie/mollie-api-php/src/EndpointCollection/CapabilityEndpointCollection.php new file mode 100644 index 0000000..a5e79c0 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/EndpointCollection/CapabilityEndpointCollection.php @@ -0,0 +1,36 @@ +send((new GetCapabilityRequest($name))); + } + + /** + * Retrieve all capabilities from Mollie. + * + * @throws RequestException + */ + public function list(): CapabilityCollection + { + /** @var CapabilityCollection */ + return $this->send(new ListCapabilitiesRequest); + } +} diff --git a/vendor/mollie/mollie-api-php/src/EndpointCollection/ChargebackEndpointCollection.php b/vendor/mollie/mollie-api-php/src/EndpointCollection/ChargebackEndpointCollection.php new file mode 100644 index 0000000..90b06a9 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/EndpointCollection/ChargebackEndpointCollection.php @@ -0,0 +1,62 @@ +withQuery([ + 'from' => $from, + 'limit' => $limit, + 'filters' => $filters, + ]) + ->create(); + + /** @var ChargebackCollection */ + return $this->send($request->test($testmode)); + } + + /** + * Create an iterator for iterating over chargeback retrieved from Mollie. + * + * @param string $from The first chargevback ID you want to include in your list. + * @param array $filters + * @param bool $iterateBackwards Set to true for reverse order iteration (default is false). + */ + public function iterator(?string $from = null, ?int $limit = null, $filters = [], bool $iterateBackwards = false): LazyCollection + { + $testmode = Utility::extractBool($filters, 'testmode', false); + + $request = GetPaginatedChargebacksRequestFactory::new() + ->withQuery([ + 'from' => $from, + 'limit' => $limit, + 'filters' => $filters, + ]) + ->create(); + + return $this->send( + $request + ->useIterator() + ->setIterationDirection($iterateBackwards) + ->test($testmode) + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/EndpointCollection/ClientEndpointCollection.php b/vendor/mollie/mollie-api-php/src/EndpointCollection/ClientEndpointCollection.php new file mode 100644 index 0000000..c7cda04 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/EndpointCollection/ClientEndpointCollection.php @@ -0,0 +1,77 @@ +withQuery($query) + ->create(); + + /** @var Client */ + return $this->send($request); + } + + /** + * Retrieves a page of clients from Mollie. + * + * @param string $from The first client ID you want to include in your list. + * + * @throws RequestException + */ + public function page(?string $from = null, ?int $limit = null, array $filters = []): ClientCollection + { + $request = GetPaginatedClientRequestFactory::new() + ->withQuery([ + 'from' => $from, + 'limit' => $limit, + 'filters' => $filters, + ]) + ->create(); + + /** @var ClientCollection */ + return $this->send($request); + } + + /** + * Create an iterator for iterating over clients retrieved from Mollie. + * + * @param string $from The first client ID you want to include in your list. + * @param bool $iterateBackwards Set to true for reverse order iteration (default is false). + */ + public function iterator(?string $from = null, ?int $limit = null, array $filters = [], bool $iterateBackwards = false): LazyCollection + { + $request = GetPaginatedClientRequestFactory::new() + ->withQuery([ + 'from' => $from, + 'limit' => $limit, + 'filters' => $filters, + ]) + ->create(); + + return $this->send( + $request + ->useIterator() + ->setIterationDirection($iterateBackwards) + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/EndpointCollection/ClientLinkEndpointCollection.php b/vendor/mollie/mollie-api-php/src/EndpointCollection/ClientLinkEndpointCollection.php new file mode 100644 index 0000000..7cfa014 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/EndpointCollection/ClientLinkEndpointCollection.php @@ -0,0 +1,27 @@ +withPayload($payload) + ->create(); + + /** @var ClientLink */ + return $this->send($request); + } +} diff --git a/vendor/mollie/mollie-api-php/src/EndpointCollection/ConnectBalanceTransferEndpointCollection.php b/vendor/mollie/mollie-api-php/src/EndpointCollection/ConnectBalanceTransferEndpointCollection.php new file mode 100644 index 0000000..ffb526b --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/EndpointCollection/ConnectBalanceTransferEndpointCollection.php @@ -0,0 +1,91 @@ +withPayload($payload) + ->create(); + + /** @var ConnectBalanceTransfer */ + return $this->send($request->test($test)); + } + + /** + * Retrieve a Connect balance transfer from Mollie. + * + * Will throw an ApiException if the balance transfer id is invalid or the resource cannot be found. + * + * @throws RequestException + */ + public function get(string $id, bool $test = false): ConnectBalanceTransfer + { + /** @var ConnectBalanceTransfer */ + return $this->send((new GetConnectBalanceTransferRequest($id))->test($test)); + } + + /** + * Retrieves a collection of Connect balance transfers from Mollie. + * + * @throws RequestException + */ + public function page( + ?string $from = null, + ?int $limit = null, + ?string $sort = null + ): ConnectBalanceTransferCollection { + $request = new ListConnectBalanceTransfersRequest( + $from, + $limit, + $sort + ); + + /** @var ConnectBalanceTransferCollection */ + return $this->send($request); + } + + /** + * Create an iterator for iterating over Connect balance transfers retrieved from Mollie. + * + * @param string|null $from The first balance transfer ID you want to include in your list. + * @param bool $iterateBackwards Set to true for reverse order iteration (default is false). + */ + public function iterator( + ?string $from = null, + ?int $limit = null, + ?string $sort = null, + bool $iterateBackwards = false, + bool $test = false + ): LazyCollection { + $request = new ListConnectBalanceTransfersRequest( + $from, + $limit, + $sort + ); + + return $this->send( + $request + ->useIterator() + ->setIterationDirection($iterateBackwards) + ->test($test) + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/EndpointCollection/CustomerEndpointCollection.php b/vendor/mollie/mollie-api-php/src/EndpointCollection/CustomerEndpointCollection.php new file mode 100644 index 0000000..4989f67 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/EndpointCollection/CustomerEndpointCollection.php @@ -0,0 +1,122 @@ +withPayload($data) + ->create(); + + /** @var Customer */ + return $this->send($request->test($testmode)); + } + + /** + * Retrieve a single customer from Mollie. + * + * Will throw a ApiException if the customer id is invalid or the resource cannot be found. + * + * @param bool|array $testmode + * + * @throws RequestException + */ + public function get(string $id, $testmode = false): Customer + { + $testmode = Utility::extractBool($testmode, 'testmode', false); + + /** @var Customer */ + return $this->send((new GetCustomerRequest($id))->test($testmode)); + } + + /** + * Update a specific Customer resource. + * + * Will throw an ApiException if the customer id is invalid or the resource cannot be found. + * + * @throws RequestException + */ + public function update(string $id, array $data = []): ?Customer + { + $request = UpdateCustomerRequestFactory::new($id) + ->withPayload($data) + ->create(); + + /** @var null|Customer */ + return $this->send($request); + } + + /** + * Deletes the given Customer. + * + * Will throw a ApiException if the customer id is invalid or the resource cannot be found. + * Returns with HTTP status No Content (204) if successful. + * + * @param bool|array $testmode + * + * @throws RequestException + */ + public function delete(string $id, $testmode = false): void + { + $testmode = Utility::extractBool($testmode, 'testmode', false); + + $this->send((new DeleteCustomerRequest($id))->test($testmode)); + } + + /** + * Retrieves a collection of Customers from Mollie. + * + * @param string $from The first customer ID you want to include in your list. + * @param bool|array $testmode + * + * @throws RequestException + */ + public function page(?string $from = null, ?int $limit = null, $testmode = false): CustomerCollection + { + $testmode = Utility::extractBool($testmode, 'testmode', false); + + /** @var CustomerCollection */ + return $this->send((new GetPaginatedCustomerRequest($from, $limit))->test($testmode)); + } + + /** + * Create an iterator for iterating over customers retrieved from Mollie. + * + * @param string $from The first customer ID you want to include in your list. + * @param bool|array $testmode + * @param bool $iterateBackwards Set to true for reverse order iteration (default is false). + */ + public function iterator(?string $from = null, ?int $limit = null, $testmode = false, bool $iterateBackwards = false): LazyCollection + { + $testmode = Utility::extractBool($testmode, 'testmode', false); + + return $this->send( + (new GetPaginatedCustomerRequest($from, $limit)) + ->useIterator() + ->setIterationDirection($iterateBackwards) + ->test($testmode) + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/EndpointCollection/CustomerPaymentsEndpointCollection.php b/vendor/mollie/mollie-api-php/src/EndpointCollection/CustomerPaymentsEndpointCollection.php new file mode 100644 index 0000000..28f5b0e --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/EndpointCollection/CustomerPaymentsEndpointCollection.php @@ -0,0 +1,119 @@ +createForId($customer->id, $payload, $query, $testmode); + } + + /** + * Create a subscription for a Customer ID + * + * @throws RequestException + */ + public function createForId(string $customerId, array $payload = [], array $query = [], bool $testmode = false): Payment + { + $testmode = Utility::extractBool($payload, 'testmode', $testmode); + + $request = CreateCustomerPaymentRequestFactory::new($customerId) + ->withPayload($payload) + ->withQuery($query) + ->create(); + + /** @var Payment */ + return $this->send($request->test($testmode)); + } + + /** + * @param string $from The first resource ID you want to include in your list. + * + * @throws RequestException + */ + public function pageFor(Customer $customer, ?string $from = null, ?int $limit = null, array $filters = []): PaymentCollection + { + return $this->pageForId($customer->id, $from, $limit, $filters); + } + + /** + * @param string $from The first resource ID you want to include in your list. + * + * @throws RequestException + */ + public function pageForId(string $customerId, ?string $from = null, ?int $limit = null, array $filters = []): PaymentCollection + { + $testmode = Utility::extractBool($filters, 'testmode', false); + + $request = GetPaginatedCustomerPaymentsRequestFactory::new($customerId) + ->withQuery([ + 'from' => $from, + 'limit' => $limit, + 'filters' => $filters, + ]) + ->create(); + + return $this->send($request->test($testmode)); + } + + /** + * Create an iterator for iterating over payments for the given customer, retrieved from Mollie. + * + * @param string $from The first resource ID you want to include in your list. + * @param bool $iterateBackwards Set to true for reverse order iteration (default is false). + */ + public function iteratorFor( + Customer $customer, + ?string $from = null, + ?int $limit = null, + array $parameters = [], + bool $iterateBackwards = false + ): LazyCollection { + return $this->iteratorForId($customer->id, $from, $limit, $parameters, $iterateBackwards); + } + + /** + * Create an iterator for iterating over payments for the given customer id, retrieved from Mollie. + * + * @param string $from The first resource ID you want to include in your list. + * @param bool $iterateBackwards Set to true for reverse order iteration (default is false). + */ + public function iteratorForId( + string $customerId, + ?string $from = null, + ?int $limit = null, + array $filters = [], + bool $iterateBackwards = false + ): LazyCollection { + $testmode = Utility::extractBool($filters, 'testmode', false); + $request = GetPaginatedCustomerPaymentsRequestFactory::new($customerId) + ->withQuery([ + 'from' => $from, + 'limit' => $limit, + 'filters' => $filters, + ]) + ->create(); + + return $this->send( + $request + ->useIterator() + ->setIterationDirection($iterateBackwards) + ->test($testmode) + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/EndpointCollection/EndpointCollection.php b/vendor/mollie/mollie-api-php/src/EndpointCollection/EndpointCollection.php new file mode 100644 index 0000000..1fd7ab8 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/EndpointCollection/EndpointCollection.php @@ -0,0 +1,24 @@ +connector = $connector; + } + + /** + * @return mixed + */ + protected function send(Request $request) + { + return $this->connector->send($request); + } +} diff --git a/vendor/mollie/mollie-api-php/src/EndpointCollection/InvoiceEndpointCollection.php b/vendor/mollie/mollie-api-php/src/EndpointCollection/InvoiceEndpointCollection.php new file mode 100644 index 0000000..1f946ff --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/EndpointCollection/InvoiceEndpointCollection.php @@ -0,0 +1,70 @@ +send(new GetInvoiceRequest($invoiceId)); + } + + /** + * Retrieves a collection of Invoices from Mollie. + * + * @param string|null $from The first invoice ID you want to include in your list. + * + * @throws RequestException + */ + public function page(?string $from = null, ?int $limit = null, array $filters = []): InvoiceCollection + { + $request = GetPaginatedInvoiceRequestFactory::new() + ->withQuery([ + 'from' => $from, + 'limit' => $limit, + 'filters' => $filters, + ]) + ->create(); + + /** @var InvoiceCollection */ + return $this->send($request); + } + + /** + * Create an iterator for iterating over invoices retrieved from Mollie. + * + * @param string|null $from The first invoice ID you want to include in your list. + * @param bool $iterateBackwards Set to true for reverse order iteration (default is false). + */ + public function iterator(?string $from = null, ?int $limit = null, array $filters = [], bool $iterateBackwards = false): LazyCollection + { + $request = GetPaginatedInvoiceRequestFactory::new() + ->withQuery([ + 'from' => $from, + 'limit' => $limit, + 'filters' => $filters, + ]) + ->create(); + + return $this->send( + $request + ->useIterator() + ->setIterationDirection($iterateBackwards) + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/EndpointCollection/MandateEndpointCollection.php b/vendor/mollie/mollie-api-php/src/EndpointCollection/MandateEndpointCollection.php new file mode 100644 index 0000000..42a5172 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/EndpointCollection/MandateEndpointCollection.php @@ -0,0 +1,169 @@ +createForId($customer->id, $payload, $testmode); + } + + /** + * Creates a mandate for a specific customer ID. + * + * + * @throws RequestException + */ + public function createForId(string $customerId, array $payload = [], bool $testmode = false): Mandate + { + $testmode = Utility::extractBool($payload, 'testmode', $testmode); + + $request = CreateMandateRequestFactory::new($customerId) + ->withPayload($payload) + ->create(); + + /** @var Mandate */ + return $this->send($request->test($testmode)); + } + + /** + * Retrieve a specific mandate for a customer. + * + * + * @throws RequestException + */ + public function getFor(Customer $customer, string $mandateId, array $parameters = []): Mandate + { + return $this->getForId($customer->id, $mandateId, $parameters); + } + + /** + * Retrieve a specific mandate for a customer ID. + * + * @param bool|array $testmode + * + * @throws RequestException + */ + public function getForId(string $customerId, string $mandateId, $testmode = false): Mandate + { + $testmode = Utility::extractBool($testmode, 'testmode', false); + + /** @var Mandate */ + return $this->send((new GetMandateRequest($customerId, $mandateId))->test($testmode)); + } + + /** + * Revoke a mandate for a specific customer. + * + * + * @throws RequestException + */ + public function revokeFor(Customer $customer, string $mandateId, $data = []): void + { + $this->revokeForId($customer->id, $mandateId, $data); + } + + /** + * Revoke a mandate for a specific customer ID. + * + * @param bool|array $testmode + * + * @throws RequestException + */ + public function revokeForId(string $customerId, string $mandateId, $testmode = false): void + { + $testmode = Utility::extractBool($testmode, 'testmode', false); + + $this->send((new RevokeMandateRequest($customerId, $mandateId))->test($testmode)); + } + + /** + * Retrieves a collection of mandates for the given customer. + * + * @param string $from The first mandate ID you want to include in your list. + * @param bool|array $testmode + * + * @throws RequestException + */ + public function pageFor(Customer $customer, ?string $from = null, ?int $limit = null, $testmode = false): MandateCollection + { + return $this->pageForId($customer->id, $from, $limit, $testmode); + } + + /** + * Retrieves a collection of mandates for the given customer ID. + * + * @param string $from The first mandate ID you want to include in your list. + * @param bool|array $testmode + * + * @throws RequestException + */ + public function pageForId(string $customerId, ?string $from = null, ?int $limit = null, $testmode = false): MandateCollection + { + $testmode = Utility::extractBool($testmode, 'testmode', false); + + /** @var MandateCollection */ + return $this->send( + (new GetPaginatedMandateRequest($customerId, $from, $limit))->test($testmode) + ); + } + + /** + * Create an iterator for iterating over mandates for the given customer. + * + * @param string $from The first mandate ID you want to include in your list. + * @param bool|array $testmode + * @param bool $iterateBackwards Set to true for reverse order iteration (default is false). + */ + public function iteratorFor( + Customer $customer, + ?string $from = null, + ?int $limit = null, + $testmode = false, + bool $iterateBackwards = false + ): LazyCollection { + return $this->iteratorForId($customer->id, $from, $limit, $testmode, $iterateBackwards); + } + + /** + * Create an iterator for iterating over mandates for the given customer ID. + * + * @param string $from The first mandate ID you want to include in your list. + * @param bool|array $testmode + * @param bool $iterateBackwards Set to true for reverse order iteration (default is false). + */ + public function iteratorForId( + string $customerId, + ?string $from = null, + ?int $limit = null, + $testmode = false, + bool $iterateBackwards = false + ): LazyCollection { + $testmode = Utility::extractBool($testmode, 'testmode', false); + + return $this->send( + (new GetPaginatedMandateRequest($customerId, $from, $limit)) + ->useIterator() + ->setIterationDirection($iterateBackwards) + ->test($testmode) + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/EndpointCollection/MethodEndpointCollection.php b/vendor/mollie/mollie-api-php/src/EndpointCollection/MethodEndpointCollection.php new file mode 100644 index 0000000..9e7e9ad --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/EndpointCollection/MethodEndpointCollection.php @@ -0,0 +1,80 @@ +withQuery($query) + ->create(); + + /** @var MethodCollection */ + return $this->send($request); + } + + /** + * Retrieve all enabled methods for the organization. + * In test mode, this includes pending methods. + * The results are not paginated. + * + * @throws RequestException + */ + public function allEnabled(array $query = [], bool $testmode = false): MethodCollection + { + $testmode = Utility::extractBool($query, 'testmode', $testmode); + + $request = GetEnabledMethodsRequestFactory::new() + ->withQuery($query) + ->create(); + + /** @var MethodCollection */ + return $this->send($request->test($testmode)); + } + + /** + * @deprecated Use allEnabled() instead + * + * @throws RequestException + */ + public function allActive($query = [], bool $testmode = false): MethodCollection + { + return $this->allEnabled($query, $testmode); + } + + /** + * Retrieve a payment method from Mollie. + * + * Will throw an ApiException if the method id is invalid or the resource cannot be found. + * + * @throws RequestException + */ + public function get(string $methodId, $query = [], bool $testmode = false): Method + { + $testmode = Utility::extractBool($query, 'testmode', $testmode); + + $request = GetMethodRequestFactory::new($methodId) + ->withQuery($query) + ->create(); + + /** @var Method */ + return $this->send($request->test($testmode)); + } +} diff --git a/vendor/mollie/mollie-api-php/src/EndpointCollection/MethodIssuerEndpointCollection.php b/vendor/mollie/mollie-api-php/src/EndpointCollection/MethodIssuerEndpointCollection.php new file mode 100644 index 0000000..a5e0398 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/EndpointCollection/MethodIssuerEndpointCollection.php @@ -0,0 +1,31 @@ +send(new EnableMethodIssuerRequest($profileId, $methodId, $issuerId, $contractId)); + } + + /** + * Disable an issuer for a specific payment method. + * + * @throws RequestException + */ + public function disable(string $profileId, string $methodId, string $issuerId): void + { + $this->send(new DisableMethodIssuerRequest($profileId, $methodId, $issuerId)); + } +} diff --git a/vendor/mollie/mollie-api-php/src/EndpointCollection/OnboardingEndpointCollection.php b/vendor/mollie/mollie-api-php/src/EndpointCollection/OnboardingEndpointCollection.php new file mode 100644 index 0000000..876b33c --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/EndpointCollection/OnboardingEndpointCollection.php @@ -0,0 +1,14 @@ +send(new GetOnboardingStatusRequest); + } +} diff --git a/vendor/mollie/mollie-api-php/src/EndpointCollection/OrganizationEndpointCollection.php b/vendor/mollie/mollie-api-php/src/EndpointCollection/OrganizationEndpointCollection.php new file mode 100644 index 0000000..2aa0c57 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/EndpointCollection/OrganizationEndpointCollection.php @@ -0,0 +1,53 @@ +send((new GetOrganizationRequest($id))->test($testmode)); + } + + /** + * Retrieve the current organization from Mollie. + * + * @param bool|array $testmode + * + * @throws RequestException + */ + public function current($testmode = false): Organization + { + /** @var Organization */ + return $this->get('me', $testmode); + } + + /** + * Retrieve the partner status of the current organization. + * + * @throws RequestException + */ + public function partnerStatus(): Partner + { + return $this->send(new GetOrganizationPartnerStatusRequest); + } +} diff --git a/vendor/mollie/mollie-api-php/src/EndpointCollection/OrganizationPartnerEndpointCollection.php b/vendor/mollie/mollie-api-php/src/EndpointCollection/OrganizationPartnerEndpointCollection.php new file mode 100644 index 0000000..8d3ae17 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/EndpointCollection/OrganizationPartnerEndpointCollection.php @@ -0,0 +1,17 @@ +send(new GetOrganizationPartnerStatusRequest); + } +} diff --git a/vendor/mollie/mollie-api-php/src/EndpointCollection/PaymentCaptureEndpointCollection.php b/vendor/mollie/mollie-api-php/src/EndpointCollection/PaymentCaptureEndpointCollection.php new file mode 100644 index 0000000..fc96e1a --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/EndpointCollection/PaymentCaptureEndpointCollection.php @@ -0,0 +1,136 @@ +createForId($payment->id, $payload, $testmode); + } + + /** + * Creates a payment capture in Mollie. + * + * @throws RequestException + */ + public function createForId(string $paymentId, array $payload = [], bool $testmode = false): Capture + { + $testmode = Utility::extractBool($payload, 'testmode', $testmode); + + $request = CreatePaymentCaptureRequestFactory::new($paymentId) + ->withPayload($payload) + ->create(); + + /** @var Capture */ + return $this->send($request->test($testmode)); + } + + /** + * @throws RequestException + */ + public function getFor(Payment $payment, string $captureId, array $query = [], bool $testmode = false): Capture + { + return $this->getForId($payment->id, $captureId, $query, $testmode); + } + + /** + * @throws RequestException + */ + public function getForId(string $paymentId, string $captureId, array $query = [], bool $testmode = false): Capture + { + $testmode = Utility::extractBool($query, 'testmode', $testmode); + + $request = GetPaymentCaptureRequestFactory::new($paymentId, $captureId) + ->withQuery($query) + ->create(); + + /** @var Capture */ + return $this->send($request->test($testmode)); + } + + /** + * @throws RequestException + */ + public function pageFor(Payment $payment, array $query = [], bool $testmode = false): CaptureCollection + { + return $this->pageForId($payment->id, $query, $testmode); + } + + /** + * @throws RequestException + */ + public function pageForId(string $paymentId, array $query = [], bool $testmode = false): CaptureCollection + { + $testmode = Utility::extractBool($query, 'testmode', $testmode); + + $request = GetPaginatedPaymentCapturesRequestFactory::new($paymentId) + ->withQuery($query) + ->create(); + + /** @var CaptureCollection */ + return $this->send($request->test($testmode)); + } + + /** + * Create an iterator for iterating over captures for the given payment, retrieved from Mollie. + * + * @param string $from The first resource ID you want to include in your list. + * @param bool $iterateBackwards Set to true for reverse order iteration (default is false). + */ + public function iteratorFor( + Payment $payment, + ?string $from = null, + ?int $limit = null, + array $parameters = [], + bool $iterateBackwards = false + ): LazyCollection { + return $this->iteratorForId($payment->id, $from, $limit, $parameters, $iterateBackwards); + } + + /** + * Create an iterator for iterating over captures for the given payment id, retrieved from Mollie. + * + * @param string $from The first resource ID you want to include in your list. + * @param bool $iterateBackwards Set to true for reverse order iteration (default is false). + */ + public function iteratorForId( + string $paymentId, + ?string $from = null, + ?int $limit = null, + array $filters = [], + bool $iterateBackwards = false + ): LazyCollection { + $testmode = Utility::extractBool($filters, 'testmode', false); + + $request = GetPaginatedPaymentCapturesRequestFactory::new($paymentId) + ->withQuery([ + 'from' => $from, + 'limit' => $limit, + 'filters' => $filters, + ]) + ->create(); + + return $this->send( + $request + ->useIterator() + ->setIterationDirection($iterateBackwards) + ->test($testmode) + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/EndpointCollection/PaymentChargebackEndpointCollection.php b/vendor/mollie/mollie-api-php/src/EndpointCollection/PaymentChargebackEndpointCollection.php new file mode 100644 index 0000000..3714476 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/EndpointCollection/PaymentChargebackEndpointCollection.php @@ -0,0 +1,108 @@ +getForId($payment->id, $chargebackId, $query, $testmode); + } + + /** + * @throws RequestException + */ + public function getForId(string $paymentId, string $chargebackId, array $query = [], bool $testmode = false): Chargeback + { + $testmode = Utility::extractBool($query, 'testmode', $testmode); + + $request = GetPaymentChargebackRequestFactory::new($paymentId, $chargebackId) + ->withQuery($query) + ->create(); + + /** @var Chargeback */ + return $this->send($request->test($testmode)); + } + + /** + * @throws RequestException + */ + public function pageFor(Payment $payment, array $query = []): ChargebackCollection + { + return $this->pageForId($payment->id, $query); + } + + /** + * @throws RequestException + */ + public function pageForId(string $paymentId, array $query = [], bool $testmode = false): ChargebackCollection + { + $testmode = Utility::extractBool($query, 'testmode', $testmode); + + $request = GetPaginatedPaymentChargebacksRequestFactory::new($paymentId) + ->withQuery($query) + ->create(); + + /** @var ChargebackCollection */ + return $this->send($request->test($testmode)); + } + + /** + * Create an iterator for iterating over chargebacks for the given payment, retrieved from Mollie. + * + * @param string $from The first resource ID you want to include in your list. + * @param bool $iterateBackwards Set to true for reverse order iteration (default is false). + */ + public function iteratorFor( + Payment $payment, + ?string $from = null, + ?int $limit = null, + array $parameters = [], + bool $iterateBackwards = false + ): LazyCollection { + return $this->iteratorForId($payment->id, $from, $limit, $parameters, $iterateBackwards); + } + + /** + * Create an iterator for iterating over chargebacks for the given payment id, retrieved from Mollie. + * + * @param string $from The first resource ID you want to include in your list. + * @param bool $iterateBackwards Set to true for reverse order iteration (default is false). + */ + public function iteratorForId( + string $paymentId, + ?string $from = null, + ?int $limit = null, + array $filters = [], + bool $iterateBackwards = false + ): LazyCollection { + $testmode = Utility::extractBool($filters, 'testmode', false); + + $request = GetPaginatedPaymentChargebacksRequestFactory::new($paymentId) + ->withQuery([ + 'from' => $from, + 'limit' => $limit, + 'filters' => $filters, + ]) + ->create(); + + return $this->send( + $request + ->useIterator() + ->setIterationDirection($iterateBackwards) + ->test($testmode) + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/EndpointCollection/PaymentEndpointCollection.php b/vendor/mollie/mollie-api-php/src/EndpointCollection/PaymentEndpointCollection.php new file mode 100644 index 0000000..1911802 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/EndpointCollection/PaymentEndpointCollection.php @@ -0,0 +1,199 @@ +withQuery($query) + ->create(); + + return $this->send($request->test($testmode)); + } + + /** + * Creates a payment in Mollie. + * + * @param array $payload An array containing details on the payment. + * @param array $query An array of strings or a single string containing the details to include. + * + * @throws RequestException + */ + public function create(array $payload = [], array $query = [], bool $testmode = false): Payment + { + $testmode = Utility::extractBool($query, 'testmode', $testmode); + + $request = CreatePaymentRequestFactory::new() + ->withPayload($payload) + ->withQuery($query) + ->create(); + + /** @var Payment */ + return $this->send($request->test($testmode)); + } + + /** + * Update the given Payment. + * + * Will throw a ApiException if the payment id is invalid or the resource cannot be found. + * + * @throws RequestException + */ + public function update(string $id, array $data = [], bool $testmode = false): ?Payment + { + $testmode = Utility::extractBool($data, 'testmode', $testmode); + + $request = UpdatePaymentRequestFactory::new($id) + ->withPayload($data) + ->create(); + + /** @var null|Payment */ + return $this->send($request->test($testmode)); + } + + /** + * Deletes the given Payment. + * + * Will throw a ApiException if the payment id is invalid or the resource cannot be found. + * Returns with HTTP status No Content (204) if successful. + * + * @throws RequestException + */ + public function delete(string $id, $data = []): Payment + { + return $this->cancel($id, $data); + } + + /** + * Cancel the given Payment. This is just an alias of the 'delete' method. + * + * Will throw a ApiException if the payment id is invalid or the resource cannot be found. + * Returns with HTTP status No Content (204) if successful. + * + * @param array|bool $testmode + * + * @throws RequestException + */ + public function cancel(string $id, $testmode = false): Payment + { + $testmode = Utility::extractBool($testmode, 'testmode', false); + + /** @var Payment */ + return $this->send((new CancelPaymentRequest($id))->test($testmode)); + } + + /** + * Issue a refund for the given payment. + * + * The $data parameter may either be an array of endpoint + * parameters, or an instance of CreateRefundPaymentData. + * + * + * @throws RequestException + */ + public function refund(Payment $payment, array $payload = [], bool $testmode = false): Refund + { + $testmode = Utility::extractBool($payload, 'testmode', $testmode); + + $request = CreatePaymentRefundRequestFactory::new($payment->id) + ->withPayload($payload) + ->create(); + + return $this->send($request->test($testmode)); + } + + /** + * Release the authorization for the given payment. + * + * @param Payment|string $paymentId + * @return AnyResource|Response + * + * @throws RequestException + */ + public function releaseAuthorization($paymentId) + { + $paymentId = $paymentId instanceof Payment ? $paymentId->id : $paymentId; + + return $this->send(new ReleasePaymentAuthorizationRequest($paymentId)); + } + + /** + * Get the balance endpoint. + */ + public function page(?string $from = null, ?int $limit = null, array $filters = []): PaymentCollection + { + $testmode = Utility::extractBool($filters, 'testmode', false); + + $query = SortablePaginatedQueryFactory::new() + ->withQuery([ + 'from' => $from, + 'limit' => $limit, + 'filters' => $filters, + ]) + ->create(); + + return $this->send((new GetPaginatedPaymentsRequest( + $query->from, + $query->limit, + $query->sort, + ))->test($testmode)); + } + + /** + * Create an iterator for iterating over payments retrieved from Mollie. + * + * @param string $from The first resource ID you want to include in your list. + * @param bool $iterateBackwards Set to true for reverse order iteration (default is false). + */ + public function iterator(?string $from = null, ?int $limit = null, array $filters = [], bool $iterateBackwards = false): LazyCollection + { + $testmode = Utility::extractBool($filters, 'testmode', false); + + $query = SortablePaginatedQueryFactory::new() + ->withQuery([ + 'from' => $from, + 'limit' => $limit, + 'filters' => $filters, + ]) + ->create(); + + return $this->send( + (new GetPaginatedPaymentsRequest( + $query->from, + $query->limit, + $query->sort, + )) + ->useIterator() + ->setIterationDirection($iterateBackwards) + ->test($testmode) + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/EndpointCollection/PaymentLinkEndpointCollection.php b/vendor/mollie/mollie-api-php/src/EndpointCollection/PaymentLinkEndpointCollection.php new file mode 100644 index 0000000..3b1c527 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/EndpointCollection/PaymentLinkEndpointCollection.php @@ -0,0 +1,115 @@ +withPayload($payload) + ->create(); + + /** @var PaymentLink */ + return $this->send($request->test($testmode)); + } + + /** + * Retrieve a payment link from Mollie. + * + * Will throw an ApiException if the payment link id is invalid or the resource cannot be found. + * + * @param bool|array $testmode + * + * @throws RequestException + */ + public function get(string $paymentLinkId, $testmode = false): PaymentLink + { + $testmode = Utility::extractBool($testmode, 'testmode', false); + + /** @var PaymentLink */ + return $this->send((new GetPaymentLinkRequest($paymentLinkId))->test($testmode)); + } + + /** + * Update a Payment Link. + * + * @throws RequestException + */ + public function update(string $paymentLinkId, array $payload = [], bool $testmode = false): PaymentLink + { + $request = UpdatePaymentLinkRequestFactory::new($paymentLinkId) + ->withPayload($payload) + ->create(); + + /** @var PaymentLink */ + return $this->send($request->test($testmode)); + } + + /** + * Delete a Payment Link. + * + * @throws RequestException + */ + public function delete(string $paymentLinkId, bool $testmode = false): void + { + $this->send((new DeletePaymentLinkRequest($paymentLinkId))->test($testmode)); + } + + /** + * Retrieves a collection of Payment Links from Mollie. + * + * @param string|null $from The first payment link ID you want to include in your list. + * @param bool|array $testmode + * + * @throws RequestException + */ + public function page(?string $from = null, ?int $limit = null, $testmode = false): PaymentLinkCollection + { + $testmode = Utility::extractBool($testmode, 'testmode', false); + + /** @var PaymentLinkCollection */ + return $this->send( + (new GetPaginatedPaymentLinksRequest($from, $limit)) + ->test($testmode) + ); + } + + /** + * Create an iterator for iterating over payment links retrieved from Mollie. + * + * @param string|null $from The first resource ID you want to include in your list. + * @param bool $iterateBackwards Set to true for reverse order iteration (default is false). + */ + public function iterator( + ?string $from = null, + ?int $limit = null, + bool $testmode = false, + bool $iterateBackwards = false + ): LazyCollection { + $testmode = Utility::extractBool($testmode, 'testmode', false); + + return $this->send( + (new GetPaginatedPaymentLinksRequest($from, $limit)) + ->useIterator() + ->setIterationDirection($iterateBackwards) + ->test($testmode) + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/EndpointCollection/PaymentLinkPaymentEndpointCollection.php b/vendor/mollie/mollie-api-php/src/EndpointCollection/PaymentLinkPaymentEndpointCollection.php new file mode 100644 index 0000000..d147b3a --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/EndpointCollection/PaymentLinkPaymentEndpointCollection.php @@ -0,0 +1,101 @@ +pageForId($paymentLink->id, $from, $limit, $filters); + } + + /** + * Retrieves a collection of Payments from Mollie for the given Payment Link ID. + * + * @param string|null $from The first payment ID you want to include in your list. + * + * @throws RequestException + */ + public function pageForId(string $paymentLinkId, ?string $from = null, ?int $limit = null, array $filters = []): PaymentCollection + { + $testmode = Utility::extractBool($filters, 'testmode', false); + + $query = SortablePaginatedQueryFactory::new([ + 'from' => $from, + 'limit' => $limit, + 'filters' => $filters, + ])->create(); + + /** @var PaymentCollection */ + return $this->send( + (new GetPaginatedPaymentLinkPaymentsRequest($paymentLinkId, $from, $limit, $query->sort)) + ->test($testmode) + ); + } + + /** + * Create an iterator for iterating over payments associated with the provided Payment Link object, retrieved from Mollie. + * + * @param string|null $from The first resource ID you want to include in your list. + * @param bool $iterateBackwards Set to true for reverse order iteration (default is false). + */ + public function iteratorFor( + PaymentLink $paymentLink, + ?string $from = null, + ?int $limit = null, + array $filters = [], + bool $iterateBackwards = false + ): LazyCollection { + return $this->iteratorForId( + $paymentLink->id, + $from, + $limit, + $filters, + $iterateBackwards + ); + } + + /** + * Create an iterator for iterating over payments associated with the provided Payment Link id, retrieved from Mollie. + * + * @param string|null $from The first resource ID you want to include in your list. + * @param bool $iterateBackwards Set to true for reverse order iteration (default is false). + */ + public function iteratorForId( + string $paymentLinkId, + ?string $from = null, + ?int $limit = null, + array $filters = [], + bool $iterateBackwards = false + ): LazyCollection { + $testmode = Utility::extractBool($filters, 'testmode', false); + + $query = SortablePaginatedQueryFactory::new([ + 'from' => $from, + 'limit' => $limit, + 'filters' => $filters, + ])->create(); + + return $this->send( + (new GetPaginatedPaymentLinkPaymentsRequest($paymentLinkId, $from, $limit, $query->sort)) + ->useIterator() + ->setIterationDirection($iterateBackwards) + ->test($testmode) + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/EndpointCollection/PaymentRefundEndpointCollection.php b/vendor/mollie/mollie-api-php/src/EndpointCollection/PaymentRefundEndpointCollection.php new file mode 100644 index 0000000..953b4df --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/EndpointCollection/PaymentRefundEndpointCollection.php @@ -0,0 +1,167 @@ +createForId($payment->id, $data, $testmode); + } + + /** + * Creates a refund for a specific payment. + * + * @param bool|array $testmode + * + * @throws \Mollie\Api\Exceptions\RequestException + */ + public function createForId(string $paymentId, array $payload = [], $testmode = false): Refund + { + $testmode = Utility::extractBool($payload, 'testmode', false) ?: + Utility::extractBool($testmode, 'testmode', false); + + $request = CreatePaymentRefundRequestFactory::new($paymentId) + ->withPayload($payload) + ->create(); + + return $this->send($request->test($testmode)); + } + + /** + * @throws \Mollie\Api\Exceptions\RequestException + */ + public function getFor(Payment $payment, string $refundId, array $parameters = [], bool $testmode = false): Refund + { + return $this->getForId($payment->id, $refundId, $parameters, $testmode); + } + + /** + * @throws \Mollie\Api\Exceptions\RequestException + */ + public function getForId(string $paymentId, string $refundId, array $query = [], bool $testmode = false): Refund + { + $testmode = Utility::extractBool($query, 'testmode', $testmode); + + $request = GetPaymentRefundRequestFactory::new($paymentId, $refundId) + ->withQuery($query) + ->create(); + + /** @var Refund */ + return $this->send($request->test($testmode)); + } + + /** + * @param array|bool $testmode + * @return null + * + * @throws \Mollie\Api\Exceptions\RequestException + */ + public function cancelForPayment(Payment $payment, string $refundId, $testmode = false) + { + return $this->cancelForId($payment->id, $refundId, $testmode); + } + + /** + * @param array|bool $testmode + * @return null + * + * @throws \Mollie\Api\Exceptions\RequestException + */ + public function cancelForId(string $paymentId, string $refundId, $testmode = false) + { + $testmode = Utility::extractBool($testmode, 'testmode', false); + + return $this->send((new CancelPaymentRefundRequest($paymentId, $refundId))->test($testmode)); + } + + /** + * @throws \Mollie\Api\Exceptions\RequestException + */ + public function pageForId(string $paymentId, ?string $from = null, ?int $limit = null, array $filters = []): RefundCollection + { + $testmode = Utility::extractBool($filters, 'testmode', false); + + $request = GetPaginatedPaymentRefundsRequestFactory::new($paymentId) + ->withQuery([ + 'from' => $from, + 'limit' => $limit, + 'filters' => $filters, + ]) + ->create(); + + return $this->send($request->test($testmode)); + } + + /** + * @throws \Mollie\Api\Exceptions\RequestException + */ + public function pageFor(Payment $payment, ?string $from = null, ?int $limit = null, array $filters = []): RefundCollection + { + return $this->pageForId($payment->id, $from, $limit, $filters); + } + + /** + * Create an iterator for iterating over refunds for the given payment, retrieved from Mollie. + * + * @param string|null $from The first resource ID you want to include in your list. + * @param bool $iterateBackwards Set to true for reverse order iteration (default is false). + */ + public function iteratorFor( + Payment $payment, + ?string $from = null, + ?int $limit = null, + array $parameters = [], + bool $iterateBackwards = false + ): LazyCollection { + return $this->iteratorForId($payment->id, $from, $limit, $parameters, $iterateBackwards); + } + + /** + * Create an iterator for iterating over refunds for the given payment id, retrieved from Mollie. + * + * @param string|null $from The first resource ID you want to include in your list. + * @param bool $iterateBackwards Set to true for reverse order iteration (default is false). + */ + public function iteratorForId( + string $paymentId, + ?string $from = null, + ?int $limit = null, + array $filters = [], + bool $iterateBackwards = false + ): LazyCollection { + $testmode = Utility::extractBool($filters, 'testmode', false); + + $request = GetPaginatedPaymentRefundsRequestFactory::new($paymentId) + ->withQuery([ + 'from' => $from, + 'limit' => $limit, + 'filters' => $filters, + ]) + ->create(); + + return $this->send( + $request + ->useIterator() + ->setIterationDirection($iterateBackwards) + ->test($testmode) + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/EndpointCollection/PaymentRouteEndpointCollection.php b/vendor/mollie/mollie-api-php/src/EndpointCollection/PaymentRouteEndpointCollection.php new file mode 100644 index 0000000..d96352e --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/EndpointCollection/PaymentRouteEndpointCollection.php @@ -0,0 +1,98 @@ +createForId($payment->id, $amount, $destination, $releaseDate, $testmode); + } + + /** + * Create a delayed route for a payment using payment ID. + * + * @throws RequestException + */ + public function createForId(string $paymentId, array $amount, array $destination, ?string $releaseDate = null, bool $testmode = false): Route + { + $payload = [ + 'amount' => $amount, + 'destination' => $destination, + ]; + + $request = CreateDelayedPaymentRouteRequestFactory::new($paymentId) + ->withPayload($payload) + ->create(); + + /** @var Route */ + return $this->send($request->test($testmode)); + } + + /** + * List payment routes for a payment. + * + * @throws RequestException + */ + public function listFor(Payment $payment, bool $testmode = false): RouteCollection + { + return $this->listForId($payment->id, $testmode); + } + + /** + * List payment routes for a payment using payment ID. + * + * @throws RequestException + */ + public function listForId(string $paymentId, bool $testmode = false): RouteCollection + { + $request = new ListPaymentRoutesRequest($paymentId); + + /** @var RouteCollection */ + return $this->send($request->test($testmode)); + } + + /** + * Update the release date for a payment route. + * + * @param string $releaseDate UTC datetime in ISO-8601 format when the funds will become available + * + * @throws RequestException + */ + public function updateReleaseDateFor(Payment $payment, string $routeId, string $releaseDate, bool $testmode = false): Route + { + return $this->updateReleaseDateForId($payment->id, $routeId, $releaseDate, $testmode); + } + + /** + * Update the release date for a payment route using payment ID. + * + * @param string $releaseDate UTC datetime when the funds will become available + * + * @throws RequestException + */ + public function updateReleaseDateForId(string $paymentId, string $routeId, string $releaseDate, bool $testmode = false): Route + { + $request = UpdatePaymentRouteRequestFactory::new($paymentId, $routeId) + ->withPayload([ + 'releaseDate' => $releaseDate, + ]) + ->create(); + + /** @var Route */ + return $this->send($request->test($testmode)); + } +} diff --git a/vendor/mollie/mollie-api-php/src/EndpointCollection/PermissionEndpointCollection.php b/vendor/mollie/mollie-api-php/src/EndpointCollection/PermissionEndpointCollection.php new file mode 100644 index 0000000..366347f --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/EndpointCollection/PermissionEndpointCollection.php @@ -0,0 +1,41 @@ +send((new GetPermissionRequest($permissionId))->test($testmode)); + } + + /** + * Retrieve all permissions from Mollie. + * + * @throws RequestException + */ + public function list(): PermissionCollection + { + /** @var PermissionCollection */ + return $this->send(new ListPermissionsRequest); + } +} diff --git a/vendor/mollie/mollie-api-php/src/EndpointCollection/ProfileEndpointCollection.php b/vendor/mollie/mollie-api-php/src/EndpointCollection/ProfileEndpointCollection.php new file mode 100644 index 0000000..2fb31ef --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/EndpointCollection/ProfileEndpointCollection.php @@ -0,0 +1,126 @@ +withPayload($payload) + ->create(); + + /** @var Profile */ + return $this->send($request); + } + + /** + * Retrieve a Profile from Mollie. + * + * Will throw an ApiException if the profile id is invalid or the resource cannot be found. + * + * @param bool|array $testmode + * @return Profile|CurrentProfile + * + * @throws RequestException + */ + public function get(string $profileId, $testmode = false): Profile + { + $testmode = Utility::extractBool($testmode, 'testmode', false); + + /** @var Profile */ + return $this->send((new GetProfileRequest($profileId))->test($testmode)); + } + + /** + * Retrieve the current Profile from Mollie. + * + * @param bool|array $testmode + * + * @throws RequestException + */ + public function getCurrent($testmode = false): CurrentProfile + { + $testmode = Utility::extractBool($testmode, 'testmode', false); + + /** @var CurrentProfile */ + return $this->send((new GetCurrentProfileRequest)->test($testmode)); + } + + /** + * Update a specific Profile resource. + * + * @throws RequestException + */ + public function update(string $profileId, array $payload = []): ?Profile + { + $request = UpdateProfileRequestFactory::new($profileId) + ->withPayload($payload) + ->create(); + + /** @var Profile|null */ + return $this->send($request); + } + + /** + * Delete a Profile from Mollie. + * + * Will throw a ApiException if the profile id is invalid or the resource cannot be found. + * Returns with HTTP status No Content (204) if successful. + * + * @throws RequestException + */ + public function delete(string $profileId): void + { + $this->send(new DeleteProfileRequest($profileId)); + } + + /** + * Retrieves a collection of Profiles from Mollie. + * + * @param string|null $from The first profile ID you want to include in your list. + * + * @throws RequestException + */ + public function page(?string $from = null, ?int $limit = null): ProfileCollection + { + /** @var ProfileCollection */ + return $this->send(new GetPaginatedProfilesRequest($from, $limit)); + } + + /** + * Create an iterator for iterating over profiles retrieved from Mollie. + * + * @param string|null $from The first resource ID you want to include in your list. + * @param bool $iterateBackwards Set to true for reverse order iteration (default is false). + */ + public function iterator( + ?string $from = null, + ?int $limit = null, + bool $iterateBackwards = false + ): LazyCollection { + return $this->send( + (new GetPaginatedProfilesRequest($from, $limit)) + ->useIterator() + ->setIterationDirection($iterateBackwards) + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/EndpointCollection/ProfileMethodEndpointCollection.php b/vendor/mollie/mollie-api-php/src/EndpointCollection/ProfileMethodEndpointCollection.php new file mode 100644 index 0000000..a280895 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/EndpointCollection/ProfileMethodEndpointCollection.php @@ -0,0 +1,153 @@ +enableForId($profileId, $id); + } + + /** + * Enable a method for the provided Profile object. + * Alias of enableFor for backwards compatibility. + * + * @throws RequestException + */ + public function createFor(Profile $profile, string $id): Method + { + return $this->enableFor($profile, $id); + } + + /** + * Enable a method for the current profile. + * Alias of enable for backwards compatibility. + * + * @throws RequestException + */ + public function createForCurrentProfile(string $id): Method + { + return $this->enable($id); + } + + /** + * Enable a payment method for a specific profile. + * + * @param string $profileId The profile's ID or 'me' for the current profile + * @param string $id The payment method ID + * + * @throws RequestException + */ + public function enableForId(string $profileId, string $id): Method + { + /** @var Method */ + return $this->send(new EnableMethodRequest($profileId, $id)); + } + + /** + * Enable a payment method for the provided Profile object. + * + * @param string $id The payment method ID + * + * @throws RequestException + */ + public function enableFor(Profile $profile, string $id): Method + { + return $this->enableForId($profile->id, $id); + } + + /** + * Enable a payment method for the current profile. + * + * @param string $id The payment method ID + * + * @throws RequestException + */ + public function enable(string $id): Method + { + return $this->enableForId('me', $id); + } + + /** + * Disable a method for the provided Profile ID. + * Alias of disableForId for backwards compatibility. + * + * @throws RequestException + */ + public function deleteForId(string $profileId, string $id): void + { + $this->disableForId($profileId, $id); + } + + /** + * Disable a method for the provided Profile object. + * Alias of disableFor for backwards compatibility. + * + * @throws RequestException + */ + public function deleteFor(Profile $profile, string $id): void + { + $this->disableFor($profile, $id); + } + + /** + * Disable a method for the current profile. + * Alias of disable for backwards compatibility. + * + * @throws RequestException + */ + public function deleteForCurrentProfile(string $id): void + { + $this->disable($id); + } + + /** + * Disable a payment method for a specific profile. + * + * @param string $profileId The profile's ID or 'me' for the current profile + * @param string $id The payment method ID + * + * @throws RequestException + */ + public function disableForId(string $profileId, string $id): void + { + $this->send(new DisableMethodRequest($profileId, $id)); + } + + /** + * Disable a payment method for the provided Profile object. + * + * @param string $id The payment method ID + * + * @throws RequestException + */ + public function disableFor(Profile $profile, string $id): void + { + $this->disableForId($profile->id, $id); + } + + /** + * Disable a payment method for the current profile. + * + * @param string $id The payment method ID + * + * @throws RequestException + */ + public function disable(string $id): void + { + $this->disableForId('me', $id); + } +} diff --git a/vendor/mollie/mollie-api-php/src/EndpointCollection/RefundEndpointCollection.php b/vendor/mollie/mollie-api-php/src/EndpointCollection/RefundEndpointCollection.php new file mode 100644 index 0000000..03a7ce1 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/EndpointCollection/RefundEndpointCollection.php @@ -0,0 +1,65 @@ +withQuery([ + 'from' => $from, + 'limit' => $limit, + 'filters' => $filters, + ]) + ->create(); + + /** @var RefundCollection */ + return $this->send($request->test($testmode)); + } + + /** + * Create an iterator for iterating over refunds retrieved from Mollie. + * + * @param string|null $from The first resource ID you want to include in your list. + * @param bool $iterateBackwards Set to true for reverse order iteration (default is false). + */ + public function iterator( + ?string $from = null, + ?int $limit = null, + array $filters = [], + bool $iterateBackwards = false + ): LazyCollection { + $testmode = Utility::extractBool($filters, 'testmode', false); + + $request = GetPaginatedRefundsRequestFactory::new() + ->withQuery([ + 'from' => $from, + 'limit' => $limit, + 'filters' => $filters, + ]) + ->create(); + + return $this->send( + $request + ->useIterator() + ->setIterationDirection($iterateBackwards) + ->test($testmode) + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/EndpointCollection/SalesInvoiceEndpointCollection.php b/vendor/mollie/mollie-api-php/src/EndpointCollection/SalesInvoiceEndpointCollection.php new file mode 100644 index 0000000..db41431 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/EndpointCollection/SalesInvoiceEndpointCollection.php @@ -0,0 +1,92 @@ +send(new GetSalesInvoiceRequest($id)); + } + + /** + * Creates a SalesInvoice in Mollie. + * + * @throws RequestException + */ + public function create(array $payload = []): SalesInvoice + { + $request = CreateSalesInvoiceRequestFactory::new() + ->withPayload($payload) + ->create(); + + return $this->send($request); + } + + /** + * Update a specific SalesInvoice resource. + * + * @throws RequestException + */ + public function update(string $id, array $payload = []): ?SalesInvoice + { + $request = UpdateSalesInvoiceRequestFactory::new($id) + ->withPayload($payload) + ->create(); + + return $this->send($request); + } + + /** + * Delete a SalesInvoice from Mollie. + * + * @throws RequestException + */ + public function delete(string $id): void + { + $this->send(new DeleteSalesInvoiceRequest($id)); + } + + /** + * Retrieves a collection of SalesInvoices from Mollie. + * + * @throws RequestException + */ + public function page(?string $from = null, ?int $limit = null): SalesInvoiceCollection + { + return $this->send(new GetPaginatedSalesInvoicesRequest($from, $limit)); + } + + /** + * Create an iterator for iterating over sales invoices retrieved from Mollie. + * + * @param string|null $from The first resource ID you want to include in your list. + * @param bool $iterateBackwards Set to true for reverse order iteration (default is false). + */ + public function iterator( + ?string $from = null, + ?int $limit = null, + bool $iterateBackwards = false + ): LazyCollection { + return $this->send( + (new GetPaginatedSalesInvoicesRequest($from, $limit)) + ->useIterator() + ->setIterationDirection($iterateBackwards) + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/EndpointCollection/SessionEndpointCollection.php b/vendor/mollie/mollie-api-php/src/EndpointCollection/SessionEndpointCollection.php new file mode 100644 index 0000000..9a0fc61 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/EndpointCollection/SessionEndpointCollection.php @@ -0,0 +1,125 @@ +send(new GetSessionRequest($sessionId)); + } + + /** + * Creates a session in Mollie. + * + * @throws RequestException + */ + public function create(array $payload = []): Session + { + $request = CreateSessionRequestFactory::new() + ->withPayload($payload) + ->create(); + + /** @var Session */ + return $this->send($request); + } + + /** + * Update the given Session. + * + * Will throw a ApiException if the session id is invalid or the resource cannot be found. + * + * + * @throws RequestException + */ + public function update(string $id, array $payload = [], array $query = []): Session + { + $request = new DynamicPutRequest("sessions/{$id}", $payload, $query); + + $request->setHydratableResource(Session::class); + + /** @var Session */ + return $this->send($request); + } + + /** + * Cancel the given Session. + * + * Will throw a ApiException if the session id is invalid or the resource cannot be found. + * + * @throws RequestException + */ + public function cancel(string $id): void + { + $this->send(new CancelSessionRequest($id)); + } + + /** + * Get the sessions endpoint. + * + * @param string|null $from The first session ID you want to include in your list. + * + * @throws RequestException + */ + public function page(?string $from = null, ?int $limit = null, array $filters = []): SessionCollection + { + $query = SortablePaginatedQueryFactory::new([ + 'from' => $from, + 'limit' => $limit, + 'filters' => $filters, + ])->create(); + + $request = new DynamicPaginatedRequest('sessions', array_merge($filters, $query->toArray())); + + $request->setHydratableResource(SessionCollection::class); + + /** @var SessionCollection */ + return $this->send($request); + } + + /** + * Create an iterator for iterating over sessions retrieved from Mollie. + * + * @param string|null $from The first resource ID you want to include in your list. + * @param bool $iterateBackwards Set to true for reverse order iteration (default is false). + */ + public function iterator( + ?string $from = null, + ?int $limit = null, + array $filters = [], + bool $iterateBackwards = false + ): LazyCollection { + $query = SortablePaginatedQueryFactory::new([ + 'from' => $from, + 'limit' => $limit, + 'filters' => $filters, + ])->create(); + + $request = new DynamicPaginatedRequest('sessions', array_merge($filters, $query->toArray())); + + $request->setHydratableResource(SessionCollection::class); + + return $this->send( + $request + ->useIterator() + ->setIterationDirection($iterateBackwards) + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/EndpointCollection/SettlementCaptureEndpointCollection.php b/vendor/mollie/mollie-api-php/src/EndpointCollection/SettlementCaptureEndpointCollection.php new file mode 100644 index 0000000..28dcd9f --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/EndpointCollection/SettlementCaptureEndpointCollection.php @@ -0,0 +1,87 @@ +pageForId($settlement->id, $query, $testmode); + } + + /** + * Retrieves a collection of Settlement Captures from Mollie. + * + * @throws RequestException + */ + public function pageForId(string $settlementId, array $query = [], bool $testmode = false): CaptureCollection + { + $testmode = Utility::extractBool($query, 'testmode', $testmode); + + $request = GetPaginatedSettlementCapturesRequestFactory::new($settlementId) + ->withQuery($query) + ->create(); + + /** @var CaptureCollection */ + return $this->send($request->test($testmode)); + } + + /** + * Create an iterator for iterating over captures for the given settlement, retrieved from Mollie. + * + * @param string|null $from The first resource ID you want to include in your list. + * @param bool $iterateBackwards Set to true for reverse order iteration (default is false). + */ + public function iteratorFor( + Settlement $settlement, + ?string $from = null, + ?int $limit = null, + array $parameters = [], + bool $iterateBackwards = false + ): LazyCollection { + return $this->iteratorForId($settlement->id, $from, $limit, $parameters, $iterateBackwards); + } + + /** + * Create an iterator for iterating over captures for the given settlement id, retrieved from Mollie. + * + * @param string|null $from The first resource ID you want to include in your list. + * @param bool $iterateBackwards Set to true for reverse order iteration (default is false). + */ + public function iteratorForId( + string $settlementId, + ?string $from = null, + ?int $limit = null, + array $filters = [], + bool $iterateBackwards = false + ): LazyCollection { + $testmode = Utility::extractBool($filters, 'testmode', false); + + $request = GetPaginatedSettlementCapturesRequestFactory::new($settlementId) + ->withQuery([ + 'from' => $from, + 'limit' => $limit, + 'filters' => $filters, + ]) + ->create(); + + return $this->send( + $request + ->useIterator() + ->setIterationDirection($iterateBackwards) + ->test($testmode) + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/EndpointCollection/SettlementChargebackEndpointCollection.php b/vendor/mollie/mollie-api-php/src/EndpointCollection/SettlementChargebackEndpointCollection.php new file mode 100644 index 0000000..90c66ce --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/EndpointCollection/SettlementChargebackEndpointCollection.php @@ -0,0 +1,87 @@ +pageForId($settlement->id, $query, $testmode); + } + + /** + * Retrieves a collection of Settlement Chargebacks from Mollie. + * + * @throws RequestException + */ + public function pageForId(string $settlementId, array $query = [], bool $testmode = false): ChargebackCollection + { + $testmode = Utility::extractBool($query, 'testmode', $testmode); + + $request = GetPaginatedSettlementChargebacksRequestFactory::new($settlementId) + ->withQuery($query) + ->create(); + + /** @var ChargebackCollection */ + return $this->send($request->test($testmode)); + } + + /** + * Create an iterator for iterating over chargebacks for the given settlement, retrieved from Mollie. + * + * @param string|null $from The first resource ID you want to include in your list. + * @param bool $iterateBackwards Set to true for reverse order iteration (default is false). + */ + public function iteratorFor( + Settlement $settlement, + ?string $from = null, + ?int $limit = null, + array $parameters = [], + bool $iterateBackwards = false + ): LazyCollection { + return $this->iteratorForId($settlement->id, $from, $limit, $parameters, $iterateBackwards); + } + + /** + * Create an iterator for iterating over chargebacks for the given settlement id, retrieved from Mollie. + * + * @param string|null $from The first resource ID you want to include in your list. + * @param bool $iterateBackwards Set to true for reverse order iteration (default is false). + */ + public function iteratorForId( + string $settlementId, + ?string $from = null, + ?int $limit = null, + array $filters = [], + bool $iterateBackwards = false + ): LazyCollection { + $testmode = Utility::extractBool($filters, 'testmode', false); + + $request = GetPaginatedSettlementChargebacksRequestFactory::new($settlementId) + ->withQuery([ + 'from' => $from, + 'limit' => $limit, + 'filters' => $filters, + ]) + ->create(); + + return $this->send( + $request + ->useIterator() + ->setIterationDirection($iterateBackwards) + ->test($testmode) + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/EndpointCollection/SettlementEndpointCollection.php b/vendor/mollie/mollie-api-php/src/EndpointCollection/SettlementEndpointCollection.php new file mode 100644 index 0000000..5ce1dcd --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/EndpointCollection/SettlementEndpointCollection.php @@ -0,0 +1,83 @@ +send(new GetSettlementRequest($settlementId)); + } + + /** + * Retrieve the details of the current settlement that has not yet been paid out. + * + * @throws RequestException + */ + public function next(): Settlement + { + return $this->send(new GetSettlementRequest('next')); + } + + /** + * Retrieve the details of the open balance of the organization. + * + * @throws RequestException + */ + public function open(): Settlement + { + return $this->send(new GetSettlementRequest('open')); + } + + /** + * Retrieves a collection of Settlements from Mollie. + * + * @throws RequestException + */ + public function page(?string $from = null, ?int $limit = null, array $filters = []): SettlementCollection + { + $request = GetPaginatedSettlementsRequestFactory::new() + ->withQuery([ + 'from' => $from, + 'limit' => $limit, + 'filters' => $filters, + ]) + ->create(); + + return $this->send($request); + } + + /** + * Create an iterator for iterating over settlements retrieved from Mollie. + */ + public function iterator(?string $from = null, ?int $limit = null, array $filters = [], bool $iterateBackwards = false): LazyCollection + { + $request = GetPaginatedSettlementsRequestFactory::new() + ->withQuery([ + 'from' => $from, + 'limit' => $limit, + 'filters' => $filters, + ]) + ->create(); + + return $this->send( + $request + ->useIterator() + ->setIterationDirection($iterateBackwards) + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/EndpointCollection/SettlementPaymentEndpointCollection.php b/vendor/mollie/mollie-api-php/src/EndpointCollection/SettlementPaymentEndpointCollection.php new file mode 100644 index 0000000..78f9eeb --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/EndpointCollection/SettlementPaymentEndpointCollection.php @@ -0,0 +1,85 @@ +pageForId($settlement->id, $query, $testmode); + } + + /** + * Retrieves a collection of Settlement Payments from Mollie. + * + * @throws RequestException + */ + public function pageForId(string $settlementId, array $query = [], bool $testmode = false): PaymentCollection + { + $testmode = Utility::extractBool($query, 'testmode', $testmode); + $query = SortablePaginatedQueryFactory::new($query)->create(); + + return $this->send( + (new GetPaginatedSettlementPaymentsRequest( + $settlementId, + $query->from, + $query->limit, + $query->sort + )) + ->test($testmode) + ); + } + + /** + * Create an iterator for iterating over payments for the given settlement, retrieved from Mollie. + */ + public function iteratorFor( + Settlement $settlement, + ?string $from = null, + ?int $limit = null, + array $parameters = [], + bool $iterateBackwards = false + ): LazyCollection { + return $this->iteratorForId($settlement->id, $from, $limit, $parameters, $iterateBackwards); + } + + public function iteratorForId( + string $settlementId, + ?string $from = null, + ?int $limit = null, + array $parameters = [], + bool $iterateBackwards = false + ): LazyCollection { + $testmode = Utility::extractBool($parameters, 'testmode', false); + $query = SortablePaginatedQueryFactory::new([ + 'from' => $from, + 'limit' => $limit, + 'filters' => $parameters, + ])->create(); + + return $this->send( + (new GetPaginatedSettlementPaymentsRequest( + $settlementId, + $query->from, + $query->limit, + $query->sort + )) + ->useIterator() + ->setIterationDirection($iterateBackwards) + ->test($testmode) + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/EndpointCollection/SettlementRefundEndpointCollection.php b/vendor/mollie/mollie-api-php/src/EndpointCollection/SettlementRefundEndpointCollection.php new file mode 100644 index 0000000..0e7ccbd --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/EndpointCollection/SettlementRefundEndpointCollection.php @@ -0,0 +1,80 @@ +pageForId($settlement->id, $query, $testmode); + } + + /** + * Retrieves a collection of Settlement Refunds from Mollie. + * + * @throws RequestException + */ + public function pageForId(string $settlementId, array $query = [], bool $testmode = false): RefundCollection + { + $testmode = Utility::extractBool($query, 'testmode', $testmode); + + $request = GetPaginatedSettlementRefundsQueryFactory::new($settlementId) + ->withQuery($query) + ->create(); + + return $this->send($request->test($testmode)); + } + + /** + * Create an iterator for iterating over refunds for the given settlement, retrieved from Mollie. + */ + public function iteratorFor( + Settlement $settlement, + ?string $from = null, + ?int $limit = null, + array $parameters = [], + bool $iterateBackwards = false + ): LazyCollection { + return $this->iteratorForId($settlement->id, $from, $limit, $parameters, $iterateBackwards); + } + + /** + * Create an iterator for iterating over refunds for the given settlement id, retrieved from Mollie. + */ + public function iteratorForId( + string $settlementId, + ?string $from = null, + ?int $limit = null, + array $filters = [], + bool $iterateBackwards = false + ): LazyCollection { + $testmode = Utility::extractBool($filters, 'testmode', false); + + $request = GetPaginatedSettlementRefundsQueryFactory::new($settlementId) + ->withQuery([ + 'from' => $from, + 'limit' => $limit, + 'filters' => $filters, + ]) + ->create(); + + return $this->send( + $request + ->useIterator() + ->setIterationDirection($iterateBackwards) + ->test($testmode) + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/EndpointCollection/SubscriptionEndpointCollection.php b/vendor/mollie/mollie-api-php/src/EndpointCollection/SubscriptionEndpointCollection.php new file mode 100644 index 0000000..fb804d6 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/EndpointCollection/SubscriptionEndpointCollection.php @@ -0,0 +1,209 @@ +getForId($customer->id, $subscriptionId, $testmode); + } + + /** + * Retrieve a single subscription from Mollie. + * + * @param bool|array $testmode + * + * @throws RequestException + */ + public function getForId(string $customerId, string $subscriptionId, $testmode = false): Subscription + { + $testmode = Utility::extractBool($testmode, 'testmode'); + + return $this->send((new GetSubscriptionRequest($customerId, $subscriptionId))->test($testmode)); + } + + /** + * Creates a subscription for a Customer in Mollie. + * + * @throws RequestException + */ + public function createFor(Customer $customer, array $payload = [], bool $testmode = false): Subscription + { + return $this->createForId($customer->id, $payload, $testmode); + } + + /** + * Creates a subscription for a Customer in Mollie. + * + * @throws RequestException + */ + public function createForId(string $customerId, array $payload = [], bool $testmode = false): Subscription + { + $testmode = Utility::extractBool($payload, 'testmode', $testmode); + + $request = CreateSubscriptionRequestFactory::new($customerId) + ->withPayload($payload) + ->create(); + + return $this->send($request->test($testmode)); + } + + /** + * Update the given Subscription. + * + * @throws RequestException + */ + public function update(string $customerId, string $subscriptionId, array $payload = [], bool $testmode = false): ?Subscription + { + $testmode = Utility::extractBool($payload, 'testmode', $testmode); + + $request = UpdateSubscriptionRequestFactory::new($customerId, $subscriptionId) + ->withPayload($payload) + ->create(); + + return $this->send($request->test($testmode)); + } + + /** + * Cancel the given Subscription. + * + * @throws RequestException + */ + public function cancelFor(Customer $customer, string $subscriptionId, bool $testmode = false): Subscription + { + return $this->cancelForId($customer->id, $subscriptionId, $testmode); + } + + /** + * Cancel the given Subscription. + * + * @throws RequestException + */ + public function cancelForId(string $customerId, string $subscriptionId, bool $testmode = false): Subscription + { + return $this->send((new CancelSubscriptionRequest($customerId, $subscriptionId))->test($testmode)); + } + + /** + * Retrieve a page of subscriptions from Mollie. + * + * @throws RequestException + */ + public function pageFor(Customer $customer, ?string $from = null, ?int $limit = null, array $filters = []): SubscriptionCollection + { + return $this->pageForId($customer->id, $from, $limit, $filters); + } + + /** + * Retrieve a page of subscriptions from Mollie. + * + * @throws RequestException + */ + public function pageForId(string $customerId, ?string $from = null, ?int $limit = null, array $filters = []): SubscriptionCollection + { + $testmode = Utility::extractBool($filters, 'testmode', false); + + return $this->send((new GetPaginatedSubscriptionsRequest($customerId, $from, $limit))->test($testmode)); + } + + /** + * Create an iterator for iterating over subscriptions for the given customer, retrieved from Mollie. + */ + public function iteratorFor( + Customer $customer, + ?string $from = null, + ?int $limit = null, + array $filters = [], + bool $iterateBackwards = false + ): LazyCollection { + return $this->iteratorForId($customer->id, $from, $limit, $filters, $iterateBackwards); + } + + /** + * Create an iterator for iterating over subscriptions for the given customer id, retrieved from Mollie. + */ + public function iteratorForId( + string $customerId, + ?string $from = null, + ?int $limit = null, + array $filters = [], + bool $iterateBackwards = false + ): LazyCollection { + $testmode = Utility::extractBool($filters, 'testmode', false); + + return $this->send( + (new GetPaginatedSubscriptionsRequest($customerId, $from, $limit)) + ->useIterator() + ->setIterationDirection($iterateBackwards) + ->test($testmode) + ); + } + + public function allFor(?string $from = null, ?int $limit = null, array $filters = []): SubscriptionCollection + { + return $this->allForId($from, $limit, $filters); + } + + public function allForId( + ?string $from = null, + ?int $limit = null, + array $filters = [] + ): SubscriptionCollection { + $testmode = Utility::extractBool($filters, 'testmode', false); + + $request = GetAllPaginatedSubscriptionsRequestFactory::new() + ->withQuery([ + 'from' => $from, + 'limit' => $limit, + 'filters' => $filters, + ]) + ->create(); + + return $this->send($request->test($testmode)); + } + + public function iteratorForAll( + ?string $from = null, + ?int $limit = null, + array $filters = [], + bool $iterateBackwards = true + ): LazyCollection { + $testmode = Utility::extractBool($filters, 'testmode', false); + + $request = GetAllPaginatedSubscriptionsRequestFactory::new() + ->withQuery([ + 'from' => $from, + 'limit' => $limit, + 'filters' => $filters, + ]) + ->create(); + + return $this->send( + $request + ->useIterator() + ->setIterationDirection($iterateBackwards) + ->test($testmode) + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/EndpointCollection/SubscriptionPaymentEndpointCollection.php b/vendor/mollie/mollie-api-php/src/EndpointCollection/SubscriptionPaymentEndpointCollection.php new file mode 100644 index 0000000..fc2846d --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/EndpointCollection/SubscriptionPaymentEndpointCollection.php @@ -0,0 +1,89 @@ +pageForIds($subscription->customerId, $subscription->id, $from, $limit, $testmode); + } + + /** + * Retrieves a paginated collection of Subscription Payments from Mollie. + * + * @param string|null $from The first payment ID you want to include in your list. + * @param int|null $limit The maximum amount of results you want to retrieve per page. + * @param bool|array $testmode + * + * @throws RequestException + */ + public function pageForIds( + string $customerId, + string $subscriptionId, + ?string $from = null, + ?int $limit = null, + $testmode = false + ): PaymentCollection { + $testmode = Utility::extractBool($testmode, 'testmode', false); + + return $this->send( + (new GetPaginatedSubscriptionPaymentsRequest($customerId, $subscriptionId, $from, $limit)) + ->test($testmode) + ); + } + + /** + * Create an iterator for iterating over payments for the given subscription, retrieved from Mollie. + * + * @param bool|array $testmode + */ + public function iteratorFor( + Subscription $subscription, + ?string $from = null, + ?int $limit = null, + $testmode = false, + bool $iterateBackwards = false + ): LazyCollection { + return $this->iteratorForIds($subscription->customerId, $subscription->id, $from, $limit, $testmode, $iterateBackwards); + } + + /** + * Create an iterator for iterating over payments for the given subscription ID, retrieved from Mollie. + * + * @param bool|array $testmode + */ + public function iteratorForIds( + string $customerId, + string $subscriptionId, + ?string $from = null, + ?int $limit = null, + $testmode = false, + bool $iterateBackwards = false + ): LazyCollection { + $testmode = Utility::extractBool($testmode, 'testmode', false); + + return $this->send( + (new GetPaginatedSubscriptionPaymentsRequest($customerId, $subscriptionId, $from, $limit)) + ->useIterator() + ->setIterationDirection($iterateBackwards) + ->test($testmode) + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/EndpointCollection/TerminalEndpointCollection.php b/vendor/mollie/mollie-api-php/src/EndpointCollection/TerminalEndpointCollection.php new file mode 100644 index 0000000..9bf0ab8 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/EndpointCollection/TerminalEndpointCollection.php @@ -0,0 +1,70 @@ +send((new GetTerminalRequest($id))->test($testmode)); + } + + /** + * Retrieves a collection of Terminals from Mollie for the current organization / profile, ordered from newest to oldest. + * + * @param string|null $from The first terminal ID you want to include in your list. + * @param bool|array $testmode + * + * @throws RequestException + */ + public function page(?string $from = null, ?int $limit = null, $testmode = false): TerminalCollection + { + $testmode = Utility::extractBool($testmode, 'testmode', false); + + /** @var TerminalCollection */ + return $this->send((new GetPaginatedTerminalsRequest($from, $limit))->test($testmode)); + } + + /** + * Create an iterator for iterating over terminals retrieved from Mollie. + * + * @param string|null $from The first resource ID you want to include in your list. + * @param bool $iterateBackwards Set to true for reverse order iteration (default is false). + * @param bool|array $testmode + */ + public function iterator( + ?string $from = null, + ?int $limit = null, + $testmode = false, + bool $iterateBackwards = false + ): LazyCollection { + $testmode = Utility::extractBool($testmode, 'testmode', false); + + return $this->send( + (new GetPaginatedTerminalsRequest($from, $limit)) + ->useIterator() + ->setIterationDirection($iterateBackwards) + ->test($testmode) + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/EndpointCollection/WalletEndpointCollection.php b/vendor/mollie/mollie-api-php/src/EndpointCollection/WalletEndpointCollection.php new file mode 100644 index 0000000..4b11582 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/EndpointCollection/WalletEndpointCollection.php @@ -0,0 +1,30 @@ +withPayload(array_merge([ + 'domain' => $domain, + 'validationUrl' => $validationUrl, + ], $parameters)) + ->create(); + + return $this->send($request); + } +} diff --git a/vendor/mollie/mollie-api-php/src/EndpointCollection/WebhookEndpointCollection.php b/vendor/mollie/mollie-api-php/src/EndpointCollection/WebhookEndpointCollection.php new file mode 100644 index 0000000..a9812aa --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/EndpointCollection/WebhookEndpointCollection.php @@ -0,0 +1,135 @@ +withPayload($payload) + ->create(); + + /** @var Webhook */ + return $this->send($request->test($test)); + } + + /** + * Retrieve a webhook from Mollie. + * + * Will throw an ApiException if the webhook id is invalid or the resource cannot be found. + * + * @throws RequestException + */ + public function get(string $id, bool $test = false): Webhook + { + /** @var Webhook */ + return $this->send((new GetWebhookRequest($id))->test($test)); + } + + /** + * Update a webhook. + * + * @throws RequestException + */ + public function update(string $id, array $payload = [], bool $test = false): Webhook + { + $request = UpdateWebhookRequestFactory::new($id) + ->withPayload($payload) + ->create(); + + /** @var Webhook */ + return $this->send($request->test($test)); + } + + /** + * Delete a webhook from Mollie. + * + * @throws RequestException + */ + public function delete(string $id, bool $test = false): void + { + $this->send((new DeleteWebhookRequest($id))->test($test)); + } + + /** + * Test a webhook by sending a test event. + * + * @throws RequestException + */ + public function test(string $id, bool $test = false): AnyResource + { + /** @var AnyResource */ + return $this->send((new TestWebhookRequest($id))->test($test)); + } + + /** + * Retrieves a collection of webhooks from Mollie. + * + * @throws RequestException + */ + public function page( + ?string $from = null, + ?int $limit = null, + ?string $sort = null, + ?string $eventTypes = null + ): WebhookCollection { + $request = new GetPaginatedWebhooksRequest( + $from, + $limit, + $sort, + $eventTypes + ); + + /** @var WebhookCollection */ + return $this->send($request); + } + + /** + * Create an iterator for iterating over webhooks retrieved from Mollie. + * + * @param string|null $from The first webhook ID you want to include in your list. + * @param bool $iterateBackwards Set to true for reverse order iteration (default is false). + */ + public function iterator( + ?string $from = null, + ?int $limit = null, + ?string $sort = null, + ?string $eventTypes = null, + bool $iterateBackwards = false, + bool $test = false + ): LazyCollection { + $request = new GetPaginatedWebhooksRequest( + $from, + $limit, + $sort, + $eventTypes + ); + + return $this->send( + $request + ->useIterator() + ->setIterationDirection($iterateBackwards) + ->test($test) + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/EndpointCollection/WebhookEventEndpointCollection.php b/vendor/mollie/mollie-api-php/src/EndpointCollection/WebhookEventEndpointCollection.php new file mode 100644 index 0000000..885efe9 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/EndpointCollection/WebhookEventEndpointCollection.php @@ -0,0 +1,23 @@ +send(new GetWebhookEventRequest($id)); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Exceptions/ApiException.php b/vendor/mollie/mollie-api-php/src/Exceptions/ApiException.php new file mode 100644 index 0000000..60ab7c3 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Exceptions/ApiException.php @@ -0,0 +1,129 @@ + */ + protected array $links = []; + + /** + * @param Response $response The response that caused this exception + * @param string $message The error message + * @param int $code The error code + * @param Throwable|null $previous Previous exception if any + * + * @throws ApiException + */ + public function __construct( + Response $response, + string $message, + int $code, + ?Throwable $previous = null + ) { + $this->plainMessage = $message; + $this->raisedAt = new DateTimeImmutable; + + $formattedRaisedAt = $this->raisedAt->format(DateTimeImmutable::ATOM); + $message = "[{$formattedRaisedAt}] ".$message; + + $object = $response->json(); + if (isset($object->_links)) { + foreach ($object->_links as $key => $value) { + $this->links[$key] = $value; + } + } + + if ($this->hasLink('documentation')) { + $message .= ". Documentation: {$this->getDocumentationUrl()}"; + } + + if ($requestBody = $response->getPsrRequest()->getBody()->__toString()) { + $message .= ". Request body: {$requestBody}"; + } + + parent::__construct($response, $message, $code, $previous); + } + + public static function fromResponse(Response $response): self + { + $body = $response->json(); + $status = $response->status(); + + return new self( + $response, + sprintf( + 'Error executing API call (%d: %s): %s', + $status, + $body->title ?? 'Unknown', + $body->detail ?? 'Unknown' + ), + $status, + null + ); + } + + public function getDocumentationUrl(): ?string + { + return $this->getUrl('documentation'); + } + + public function getDashboardUrl(): ?string + { + return $this->getUrl('dashboard'); + } + + public function hasLink(string $key): bool + { + return array_key_exists($key, $this->links); + } + + public function getLink(string $key): \stdClass + { + if ($this->hasLink($key)) { + return $this->links[$key]; + } + + throw new \RuntimeException("Link '{$key}' not found"); + } + + public function getUrl(string $key): ?string + { + if (! $this->hasLink($key)) { + return null; + } + + $link = $this->getLink($key); + + return $link->href; + } + + /** + * Get the ISO8601 representation of the moment this exception was thrown + */ + public function getRaisedAt(): DateTimeImmutable + { + return $this->raisedAt; + } + + /** + * Retrieve the plain exception message without timestamp and metadata. + */ + public function getPlainMessage(): string + { + return $this->plainMessage; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Exceptions/ClientException.php b/vendor/mollie/mollie-api-php/src/Exceptions/ClientException.php new file mode 100644 index 0000000..67a4e10 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Exceptions/ClientException.php @@ -0,0 +1,7 @@ +json(); + + return new self( + $response, + 'Your request was understood but not allowed. '. + sprintf('Error executing API call (%d: %s): %s', ResponseStatusCode::HTTP_FORBIDDEN, $body->title, $body->detail), + ResponseStatusCode::HTTP_FORBIDDEN + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Exceptions/IncompatiblePlatformException.php b/vendor/mollie/mollie-api-php/src/Exceptions/IncompatiblePlatformException.php new file mode 100644 index 0000000..076de81 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Exceptions/IncompatiblePlatformException.php @@ -0,0 +1,16 @@ +token = $token; + parent::__construct($message ?: "Invalid authentication token: '{$token}'"); + } + + public function getToken(): string + { + return $this->token; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Exceptions/InvalidSignatureException.php b/vendor/mollie/mollie-api-php/src/Exceptions/InvalidSignatureException.php new file mode 100644 index 0000000..4f04789 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Exceptions/InvalidSignatureException.php @@ -0,0 +1,7 @@ +rawResponse = $rawResponse; + } + + public function getRawResponse(): string + { + return $this->rawResponse; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Exceptions/LogicException.php b/vendor/mollie/mollie-api-php/src/Exceptions/LogicException.php new file mode 100644 index 0000000..9d41e40 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Exceptions/LogicException.php @@ -0,0 +1,7 @@ +json(); + + return new self( + $response, + 'The HTTP method is not supported. '. + sprintf('Error executing API call (%d: %s): %s', ResponseStatusCode::HTTP_METHOD_NOT_ALLOWED, $body->title, $body->detail), + ResponseStatusCode::HTTP_METHOD_NOT_ALLOWED + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Exceptions/MissingAuthenticationException.php b/vendor/mollie/mollie-api-php/src/Exceptions/MissingAuthenticationException.php new file mode 100644 index 0000000..0c2dd2f --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Exceptions/MissingAuthenticationException.php @@ -0,0 +1,11 @@ +pendingRequest = $pendingRequest; + $this->plainMessage = $message ?? 'The request failed due to network issues.'; + + parent::__construct($this->plainMessage, $code, $previous); + } + + public function getPendingRequest(): PendingRequest + { + return $this->pendingRequest; + } + + public function getPlainMessage(): string + { + return $this->plainMessage; + } + + public function getRequest(): RequestInterface + { + return $this->pendingRequest->createPsrRequest(); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Exceptions/NotFoundException.php b/vendor/mollie/mollie-api-php/src/Exceptions/NotFoundException.php new file mode 100644 index 0000000..0f6d4d8 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Exceptions/NotFoundException.php @@ -0,0 +1,21 @@ +json(); + + return new self( + $response, + 'The object referenced by your API request does not exist. '. + sprintf('Error executing API call (%d: %s): %s', ResponseStatusCode::HTTP_NOT_FOUND, $body->title, $body->detail), + ResponseStatusCode::HTTP_NOT_FOUND + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Exceptions/RequestException.php b/vendor/mollie/mollie-api-php/src/Exceptions/RequestException.php new file mode 100644 index 0000000..a134afd --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Exceptions/RequestException.php @@ -0,0 +1,45 @@ +response = $response; + } + + public function getRequest(): RequestInterface + { + return $this->response->getPsrRequest(); + } + + public function getResponse(): Response + { + return $this->response; + } + + public function getPendingRequest(): PendingRequest + { + return $this->response->getPendingRequest(); + } + + public function getStatusCode(): int + { + return $this->response->status(); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Exceptions/RequestTimeoutException.php b/vendor/mollie/mollie-api-php/src/Exceptions/RequestTimeoutException.php new file mode 100644 index 0000000..3b5e238 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Exceptions/RequestTimeoutException.php @@ -0,0 +1,23 @@ +json(); + + return new self( + $response->getPendingRequest(), + null, + 'The request took too long to complete. '. + sprintf('Error executing API call (%d: %s): %s', 408, $body->title, $body->detail) + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Exceptions/RetryableNetworkRequestException.php b/vendor/mollie/mollie-api-php/src/Exceptions/RetryableNetworkRequestException.php new file mode 100644 index 0000000..0f14e22 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Exceptions/RetryableNetworkRequestException.php @@ -0,0 +1,27 @@ +body(); + + if (! $response->isEmpty()) { + $message .= sprintf(' Server response: %s', $body); + } + + return new self( + $response, + $message, + ResponseStatusCode::HTTP_SERVICE_UNAVAILABLE + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Exceptions/TooManyRequestsException.php b/vendor/mollie/mollie-api-php/src/Exceptions/TooManyRequestsException.php new file mode 100644 index 0000000..55e43d7 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Exceptions/TooManyRequestsException.php @@ -0,0 +1,21 @@ +json(); + + return new self( + $response, + 'Your request exceeded the rate limit. '. + sprintf('Error executing API call (%d: %s): %s', ResponseStatusCode::HTTP_TOO_MANY_REQUESTS, $body->title, $body->detail), + ResponseStatusCode::HTTP_TOO_MANY_REQUESTS + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Exceptions/UnauthorizedException.php b/vendor/mollie/mollie-api-php/src/Exceptions/UnauthorizedException.php new file mode 100644 index 0000000..b48cc69 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Exceptions/UnauthorizedException.php @@ -0,0 +1,21 @@ +json(); + + return new self( + $response, + 'Your request wasn\'t executed due to failed authentication. Check your API key. '. + sprintf('Error executing API call (%d: %s): %s', ResponseStatusCode::HTTP_UNAUTHORIZED, $body->title, $body->detail), + ResponseStatusCode::HTTP_UNAUTHORIZED + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Exceptions/UnrecognizedClientException.php b/vendor/mollie/mollie-api-php/src/Exceptions/UnrecognizedClientException.php new file mode 100644 index 0000000..da2a449 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Exceptions/UnrecognizedClientException.php @@ -0,0 +1,7 @@ +field = $field; + + parent::__construct($response, $message, $code, $previous); + } + + public function getField(): ?string + { + return $this->field; + } + + public static function fromResponse(Response $response): self + { + $body = $response->json(); + + return new self( + $response, + $body->field ?? '', + 'We could not process your request due to validation errors. '. + sprintf('Error executing API call (%d: %s): %s', 422, $body->title, $body->detail), + ResponseStatusCode::HTTP_UNPROCESSABLE_ENTITY + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/ApplePayPaymentSessionRequestFactory.php b/vendor/mollie/mollie-api-php/src/Factories/ApplePayPaymentSessionRequestFactory.php new file mode 100644 index 0000000..12209ec --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/ApplePayPaymentSessionRequestFactory.php @@ -0,0 +1,17 @@ +payload('domain'), + $this->payload('validationUrl'), + $this->payload('profileId'), + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/ApplicationFeeFactory.php b/vendor/mollie/mollie-api-php/src/Factories/ApplicationFeeFactory.php new file mode 100644 index 0000000..5d83c91 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/ApplicationFeeFactory.php @@ -0,0 +1,16 @@ +get('amount'))->create(), + $this->get('description'), + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/CreateClientLinkRequestFactory.php b/vendor/mollie/mollie-api-php/src/Factories/CreateClientLinkRequestFactory.php new file mode 100644 index 0000000..91fe268 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/CreateClientLinkRequestFactory.php @@ -0,0 +1,21 @@ +payload('owner')), + $this->payload('name'), + OwnerAddress::fromArray($this->payload('address')), + $this->payload('registrationNumber'), + $this->payload('vatNumber') + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/CreateConnectBalanceTransferRequestFactory.php b/vendor/mollie/mollie-api-php/src/Factories/CreateConnectBalanceTransferRequestFactory.php new file mode 100644 index 0000000..5f6d790 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/CreateConnectBalanceTransferRequestFactory.php @@ -0,0 +1,20 @@ +transformFromPayload('amount', fn ($item) => MoneyFactory::new($item)->create()), + $this->payload('description'), + $this->transformFromPayload('source', fn ($item) => TransferParty::fromArray($item)), + $this->transformFromPayload('destination', fn ($item) => TransferParty::fromArray($item)), + $this->payload('category') + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/CreateCustomerPaymentRequestFactory.php b/vendor/mollie/mollie-api-php/src/Factories/CreateCustomerPaymentRequestFactory.php new file mode 100644 index 0000000..6eb156c --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/CreateCustomerPaymentRequestFactory.php @@ -0,0 +1,56 @@ +customerId = $customerId; + } + + public function create(): CreateCustomerPaymentRequest + { + return new CreateCustomerPaymentRequest( + $this->customerId, + $this->payload('description'), + MoneyFactory::new($this->payload('amount'))->create(), + $this->payload('redirectUrl'), + $this->payload('cancelUrl'), + $this->payload('webhookUrl'), + $this + ->transformFromPayload( + 'lines', + fn ($items) => OrderLineCollectionFactory::new($items)->create() + ), + $this->transformFromPayload('billingAddress', fn ($item) => Address::fromArray($item)), + $this->transformFromPayload('shippingAddress', fn ($item) => Address::fromArray($item)), + $this->payload('locale'), + $this->payload('method'), + $this->payload('issuer'), + $this->payload('restrictPaymentMethodsToCountry'), + $this->payload('metadata'), + $this->payload('captureMode'), + $this->payload('captureDelay'), + $this->transformFromPayload( + 'applicationFee', + fn ($item) => ApplicationFeeFactory::new($item)->create() + ), + $this->transformFromPayload( + 'routing', + fn ($items) => PaymentRouteCollectionFactory::new($items)->create() + ), + $this->payload('sequenceType'), + $this->payload('mandateId'), + $this->payload('profileId'), + $this->payload('additional') ?: Utility::filterByProperties(CreateCustomerPaymentRequest::class, $this->payload()) ?: [], + $this->query('includeQrCode', false) + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/CreateCustomerRequestFactory.php b/vendor/mollie/mollie-api-php/src/Factories/CreateCustomerRequestFactory.php new file mode 100644 index 0000000..ae81a95 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/CreateCustomerRequestFactory.php @@ -0,0 +1,18 @@ +payload('name'), + $this->payload('email'), + $this->payload('locale'), + $this->payload('metadata'), + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/CreateDelayedPaymentRouteRequestFactory.php b/vendor/mollie/mollie-api-php/src/Factories/CreateDelayedPaymentRouteRequestFactory.php new file mode 100644 index 0000000..d80fefb --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/CreateDelayedPaymentRouteRequestFactory.php @@ -0,0 +1,33 @@ +paymentId = $paymentId; + } + + public function create(): CreateDelayedPaymentRouteRequest + { + if (! $this->payloadHas('amount')) { + throw new LogicException('Amount is required'); + } + + if (! $destination = $this->payload('destination')) { + throw new LogicException('Destination is required'); + } + + return new CreateDelayedPaymentRouteRequest( + $this->paymentId, + $this->transformFromPayload('amount', fn ($item) => MoneyFactory::new($item)->create()), + $destination, + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/CreateMandateRequestFactory.php b/vendor/mollie/mollie-api-php/src/Factories/CreateMandateRequestFactory.php new file mode 100644 index 0000000..b0f4e02 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/CreateMandateRequestFactory.php @@ -0,0 +1,36 @@ +customerId = $customerId; + } + + public function create(): CreateMandateRequest + { + if (! $this->payloadHas(['method', 'consumerName'])) { + throw new LogicException('Method and consumerName are required for creating a mandate'); + } + + return new CreateMandateRequest( + $this->customerId, + $this->payload('method'), + $this->payload('consumerName'), + $this->payload('consumerAccount'), + $this->payload('consumerBic'), + $this->payload('consumerEmail'), + $this->transformFromPayload('signatureDate', fn ($date) => new Date($date), Date::class), + $this->payload('mandateReference'), + $this->payload('paypalBillingAgreementId'), + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/CreatePaymentCaptureRequestFactory.php b/vendor/mollie/mollie-api-php/src/Factories/CreatePaymentCaptureRequestFactory.php new file mode 100644 index 0000000..7b35009 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/CreatePaymentCaptureRequestFactory.php @@ -0,0 +1,25 @@ +paymentId = $paymentId; + } + + public function create(): CreatePaymentCaptureRequest + { + return new CreatePaymentCaptureRequest( + $this->paymentId, + $this->payload('description'), + $this->transformFromPayload('amount', fn ($item) => MoneyFactory::new($item)->create()), + $this->payload('metadata') + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/CreatePaymentLinkRequestFactory.php b/vendor/mollie/mollie-api-php/src/Factories/CreatePaymentLinkRequestFactory.php new file mode 100644 index 0000000..c0911a8 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/CreatePaymentLinkRequestFactory.php @@ -0,0 +1,57 @@ +payload('description'), + $this->transformFromPayload('amount', fn ($amount) => MoneyFactory::new($amount)->create()), + $this->payload('redirectUrl'), + $this->payload('webhookUrl'), + $this->payload('profileId'), + $this->payload('reusable'), + $this->transformFromPayload('expiresAt', fn ($date) => $this->getExpiresAt($date), DateTime::class), + $this->payload('allowedMethods'), + $this->payload('sequenceType'), + $this->payload('customerId'), + ); + } + + /** + * This is a backwards compatibility fix. + * On launch the expiresAt field was accepting a Y-m-d date string, while it should have only accepted Y-m-d\TH:i:sP. + * We now need to support both formats. + * + * @param null|string|DateTimeInterface $date + */ + protected function getExpiresAt($date): ?DateTime + { + if (is_null($date)) { + return null; + } + + if ($date instanceof DateTimeInterface) { + return new DateTime($date); + } + + // If the date string doesn't contain time information, add it + /** @var string $date */ + if (strpos($date, 'T') === false) { + $date .= 'T00:00:00'; + } + + // If the date string doesn't contain timezone information, add UTC + if (! preg_match('/[+-][0-9]{2}:?[0-9]{2}$/', $date)) { + $date .= '+00:00'; + } + + return new DateTime($date); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/CreatePaymentRefundRequestFactory.php b/vendor/mollie/mollie-api-php/src/Factories/CreatePaymentRefundRequestFactory.php new file mode 100644 index 0000000..42072bb --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/CreatePaymentRefundRequestFactory.php @@ -0,0 +1,31 @@ +paymentId = $paymentId; + } + + public function create(): CreatePaymentRefundRequest + { + return new CreatePaymentRefundRequest( + $this->paymentId, + $this->payload('description', ''), + MoneyFactory::new($this->payload('amount'))->create(), + $this->payload('metadata'), + $this->payload('reverseRouting'), + $this + ->transformFromPayload( + 'routingReversals', + fn ($items) => RefundRouteCollectionFactory::new($items)->create() + ), + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/CreatePaymentRequestFactory.php b/vendor/mollie/mollie-api-php/src/Factories/CreatePaymentRequestFactory.php new file mode 100644 index 0000000..f227b16 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/CreatePaymentRequestFactory.php @@ -0,0 +1,49 @@ +payload('description'), + MoneyFactory::new($this->payload('amount'))->create(), + $this->payload('redirectUrl'), + $this->payload('cancelUrl'), + $this->payload('webhookUrl'), + $this + ->transformFromPayload( + 'lines', + fn ($items) => OrderLineCollectionFactory::new($items)->create() + ), + $this->transformFromPayload('billingAddress', fn ($item) => Address::fromArray($item)), + $this->transformFromPayload('shippingAddress', fn ($item) => Address::fromArray($item)), + $this->payload('locale'), + $this->payload('method'), + $this->payload('issuer'), + $this->payload('restrictPaymentMethodsToCountry'), + $this->payload('metadata'), + $this->payload('captureMode'), + $this->payload('captureDelay'), + $this->transformFromPayload( + 'applicationFee', + fn ($item) => ApplicationFeeFactory::new($item)->create() + ), + $this->transformFromPayload( + 'routing', + fn ($items) => PaymentRouteCollectionFactory::new($items)->create() + ), + $this->payload('sequenceType'), + $this->payload('mandateId'), + $this->payload('customerId'), + $this->payload('profileId'), + $this->payload('additional') ?: Utility::filterByProperties(CreatePaymentRequest::class, $this->payload()) ?: [], + $this->query('includeQrCode', false) + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/CreateProfileRequestFactory.php b/vendor/mollie/mollie-api-php/src/Factories/CreateProfileRequestFactory.php new file mode 100644 index 0000000..f04ff9a --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/CreateProfileRequestFactory.php @@ -0,0 +1,21 @@ +payload('name'), + $this->payload('website'), + $this->payload('email'), + $this->payload('phone'), + $this->payload('description'), + $this->payload('countriesOfActivity'), + $this->payload('businessCategory') + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/CreateSalesInvoiceRequestFactory.php b/vendor/mollie/mollie-api-php/src/Factories/CreateSalesInvoiceRequestFactory.php new file mode 100644 index 0000000..a65d6c7 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/CreateSalesInvoiceRequestFactory.php @@ -0,0 +1,41 @@ +payload('currency'), + $this->payload('status'), + $this->payload('vatScheme'), + $this->payload('vatMode'), + $this->payload('paymentTerm'), + $this->payload('recipientIdentifier'), + RecipientFactory::new($this->payload('recipient'))->create(), + $this + ->transformFromPayload( + 'lines', + fn ($items) => InvoiceLineCollectionFactory::new($items)->create() + ), + $this->payload('profileId'), + $this->payload('memo'), + $this->transformFromPayload('paymentDetails', fn ($data) => PaymentDetails::fromArray($data)), + $this->transformFromPayload('emailDetails', fn ($data) => EmailDetails::fromArray($data)), + $this->payload('webhookUrl'), + $this->transformFromPayload('discount', fn ($data) => Discount::fromArray($data)), + $this->payload('customerId'), + $this->payload('mandateId'), + $this->payload('isEInvoice') + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/CreateSessionRequestFactory.php b/vendor/mollie/mollie-api-php/src/Factories/CreateSessionRequestFactory.php new file mode 100644 index 0000000..e72b72c --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/CreateSessionRequestFactory.php @@ -0,0 +1,20 @@ +payload('redirectUrl'), + $this->payload('cancelUrl'), + MoneyFactory::new($this->payload('amount'))->create(), + $this->payload('description'), + $this->payload('method'), + $this->payload('checkoutFlow') + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/CreateSubscriptionRequestFactory.php b/vendor/mollie/mollie-api-php/src/Factories/CreateSubscriptionRequestFactory.php new file mode 100644 index 0000000..af9f97d --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/CreateSubscriptionRequestFactory.php @@ -0,0 +1,35 @@ +customerId = $customerId; + } + + public function create(): CreateSubscriptionRequest + { + return new CreateSubscriptionRequest( + $this->customerId, + MoneyFactory::new($this->payload('amount'))->create(), + $this->payload('interval'), + $this->payload('description'), + $this->payload('status'), + $this->payload('times'), + $this->transformFromPayload('startDate', fn (string $date) => new Date($date), Date::class), + $this->payload('method'), + $this->transformFromPayload('applicationFee', fn ($fee) => ApplicationFeeFactory::new($fee)->create()), + $this->payload('metadata'), + $this->payload('webhookUrl'), + $this->payload('mandateId'), + $this->payload('profileId'), + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/CreateWebhookRequestFactory.php b/vendor/mollie/mollie-api-php/src/Factories/CreateWebhookRequestFactory.php new file mode 100644 index 0000000..09ffd4e --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/CreateWebhookRequestFactory.php @@ -0,0 +1,17 @@ +payload('url'), + $this->payload('name'), + $this->payload('eventTypes') + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/Factory.php b/vendor/mollie/mollie-api-php/src/Factories/Factory.php new file mode 100644 index 0000000..66aa9bb --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/Factory.php @@ -0,0 +1,85 @@ +data = $data->toArray(); + } else { + $this->data = $data ?: []; + } + } + + /** + * @return static + */ + public static function new(...$args) + { + return new static(...$args); + } + + /** + * Get a value from the data array or the backup key. + * + * @param string|array $key + * @param mixed $default + */ + protected function get($key = null, $default = null, $data = null, $backupKey = 'filters.') + { + $data = $data ?? $this->data; + + $keys = (array) $key; + + if (empty($keys)) { + return $data; + } + + if ($backupKey !== null) { + $keys[] = $backupKey.$key; + } + + foreach ($keys as $key) { + if ($value = Arr::get($data, $key, $default)) { + return $value; + } + } + + return $default; + } + + protected function has($keys, $data = null): bool + { + return Arr::has($data ?? $this->data, $keys); + } + + /** + * @param string|array $key + * @param mixed $value + */ + protected function includes($key, $value, $data = null, $backupKey = 'filters.'): bool + { + return Arr::includes($data ?? $this->data, [$backupKey.$key, $key], $value); + } + + /** + * Map a value to a new form if it is not null. + * + * @param string|array $key The key to retrieve the value from the data array. + * @param callable|string $resolver A callable function to transform the value, or the name of a class to instantiate. + * @param string $composableClass The class to instantiate if the resolver is a string. + * @return mixed The transformed value, a new class instance, or null if the value is null. + */ + protected function transformIfNotNull($key, $resolver, $composableClass = null) + { + return Utility::transform($this->get($key), $resolver, $composableClass); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/GetAllPaginatedSubscriptionsRequestFactory.php b/vendor/mollie/mollie-api-php/src/Factories/GetAllPaginatedSubscriptionsRequestFactory.php new file mode 100644 index 0000000..8045f29 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/GetAllPaginatedSubscriptionsRequestFactory.php @@ -0,0 +1,17 @@ +query('limit'), + $this->query('from'), + $this->query('profileId') + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/GetAllPaymentMethodsRequestFactory.php b/vendor/mollie/mollie-api-php/src/Factories/GetAllPaymentMethodsRequestFactory.php new file mode 100644 index 0000000..e6e5bda --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/GetAllPaymentMethodsRequestFactory.php @@ -0,0 +1,23 @@ +queryIncludes('include', MethodQuery::INCLUDE_ISSUERS); + $includePricing = $this->queryIncludes('include', MethodQuery::INCLUDE_PRICING); + + return new GetAllMethodsRequest( + $this->query('includeIssuers', $includeIssuers), + $this->query('includePricing', $includePricing), + $this->query('locale'), + $this->transformFromQuery('amount', fn ($item) => MoneyFactory::new($item)->create()), + $this->query('profileId') + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/GetBalanceReportRequestFactory.php b/vendor/mollie/mollie-api-php/src/Factories/GetBalanceReportRequestFactory.php new file mode 100644 index 0000000..61b3cea --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/GetBalanceReportRequestFactory.php @@ -0,0 +1,36 @@ +balanceId = $balanceId; + } + + public function create(): GetBalanceReportRequest + { + if (! $this->queryHas(['from', 'until'])) { + throw new \LogicException('The "from" and "until" fields are required.'); + } + + /** @var DateTimeImmutable $from */ + $from = DateTimeImmutable::createFromFormat('Y-m-d', $this->query('from')); + + /** @var DateTimeImmutable $until */ + $until = DateTimeImmutable::createFromFormat('Y-m-d', $this->query('until')); + + return new GetBalanceReportRequest( + $this->balanceId, + $from, + $until, + $this->query('grouping'), + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/GetClientRequestFactory.php b/vendor/mollie/mollie-api-php/src/Factories/GetClientRequestFactory.php new file mode 100644 index 0000000..3df9454 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/GetClientRequestFactory.php @@ -0,0 +1,28 @@ +id = $id; + } + + public function create(): GetClientRequest + { + $embedOrganization = $this->queryIncludes('embed', ClientQuery::EMBED_ORGANIZATION); + $embedOnboarding = $this->queryIncludes('embed', ClientQuery::EMBED_ONBOARDING); + + return new GetClientRequest( + $this->id, + $this->query('embedOrganization', $embedOrganization), + $this->query('embedOnboarding', $embedOnboarding), + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/GetEnabledMethodsRequestFactory.php b/vendor/mollie/mollie-api-php/src/Factories/GetEnabledMethodsRequestFactory.php new file mode 100644 index 0000000..7c144ac --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/GetEnabledMethodsRequestFactory.php @@ -0,0 +1,27 @@ +queryIncludes('include', MethodQuery::INCLUDE_ISSUERS); + + return new GetEnabledMethodsRequest( + $this->query('sequenceType', SequenceType::ONEOFF), + $this->query('resource', MethodQuery::RESOURCE_PAYMENTS), + $this->query('locale'), + $this->transformFromQuery('amount', fn ($item) => MoneyFactory::new($item)->create()), + $this->query('billingCountry'), + $this->query('includeWallets'), + $this->query('orderLineCategories', []), + $this->query('profileId'), + $this->query('includeIssuers', $includeIssuers), + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/GetMethodRequestFactory.php b/vendor/mollie/mollie-api-php/src/Factories/GetMethodRequestFactory.php new file mode 100644 index 0000000..fe38e2f --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/GetMethodRequestFactory.php @@ -0,0 +1,29 @@ +id = $id; + } + + public function create(): GetMethodRequest + { + $includeIssuers = $this->queryIncludes('include', MethodQuery::INCLUDE_ISSUERS); + + return new GetMethodRequest( + $this->id, + $this->query('locale'), + $this->query('currency'), + $this->query('profileId'), + $this->query('includeIssuers', $includeIssuers), + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/GetPaginatedChargebacksRequestFactory.php b/vendor/mollie/mollie-api-php/src/Factories/GetPaginatedChargebacksRequestFactory.php new file mode 100644 index 0000000..7b499c6 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/GetPaginatedChargebacksRequestFactory.php @@ -0,0 +1,21 @@ +queryIncludes('include', PaymentIncludesQuery::PAYMENT); + + return new GetPaginatedChargebacksRequest( + $this->query('from'), + $this->query('limit'), + $this->query('includePayment', $includePayment), + $this->query('profileId') + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/GetPaginatedClientRequestFactory.php b/vendor/mollie/mollie-api-php/src/Factories/GetPaginatedClientRequestFactory.php new file mode 100644 index 0000000..110455d --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/GetPaginatedClientRequestFactory.php @@ -0,0 +1,22 @@ +queryIncludes('embed', ClientQuery::EMBED_ORGANIZATION); + $embedOnboarding = $this->queryIncludes('embed', ClientQuery::EMBED_ONBOARDING); + + return new GetPaginatedClientRequest( + $this->query('from'), + $this->query('limit'), + $this->query('embedOrganization', $embedOrganization), + $this->query('embedOnboarding', $embedOnboarding), + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/GetPaginatedCustomerPaymentsRequestFactory.php b/vendor/mollie/mollie-api-php/src/Factories/GetPaginatedCustomerPaymentsRequestFactory.php new file mode 100644 index 0000000..679c4f3 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/GetPaginatedCustomerPaymentsRequestFactory.php @@ -0,0 +1,26 @@ +customerId = $customerId; + } + + public function create(): GetPaginatedCustomerPaymentsRequest + { + return new GetPaginatedCustomerPaymentsRequest( + $this->customerId, + $this->query('from'), + $this->query('limit'), + $this->query('sort'), + $this->query('profileId') + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/GetPaginatedInvoiceRequestFactory.php b/vendor/mollie/mollie-api-php/src/Factories/GetPaginatedInvoiceRequestFactory.php new file mode 100644 index 0000000..c936b69 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/GetPaginatedInvoiceRequestFactory.php @@ -0,0 +1,18 @@ +query('from'), + $this->query('limit'), + $this->query('reference'), + $this->query('year') + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/GetPaginatedPaymentCapturesRequestFactory.php b/vendor/mollie/mollie-api-php/src/Factories/GetPaginatedPaymentCapturesRequestFactory.php new file mode 100644 index 0000000..bd420ce --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/GetPaginatedPaymentCapturesRequestFactory.php @@ -0,0 +1,28 @@ +paymentId = $paymentId; + } + + public function create(): GetPaginatedPaymentCapturesRequest + { + $includePayments = $this->queryIncludes('include', PaymentIncludesQuery::PAYMENT); + + return new GetPaginatedPaymentCapturesRequest( + $this->paymentId, + $this->query('from'), + $this->query('limit'), + $this->query('includePayments', $includePayments) + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/GetPaginatedPaymentChargebacksRequestFactory.php b/vendor/mollie/mollie-api-php/src/Factories/GetPaginatedPaymentChargebacksRequestFactory.php new file mode 100644 index 0000000..fef969e --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/GetPaginatedPaymentChargebacksRequestFactory.php @@ -0,0 +1,28 @@ +paymentId = $paymentId; + } + + public function create(): GetPaginatedPaymentChargebacksRequest + { + $includePayment = $this->queryIncludes('include', PaymentIncludesQuery::PAYMENT); + + return new GetPaginatedPaymentChargebacksRequest( + $this->paymentId, + $this->query('from'), + $this->query('limit'), + $this->query('includePayment', $includePayment), + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/GetPaginatedPaymentRefundsRequestFactory.php b/vendor/mollie/mollie-api-php/src/Factories/GetPaginatedPaymentRefundsRequestFactory.php new file mode 100644 index 0000000..a589f4c --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/GetPaginatedPaymentRefundsRequestFactory.php @@ -0,0 +1,28 @@ +paymentId = $paymentId; + } + + public function create(): GetPaginatedPaymentRefundsRequest + { + $includePayment = $this->queryIncludes('include', PaymentIncludesQuery::PAYMENT); + + return new GetPaginatedPaymentRefundsRequest( + $this->paymentId, + $this->query('from'), + $this->query('limit'), + $this->query('includePayment', $includePayment), + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/GetPaginatedRefundsRequestFactory.php b/vendor/mollie/mollie-api-php/src/Factories/GetPaginatedRefundsRequestFactory.php new file mode 100644 index 0000000..2d07abe --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/GetPaginatedRefundsRequestFactory.php @@ -0,0 +1,21 @@ +queryIncludes('embed', PaymentIncludesQuery::PAYMENT); + + return new GetPaginatedRefundsRequest( + $this->query('from'), + $this->query('limit'), + $this->query('embedPayment', $embedPayment), + $this->query('profileId') + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/GetPaginatedSettlementCapturesRequestFactory.php b/vendor/mollie/mollie-api-php/src/Factories/GetPaginatedSettlementCapturesRequestFactory.php new file mode 100644 index 0000000..a2cccfb --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/GetPaginatedSettlementCapturesRequestFactory.php @@ -0,0 +1,29 @@ +settlementId = $settlementId; + } + + public function create(): GetPaginatedSettlementCapturesRequest + { + $includePayment = $this->queryIncludes('include', PaymentIncludesQuery::PAYMENT) + || $this->queryIncludes('embed', PaymentIncludesQuery::PAYMENT); + + return new GetPaginatedSettlementCapturesRequest( + $this->settlementId, + $this->query('from'), + $this->query('limit'), + $this->query('includePayment', $includePayment) + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/GetPaginatedSettlementChargebacksRequestFactory.php b/vendor/mollie/mollie-api-php/src/Factories/GetPaginatedSettlementChargebacksRequestFactory.php new file mode 100644 index 0000000..df05a4b --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/GetPaginatedSettlementChargebacksRequestFactory.php @@ -0,0 +1,29 @@ +settlementId = $settlementId; + } + + public function create(): GetPaginatedSettlementChargebacksRequest + { + $includePayment = $this->queryIncludes('include', PaymentIncludesQuery::PAYMENT); + + return new GetPaginatedSettlementChargebacksRequest( + $this->settlementId, + $this->query('from'), + $this->query('limit'), + $this->query('includePayment', $includePayment), + $this->query('profileId') + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/GetPaginatedSettlementRefundsQueryFactory.php b/vendor/mollie/mollie-api-php/src/Factories/GetPaginatedSettlementRefundsQueryFactory.php new file mode 100644 index 0000000..6bf1875 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/GetPaginatedSettlementRefundsQueryFactory.php @@ -0,0 +1,29 @@ +settlementId = $settlementId; + } + + public function create(): GetPaginatedSettlementRefundsRequest + { + $includePayment = $this->queryIncludes('include', PaymentIncludesQuery::PAYMENT) + || $this->queryIncludes('embed', PaymentIncludesQuery::PAYMENT); + + return new GetPaginatedSettlementRefundsRequest( + $this->settlementId, + $this->query('from'), + $this->query('limit'), + $this->query('includePayment', $includePayment) + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/GetPaginatedSettlementsRequestFactory.php b/vendor/mollie/mollie-api-php/src/Factories/GetPaginatedSettlementsRequestFactory.php new file mode 100644 index 0000000..4c18bc0 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/GetPaginatedSettlementsRequestFactory.php @@ -0,0 +1,17 @@ +query('from'), + $this->query('limit'), + $this->query('balanceId'), + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/GetPaymentCaptureRequestFactory.php b/vendor/mollie/mollie-api-php/src/Factories/GetPaymentCaptureRequestFactory.php new file mode 100644 index 0000000..c5ce9b2 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/GetPaymentCaptureRequestFactory.php @@ -0,0 +1,30 @@ +paymentId = $paymentId; + $this->captureId = $captureId; + } + + public function create(): GetPaymentCaptureRequest + { + $includePayment = $this->queryIncludes('include', PaymentIncludesQuery::PAYMENT); + + return new GetPaymentCaptureRequest( + $this->paymentId, + $this->captureId, + $this->query('includePayment', $includePayment), + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/GetPaymentChargebackRequestFactory.php b/vendor/mollie/mollie-api-php/src/Factories/GetPaymentChargebackRequestFactory.php new file mode 100644 index 0000000..a6d8a90 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/GetPaymentChargebackRequestFactory.php @@ -0,0 +1,30 @@ +paymentId = $paymentId; + $this->chargebackId = $chargebackId; + } + + public function create(): GetPaymentChargebackRequest + { + $includePayment = $this->queryIncludes('include', PaymentIncludesQuery::PAYMENT); + + return new GetPaymentChargebackRequest( + $this->paymentId, + $this->chargebackId, + $this->query('includePayment', $includePayment), + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/GetPaymentRefundRequestFactory.php b/vendor/mollie/mollie-api-php/src/Factories/GetPaymentRefundRequestFactory.php new file mode 100644 index 0000000..823cdb7 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/GetPaymentRefundRequestFactory.php @@ -0,0 +1,30 @@ +paymentId = $paymentId; + $this->refundId = $refundId; + } + + public function create(): GetPaymentRefundRequest + { + $includePayment = $this->queryIncludes('include', PaymentIncludesQuery::PAYMENT); + + return new GetPaymentRefundRequest( + $this->paymentId, + $this->refundId, + $this->query('includePayment', $includePayment), + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/GetPaymentRequestFactory.php b/vendor/mollie/mollie-api-php/src/Factories/GetPaymentRequestFactory.php new file mode 100644 index 0000000..26a0075 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/GetPaymentRequestFactory.php @@ -0,0 +1,34 @@ +id = $id; + } + + public function create(): GetPaymentRequest + { + $embedCaptures = $this->queryIncludes('embed', PaymentQuery::EMBED_CAPTURES); + $embedRefunds = $this->queryIncludes('embed', PaymentQuery::EMBED_REFUNDS); + $embedChargebacks = $this->queryIncludes('embed', PaymentQuery::EMBED_CHARGEBACKS); + $includeQrCode = $this->queryIncludes('include', PaymentQuery::INCLUDE_QR_CODE); + $includeRemainderDetails = $this->queryIncludes('include', PaymentQuery::INCLUDE_REMAINDER_DETAILS); + + return new GetPaymentRequest( + $this->id, + $this->query('embedCaptures', $embedCaptures), + $this->query('embedRefunds', $embedRefunds), + $this->query('embedChargebacks', $embedChargebacks), + $this->query('includeQrCode', $includeQrCode), + $this->query('includeRemainderDetails', $includeRemainderDetails), + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/InvoiceLineCollectionFactory.php b/vendor/mollie/mollie-api-php/src/Factories/InvoiceLineCollectionFactory.php new file mode 100644 index 0000000..0d470b3 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/InvoiceLineCollectionFactory.php @@ -0,0 +1,16 @@ + InvoiceLineFactory::new($item)->create(), + $this->get() + )); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/InvoiceLineFactory.php b/vendor/mollie/mollie-api-php/src/Factories/InvoiceLineFactory.php new file mode 100644 index 0000000..ce64112 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/InvoiceLineFactory.php @@ -0,0 +1,20 @@ +get('description'), + $this->get('quantity'), + $this->get('vatRate'), + MoneyFactory::new($this->get('unitPrice'))->create(), + $this->transformIfNotNull('discount', fn (array $data) => Discount::fromArray($data)) + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/MoneyFactory.php b/vendor/mollie/mollie-api-php/src/Factories/MoneyFactory.php new file mode 100644 index 0000000..7386921 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/MoneyFactory.php @@ -0,0 +1,20 @@ +has(['currency', 'value'])) { + throw new \InvalidArgumentException('Invalid Money data provided'); + } + + return new Money( + $this->get('currency'), + $this->get('value') + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/OrderLineCollectionFactory.php b/vendor/mollie/mollie-api-php/src/Factories/OrderLineCollectionFactory.php new file mode 100644 index 0000000..572c148 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/OrderLineCollectionFactory.php @@ -0,0 +1,16 @@ + OrderLineFactory::new($item)->create(), + $this->get() + )); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/OrderLineFactory.php b/vendor/mollie/mollie-api-php/src/Factories/OrderLineFactory.php new file mode 100644 index 0000000..457065a --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/OrderLineFactory.php @@ -0,0 +1,27 @@ +get('description'), + $this->get('quantity'), + MoneyFactory::new($this->get('unitPrice'))->create(), + MoneyFactory::new($this->get('totalAmount'))->create(), + $this->get('type'), + $this->get('quantityUnit'), + $this->transformIfNotNull('discountAmount', fn (array $item) => MoneyFactory::new($item)->create()), + $this->transformIfNotNull('recurring', fn (array $item) => RecurringBillingCycleFactory::new($item)->create()), + $this->get('vatRate'), + $this->transformIfNotNull('vatAmount', fn (array $item) => MoneyFactory::new($item)->create()), + $this->get('sku'), + $this->get('imageUrl'), + $this->get('productUrl'), + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/PaginatedQueryFactory.php b/vendor/mollie/mollie-api-php/src/Factories/PaginatedQueryFactory.php new file mode 100644 index 0000000..93b91b3 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/PaginatedQueryFactory.php @@ -0,0 +1,16 @@ +query('from'), + $this->query('limit'), + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/PaymentRouteCollectionFactory.php b/vendor/mollie/mollie-api-php/src/Factories/PaymentRouteCollectionFactory.php new file mode 100644 index 0000000..98eee8f --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/PaymentRouteCollectionFactory.php @@ -0,0 +1,38 @@ +has(['amount', 'destination.organizationId'], $item)) { + throw new LogicException('Invalid PaymentRoute data provided'); + } + + return new PaymentRoute( + MoneyFactory::new(Arr::get($item, 'amount'))->create(), + Arr::get($item, 'destination.organizationId'), + Utility::transform( + Arr::get($item, 'delayUntil'), + fn ($value) => new Date($value), + Date::class + ) + ); + }, $this->get()); + + return new DataCollection($paymentRoutes); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/RecipientFactory.php b/vendor/mollie/mollie-api-php/src/Factories/RecipientFactory.php new file mode 100644 index 0000000..34a8d0c --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/RecipientFactory.php @@ -0,0 +1,30 @@ +get('type'), + $this->get('email'), + $this->get('streetAndNumber'), + $this->get('postalCode'), + $this->get('city'), + $this->get('country'), + $this->get('locale'), + $this->get('title'), + $this->get('givenName'), + $this->get('familyName'), + $this->get('organizationName'), + $this->get('organizationNumber'), + $this->get('vatNumber'), + $this->get('phone'), + $this->get('streetAdditional'), + $this->get('region'), + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/RecurringBillingCycleFactory.php b/vendor/mollie/mollie-api-php/src/Factories/RecurringBillingCycleFactory.php new file mode 100644 index 0000000..290df49 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/RecurringBillingCycleFactory.php @@ -0,0 +1,20 @@ +get('interval'), + $this->get('descriptipn'), + $this->transformIfNotNull('amount', fn (array $item) => MoneyFactory::new($item)->create()), + $this->get('times'), + $this->transformIfNotNull('startDate', fn (string $item) => DateTimeImmutable::createFromFormat('Y-m-d', $item)), + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/RefundRouteCollectionFactory.php b/vendor/mollie/mollie-api-php/src/Factories/RefundRouteCollectionFactory.php new file mode 100644 index 0000000..0eb1529 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/RefundRouteCollectionFactory.php @@ -0,0 +1,31 @@ +has(['amount', 'source.organizationId'], $item)) { + throw new LogicException('Invalid RefundRoute data provided'); + } + + return new RefundRoute( + MoneyFactory::new(Arr::get($item, 'amount'))->create(), + Arr::get($item, 'source.organizationId') + ); + }, $this->get()); + + return new DataCollection($refundRoutes); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/RequestFactory.php b/vendor/mollie/mollie-api-php/src/Factories/RequestFactory.php new file mode 100644 index 0000000..34dfc4f --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/RequestFactory.php @@ -0,0 +1,83 @@ +payload = $payload; + + return $this; + } + + /** + * @return static + */ + public function withQuery(array $query) + { + $this->query = $query; + + return $this; + } + + protected function payload(?string $key = null, $default = null) + { + return $this->get($key, $default, $this->payload); + } + + protected function query(?string $key = null, $default = null) + { + return $this->get($key, $default, $this->query); + } + + protected function payloadIncludes(string $key, $value) + { + return $this->includes($key, $value, $this->payload); + } + + protected function queryIncludes(string $key, $value) + { + return $this->includes($key, $value, $this->query); + } + + protected function payloadHas($key): bool + { + return $this->has($key, $this->payload); + } + + /** + * @param string|array $key + */ + protected function queryHas($key): bool + { + return $this->has($key, $this->query); + } + + protected function transformFromPayload($key, $resolver, $composableClass = null) + { + return $this->transformFromResolved($this->payload($key), $resolver, $composableClass); + } + + protected function transformFromQuery($key, $resolver, $composableClass = null) + { + return $this->transformFromResolved($this->query($key), $resolver, $composableClass); + } + + /** + * Map a value to a new form if it is not null. + */ + protected function transformFromResolved($resolvedValue, $composable, $resolver = null) + { + return Utility::transform($resolvedValue, $composable, $resolver); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/SortablePaginatedQueryFactory.php b/vendor/mollie/mollie-api-php/src/Factories/SortablePaginatedQueryFactory.php new file mode 100644 index 0000000..5eba1a3 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/SortablePaginatedQueryFactory.php @@ -0,0 +1,17 @@ +query('from'), + $this->query('limit'), + $this->query('sort'), + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/UpdateCustomerRequestFactory.php b/vendor/mollie/mollie-api-php/src/Factories/UpdateCustomerRequestFactory.php new file mode 100644 index 0000000..e7e482c --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/UpdateCustomerRequestFactory.php @@ -0,0 +1,26 @@ +id = $id; + } + + public function create(): UpdateCustomerRequest + { + return new UpdateCustomerRequest( + $this->id, + $this->payload('name'), + $this->payload('email'), + $this->payload('locale'), + $this->payload('metadata'), + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/UpdatePaymentLinkRequestFactory.php b/vendor/mollie/mollie-api-php/src/Factories/UpdatePaymentLinkRequestFactory.php new file mode 100644 index 0000000..5de69fc --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/UpdatePaymentLinkRequestFactory.php @@ -0,0 +1,25 @@ +paymentLinkId = $paymentLinkId; + } + + public function create(): UpdatePaymentLinkRequest + { + return new UpdatePaymentLinkRequest( + $this->paymentLinkId, + $this->payload('description'), + $this->payload('archived', false), + $this->payload('allowedMethods'), + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/UpdatePaymentRequestFactory.php b/vendor/mollie/mollie-api-php/src/Factories/UpdatePaymentRequestFactory.php new file mode 100644 index 0000000..c8bea1a --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/UpdatePaymentRequestFactory.php @@ -0,0 +1,32 @@ +id = $id; + } + + public function create(): UpdatePaymentRequest + { + return new UpdatePaymentRequest( + $this->id, + $this->payload('description'), + $this->payload('redirectUrl'), + $this->payload('cancelUrl'), + $this->payload('webhookUrl'), + $this->payload('metadata'), + $this->payload('method'), + $this->payload('locale'), + $this->payload('restrictPaymentMethodsToCountry'), + $this->payload('additional') ?? Utility::filterByProperties(UpdatePaymentRequest::class, $this->payload()), + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/UpdatePaymentRouteRequestFactory.php b/vendor/mollie/mollie-api-php/src/Factories/UpdatePaymentRouteRequestFactory.php new file mode 100644 index 0000000..da13a53 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/UpdatePaymentRouteRequestFactory.php @@ -0,0 +1,33 @@ +paymentId = $paymentId; + $this->routeId = $routeId; + } + + public function create(): UpdatePaymentRouteRequest + { + if (! $this->payloadHas('releaseDate')) { + throw new LogicException('Release date is required'); + } + + return new UpdatePaymentRouteRequest( + $this->paymentId, + $this->routeId, + $this->transformFromPayload('releaseDate', fn ($date) => new Date($date), Date::class), + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/UpdateProfileRequestFactory.php b/vendor/mollie/mollie-api-php/src/Factories/UpdateProfileRequestFactory.php new file mode 100644 index 0000000..cffe455 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/UpdateProfileRequestFactory.php @@ -0,0 +1,30 @@ +id = $id; + } + + public function create(): UpdateProfileRequest + { + return new UpdateProfileRequest( + $this->id, + $this->payload('name'), + $this->payload('website'), + $this->payload('email'), + $this->payload('phone'), + $this->payload('description'), + $this->payload('countriesOfActivity'), + $this->payload('businessCategory'), + $this->payload('mode') + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/UpdateSalesInvoiceRequestFactory.php b/vendor/mollie/mollie-api-php/src/Factories/UpdateSalesInvoiceRequestFactory.php new file mode 100644 index 0000000..30fc931 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/UpdateSalesInvoiceRequestFactory.php @@ -0,0 +1,40 @@ +id = $id; + } + + public function create(): UpdateSalesInvoiceRequest + { + return new UpdateSalesInvoiceRequest( + $this->id, + $this->payload('status'), + $this->payload('recipientIdentifier'), + $this->payload('memo'), + $this->payload('paymentTerm'), + $this->transformFromPayload('paymentDetails', fn ($data) => PaymentDetails::fromArray($data)), + $this->transformFromPayload('emailDetails', fn ($data) => EmailDetails::fromArray($data)), + $this->transformFromPayload('recipient', fn ($data) => RecipientFactory::new($data)->create()), + $this + ->transformFromPayload( + 'lines', + fn (array $items) => InvoiceLineCollectionFactory::new($items)->create() + ), + $this->payload('webhookUrl'), + $this->transformFromPayload('discount', fn ($data) => Discount::fromArray($data)), + $this->payload('isEInvoice') + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/UpdateSubscriptionRequestFactory.php b/vendor/mollie/mollie-api-php/src/Factories/UpdateSubscriptionRequestFactory.php new file mode 100644 index 0000000..0cf3efd --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/UpdateSubscriptionRequestFactory.php @@ -0,0 +1,35 @@ +customerId = $customerId; + $this->subscriptionId = $subscriptionId; + } + + public function create(): UpdateSubscriptionRequest + { + return new UpdateSubscriptionRequest( + $this->customerId, + $this->subscriptionId, + $this->transformFromPayload('amount', fn ($amount) => MoneyFactory::new($amount)->create()), + $this->payload('description'), + $this->payload('interval'), + $this->transformFromPayload('startDate', fn (string $date) => new Date($date), Date::class), + $this->payload('times'), + $this->payload('metadata'), + $this->payload('webhookUrl'), + $this->payload('mandateId') + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Factories/UpdateWebhookRequestFactory.php b/vendor/mollie/mollie-api-php/src/Factories/UpdateWebhookRequestFactory.php new file mode 100644 index 0000000..c7f6d9f --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Factories/UpdateWebhookRequestFactory.php @@ -0,0 +1,25 @@ +id = $id; + } + + public function create(): UpdateWebhookRequest + { + return new UpdateWebhookRequest( + $this->id, + $this->payload('url'), + $this->payload('name'), + $this->payload('eventTypes') + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/ErrorResponseBuilder.php b/vendor/mollie/mollie-api-php/src/Fake/ErrorResponseBuilder.php new file mode 100644 index 0000000..b40a80c --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/ErrorResponseBuilder.php @@ -0,0 +1,51 @@ +status = $status; + $this->title = $title; + $this->detail = addslashes($detail); + $this->field = $field; + } + + public function create(): MockResponse + { + $contents = FakeResponseLoader::load('error'); + + $contents = str_replace([ + '{{ CODE }}', + '{{ TITLE }}', + '{{ DETAIL }}', + '{{ FIELD }}', + ], [ + (string) $this->status, + $this->title, + $this->detail, + $this->field, + ], $contents); + + $contents = json_decode($contents, true); + + if (empty($this->field)) { + unset($contents['field']); + } + + return new MockResponse($contents, $this->status); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Events/blueprint.json b/vendor/mollie/mollie-api-php/src/Fake/Events/blueprint.json new file mode 100644 index 0000000..89811a7 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Events/blueprint.json @@ -0,0 +1,17 @@ +{ + "resource": "event", + "id": "event_GvJ8WHrp5isUdRub9CJyH", + "type": "{{ TYPE }}", + "entityId": "{{ RESOURCE_ID }}", + "createdAt": "2024-12-16T15:59:04.0Z", + "_links": { + "self": { + "href": "https://api.mollie.com/v2/events/event_GvJ8WHrp5isUdRub9CJyH", + "type": "application/hal+json" + }, + "documentation": { + "href": "https://docs.mollie.com/guides/webhooks", + "type": "text/html" + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/FakeResponseLoader.php b/vendor/mollie/mollie-api-php/src/Fake/FakeResponseLoader.php new file mode 100644 index 0000000..e833bd5 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/FakeResponseLoader.php @@ -0,0 +1,35 @@ +collectionClass = $collectionClass; + } + + public function add(array $item): self + { + $this->items[] = $item; + + return $this; + } + + public function addMany(array $items): self + { + foreach ($items as $item) { + $this->add($item); + } + + return $this; + } + + public function create(): MockResponse + { + $contents = FakeResponseLoader::load('empty-list'); + + $collectionKey = $this->collectionClass::getCollectionResourceName(); + $contents = str_replace('{{ RESOURCE_ID }}', $collectionKey, $contents); + + $data = json_decode($contents, true); + + $data['count'] = count($this->items); + $data['_embedded'][$collectionKey] = $this->items; + + return new MockResponse($data); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/MockEvent.php b/vendor/mollie/mollie-api-php/src/Fake/MockEvent.php new file mode 100644 index 0000000..494f705 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/MockEvent.php @@ -0,0 +1,84 @@ +eventClass = $eventClass; + $this->entityId = $entityId; + } + + public static function for(string $eventClass, string $entityId = ''): self + { + return new self($eventClass, $entityId); + } + + public function entityId(string $entityId): self + { + $this->entityId = $entityId; + + return $this; + } + + public function snapshot(): self + { + $this->isSnapshot = true; + + return $this; + } + + public function simple(): self + { + $this->isSnapshot = false; + + return $this; + } + + public function create(): array + { + $eventBlueprintData = $this->loadEventBlueprintData(); + + if (! $this->isSnapshot) { + return $eventBlueprintData; + } + + $resourceKey = Str::before($this->eventClass::type(), '.'); + + $resourceData = MockResponse::ok($resourceKey, $this->entityId) + ->json(); + + $eventBlueprintData['_embedded']['entity'] = $resourceData; + + return $eventBlueprintData; + } + + private function loadEventBlueprintData(): array + { + $eventBlueprint = FakeResponseLoader::loadEventBlueprint(); + + $eventBlueprint = str_replace('{{ TYPE }}', $this->eventClass::type(), $eventBlueprint); + + if (! empty($this->entityId)) { + $eventBlueprint = str_replace('{{ RESOURCE_ID }}', $this->entityId, $eventBlueprint); + } + + return json_decode($eventBlueprint, true); + } + +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/MockMollieClient.php b/vendor/mollie/mollie-api-php/src/Fake/MockMollieClient.php new file mode 100644 index 0000000..35934c1 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/MockMollieClient.php @@ -0,0 +1,33 @@ +httpClient = new MockMollieHttpAdapter($expectedResponses, $retainRequests); + + $this->setAccessToken('access_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'); + } + + /** + * @param string|callable $callback + */ + public function assertSent($callback): void + { + $this->httpClient->assertSent($callback); + } + + public function assertSentCount(int $count): void + { + $this->httpClient->assertSentCount($count); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/MockMollieHttpAdapter.php b/vendor/mollie/mollie-api-php/src/Fake/MockMollieHttpAdapter.php new file mode 100644 index 0000000..c1bb9cb --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/MockMollieHttpAdapter.php @@ -0,0 +1,149 @@ + + */ + private array $expected; + + private bool $retainRequests; + + private array $recorded = []; + + public function __construct(array $expectedResponses = [], bool $retainRequests = false) + { + $this->expected = $expectedResponses; + $this->retainRequests = $retainRequests; + } + + /** + * {@inheritDoc} + */ + public function sendRequest(PendingRequest $pendingRequest): Response + { + $requestClass = get_class($pendingRequest->getRequest()); + + $this->guardAgainstStrayRequests($requestClass); + + try { + $mockedResponse = $this->getResponse($requestClass, $pendingRequest); + } catch (NetworkExceptionInterface $e) { + throw new RetryableNetworkRequestException($pendingRequest, $e->getMessage()); + } catch (RequestExceptionInterface $e) { + throw new RetryableNetworkRequestException($pendingRequest, $e->getMessage()); + } + + $response = new Response( + $mockedResponse->createPsrResponse(), + $pendingRequest->createPsrRequest(), + $pendingRequest, + ); + + $this->recorded[] = [$pendingRequest, $response]; + + return $response; + } + + private function guardAgainstStrayRequests(string $requestClass): void + { + if (! Arr::has($this->expected, $requestClass)) { + throw new \RuntimeException('The request class '.$requestClass.' is not expected.'); + } + } + + /** + * Get the mocked response and remove it from the expected responses. + */ + private function getResponse(string $requestClass, PendingRequest $pendingRequest): MockResponse + { + $mockedResponse = Arr::get($this->expected, $requestClass); + + if ($mockedResponse instanceof Closure) { + $this->forgetRequest($requestClass); + + return $mockedResponse($pendingRequest); + } + + if (! ($mockedResponse instanceof SequenceMockResponse)) { + $this->forgetRequest($requestClass); + + return $mockedResponse; + } + + $response = $mockedResponse->shift(); + + if ($mockedResponse->isEmpty()) { + $this->forgetRequest($requestClass); + } + + if ($response instanceof Closure) { + $response = $response($pendingRequest); + } + + return $response; + } + + public function recorded(?callable $callback = null): array + { + if ($callback === null) { + return $this->recorded; + } + + return array_filter($this->recorded, fn ($recorded) => call_user_func_array($callback, $recorded)); + } + + private function forgetRequest(string $requestClass): void + { + if (! $this->retainRequests) { + Arr::forget($this->expected, $requestClass); + } + } + + /** + * @param string|callable $callback + */ + public function assertSent($callback): void + { + if (is_string($callback)) { + $callback = fn (PendingRequest $request) => get_class($request->getRequest()) === $callback; + } + + PHPUnit::assertTrue( + count($this->recorded($callback)) > 0, + 'No requests were sent.' + ); + } + + public function assertSentCount(int $count): void + { + PHPUnit::assertEquals( + $count, + count($this->recorded), + 'The expected number of requests was not sent.' + ); + } + + /** + * {@inheritDoc} + */ + public function version(): string + { + return 'mock-client/2.0'; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/MockResponse.php b/vendor/mollie/mollie-api-php/src/Fake/MockResponse.php new file mode 100644 index 0000000..06a2471 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/MockResponse.php @@ -0,0 +1,153 @@ +body = $this->convertToJson($body); + $this->status = $status; + $this->resourceKey = $resourceKey; + } + + /** + * @param string|array|callable $body + */ + private function convertToJson($body): string + { + if (is_array($body) && empty($body)) { + return '{}'; + } + + return is_array($body) + ? json_encode($body) + : $body; + } + + /** + * @param string|array $body + */ + public static function ok($body = [], string $resourceKey = ''): self + { + return new self($body, 200, $resourceKey); + } + + /** + * @param string|array $body + */ + public static function created($body = [], string $resourceKey = ''): self + { + return new self($body, 201, $resourceKey); + } + + public static function noContent(string $resourceKey = ''): self + { + return new self('', 204, $resourceKey); + } + + public static function notFound(string $description = 'No resource found'): self + { + return static::error(404, 'Not Found', $description); + } + + public static function unprocessableEntity(string $description = 'The request cannot be processed.', string $field = 'test'): self + { + return static::error(422, 'Unprocessable Entity', $description, $field); + } + + public static function error(int $status, string $title, string $detail, ?string $field = null): self + { + return (new ErrorResponseBuilder($status, $title, $detail, $field))->create(); + } + + public static function list(string $resourceKey): ListResponseBuilder + { + return new ListResponseBuilder($resourceKey); + } + + public static function resource(string $resourceKey): ResourceResponseBuilder + { + return new ResourceResponseBuilder($resourceKey); + } + + public function createPsrResponse(): ResponseInterface + { + $psrResponse = $this + ->factories() + ->responseFactory + ->createResponse($this->status); + + $body = $this + ->factories() + ->streamFactory + ->createStream($this->body()); + + return $psrResponse->withBody($body); + } + + public function body(): string + { + if (empty($body = $this->body)) { + return ''; + } + + if ($this->isJson($body)) { + return $body; + } + + /** @var string $contents */ + $contents = FakeResponseLoader::load($body); + + if (! empty($this->resourceKey)) { + $contents = str_replace('{{ RESOURCE_ID }}', $this->resourceKey, $contents); + } + + return $contents; + } + + public function json(): array + { + return json_decode($this->body(), true); + } + + private function isJson($string): bool + { + json_decode($string); + + return json_last_error() == JSON_ERROR_NONE; + } + + public function __serialize(): array + { + return [ + 'body' => $this->body(), + 'status' => $this->json()['status'] ?? 200, + 'resourceKey' => $this->json()['resource_key'] ?? '', + ]; + } + + public function __unserialize(array $data): void + { + $this->body = $data['body']; + $this->status = $data['status']; + $this->resourceKey = $data['resourceKey']; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/ResourceResponseBuilder.php b/vendor/mollie/mollie-api-php/src/Fake/ResourceResponseBuilder.php new file mode 100644 index 0000000..2c706df --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/ResourceResponseBuilder.php @@ -0,0 +1,102 @@ + */ + private array $embeddedBuilders = []; + + private ?string $currentEmbedKey = null; + + public function __construct(string $resourceClass) + { + if (! is_subclass_of($resourceClass, BaseResource::class)) { + throw new LogicException('Resource class must be a subclass of '.BaseResource::class); + } + + $this->resourceClass = $resourceClass; + } + + /** + * Set the resource data. + */ + public function with(array $data): self + { + $this->data = $data; + + return $this; + } + + /** + * Create the mock response with the resource data and any embedded collections. + */ + public function create(): MockResponse + { + $baseName = Str::snake(Utility::classBasename($this->resourceClass), '-'); + + $sampleContents = json_decode(FakeResponseLoader::load($baseName), true); + + $data = array_merge( + ['_embedded' => []], + ['_links' => $sampleContents['_links']], + $this->data + ); + + foreach ($this->embeddedBuilders as $key => $builder) { + $embeddedResponse = $builder->create(); + $embeddedData = $embeddedResponse->json(); + + $data['_embedded'] = array_merge($data['_embedded'], $embeddedData['_embedded']); + } + + // reorder the data for dev's convenience + $data = array_merge( + $this->data, + [ + '_embedded' => $data['_embedded'], + '_links' => $data['_links'], + ] + ); + + if (empty($data['_embedded'])) { + unset($data['_embedded']); + } + + return new MockResponse($data); + } + + public function __call($method, $parameters) + { + if ($method === 'embed') { + /** @var string $collectionClass */ + $collectionClass = $parameters[0]; + + if (! isset($this->embeddedBuilders[$collectionClass])) { + $this->embeddedBuilders[$collectionClass] = new ListResponseBuilder($collectionClass); + } + + $this->currentEmbedKey = $collectionClass; + + return $this; + } + + if ($this->currentEmbedKey && isset($this->embeddedBuilders[$this->currentEmbedKey]) && method_exists($this->embeddedBuilders[$this->currentEmbedKey], $method)) { + return $this->forwardDecoratedCallTo($this->embeddedBuilders[$this->currentEmbedKey], $method, $parameters); + } + + throw new \BadMethodCallException("Method {$method} does not exist."); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/apple-pay-session.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/apple-pay-session.json new file mode 100644 index 0000000..3729047 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/apple-pay-session.json @@ -0,0 +1,10 @@ +{ + "epochTimestamp": 1555507053169, + "expiresAt": 1555510653169, + "merchantSessionIdentifier": "SSH2EAF8AFAEAA94DEEA898162A5DAFD36E_916523AAED1343F5BC5815E12BEE9250AFFDC1A17C46B0DE5A9", + "nonce": "0206b8db", + "merchantIdentifier": "BD62FEB196874511C22DB28A9E14A89E3534C93194F73EA417EC566368D391EB", + "domainName": "pay.example.org", + "displayName": "Chuck Norris's Store", + "signature": "308006092a864886f7...8cc030ad3000000000000" +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/balance-list.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/balance-list.json new file mode 100644 index 0000000..2990461 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/balance-list.json @@ -0,0 +1,98 @@ +{ + "count": 2, + "_embedded": { + "balances": [ + { + "resource": "balance", + "id": "bal_gVMhHKqSSRYJyPsuoPNFH", + "mode": "live", + "createdAt": "2019-01-10T12:06:28+00:00", + "currency": "EUR", + "status": "active", + "availableAmount": { + "value": "0.00", + "currency": "EUR" + }, + "incomingAmount": { + "value": "0.00", + "currency": "EUR" + }, + "outgoingAmount": { + "value": "0.00", + "currency": "EUR" + }, + "transferFrequency": "daily", + "transferThreshold": { + "value": "40.00", + "currency": "EUR" + }, + "transferReference": "Mollie payout", + "transferDestination": { + "type": "bank-account", + "beneficiaryName": "Jack Bauer", + "bankAccount": "NL53INGB0654422370", + "bankAccountId": "bnk_jrty3f" + }, + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + } + } + }, + { + "resource": "balance", + "id": "bal_gVMhHKqSSRYJyPsuoPABC", + "mode": "live", + "createdAt": "2019-01-10T10:23:41+00:00", + "status": "active", + "currency": "EUR", + "availableAmount": { + "value": "0.00", + "currency": "EUR" + }, + "incomingAmount": { + "value": "0.00", + "currency": "EUR" + }, + "outgoingAmount": { + "value": "0.00", + "currency": "EUR" + }, + "transferFrequency": "twice-a-month", + "transferThreshold": { + "value": "5.00", + "currency": "EUR" + }, + "transferReference": "Mollie payout", + "transferDestination": { + "type": "bank-account", + "beneficiaryName": "Jack Bauer", + "bankAccount": "NL97MOLL6351480700", + "bankAccountId": "bnk_jrty3e" + }, + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + } + } + } + ] + }, + "_links": { + "documentation": { + "href": "...", + "type": "text/html" + }, + "self": { + "href": "https://api.mollie.com/v2/balances?limit=5", + "type": "application/hal+json" + }, + "previous": null, + "next": { + "href": "...", + "type": "application/hal+json" + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/balance-report.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/balance-report.json new file mode 100644 index 0000000..cd217ff --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/balance-report.json @@ -0,0 +1,149 @@ +{ + "resource": "balance-report", + "balanceId": "{{ RESOURCE_ID }}", + "timeZone": "Europe/Amsterdam", + "from": "2024-01-01", + "until": "2024-01-31", + "grouping": "transaction-categories", + "totals": { + "open": { + "available": { + "amount": { + "currency": "EUR", + "value": "0.00" + } + }, + "pending": { + "amount": { + "currency": "EUR", + "value": "0.00" + } + } + }, + "payments": { + "immediatelyAvailable": { + "amount": { + "currency": "EUR", + "value": "0.00" + } + }, + "pending": { + "amount": { + "currency": "EUR", + "value": "4.98" + }, + "subtotals": [ + { + "transactionType": "payment", + "count": 1, + "amount": { + "currency": "EUR", + "value": "4.98" + }, + "subtotals": [ + { + "method": "ideal", + "count": 1, + "amount": { + "currency": "EUR", + "value": "4.98" + } + } + ] + } + ] + }, + "movedToAvailable": { + "amount": { + "currency": "EUR", + "value": "0.00" + } + } + }, + "refunds": {}, + "capital": {}, + "chargebacks": {}, + "transfers": {}, + "fee-prepayments": { + "immediatelyAvailable": { + "amount": { + "currency": "EUR", + "value": "0.00" + } + }, + "movedToAvailable": { + "amount": { + "currency": "EUR", + "value": "-0.36" + }, + "subtotals": [ + { + "prepaymentPartType": "fee", + "count": 1, + "amount": { + "currency": "EUR", + "value": "-0.29" + }, + "subtotals": [ + { + "feeType": "payment-fee", + "method": "ideal", + "count": 1, + "amount": { + "currency": "EUR", + "value": "-0.29" + } + } + ] + }, + { + "prepaymentPartType": "fee-vat", + "amount": { + "currency": "EUR", + "value": "-0.0609" + } + }, + { + "prepaymentPartType": "fee-rounding-compensation", + "amount": { + "currency": "EUR", + "value": "-0.0091" + } + } + ] + }, + "pending": { + "amount": { + "currency": "EUR", + "value": "-0.36" + }, + "subtotals": [] + } + }, + "corrections": {}, + "close": { + "available": { + "amount": { + "currency": "EUR", + "value": "0.00" + } + }, + "pending": { + "amount": { + "currency": "EUR", + "value": "4.32" + } + } + } + }, + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "documentation": { + "href": "...", + "type": "text/html" + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/balance-transaction-list.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/balance-transaction-list.json new file mode 100644 index 0000000..a7966c9 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/balance-transaction-list.json @@ -0,0 +1,63 @@ +{ + "count": 5, + "_embedded": { + "balance_transactions": [ + { + "resource": "balance_transaction", + "id": "baltr_*", + "type": "refund", + "resultAmount": { + "currency": "EUR", + "value": "-10.25" + }, + "initialAmount": { + "currency": "EUR", + "value": "-10.00" + }, + "deductions": { + "currency": "EUR", + "value": "-0.25" + }, + "context": { + "paymentId": "tr_7UhSN1zuXS", + "refundId": "re_4qqhO89gsT" + } + }, + { + "resource": "balance_transaction", + "id": "baltr_WhmDwNYR87FPDbiwBhUXCh", + "type": "payment", + "resultAmount": { + "currency": "EUR", + "value": "9.71" + }, + "initialAmount": { + "currency": "EUR", + "value": "10.00" + }, + "deductions": { + "currency": "EUR", + "value": "-0.29" + }, + "context": { + "paymentId": "tr_7UhSN1zuXS" + } + } + ] + }, + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "previous": null, + "next": { + "href": "https://api.mollie.com/v2/balances/bal_gVMhHKqSSRYJyPsuoPNFH/transactions?from=baltr_*&limit=5", + "type": "application/hal+json" + }, + "documentation": { + "href": "...", + "type": "text/html" + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/balance-transaction.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/balance-transaction.json new file mode 100644 index 0000000..b8b372d --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/balance-transaction.json @@ -0,0 +1,31 @@ +{ + "resource": "balance_transaction", + "id": "baltr_*", + "type": "refund", + "resultAmount": { + "currency": "EUR", + "value": "-10.25" + }, + "initialAmount": { + "currency": "EUR", + "value": "-10.00" + }, + "deductions": { + "currency": "EUR", + "value": "-0.25" + }, + "context": { + "paymentId": "tr_7UhSN1zuXS", + "refundId": "re_4qqhO89gsT" + }, + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "documentation": { + "href": "...", + "type": "text/html" + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/balance.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/balance.json new file mode 100644 index 0000000..cb9c0df --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/balance.json @@ -0,0 +1,42 @@ +{ + "resource": "balance", + "id": "bal_gVMhHKqSSRYJyPsuoPNFH", + "mode": "live", + "createdAt": "2019-01-10T10:23:41+00:00", + "currency": "EUR", + "status": "active", + "availableAmount": { + "value": "0.00", + "currency": "EUR" + }, + "incomingAmount": { + "value": "0.00", + "currency": "EUR" + }, + "outgoingAmount": { + "value": "0.00", + "currency": "EUR" + }, + "transferFrequency": "twice-a-month", + "transferThreshold": { + "value": "5.00", + "currency": "EUR" + }, + "transferReference": "Mollie payout", + "transferDestination": { + "type": "bank-account", + "beneficiaryName": "Jack Bauer", + "bankAccount": "NL53INGB0654422370", + "bankAccountId": "bnk_jrty3f" + }, + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "documentation": { + "href": "...", + "type": "text/html" + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/capability-list.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/capability-list.json new file mode 100644 index 0000000..9d0e003 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/capability-list.json @@ -0,0 +1,70 @@ +{ + "count": 2, + "_embedded": { + "capabilities": [ + { + "resource": "capability", + "name": "payments", + "requirements": [ + { + "name": "legal-representatives", + "dueDate": null, + "status": "requested" + }, + { + "name": "bank-account", + "dueDate": null, + "status": "requested" + } + ], + "status": "pending", + "statusReason": "onboarding-information-needed", + "organizationId": "org_12345678", + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "dashboard": { + "href": "https://my.mollie.com/dashboard/...", + "type": "text/html" + } + } + }, + { + "resource": "capability", + "name": "capital", + "requirements": [ + { + "name": "legal-representatives", + "dueDate": "2024-05-14T01:29:09.0Z", + "status": "past-due" + } + ], + "status": "disabled", + "statusReason": "requirement-past-due", + "organizationId": "org_12345678", + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "dashboard": { + "href": "https://my.mollie.com/dashboard/...", + "type": "text/html" + } + } + } + ] + }, + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "documentation": { + "href": "...", + "type": "text/html" + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/capability.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/capability.json new file mode 100644 index 0000000..f4eea8a --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/capability.json @@ -0,0 +1,28 @@ +{ + "resource": "capability", + "name": "{{ RESOURCE_ID }}", + "requirements": [ + { + "name": "legal-representatives", + "dueDate": null, + "status": "requested" + } + ], + "status": "pending", + "statusReason": "onboarding-information-needed", + "organizationId": "org_12345678", + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "dashboard": { + "href": "https://my.mollie.com/dashboard/...", + "type": "text/html" + }, + "documentation": { + "href": "...", + "type": "text/html" + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/capture-list.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/capture-list.json new file mode 100644 index 0000000..aa9a865 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/capture-list.json @@ -0,0 +1,45 @@ +{ + "count": 1, + "_embedded": { + "captures": [ + { + "resource": "capture", + "id": "cpt_mNepDkEtco6ah3QNPUGYH", + "mode": "live", + "description": "Capture for cart #12345", + "amount": { + "currency": "EUR", + "value": "35.95" + }, + "metadata": "{\"bookkeeping_id\":12345}", + "paymentId": "tr_7UhSN1zuXS", + "createdAt": "2023-08-02T09:29:56.0Z", + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "payment": { + "href": "https://api.mollie.com/v2/payments/tr_7UhSN1zuXS", + "type": "application/hal+json" + } + } + } + ] + }, + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "previous": null, + "next": { + "href": "https://api.mollie.com/v2/payments/tr_7UhSN1zuXS/captures?from=cpt_Sy3NzD2TYuQtUaxNyu8aH&limit=5", + "type": "application/hal+json" + }, + "documentation": { + "href": "...", + "type": "text/html" + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/capture.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/capture.json new file mode 100644 index 0000000..5690775 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/capture.json @@ -0,0 +1,27 @@ +{ + "resource": "capture", + "id": "{{ RESOURCE_ID }}", + "mode": "live", + "description": "Capture for cart #12345", + "amount": { + "currency": "EUR", + "value": "35.95" + }, + "metadata": "{\"bookkeeping_id\":12345}", + "paymentId": "tr_7UhSN1zuXS", + "createdAt": "2023-08-02T09:29:56.0Z", + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "payment": { + "href": "https://api.mollie.com/v2/payments/tr_7UhSN1zuXS", + "type": "application/hal+json" + }, + "documentation": { + "href": "...", + "type": "text/html" + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/chargeback-list.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/chargeback-list.json new file mode 100644 index 0000000..91e36fd --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/chargeback-list.json @@ -0,0 +1,210 @@ +{ + "count": 2, + "_embedded": { + "chargebacks": [ + { + "resource": "chargeback", + "id": "chb_xg7414", + "amount": { + "value": "10.00", + "currency": "EUR" + }, + "createdAt": "2022-01-03T13:28:13+00:00", + "paymentId": "tr_HdQrGb6N3r", + "settlementAmount": { + "value": "-10.00", + "currency": "EUR" + }, + "_embedded": { + "payment": { + "resource": "payment", + "id": "tr_HdQrGb6N3r", + "mode": "test", + "createdAt": "2022-01-03T13:27:35+00:00", + "amount": { + "value": "10.00", + "currency": "EUR" + }, + "description": "This is the description of the payment", + "method": "creditcard", + "metadata": { + "someProperty": "someValue", + "anotherProperty": "anotherValue" + }, + "status": "paid", + "paidAt": "2022-01-03T13:28:10+00:00", + "amountRefunded": { + "value": "0.00", + "currency": "EUR" + }, + "amountRemaining": { + "value": "10.00", + "currency": "EUR" + }, + "amountChargedBack": { + "value": "10.00", + "currency": "EUR" + }, + "locale": "en_US", + "restrictPaymentMethodsToCountry": "NL", + "countryCode": "NL", + "profileId": "pfl_85dxyKqNHa", + "sequenceType": "oneoff", + "redirectUrl": "https://example.com/landing_page", + "webhookUrl": "https://example.com/redirect", + "settlementAmount": { + "value": "10.00", + "currency": "EUR" + }, + "details": { + "cardNumber": "6787", + "cardHolder": "T. TEST", + "cardAudience": "consumer", + "cardLabel": "Mastercard", + "cardCountryCode": "NL", + "cardSecurity": "normal", + "feeRegion": "other" + }, + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "dashboard": { + "href": "https://www.mollie.com/dashboard/org_13514547/payments/tr_HdQrGb6N3r", + "type": "text/html" + }, + "changePaymentState": { + "href": "https://www.mollie.com/checkout/test-mode?method=creditcard&token=3.lxnsca", + "type": "text/html" + }, + "chargebacks": { + "href": "https://api.mollie.com/v2/payments/tr_HdQrGb6N3r/chargebacks", + "type": "application/hal+json" + } + } + } + }, + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "payment": { + "href": "https://api.mollie.com/v2/payments/tr_HdQrGb6N3r", + "type": "application/hal+json" + } + } + }, + { + "resource": "chargeback", + "id": "chb_ls7ahg", + "amount": { + "value": "10.00", + "currency": "EUR" + }, + "createdAt": "2022-01-03T13:20:37+00:00", + "paymentId": "tr_8bVBhk2qs4", + "settlementAmount": { + "value": "-10.00", + "currency": "EUR" + }, + "_embedded": { + "payment": { + "resource": "payment", + "id": "tr_8bVBhk2qs4", + "mode": "test", + "createdAt": "2022-01-03T13:11:20+00:00", + "amount": { + "value": "10.00", + "currency": "EUR" + }, + "description": "This is the description of the payment", + "method": "creditcard", + "metadata": { + "someProperty": "someValue", + "anotherProperty": "anotherValue" + }, + "status": "paid", + "paidAt": "2022-01-03T13:18:39+00:00", + "amountRefunded": { + "value": "0.00", + "currency": "EUR" + }, + "amountRemaining": { + "value": "10.00", + "currency": "EUR" + }, + "amountChargedBack": { + "value": "10.00", + "currency": "EUR" + }, + "locale": "en_US", + "restrictPaymentMethodsToCountry": "NL", + "countryCode": "NL", + "profileId": "pfl_85dxyKqNHa", + "sequenceType": "oneoff", + "redirectUrl": "https://example.com/landing_page", + "webhookUrl": "https://example.com/redirect", + "settlementAmount": { + "value": "10.00", + "currency": "EUR" + }, + "details": { + "cardNumber": "6787", + "cardHolder": "T. TEST", + "cardAudience": "consumer", + "cardLabel": "Mastercard", + "cardCountryCode": "NL", + "cardSecurity": "normal", + "feeRegion": "other" + }, + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "dashboard": { + "href": "https://www.mollie.com/dashboard/org_13514547/payments/tr_8bVBhk2qs4", + "type": "text/html" + }, + "changePaymentState": { + "href": "https://www.mollie.com/checkout/test-mode?method=creditcard&token=3.11roh2", + "type": "text/html" + }, + "chargebacks": { + "href": "https://api.mollie.com/v2/payments/tr_8bVBhk2qs4/chargebacks", + "type": "application/hal+json" + } + } + } + }, + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "payment": { + "href": "https://api.mollie.com/v2/payments/tr_8bVBhk2qs4", + "type": "application/hal+json" + } + } + } + ] + }, + "_links": { + "documentation": { + "href": "...", + "type": "text/html" + }, + "self": { + "href": "...", + "type": "application/hal+json" + }, + "previous": null, + "next": { + "href": "...", + "type": "application/hal+json" + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/chargeback.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/chargeback.json new file mode 100644 index 0000000..2792646 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/chargeback.json @@ -0,0 +1,33 @@ +{ + "resource": "chargeback", + "id": "{{ RESOURCE_ID }}", + "amount": { + "currency": "USD", + "value": "43.38" + }, + "settlementAmount": { + "currency": "EUR", + "value": "-35.07" + }, + "reason": { + "code": "AC01", + "description": "Account identifier incorrect (i.e. invalid IBAN)" + }, + "paymentId": "tr_7UhSN1zuXS", + "createdAt": "2023-03-14T17:09:02.0Z", + "reversedAt": null, + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "payment": { + "href": "https://api.mollie.com/v2/payments/tr_7UhSN1zuXS", + "type": "application/hal+json" + }, + "documentation": { + "href": "...", + "type": "text/html" + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/client-link.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/client-link.json new file mode 100644 index 0000000..5e2314c --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/client-link.json @@ -0,0 +1,14 @@ +{ + "id": "csr_ayCz46QLwCbxpTaSYQQZH", + "resource": "client-link", + "_links": { + "clientLink": { + "href": "https://my.mollie.com/dashboard/client-link/csr_ayCz46QLwCbxpTaSYQQZH", + "type": "text/html" + }, + "documentation": { + "href": "...", + "type": "text/html" + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/client-list.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/client-list.json new file mode 100644 index 0000000..384c85f --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/client-list.json @@ -0,0 +1,33 @@ +{ + "count": 2, + "_embedded": { + "clients": [ + { + "resource": "client", + "id": "org_12345678", + "organizationCreatedAt": "2023-04-06 13:10:19+00:00", + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + } + } + } + ] + }, + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "previous": null, + "next": { + "href": "https://api.mollie.com/v2/clients?from=org_63916732&limit=5", + "type": "application/hal+json" + }, + "documentation": { + "href": "...", + "type": "text/html" + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/client.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/client.json new file mode 100644 index 0000000..525e9a5 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/client.json @@ -0,0 +1,52 @@ +{ + "resource": "client", + "id": "org_7049691", + "organizationCreatedAt": "2019-12-06T10:09:32+00:00", + "_embedded": { + "organization": { + "resource": "organization", + "id": "org_7049691", + "name": "Hugo's eenzame zaak", + "email": "[[redacted]]", + "locale": "en_US", + "address": { + "streetAndNumber": "[[redacted]]", + "postalCode": "[[redacted]]", + "city": "[[redacted]]", + "country": "[[redacted]]" + }, + "registrationNumber": "[[redacted]]", + "vatNumber": "", + "vatRegulation": "dutch", + "verifiedAt": "2020-10-19T11:45:36+00:00", + "_links": { + "self": { + "href": "https://api.mollie.com/v2/organization/org_7049691", + "type": "application/hal+json" + }, + "dashboard": { + "href": "https://www.mollie.com/dashboard/org_7049691/", + "type": "text/html" + } + } + } + }, + "_links": { + "self": { + "href": "https://api.mollie.com/v2/clients/org_7049691", + "type": "application/hal+json" + }, + "onboarding": { + "href": "https://api.mollie.com/v2/onboarding/org_7049691", + "type": "application/hal+json" + }, + "organization": { + "href": "https://api.mollie.com/v2/organization/org_7049691", + "type": "application/hal+json" + }, + "documentation": { + "href": "https://docs.mollie.com/reference/v2/partners-api/get-client", + "type": "text/html" + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/connect-balance-transfer-list.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/connect-balance-transfer-list.json new file mode 100644 index 0000000..194cf30 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/connect-balance-transfer-list.json @@ -0,0 +1,82 @@ +{ + "_embedded": { + "connect_balance_transfers": [ + { + "resource": "connect-balance-transfer", + "id": "cbt_4KgGJJSZpH", + "amount": { + "currency": "EUR", + "value": "100.00" + }, + "source": { + "type": "organization", + "id": "org_12345678", + "description": "Payment from Organization A" + }, + "destination": { + "type": "organization", + "id": "org_87654321", + "description": "Payment to Organization B" + }, + "description": "Transfer from balance A to balance B", + "status": "succeeded", + "category": "manual_correction", + "executedAt": "2023-12-25T10:31:00+00:00", + "mode": "live", + "createdAt": "2023-12-25T10:30:54+00:00", + "_links": { + "self": { + "href": "https://api.mollie.com/v2/connect/balance-transfers/cbt_4KgGJJSZpH", + "type": "application/hal+json" + } + } + }, + { + "resource": "connect-balance-transfer", + "id": "cbt_8KhHNOSdpL", + "amount": { + "currency": "EUR", + "value": "250.00" + }, + "source": { + "type": "organization", + "id": "org_12345678", + "description": "Monthly transfer from Org A" + }, + "destination": { + "type": "organization", + "id": "org_99887766", + "description": "Monthly transfer to Org C" + }, + "description": "Monthly balance transfer", + "status": "succeeded", + "category": "purchase", + "executedAt": "2023-12-26T10:31:15+00:00", + "mode": "live", + "createdAt": "2023-12-26T10:30:54+00:00", + "_links": { + "self": { + "href": "https://api.mollie.com/v2/connect/balance-transfers/cbt_8KhHNOSdpL", + "type": "application/hal+json" + } + } + } + ] + }, + "count": 2, + "_links": { + "documentation": { + "href": "https://docs.mollie.com/reference/v2/connect-api/list-connect-balance-transfers", + "type": "text/html" + }, + "self": { + "href": "https://api.mollie.com/v2/connect/balance-transfers?limit=50", + "type": "application/hal+json" + }, + "previous": null, + "next": { + "href": "https://api.mollie.com/v2/connect/balance-transfers?from=cbt_8KhHNOSdpL&limit=50", + "type": "application/hal+json" + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/connect-balance-transfer.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/connect-balance-transfer.json new file mode 100644 index 0000000..783de72 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/connect-balance-transfer.json @@ -0,0 +1,24 @@ +{ + "resource": "connect-balance-transfer", + "id": "cbt_4KgGJJSZpH", + "amount": { + "currency": "EUR", + "value": "100.00" + }, + "source": { + "type": "organization", + "id": "org_12345678", + "description": "Payment from Organization A" + }, + "destination": { + "type": "organization", + "id": "org_87654321", + "description": "Payment to Organization B" + }, + "description": "Transfer from balance A to balance B", + "status": "succeeded", + "category": "manual_correction", + "executedAt": "2023-12-25T10:31:00+00:00", + "mode": "live", + "createdAt": "2023-12-25T10:30:54+00:00" +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/current-profile.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/current-profile.json new file mode 100644 index 0000000..bf5047c --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/current-profile.json @@ -0,0 +1,47 @@ +{ + "resource": "profile", + "id": "{{ RESOURCE_ID }}", + "mode": "live", + "name": "Jonas Test BV", + "website": "https://example.com", + "email": "test@mollie.com", + "phone": "+31612345678", + "categoryCode": 6012, + "businessCategory": "MONEY_SERVICES", + "status": "verified", + "createdAt": "2021-12-08T15:42:58+00:00", + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "dashboard": { + "href": "https://www.mollie.com/dashboard/org_13514547/settings/profiles/pfl_85dxyKqNHa", + "type": "text/html" + }, + "chargebacks": { + "href": "https://api.mollie.com/v2/chargebacks", + "type": "application/hal+json" + }, + "methods": { + "href": "https://api.mollie.com/v2/methods", + "type": "application/hal+json" + }, + "payments": { + "href": "https://api.mollie.com/v2/payments", + "type": "application/hal+json" + }, + "refunds": { + "href": "https://api.mollie.com/v2/refunds", + "type": "application/hal+json" + }, + "checkoutPreviewUrl": { + "href": "https://www.mollie.com/checkout/preview/{{ RESOURCE_ID }}", + "type": "text/html" + }, + "documentation": { + "href": "...", + "type": "text/html" + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/cursor-collection-next.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/cursor-collection-next.json new file mode 100644 index 0000000..30d922d --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/cursor-collection-next.json @@ -0,0 +1,18 @@ +{ + "count": 1, + "_links": { + "self": { + "href": "https:\/\/api.mollie.com\/v2\/payments?from={{ RESOURCE_ID }}" + }, + "next": { + "href": "https:\/\/api.mollie.com\/v2\/payments?from={{ RESOURCE_ID }}" + } + }, + "_embedded": { + "payments": [ + { + "id": "{{ RESOURCE_ID }}" + } + ] + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/cursor-collection.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/cursor-collection.json new file mode 100644 index 0000000..36a035a --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/cursor-collection.json @@ -0,0 +1,15 @@ +{ + "count": 1, + "_links": { + "self": { + "href": "https:\/\/api.mollie.com\/v2\/payments?from={{ RESOURCE_ID }}" + } + }, + "_embedded": { + "payments": [ + { + "id": "{{ RESOURCE_ID }}" + } + ] + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/customer-list.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/customer-list.json new file mode 100644 index 0000000..1b73d95 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/customer-list.json @@ -0,0 +1,36 @@ +{ + "count": 5, + "_embedded": { + "customers": [ + { + "resource": "customer", + "id": "cst_8wmqcHMN4U", + "mode": "live", + "name": "John Doe", + "email": "customer@example.org", + "createdAt": "2023-04-06T13:10:19.0Z", + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + } + } + } + ] + }, + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "previous": null, + "next": { + "href": "https://api.mollie.com/v2/customers?from=cst_stTC2WHAuS&limit=5", + "type": "application/hal+json" + }, + "documentation": { + "href": "...", + "type": "text/html" + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/customer.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/customer.json new file mode 100644 index 0000000..e1e9171 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/customer.json @@ -0,0 +1,27 @@ +{ + "resource": "customer", + "id": "{{ RESOURCE_ID }}", + "mode": "test", + "name": "Jane Doe", + "email": "test@mollie.com", + "locale": "en_US", + "metadata": { + "someProperty": "someValue", + "anotherProperty": "anotherValue" + }, + "createdAt": "2022-01-03T13:42:04+00:00", + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "dashboard": { + "href": "https://www.mollie.com/dashboard/org_13514547/customers/cst_tKt44u85MM", + "type": "text/html" + }, + "documentation": { + "href": "...", + "type": "text/html" + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/empty-list.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/empty-list.json new file mode 100644 index 0000000..e928366 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/empty-list.json @@ -0,0 +1,18 @@ +{ + "count": 0, + "_embedded": { + "{{ RESOURCE_ID }}": [] + }, + "_links": { + "documentation": { + "href": "...", + "type": "text/html" + }, + "self": { + "href": "...", + "type": "application/hal+json" + }, + "previous": null, + "next": null + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/error.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/error.json new file mode 100644 index 0000000..672dfbb --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/error.json @@ -0,0 +1,12 @@ +{ + "status": "{{ CODE }}", + "title": "{{ TITLE }}", + "detail": "{{ DETAIL }}", + "field": "{{ FIELD }}", + "_links": { + "documentation": { + "href": "https://docs.mollie.com/overview/handling-errors", + "type": "text/html" + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/invoice-list.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/invoice-list.json new file mode 100644 index 0000000..b4a6046 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/invoice-list.json @@ -0,0 +1,61 @@ +{ + "count": 1, + "_embedded": { + "invoices": [ + { + "resource": "invoice", + "id": "inv_xBEbP9rvAq", + "reference": "2023.10000", + "vatNumber": "NL001234567B01", + "status": "open", + "netAmount": { + "currency": "EUR", + "value": "45.00" + }, + "vatAmount": { + "currency": "EUR", + "value": "9.45" + }, + "grossAmount": { + "currency": "EUR", + "value": "54.45" + }, + "lines": [ + { + "period": "2023-09", + "description": "iDEAL payment fees", + "count": 100, + "vatPercentage": 21, + "amount": { + "currency": "EUR", + "value": "45.00" + } + } + ], + "issuedAt": "2023-09-01", + "dueAt": "2023-09-14", + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + } + } + } + ] + }, + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "previous": null, + "next": { + "href": "https://api.mollie.com/v2/invoices?from=inv_TUhzbAFMrt&limit=5", + "type": "application/hal+json" + }, + "documentation": { + "href": "...", + "type": "text/html" + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/invoice.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/invoice.json new file mode 100644 index 0000000..1b5157f --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/invoice.json @@ -0,0 +1,47 @@ +{ + "resource": "invoice", + "id": "{{ RESOURCE_ID }}", + "reference": "2023.10000", + "vatNumber": "NL001234567B01", + "status": "open", + "netAmount": { + "currency": "EUR", + "value": "45.00" + }, + "vatAmount": { + "currency": "EUR", + "value": "9.45" + }, + "grossAmount": { + "currency": "EUR", + "value": "54.45" + }, + "lines": [ + { + "period": "2023-09", + "description": "iDEAL payment fees", + "count": 100, + "vatPercentage": 21, + "amount": { + "currency": "EUR", + "value": "45.00" + } + } + ], + "issuedAt": "2023-09-01", + "dueAt": "2023-09-14", + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "pdf": { + "href": "https://www.mollie.com/merchant/download/invoice/xBEbP9rvAq/2ab44d60b35b1d06090bba955fa2c602", + "type": "application/pdf" + }, + "documentation": { + "href": "...", + "type": "text/html" + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/issuer.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/issuer.json new file mode 100644 index 0000000..fbfca9f --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/issuer.json @@ -0,0 +1,16 @@ +{ + "resource": "issuer", + "id": "festivalcadeau", + "description": "FestivalCadeau Giftcard", + "status": "pending-issuer", + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "documentation": { + "href": "...", + "type": "text/html" + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/mandate-list.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/mandate-list.json new file mode 100644 index 0000000..9fb0487 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/mandate-list.json @@ -0,0 +1,44 @@ +{ + "count": 1, + "_embedded": { + "mandates": [ + { + "resource": "mandate", + "id": "mdt_h3gAaD5zP", + "mode": "live", + "status": "valid", + "method": "directdebit", + "details": {}, + "mandateReference": "EXAMPLE-CORP-MD13804", + "signatureDate": "2023-05-07", + "customerId": "cst_4qqhO89gsT", + "createdAt": "2023-05-07T10:49:08.0Z", + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "customer": { + "href": "https://api.mollie.com/v2/customers/cst_4qqhO89gsT", + "type": "application/hal+json" + } + } + } + ] + }, + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "previous": null, + "next": { + "href": "https://api.mollie.com/v2/mandates?from=mdt_pWUnw6pkBN&limit=5", + "type": "application/hal+json" + }, + "documentation": { + "href": "...", + "type": "text/html" + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/mandate.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/mandate.json new file mode 100644 index 0000000..c961c0d --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/mandate.json @@ -0,0 +1,30 @@ +{ + "resource": "mandate", + "id": "{{ RESOURCE_ID }}", + "mode": "live", + "status": "valid", + "method": "directdebit", + "details": { + "consumerName": "John Doe", + "consumerAccount": "NL55INGB0000000000", + "consumerBic": "INGBNL2A" + }, + "mandateReference": "EXAMPLE-CORP-MD13804", + "signatureDate": "2023-05-07", + "customerId": "cst_4qqhO89gsT", + "createdAt": "2023-05-07T10:49:08.0Z", + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "customer": { + "href": "https://api.mollie.com/v2/customers/cst_4qqhO89gsT", + "type": "application/hal+json" + }, + "documentation": { + "href": "...", + "type": "text/html" + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/method-list.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/method-list.json new file mode 100644 index 0000000..b45f379 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/method-list.json @@ -0,0 +1,55 @@ +{ + "count": 2, + "_embedded": { + "methods": [ + { + "resource": "method", + "id": "ideal", + "description": "iDEAL", + "minimumAmount": { + "value": "0.01", + "currency": "EUR" + }, + "maximumAmount": { + "value": "50000.00", + "currency": "EUR" + }, + "image": { + "size1x": "https://mollie.com/external/icons/payment-methods/ideal.png", + "size2x": "https://mollie.com/external/icons/payment-methods/ideal%402x.png", + "svg": "https://mollie.com/external/icons/payment-methods/ideal.svg" + }, + "status": "activated" + }, + { + "resource": "method", + "id": "creditcard", + "description": "Credit card", + "minimumAmount": { + "value": "0.01", + "currency": "EUR" + }, + "maximumAmount": { + "value": "2000.00", + "currency": "EUR" + }, + "image": { + "size1x": "https://mollie.com/external/icons/payment-methods/creditcard.png", + "size2x": "https://mollie.com/external/icons/payment-methods/creditcard%402x.png", + "svg": "https://mollie.com/external/icons/payment-methods/creditcard.svg" + }, + "status": "activated" + } + ] + }, + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "documentation": { + "href": "...", + "type": "text/html" + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/method.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/method.json new file mode 100644 index 0000000..a40be50 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/method.json @@ -0,0 +1,29 @@ +{ + "resource": "method", + "id": "{{ RESOURCE_ID }}", + "description": "iDEAL", + "minimumAmount": { + "value": "0.01", + "currency": "EUR" + }, + "maximumAmount": { + "value": "50000.00", + "currency": "EUR" + }, + "image": { + "size1x": "https://mollie.com/external/icons/payment-methods/ideal.png", + "size2x": "https://mollie.com/external/icons/payment-methods/ideal%402x.png", + "svg": "https://mollie.com/external/icons/payment-methods/ideal.svg" + }, + "status": "activated", + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "documentation": { + "href": "...", + "type": "text/html" + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/onboarding.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/onboarding.json new file mode 100644 index 0000000..174aef9 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/onboarding.json @@ -0,0 +1,26 @@ +{ + "resource": "onboarding", + "name": "Mollie B.V.", + "status": "completed", + "canReceivePayments": true, + "canReceiveSettlements": true, + "signedUpAt": "2023-12-20T10:49:08.0Z", + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "dashboard": { + "href": "https://www.mollie.com/dashboard/onboarding", + "type": "text/html" + }, + "organization": { + "href": "https://api.mollie.com/v2/organizations/org_12345678", + "type": "application/hal+json" + }, + "documentation": { + "href": "...", + "type": "text/html" + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/organization.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/organization.json new file mode 100644 index 0000000..2c2125d --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/organization.json @@ -0,0 +1,29 @@ +{ + "resource": "organization", + "id": "{{ RESOURCE_ID }}", + "name": "Mollie B.V.", + "email": "info@mollie.com", + "locale": "nl_NL", + "address": { + "streetAndNumber": "Keizersgracht 126", + "postalCode": "1015 CW", + "city": "Amsterdam", + "country": "NL" + }, + "registrationNumber": "30204462", + "vatNumber": "NL815839091B01", + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "dashboard": { + "href": "https://mollie.com/dashboard/{{ RESOURCE_ID }}", + "type": "text/html" + }, + "documentation": { + "href": "...", + "type": "text/html" + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/partner-status.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/partner-status.json new file mode 100644 index 0000000..e847dfa --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/partner-status.json @@ -0,0 +1,19 @@ +{ + "resource": "partner", + "partnerType": "signuplink", + "partnerContractSignedAt": "2023-03-20T13:59:02.0Z", + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "signuplink": { + "href": "https://www.mollie.com/dashboard/signup/exampleCode", + "type": "text/html" + }, + "documentation": { + "href": "...", + "type": "text/html" + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/payment-link-list.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/payment-link-list.json new file mode 100644 index 0000000..334e7fe --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/payment-link-list.json @@ -0,0 +1,49 @@ +{ + "count": 5, + "_embedded": { + "payment_links": [ + { + "resource": "payment-link", + "id": "pl_4Y0eZitmBnQ6IDoMqZQKh", + "mode": "live", + "description": "Bicycle tires", + "amount": { + "currency": "EUR", + "value": "24.95" + }, + "archived": false, + "redirectUrl": "https://webshop.example.org/thanks", + "webhookUrl": "https://webshop.example.org/payment-links/webhook", + "profileId": "pfl_QkEhN94Ba", + "createdAt": "2021-03-20T09:29:56.0Z", + "expiresAt": "2023-06-06T11:00:00.0Z", + "reusable": false, + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "paymentLink": { + "href": "https://payment-links.mollie.com/payment/4Y0eZitmBnQ6IDoMqZQKh", + "type": "text/html" + } + } + } + ] + }, + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "previous": null, + "next": { + "href": "https://api.mollie.com/v2/payment-links?from=pl_ayGNzD4TYuQtUaxNyu8aH&limit=5", + "type": "application/hal+json" + }, + "documentation": { + "href": "...", + "type": "text/html" + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/payment-link.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/payment-link.json new file mode 100644 index 0000000..d87231d --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/payment-link.json @@ -0,0 +1,31 @@ +{ + "resource": "payment-link", + "id": "{{ RESOURCE_ID }}", + "mode": "live", + "description": "Bicycle tires", + "amount": { + "currency": "EUR", + "value": "24.95" + }, + "archived": false, + "redirectUrl": "https://webshop.example.org/thanks", + "webhookUrl": "https://webshop.example.org/payment-links/webhook", + "profileId": "pfl_QkEhN94Ba", + "createdAt": "2021-03-20T09:29:56.0Z", + "expiresAt": "2023-06-06T11:00:00.0Z", + "reusable": false, + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "paymentLink": { + "href": "https://payment-links.mollie.com/payment/4Y0eZitmBnQ6IDoMqZQKh", + "type": "text/html" + }, + "documentation": { + "href": "...", + "type": "text/html" + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/payment-list.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/payment-list.json new file mode 100644 index 0000000..816e143 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/payment-list.json @@ -0,0 +1,57 @@ +{ + "count": 1, + "_embedded": { + "payments": [ + { + "resource": "payment", + "id": "tr_7UhSN1zuXS", + "mode": "live", + "status": "open", + "isCancelable": false, + "amount": { + "value": "75.00", + "currency": "GBP" + }, + "description": "Order #12345", + "method": "ideal", + "metadata": { + "order_id": "12345" + }, + "details": null, + "profileId": "pfl_QkEhN94Ba", + "redirectUrl": "https://webshop.example.org/order/12345/", + "createdAt": "2024-02-12T11:58:35.0Z", + "expiresAt": "2024-02-12T12:13:35.0Z", + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "checkout": { + "href": "https://www.mollie.com/checkout/issuer/select/ideal/7UhSN1zuXS", + "type": "text/html" + }, + "dashboard": { + "href": "https://www.mollie.com/dashboard/org_12345678/payments/tr_7UhSN1zuXS", + "type": "text/html" + } + } + } + ] + }, + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "previous": null, + "next": { + "href": "https://api.mollie.com/v2/payments?from=tr_SDkzMggpvx&limit=5", + "type": "application/hal+json" + }, + "documentation": { + "href": "...", + "type": "text/html" + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/payment-route.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/payment-route.json new file mode 100644 index 0000000..db073f5 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/payment-route.json @@ -0,0 +1,13 @@ +{ + "resource": "route", + "id": "rt_9dk4al1n", + "amount": { + "value": "7.50", + "currency": "EUR" + }, + "destination": { + "type": "organization", + "organizationId": "org_23456" + }, + "releaseDate": "2026-01-01" +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/payment.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/payment.json new file mode 100644 index 0000000..79408d2 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/payment.json @@ -0,0 +1,37 @@ +{ + "resource": "payment", + "id": "{{ RESOURCE_ID }}", + "mode": "test", + "createdAt": "2018-03-13T14:02:29+00:00", + "amount": { + "value": "20.00", + "currency": "EUR" + }, + "description": "My first API payment", + "method": "ideal", + "metadata": { + "order_id": "1234" + }, + "status": "open", + "isCancelable": false, + "expiresAt": "2018-03-13T14:17:29+00:00", + "details": null, + "profileId": "pfl_2A1gacu42V", + "sequenceType": "oneoff", + "redirectUrl": "https://example.org/redirect", + "webhookUrl": "https://example.org/webhook", + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "checkout": { + "href": "...", + "type": "text/html" + }, + "documentation": { + "href": "...", + "type": "text/html" + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/permission-list.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/permission-list.json new file mode 100644 index 0000000..a062454 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/permission-list.json @@ -0,0 +1,41 @@ +{ + "count": 2, + "_embedded": { + "permissions": [ + { + "resource": "permission", + "id": "payments.read", + "description": "View your payments", + "granted": true, + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + } + } + }, + { + "resource": "permission", + "id": "payments.write", + "description": "Create new payments", + "granted": false, + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + } + } + } + ] + }, + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "documentation": { + "href": "...", + "type": "text/html" + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/permission.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/permission.json new file mode 100644 index 0000000..efa881d --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/permission.json @@ -0,0 +1,16 @@ +{ + "resource": "permission", + "id": "{{ RESOURCE_ID }}", + "description": "View your payments", + "granted": true, + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "documentation": { + "href": "...", + "type": "text/html" + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/profile-list.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/profile-list.json new file mode 100644 index 0000000..a5d609b --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/profile-list.json @@ -0,0 +1,43 @@ +{ + "count": 1, + "_embedded": { + "profiles": [ + { + "resource": "profile", + "id": "pfl_QkEhN94Ba", + "mode": "live", + "name": "My website name", + "website": "https://shop.example.org", + "email": "info@example.org", + "phone": "+31208202070", + "businessCategory": "OTHER_MERCHANDISE", + "status": "verified", + "review": { + "status": "pending" + }, + "createdAt": "2023-03-20T09:28:37.0Z", + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + } + } + } + ] + }, + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "previous": null, + "next": { + "href": "https://api.mollie.com/v2/profiles?from=pfl_v9hTwCvYqw&limit=5", + "type": "application/hal+json" + }, + "documentation": { + "href": "...", + "type": "text/html" + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/profile.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/profile.json new file mode 100644 index 0000000..1ab7019 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/profile.json @@ -0,0 +1,29 @@ +{ + "resource": "profile", + "id": "{{ RESOURCE_ID }}", + "mode": "live", + "name": "My website name", + "website": "https://shop.example.org", + "email": "info@example.org", + "phone": "+31208202070", + "businessCategory": "OTHER_MERCHANDISE", + "status": "verified", + "review": { + "status": "pending" + }, + "createdAt": "2023-03-20T09:28:37.0Z", + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "dashboard": { + "href": "https://www.mollie.com/dashboard/org_123456789/settings/profiles/pfl_QkEhN94Ba", + "type": "text/html" + }, + "documentation": { + "href": "...", + "type": "text/html" + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/refund-list.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/refund-list.json new file mode 100644 index 0000000..3ee516b --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/refund-list.json @@ -0,0 +1,48 @@ +{ + "count": 1, + "_embedded": { + "refunds": [ + { + "resource": "refund", + "id": "re_4qqhO89gsT", + "mode": "live", + "description": "Order", + "amount": { + "currency": "EUR", + "value": "5.95" + }, + "status": "pending", + "metadata": { + "bookkeeping_id": 12345 + }, + "paymentId": "tr_7UhSN1zuXS", + "createdAt": "2023-03-14T17:09:02.0Z", + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "payment": { + "href": "https://api.mollie.com/v2/payments/tr_7UhSN1zuXS", + "type": "application/hal+json" + } + } + } + ] + }, + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "previous": null, + "next": { + "href": "https://api.mollie.com/v2/payments/tr_7UhSN1zuXS/refunds?from=re_APBiGPH2vV&limit=5", + "type": "application/hal+json" + }, + "documentation": { + "href": "...", + "type": "text/html" + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/refund.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/refund.json new file mode 100644 index 0000000..c7c5dfc --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/refund.json @@ -0,0 +1,28 @@ +{ + "resource": "refund", + "id": "{{ RESOURCE_ID }}", + "mode": "live", + "description": "Order", + "amount": { + "currency": "EUR", + "value": "5.95" + }, + "status": "pending", + "metadata": "{\"bookkeeping_id\":12345}", + "paymentId": "tr_7UhSN1zuXS", + "createdAt": "2023-03-14T17:09:02.0Z", + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "payment": { + "href": "https://api.mollie.com/v2/payments/tr_7UhSN1zuXS", + "type": "application/hal+json" + }, + "documentation": { + "href": "...", + "type": "text/html" + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/route-list.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/route-list.json new file mode 100644 index 0000000..ecbe5d5 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/route-list.json @@ -0,0 +1,67 @@ +{ + "count": 2, + "_embedded": { + "routes": [ + { + "resource": "route", + "id": "crt_kSq9CDTa6FzW7c6gpYq3J", + "paymentId": "tr_sva3o24VKn", + "createdAt": "2024-05-22T15:11:19+02:00", + "description": "Payment for Order #12345", + "amount": { + "value": "1.00", + "currency": "EUR" + }, + "destination": { + "type": "organization", + "organizationId": "org_123" + }, + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "documentation": { + "href": "...", + "type": "text/html" + } + } + }, + { + "resource": "route", + "id": "crt_kSq9CDTa6FzW7c6gpYq3K", + "paymentId": "tr_sva3o24VKv", + "createdAt": "2024-05-22T15:11:19+02:00", + "description": "Payment for Order #67890", + "amount": { + "value": "4.00", + "currency": "EUR" + }, + "destination": { + "type": "organization", + "organizationId": "org_56789" + }, + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "documentation": { + "href": "...", + "type": "text/html" + } + } + } + ] + }, + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "documentation": { + "href": "...", + "type": "text/html" + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/route.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/route.json new file mode 100644 index 0000000..1be2ba4 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/route.json @@ -0,0 +1,13 @@ +{ + "resource": "route", + "id": "{{ RESOURCE_ID }}", + "amount": { + "value": "7.50", + "currency": "EUR" + }, + "destination": { + "type": "organization", + "organizationId": "org_23456" + }, + "releaseDate": "2026-01-01" +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/sales-invoice-list.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/sales-invoice-list.json new file mode 100644 index 0000000..fdd397d --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/sales-invoice-list.json @@ -0,0 +1,83 @@ +{ + "count": 1, + "_embedded": { + "sales_invoices": [ + { + "resource": "sales-invoice", + "id": "invoice_4Y0eZitmBnQ6IDoMqZQKh", + "profileId": "pfl_QkEhN94Ba", + "invoiceNumber": null, + "currency": "EUR", + "status": "draft", + "vatScheme": "standard", + "paymentTerm": "30 days", + "recipientIdentifier": "123532354", + "recipient": { + "title": null, + "givenName": "Given", + "familyName": "Family", + "email": "given.family@mollie.com", + "phone": null, + "streetAndNumber": "Street 1", + "streetAdditional": null, + "postalCode": "1000 AA", + "city": "Amsterdam", + "region": null, + "country": "NL" + }, + "lines": [ + { + "description": "LEGO 4440 Forest Police Station", + "quantity": 1, + "vatRate": "21", + "unitPrice": { + "value": "89.00", + "currency": "EUR" + }, + "discount": null + } + ], + "discount": null, + "amountDue": { + "value": "107.69", + "currency": "EUR" + }, + "subtotalAmount": { + "value": "89.00", + "currency": "EUR" + }, + "totalAmount": { + "value": "107.69", + "currency": "EUR" + }, + "totalVatAmount": { + "value": "18.69", + "currency": "EUR" + }, + "discountedSubtotalAmount": { + "value": "89.00", + "currency": "EUR" + }, + "createdAt": "2024-10-03T10:47:38.457381+00:00", + "issuedAt": null, + "dueAt": null, + "memo": null + } + ] + }, + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "previous": null, + "next": { + "href": "https://api.mollie.com/v2/sales/invoices?from=invoice_4yUfQpbKnd2DUTouUdUwH&limit=5", + "type": "application/hal+json" + }, + "documentation": { + "href": "...", + "type": "text/html" + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/sales-invoice.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/sales-invoice.json new file mode 100644 index 0000000..bda9bba --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/sales-invoice.json @@ -0,0 +1,81 @@ +{ + "resource": "sales-invoice", + "id": "invoice_4Y0eZitmBnQ6IDoMqZQKh", + "profileId": "pfl_QkEhN94Ba", + "invoiceNumber": null, + "currency": "EUR", + "status": "draft", + "vatScheme": "standard", + "paymentTerm": "30 days", + "recipientIdentifier": "123532354", + "recipient": { + "type": "consumer", + "title": null, + "givenName": "Given", + "familyName": "Family", + "email": "given.family@mollie.com", + "phone": null, + "streetAndNumber": "Street 1", + "streetAdditional": null, + "postalCode": "1000 AA", + "city": "Amsterdam", + "region": null, + "country": "NL", + "locale": "nl_NL" + }, + "lines": [ + { + "description": "LEGO 4440 Forest Police Station", + "quantity": 1, + "vatRate": "21", + "unitPrice": { + "value": "89.00", + "currency": "EUR" + }, + "discount": null + } + ], + "discount": null, + "amountDue": { + "value": "107.69", + "currency": "EUR" + }, + "subtotalAmount": { + "value": "89.00", + "currency": "EUR" + }, + "totalAmount": { + "value": "107.69", + "currency": "EUR" + }, + "totalVatAmount": { + "value": "18.69", + "currency": "EUR" + }, + "discountedSubtotalAmount": { + "value": "89.00", + "currency": "EUR" + }, + "createdAt": "2024-10-03T10:47:38.457381+00:00", + "issuedAt": null, + "dueAt": null, + "memo": null, + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "invoicePayment": { + "href": "...", + "type": "application/hal+json" + }, + "pdfLink": { + "href": "...", + "type": "application/hal+json" + }, + "documentation": { + "href": "...", + "type": "text/html" + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/session-list.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/session-list.json new file mode 100644 index 0000000..3ffdaa8 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/session-list.json @@ -0,0 +1,53 @@ +{ + "count": 1, + "_embedded": { + "sessions": [ + { + "resource": "session", + "id": "ses_*", + "mode": "live", + "status": "created", + "amount": { + "value": "10.00", + "currency": "EUR" + }, + "description": "Order #12345", + "method": "paypal", + "methodDetails": { + "checkoutFlow": "express" + }, + "nextAction": "redirect", + "createdAt": "2024-01-10T12:06:28+00:00", + "_links": { + "self": { + "href": "https://api.mollie.com/v2/sessions/ses_*", + "type": "application/hal+json" + }, + "redirect": { + "href": "https://paypalc.com/order/dghjfidf;gj", + "type": "application/hal+json" + }, + "documentation": { + "href": "...", + "type": "text/html" + } + } + } + ] + }, + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "previous": null, + "next": { + "href": "https://api.mollie.com/v2/sessions?from=ses_*&limit=5", + "type": "application/hal+json" + }, + "documentation": { + "href": "...", + "type": "text/html" + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/session.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/session.json new file mode 100644 index 0000000..efc2b7b --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/session.json @@ -0,0 +1,31 @@ +{ + "resource": "session", + "id": "{{ RESOURCE_ID }}", + "mode": "live", + "status": "created", + "amount": { + "value": "10.00", + "currency": "EUR" + }, + "description": "Order #12345", + "method": "paypal", + "methodDetails": { + "checkoutFlow": "express" + }, + "nextAction": "redirect", + "createdAt": "2024-01-10T12:06:28+00:00", + "_links": { + "self": { + "href": "https://api.mollie.com/v2/sessions/{{ RESOURCE_ID }}", + "type": "application/hal+json" + }, + "redirect": { + "href": "https://paypalc.com/order/dghjfidf;gj", + "type": "application/hal+json" + }, + "documentation": { + "href": "...", + "type": "text/html" + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/settlement-list.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/settlement-list.json new file mode 100644 index 0000000..e971f99 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/settlement-list.json @@ -0,0 +1,41 @@ +{ + "count": 1, + "_embedded": { + "settlements": [ + { + "resource": "settlement", + "id": "stl_jDk30akdN", + "reference": "1234567.2404.03", + "status": "paidout", + "amount": { + "currency": "EUR", + "value": "39.75" + }, + "balanceId": "bal_3kUf4yU2nT", + "periods": {}, + "settledAt": "2024-04-06T09:41:44.0Z", + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + } + } + } + ] + }, + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "previous": null, + "next": { + "href": "https://api.mollie.com/v2/settlements?from=cst_stTC2WHAuS&limit=5", + "type": "application/hal+json" + }, + "documentation": { + "href": "...", + "type": "text/html" + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/settlement.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/settlement.json new file mode 100644 index 0000000..523b4d0 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/settlement.json @@ -0,0 +1,125 @@ +{ + "resource": "settlement", + "id": "{{ RESOURCE_ID }}", + "reference": "1234567.2404.03", + "status": "paidout", + "amount": { + "currency": "EUR", + "value": "39.75" + }, + "balanceId": "bal_3kUf4yU2nT", + "periods": { + "2024": { + "04": { + "revenue": [ + { + "description": "iDEAL", + "method": "ideal", + "count": 6, + "amountNet": { + "currency": "EUR", + "value": "86.1000" + }, + "amountVat": null, + "amountGross": { + "currency": "EUR", + "value": "86.1000" + } + }, + { + "description": "Refunds iDEAL", + "method": "refund", + "count": 2, + "amountNet": { + "currency": "EUR", + "value": "-43.2000" + }, + "amountVat": null, + "amountGross": { + "currency": "EUR", + "value": "-43.2000" + } + } + ], + "costs": [ + { + "description": "iDEAL", + "method": "ideal", + "count": 6, + "rate": { + "fixed": { + "currency": "EUR", + "value": "0.3500" + }, + "percentage": null + }, + "amountNet": { + "currency": "EUR", + "value": "2.1000" + }, + "amountVat": { + "currency": "EUR", + "value": "0.4410" + }, + "amountGross": { + "currency": "EUR", + "value": "2.5410" + } + }, + { + "description": "Refunds iDEAL", + "method": "refund", + "count": 2, + "rate": { + "fixed": { + "currency": "EUR", + "value": "0.2500" + }, + "percentage": null + }, + "amountNet": { + "currency": "EUR", + "value": "0.5000" + }, + "amountVat": { + "currency": "EUR", + "value": "0.1050" + }, + "amountGross": { + "currency": "EUR", + "value": "0.6050" + } + } + ], + "invoiceId": "inv_FrvewDA3Pr" + } + } + }, + "settledAt": "2024-04-06T09:41:44.0Z", + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "payments": { + "href": "https://api.mollie.com/v2/settlements/{{ RESOURCE_ID }}/payments", + "type": "application/hal+json" + }, + "refunds": { + "href": "https://api.mollie.com/v2/settlements/{{ RESOURCE_ID }}/refunds", + "type": "application/hal+json" + }, + "chargebacks": { + "href": "https://api.mollie.com/v2/settlements/{{ RESOURCE_ID }}/chargebacks", + "type": "application/hal+json" + }, + "captures": { + "href": "https://api.mollie.com/v2/settlements/{{ RESOURCE_ID }}/captures", + "type": "application/hal+json" + }, + "documentation": { + "href": "...", + "type": "text/html" + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/subscription-list.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/subscription-list.json new file mode 100644 index 0000000..c0a47b7 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/subscription-list.json @@ -0,0 +1,53 @@ +{ + "count": 1, + "_embedded": { + "subscriptions": [ + { + "resource": "subscription", + "id": "sub_rVKGtNd6s3", + "mode": "live", + "amount": { + "currency": "EUR", + "value": "25.00" + }, + "times": 4, + "timesRemaining": 4, + "interval": "3 months", + "startDate": "2023-06-01", + "nextPaymentDate": "2023-09-01", + "description": "Quarterly payment", + "method": null, + "status": "active", + "webhookUrl": "https://webshop.example.org/payments/webhook", + "customerId": "cst_stTC2WHAuS", + "mandateId": "mdt_38HS4fsS", + "createdAt": "2023-04-06T13:10:19.0Z", + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "customer": { + "href": "https://api.mollie.com/v2/customers/cst_stTC2WHAuS", + "type": "application/hal+json" + } + } + } + ] + }, + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "previous": null, + "next": { + "href": "https://api.mollie.com/v2/subscriptions?from=sub_mnXbwhMfvo&limit=5", + "type": "application/hal+json" + }, + "documentation": { + "href": "...", + "type": "text/html" + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/subscription.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/subscription.json new file mode 100644 index 0000000..7ff63ff --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/subscription.json @@ -0,0 +1,35 @@ +{ + "resource": "subscription", + "id": "{{ RESOURCE_ID }}", + "mode": "live", + "amount": { + "currency": "EUR", + "value": "25.00" + }, + "times": 4, + "timesRemaining": 4, + "interval": "3 months", + "startDate": "2023-06-01", + "nextPaymentDate": "2023-09-01", + "description": "Quarterly payment", + "method": null, + "status": "active", + "webhookUrl": "https://webshop.example.org/payments/webhook", + "customerId": "cst_stTC2WHAuS", + "mandateId": "mdt_38HS4fsS", + "createdAt": "2023-04-06T13:10:19.0Z", + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "customer": { + "href": "https://api.mollie.com/v2/customers/cst_stTC2WHAuS", + "type": "application/hal+json" + }, + "documentation": { + "href": "...", + "type": "text/html" + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/terminal-list.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/terminal-list.json new file mode 100644 index 0000000..bf081f8 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/terminal-list.json @@ -0,0 +1,41 @@ +{ + "count": 1, + "_embedded": { + "terminals": [ + { + "resource": "terminal", + "id": "term_7MgL4wea46qkRcoTZjWEH", + "mode": "live", + "status": "active", + "brand": "PAX", + "model": "A920", + "serialNumber": "1234567890", + "currency": "EUR", + "description": "Terminal #12345", + "profileId": "pfl_QkEhN94Ba", + "createdAt": "2022-02-12T11:58:35.0Z", + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + } + } + } + ] + }, + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "previous": null, + "next": { + "href": "...", + "type": "application/hal+json" + }, + "documentation": { + "href": "...", + "type": "text/html" + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/terminal.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/terminal.json new file mode 100644 index 0000000..42f91bc --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/terminal.json @@ -0,0 +1,23 @@ +{ + "resource": "terminal", + "id": "{{ RESOURCE_ID }}", + "mode": "live", + "status": "active", + "brand": "PAX", + "model": "A920", + "serialNumber": "1234567890", + "currency": "EUR", + "description": "Terminal #12345", + "profileId": "pfl_QkEhN94Ba", + "createdAt": "2022-02-12T11:58:35.0Z", + "_links": { + "self": { + "href": "...", + "type": "application/hal+json" + }, + "documentation": { + "href": "...", + "type": "text/html" + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/unprocessable-entity.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/unprocessable-entity.json new file mode 100644 index 0000000..1a1617c --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/unprocessable-entity.json @@ -0,0 +1,5 @@ +{ + "status": 422, + "title": "Unprocessable Entity", + "detail": "Non-existent parameter \"recurringType\" for this API call. Did you mean: \"sequenceType\"?" +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/webhook-event.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/webhook-event.json new file mode 100644 index 0000000..8d80d78 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/webhook-event.json @@ -0,0 +1,30 @@ +{ + "resource": "event", + "id": "whe_gQMMaGqAVA", + "type": "payment-link.paid", + "entityId": "pl_4Y0eZitmBnQ5jsBYZIBw", + "createdAt": "2023-12-25T10:30:54+00:00", + "_embedded": { + "entity": { + "id": "pl_4Y0eZitmBnQ5jsBYZIBw", + "resource": "payment-link", + "status": "paid", + "amount": { + "value": "10.00", + "currency": "EUR" + }, + "description": "Test payment link", + "createdAt": "2023-12-25T09:30:54+00:00" + } + }, + "_links": { + "self": { + "href": "https://api.mollie.com/v2/webhook-events/whe_gQMMaGqAVA", + "type": "application/hal+json" + }, + "documentation": { + "href": "https://docs.mollie.com/reference/v2/webhook-events-api/get-webhook-event", + "type": "text/html" + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/webhook-list.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/webhook-list.json new file mode 100644 index 0000000..b746dcc --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/webhook-list.json @@ -0,0 +1,54 @@ +{ + "_embedded": { + "webhooks": [ + { + "resource": "webhook", + "id": "wh_4KgGJJSZpH", + "url": "https://example.com/webhook", + "profileId": "pfl_v9hTwCvYqw", + "createdAt": "2023-12-25T10:30:54+00:00", + "name": "My webhook", + "eventTypes": "payment-link.paid", + "status": "enabled", + "_links": { + "self": { + "href": "https://api.mollie.com/v2/webhooks/wh_4KgGJJSZpH", + "type": "application/hal+json" + } + } + }, + { + "resource": "webhook", + "id": "wh_8KhHNOSdpL", + "url": "https://example.com/webhook2", + "profileId": "pfl_v9hTwCvYqw", + "createdAt": "2023-12-26T10:30:54+00:00", + "name": "My second webhook", + "eventTypes": "profile.verified", + "status": "enabled", + "_links": { + "self": { + "href": "https://api.mollie.com/v2/webhooks/wh_8KhHNOSdpL", + "type": "application/hal+json" + } + } + } + ] + }, + "count": 2, + "_links": { + "documentation": { + "href": "https://docs.mollie.com/reference/v2/webhooks-api/list-webhooks", + "type": "text/html" + }, + "self": { + "href": "https://api.mollie.com/v2/webhooks?limit=50", + "type": "application/hal+json" + }, + "previous": null, + "next": { + "href": "https://api.mollie.com/v2/webhooks?from=wh_8KhHNOSdpL&limit=5", + "type": "application/hal+json" + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/webhook-test.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/webhook-test.json new file mode 100644 index 0000000..8e94288 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/webhook-test.json @@ -0,0 +1,6 @@ +{ + "success": true, + "message": "Webhook test event sent successfully", + "eventId": "whe_gQMMaGqAVA", + "timestamp": "2023-12-25T10:30:54+00:00" +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/Responses/webhook.json b/vendor/mollie/mollie-api-php/src/Fake/Responses/webhook.json new file mode 100644 index 0000000..5d4ba87 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/Responses/webhook.json @@ -0,0 +1,20 @@ +{ + "resource": "webhook", + "id": "wh_4KgGJJSZpH", + "url": "https://example.com/webhook", + "profileId": "pfl_v9hTwCvYqw", + "createdAt": "2023-12-25T10:30:54+00:00", + "name": "My webhook", + "eventTypes": "payment-link.paid", + "status": "enabled", + "_links": { + "self": { + "href": "https://api.mollie.com/v2/webhooks/wh_4KgGJJSZpH", + "type": "application/hal+json" + }, + "documentation": { + "href": "https://docs.mollie.com/reference/v2/webhooks-api/get-webhook", + "type": "text/html" + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Fake/SequenceMockResponse.php b/vendor/mollie/mollie-api-php/src/Fake/SequenceMockResponse.php new file mode 100644 index 0000000..49cb7ef --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Fake/SequenceMockResponse.php @@ -0,0 +1,46 @@ + + */ + private array $responses; + + public function __construct(...$responses) + { + $this->responses = $responses; + } + + /** + * @return Closure|MockResponse + */ + public function shift() + { + if (empty($this->responses)) { + throw new \RuntimeException('No more responses available.'); + } + + $response = array_shift($this->responses); + + return $response; + } + + /** + * @deprecated use shift instead + * @return Closure|MockResponse + */ + public function pop() + { + return $this->shift(); + } + + public function isEmpty(): bool + { + return empty($this->responses); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Adapter/CurlErrorMapper.php b/vendor/mollie/mollie-api-php/src/Http/Adapter/CurlErrorMapper.php new file mode 100644 index 0000000..bd61493 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Adapter/CurlErrorMapper.php @@ -0,0 +1,72 @@ + + */ + private const ERROR_CATEGORIES = [ + // DNS and host resolution issues + CURLE_COULDNT_RESOLVE_HOST => 'DNS resolution failed', + CURLE_COULDNT_RESOLVE_PROXY => 'Proxy resolution failed', + + // Connection issues + CURLE_COULDNT_CONNECT => 'Connection failed', + CURLE_OPERATION_TIMEOUTED => 'Connection timed out', + CURLE_GOT_NOTHING => 'Empty response', + CURLE_RECV_ERROR => 'Network data transfer failed', + + // SSL/TLS issues + CURLE_SSL_CONNECT_ERROR => 'SSL connection failed', + CURLE_SSL_CERTPROBLEM => 'SSL certificate invalid', + CURLE_SSL_CIPHER => 'SSL cipher error', + CURLE_SSL_CACERT => 'SSL CA certificate invalid', + + // Request issues + CURLE_UNSUPPORTED_PROTOCOL => 'Invalid protocol', + CURLE_URL_MALFORMAT => 'Invalid URL', + CURLE_BAD_CONTENT_ENCODING => 'Invalid content encoding', + + // System issues + CURLE_OUT_OF_MEMORY => 'Out of memory', + ]; + + /** + * Errors that are likely temporary and should be retried. + * + * @var array + */ + private const RETRYABLE_ERRORS = [ + CURLE_OPERATION_TIMEOUTED, // Connection or transfer timeout + CURLE_COULDNT_RESOLVE_HOST, // Temporary DNS issues + CURLE_COULDNT_CONNECT, // Server temporarily unreachable + CURLE_GOT_NOTHING, // Server dropped connection + CURLE_RECV_ERROR, // Failure receiving network data + ]; + + public static function toException(int $curlErrorNumber, string $curlErrorMessage, PendingRequest $pendingRequest): NetworkRequestException + { + $category = self::ERROR_CATEGORIES[$curlErrorNumber] ?? 'Unknown error'; + $message = "{$category}: {$curlErrorMessage}"; + + return self::isRetryableError($curlErrorNumber) + ? new RetryableNetworkRequestException($pendingRequest, $message) + : new NetworkRequestException($pendingRequest, null, $message); + } + + /** + * Determines if a CURL error is retryable. + */ + public static function isRetryableError(int $curlErrorNumber): bool + { + return in_array($curlErrorNumber, self::RETRYABLE_ERRORS, true); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Adapter/CurlFactory.php b/vendor/mollie/mollie-api-php/src/Http/Adapter/CurlFactory.php new file mode 100644 index 0000000..6e9005f --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Adapter/CurlFactory.php @@ -0,0 +1,116 @@ +handle = $handle; + $this->pendingRequest = $pendingRequest; + $this->setDefaultOptions(); + } + + public static function new(string $url, PendingRequest $pendingRequest): self + { + $handle = curl_init($url); + if ($handle === false) { + throw new CurlInitializationException($pendingRequest, 'Failed to initialize CURL'); + } + + return new self($handle, $pendingRequest); + } + + private function setDefaultOptions(): self + { + $this->setOption(CURLOPT_RETURNTRANSFER, true); + $this->setOption(CURLOPT_HEADER, true); + $this->setOption(CURLOPT_CONNECTTIMEOUT, self::DEFAULT_CONNECT_TIMEOUT); + $this->setOption(CURLOPT_TIMEOUT, self::DEFAULT_TIMEOUT); + $this->setOption(CURLOPT_SSL_VERIFYPEER, true); + $this->setOption(CURLOPT_CAINFO, CaBundle::getBundledCaBundlePath()); + + return $this; + } + + public function withHeaders(array $headers): self + { + $headers['Content-Type'] = 'application/json'; + $this->setOption(CURLOPT_HTTPHEADER, $this->parseHeaders($headers)); + + return $this; + } + + public function withMethod(string $method, ?string $body): self + { + switch ($method) { + case Method::POST: + $this->setOption(CURLOPT_POST, true); + $this->setOption(CURLOPT_POSTFIELDS, $body); + + break; + + case Method::PATCH: + $this->setOption(CURLOPT_CUSTOMREQUEST, Method::PATCH); + $this->setOption(CURLOPT_POSTFIELDS, $body); + + break; + + case Method::DELETE: + $this->setOption(CURLOPT_CUSTOMREQUEST, Method::DELETE); + $this->setOption(CURLOPT_POSTFIELDS, $body); + + break; + + case Method::GET: + default: + if ($method !== Method::GET) { + throw new \InvalidArgumentException('Invalid HTTP method: '.$method); + } + + break; + } + + return $this; + } + + public function create() + { + return $this->handle; + } + + /** + * @param mixed $value + */ + private function setOption(int $option, $value): void + { + if (curl_setopt($this->handle, $option, $value) === false) { + throw new CurlInitializationException( + $this->pendingRequest, + sprintf('Failed to set CURL option %d', $option) + ); + } + } + + private function parseHeaders(array $headers): array + { + $result = []; + foreach ($headers as $key => $value) { + $result[] = $key.': '.$value; + } + + return $result; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Adapter/CurlInitializationException.php b/vendor/mollie/mollie-api-php/src/Http/Adapter/CurlInitializationException.php new file mode 100644 index 0000000..6d9521c --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Adapter/CurlInitializationException.php @@ -0,0 +1,39 @@ +pendingRequest = $pendingRequest; + $this->plainMessage = $message; + + parent::__construct($message, 0, $previous); + } + + public function getPendingRequest(): PendingRequest + { + return $this->pendingRequest; + } + + public function getPlainMessage(): string + { + return $this->plainMessage; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Adapter/CurlMollieHttpAdapter.php b/vendor/mollie/mollie-api-php/src/Http/Adapter/CurlMollieHttpAdapter.php new file mode 100644 index 0000000..8ad7ee1 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Adapter/CurlMollieHttpAdapter.php @@ -0,0 +1,110 @@ +send($pendingRequest); + + return $this->createResponse($pendingRequest, $statusCode, $headers, $body); + } + + /** + * @return array{0: array, 1: string, 2: int} + * + * @throws NetworkRequestException + */ + protected function send(PendingRequest $pendingRequest): array + { + $curl = null; + $request = $pendingRequest->createPsrRequest(); + + try { + $curl = CurlFactory::new($request->getUri(), $pendingRequest) + ->withHeaders($pendingRequest->headers()->all()) + ->withMethod($pendingRequest->method(), $request->getBody()) + ->create(); + + $response = curl_exec($curl); + + if ($response === false) { + $curlErrorNumber = curl_errno($curl); + $curlErrorMessage = 'Curl error: '.curl_error($curl); + + throw CurlErrorMapper::toException($curlErrorNumber, $curlErrorMessage, $pendingRequest); + } + + return $this->extractResponseDetails($curl, $response); + } finally { + if ($curl !== null) { + curl_close($curl); + } + } + } + + protected function createResponse(PendingRequest $pendingRequest, int $statusCode, $headers = [], $body = null, ?Throwable $error = null): Response + { + $factoryCollection = $pendingRequest->getFactoryCollection(); + $responseFactory = $factoryCollection->responseFactory; + + $response = $responseFactory->createResponse($statusCode) + ->withBody($factoryCollection->streamFactory->createStream($body)); + + foreach ($headers as $key => $value) { + $response = $response->withHeader($key, $value); + } + + return new Response( + $response, + $pendingRequest->createPsrRequest(), + $pendingRequest, + $error + ); + } + + /** + * @return array{0: array, 1: string, 2: int} + */ + private function extractResponseDetails($curl, string $response): array + { + $headerSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE); + $headerValues = substr($response, 0, $headerSize); + $content = substr($response, $headerSize); + $statusCode = curl_getinfo($curl, CURLINFO_RESPONSE_CODE); + + $headers = []; + $headerLines = explode("\r\n", $headerValues); + foreach ($headerLines as $headerLine) { + if (strpos($headerLine, ':') !== false) { + [$key, $value] = explode(': ', $headerLine, 2); + $headers[$key] = $value; + } + } + + return [$headers, $content, $statusCode]; + } + + /** + * The version number for the underlying http client, if available. + * + * @example Guzzle/6.3 + */ + public function version(): string + { + return 'Curl/*'; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Adapter/GuzzleMollieHttpAdapter.php b/vendor/mollie/mollie-api-php/src/Http/Adapter/GuzzleMollieHttpAdapter.php new file mode 100644 index 0000000..5441e10 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Adapter/GuzzleMollieHttpAdapter.php @@ -0,0 +1,112 @@ +httpClient = $httpClient; + } + + public function factories(): Factories + { + $factory = new HttpFactory; + + return new Factories( + $factory, + $factory, + $factory, + $factory, + ); + } + + /** + * Create a preconfigured Guzzle adapter. + */ + public static function createClient(): self + { + $handlerStack = HandlerStack::create(); + + $client = new Client([ + RequestOptions::VERIFY => CaBundle::getBundledCaBundlePath(), + RequestOptions::TIMEOUT => self::DEFAULT_TIMEOUT, + RequestOptions::CONNECT_TIMEOUT => self::DEFAULT_CONNECT_TIMEOUT, + RequestOptions::HTTP_ERRORS => false, + 'handler' => $handlerStack, + ]); + + return new GuzzleMollieHttpAdapter($client); + } + + /** + * @throws NetworkRequestException + * @throws RetryableNetworkRequestException + */ + public function sendRequest(PendingRequest $pendingRequest): Response + { + $request = $pendingRequest->createPsrRequest(); + + try { + $response = $this->httpClient->send($request); + + return $this->createResponse($response, $request, $pendingRequest); + } catch (ConnectException $e) { + throw new RetryableNetworkRequestException($pendingRequest, $e->getMessage()); + } catch (TooManyRedirectsException $e) { + throw new NetworkRequestException($pendingRequest, $e, $e->getMessage()); + } catch (RequestException $e) { + if ($response = $e->getResponse()) { + return $this->createResponse($response, $request, $pendingRequest, $e); + } + + throw new RetryableNetworkRequestException($pendingRequest, $e->getMessage()); + } + } + + protected function createResponse( + ResponseInterface $psrResponse, + RequestInterface $psrRequest, + PendingRequest $pendingRequest, + ?Throwable $exception = null + ): Response { + return new Response($psrResponse, $psrRequest, $pendingRequest, $exception); + } + + public function version(): string + { + return 'Guzzle/'.ClientInterface::MAJOR_VERSION; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Adapter/MollieHttpAdapterPicker.php b/vendor/mollie/mollie-api-php/src/Http/Adapter/MollieHttpAdapterPicker.php new file mode 100644 index 0000000..387c5ee --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Adapter/MollieHttpAdapterPicker.php @@ -0,0 +1,46 @@ +createDefaultAdapter(); + } + + if ($httpClient instanceof HttpAdapterContract) { + return $httpClient; + } + + if ($httpClient instanceof \GuzzleHttp\ClientInterface) { + return new GuzzleMollieHttpAdapter($httpClient); + } + + throw new UnrecognizedClientException('The provided http client or adapter was not recognized.'); + } + + private function createDefaultAdapter(): HttpAdapterContract + { + if ($this->guzzleIsDetected()) { + return GuzzleMollieHttpAdapter::createClient(); + } + + return new CurlMollieHttpAdapter; + } + + private function guzzleIsDetected(): bool + { + return interface_exists('\\'.\GuzzleHttp\ClientInterface::class); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Adapter/PSR18MollieHttpAdapter.php b/vendor/mollie/mollie-api-php/src/Http/Adapter/PSR18MollieHttpAdapter.php new file mode 100644 index 0000000..d7058c1 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Adapter/PSR18MollieHttpAdapter.php @@ -0,0 +1,119 @@ +httpClient = $httpClient; + $this->requestFactory = $requestFactory; + $this->responseFactory = $responseFactory; + $this->streamFactory = $streamFactory; + $this->uriFactory = $uriFactory; + } + + public function factories(): Factories + { + return $this->factories ??= new Factories( + $this->requestFactory, + $this->responseFactory, + $this->streamFactory, + $this->uriFactory, + ); + } + + /** + * Send a request using a PSR-18 compatible HTTP client. + * + * @throws NetworkRequestException When a network error occurs + * @throws RetryableNetworkRequestException When a temporary network error occurs + * @throws RequestException When the request fails with a response + */ + public function sendRequest(PendingRequest $pendingRequest): Response + { + $request = $pendingRequest->createPsrRequest(); + + try { + $response = $this->httpClient->sendRequest($request); + + return $this->createResponse($response, $request, $pendingRequest); + } catch (NetworkExceptionInterface $e) { + // PSR-18 NetworkExceptionInterface indicates network errors, which are retryable + throw new RetryableNetworkRequestException( + $pendingRequest, + 'Network error: '.$e->getMessage() + ); + } catch (RequestExceptionInterface $e) { + if (method_exists($e, 'getResponse') && $response = $e->getResponse()) { + return $this->createResponse($response, $request, $pendingRequest, $e); + } + + throw new RetryableNetworkRequestException( + $pendingRequest, + 'Network error: '.$e->getMessage() + ); + } + } + + protected function createResponse( + ResponseInterface $psrResponse, + RequestInterface $psrRequest, + PendingRequest $pendingRequest, + ?Throwable $exception = null + ): Response { + return new Response( + $psrResponse, + $psrRequest, + $pendingRequest, + $exception + ); + } + + /** + * Get the version string for the HTTP client implementation. + * This is used in the User-Agent header. + */ + public function version(): string + { + $clientClass = get_class($this->httpClient); + $clientName = substr($clientClass, strrpos($clientClass, '\\') + 1); + + return 'PSR18/'.$clientName; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Auth/AccessTokenAuthenticator.php b/vendor/mollie/mollie-api-php/src/Http/Auth/AccessTokenAuthenticator.php new file mode 100644 index 0000000..9030eef --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Auth/AccessTokenAuthenticator.php @@ -0,0 +1,18 @@ +isTestToken = strpos($token, 'test_') === 0; + + parent::__construct($token); + } + + public function isTestToken(): bool + { + return $this->isTestToken; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Auth/BearerTokenAuthenticator.php b/vendor/mollie/mollie-api-php/src/Http/Auth/BearerTokenAuthenticator.php new file mode 100644 index 0000000..f0c45ea --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Auth/BearerTokenAuthenticator.php @@ -0,0 +1,22 @@ +token = trim($token); + } + + public function authenticate(PendingRequest $pendingRequest): void + { + $pendingRequest->headers()->add('Authorization', "Bearer {$this->token}"); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Auth/TokenValidator.php b/vendor/mollie/mollie-api-php/src/Http/Auth/TokenValidator.php new file mode 100644 index 0000000..0c774f1 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Auth/TokenValidator.php @@ -0,0 +1,19 @@ +title = $title; + $this->givenName = $givenName; + $this->familyName = $familyName; + $this->organizationName = $organizationName; + $this->streetAndNumber = $streetAndNumber; + $this->streetAdditional = $streetAdditional; + $this->postalCode = $postalCode; + $this->email = $email; + $this->phone = $phone; + $this->city = $city; + $this->region = $region; + $this->country = $country; + } + + public function toArray(): array + { + return [ + 'title' => $this->title, + 'givenName' => $this->givenName, + 'familyName' => $this->familyName, + 'organizationName' => $this->organizationName, + 'streetAndNumber' => $this->streetAndNumber, + 'streetAdditional' => $this->streetAdditional, + 'postalCode' => $this->postalCode, + 'email' => $this->email, + 'phone' => $this->phone, + 'city' => $this->city, + 'region' => $this->region, + 'country' => $this->country, + ]; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Data/ApplicationFee.php b/vendor/mollie/mollie-api-php/src/Http/Data/ApplicationFee.php new file mode 100644 index 0000000..0b66a5e --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Data/ApplicationFee.php @@ -0,0 +1,28 @@ +amount = $amount; + $this->description = $description; + } + + public function toArray(): array + { + return [ + 'amount' => $this->amount, + 'description' => $this->description, + ]; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Data/DataCollection.php b/vendor/mollie/mollie-api-php/src/Http/Data/DataCollection.php new file mode 100644 index 0000000..8cba43e --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Data/DataCollection.php @@ -0,0 +1,132 @@ + + */ + public array $items; + + /** + * @param array $items + */ + public function __construct(array $items) + { + $this->items = $items; + } + + public function getIterator(): Traversable + { + return new ArrayIterator($this->items); + } + + public static function collect(array $items): self + { + return new static($items); + } + + public function count(): int + { + return count($this->items); + } + + /** + * @param mixed $subject + */ + public static function wrap($subject): self + { + if ($subject instanceof static) { + return $subject; + } + + if ($subject instanceof Arrayable) { + return new static($subject->toArray()); + } + + return new static(Arr::wrap($subject)); + } + + public function values(): self + { + return new static(array_values($this->items)); + } + + public function toArray(): array + { + return $this->items; + } + + /** + * @return mixed + */ + public function pipe(callable $callback) + { + return $callback($this); + } + + public function each(callable $callback): self + { + foreach ($this as $key => $item) { + if ($callback($item, $key) === false) { + break; + } + } + + return $this; + } + + public function map(callable $callback): self + { + return new static(Arr::map($this->items, $callback)); + } + + public function filter($callback = null): self + { + /** + * PHP 7.4 and below does not support nullable callbacks. + */ + if ($callback === null) { + return new static(array_filter($this->items)); + } + + return new static(array_filter($this->items, $callback)); + } + + public function isEmpty(): bool + { + return empty($this->items); + } + + /** + * Determine if the collection contains a given item. + * + * @param mixed $value + */ + public function contains($value): bool + { + if ($value instanceof \Closure) { + foreach ($this->items as $item) { + if ($value($item)) { + return true; + } + } + + return false; + } + + return in_array($value, $this->items, true); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Data/Date.php b/vendor/mollie/mollie-api-php/src/Http/Data/Date.php new file mode 100644 index 0000000..ccdb094 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Data/Date.php @@ -0,0 +1,13 @@ +type = $type; + $this->value = $value; + } + + public function toArray(): array + { + return [ + 'type' => $this->type, + 'value' => $this->value, + ]; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Data/EmailDetails.php b/vendor/mollie/mollie-api-php/src/Http/Data/EmailDetails.php new file mode 100644 index 0000000..e96b5e1 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Data/EmailDetails.php @@ -0,0 +1,31 @@ +subject = $subject; + $this->body = $body; + } + + public function toArray(): array + { + return [ + 'subject' => $this->subject, + 'body' => $this->body, + ]; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Data/InvoiceLine.php b/vendor/mollie/mollie-api-php/src/Http/Data/InvoiceLine.php new file mode 100644 index 0000000..c4febc1 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Data/InvoiceLine.php @@ -0,0 +1,43 @@ +description = $description; + $this->quantity = $quantity; + $this->vatRate = $vatRate; + $this->unitPrice = $unitPrice; + $this->discount = $discount; + } + + public function toArray(): array + { + return [ + 'description' => $this->description, + 'quantity' => $this->quantity, + 'vatRate' => $this->vatRate, + 'unitPrice' => $this->unitPrice, + 'discount' => $this->discount, + ]; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Data/Money.php b/vendor/mollie/mollie-api-php/src/Http/Data/Money.php new file mode 100644 index 0000000..553a4a6 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Data/Money.php @@ -0,0 +1,31 @@ +currency = $currency; + $this->value = $value; + } + + public function toArray(): array + { + return [ + 'currency' => $this->currency, + 'value' => $this->value, + ]; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Data/OrderLine.php b/vendor/mollie/mollie-api-php/src/Http/Data/OrderLine.php new file mode 100644 index 0000000..0b03897 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Data/OrderLine.php @@ -0,0 +1,83 @@ +description = $description; + $this->quantity = $quantity; + $this->unitPrice = $unitPrice; + $this->totalAmount = $totalAmount; + $this->type = $type; + $this->quantityUnit = $quantityUnit; + $this->discountAmount = $discountAmount; + $this->recurring = $recurring; + $this->vatRate = $vatRate; + $this->vatAmount = $vatAmount; + $this->sku = $sku; + $this->imageUrl = $imageUrl; + $this->productUrl = $productUrl; + } + + public function toArray(): array + { + return [ + 'description' => $this->description, + 'quantity' => $this->quantity, + 'unitPrice' => $this->unitPrice, + 'totalAmount' => $this->totalAmount, + 'type' => $this->type, + 'quantityUnit' => $this->quantityUnit, + 'discountAmount' => $this->discountAmount, + 'recurring' => $this->recurring, + 'vatRate' => $this->vatRate, + 'vatAmount' => $this->vatAmount, + 'sku' => $this->sku, + 'imageUrl' => $this->imageUrl, + 'productUrl' => $this->productUrl, + ]; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Data/Owner.php b/vendor/mollie/mollie-api-php/src/Http/Data/Owner.php new file mode 100644 index 0000000..edc493f --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Data/Owner.php @@ -0,0 +1,41 @@ +email = $email; + $this->givenName = $givenName; + $this->familyName = $familyName; + $this->locale = $locale; + } + + public function toArray(): array + { + return [ + 'email' => $this->email, + 'givenName' => $this->givenName, + 'familyName' => $this->familyName, + 'locale' => $this->locale, + ]; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Data/OwnerAddress.php b/vendor/mollie/mollie-api-php/src/Http/Data/OwnerAddress.php new file mode 100644 index 0000000..03c2790 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Data/OwnerAddress.php @@ -0,0 +1,46 @@ +country = $country; + $this->streetAndNumber = $streetAndNumber; + $this->postalCode = $postalCode; + $this->city = $city; + $this->region = $region; + } + + public function toArray(): array + { + return [ + 'country' => $this->country, + 'streetAndNumber' => $this->streetAndNumber, + 'postalCode' => $this->postalCode, + 'city' => $this->city, + 'region' => $this->region, + ]; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Data/PaginatedQuery.php b/vendor/mollie/mollie-api-php/src/Http/Data/PaginatedQuery.php new file mode 100644 index 0000000..98efcf3 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Data/PaginatedQuery.php @@ -0,0 +1,28 @@ +from = $from; + $this->limit = $limit; + } + + public function toArray(): array + { + return [ + 'from' => $this->from, + 'limit' => $this->limit, + ]; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Data/PaymentDetails.php b/vendor/mollie/mollie-api-php/src/Http/Data/PaymentDetails.php new file mode 100644 index 0000000..38d3baa --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Data/PaymentDetails.php @@ -0,0 +1,31 @@ +source = $source; + $this->sourceDescription = $sourceDescription; + } + + public function toArray(): array + { + return [ + 'source' => $this->source, + 'sourceDescription' => $this->sourceDescription, + ]; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Data/PaymentRoute.php b/vendor/mollie/mollie-api-php/src/Http/Data/PaymentRoute.php new file mode 100644 index 0000000..6e635d8 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Data/PaymentRoute.php @@ -0,0 +1,40 @@ +amount = $amount; + $this->organizationId = $organizationId; + $this->delayUntil = $delayUntil; + } + + public function toArray(): array + { + return [ + 'amount' => $this->amount, + 'destination' => [ + 'type' => 'organization', + 'organizationId' => $this->organizationId, + ], + 'delayUntil' => $this->delayUntil, + ]; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Data/Recipient.php b/vendor/mollie/mollie-api-php/src/Http/Data/Recipient.php new file mode 100644 index 0000000..394f7c6 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Data/Recipient.php @@ -0,0 +1,98 @@ +type = $type; + $this->title = $title; + $this->givenName = $givenName; + $this->familyName = $familyName; + $this->organizationName = $organizationName; + $this->organizationNumber = $organizationNumber; + $this->vatNumber = $vatNumber; + $this->email = $email; + $this->phone = $phone; + $this->streetAndNumber = $streetAndNumber; + $this->streetAdditional = $streetAdditional; + $this->postalCode = $postalCode; + $this->city = $city; + $this->region = $region; + $this->country = $country; + $this->locale = $locale; + } + + public function toArray(): array + { + return [ + 'type' => $this->type, + 'title' => $this->title, + 'givenName' => $this->givenName, + 'familyName' => $this->familyName, + 'organizationName' => $this->organizationName, + 'organizationNumber' => $this->organizationNumber, + 'vatNumber' => $this->vatNumber, + 'email' => $this->email, + 'phone' => $this->phone, + 'streetAndNumber' => $this->streetAndNumber, + 'streetAdditional' => $this->streetAdditional, + 'postalCode' => $this->postalCode, + 'city' => $this->city, + 'region' => $this->region, + 'country' => $this->country, + 'locale' => $this->locale, + ]; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Data/RecurringBillingCycle.php b/vendor/mollie/mollie-api-php/src/Http/Data/RecurringBillingCycle.php new file mode 100644 index 0000000..b3f5765 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Data/RecurringBillingCycle.php @@ -0,0 +1,49 @@ +interval = $interval; + $this->description = $description; + $this->amount = $amount; + $this->times = $times; + $this->startDate = $startDate; + } + + public function toArray(): array + { + return [ + 'interval' => $this->interval, + 'description' => $this->description, + 'amount' => $this->amount, + 'times' => $this->times, + 'startDate' => $this->startDate, + ]; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Data/RefundRoute.php b/vendor/mollie/mollie-api-php/src/Http/Data/RefundRoute.php new file mode 100644 index 0000000..7264239 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Data/RefundRoute.php @@ -0,0 +1,31 @@ +amount = $amount; + $this->organizationId = $organizationId; + } + + public function toArray(): array + { + return [ + 'amount' => $this->amount, + 'source' => [ + 'type' => 'organization', + 'organizationId' => $this->organizationId, + ], + ]; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Data/SortablePaginatedQuery.php b/vendor/mollie/mollie-api-php/src/Http/Data/SortablePaginatedQuery.php new file mode 100644 index 0000000..874f489 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Data/SortablePaginatedQuery.php @@ -0,0 +1,28 @@ +sort = $sort; + } + + public function toArray(): array + { + return array_merge( + parent::toArray(), + [ + 'sort' => $this->sort, + ] + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Data/Temporal.php b/vendor/mollie/mollie-api-php/src/Http/Data/Temporal.php new file mode 100644 index 0000000..7b972d4 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Data/Temporal.php @@ -0,0 +1,50 @@ +guardInvalidDate($date); + } + + /** @var DateTimeInterface $date */ + $this->date = $date; + } + + abstract protected function getFormat(): string; + + public function __toString(): string + { + return $this->date->format($this->getFormat()); + } + + public function getRaw(): DateTimeInterface + { + return $this->date; + } + + /** + * @param DateTimeInterface|false $date + */ + private function guardInvalidDate($date): void + { + if ($date === false) { + throw new InvalidArgumentException('Invalid date format'); + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Data/TransferParty.php b/vendor/mollie/mollie-api-php/src/Http/Data/TransferParty.php new file mode 100644 index 0000000..8c99be7 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Data/TransferParty.php @@ -0,0 +1,36 @@ +id = $id; + $this->description = $description; + $this->type = $type; + } + + public function toArray(): array + { + return [ + 'type' => $this->type, + 'id' => $this->id, + 'description' => $this->description, + ]; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/LinearRetryStrategy.php b/vendor/mollie/mollie-api-php/src/Http/LinearRetryStrategy.php new file mode 100644 index 0000000..ce0dc6c --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/LinearRetryStrategy.php @@ -0,0 +1,34 @@ +maxRetries = max(0, $maxRetries); + $this->delayIncreaseMs = max(0, $delayIncreaseMs); + } + + public function maxRetries(): int + { + return $this->maxRetries; + } + + public function delayBeforeAttemptMs(int $attempt): int + { + // $attempt starts at 1 for the first retry + return max(0, $attempt) * $this->delayIncreaseMs; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Middleware.php b/vendor/mollie/mollie-api-php/src/Http/Middleware.php new file mode 100644 index 0000000..7957750 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Middleware.php @@ -0,0 +1,115 @@ +onRequest = new Handlers; + $this->onResponse = new Handlers; + $this->onFatal = new Handlers; + } + + public function onRequest(callable $callback, ?string $name = null, string $priority = MiddlewarePriority::MEDIUM): self + { + $this->onRequest->add(static function (PendingRequest $pendingRequest) use ($callback): PendingRequest { + $result = $callback($pendingRequest); + + if ($result instanceof PendingRequest) { + return $result; + } + + return $pendingRequest; + }, $name, $priority); + + return $this; + } + + public function onResponse(callable $callback, ?string $name = null, string $priority = MiddlewarePriority::MEDIUM): self + { + /** @param Response|IsResponseAware $response */ + $this->onResponse->add(static function ($response) use ($callback) { + $result = $callback($response); + + return $result instanceof Response + || $result instanceof ViableResponse + ? $result + : $response; + }, $name, $priority); + + return $this; + } + + public function onFatal(callable $callback, ?string $name = null, string $priority = MiddlewarePriority::MEDIUM): self + { + $this->onFatal->add(static function (MollieException $exception) use ($callback) { + $callback($exception); + + return $exception; + }, $name, $priority); + + return $this; + } + + public function executeOnRequest(PendingRequest $pendingRequest): PendingRequest + { + return $this->onRequest->execute($pendingRequest); + } + + /** + * @return Response|ViableResponse + */ + public function executeOnResponse(Response $response) + { + return $this->onResponse->execute($response); + } + + public function executeOnFatal(MollieException $exception): MollieException + { + return $this->onFatal->execute($exception); + } + + /** + * @param array ...$handlersCollection + */ + public function merge(...$handlersCollection): self + { + /** @var Middleware $handlers */ + foreach ($handlersCollection as $handlers) { + $onRequestHandlers = array_merge( + $this->onRequest->getHandlers(), + $handlers->onRequest->getHandlers() + ); + + $this->onRequest->setHandlers($onRequestHandlers); + + $onResponseHandlers = array_merge( + $this->onResponse->getHandlers(), + $handlers->onResponse->getHandlers() + ); + + $this->onResponse->setHandlers($onResponseHandlers); + + $onFatalHandlers = array_merge( + $this->onFatal->getHandlers(), + $handlers->onFatal->getHandlers() + ); + $this->onFatal->setHandlers($onFatalHandlers); + } + + return $this; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Middleware/ApplyIdempotencyKey.php b/vendor/mollie/mollie-api-php/src/Http/Middleware/ApplyIdempotencyKey.php new file mode 100644 index 0000000..0f5cf94 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Middleware/ApplyIdempotencyKey.php @@ -0,0 +1,42 @@ +isMutatingRequest($pendingRequest)) { + $pendingRequest->headers()->remove(self::IDEMPOTENCY_KEY_HEADER); + + return $pendingRequest; + } + + $idempotencyKey = $pendingRequest->getConnector()->getIdempotencyKey(); + $idempotencyKeyGenerator = $pendingRequest->getConnector()->getIdempotencyKeyGenerator(); + + if ($idempotencyKey === null && $idempotencyKeyGenerator === null) { + return $pendingRequest; + } + + /** @var IdempotencyKeyGeneratorContract $idempotencyKeyGenerator */ + $pendingRequest->headers()->add( + self::IDEMPOTENCY_KEY_HEADER, + $idempotencyKey ?? $idempotencyKeyGenerator->generate() + ); + + return $pendingRequest; + } + + private function isMutatingRequest(PendingRequest $pendingRequest): bool + { + return in_array($pendingRequest->method(), [Method::POST, Method::PATCH, Method::DELETE]); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Middleware/ConvertResponseToException.php b/vendor/mollie/mollie-api-php/src/Http/Middleware/ConvertResponseToException.php new file mode 100644 index 0000000..3a8993d --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Middleware/ConvertResponseToException.php @@ -0,0 +1,49 @@ +successful()) { + return; + } + + $status = $response->status(); + + switch ($status) { + case ResponseStatusCode::HTTP_UNAUTHORIZED: + throw UnauthorizedException::fromResponse($response); + case ResponseStatusCode::HTTP_FORBIDDEN: + throw ForbiddenException::fromResponse($response); + case ResponseStatusCode::HTTP_NOT_FOUND: + throw NotFoundException::fromResponse($response); + case ResponseStatusCode::HTTP_METHOD_NOT_ALLOWED: + throw MethodNotAllowedException::fromResponse($response); + case ResponseStatusCode::HTTP_REQUEST_TIMEOUT: + throw RequestTimeoutException::fromResponse($response); + case ResponseStatusCode::HTTP_UNPROCESSABLE_ENTITY: + throw ValidationException::fromResponse($response); + case ResponseStatusCode::HTTP_TOO_MANY_REQUESTS: + throw TooManyRequestsException::fromResponse($response); + case ResponseStatusCode::HTTP_SERVICE_UNAVAILABLE: + throw ServiceUnavailableException::fromResponse($response); + default: + throw ApiException::fromResponse($response); + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Middleware/Handler.php b/vendor/mollie/mollie-api-php/src/Http/Middleware/Handler.php new file mode 100644 index 0000000..b3cc7ee --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Middleware/Handler.php @@ -0,0 +1,36 @@ +callback = $callback; + $this->name = $name; + $this->priority = $priority; + } + + public function callback(): callable + { + return $this->callback; + } + + public function name(): ?string + { + return $this->name; + } + + public function priority(): string + { + return $this->priority; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Middleware/Handlers.php b/vendor/mollie/mollie-api-php/src/Http/Middleware/Handlers.php new file mode 100644 index 0000000..c3d99c9 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Middleware/Handlers.php @@ -0,0 +1,81 @@ + + */ + protected array $handlers = []; + + public function add(callable $handler, ?string $name = null, string $priority = MiddlewarePriority::MEDIUM): void + { + if (in_array($name, [MiddlewarePriority::HIGH, MiddlewarePriority::MEDIUM, MiddlewarePriority::LOW])) { + $priority = $name; + $name = null; + } + + if (is_string($name) && $this->handlerExists($name)) { + throw new \InvalidArgumentException("Handler with name '{$name}' already exists."); + } + + $this->handlers[] = new Handler($handler, $name, $priority); + } + + public function setHandlers(array $handlers): void + { + $this->handlers = $handlers; + } + + public function getHandlers(): array + { + return $this->handlers; + } + + /** + * Execute the handlers + * + * @param mixed $payload + * @return mixed + */ + public function execute($payload) + { + /** @var Handler $handler */ + foreach ($this->sortHandlers() as $handler) { + $payload = call_user_func($handler->callback(), $payload); + } + + return $payload; + } + + protected function sortHandlers(): array + { + $highPriority = []; + $mediumPriority = []; + $lowPriority = []; + + $priorityMap = [ + MiddlewarePriority::HIGH => &$highPriority, + MiddlewarePriority::MEDIUM => &$mediumPriority, + MiddlewarePriority::LOW => &$lowPriority, + ]; + + foreach ($this->handlers as $handler) { + $priorityMap[$handler->priority()][] = $handler; + } + + return array_merge($highPriority, $mediumPriority, $lowPriority); + } + + private function handlerExists(string $name): bool + { + foreach ($this->handlers as $handler) { + if ($handler->name() === $name) { + return true; + } + } + + return false; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Middleware/Hydrate.php b/vendor/mollie/mollie-api-php/src/Http/Middleware/Hydrate.php new file mode 100644 index 0000000..e9bf0d8 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Middleware/Hydrate.php @@ -0,0 +1,23 @@ +getRequest(); + + if (! $response->isEmpty() && $request instanceof ResourceHydratableRequest && $request->isHydratable()) { + return (new ResourceResolver(new ResourceHydrator))->resolve($request, $response); + } + + return $response; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Middleware/MiddlewarePriority.php b/vendor/mollie/mollie-api-php/src/Http/Middleware/MiddlewarePriority.php new file mode 100644 index 0000000..1531067 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Middleware/MiddlewarePriority.php @@ -0,0 +1,12 @@ +getConnector()->resetIdempotencyKey(); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/PendingRequest.php b/vendor/mollie/mollie-api-php/src/Http/PendingRequest.php new file mode 100644 index 0000000..d0db5c7 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/PendingRequest.php @@ -0,0 +1,153 @@ +factoryCollection = $connector->getHttpClient()->factories(); + + $this->connector = $connector; + $this->request = $request; + + $this->method = $request->getMethod(); + $this->url = Url::join($connector->resolveBaseUrl(), $request->resolveResourcePath()); + + $this + ->tap(new SetUserAgent) + ->tap(new MergeRequestProperties) + ->tap(new MergeBody) + ->tap(new AuthenticateRequest) + ->tap(new HandleTestmode); + + $this + ->middleware() + + /** On request */ + ->onRequest(new ApplyIdempotencyKey, 'idempotency') + + /** On response */ + ->onResponse(new ResetIdempotencyKey, 'idempotency') + ->onResponse(new ConvertResponseToException, MiddlewarePriority::HIGH) + ->onResponse(new Hydrate, 'hydrate', MiddlewarePriority::LOW) + + /** Merge the middleware */ + ->merge($connector->middleware(), $request->middleware()); + } + + /** + * We are returning on whether the request is actually + * made in testmode and not if the request is sent with a + * testmode parameter. This allows the developer to react to requests + * being made in testmode independent of the testmode parameter being set. + */ + public function getTestmode(): bool + { + if ($this->connector->getTestmode() || $this->request->getTestmode()) { + return true; + } + + $authenticator = $this->connector->getAuthenticator(); + + if (! $authenticator instanceof ApiKeyAuthenticator) { + return false; + } + + return $authenticator->isTestToken(); + } + + public function setPayload(PayloadRepository $bodyRepository): self + { + $this->payload = $bodyRepository; + + return $this; + } + + public function payload(): ?PayloadRepository + { + return $this->payload; + } + + public function url(): string + { + return $this->url; + } + + public function method(): string + { + return $this->method; + } + + public function getConnector(): Connector + { + return $this->connector; + } + + public function getRequest(): Request + { + return $this->request; + } + + public function executeRequestHandlers(): self + { + return $this->middleware()->executeOnRequest($this); + } + + /** + * @return Response|IsResponseAware + */ + public function executeResponseHandlers(Response $response) + { + return $this->middleware()->executeOnResponse($response); + } + + public function executeFatalHandlers(MollieException $exception): MollieException + { + return $this->middleware()->executeOnFatal($exception); + } + + protected function tap(callable $callable): self + { + $callable($this); + + return $this; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/PendingRequest/AuthenticateRequest.php b/vendor/mollie/mollie-api-php/src/Http/PendingRequest/AuthenticateRequest.php new file mode 100644 index 0000000..8b57198 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/PendingRequest/AuthenticateRequest.php @@ -0,0 +1,22 @@ +getConnector()->getAuthenticator(); + + if (! $authenticator) { + throw new MissingAuthenticationException; + } + + $authenticator->authenticate($pendingRequest); + + return $pendingRequest; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/PendingRequest/HandleTestmode.php b/vendor/mollie/mollie-api-php/src/Http/PendingRequest/HandleTestmode.php new file mode 100644 index 0000000..f6fdff8 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/PendingRequest/HandleTestmode.php @@ -0,0 +1,64 @@ +getConnector(); + $authenticator = $connector->getAuthenticator(); + + if ($authenticator instanceof ApiKeyAuthenticator) { + $this->removeTestmode($pendingRequest); + } elseif ($connector->getTestmode() || $pendingRequest->getRequest()->getTestmode()) { + $this->applyTestmode($pendingRequest); + } + + return $pendingRequest; + } + + private function applyTestmode(PendingRequest $pendingRequest): void + { + $request = $pendingRequest->getRequest(); + + if (! $request instanceof SupportsTestmode) { + return; + } + + if ($request instanceof SupportsTestmodeInQuery) { + $pendingRequest->query()->add('testmode', true); + } elseif ($request instanceof SupportsTestmodeInPayload) { + /** @var PayloadRepository $payload */ + $payload = $pendingRequest->payload(); + + $payload->add('testmode', true); + } + } + + private function removeTestmode(PendingRequest $pendingRequest): void + { + if ($pendingRequest->getRequest() instanceof SupportsTestmodeInQuery) { + $pendingRequest->query()->remove('testmode'); + } + + if (! $pendingRequest->getRequest() instanceof SupportsTestmodeInPayload) { + return; + } + + $payload = $pendingRequest->payload(); + + if ($payload === null) { + return; + } + + $payload->remove('testmode'); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/PendingRequest/MergeBody.php b/vendor/mollie/mollie-api-php/src/Http/PendingRequest/MergeBody.php new file mode 100644 index 0000000..63af66e --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/PendingRequest/MergeBody.php @@ -0,0 +1,28 @@ +getRequest(); + + if (! $request instanceof HasPayload) { + return $pendingRequest; + } + + $body = $request->payload(); + + $pendingRequest->setPayload($body); + + if (! $pendingRequest->headers()->get('Content-Type')) { + $pendingRequest->headers()->add('Content-Type', 'application/json'); + } + + return $pendingRequest; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/PendingRequest/MergeRequestProperties.php b/vendor/mollie/mollie-api-php/src/Http/PendingRequest/MergeRequestProperties.php new file mode 100644 index 0000000..708e55e --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/PendingRequest/MergeRequestProperties.php @@ -0,0 +1,30 @@ +getConnector(); + $request = $pendingRequest->getRequest(); + + $pendingRequest + ->headers() + ->merge( + $client->headers()->all(), + $request->headers()->all() + ); + + $pendingRequest + ->query() + ->merge( + $client->query()->all(), + $request->query()->all() + ); + + return $pendingRequest; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/PendingRequest/SetUserAgent.php b/vendor/mollie/mollie-api-php/src/Http/PendingRequest/SetUserAgent.php new file mode 100644 index 0000000..55e3418 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/PendingRequest/SetUserAgent.php @@ -0,0 +1,25 @@ +getConnector()->getVersionStrings(), ' '); + + $authenticator = $pendingRequest->getConnector()->getAuthenticator(); + + if ($authenticator instanceof AccessTokenAuthenticator) { + $userAgent .= ' Auth/Token'; + } + + $pendingRequest->headers()->add('User-Agent', $userAgent); + + return $pendingRequest; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Request.php b/vendor/mollie/mollie-api-php/src/Http/Request.php new file mode 100644 index 0000000..62cd920 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Request.php @@ -0,0 +1,39 @@ +getResponse(); + $pendingRequest = $response->getPendingRequest(); + $request = $response->getPsrRequest(); + + // Clear any sensitive payload data + $pendingRequest->setPayload(new JsonPayloadRepository); + + // Remove sensitive headers and create a new sanitized request + foreach ($this->sensitiveHeaders as $header) { + if ($request->hasHeader($header)) { + $request = $request->withoutHeader($header); + } + } + + // Update the PSR request in the response using reflection since it's protected + $reflectionResponse = new ReflectionProperty($response, 'psrRequest'); + $reflectionResponse->setAccessible(true); + $reflectionResponse->setValue($response, $request); + + return $exception; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/ApplePayPaymentSessionRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/ApplePayPaymentSessionRequest.php new file mode 100644 index 0000000..93f791a --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/ApplePayPaymentSessionRequest.php @@ -0,0 +1,44 @@ +domain = $domain; + $this->validationUrl = $validationUrl; + $this->profileId = $profileId; + } + + public function defaultPayload(): array + { + return [ + 'domain' => $this->domain, + 'validationUrl' => $this->validationUrl, + 'profileId' => $this->profileId, + ]; + } + + public function resolveResourcePath(): string + { + return 'wallets/applepay/sessions'; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/CancelPaymentRefundRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/CancelPaymentRefundRequest.php new file mode 100644 index 0000000..935aa17 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/CancelPaymentRefundRequest.php @@ -0,0 +1,30 @@ +paymentId = $paymentId; + $this->id = $id; + } + + public function resolveResourcePath(): string + { + return "payments/{$this->paymentId}/refunds/{$this->id}"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/CancelPaymentRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/CancelPaymentRequest.php new file mode 100644 index 0000000..59c3492 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/CancelPaymentRequest.php @@ -0,0 +1,29 @@ +id = $id; + } + + public function resolveResourcePath(): string + { + return "payments/{$this->id}"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/CancelSessionRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/CancelSessionRequest.php new file mode 100644 index 0000000..1618d09 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/CancelSessionRequest.php @@ -0,0 +1,25 @@ +sessionId = $sessionId; + } + + public function resolveResourcePath(): string + { + return "sessions/{$this->sessionId}"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/CancelSubscriptionRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/CancelSubscriptionRequest.php new file mode 100644 index 0000000..be76045 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/CancelSubscriptionRequest.php @@ -0,0 +1,41 @@ +customerId = $customerId; + $this->subscriptionId = $subscriptionId; + } + + /** + * The resource path. + */ + public function resolveResourcePath(): string + { + return "customers/{$this->customerId}/subscriptions/{$this->subscriptionId}"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/CreateClientLinkRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/CreateClientLinkRequest.php new file mode 100644 index 0000000..ad92a39 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/CreateClientLinkRequest.php @@ -0,0 +1,65 @@ +owner = $owner; + $this->name = $name; + $this->address = $address; + $this->registrationNumber = $registrationNumber; + $this->vatNumber = $vatNumber; + } + + protected function defaultPayload(): array + { + return [ + 'owner' => $this->owner, + 'name' => $this->name, + 'address' => $this->address, + 'registrationNumber' => $this->registrationNumber, + 'vatNumber' => $this->vatNumber, + ]; + } + + public function resolveResourcePath(): string + { + return 'client-links'; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/CreateConnectBalanceTransferRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/CreateConnectBalanceTransferRequest.php new file mode 100644 index 0000000..8d5ff3f --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/CreateConnectBalanceTransferRequest.php @@ -0,0 +1,69 @@ +amount = $amount; + $this->description = $description; + $this->source = $source; + $this->destination = $destination; + $this->category = $category; + } + + protected function defaultPayload(): array + { + return [ + 'amount' => $this->amount, + 'description' => $this->description, + 'source' => $this->source, + 'destination' => $this->destination, + 'category' => $this->category, + ]; + } + + /** + * The resource path. + */ + public function resolveResourcePath(): string + { + return 'connect/balance-transfers'; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/CreateCustomerPaymentRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/CreateCustomerPaymentRequest.php new file mode 100644 index 0000000..549199e --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/CreateCustomerPaymentRequest.php @@ -0,0 +1,74 @@ +customerId = $customerId; + } + + public function resolveResourcePath(): string + { + return "customers/{$this->customerId}/payments"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/CreateCustomerRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/CreateCustomerRequest.php new file mode 100644 index 0000000..baf2253 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/CreateCustomerRequest.php @@ -0,0 +1,53 @@ +name = $name; + $this->email = $email; + $this->locale = $locale; + $this->metadata = $metadata; + } + + protected function defaultPayload(): array + { + return [ + 'name' => $this->name, + 'email' => $this->email, + 'locale' => $this->locale, + 'metadata' => $this->metadata, + ]; + } + + public function resolveResourcePath(): string + { + return 'customers'; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/CreateDelayedPaymentRouteRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/CreateDelayedPaymentRouteRequest.php new file mode 100644 index 0000000..f606e48 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/CreateDelayedPaymentRouteRequest.php @@ -0,0 +1,54 @@ +paymentId = $paymentId; + $this->amount = $amount; + $this->destination = $destination; + } + + protected function defaultPayload(): array + { + return [ + 'amount' => $this->amount, + 'destination' => $this->destination, + ]; + } + + public function resolveResourcePath(): string + { + return "payments/{$this->paymentId}/routes"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/CreateMandateRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/CreateMandateRequest.php new file mode 100644 index 0000000..296b673 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/CreateMandateRequest.php @@ -0,0 +1,88 @@ +customerId = $customerId; + $this->paymentMethod = $method; + $this->consumerName = $consumerName; + $this->consumerAccount = $consumerAccount; + $this->consumerBic = $consumerBic; + $this->consumerEmail = $consumerEmail; + $this->signatureDate = $signatureDate; + $this->mandateReference = $mandateReference; + $this->paypalBillingAgreementId = $paypalBillingAgreementId; + } + + protected function defaultPayload(): array + { + return [ + 'method' => $this->paymentMethod, + 'consumerName' => $this->consumerName, + 'consumerAccount' => $this->consumerAccount, + 'consumerBic' => $this->consumerBic, + 'consumerEmail' => $this->consumerEmail, + 'signatureDate' => $this->signatureDate, + 'mandateReference' => $this->mandateReference, + 'paypalBillingAgreementId' => $this->paypalBillingAgreementId, + ]; + } + + public function resolveResourcePath(): string + { + return "customers/{$this->customerId}/mandates"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/CreatePaymentCaptureRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/CreatePaymentCaptureRequest.php new file mode 100644 index 0000000..e322d3e --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/CreatePaymentCaptureRequest.php @@ -0,0 +1,59 @@ +paymentId = $paymentId; + $this->description = $description; + $this->amount = $amount; + $this->metadata = $metadata; + } + + protected function defaultPayload(): array + { + return [ + 'description' => $this->description, + 'amount' => $this->amount, + 'metadata' => $this->metadata, + ]; + } + + public function resolveResourcePath(): string + { + return "payments/{$this->paymentId}/captures"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/CreatePaymentLinkRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/CreatePaymentLinkRequest.php new file mode 100644 index 0000000..91d881e --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/CreatePaymentLinkRequest.php @@ -0,0 +1,98 @@ +description = $description; + $this->amount = $amount; + $this->redirectUrl = $redirectUrl; + $this->webhookUrl = $webhookUrl; + $this->profileId = $profileId; + $this->reusable = $reusable; + $this->expiresAt = $expiresAt; + $this->allowedMethods = $allowedMethods; + $this->sequenceType = $sequenceType; + $this->customerId = $customerId; + } + + protected function defaultPayload(): array + { + return [ + 'description' => $this->description, + 'amount' => $this->amount, + 'redirectUrl' => $this->redirectUrl, + 'webhookUrl' => $this->webhookUrl, + 'profileId' => $this->profileId, + 'reusable' => $this->reusable, + 'expiresAt' => $this->expiresAt, + 'allowedMethods' => $this->allowedMethods, + 'sequenceType' => $this->sequenceType, + 'customerId' => $this->customerId, + ]; + } + + /** + * The resource path. + */ + public function resolveResourcePath(): string + { + return 'payment-links'; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/CreatePaymentRefundRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/CreatePaymentRefundRequest.php new file mode 100644 index 0000000..b55be7d --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/CreatePaymentRefundRequest.php @@ -0,0 +1,70 @@ +paymentId = $paymentId; + $this->description = $description; + $this->amount = $amount; + $this->metadata = $metadata; + $this->reverseRouting = $reverseRouting; + $this->routingReversals = $routingReversals; + } + + protected function defaultPayload(): array + { + return [ + 'description' => $this->description, + 'amount' => $this->amount, + 'metadata' => $this->metadata, + 'reverseRouting' => $this->reverseRouting, + 'routingReversals' => $this->routingReversals, + ]; + } + + public function resolveResourcePath(): string + { + return "payments/{$this->paymentId}/refunds"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/CreatePaymentRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/CreatePaymentRequest.php new file mode 100644 index 0000000..a850035 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/CreatePaymentRequest.php @@ -0,0 +1,186 @@ +|null + */ + private ?DataCollection $lines; + + private ?Address $billingAddress; + + private ?Address $shippingAddress; + + private ?string $locale; + + /** + * @var array|string|null + */ + private $paymentMethod; + + private ?string $issuer; + + private ?string $restrictPaymentMethodsToCountry; + + private ?array $metadata; + + private ?string $captureMode; + + private ?string $captureDelay; + + private ?ApplicationFee $applicationFee; + + /** + * @var DataCollection|null + */ + private ?DataCollection $routing; + + private ?string $sequenceType; + + private ?string $mandateId; + + private ?string $customerId; + + private ?string $profileId; + + /** + * Method specific data. + * + * s. https://docs.mollie.com/reference/extra-payment-parameters#payment-creation-request-parameters + */ + private array $additional = []; + + private bool $includeQrCode; + + /** + * @param array|string|null $method + */ + public function __construct( + string $description, + Money $amount, + ?string $redirectUrl = null, + ?string $cancelUrl = null, + ?string $webhookUrl = null, + ?DataCollection $lines = null, + ?Address $billingAddress = null, + ?Address $shippingAddress = null, + ?string $locale = null, + $method = null, + ?string $issuer = null, + ?string $restrictPaymentMethodsToCountry = null, + ?array $metadata = null, + ?string $captureMode = null, + ?string $captureDelay = null, + ?ApplicationFee $applicationFee = null, + ?DataCollection $routing = null, + ?string $sequenceType = null, + ?string $mandateId = null, + ?string $customerId = null, + ?string $profileId = null, + array $additional = [], + bool $includeQrCode = false + ) { + $this->description = $description; + $this->amount = $amount; + $this->redirectUrl = $redirectUrl; + $this->cancelUrl = $cancelUrl; + $this->webhookUrl = $webhookUrl; + $this->lines = $lines; + $this->billingAddress = $billingAddress; + $this->shippingAddress = $shippingAddress; + $this->locale = $locale; + $this->paymentMethod = $method; + $this->issuer = $issuer; + $this->restrictPaymentMethodsToCountry = $restrictPaymentMethodsToCountry; + $this->metadata = $metadata; + $this->captureMode = $captureMode; + $this->captureDelay = $captureDelay; + $this->applicationFee = $applicationFee; + $this->routing = $routing; + $this->sequenceType = $sequenceType; + $this->mandateId = $mandateId; + $this->customerId = $customerId; + $this->profileId = $profileId; + $this->additional = $additional; + $this->includeQrCode = $includeQrCode; + } + + protected function defaultPayload(): array + { + return array_merge([ + 'description' => $this->description, + 'amount' => $this->amount, + 'redirectUrl' => $this->redirectUrl, + 'cancelUrl' => $this->cancelUrl, + 'webhookUrl' => $this->webhookUrl, + 'lines' => $this->lines, + 'billingAddress' => $this->billingAddress, + 'shippingAddress' => $this->shippingAddress, + 'locale' => $this->locale, + 'method' => $this->paymentMethod, + 'issuer' => $this->issuer, + 'restrictPaymentMethodsToCountry' => $this->restrictPaymentMethodsToCountry, + 'metadata' => $this->metadata, + 'captureMode' => $this->captureMode, + 'captureDelay' => $this->captureDelay, + 'applicationFee' => $this->applicationFee, + 'routing' => $this->routing, + 'sequenceType' => $this->sequenceType, + 'mandateId' => $this->mandateId, + 'customerId' => $this->customerId, + 'profileId' => $this->profileId, + ], $this->additional); + } + + protected function defaultQuery(): array + { + return [ + 'include' => $this->includeQrCode ? PaymentQuery::INCLUDE_QR_CODE : null, + ]; + } + + /** + * The resource path. + */ + public function resolveResourcePath(): string + { + return 'payments'; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/CreateProfileRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/CreateProfileRequest.php new file mode 100644 index 0000000..29f42f9 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/CreateProfileRequest.php @@ -0,0 +1,76 @@ +name = $name; + $this->website = $website; + $this->email = $email; + $this->phone = $phone; + $this->description = $description; + $this->countriesOfActivity = $countriesOfActivity; + $this->businessCategory = $businessCategory; + } + + protected function defaultPayload(): array + { + return [ + 'name' => $this->name, + 'website' => $this->website, + 'email' => $this->email, + 'phone' => $this->phone, + 'description' => $this->description, + 'countriesOfActivity' => $this->countriesOfActivity, + 'businessCategory' => $this->businessCategory, + ]; + } + + /** + * The resource path. + */ + public function resolveResourcePath(): string + { + return 'profiles'; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/CreateSalesInvoiceRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/CreateSalesInvoiceRequest.php new file mode 100644 index 0000000..3325a73 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/CreateSalesInvoiceRequest.php @@ -0,0 +1,130 @@ + + */ + public DataCollection $lines; + + public ?string $profileId; + + public ?string $memo; + + public ?PaymentDetails $paymentDetails; + + public ?EmailDetails $emailDetails; + + public ?string $webhookUrl; + + public ?Discount $discount; + + public ?string $customerId; + + public ?string $mandateId; + + public ?bool $isEInvoice; + + public function __construct( + string $currency, + string $status, + string $vatScheme, + string $vatMode, + string $paymentTerm, + string $recipientIdentifier, + Recipient $recipient, + DataCollection $lines, + ?string $profileId = null, + ?string $memo = null, + ?PaymentDetails $paymentDetails = null, + ?EmailDetails $emailDetails = null, + ?string $webhookUrl = null, + ?Discount $discount = null, + ?string $customerId = null, + ?string $mandateId = null, + ?bool $isEInvoice = null + ) { + $this->currency = $currency; + $this->status = $status; + $this->vatScheme = $vatScheme; + $this->vatMode = $vatMode; + $this->paymentTerm = $paymentTerm; + $this->recipientIdentifier = $recipientIdentifier; + $this->recipient = $recipient; + $this->lines = $lines; + $this->profileId = $profileId; + $this->memo = $memo; + $this->paymentDetails = $paymentDetails; + $this->emailDetails = $emailDetails; + $this->webhookUrl = $webhookUrl; + $this->discount = $discount; + $this->customerId = $customerId; + $this->mandateId = $mandateId; + $this->isEInvoice = $isEInvoice; + } + + public function defaultPayload(): array + { + return [ + 'currency' => $this->currency, + 'status' => $this->status, + 'vatScheme' => $this->vatScheme, + 'vatMode' => $this->vatMode, + 'paymentTerm' => $this->paymentTerm, + 'recipientIdentifier' => $this->recipientIdentifier, + 'recipient' => $this->recipient, + 'lines' => $this->lines, + 'profileId' => $this->profileId, + 'memo' => $this->memo, + 'paymentDetails' => $this->paymentDetails, + 'emailDetails' => $this->emailDetails, + 'webhookUrl' => $this->webhookUrl, + 'discount' => $this->discount, + 'customerId' => $this->customerId, + 'mandateId' => $this->mandateId, + 'isEInvoice' => $this->isEInvoice, + ]; + } + + public function resolveResourcePath(): string + { + return 'sales-invoices'; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/CreateSessionRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/CreateSessionRequest.php new file mode 100644 index 0000000..24b8836 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/CreateSessionRequest.php @@ -0,0 +1,64 @@ +redirectUrl = $redirectUrl; + $this->cancelUrl = $cancelUrl; + $this->amount = $amount; + $this->description = $description; + $this->paymentMethod = $method; + $this->checkoutFlow = $checkoutFlow ?? CheckoutFlow::EXPRESS; + } + + protected function defaultPayload(): array + { + return [ + 'redirectUrl' => $this->redirectUrl, + 'cancelUrl' => $this->cancelUrl, + 'amount' => $this->amount, + 'description' => $this->description, + 'method' => $this->paymentMethod, + 'checkoutFlow' => $this->checkoutFlow, + ]; + } + + public function resolveResourcePath(): string + { + return 'sessions'; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/CreateSubscriptionRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/CreateSubscriptionRequest.php new file mode 100644 index 0000000..59f001c --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/CreateSubscriptionRequest.php @@ -0,0 +1,116 @@ +customerId = $customerId; + $this->amount = $amount; + $this->interval = $interval; + $this->description = $description; + $this->status = $status; + $this->times = $times; + $this->startDate = $startDate; + $this->paymentMethod = $method; + $this->applicationFee = $applicationFee; + $this->metadata = $metadata; + $this->webhookUrl = $webhookUrl; + $this->mandateId = $mandateId; + $this->profileId = $profileId; + } + + protected function defaultPayload(): array + { + return [ + 'amount' => $this->amount, + 'interval' => $this->interval, + 'description' => $this->description, + 'status' => $this->status, + 'times' => $this->times, + 'startDate' => $this->startDate, + 'method' => $this->paymentMethod, + 'applicationFee' => $this->applicationFee, + 'metadata' => $this->metadata, + 'webhookUrl' => $this->webhookUrl, + 'mandateId' => $this->mandateId, + 'profileId' => $this->profileId, + ]; + } + + /** + * The resource path. + */ + public function resolveResourcePath(): string + { + return "customers/{$this->customerId}/subscriptions"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/CreateWebhookRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/CreateWebhookRequest.php new file mode 100644 index 0000000..01fc7f4 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/CreateWebhookRequest.php @@ -0,0 +1,61 @@ +url = $url; + $this->name = $name; + $this->eventTypes = $eventTypes; + } + + protected function defaultPayload(): array + { + return [ + 'url' => $this->url, + 'name' => $this->name, + 'eventTypes' => is_string($this->eventTypes) ? $this->eventTypes : Arr::join($this->eventTypes), + ]; + } + + /** + * The resource path. + */ + public function resolveResourcePath(): string + { + return 'webhooks'; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/DeleteCustomerRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/DeleteCustomerRequest.php new file mode 100644 index 0000000..50d215f --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/DeleteCustomerRequest.php @@ -0,0 +1,27 @@ +id = $id; + } + + public function resolveResourcePath(): string + { + return "customers/{$this->id}"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/DeletePaymentLinkRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/DeletePaymentLinkRequest.php new file mode 100644 index 0000000..1efe779 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/DeletePaymentLinkRequest.php @@ -0,0 +1,27 @@ +id = $id; + } + + public function resolveResourcePath(): string + { + return "payment-links/{$this->id}"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/DeleteProfileRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/DeleteProfileRequest.php new file mode 100644 index 0000000..9156442 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/DeleteProfileRequest.php @@ -0,0 +1,26 @@ +id = $id; + } + + public function resolveResourcePath(): string + { + return "profiles/{$this->id}"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/DeleteSalesInvoiceRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/DeleteSalesInvoiceRequest.php new file mode 100644 index 0000000..1beeaf4 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/DeleteSalesInvoiceRequest.php @@ -0,0 +1,27 @@ +id = $id; + } + + public function resolveResourcePath(): string + { + return "sales-invoices/{$this->id}"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/DeleteWebhookRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/DeleteWebhookRequest.php new file mode 100644 index 0000000..11aa5ec --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/DeleteWebhookRequest.php @@ -0,0 +1,32 @@ +id = $id; + } + + /** + * The resource path. + */ + public function resolveResourcePath(): string + { + return "webhooks/{$this->id}"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/DisableMethodIssuerRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/DisableMethodIssuerRequest.php new file mode 100644 index 0000000..953a9c2 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/DisableMethodIssuerRequest.php @@ -0,0 +1,32 @@ +profileId = $profileId; + $this->methodId = $methodId; + $this->issuerId = $issuerId; + } + + public function resolveResourcePath(): string + { + return "profiles/{$this->profileId}/methods/{$this->methodId}/issuers/{$this->issuerId}"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/DisableMethodRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/DisableMethodRequest.php new file mode 100644 index 0000000..7ef3095 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/DisableMethodRequest.php @@ -0,0 +1,29 @@ +profileId = $profileId; + $this->methodId = $methodId; + } + + public function resolveResourcePath(): string + { + return "profiles/{$this->profileId}/methods/{$this->methodId}"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/DynamicDeleteRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/DynamicDeleteRequest.php new file mode 100644 index 0000000..fdd19bb --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/DynamicDeleteRequest.php @@ -0,0 +1,26 @@ +query()->merge($query); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/DynamicGetRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/DynamicGetRequest.php new file mode 100644 index 0000000..fe755b3 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/DynamicGetRequest.php @@ -0,0 +1,23 @@ +query()->merge($query); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/DynamicPaginatedRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/DynamicPaginatedRequest.php new file mode 100644 index 0000000..f6c2835 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/DynamicPaginatedRequest.php @@ -0,0 +1,12 @@ +payload()->merge($payload); + $this->query()->merge($query); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/DynamicPutRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/DynamicPutRequest.php new file mode 100644 index 0000000..0615d58 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/DynamicPutRequest.php @@ -0,0 +1,29 @@ +payload()->merge($payload); + $this->query()->merge($query); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/DynamicRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/DynamicRequest.php new file mode 100644 index 0000000..ba5c2e9 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/DynamicRequest.php @@ -0,0 +1,22 @@ +url = $url; + } + + public function resolveResourcePath(): string + { + return $this->url; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/EnableMethodIssuerRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/EnableMethodIssuerRequest.php new file mode 100644 index 0000000..aeec0d4 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/EnableMethodIssuerRequest.php @@ -0,0 +1,55 @@ +profileId = $profileId; + $this->methodId = $methodId; + $this->issuerId = $issuerId; + $this->contractId = $contractId; + } + + protected function defaultPayload(): array + { + return [ + 'contractId' => $this->contractId, + ]; + } + + public function resolveResourcePath(): string + { + return "profiles/{$this->profileId}/methods/{$this->methodId}/issuers/{$this->issuerId}"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/EnableMethodRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/EnableMethodRequest.php new file mode 100644 index 0000000..53344f3 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/EnableMethodRequest.php @@ -0,0 +1,34 @@ +profileId = $profileId; + $this->methodId = $methodId; + } + + public function resolveResourcePath(): string + { + return "profiles/{$this->profileId}/methods/{$this->methodId}"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/GetAllMethodsRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/GetAllMethodsRequest.php new file mode 100644 index 0000000..3234e95 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/GetAllMethodsRequest.php @@ -0,0 +1,64 @@ +includeIssuers = $includeIssuers; + $this->includePricing = $includePricing; + $this->locale = $locale; + $this->amount = $amount; + $this->profileId = $profileId; + } + + protected function defaultQuery(): array + { + return [ + 'include' => Arr::join([ + $this->includeIssuers ? MethodQuery::INCLUDE_ISSUERS : null, + $this->includePricing ? MethodQuery::INCLUDE_PRICING : null, + ]), + 'locale' => $this->locale, + 'amount' => $this->amount, + 'profileId' => $this->profileId, + ]; + } + + public function resolveResourcePath(): string + { + return 'methods/all'; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/GetAllPaginatedSubscriptionsRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/GetAllPaginatedSubscriptionsRequest.php new file mode 100644 index 0000000..0dcf847 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/GetAllPaginatedSubscriptionsRequest.php @@ -0,0 +1,51 @@ +from = $from; + $this->limit = $limit; + $this->profileId = $profileId; + } + + public function defaultQuery(): array + { + return [ + 'from' => $this->from, + 'limit' => $this->limit, + 'profileId' => $this->profileId, + ]; + } + + /** + * The resource path. + */ + public function resolveResourcePath(): string + { + return 'subscriptions'; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/GetBalanceReportRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/GetBalanceReportRequest.php new file mode 100644 index 0000000..f37cd81 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/GetBalanceReportRequest.php @@ -0,0 +1,54 @@ +balanceId = $balanceId; + $this->from = $from; + $this->until = $until; + $this->grouping = $grouping; + } + + protected function defaultQuery(): array + { + return [ + 'from' => $this->from, + 'until' => $this->until, + 'grouping' => $this->grouping, + ]; + } + + /** + * Resolve the resource path. + */ + public function resolveResourcePath(): string + { + return "balances/{$this->balanceId}/report"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/GetBalanceRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/GetBalanceRequest.php new file mode 100644 index 0000000..9373c8e --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/GetBalanceRequest.php @@ -0,0 +1,29 @@ +id = $id; + } + + /** + * Resolve the resource path. + */ + public function resolveResourcePath(): string + { + return "balances/{$this->id}"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/GetCapabilityRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/GetCapabilityRequest.php new file mode 100644 index 0000000..3b3297b --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/GetCapabilityRequest.php @@ -0,0 +1,28 @@ +name = $name; + } + + public function resolveResourcePath(): string + { + return "capabilities/{$this->name}"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/GetClientRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/GetClientRequest.php new file mode 100644 index 0000000..10c904b --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/GetClientRequest.php @@ -0,0 +1,49 @@ +id = $id; + $this->embedOrganization = $embedOrganization; + $this->embedOnboarding = $embedOnboarding; + } + + protected function defaultQuery(): array + { + return [ + 'embed' => Arr::join([ + $this->embedOrganization ? ClientQuery::EMBED_ORGANIZATION : null, + $this->embedOnboarding ? ClientQuery::EMBED_ONBOARDING : null, + ]), + ]; + } + + public function resolveResourcePath(): string + { + return "clients/{$this->id}"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/GetConnectBalanceTransferRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/GetConnectBalanceTransferRequest.php new file mode 100644 index 0000000..e846ce2 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/GetConnectBalanceTransferRequest.php @@ -0,0 +1,35 @@ +id = $id; + } + + /** + * The resource path. + */ + public function resolveResourcePath(): string + { + return "connect/balance-transfers/{$this->id}"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/GetCurrentProfileRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/GetCurrentProfileRequest.php new file mode 100644 index 0000000..f084c90 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/GetCurrentProfileRequest.php @@ -0,0 +1,22 @@ +id = $id; + } + + /** + * Resolve the resource path. + */ + public function resolveResourcePath(): string + { + return "customers/{$this->id}"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/GetEnabledMethodsRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/GetEnabledMethodsRequest.php new file mode 100644 index 0000000..ca5cadb --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/GetEnabledMethodsRequest.php @@ -0,0 +1,108 @@ +sequenceType = $sequenceType; + $this->resource = $resource; + $this->locale = $locale; + $this->amount = $amount; + $this->billingCountry = $billingCountry; + $this->includeWallets = $includeWallets; + $this->orderLineCategories = $orderLineCategories; + $this->profileId = $profileId; + $this->includeIssuers = $includeIssuers; + + $this->middleware()->onResponse(function ($result) { + if ($this->filtersNullStatus && $result instanceof MethodCollection) { + return $result + ->filter(fn (Method $method) => $method->status !== null); + } + + return $result; + }, 'filter_null_status', MiddlewarePriority::LOW); + } + + public function withoutNullStatus(): self + { + $this->filtersNullStatus = true; + + return $this; + } + + public function withNullStatus(): self + { + $this->filtersNullStatus = false; + + return $this; + } + + protected function defaultQuery(): array + { + return [ + 'sequenceType' => $this->sequenceType, + 'resource' => $this->resource, + 'locale' => $this->locale, + 'amount' => $this->amount, + 'billingCountry' => $this->billingCountry, + 'includeWallets' => Arr::join($this->includeWallets ?? []), + 'orderLineCategories' => Arr::join($this->orderLineCategories ?? []), + 'profileId' => $this->profileId, + 'include' => $this->includeIssuers ? MethodQuery::INCLUDE_ISSUERS : null, + ]; + } + + public function resolveResourcePath(): string + { + return 'methods'; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/GetInvoiceRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/GetInvoiceRequest.php new file mode 100644 index 0000000..83c8702 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/GetInvoiceRequest.php @@ -0,0 +1,28 @@ +id = $id; + } + + /** + * Resolve the resource path. + */ + public function resolveResourcePath(): string + { + return "invoices/{$this->id}"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/GetMandateRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/GetMandateRequest.php new file mode 100644 index 0000000..04d0ff0 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/GetMandateRequest.php @@ -0,0 +1,35 @@ +customerId = $customerId; + $this->mandateId = $mandateId; + } + + public function resolveResourcePath(): string + { + return "customers/{$this->customerId}/mandates/{$this->mandateId}"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/GetMethodRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/GetMethodRequest.php new file mode 100644 index 0000000..56152ca --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/GetMethodRequest.php @@ -0,0 +1,54 @@ +methodId = $methodId; + $this->locale = $locale; + $this->currency = $currency; + $this->profileId = $profileId; + $this->includeIssuers = $includeIssuers; + } + + protected function defaultQuery(): array + { + return [ + 'locale' => $this->locale, + 'currency' => $this->currency, + 'profileId' => $this->profileId, + 'include' => $this->includeIssuers ? MethodQuery::INCLUDE_ISSUERS : null, + ]; + } + + public function resolveResourcePath(): string + { + return "methods/{$this->methodId}"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/GetOnboardingStatusRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/GetOnboardingStatusRequest.php new file mode 100644 index 0000000..84ddbf9 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/GetOnboardingStatusRequest.php @@ -0,0 +1,18 @@ +id = $id; + } + + public function resolveResourcePath(): string + { + return "organizations/{$this->id}"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedBalanceRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedBalanceRequest.php new file mode 100644 index 0000000..574beba --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedBalanceRequest.php @@ -0,0 +1,20 @@ +balanceId = $balanceId; + + parent::__construct($from, $limit); + } + + public function resolveResourcePath(): string + { + return "balances/{$this->balanceId}/transactions"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedChargebacksRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedChargebacksRequest.php new file mode 100644 index 0000000..bd8db5d --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedChargebacksRequest.php @@ -0,0 +1,37 @@ +query() + ->add('embed', $includePayment ? PaymentIncludesQuery::PAYMENT : null) + ->add('profileId', $profileId); + } + + public function resolveResourcePath(): string + { + return 'chargebacks'; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedClientRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedClientRequest.php new file mode 100644 index 0000000..898c5e4 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedClientRequest.php @@ -0,0 +1,39 @@ +query() + ->add('embed', Arr::join([ + $embedOrganization ? ClientQuery::EMBED_ORGANIZATION : null, + $embedOnboarding ? ClientQuery::EMBED_ONBOARDING : null, + ])); + } + + public function resolveResourcePath(): string + { + return 'clients'; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedCustomerPaymentsRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedCustomerPaymentsRequest.php new file mode 100644 index 0000000..942db71 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedCustomerPaymentsRequest.php @@ -0,0 +1,40 @@ +customerId = $customerId; + + parent::__construct($from, $limit, $sort); + + $this->query() + ->add('profileId', $profileId); + } + + public function resolveResourcePath(): string + { + return "customers/{$this->customerId}/payments"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedCustomerRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedCustomerRequest.php new file mode 100644 index 0000000..fbd7e1b --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedCustomerRequest.php @@ -0,0 +1,20 @@ +query() + ->add('reference', $reference) + ->add('year', $year); + } + + public function resolveResourcePath(): string + { + return 'invoices'; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedMandateRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedMandateRequest.php new file mode 100644 index 0000000..c56bb5b --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedMandateRequest.php @@ -0,0 +1,32 @@ +customerId = $customerId; + + parent::__construct($from, $limit); + } + + public function resolveResourcePath(): string + { + return "customers/{$this->customerId}/mandates"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedPaymentCapturesRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedPaymentCapturesRequest.php new file mode 100644 index 0000000..29bd793 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedPaymentCapturesRequest.php @@ -0,0 +1,40 @@ +paymentId = $paymentId; + + parent::__construct($from, $limit); + + $this->query() + ->add('include', Arr::join($includePayment ? [PaymentIncludesQuery::PAYMENT] : [])); + } + + /** + * Resolve the resource path. + */ + public function resolveResourcePath(): string + { + return "payments/{$this->paymentId}/captures"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedPaymentChargebacksRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedPaymentChargebacksRequest.php new file mode 100644 index 0000000..aab66e6 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedPaymentChargebacksRequest.php @@ -0,0 +1,36 @@ +paymentId = $paymentId; + + parent::__construct($from, $limit); + + $this->query() + ->add('include', $includePayment ? PaymentIncludesQuery::PAYMENT : null); + } + + public function resolveResourcePath(): string + { + return "payments/{$this->paymentId}/chargebacks"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedPaymentLinkPaymentsRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedPaymentLinkPaymentsRequest.php new file mode 100644 index 0000000..3b52faf --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedPaymentLinkPaymentsRequest.php @@ -0,0 +1,35 @@ +paymentLinkId = $paymentLinkId; + + parent::__construct($from, $limit, $sort); + } + + /** + * Resolve the resource path. + */ + public function resolveResourcePath(): string + { + return "payment-links/{$this->paymentLinkId}/payments"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedPaymentLinksRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedPaymentLinksRequest.php new file mode 100644 index 0000000..4f867df --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedPaymentLinksRequest.php @@ -0,0 +1,23 @@ +paymentId = $paymentId; + + parent::__construct($from, $limit); + + $this->query() + ->add('include', $includePayment ? PaymentIncludesQuery::PAYMENT : null); + } + + public function resolveResourcePath(): string + { + return "payments/{$this->paymentId}/refunds"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedPaymentsRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedPaymentsRequest.php new file mode 100644 index 0000000..793106f --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedPaymentsRequest.php @@ -0,0 +1,26 @@ +query() + ->add('embed', $embedPayment ? PaymentIncludesQuery::PAYMENT : null) + ->add('profileId', $profileId); + } + + public function resolveResourcePath(): string + { + return 'refunds'; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedSalesInvoicesRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedSalesInvoicesRequest.php new file mode 100644 index 0000000..7f3d26a --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedSalesInvoicesRequest.php @@ -0,0 +1,20 @@ +settlementId = $settlementId; + + parent::__construct($from, $limit); + + $this->query() + ->add('embed', Arr::join($includePayment ? [PaymentIncludesQuery::PAYMENT] : [])); + } + + /** + * Resolve the resource path. + */ + public function resolveResourcePath(): string + { + return "settlements/{$this->settlementId}/captures"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedSettlementChargebacksRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedSettlementChargebacksRequest.php new file mode 100644 index 0000000..4bd06f9 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedSettlementChargebacksRequest.php @@ -0,0 +1,31 @@ +settlementId = $settlementId; + + parent::__construct($from, $limit, $includePayment, $profileId); + } + + /** + * Resolve the resource path. + */ + public function resolveResourcePath(): string + { + return "settlements/{$this->settlementId}/chargebacks"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedSettlementPaymentsRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedSettlementPaymentsRequest.php new file mode 100644 index 0000000..033583c --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedSettlementPaymentsRequest.php @@ -0,0 +1,35 @@ +settlementId = $settlementId; + + parent::__construct($from, $limit, $sort); + } + + /** + * Resolve the resource path. + */ + public function resolveResourcePath(): string + { + return "settlements/{$this->settlementId}/payments"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedSettlementRefundsRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedSettlementRefundsRequest.php new file mode 100644 index 0000000..73e5713 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedSettlementRefundsRequest.php @@ -0,0 +1,43 @@ +settlementId = $settlementId; + + parent::__construct($from, $limit); + + $this->query() + ->add('embed', $includePayment ? PaymentIncludesQuery::PAYMENT : null); + } + + /** + * Resolve the resource path. + */ + public function resolveResourcePath(): string + { + return "settlements/{$this->settlementId}/refunds"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedSettlementsRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedSettlementsRequest.php new file mode 100644 index 0000000..b3ca752 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedSettlementsRequest.php @@ -0,0 +1,36 @@ +query() + ->add('balanceId', $balanceId); + } + + /** + * Resolve the resource path. + */ + public function resolveResourcePath(): string + { + return 'settlements'; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedSubscriptionPaymentsRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedSubscriptionPaymentsRequest.php new file mode 100644 index 0000000..01f36bc --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedSubscriptionPaymentsRequest.php @@ -0,0 +1,38 @@ +customerId = $customerId; + $this->subscriptionId = $subscriptionId; + + parent::__construct($from, $limit); + } + + /** + * The resource path. + */ + public function resolveResourcePath(): string + { + return "customers/{$this->customerId}/subscriptions/{$this->subscriptionId}/payments"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedSubscriptionsRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedSubscriptionsRequest.php new file mode 100644 index 0000000..66da3c4 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedSubscriptionsRequest.php @@ -0,0 +1,35 @@ +customerId = $customerId; + + parent::__construct($from, $limit); + } + + /** + * The resource path. + */ + public function resolveResourcePath(): string + { + return "customers/{$this->customerId}/subscriptions"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedTerminalsRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedTerminalsRequest.php new file mode 100644 index 0000000..503bee5 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaginatedTerminalsRequest.php @@ -0,0 +1,23 @@ +query() + ->add( + 'eventTypes', + is_string($eventTypes) + ? $eventTypes + : Arr::join($eventTypes ?? []) + ); + } + + /** + * The resource path. + */ + public function resolveResourcePath(): string + { + return 'webhooks'; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaymentCaptureRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaymentCaptureRequest.php new file mode 100644 index 0000000..69fbcfd --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaymentCaptureRequest.php @@ -0,0 +1,47 @@ +paymentId = $paymentId; + $this->captureId = $captureId; + $this->embedPayment = $embedPayment; + } + + protected function defaultQuery(): array + { + return [ + 'embed' => Arr::join($this->embedPayment ? [PaymentIncludesQuery::PAYMENT] : []), + ]; + } + + public function resolveResourcePath(): string + { + return "payments/{$this->paymentId}/captures/{$this->captureId}"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaymentChargebackRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaymentChargebackRequest.php new file mode 100644 index 0000000..c09b0b4 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaymentChargebackRequest.php @@ -0,0 +1,46 @@ +paymentId = $paymentId; + $this->chargebackId = $chargebackId; + $this->includePayment = $includePayment; + } + + protected function defaultQuery(): array + { + return [ + 'include' => $this->includePayment ? PaymentIncludesQuery::PAYMENT : null, + ]; + } + + public function resolveResourcePath(): string + { + return "payments/{$this->paymentId}/chargebacks/{$this->chargebackId}"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaymentLinkRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaymentLinkRequest.php new file mode 100644 index 0000000..f50229d --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaymentLinkRequest.php @@ -0,0 +1,35 @@ +id = $id; + } + + /** + * Resolve the resource path. + */ + public function resolveResourcePath(): string + { + return "payment-links/{$this->id}"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaymentRefundRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaymentRefundRequest.php new file mode 100644 index 0000000..dafbbaa --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaymentRefundRequest.php @@ -0,0 +1,49 @@ +paymentId = $paymentId; + $this->refundId = $refundId; + $this->includePayment = $includePayment; + } + + protected function defaultQuery(): array + { + return [ + 'include' => $this->includePayment ? PaymentIncludesQuery::PAYMENT : null, + ]; + } + + /** + * Resolve the resource path. + */ + public function resolveResourcePath(): string + { + return "payments/{$this->paymentId}/refunds/{$this->refundId}"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaymentRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaymentRequest.php new file mode 100644 index 0000000..7f4d560 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/GetPaymentRequest.php @@ -0,0 +1,76 @@ +id = $id; + $this->embedCaptures = $embedCaptures; + $this->embedRefunds = $embedRefunds; + $this->embedChargebacks = $embedChargebacks; + $this->includeQrCode = $includeQrCode; + $this->includeRemainderDetails = $includeRemainderDetails; + } + + protected function defaultQuery(): array + { + return [ + 'embed' => Arr::join([ + $this->embedCaptures ? PaymentQuery::EMBED_CAPTURES : null, + $this->embedRefunds ? PaymentQuery::EMBED_REFUNDS : null, + $this->embedChargebacks ? PaymentQuery::EMBED_CHARGEBACKS : null, + ]), + 'include' => Arr::join([ + $this->includeQrCode ? PaymentQuery::INCLUDE_QR_CODE : null, + $this->includeRemainderDetails ? PaymentQuery::INCLUDE_REMAINDER_DETAILS : null, + ]), + ]; + } + + /** + * Resolve the resource path. + */ + public function resolveResourcePath(): string + { + return "payments/{$this->id}"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/GetPermissionRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/GetPermissionRequest.php new file mode 100644 index 0000000..95e5184 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/GetPermissionRequest.php @@ -0,0 +1,29 @@ +id = $id; + } + + public function resolveResourcePath(): string + { + return "permissions/{$this->id}"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/GetProfileRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/GetProfileRequest.php new file mode 100644 index 0000000..b95d553 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/GetProfileRequest.php @@ -0,0 +1,29 @@ +id = $id; + } + + public function resolveResourcePath(): string + { + return "profiles/{$this->id}"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/GetSalesInvoiceRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/GetSalesInvoiceRequest.php new file mode 100644 index 0000000..aa40c9d --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/GetSalesInvoiceRequest.php @@ -0,0 +1,32 @@ +id = $id; + } + + public function resolveResourcePath(): string + { + return "sales-invoices/{$this->id}"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/GetSessionRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/GetSessionRequest.php new file mode 100644 index 0000000..e684631 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/GetSessionRequest.php @@ -0,0 +1,25 @@ +id = $id; + } + + public function resolveResourcePath(): string + { + return 'sessions/'.$this->id; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/GetSettlementRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/GetSettlementRequest.php new file mode 100644 index 0000000..bb25e89 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/GetSettlementRequest.php @@ -0,0 +1,26 @@ +id = $id; + } + + public function resolveResourcePath(): string + { + return "settlements/{$this->id}"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/GetSubscriptionRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/GetSubscriptionRequest.php new file mode 100644 index 0000000..722465a --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/GetSubscriptionRequest.php @@ -0,0 +1,35 @@ +customerId = $customerId; + $this->id = $id; + } + + public function resolveResourcePath(): string + { + return "customers/{$this->customerId}/subscriptions/{$this->id}"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/GetTerminalRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/GetTerminalRequest.php new file mode 100644 index 0000000..c9cc5bf --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/GetTerminalRequest.php @@ -0,0 +1,32 @@ +id = $id; + } + + /** + * The resource path. + */ + public function resolveResourcePath(): string + { + return "terminals/{$this->id}"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/GetWebhookEventRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/GetWebhookEventRequest.php new file mode 100644 index 0000000..14c3936 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/GetWebhookEventRequest.php @@ -0,0 +1,34 @@ +id = $id; + } + + /** + * The resource path. + */ + public function resolveResourcePath(): string + { + return "events/{$this->id}"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/GetWebhookRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/GetWebhookRequest.php new file mode 100644 index 0000000..35ce282 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/GetWebhookRequest.php @@ -0,0 +1,35 @@ +id = $id; + } + + /** + * The resource path. + */ + public function resolveResourcePath(): string + { + return "webhooks/{$this->id}"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/ListCapabilitiesRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/ListCapabilitiesRequest.php new file mode 100644 index 0000000..276d979 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/ListCapabilitiesRequest.php @@ -0,0 +1,21 @@ +paymentId = $paymentId; + } + + public function resolveResourcePath(): string + { + return "payments/{$this->paymentId}/routes"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/ListPermissionsRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/ListPermissionsRequest.php new file mode 100644 index 0000000..b2c4c2d --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/ListPermissionsRequest.php @@ -0,0 +1,21 @@ +from = $from; + $this->limit = $limit; + } + + protected function defaultQuery(): array + { + return [ + 'from' => $this->from, + 'limit' => $this->limit, + ]; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/ReleasePaymentAuthorizationRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/ReleasePaymentAuthorizationRequest.php new file mode 100644 index 0000000..ca467c8 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/ReleasePaymentAuthorizationRequest.php @@ -0,0 +1,24 @@ +paymentId = $paymentId; + } + + public function resolveResourcePath(): string + { + return 'payments/'.$this->paymentId.'/release-authorization'; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/ResourceHydratableRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/ResourceHydratableRequest.php new file mode 100644 index 0000000..ccddc6c --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/ResourceHydratableRequest.php @@ -0,0 +1,64 @@ +hydratableResource !== null || $this->customHydratableResource !== null; + } + + /** + * @return string|WrapperResource + */ + public function getHydratableResource() + { + if (! $this->isHydratable()) { + throw new \RuntimeException('Resource class is not set.'); + } + + return $this->customHydratableResource ?? $this->hydratableResource; + } + + /** + * @param string|WrapperResource $hydratableResource + */ + public function setHydratableResource($hydratableResource): self + { + $this->customHydratableResource = $hydratableResource; + + if (! $this->hydratableResource && $this->customHydratableResource instanceof WrapperResource) { + $this->hydratableResource = $this->customHydratableResource->getWrapper(); + } + + return $this; + } + + public function resetHydratableResource(): self + { + $this->customHydratableResource = null; + + return $this; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/RevokeMandateRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/RevokeMandateRequest.php new file mode 100644 index 0000000..0bf3c20 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/RevokeMandateRequest.php @@ -0,0 +1,33 @@ +customerId = $customerId; + $this->mandateId = $mandateId; + } + + public function resolveResourcePath(): string + { + return "customers/{$this->customerId}/mandates/{$this->mandateId}"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/SortablePaginatedRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/SortablePaginatedRequest.php new file mode 100644 index 0000000..661db10 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/SortablePaginatedRequest.php @@ -0,0 +1,16 @@ +query()->add('sort', $sort); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/TestWebhookRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/TestWebhookRequest.php new file mode 100644 index 0000000..b79d4e8 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/TestWebhookRequest.php @@ -0,0 +1,38 @@ +id = $id; + } + + /** + * The resource path. + */ + public function resolveResourcePath(): string + { + return "webhooks/{$this->id}/ping"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/UpdateCustomerRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/UpdateCustomerRequest.php new file mode 100644 index 0000000..a8ce4b6 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/UpdateCustomerRequest.php @@ -0,0 +1,59 @@ +id = $id; + $this->name = $name; + $this->email = $email; + $this->locale = $locale; + $this->metadata = $metadata; + } + + protected function defaultPayload(): array + { + return [ + 'name' => $this->name, + 'email' => $this->email, + 'locale' => $this->locale, + 'metadata' => $this->metadata, + ]; + } + + public function resolveResourcePath(): string + { + return "customers/{$this->id}"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/UpdatePaymentLinkRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/UpdatePaymentLinkRequest.php new file mode 100644 index 0000000..7ce3fda --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/UpdatePaymentLinkRequest.php @@ -0,0 +1,51 @@ +id = $id; + $this->description = $description; + $this->archived = $archived; + $this->allowedMethods = $allowedMethods; + } + + protected function defaultPayload(): array + { + return [ + 'description' => $this->description, + 'archived' => $this->archived, + 'allowedMethods' => $this->allowedMethods, + ]; + } + + public function resolveResourcePath(): string + { + return "payment-links/{$this->id}"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/UpdatePaymentRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/UpdatePaymentRequest.php new file mode 100644 index 0000000..b411e78 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/UpdatePaymentRequest.php @@ -0,0 +1,89 @@ +id = $id; + $this->description = $description; + $this->redirectUrl = $redirectUrl; + $this->cancelUrl = $cancelUrl; + $this->webhookUrl = $webhookUrl; + $this->metadata = $metadata; + $this->paymentMethod = $method; + $this->locale = $locale; + $this->restrictPaymentMethodsToCountry = $restrictPaymentMethodsToCountry; + $this->additional = $additional; + } + + protected function defaultPayload(): array + { + return array_merge([ + 'description' => $this->description, + 'redirectUrl' => $this->redirectUrl, + 'cancelUrl' => $this->cancelUrl, + 'webhookUrl' => $this->webhookUrl, + 'metadata' => $this->metadata, + 'method' => $this->paymentMethod, + 'locale' => $this->locale, + 'restrictPaymentMethodsToCountry' => $this->restrictPaymentMethodsToCountry, + ], $this->additional); + } + + public function resolveResourcePath(): string + { + return "payments/{$this->id}"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/UpdatePaymentRouteRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/UpdatePaymentRouteRequest.php new file mode 100644 index 0000000..ebfb932 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/UpdatePaymentRouteRequest.php @@ -0,0 +1,59 @@ +paymentId = $paymentId; + $this->routeId = $routeId; + $this->releaseDate = $releaseDate; + } + + protected function defaultPayload(): array + { + return [ + 'releaseDate' => $this->releaseDate, + ]; + } + + public function resolveResourcePath(): string + { + return "payments/{$this->paymentId}/routes/{$this->routeId}"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/UpdateProfileRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/UpdateProfileRequest.php new file mode 100644 index 0000000..16ff813 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/UpdateProfileRequest.php @@ -0,0 +1,79 @@ +id = $id; + $this->name = $name; + $this->website = $website; + $this->email = $email; + $this->phone = $phone; + $this->description = $description; + $this->countriesOfActivity = $countriesOfActivity; + $this->businessCategory = $businessCategory; + $this->mode = $mode; + } + + protected function defaultPayload(): array + { + return [ + 'name' => $this->name, + 'website' => $this->website, + 'email' => $this->email, + 'phone' => $this->phone, + 'description' => $this->description, + 'countriesOfActivity' => $this->countriesOfActivity, + 'businessCategory' => $this->businessCategory, + 'mode' => $this->mode, + ]; + } + + public function resolveResourcePath(): string + { + return "profiles/{$this->id}"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/UpdateSalesInvoiceRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/UpdateSalesInvoiceRequest.php new file mode 100644 index 0000000..9ec390c --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/UpdateSalesInvoiceRequest.php @@ -0,0 +1,101 @@ + + */ + private ?DataCollection $lines; + + private ?string $webhookUrl; + + private ?Discount $discount; + + private ?bool $isEInvoice; + + public function __construct( + string $id, + string $status, + string $recipientIdentifier, + ?string $memo = null, + ?string $paymentTerm = null, + ?PaymentDetails $paymentDetails = null, + ?EmailDetails $emailDetails = null, + ?Recipient $recipient = null, + ?DataCollection $lines = null, + ?string $webhookUrl = null, + ?Discount $discount = null, + ?bool $isEInvoice = null + ) { + $this->id = $id; + $this->status = $status; + $this->recipientIdentifier = $recipientIdentifier; + $this->memo = $memo; + $this->paymentTerm = $paymentTerm; + $this->paymentDetails = $paymentDetails; + $this->emailDetails = $emailDetails; + $this->recipient = $recipient; + $this->lines = $lines; + $this->webhookUrl = $webhookUrl; + $this->discount = $discount; + $this->isEInvoice = $isEInvoice; + } + + public function defaultPayload(): array + { + return [ + 'status' => $this->status, + 'recipientIdentifier' => $this->recipientIdentifier, + 'memo' => $this->memo, + 'paymentTerm' => $this->paymentTerm, + 'paymentDetails' => $this->paymentDetails, + 'emailDetails' => $this->emailDetails, + 'recipient' => $this->recipient, + 'lines' => $this->lines, + 'webhookUrl' => $this->webhookUrl, + 'discount' => $this->discount, + 'isEInvoice' => $this->isEInvoice, + ]; + } + + public function resolveResourcePath(): string + { + return "sales-invoices/{$this->id}"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/UpdateSubscriptionRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/UpdateSubscriptionRequest.php new file mode 100644 index 0000000..0f5a5c4 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/UpdateSubscriptionRequest.php @@ -0,0 +1,99 @@ +customerId = $customerId; + $this->subscriptionId = $subscriptionId; + $this->amount = $amount; + $this->description = $description; + $this->interval = $interval; + $this->startDate = $startDate; + $this->times = $times; + $this->metadata = $metadata; + $this->webhookUrl = $webhookUrl; + $this->mandateId = $mandateId; + } + + protected function defaultPayload(): array + { + return [ + 'amount' => $this->amount, + 'description' => $this->description, + 'interval' => $this->interval, + 'startDate' => $this->startDate, + 'times' => $this->times, + 'metadata' => $this->metadata, + 'webhookUrl' => $this->webhookUrl, + 'mandateId' => $this->mandateId, + ]; + } + + /** + * The resource path. + */ + public function resolveResourcePath(): string + { + return "customers/{$this->customerId}/subscriptions/{$this->subscriptionId}"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Requests/UpdateWebhookRequest.php b/vendor/mollie/mollie-api-php/src/Http/Requests/UpdateWebhookRequest.php new file mode 100644 index 0000000..84e1b63 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Requests/UpdateWebhookRequest.php @@ -0,0 +1,75 @@ +id = $id; + $this->url = $url; + $this->name = $name; + $this->eventTypes = $eventTypes; + } + + protected function defaultPayload(): array + { + return [ + 'url' => $this->url, + 'name' => $this->name, + 'eventTypes' => Utility::transform( + $this->eventTypes, + fn ($eventTypes) => is_string($eventTypes) ? $eventTypes : Arr::join($eventTypes), + ), + ]; + } + + /** + * The resource path. + */ + public function resolveResourcePath(): string + { + return "webhooks/{$this->id}"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/Response.php b/vendor/mollie/mollie-api-php/src/Http/Response.php new file mode 100644 index 0000000..bab11bc --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/Response.php @@ -0,0 +1,142 @@ +psrResponse = $psrResponse; + $this->psrRequest = $psrRequest; + $this->pendingRequest = $pendingRequest; + $this->senderException = $senderException; + } + + /** + * Get the JSON decoded body of the response as an array or scalar value. + */ + public function json(): stdClass + { + if (! $this->decoded) { + $this->decoded = $this->decodeJson(); + } + + return $this->decoded; + } + + private function decodeJson(): stdClass + { + $decoded = json_decode($body = $this->body() ?: '{}'); + + if (json_last_error() !== JSON_ERROR_NONE) { + throw new JsonParseException("Invalid JSON response from Mollie: '{$body}'.", $body); + } + + return $decoded; + } + + public function getConnector(): Connector + { + return $this->pendingRequest->getConnector(); + } + + public function getPendingRequest(): PendingRequest + { + return $this->pendingRequest; + } + + public function getRequest(): Request + { + return $this->pendingRequest->getRequest(); + } + + public function getPsrRequest(): RequestInterface + { + return $this->psrRequest; + } + + public function getPsrResponse(): ResponseInterface + { + return $this->psrResponse; + } + + public function getSenderException(): ?Throwable + { + return $this->senderException; + } + + /** + * Get the body of the response as string. + */ + public function body(): string + { + $stream = $this->stream(); + + $contents = $stream->getContents(); + + if ($stream->isSeekable()) { + $stream->rewind(); + } + + return $contents; + } + + /** + * Get the body as a stream. + */ + public function stream(): StreamInterface + { + $stream = $this->psrResponse->getBody(); + + if ($stream->isSeekable()) { + $stream->rewind(); + } + + return $stream; + } + + public function status(): int + { + return $this->psrResponse->getStatusCode(); + } + + public function successful(): bool + { + return $this->status() >= 200 && $this->status() < 300; + } + + public function isUnprocessable(): bool + { + return $this->status() === ResponseStatusCode::HTTP_UNPROCESSABLE_ENTITY; + } + + public function isEmpty(): bool + { + return empty($this->body()); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Http/ResponseStatusCode.php b/vendor/mollie/mollie-api-php/src/Http/ResponseStatusCode.php new file mode 100644 index 0000000..6ccea90 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Http/ResponseStatusCode.php @@ -0,0 +1,132 @@ +length = $length; + } + + /** + * @throws \Mollie\Api\Exceptions\IncompatiblePlatformException + */ + public function generate(): string + { + $length = $this->length; + + $string = ''; + + while (($len = strlen($string)) < $length) { + $size = $length - $len; + + try { + $bytes = random_bytes($size); + } catch (\Exception $e) { + throw new IncompatiblePlatformException( + 'PHP function random_bytes missing. Consider overriding the DefaultIdempotencyKeyGenerator with your own.', + IncompatiblePlatformException::INCOMPATIBLE_RANDOM_BYTES_FUNCTION + ); + } + + $string .= substr(str_replace(['/', '+', '='], '', base64_encode($bytes)), 0, $size); + } + + return $string; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Idempotency/FakeIdempotencyKeyGenerator.php b/vendor/mollie/mollie-api-php/src/Idempotency/FakeIdempotencyKeyGenerator.php new file mode 100644 index 0000000..fa9a458 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Idempotency/FakeIdempotencyKeyGenerator.php @@ -0,0 +1,22 @@ +fakeKey = $fakeKey; + } + + public function generate(): string + { + return $this->fakeKey; + } +} diff --git a/vendor/mollie/mollie-api-php/src/MollieApiClient.php b/vendor/mollie/mollie-api-php/src/MollieApiClient.php new file mode 100644 index 0000000..e508aa9 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/MollieApiClient.php @@ -0,0 +1,204 @@ +httpClient = $adapterPicker->pickHttpAdapter($client); + + CompatibilityChecker::make()->checkCompatibility(); + + $this->idempotencyKeyGenerator = $idempotencyKeyGenerator ?? new DefaultIdempotencyKeyGenerator; + + $this->initializeTraits(); + } + + protected function defaultHeaders(): array + { + return [ + 'X-Mollie-Client-Info' => php_uname(), + 'Accept' => 'application/json', + ]; + } + + public function getHttpClient(): HttpAdapterContract + { + return $this->httpClient; + } + + public function resolveBaseUrl(): string + { + return Url::join($this->apiEndpoint, self::API_VERSION); + } + + public static function fake(array $expectedResponses = [], bool $retainRequests = false): MockMollieClient + { + return new MockMollieClient($expectedResponses, $retainRequests); + } + + public function __serialize(): array + { + return [ + 'apiEndpoint' => $this->apiEndpoint, + 'httpClient' => $this->httpClient, + 'idempotencyKeyGenerator' => $this->idempotencyKeyGenerator, + 'testmode' => $this->testmode, + 'versionStrings' => $this->versionStrings, + ]; + } + + public function __unserialize(array $data): void + { + $this->apiEndpoint = $data['apiEndpoint']; + $this->httpClient = $data['httpClient']; + $this->idempotencyKeyGenerator = $data['idempotencyKeyGenerator']; + $this->testmode = $data['testmode']; + $this->versionStrings = $data['versionStrings']; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Repositories/ArrayStore.php b/vendor/mollie/mollie-api-php/src/Repositories/ArrayStore.php new file mode 100644 index 0000000..5c29e3b --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Repositories/ArrayStore.php @@ -0,0 +1,73 @@ +set($data); + } + + public function set($data): self + { + $this->store = $data; + + return $this; + } + + /** + * @param mixed $default + * @return mixed + */ + public function get(string $key, $default = null) + { + return Arr::get($this->store, $key, $default); + } + + public function add(string $key, $value): self + { + $this->store[$key] = $value; + + return $this; + } + + public function has(string $key): bool + { + return Arr::has($this->store, $key); + } + + public function merge(array ...$data): self + { + $this->store = array_merge($this->store, ...$data); + + return $this; + } + + public function remove(string $key): self + { + Arr::forget($this->store, $key); + + return $this; + } + + public function all(): array + { + return $this->store; + } + + public function isEmpty(): bool + { + return empty($this->store); + } + + public function isNotEmpty(): bool + { + return ! empty($this->store); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Repositories/JsonPayloadRepository.php b/vendor/mollie/mollie-api-php/src/Repositories/JsonPayloadRepository.php new file mode 100644 index 0000000..5aa7a77 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Repositories/JsonPayloadRepository.php @@ -0,0 +1,21 @@ +store) ? @json_encode($this->store) : ''; + } + + public function toStream(StreamFactoryInterface $streamFactory): StreamInterface + { + return $streamFactory->createStream((string) $this); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Resources/AnyResource.php b/vendor/mollie/mollie-api-php/src/Resources/AnyResource.php new file mode 100644 index 0000000..e84cfa2 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Resources/AnyResource.php @@ -0,0 +1,36 @@ +attributes, $name); + } + + /** + * @param array|stdClass $attributes + */ + public function fill($attributes): void + { + $this->attributes = $attributes instanceof stdClass ? (array) $attributes : $attributes; + } + + public function toArray(): array + { + return $this->attributes; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Resources/Balance.php b/vendor/mollie/mollie-api-php/src/Resources/Balance.php new file mode 100644 index 0000000..f011ff5 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Resources/Balance.php @@ -0,0 +1,127 @@ +_links = $_links; + $this->connector = $connector; + } + + public function contains(callable $callback): bool + { + foreach ($this as $item) { + if ($callback($item)) { + return true; + } + } + + return false; + } + + public function filter(callable $callback) + { + $filteredItems = array_filter($this->getArrayCopy(), $callback); + + /** @phpstan-ignore-next-line */ + return (new static($this->connector, $filteredItems, $this->_links))->setResponse($this->response); + } + + public function first() + { + return array_values($this->getArrayCopy())[0]; + } + + /** + * @param string|callable $key + * @param mixed $value + * @return mixed + */ + public function firstWhere($key, $value = true) + { + if (! is_string($key) && is_callable($key)) { + return $this->filter($key)->first(); + } + + return $this->filter(function ($item) use ($key, $value) { + if (is_array($item)) { + return Arr::get($item, $key) === $value; + } + + return $item->{$key} === $value; + })->first(); + } + + public static function getCollectionResourceName(): string + { + // Preferred: resolve via registry using the declared resource class on the collection + if (method_exists(static::class, 'getResourceClass')) { + /** @var class-string $resourceClass */ + $resourceClass = static::getResourceClass(); + + $registry = Config::resourceRegistry(); + + if ($registry->isRegistered($resourceClass)) { + return $registry->pluralOf($resourceClass); + } + } + + // Deprecated fallback: read static::$collectionName if set + if (! empty(static::$collectionName)) { + return static::$collectionName; + } + + throw new \RuntimeException('Collection name not set'); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Resources/BaseResource.php b/vendor/mollie/mollie-api-php/src/Resources/BaseResource.php new file mode 100644 index 0000000..46ce7d9 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Resources/BaseResource.php @@ -0,0 +1,32 @@ +connector = $connector; + } + + public function getConnector(): Connector + { + return $this->connector; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Resources/Capability.php b/vendor/mollie/mollie-api-php/src/Resources/Capability.php new file mode 100644 index 0000000..8420e39 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Resources/Capability.php @@ -0,0 +1,66 @@ +status === CapabilityStatus::ENABLED; + } + + public function isPending() + { + return $this->status === CapabilityStatus::PENDING; + } + + public function isDisabled() + { + return $this->status === CapabilityStatus::DISABLED; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Resources/CapabilityCollection.php b/vendor/mollie/mollie-api-php/src/Resources/CapabilityCollection.php new file mode 100644 index 0000000..94ed6c4 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Resources/CapabilityCollection.php @@ -0,0 +1,16 @@ + Organization::class, + 'onboarding' => Onboarding::class, + ]; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Resources/ClientCollection.php b/vendor/mollie/mollie-api-php/src/Resources/ClientCollection.php new file mode 100644 index 0000000..4382716 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Resources/ClientCollection.php @@ -0,0 +1,16 @@ + $client_id, + 'state' => $state, + 'approval_prompt' => $approval_prompt, + 'scope' => implode(' ', $scopes), + ], '', '&', PHP_QUERY_RFC3986); + + return "{$this->_links->clientLink->href}?{$query}"; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Resources/ConnectBalanceTransfer.php b/vendor/mollie/mollie-api-php/src/Resources/ConnectBalanceTransfer.php new file mode 100644 index 0000000..473fe56 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Resources/ConnectBalanceTransfer.php @@ -0,0 +1,99 @@ +connector->profileMethods->createForCurrentProfile($methodId); + } + + /** + * Disable a payment method for this profile. + * + * + * @throws ApiException + */ + public function disableMethod(string $methodId): void + { + $this->connector->profileMethods->deleteForCurrentProfile($methodId); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Resources/CursorCollection.php b/vendor/mollie/mollie-api-php/src/Resources/CursorCollection.php new file mode 100644 index 0000000..80f3398 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Resources/CursorCollection.php @@ -0,0 +1,92 @@ +hasNext()) { + return null; + } + + return $this->fetchCollection($this->_links->next->href); + } + + /** + * Return the previous set of resources when available + * + * @return null|CursorCollection|Response + * + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function previous() + { + if (! $this->hasPrevious()) { + return null; + } + + return $this->fetchCollection($this->_links->previous->href); + } + + /** + * @return CursorCollection|Response + */ + private function fetchCollection(string $url) + { + return $this + ->connector + ->send((new DynamicGetRequest($url))->setHydratableResource(static::class)); + } + + /** + * Determine whether the collection has a next page available. + */ + public function hasNext(): bool + { + return isset($this->_links->next->href); + } + + /** + * Determine whether the collection has a previous page available. + */ + public function hasPrevious(): bool + { + return isset($this->_links->previous->href); + } + + /** + * Iterate over a CursorCollection and yield its elements. + */ + public function getAutoIterator(bool $iterateBackwards = false): LazyCollection + { + $page = $this; + + return (new LazyCollection(function () use ($page, $iterateBackwards): Generator { + while (true) { + foreach ($page as $item) { + yield $item; + } + + if (($iterateBackwards && ! $page->hasPrevious()) || ! $page->hasNext()) { + break; + } + + $page = $iterateBackwards + ? $page->previous() + : $page->next(); + } + }))->setResponse($this->response); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Resources/Customer.php b/vendor/mollie/mollie-api-php/src/Resources/Customer.php new file mode 100644 index 0000000..58f9934 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Resources/Customer.php @@ -0,0 +1,213 @@ + $this->name, + 'email' => $this->email, + 'locale' => $this->locale, + 'metadata' => $this->metadata, + ]; + + /** @var null|Customer */ + return $this->connector->customers->update($this->id, $body); + } + + /** + * @return Payment + * + * @throws ApiException + */ + public function createPayment(array $options = [], array $filters = []) + { + return $this->connector->customerPayments->createFor( + $this, + $options, + $filters, + $this->isInTestmode() + ); + } + + /** + * Get all payments for this customer + * + * @return PaymentCollection + * + * @throws ApiException + */ + public function payments() + { + return $this->connector->customerPayments->pageFor($this, null, null, $this->withMode()); + } + + /** + * @return Subscription + * + * @throws ApiException + */ + public function createSubscription(array $options = [], array $filters = []) + { + return $this->connector->subscriptions->createFor($this, $options, $this->isInTestmode()); + } + + /** + * @param string $subscriptionId + * @return Subscription + * + * @throws ApiException + */ + public function getSubscription($subscriptionId) + { + return $this->connector->subscriptions->getFor($this, $subscriptionId, $this->isInTestmode()); + } + + /** + * @param string $subscriptionId + * @return \Mollie\Api\Resources\Subscription + * + * @throws ApiException + */ + public function cancelSubscription($subscriptionId) + { + return $this->connector->subscriptions->cancelFor($this, $subscriptionId, $this->isInTestmode()); + } + + /** + * Get all subscriptions for this customer + * + * @return SubscriptionCollection + * + * @throws ApiException + */ + public function subscriptions() + { + return $this->connector->subscriptions->pageFor($this, null, null, $this->withMode()); + } + + /** + * @return Mandate + * + * @throws ApiException + */ + public function createMandate(array $options = []) + { + return $this->connector->mandates->createFor($this, $options, $this->isInTestmode()); + } + + /** + * @param string $mandateId + * @return Mandate + * + * @throws ApiException + */ + public function getMandate($mandateId, array $parameters = []) + { + return $this->connector->mandates->getFor($this, $mandateId, $this->withMode($parameters)); + } + + /** + * @param string $mandateId + * + * @throws ApiException + */ + public function revokeMandate($mandateId): void + { + $this->connector->mandates->revokeFor($this, $mandateId, $this->withMode()); + } + + /** + * Get all mandates for this customer + * + * @return MandateCollection + * + * @throws ApiException + */ + public function mandates() + { + return $this->connector->mandates->pageFor($this, null, null, $this->withMode()); + } + + /** + * Helper function to check for mandate with status valid + * + * @return bool + */ + public function hasValidMandate() + { + return $this->mandates() + ->contains(fn (Mandate $mandate) => $mandate->isValid()); + } + + /** + * Helper function to check for specific payment method mandate with status valid + */ + public function hasValidMandateForMethod($method): bool + { + return $this->mandates() + ->contains(fn (Mandate $mandate) => $mandate->isValid() && $mandate->method === $method); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Resources/CustomerCollection.php b/vendor/mollie/mollie-api-php/src/Resources/CustomerCollection.php new file mode 100644 index 0000000..31a2044 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Resources/CustomerCollection.php @@ -0,0 +1,16 @@ +status == InvoiceStatus::PAID; + } + + public function isOpen(): bool + { + return $this->status == InvoiceStatus::OPEN; + } + + public function isOverdue(): bool + { + return $this->status == InvoiceStatus::OVERDUE; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Resources/InvoiceCollection.php b/vendor/mollie/mollie-api-php/src/Resources/InvoiceCollection.php new file mode 100644 index 0000000..01dbbf2 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Resources/InvoiceCollection.php @@ -0,0 +1,16 @@ + + */ +class LazyCollection implements IsResponseAware, IteratorAggregate +{ + use HasResponse; + + /** + * @var callable + */ + private $source; + + /** + * @param callable $source + */ + public function __construct($source) + { + $this->source = $source; + } + + /** + * Get all items in the collection. + */ + public function all(): array + { + return iterator_to_array($this->getIterator()); + } + + /** + * Get an item from the collection by key. + * + * @param TKey $key + * @return TValue|null + */ + public function get($key) + { + foreach ($this as $outerKey => $outerValue) { + if ($outerKey == $key) { + return $outerValue; + } + } + + return null; + } + + /** + * Run a filter over each of the items. + * + * @param (callable(TValue, TKey): bool) $callback + */ + public function filter(callable $callback): self + { + return (new self(function () use ($callback) { + foreach ($this as $key => $value) { + if ($callback($value, $key)) { + yield $key => $value; + } + } + }))->setResponse($this->response); + } + + /** + * Get the first item from the collection passing the given truth test. + * + * @param (callable(TValue, TKey): bool)|null $callback + * @return TValue|null + */ + public function first(?callable $callback = null) + { + $iterator = $this->getIterator(); + + if (is_null($callback)) { + if (! $iterator->valid()) { + return null; + } + + return $iterator->current(); + } + + foreach ($iterator as $key => $value) { + if ($callback($value, $key)) { + return $value; + } + } + + return null; + } + + /** + * Run a map over each of the items. + * + * @template TMapValue + * + * @param callable(TValue, TKey): TMapValue $callback + * @return static + */ + public function map(callable $callback): self + { + return (new self(function () use ($callback) { + foreach ($this as $key => $value) { + yield $key => $callback($value, $key); + } + }))->setResponse($this->response); + } + + /** + * Take the first {$limit} items. + * + * @return static + */ + public function take(int $limit): self + { + return (new self(function () use ($limit) { + $iterator = $this->getIterator(); + + while ($limit--) { + if (! $iterator->valid()) { + break; + } + + yield $iterator->key() => $iterator->current(); + + if ($limit) { + $iterator->next(); + } + } + }))->setResponse($this->response); + } + + /** + * Determine if all items pass the given truth test. + * + * @param (callable(TValue, TKey): bool) $callback + */ + public function every(callable $callback): bool + { + $iterator = $this->getIterator(); + + foreach ($iterator as $key => $value) { + if (! $callback($value, $key)) { + return false; + } + } + + return true; + } + + /** + * Count the number of items in the collection. + */ + public function count(): int + { + return iterator_count($this->getIterator()); + } + + /** + * Get an iterator for the items. + * + * @return Iterator + */ + public function getIterator(): Iterator + { + return $this->makeIterator($this->source); + } + + /** + * Get an iterator for the given value. + * + * @template TIteratorKey of array-key + * @template TIteratorValue + * + * @param IteratorAggregate|(callable(): \Generator) $source + * @return Iterator + */ + protected function makeIterator($source): Iterator + { + if ($source instanceof IteratorAggregate) { + return $source->getIterator(); + } + + return $source(); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Resources/Mandate.php b/vendor/mollie/mollie-api-php/src/Resources/Mandate.php new file mode 100644 index 0000000..e421f65 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Resources/Mandate.php @@ -0,0 +1,100 @@ +status === MandateStatus::VALID; + } + + public function isPending(): bool + { + return $this->status === MandateStatus::PENDING; + } + + public function isInvalid(): bool + { + return $this->status === MandateStatus::INVALID; + } + + /** + * Revoke the mandate + */ + public function revoke(): void + { + if (! isset($this->customerId)) { + return; + } + + $this + ->connector + ->mandates + ->revokeForId( + $this->customerId, + $this->id, + $this->isInTestmode() + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Resources/MandateCollection.php b/vendor/mollie/mollie-api-php/src/Resources/MandateCollection.php new file mode 100644 index 0000000..5955bf1 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Resources/MandateCollection.php @@ -0,0 +1,24 @@ +filter(fn (Mandate $mandate) => $mandate->status === $status); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Resources/Method.php b/vendor/mollie/mollie-api-php/src/Resources/Method.php new file mode 100644 index 0000000..882cb51 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Resources/Method.php @@ -0,0 +1,125 @@ +size1x and $image->size2x to display the payment method logo. + * + * @var \stdClass + */ + public $image; + + /** + * The issuers available for this payment method. Only for the methods iDEAL, KBC/CBC and gift cards. + * Will only be filled when explicitly requested using the query string `include` parameter. + * + * @var array|object[] + */ + public $issuers; + + /** + * The pricing for this payment method. Will only be filled when explicitly requested using the query string + * `include` parameter. + * + * @var array|object[] + */ + public $pricing; + + /** + * The activation status the method is in. + * If the method has status "null", this value will be returned as a null value, not as a string. + * + * @var string | null + */ + public $status; + + /** + * @var \stdClass + */ + public $_links; + + /** + * Get the issuer value objects + */ + public function issuers(): IssuerCollection + { + /** @var IssuerCollection */ + $collection = ResourceFactory::createCollection( + $this->connector, + IssuerCollection::class + ); + + if ($this->issuers === null) { + return $collection; + } + + /** @var IssuerCollection */ + $collection = (new ResourceHydrator)->hydrateCollection( + $collection, + (array) $this->issuers, + $this->response + ); + + return $collection; + } + + /** + * Get the method price value objects. + */ + public function pricing(): MethodPriceCollection + { + /** @var MethodPriceCollection */ + $collection = ResourceFactory::createCollection( + $this->connector, + MethodPriceCollection::class + ); + + if ($this->pricing === null) { + return $collection; + } + + /** @var MethodPriceCollection */ + $collection = (new ResourceHydrator)->hydrateCollection( + $collection, + (array) $this->pricing, + $this->response + ); + + return $collection; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Resources/MethodCollection.php b/vendor/mollie/mollie-api-php/src/Resources/MethodCollection.php new file mode 100644 index 0000000..32e5dd0 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Resources/MethodCollection.php @@ -0,0 +1,13 @@ +status === OnboardingStatus::NEEDS_DATA; + } + + public function inReview(): bool + { + return $this->status === OnboardingStatus::IN_REVIEW; + } + + public function isCompleted(): bool + { + return $this->status === OnboardingStatus::COMPLETED; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Resources/Organization.php b/vendor/mollie/mollie-api-php/src/Resources/Organization.php new file mode 100644 index 0000000..37ea605 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Resources/Organization.php @@ -0,0 +1,76 @@ +consumerName and $details->consumerAccount. + * + * @var \stdClass|null + */ + public $details; + + /** + * Used to restrict the payment methods available to your customer to those from a single country. + * + * @var string|null + */ + public $restrictPaymentMethodsToCountry; + + /** + * @var \stdClass + */ + public $_links; + + /** + * @var \stdClass + */ + public $_embedded; + + /** + * Whether or not this payment can be canceled. + * + * @var bool|null + */ + public $isCancelable; + + /** + * The total amount that is already captured for this payment. Only available + * when this payment supports captures. + * + * @var \stdClass|null + */ + public $amountCaptured; + + /** + * Indicates whether the capture will be scheduled automatically or not. Set + * to manual to capture the payment manually using the Create capture endpoint. + * + * Possible values: "automatic", "manual" + * + * @var string|null + */ + public $captureMode; + + /** + * Indicates the interval to wait before the payment is + * captured, for example `8 hours` or `2 days. The capture delay + * will be added to the date and time the payment became authorized. + * + * Possible values: ... hours ... days + * + * @example 8 hours + * + * @var string|null + */ + public $captureDelay; + + /** + * UTC datetime on which the merchant has to have captured the payment in + * ISO-8601 format. This parameter is omitted if the payment is not authorized (yet). + * + * @example "2013-12-25T10:30:54+00:00" + * + * @var string|null + */ + public $captureBefore; + + /** + * The application fee, if the payment was created with one. Contains amount + * (the value and currency) and description. + * + * @var \stdClass|null + */ + public $applicationFee; + + /** + * An optional routing configuration which enables you to route a successful payment, + * or part of the payment, to one or more connected accounts. Additionally, you can + * schedule (parts of) the payment to become available on the connected account on a + * future date. + * + * @var array|null + */ + public $routing; + + /** + * The date and time the payment became authorized, in ISO 8601 format. This + * parameter is omitted if the payment is not authorized (yet). + * + * @example "2013-12-25T10:30:54+00:00" + * + * @var string|null + */ + public $authorizedAt; + + /** + * The date and time the payment was expired, in ISO 8601 format. This + * parameter is omitted if the payment did not expire (yet). + * + * @example "2013-12-25T10:30:54+00:00" + * + * @var string|null + */ + public $expiredAt; + + /** + * If a customer was specified upon payment creation, the customer’s token will + * be available here as well. + * + * @example cst_XPn78q9CfT + * + * @var string|null + */ + public $customerId; + + /** + * This optional field contains your customer’s ISO 3166-1 alpha-2 country code, + * detected by us during checkout. For example: BE. This field is omitted if the + * country code was not detected. + * + * @var string|null + */ + public $countryCode; + + public function getEmbeddedResourcesMap(): array + { + return [ + 'captures' => CaptureCollection::class, + 'refunds' => RefundCollection::class, + 'chargebacks' => ChargebackCollection::class, + ]; + } + + /** + * Is this payment canceled? + */ + public function isCanceled(): bool + { + return $this->status === PaymentStatus::CANCELED; + } + + /** + * Is this payment expired? + */ + public function isExpired(): bool + { + return $this->status === PaymentStatus::EXPIRED; + } + + /** + * Is this payment still open / ongoing? + */ + public function isOpen(): bool + { + return $this->status === PaymentStatus::OPEN; + } + + /** + * Is this payment pending? + */ + public function isPending(): bool + { + return $this->status === PaymentStatus::PENDING; + } + + /** + * Is this payment authorized? + */ + public function isAuthorized(): bool + { + return $this->status === PaymentStatus::AUTHORIZED; + } + + /** + * Is this payment paid for? + */ + public function isPaid(): bool + { + return ! empty($this->paidAt); + } + + /** + * Does the payment have refunds + */ + public function hasRefunds(): bool + { + return ! empty($this->_links->refunds); + } + + /** + * Does this payment has chargebacks + */ + public function hasChargebacks(): bool + { + return ! empty($this->_links->chargebacks); + } + + /** + * Is this payment failing? + */ + public function isFailed(): bool + { + return $this->status === PaymentStatus::FAILED; + } + + /** + * Check whether 'sequenceType' is set to 'first'. If a 'first' payment has been + * completed successfully, the consumer's account may be charged automatically + * using recurring payments. + */ + public function hasSequenceTypeFirst(): bool + { + return $this->sequenceType === SequenceType::FIRST; + } + + /** + * Check whether 'sequenceType' is set to 'recurring'. This type of payment is + * processed without involving + * the consumer. + */ + public function hasSequenceTypeRecurring(): bool + { + return $this->sequenceType === SequenceType::RECURRING; + } + + /** + * Get the checkout URL where the customer can complete the payment. + */ + public function getCheckoutUrl(): ?string + { + if (empty($this->_links->checkout)) { + return null; + } + + return $this->_links->checkout->href; + } + + /** + * Get the mobile checkout URL where the customer can complete the payment. + */ + public function getMobileAppCheckoutUrl(): ?string + { + if (empty($this->_links->mobileAppCheckout)) { + return null; + } + + return $this->_links->mobileAppCheckout->href; + } + + public function canBeRefunded(): bool + { + return $this->amountRemaining !== null; + } + + public function canBePartiallyRefunded(): bool + { + return $this->canBeRefunded(); + } + + /** + * Get the amount that is already refunded + */ + public function getAmountRefunded(): float + { + if ($this->amountRefunded) { + return (float) $this->amountRefunded->value; + } + + return 0.0; + } + + /** + * Get the remaining amount that can be refunded. For some payment methods this + * amount can be higher than the payment amount. This is possible to reimburse + * the costs for a return shipment to your customer for example. + */ + public function getAmountRemaining(): float + { + if ($this->amountRemaining) { + return (float) $this->amountRemaining->value; + } + + return 0.0; + } + + /** + * Get the total amount that was charged back for this payment. Only available when the + * total charged back amount is not zero. + */ + public function getAmountChargedBack(): float + { + if ($this->amountChargedBack) { + return (float) $this->amountChargedBack->value; + } + + return 0.0; + } + + /** + * Does the payment have split payments + */ + public function hasSplitPayments(): bool + { + return ! empty($this->routing); + } + + /** + * Retrieves all refunds associated with this payment + * + * @throws ApiException + */ + public function refunds(): RefundCollection + { + if (! isset($this->_links->refunds->href)) { + return RefundCollection::withResponse($this->response, $this->connector); + } + + return $this + ->connector + ->send((new DynamicGetRequest($this->_links->refunds->href))->setHydratableResource(RefundCollection::class)); + } + + /** + * @param string $refundId + * + * @throws ApiException + */ + public function getRefund($refundId, array $parameters = []): Refund + { + return $this->connector->paymentRefunds->getFor($this, $refundId, $parameters, $this->isInTestmode()); + } + + /** + * @throws ApiException + */ + public function listRefunds(array $parameters = []): RefundCollection + { + return $this + ->connector + ->paymentRefunds + ->pageFor( + $this, + null, + null, + $this->withMode($parameters), + ); + } + + /** + * Retrieves all captures associated with this payment + * + * @throws ApiException + */ + public function captures(): CaptureCollection + { + if (! isset($this->_links->captures->href)) { + return CaptureCollection::withResponse($this->response, $this->connector); + } + + return $this + ->connector + ->send((new DynamicGetRequest($this->_links->captures->href))->setHydratableResource(CaptureCollection::class)); + } + + /** + * @param string $captureId + * + * @throws ApiException + */ + public function getCapture($captureId, array $parameters = []): Capture + { + return $this->connector->paymentCaptures->getFor( + $this, + $captureId, + $parameters, + $this->isInTestmode() + ); + } + + /** + * Retrieves all chargebacks associated with this payment + * + * @throws ApiException + */ + public function chargebacks(): ChargebackCollection + { + if (! isset($this->_links->chargebacks->href)) { + return ChargebackCollection::withResponse($this->response, $this->connector); + } + + return $this + ->connector + ->send((new DynamicGetRequest($this->_links->chargebacks->href))->setHydratableResource(ChargebackCollection::class)); + } + + /** + * Retrieves a specific chargeback for this payment. + * + * @param string $chargebackId + * + * @throws ApiException + */ + public function getChargeback($chargebackId, array $parameters = []): Chargeback + { + return $this->connector->paymentChargebacks->getFor( + $this, + $chargebackId, + $parameters, + $this->isInTestmode() + ); + } + + /** + * Issue a refund for this payment. + * + * @param array $data + * + * @throws ApiException + */ + public function refund($data): Refund + { + return $this->connector->paymentRefunds->createFor($this, $data); + } + + /** + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function update(): Payment + { + $additional = []; + if ($this->method === PaymentMethod::BANKTRANSFER) { + $additional['dueDate'] = $this->dueDate; + } + + $updateRequest = (new UpdatePaymentRequest( + $this->id, + $this->description, + $this->redirectUrl, + $this->cancelUrl, + $this->webhookUrl, + (array) $this->metadata, + $this->method, + $this->locale, + $this->restrictPaymentMethodsToCountry, + $additional + ))->test($this->isInTestmode()); + + /** @var null|Payment */ + return $this + ->connector + ->send($updateRequest); + } + + /** + * The total amount that is already captured for this payment. Only available + * when this payment supports captures. + */ + public function getAmountCaptured(): float + { + if ($this->amountCaptured) { + return (float) $this->amountCaptured->value; + } + + return 0.0; + } + + /** + * The amount that has been settled. + */ + public function getSettlementAmount(): float + { + if ($this->settlementAmount) { + return (float) $this->settlementAmount->value; + } + + return 0.0; + } + + /** + * The total amount that is already captured for this payment. Only available + * when this payment supports captures. + */ + public function getApplicationFeeAmount(): float + { + if ($this->applicationFee) { + return (float) $this->applicationFee->amount->value; + } + + return 0.0; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Resources/PaymentCollection.php b/vendor/mollie/mollie-api-php/src/Resources/PaymentCollection.php new file mode 100644 index 0000000..b1ebca3 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Resources/PaymentCollection.php @@ -0,0 +1,16 @@ +paidAt); + } + + /** + * Get the checkout URL where the customer can complete the payment. + */ + public function getCheckoutUrl(): ?string + { + if (empty($this->_links->paymentLink)) { + return null; + } + + return $this->_links->paymentLink->href; + } + + /** + * Persist the current local Payment Link state to the Mollie API. + * + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function update(): ?PaymentLink + { + return $this->connector->paymentLinks->update($this->id, $this->withMode([ + 'description' => $this->description, + 'archived' => $this->archived, + ])); + } + + /** + * Archive this Payment Link. + * + * @return \Mollie\Api\Resources\PaymentLink + * + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function archive() + { + return $this->connector->paymentLinks->update($this->id, $this->withMode([ + 'archived' => true, + ])); + } + + /** + * Retrieve a paginated list of payments associated with this payment link. + * + * @return mixed|\Mollie\Api\Resources\BaseCollection + */ + public function payments(?string $from = null, ?int $limit = null, array $filters = []) + { + return $this->connector->paymentLinkPayments->pageFor( + $this, + $from, + $limit, + $this->withMode($filters) + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Resources/PaymentLinkCollection.php b/vendor/mollie/mollie-api-php/src/Resources/PaymentLinkCollection.php new file mode 100644 index 0000000..ea70210 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Resources/PaymentLinkCollection.php @@ -0,0 +1,16 @@ +status == ProfileStatus::UNVERIFIED; + } + + public function isVerified(): bool + { + return $this->status == ProfileStatus::VERIFIED; + } + + public function isBlocked(): bool + { + return $this->status == ProfileStatus::BLOCKED; + } + + /** + * @throws ApiException + */ + public function update(): ?Profile + { + $body = [ + 'name' => $this->name, + 'website' => $this->website, + 'email' => $this->email, + 'phone' => $this->phone, + 'businessCategory' => $this->businessCategory, + 'mode' => $this->mode, + ]; + + return $this->connector->profiles->update($this->id, $body); + } + + /** + * Retrieves all chargebacks associated with this profile + * + * @throws ApiException + */ + public function chargebacks(): ChargebackCollection + { + if (! isset($this->_links->chargebacks->href)) { + return ChargebackCollection::withResponse($this->response, $this->connector); + } + + return $this + ->connector + ->send((new DynamicGetRequest($this->_links->chargebacks->href))->setHydratableResource(ChargebackCollection::class)); + } + + /** + * Retrieves all methods activated on this profile + * + * @throws ApiException + */ + public function methods(): MethodCollection + { + if (! isset($this->_links->methods->href)) { + return MethodCollection::withResponse($this->response, $this->connector); + } + + return $this + ->connector + ->send((new DynamicGetRequest($this->_links->methods->href))->setHydratableResource(MethodCollection::class)); + } + + /** + * Enable a payment method for this profile. + * + * + * @throws ApiException + */ + public function enableMethod(string $methodId): Method + { + return $this->connector->profileMethods->createFor($this, $methodId); + } + + /** + * Disable a payment method for this profile. + * + * + * @throws ApiException + */ + public function disableMethod(string $methodId): void + { + $this->connector->profileMethods->deleteFor($this, $methodId); + } + + /** + * Retrieves all payments associated with this profile + * + * @throws ApiException + */ + public function payments(): PaymentCollection + { + if (! isset($this->_links->payments->href)) { + return PaymentCollection::withResponse($this->response, $this->connector); + } + + return $this + ->connector + ->send((new DynamicGetRequest($this->_links->payments->href))->setHydratableResource(PaymentCollection::class)); + } + + /** + * Retrieves all refunds associated with this profile + * + * @throws ApiException + */ + public function refunds(): RefundCollection + { + if (! isset($this->_links->refunds->href)) { + return RefundCollection::withResponse($this->response, $this->connector); + } + + return $this + ->connector + ->send((new DynamicGetRequest($this->_links->refunds->href))->setHydratableResource(RefundCollection::class)); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Resources/ProfileCollection.php b/vendor/mollie/mollie-api-php/src/Resources/ProfileCollection.php new file mode 100644 index 0000000..e8fe211 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Resources/ProfileCollection.php @@ -0,0 +1,16 @@ +isQueued() || $this->isPending(); + } + + /** + * Is this refund queued? + */ + public function isQueued(): bool + { + return $this->status === RefundStatus::QUEUED; + } + + /** + * Is this refund pending? + */ + public function isPending(): bool + { + return $this->status === RefundStatus::PENDING; + } + + /** + * Is this refund processing? + */ + public function isProcessing(): bool + { + return $this->status === RefundStatus::PROCESSING; + } + + /** + * Is this refund transferred to consumer? + */ + public function isTransferred(): bool + { + return $this->status === RefundStatus::REFUNDED; + } + + /** + * Is this refund failed? + */ + public function isFailed(): bool + { + return $this->status === RefundStatus::FAILED; + } + + /** + * Is this refund canceled? + */ + public function isCanceled(): bool + { + return $this->status === RefundStatus::CANCELED; + } + + /** + * Cancel the refund. + * + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function cancel(): void + { + $this + ->connector + ->send((new CancelPaymentRefundRequest( + $this->paymentId, + $this->id + ))->test($this->isInTestmode())); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Resources/RefundCollection.php b/vendor/mollie/mollie-api-php/src/Resources/RefundCollection.php new file mode 100644 index 0000000..1ab9eec --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Resources/RefundCollection.php @@ -0,0 +1,16 @@ +exchangeArray($items); + + return $this; + } + + /** + * @return $this + */ + public static function withResponse(Response $response, Connector $connector, $items = [], ?\stdClass $_links = null): self + { + $collection = new static($connector, $items, $_links); + + return $collection->setResponse($response); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Resources/ResourceFactory.php b/vendor/mollie/mollie-api-php/src/Resources/ResourceFactory.php new file mode 100644 index 0000000..5a9f200 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Resources/ResourceFactory.php @@ -0,0 +1,47 @@ +fill($data); + } else { + foreach ($data as $property => $value) { + $resource->{$property} = $this->holdsEmbeddedResources($resource, $property, $value) + ? $this->parseEmbeddedResources($resource->getConnector(), $resource, $value, $response) + : $value; + } + } + + $resource->setResponse($response); + + return $resource; + } + + /** + * Hydrate a collection with data. + * + * @param array|object $items + * @param object|null $_links + */ + public function hydrateCollection( + ResourceCollection $collection, + $items, + Response $response, + $_links = null + ): ResourceCollection { + // Convert object to array for consistent handling + if (is_object($items)) { + $items = (array) $items; + } + + $hydratedItems = array_map( + fn ($item) => $this->hydrate( + ResourceFactory::create($response->getConnector(), $collection::getResourceClass()), + $item, + $response + ), + $items + ); + + if ($_links !== null) { + $collection->_links = $_links; + } + + return $collection + ->setItems($hydratedItems) + ->setResponse($response); + } + + private function holdsEmbeddedResources(object $resource, string $key, $value): bool + { + return $key === '_embedded' + && ! is_null($value) + && $resource instanceof EmbeddedResourcesContract; + } + + private function parseEmbeddedResources( + Connector $connector, + object $resource, + object $embedded, + Response $response + ): object { + $result = new \stdClass; + + foreach ($embedded as $resourceKey => $resourceData) { + $collectionOrResourceClass = $resource->getEmbeddedResourcesMap()[$resourceKey] ?? null; + + if (is_null($collectionOrResourceClass)) { + throw new EmbeddedResourcesNotParseableException( + 'Resource '.get_class($resource)." does not have a mapping for embedded resource {$resourceKey}" + ); + } + + $result->{$resourceKey} = is_subclass_of($collectionOrResourceClass, BaseResource::class) + ? $this->hydrate( + ResourceFactory::create($connector, $collectionOrResourceClass), + $resourceData, + $response + ) + : $this->hydrateCollection( + ResourceFactory::createCollection($connector, $collectionOrResourceClass), + $resourceData, + $response + ); + } + + return $result; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Resources/ResourceRegistry.php b/vendor/mollie/mollie-api-php/src/Resources/ResourceRegistry.php new file mode 100644 index 0000000..0287653 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Resources/ResourceRegistry.php @@ -0,0 +1,187 @@ +, array{singular: string, plural: string}> */ + private array $byClass = []; + + /** @var array> */ + private array $byType = []; + + /** + * Default singleton instance for lookups where dependency injection is not wired. + */ + private static ?self $default = null; + + /** + * Optionally allow pre-registration of classes, though defaults cover common resources. + * + * @param array, string> $resources + */ + public function __construct(array $resources = []) + { + $this->setup($resources); + } + + /** + * Get a default singleton instance preloaded with known resources. + */ + public static function default(): self + { + if (! self::$default) { + self::$default = new self(); + } + + return self::$default; + } + + /** + * Resolve a resource class for the given type string (singular/plural/alias). + */ + public function for(string $type): ?string + { + $key = Str::kebab($type); + + return $this->byType[$key] ?? null; + } + + /** + * Register or override the mapping for a resource class. + */ + public function register(string $resourceClass, string $plural, ?string $singular = null): void + { + $names = $this->deriveNames($resourceClass, $plural, $singular); + + $this->byClass[$resourceClass] = $names; + $this->byType[$names[self::SINGULAR_KEY]] = $resourceClass; + $this->byType[$names[self::PLURAL_KEY]] = $resourceClass; + } + + /** + * Get the names for a class (singular, plural, aliases). + * @return array{singular: string, plural: string}|null + */ + public function namesOf(string $resourceClass): ?array + { + return Arr::get($this->byClass, $resourceClass); + } + + public function singularOf(string $resourceClass): string + { + if (! $this->isRegistered($resourceClass)) { + $this->throwInvalidArgumentException($resourceClass); + } + + return Arr::get($this->byClass, $resourceClass . '.' . self::SINGULAR_KEY); + } + + /** + * Get the plural (kebab-case) for a resource class. + */ + public function pluralOf(string $resourceClass): string + { + if (! $this->isRegistered($resourceClass)) { + $this->throwInvalidArgumentException($resourceClass); + } + + return Arr::get($this->byClass, $resourceClass . '.' . self::PLURAL_KEY); + } + + public function isRegistered(string $resourceClass): bool + { + return Arr::exists($this->byClass, $resourceClass); + } + + private function setup(array $resources): void + { + $resources = array_merge($this->defaultResources(), $resources); + + foreach ($resources as $resourceClass => $plural) { + $this->register($resourceClass, $plural); + } + } + + /** + * Explicit collection keys for resources that either do not have a collection + * class or where we want to avoid runtime collection key logic. + * Values are canonical kebab-case. + * + * @return array, string> + */ + private function defaultResources(): array + { + return [ + Balance::class => 'balances', + BalanceReport::class => 'balance-reports', + BalanceTransaction::class => 'balance-transactions', + Capability::class => 'capabilities', + Capture::class => 'captures', + Chargeback::class => 'chargebacks', + Client::class => 'clients', + ClientLink::class => 'client-links', + ConnectBalanceTransfer::class => 'connect-balance-transfers', + Customer::class => 'customers', + Invoice::class => 'invoices', + Issuer::class => 'issuers', + Mandate::class => 'mandates', + Method::class => 'methods', + MethodPrice::class => 'method-prices', + Onboarding::class => 'onboardings', + Organization::class => 'organizations', + Partner::class => 'partners', + Payment::class => 'payments', + PaymentLink::class => 'payment-links', + Permission::class => 'permissions', + Profile::class => 'profiles', + Refund::class => 'refunds', + Route::class => 'routes', + SalesInvoice::class => 'sales-invoices', + Session::class => 'sessions', + Settlement::class => 'settlements', + Subscription::class => 'subscriptions', + Terminal::class => 'terminals', + Webhook::class => 'webhooks', + WebhookEvent::class => 'webhook-events', + ]; + } + + /** + * Build derived names and alias list for a resource class. + * + * @return array{singular: string, plural: string} + */ + private function deriveNames(string $resourceClass, string $plural, ?string $singular): array + { + $singular = Str::kebab($singular ?? Utility::classBasename($resourceClass)); + + if (empty($plural)) { + $this->throwInvalidArgumentException($resourceClass); + } + + $plural = Str::kebab($plural); + + return [ + self::SINGULAR_KEY => $singular, + self::PLURAL_KEY => $plural, + ]; + } + + private function throwInvalidArgumentException(string $resourceClass): void + { + throw new \InvalidArgumentException($resourceClass . ' is not registered'); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Resources/ResourceResolver.php b/vendor/mollie/mollie-api-php/src/Resources/ResourceResolver.php new file mode 100644 index 0000000..f22c683 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Resources/ResourceResolver.php @@ -0,0 +1,102 @@ +hydrator = $hydrator; + } + + /** + * Resolve a response into the appropriate resource type. + * + * @return Response|BaseResource|BaseCollection|LazyCollection|IsWrapper + */ + public function resolve(ResourceHydratableRequest $request, Response $response) + { + $targetResourceClass = $request->getHydratableResource(); + + if ($targetResourceClass instanceof WrapperResource) { + $response = $this->resolve( + $request->resetHydratableResource(), + $response + ); + + return ResourceFactory::createDecoratedResource($response, $targetResourceClass->getWrapper()); + } + + if ($this->isCollectionTarget($targetResourceClass)) { + $collection = $this->resolveCollection($response, $targetResourceClass); + + return $this->unwrapIterator($request, $collection); + } + + if ($this->isResourceTarget($targetResourceClass)) { + $resource = ResourceFactory::create($response->getConnector(), $targetResourceClass); + + return $this->hydrator->hydrate($resource, $response->json(), $response); + } + + return $response; + } + + /** + * @param Response $response + * @param class-string $targetCollectionClass + * @return BaseCollection + */ + private function resolveCollection(Response $response, string $targetCollectionClass): BaseCollection + { + $result = $response->json(); + + $collection = ResourceFactory::createCollection( + $response->getConnector(), + $targetCollectionClass + ); + + $kebabCollectionKey = Config::resourceRegistry()->pluralOf($targetCollectionClass::getResourceClass()); + + $data = isset($result->_embedded->{$kebabCollectionKey}) + ? $result->_embedded->{$kebabCollectionKey} + : $result->_embedded->{Str::snake($kebabCollectionKey)}; + + return $this->hydrator->hydrateCollection( + $collection, + $data, + $response, + $result->_links + ); + } + + private function unwrapIterator(Request $request, BaseCollection $collection) + { + if ($request instanceof IsIteratable && $request->iteratorEnabled()) { + /** @var CursorCollection $collection */ + return $collection->getAutoIterator($request->iteratesBackwards()); + } + + return $collection; + } + + private function isCollectionTarget(string $targetResourceClass): bool + { + return is_subclass_of($targetResourceClass, BaseCollection::class); + } + + private function isResourceTarget(string $targetResourceClass): bool + { + return is_subclass_of($targetResourceClass, BaseResource::class); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Resources/ResourceWrapper.php b/vendor/mollie/mollie-api-php/src/Resources/ResourceWrapper.php new file mode 100644 index 0000000..4827c92 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Resources/ResourceWrapper.php @@ -0,0 +1,51 @@ +wrapped = $wrapped; + + return $this; + } + + /** + * @param mixed $resource + * @return static + */ + public function wrap($resource) + { + return $this->setWrapped($resource); + } + + /** + * @return mixed + */ + public function getWrapped() + { + return $this->wrapped; + } + + public function __get($name) + { + return $this->wrapped->{$name}; + } + + public function __call($name, $arguments) + { + return $this->forwardDecoratedCallTo($this->wrapped, $name, $arguments); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Resources/Route.php b/vendor/mollie/mollie-api-php/src/Resources/Route.php new file mode 100644 index 0000000..0e0b2c3 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Resources/Route.php @@ -0,0 +1,46 @@ +status === SalesInvoiceStatus::DRAFT; + } + + /** + * Returns whether the sales invoice is issued. + * + * @return bool + */ + public function isIssued() + { + return $this->status === SalesInvoiceStatus::ISSUED; + } + + /** + * Returns whether the sales invoice is paid. + * + * @return bool + */ + public function isPaid() + { + return $this->status === SalesInvoiceStatus::PAID; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Resources/SalesInvoiceCollection.php b/vendor/mollie/mollie-api-php/src/Resources/SalesInvoiceCollection.php new file mode 100644 index 0000000..4123f8b --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Resources/SalesInvoiceCollection.php @@ -0,0 +1,16 @@ +status === SessionStatus::STATUS_CREATED; + } + + public function isReadyForProcessing() + { + return $this->status === SessionStatus::STATUS_READY_FOR_PROCESSING; + } + + public function isCompleted() + { + return $this->status === SessionStatus::STATUS_COMPLETED; + } + + public function hasFailed() + { + return $this->status === SessionStatus::STATUS_FAILED; + } + + /** + * Saves the session's updatable properties. + * + * @return \Mollie\Api\Resources\Session + * + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function update() + { + $body = [ + 'billingAddress' => $this->billingAddress, + 'shippingAddress' => $this->shippingAddress, + ]; + + return $this->connector->sessions->update($this->id, $this->withMode($body)); + } + + /** + * Cancels this session. + * + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function cancel(): void + { + $this->connector->sessions->cancel($this->id); + } + + /** + * @return string|null + */ + public function getRedirectUrl() + { + if (empty($this->_links->redirect)) { + return null; + } + + return $this->_links->redirect->href; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Resources/SessionCollection.php b/vendor/mollie/mollie-api-php/src/Resources/SessionCollection.php new file mode 100644 index 0000000..be1eeb9 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Resources/SessionCollection.php @@ -0,0 +1,16 @@ +status === SettlementStatus::OPEN; + } + + /** + * Is this settlement pending? + */ + public function isPending(): bool + { + return $this->status === SettlementStatus::PENDING; + } + + /** + * Is this settlement paid out? + */ + public function isPaidout(): bool + { + return $this->status === SettlementStatus::PAIDOUT; + } + + /** + * Has this settlement failed? + */ + public function isFailed(): bool + { + return $this->status === SettlementStatus::FAILED; + } + + /** + * Retrieve the first page of payments associated with this settlement. + * + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function payments(?int $limit = null, array $parameters = []): PaymentCollection + { + return $this->connector->settlementPayments->pageForId( + $this->id, + array_merge($parameters, ['limit' => $limit]) + ); + } + + /** + * Retrieve the first page of refunds associated with this settlement. + * + * @throws ApiException + */ + public function refunds(?int $limit = null, array $parameters = []): RefundCollection + { + return $this->connector->settlementRefunds->pageForId( + $this->id, + array_merge($parameters, ['limit' => $limit]) + ); + } + + /** + * Retrieve the first page of chargebacks associated with this settlement. + * + * @throws ApiException + */ + public function chargebacks(?int $limit = null, array $parameters = []): ChargebackCollection + { + return $this->connector->settlementChargebacks->pageForId( + $this->id, + array_merge($parameters, ['limit' => $limit]) + ); + } + + /** + * Retrieve the first page of cap associated with this settlement. + * + * @throws ApiException + */ + public function captures(?int $limit = null, array $parameters = []): CaptureCollection + { + return $this->connector->settlementCaptures->pageForId( + $this->id, + array_merge($parameters, ['limit' => $limit]) + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Resources/SettlementCollection.php b/vendor/mollie/mollie-api-php/src/Resources/SettlementCollection.php new file mode 100644 index 0000000..1861282 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Resources/SettlementCollection.php @@ -0,0 +1,16 @@ + $this->amount, + 'times' => $this->times, + 'startDate' => $this->startDate, + 'webhookUrl' => $this->webhookUrl, + 'description' => $this->description, + 'mandateId' => $this->mandateId, + 'metadata' => $this->metadata, + 'interval' => $this->interval, + ]; + + return $this->connector->subscriptions->update($this->customerId, $this->id, $body); + } + + /** + * Returns whether the Subscription is active or not. + */ + public function isActive(): bool + { + return $this->status === SubscriptionStatus::ACTIVE; + } + + /** + * Returns whether the Subscription is pending or not. + */ + public function isPending(): bool + { + return $this->status === SubscriptionStatus::PENDING; + } + + /** + * Returns whether the Subscription is canceled or not. + */ + public function isCanceled(): bool + { + return $this->status === SubscriptionStatus::CANCELED; + } + + /** + * Returns whether the Subscription is suspended or not. + */ + public function isSuspended(): bool + { + return $this->status === SubscriptionStatus::SUSPENDED; + } + + /** + * Returns whether the Subscription is completed or not. + */ + public function isCompleted(): bool + { + return $this->status === SubscriptionStatus::COMPLETED; + } + + /** + * Cancels this subscription + * + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function cancel(): ?Subscription + { + if (! isset($this->_links->self->href)) { + return $this; + } + + return $this + ->connector + ->send((new CancelSubscriptionRequest( + $this->customerId, + $this->id + ))->test($this->mode === 'test')); + } + + /** + * Get subscription payments + * + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function payments(): PaymentCollection + { + if (! isset($this->_links->payments->href)) { + return PaymentCollection::withResponse($this->response, $this->connector); + } + + return $this + ->connector + ->send((new DynamicGetRequest($this->_links->payments->href))->setHydratableResource(PaymentCollection::class)); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Resources/SubscriptionCollection.php b/vendor/mollie/mollie-api-php/src/Resources/SubscriptionCollection.php new file mode 100644 index 0000000..eb0541e --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Resources/SubscriptionCollection.php @@ -0,0 +1,16 @@ +status === TerminalStatus::PENDING; + } + + public function isActive(): bool + { + return $this->status === TerminalStatus::ACTIVE; + } + + public function isInactive(): bool + { + return $this->status === TerminalStatus::INACTIVE; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Resources/TerminalCollection.php b/vendor/mollie/mollie-api-php/src/Resources/TerminalCollection.php new file mode 100644 index 0000000..fa78a65 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Resources/TerminalCollection.php @@ -0,0 +1,16 @@ + + */ + public $eventTypes; + + /** + * The subscription's current status. + * Possible values: enabled, blocked, disabled + * + * @var string + */ + public $status; + + /** + * The webhook's secret. + * + * Only available once after creation. + * + * @var string|null + */ + public $webhookSecret; + + /** + * The webhook's mode. + * + * @var string + */ + public $mode; + + /** + * @var \stdClass + */ + public $_links; + + public function enabled(): bool + { + return $this->status === WebhookStatus::ENABLED; + } + + public function disabled(): bool + { + return $this->status === WebhookStatus::DISABLED; + } + + public function blocked(): bool + { + return $this->status === WebhookStatus::BLOCKED; + } + + public function deleted(): bool + { + return $this->status === WebhookStatus::DELETED; + } + + /** + * Update this webhook. + * + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function update(array $data = []): Webhook + { + $request = UpdateWebhookRequestFactory::new($this->id) + ->withPayload($data) + ->create(); + + /** @var Webhook */ + return $this->connector->send($request->test($this->isInTestmode())); + } + + /** + * Delete this webhook. + * + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function delete(): void + { + $this->connector->send((new DeleteWebhookRequest($this->id))->test($this->isInTestmode())); + } + + /** + * Test this webhook by sending a test event. + * + * @throws \Mollie\Api\Exceptions\ApiException + */ + public function test(): AnyResource + { + /** @var AnyResource */ + return $this->connector->send((new TestWebhookRequest($this->id))->test($this->isInTestmode())); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Resources/WebhookCollection.php b/vendor/mollie/mollie-api-php/src/Resources/WebhookCollection.php new file mode 100644 index 0000000..5005a33 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Resources/WebhookCollection.php @@ -0,0 +1,16 @@ +_embedded->entity ?? null; + } + + /** + * Check if this webhook event has embedded entity data. + */ + public function hasEntity(): bool + { + return ! empty($this->_embedded->entity); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Resources/WrapperResource.php b/vendor/mollie/mollie-api-php/src/Resources/WrapperResource.php new file mode 100644 index 0000000..bce5415 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Resources/WrapperResource.php @@ -0,0 +1,24 @@ +wrapper = $wrapper; + } + + public function getWrapper(): string + { + return $this->wrapper; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Traits/ComposableFromArray.php b/vendor/mollie/mollie-api-php/src/Traits/ComposableFromArray.php new file mode 100644 index 0000000..bbb1a27 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Traits/ComposableFromArray.php @@ -0,0 +1,36 @@ +toArray() : $data; + + $reflection = new ReflectionClass(static::class); + $constructor = $reflection->getConstructor(); + $parameters = $constructor ? $constructor->getParameters() : []; + + return DataCollection::wrap($parameters) + ->map(function (ReflectionParameter $parameter) use ($data) { + $name = $parameter->getName(); + + if (array_key_exists($name, $data)) { + return $data[$name]; + } + + if ($parameter->isDefaultValueAvailable()) { + return $parameter->getDefaultValue(); + } + + return null; + }) + ->pipe(fn (DataCollection $data) => $reflection->newInstanceArgs($data->toArray())); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Traits/ForwardsCalls.php b/vendor/mollie/mollie-api-php/src/Traits/ForwardsCalls.php new file mode 100644 index 0000000..50f4422 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Traits/ForwardsCalls.php @@ -0,0 +1,44 @@ +{$method}(...$parameters); + } + + /** + * Forward a method call to the given object, returning $this if the forwarded call returned itself. + * + * @param mixed $object + * @param string $method + * @param array $parameters + * @return mixed + * + * @throws \BadMethodCallException + */ + protected function forwardDecoratedCallTo($object, $method, $parameters) + { + $result = $this->forwardCallTo($object, $method, $parameters); + + return $result === $object ? $this : $result; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Traits/GetAllConstants.php b/vendor/mollie/mollie-api-php/src/Traits/GetAllConstants.php new file mode 100644 index 0000000..01e9f57 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Traits/GetAllConstants.php @@ -0,0 +1,13 @@ +getConstants()); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Traits/HandlesAuthentication.php b/vendor/mollie/mollie-api-php/src/Traits/HandlesAuthentication.php new file mode 100644 index 0000000..f97b169 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Traits/HandlesAuthentication.php @@ -0,0 +1,42 @@ +authenticator = new ApiKeyAuthenticator($apiKey); + + return $this; + } + + /** + * @param string $accessToken OAuth access token, starting with 'access_' + * + * @throws ApiException + */ + public function setAccessToken(string $accessToken): self + { + $this->authenticator = new AccessTokenAuthenticator($accessToken); + + return $this; + } + + public function getAuthenticator(): ?Authenticator + { + return $this->authenticator; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Traits/HandlesDebugging.php b/vendor/mollie/mollie-api-php/src/Traits/HandlesDebugging.php new file mode 100644 index 0000000..16d9d72 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Traits/HandlesDebugging.php @@ -0,0 +1,109 @@ +removeSensitiveData(); + + $debugger ??= fn (...$args) => Debugger::symfonyRequestDebugger(...$args); + + $this->middleware()->onRequest(function (PendingRequest $pendingRequest) use ($debugger, $die): PendingRequest { + $debugger($pendingRequest, $pendingRequest->createPsrRequest()); + + if ($die) { + Debugger::die(); + } + + return $pendingRequest; + }, MiddlewarePriority::LOW); + + return $this; + } + + /** + * Enable response debugging with an optional custom debugger. + * + * @param callable|null $debugger Custom response debugger function + * @param bool $die Whether to die after dumping + * @return $this + */ + public function debugResponse(?callable $debugger = null, bool $die = false): self + { + $this->removeSensitiveData(); + + $debugger ??= fn (...$args) => Debugger::symfonyResponseDebugger(...$args); + + $this->middleware()->onResponse(function (Response $response) use ($debugger, $die): Response { + $debugger($response, $response->getPsrResponse()); + + if ($die) { + Debugger::die(); + } + + return $response; + }, MiddlewarePriority::HIGH); + + return $this; + } + + /** + * Remove sensitive data from the request and response. + * + * @return $this + */ + protected function removeSensitiveData(): self + { + if ($this->hasSanitizerMiddleware) { + return $this; + } + + $this->hasSanitizerMiddleware = true; + $sanitizer = new RequestSanitizer; + + $this->middleware()->onFatal(function (MollieException $exception) use ($sanitizer) { + if ($exception instanceof RequestException) { + return $sanitizer->sanitize($exception); + } + + return $exception; + }, MiddlewarePriority::LOW); + + return $this; + } + + /** + * Enable both request and response debugging. + * + * @param bool $die Whether to die after dumping + * @return $this + */ + public function debug(bool $die = false): self + { + return $this + ->debugRequest() + ->debugResponse(null, $die); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Traits/HandlesIdempotency.php b/vendor/mollie/mollie-api-php/src/Traits/HandlesIdempotency.php new file mode 100644 index 0000000..aa9251c --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Traits/HandlesIdempotency.php @@ -0,0 +1,80 @@ +idempotencyKey = $key; + + return $this; + } + + /** + * Retrieve the idempotency key. The idempotency key is a unique string ensuring a request to a + * mutating Mollie endpoint is processed only once. Note that the idempotency key gets reset to null after each + * request. + */ + public function getIdempotencyKey(): ?string + { + return $this->idempotencyKey; + } + + public function getIdempotencyKeyGenerator(): ?IdempotencyKeyGeneratorContract + { + return $this->idempotencyKeyGenerator; + } + + /** + * Reset the idempotency key. Note that the idempotency key automatically resets to null after each request. + * + * @return $this + */ + public function resetIdempotencyKey(): self + { + $this->idempotencyKey = null; + + return $this; + } + + /** + * @return $this + */ + public function setIdempotencyKeyGenerator(IdempotencyKeyGeneratorContract $generator): self + { + $this->idempotencyKeyGenerator = $generator; + + return $this; + } + + /** + * @return $this + */ + public function clearIdempotencyKeyGenerator(): self + { + $this->idempotencyKeyGenerator = null; + + return $this; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Traits/HandlesTestmode.php b/vendor/mollie/mollie-api-php/src/Traits/HandlesTestmode.php new file mode 100644 index 0000000..e7f547a --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Traits/HandlesTestmode.php @@ -0,0 +1,20 @@ +testmode = $testmode; + + return $this; + } + + public function getTestmode(): ?bool + { + return $this->testmode; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Traits/HandlesVersions.php b/vendor/mollie/mollie-api-php/src/Traits/HandlesVersions.php new file mode 100644 index 0000000..7f2c15a --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Traits/HandlesVersions.php @@ -0,0 +1,38 @@ +addVersionString('Mollie/'.MollieApiClient::CLIENT_VERSION); + $this->addVersionString('PHP/'.phpversion()); + + if ($clientVersion = $this->httpClient->version()) { + $this->addVersionString($clientVersion); + } + } + + /** + * @param string $versionString + */ + public function addVersionString($versionString): self + { + $this->versionStrings[] = str_replace([' ', "\t", "\n", "\r"], '-', $versionString); + + return $this; + } + + public function getVersionStrings(): array + { + return $this->versionStrings; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Traits/HasDefaultFactories.php b/vendor/mollie/mollie-api-php/src/Traits/HasDefaultFactories.php new file mode 100644 index 0000000..83d1075 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Traits/HasDefaultFactories.php @@ -0,0 +1,27 @@ + BalanceEndpointCollection::class, + 'balanceReports' => BalanceReportEndpointCollection::class, + 'balanceTransactions' => BalanceTransactionEndpointCollection::class, + 'capabilities' => CapabilityEndpointCollection::class, + 'chargebacks' => ChargebackEndpointCollection::class, + 'clients' => ClientEndpointCollection::class, + 'clientLinks' => ClientLinkEndpointCollection::class, + 'connectBalanceTransfers' => ConnectBalanceTransferEndpointCollection::class, + 'customerPayments' => CustomerPaymentsEndpointCollection::class, + 'customers' => CustomerEndpointCollection::class, + 'invoices' => InvoiceEndpointCollection::class, + 'mandates' => MandateEndpointCollection::class, + 'methods' => MethodEndpointCollection::class, + 'methodIssuers' => MethodIssuerEndpointCollection::class, + 'onboarding' => OnboardingEndpointCollection::class, + 'organizationPartners' => OrganizationPartnerEndpointCollection::class, + 'organizations' => OrganizationEndpointCollection::class, + 'payments' => PaymentEndpointCollection::class, + 'paymentRefunds' => PaymentRefundEndpointCollection::class, + 'paymentCaptures' => PaymentCaptureEndpointCollection::class, + 'paymentChargebacks' => PaymentChargebackEndpointCollection::class, + 'paymentLinks' => PaymentLinkEndpointCollection::class, + 'paymentLinkPayments' => PaymentLinkPaymentEndpointCollection::class, + 'paymentRoutes' => PaymentRouteEndpointCollection::class, + 'permissions' => PermissionEndpointCollection::class, + 'profiles' => ProfileEndpointCollection::class, + 'profileMethods' => ProfileMethodEndpointCollection::class, + 'refunds' => RefundEndpointCollection::class, + 'salesInvoices' => SalesInvoiceEndpointCollection::class, + 'sessions' => SessionEndpointCollection::class, + 'settlementCaptures' => SettlementCaptureEndpointCollection::class, + 'settlementChargebacks' => SettlementChargebackEndpointCollection::class, + 'settlementPayments' => SettlementPaymentEndpointCollection::class, + 'settlementRefunds' => SettlementRefundEndpointCollection::class, + 'settlements' => SettlementEndpointCollection::class, + 'subscriptions' => SubscriptionEndpointCollection::class, + 'subscriptionPayments' => SubscriptionPaymentEndpointCollection::class, + 'terminals' => TerminalEndpointCollection::class, + 'wallets' => WalletEndpointCollection::class, + 'webhooks' => WebhookEndpointCollection::class, + 'webhookEvents' => WebhookEventEndpointCollection::class, + ]; + + foreach ($endpointClasses as $name => $class) { + static::$endpoints[$name] = $class; + } + } + + /** + * @param string $url + */ + public function setApiEndpoint($url): self + { + $this->apiEndpoint = rtrim(trim($url), '/'); + + return $this; + } + + public function getApiEndpoint(): string + { + return $this->apiEndpoint; + } + + /** + * Magic getter to access the endpoints. + * + * + * @return mixed + * + * @throws \Exception + */ + public function __get(string $name) + { + if (isset(static::$endpoints[$name])) { + return new static::$endpoints[$name]($this); + } + + throw new \Exception("Undefined endpoint: $name"); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Traits/HasHeaders.php b/vendor/mollie/mollie-api-php/src/Traits/HasHeaders.php new file mode 100644 index 0000000..00bbc38 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Traits/HasHeaders.php @@ -0,0 +1,21 @@ +headers ??= new ArrayStore($this->defaultHeaders()); + } + + protected function defaultHeaders(): array + { + return []; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Traits/HasJsonPayload.php b/vendor/mollie/mollie-api-php/src/Traits/HasJsonPayload.php new file mode 100644 index 0000000..1b25d3e --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Traits/HasJsonPayload.php @@ -0,0 +1,20 @@ +body ??= new JsonPayloadRepository($this->defaultPayload()); + } + + protected function defaultPayload(): array + { + return []; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Traits/HasMiddleware.php b/vendor/mollie/mollie-api-php/src/Traits/HasMiddleware.php new file mode 100644 index 0000000..444c95e --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Traits/HasMiddleware.php @@ -0,0 +1,15 @@ +middleware ??= new Middleware; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Traits/HasMode.php b/vendor/mollie/mollie-api-php/src/Traits/HasMode.php new file mode 100644 index 0000000..85b4425 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Traits/HasMode.php @@ -0,0 +1,19 @@ +mode === 'test'; + } + + public function withMode(array $options = []): array + { + return array_merge($options, ['testmode' => $this->isInTestmode()]); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Traits/HasQuery.php b/vendor/mollie/mollie-api-php/src/Traits/HasQuery.php new file mode 100644 index 0000000..5b01b6d --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Traits/HasQuery.php @@ -0,0 +1,21 @@ +queryStore ??= new ArrayStore($this->defaultQuery()); + } + + protected function defaultQuery(): array + { + return []; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Traits/HasRequestProperties.php b/vendor/mollie/mollie-api-php/src/Traits/HasRequestProperties.php new file mode 100644 index 0000000..8e50e68 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Traits/HasRequestProperties.php @@ -0,0 +1,9 @@ +response; + } + + /** + * @return $this + */ + public function setResponse(Response $response) + { + $this->response = $response; + + return $this; + } + + public function getPendingRequest(): PendingRequest + { + return $this->response->getPendingRequest(); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Traits/Initializable.php b/vendor/mollie/mollie-api-php/src/Traits/Initializable.php new file mode 100644 index 0000000..b461097 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Traits/Initializable.php @@ -0,0 +1,22 @@ +getShortName(); + + if (method_exists($this, $method)) { + $this->{$method}(); + } + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Traits/IsIteratableRequest.php b/vendor/mollie/mollie-api-php/src/Traits/IsIteratableRequest.php new file mode 100644 index 0000000..01ebad4 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Traits/IsIteratableRequest.php @@ -0,0 +1,39 @@ +iteratorEnabled; + } + + public function iteratesBackwards(): bool + { + return $this->iterateBackwards; + } + + public function useIterator(): self + { + $this->iteratorEnabled = true; + + return $this; + } + + public function setIterationDirection(bool $iterateBackwards = false): self + { + $this->iterateBackwards = $iterateBackwards; + + return $this; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Traits/ManagesPsrRequests.php b/vendor/mollie/mollie-api-php/src/Traits/ManagesPsrRequests.php new file mode 100644 index 0000000..d000655 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Traits/ManagesPsrRequests.php @@ -0,0 +1,61 @@ +factoryCollection; + + $request = $factories->requestFactory->createRequest( + $this->method(), + $this->getUri(), + ); + + foreach ($this->headers()->all() as $headerName => $headerValue) { + $request = $request->withHeader($headerName, $headerValue); + } + + $payload = $this->payload(); + if ($payload instanceof PayloadRepository) { + $request = $request->withBody($payload->toStream($factories->streamFactory)); + } + + return $request; + } + + public function getUri(): UriInterface + { + $uri = $this + ->factoryCollection + ->uriFactory + ->createUri($this->url()); + + $existingQuery = Url::parseQuery($uri->getQuery()); + + return $uri->withQuery( + http_build_query(array_merge($existingQuery, $this->query()->all())) + ); + } + + /** + * Get the factory collection + */ + public function getFactoryCollection(): Factories + { + return $this->factoryCollection; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Traits/SendsRequests.php b/vendor/mollie/mollie-api-php/src/Traits/SendsRequests.php new file mode 100644 index 0000000..9dbae3a --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Traits/SendsRequests.php @@ -0,0 +1,81 @@ +retryStrategy = $this->retryStrategy ?? new LinearRetryStrategy(); + } + + /** + * Set a custom retry strategy implementation. + */ + public function setRetryStrategy(RetryStrategyContract $strategy): self + { + $this->retryStrategy = $strategy; + + return $this; + } + + /** + * @return mixed + */ + public function send(Request $request) + { + $pendingRequest = new PendingRequest($this, $request); + $pendingRequest = $pendingRequest->executeRequestHandlers(); + + $pendingRequest = (new DataTransformer)->transform($pendingRequest); + + $lastException = null; + + for ($attempt = 0; $attempt <= $this->retryStrategy->maxRetries(); $attempt++) { + if ($attempt > 0) { + $delayMs = $this->retryStrategy->delayBeforeAttemptMs($attempt); + + usleep($delayMs * 1000); + } + + try { + $response = $this->httpClient->sendRequest($pendingRequest); + + return $pendingRequest->executeResponseHandlers($response); + } catch (RetryableNetworkRequestException $e) { + $lastException = $e; + } catch (MollieException $exception) { + $exception = $pendingRequest->executeFatalHandlers($exception); + + throw $exception; + } + } + + if ($lastException instanceof MollieException) { + $lastException = $pendingRequest->executeFatalHandlers($lastException); + + throw $lastException; + } + + // This should be unreachable, but keep a safe fallback for static analysis + throw new LogicException('Request failed after retries without a final exception.'); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Types/ApprovalPrompt.php b/vendor/mollie/mollie-api-php/src/Types/ApprovalPrompt.php new file mode 100644 index 0000000..f9be2c8 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Types/ApprovalPrompt.php @@ -0,0 +1,14 @@ + $key + * @param mixed $value + * + * @example includes(['includes' => ['payment']], 'includes', 'payment') => true + * @example includes(['includes' => ['refund']], 'includes', 'payment') => false + * @example includes(['includes' => ['payment' => 'foo']], 'includes.payment', 'foo') => true + */ + public static function includes(array $array, $key, $value): bool + { + $keys = (array) $key; + + foreach ($keys as $k) { + if (Arr::has($array, $k) && in_array($value, Arr::wrap(Arr::get($array, $k, [])))) { + return true; + } + } + + return false; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Utils/DataTransformer.php b/vendor/mollie/mollie-api-php/src/Utils/DataTransformer.php new file mode 100644 index 0000000..501da4b --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Utils/DataTransformer.php @@ -0,0 +1,119 @@ +query()->isNotEmpty()) { + $transformedQuery = $this->resolveQuery($pendingRequest->query()->all()); + + $pendingRequest->query()->set($transformedQuery); + } + + if (! $pendingRequest->getRequest() instanceof HasPayload) { + return $pendingRequest; + } + + $this->setBackwardsFixFlag($pendingRequest); + + /** @var PayloadRepository $payload */ + $payload = $pendingRequest->payload(); + + if ($payload->isNotEmpty()) { + $transformedPayload = $this->resolve($payload->all()); + + $payload->set($transformedPayload); + } + + return $pendingRequest; + } + + private function resolveQuery(array $query): array + { + return $this->resolve($query, function ($value) { + return $this->transformBooleans($value); + }); + } + + private function resolve(array $values, $mapResolver = null): array + { + return DataCollection::wrap($values) + ->map(function ($value) use ($mapResolver) { + $value = is_callable($mapResolver) ? $mapResolver($value) : $value; + + if ($value instanceof Resolvable) { + return $this->resolve($value->toArray()); + } + + if ($value instanceof Arrayable) { + return array_filter($value->toArray(), fn ($value) => $this->filterEmptyValues($value)); + } + + if ($value instanceof Stringable) { + return (string) $value; + } + + /** + * Backwards compatibility for before Date|DateTime got introduced. + */ + if ($value instanceof DateTimeInterface) { + $format = $this->isCreatePaymentLinkRequest + ? DateTimeInterface::ATOM + : Date::FORMAT; + + return $value->format($format); + } + + return $value; + }) + ->filter(fn ($value) => $this->filterEmptyValues($value)) + ->toArray(); + } + + private function filterEmptyValues($value) + { + return ! empty($value) || is_bool($value); + } + + private function transformBooleans($value) + { + if (is_array($value)) { + return Arr::map($value, function ($value) { + return $this->transformBooleans($value); + }); + } + + if ($value === true) { + return 'true'; + } + + if ($value === false) { + return 'false'; + } + + return $value; + } + + private function setBackwardsFixFlag(PendingRequest $pendingRequest): void + { + $this->isCreatePaymentLinkRequest = $pendingRequest->getRequest() instanceof CreatePaymentLinkRequest; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Utils/Debugger.php b/vendor/mollie/mollie-api-php/src/Utils/Debugger.php new file mode 100644 index 0000000..388d6aa --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Utils/Debugger.php @@ -0,0 +1,70 @@ +getHeaders() as $headerName => $value) { + $headers[$headerName] = implode(';', $value); + } + + VarDumper::dump([ + 'request' => get_class($pendingRequest->getRequest()), + 'method' => $psrRequest->getMethod(), + 'uri' => (string) $psrRequest->getUri(), + 'headers' => $headers, + 'body' => (string) $psrRequest->getBody(), + ]); + } + + /** + * Debug a response with Symfony Var Dumper + */ + public static function symfonyResponseDebugger(Response $response, ResponseInterface $psrResponse): void + { + $headers = []; + + foreach ($psrResponse->getHeaders() as $headerName => $value) { + $headers[$headerName] = implode(';', $value); + } + + VarDumper::dump([ + 'status' => $response->status(), + 'headers' => $headers, + 'body' => json_decode((string) $psrResponse->getBody(), true), + ]); + } + + /** + * Kill the application + */ + public static function die(): void + { + $handler = self::$dieHandler ?? static function (): int { + exit(1); + }; + + $handler(); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Utils/Factories.php b/vendor/mollie/mollie-api-php/src/Utils/Factories.php new file mode 100644 index 0000000..310d893 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Utils/Factories.php @@ -0,0 +1,31 @@ +requestFactory = $requestFactory; + $this->responseFactory = $responseFactory; + $this->streamFactory = $streamFactory; + $this->uriFactory = $uriFactory; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Utils/Str.php b/vendor/mollie/mollie-api-php/src/Utils/Str.php new file mode 100644 index 0000000..615680e --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Utils/Str.php @@ -0,0 +1,49 @@ + + */ + public static function parseQuery(string $query): array + { + if ($query === '') { + return []; + } + + $parameters = []; + + foreach (explode('&', $query) as $parameter) { + $name = urldecode((string) strtok($parameter, '=')); + $value = urldecode((string) strtok('=')); + + if (! $name || str_starts_with($parameter, '=')) { + continue; + } + + $parameters[$name] = $value; + } + + return $parameters; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Utils/Utility.php b/vendor/mollie/mollie-api-php/src/Utils/Utility.php new file mode 100644 index 0000000..58c4d7d --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Utils/Utility.php @@ -0,0 +1,138 @@ + + */ + public static function classUsesRecursive($class): array + { + if (is_object($class)) { + $class = get_class($class); + } + + $results = []; + + foreach (array_reverse(class_parents($class)) + [$class => $class] as $class) { + $results += static::traitUsesRecursive($class); + } + + return array_unique($results); + } + + /** + * Returns all traits used by a trait and its traits. + * + * @param class-string $trait + * @return array + */ + public static function traitUsesRecursive(string $trait): array + { + /** @var array $traits */ + $traits = class_uses($trait) ?: []; + + foreach ($traits as $trait) { + $traits += static::traitUsesRecursive($trait); + } + + return $traits; + } + + /** + * Get the properties of a class. + * + * @param string|class-string $class + * @param int $flag + * @return ReflectionProperty[] + */ + public static function getProperties($class, $flag = ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED | ReflectionProperty::IS_PRIVATE): array + { + $reflection = new ReflectionClass($class); + + return $reflection->getProperties($flag); + } + + /** + * Filter out the properties that are not part of the given class. + * + * @param string|class-string $class + */ + public static function filterByProperties($class, array $array): array + { + $properties = array_map( + fn (ReflectionProperty $prop) => $prop->getName(), + static::getProperties($class) + ); + + return array_filter( + $array, + fn ($key) => ! in_array($key, $properties, true), + ARRAY_FILTER_USE_KEY + ); + } + + /** + * Compose a value to a new form if it is truthy. + * + * @param mixed $value + * @param string|callable $resolver + * @param string|null $composableClass + * @param mixed $default + * @return mixed + */ + public static function transform($value, $resolver, $composableClass = null, $default = null) + { + /** + * If the third argument is a string and the class does not exist, + * it is assumed that the third argument is the default value. + */ + if (func_num_args() === 3 && is_string($composableClass) && ! class_exists($composableClass)) { + $default = $composableClass; + $composableClass = null; + } + + if (is_string($resolver)) { + $composableClass = $resolver; + $resolver = fn ($value) => new $resolver($value); + } + + // If the value is an instance of the target class, return it. + if (is_object($value) && $composableClass && $value instanceof $composableClass) { + return $value; + } + + return (bool) $value ? $resolver($value) : $default; + } + + /** + * Extract a boolean value if not already a boolean. + * + * @param mixed $value + */ + public static function extractBool($value, string $key, bool $default = false): bool + { + return is_bool($value) + ? $value + : Arr::get($value, $key, $default); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Webhooks/Events/BalanceTransactionCreated.php b/vendor/mollie/mollie-api-php/src/Webhooks/Events/BalanceTransactionCreated.php new file mode 100644 index 0000000..8567b01 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Webhooks/Events/BalanceTransactionCreated.php @@ -0,0 +1,13 @@ +id = $id; + $this->entityId = $entityId; + $this->createdAt = $createdAt; + $this->links = $links; + $this->entity = $entity; + } + + abstract public static function type(): string; + + public function entity(): WebhookEntity + { + return $this->getEntitySafely(); + } + + public function entityData(?string $key = null): mixed + { + return $this->getEntitySafely()->getData($key); + } + + private function getEntitySafely(): WebhookEntity + { + $this->guardAgainstMissingEntity(); + + /** @var WebhookEntity $entity */ + $entity = $this->entity; + + return $entity; + } + + private function guardAgainstMissingEntity() + { + if (! $this->entity) { + throw new \Exception('Event entity not found. Make sure to subscribe to full event payloads.'); + } + } +} diff --git a/vendor/mollie/mollie-api-php/src/Webhooks/Events/ConnectBalanceTransferFailed.php b/vendor/mollie/mollie-api-php/src/Webhooks/Events/ConnectBalanceTransferFailed.php new file mode 100644 index 0000000..c28969c --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Webhooks/Events/ConnectBalanceTransferFailed.php @@ -0,0 +1,15 @@ +signingSecrets = Arr::wrap($signingSecrets); + } + + /** + * Static method for simpler usage. + * + * @param RequestInterface|string $input PSR-7 request or raw payload + * @param string|string[] $signingSecrets One or more signing secrets + * @param string|string[]|null $signatures Required if $input is a string payload + * @return bool True if valid signature or legacy webhook + * + * @throws InvalidSignatureException If all signatures are invalid + */ + public static function validate($input, $signingSecrets, $signatures = null): bool + { + $verifier = new self($signingSecrets); + + if ($input instanceof RequestInterface) { + return $verifier->validateRequest($input); + } + + if (is_string($input) && ($signatures !== null)) { + return $verifier->validatePayload($input, $signatures); + } + + throw new InvalidSignatureException('Unsupported input type'); + } + + /** + * Verify a PSR-7 compatible request. + * + * @param RequestInterface $request The PSR-7 request + * @return bool True if valid, false if legacy webhook (no signature) + * + * @throws InvalidSignatureException If signature validation fails + */ + public function validateRequest(RequestInterface $request): bool + { + $body = (string) $request->getBody(); + $signatures = $request->getHeader(self::SIGNATURE_HEADER); + + if (empty($signatures)) { + // No signatures found - treat as legacy webhook + return false; + } + + return $this->validateSignatures($body, $signatures); + } + + /** + * Verify webhook payload with provided signature(s). + * + * @param string $payload Raw request body + * @param string|string[]|null $signatures One or more signatures to validate + * @return bool True if any signature is valid + * + * @throws InvalidSignatureException If all signatures are invalid + */ + public function validatePayload(string $payload, $signatures): bool + { + $signatures = is_array($signatures) ? $signatures : array_filter([$signatures]); + + if (empty($signatures)) { + // No signatures found - treat as legacy webhook + return false; + } + + return $this->validateSignatures($payload, $signatures); + } + + /** + * Verify signatures against all configured signing secrets. + * + * @param string $payload The raw request payload + * @param array $signatures The signatures to verify + * @return bool True if any signature matches any secret + * + * @throws InvalidSignatureException If all signatures are invalid + */ + private function validateSignatures(string $payload, array $signatures): bool + { + $validSignatureFound = DataCollection::collect($signatures) + ->contains(fn ($signatureHeader) => $this->isValidSignature( + $this->extractSignature($signatureHeader), + $payload + )); + + if (! $validSignatureFound && ! empty($signatures)) { + throw new InvalidSignatureException('Invalid webhook signature'); + } + + return $validSignatureFound; + } + + /** + * Extract the raw signature from a signature header. + */ + private function extractSignature(string $signatureHeader): string + { + return strpos($signatureHeader, self::SIGNATURE_PREFIX) === 0 + ? substr($signatureHeader, strlen(self::SIGNATURE_PREFIX)) + : $signatureHeader; + } + + /** + * Check if a signature is valid against any of our signing secrets. + */ + private function isValidSignature(string $providedSignature, string $payload): bool + { + return DataCollection::collect($this->signingSecrets) + ->contains(function ($secret) use ($payload, $providedSignature) { + $expectedSignature = self::createSignature($payload, $secret); + + return hash_equals($expectedSignature, $providedSignature); + }); + } + + /** + * Create a signature for a given payload and secret. + */ + public static function createSignature(string $payload, string $secret): string + { + return hash_hmac('sha256', $payload, $secret); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Webhooks/WebhookEntity.php b/vendor/mollie/mollie-api-php/src/Webhooks/WebhookEntity.php new file mode 100644 index 0000000..84a6622 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Webhooks/WebhookEntity.php @@ -0,0 +1,153 @@ +resourceType = $resourceType; + $this->id = $id; + $this->data = $data; + $this->mode = $this->getData('mode'); + } + + /** + * Create an entity representation from webhook embedded entity data. + * + * @param array|object $entityData + */ + public static function create($entityData): WebhookEntity + { + $data = Utility::transform($entityData, fn ($data) => is_object($data) ? (array) $data : $data, null, []); + + $resourceType = Arr::get($data, 'resource'); + $id = Arr::get($data, 'id'); + + return new WebhookEntity($resourceType, $id, $data); + } + + public function getResourceType(): string + { + return $this->resourceType; + } + + public function getId(): string + { + return $this->id; + } + + /** + * @return mixed + */ + public function getData(?string $key = null) + { + if ($key) { + return Arr::get($this->data, $key); + } + + return $this->data; + } + + /** + * Upgrade this entity to a fully-typed SDK resource using the connector. + */ + public function asResource(Connector $connector): BaseResource + { + $targetClass = $this->resolveTargetResourceClass(); + + $request = $this->tryCreateGetRequest($targetClass); + + if ($request instanceof SupportsTestmode) { + $request = $request->test($this->isInTestmode()); + } + + if ($request instanceof ResourceHydratableRequest) { + return $connector->send($request); + } + + $href = $this->extractSelfHref($this->data); + + if ($href) { + return $this->sendDynamic($connector, $href, $targetClass); + } + + $fallbackHref = $this->buildFallbackHref($targetClass); + + return $this->sendDynamic($connector, $fallbackHref, $targetClass); + } + + /** + * @param array $data + */ + private function extractSelfHref(array $data): ?string + { + return Arr::get($data, '_links.self.href'); + } + + private function resolvePlural(string $targetClass): ?string + { + $names = Config::resourceRegistry()->namesOf($targetClass); + + return $names[ResourceRegistry::PLURAL_KEY] ?? null; + } + + private function resolveTargetResourceClass(): string + { + return Config::resourceRegistry()->for($this->resourceType) ?? AnyResource::class; + } + + private function tryCreateGetRequest(string $targetClass): ?ResourceHydratableRequest + { + $resourceBasename = Utility::classBasename($targetClass); + + /** @var class-string */ + $requestClass = 'Mollie\\Api\\Http\\Requests\\Get' . $resourceBasename . 'Request'; + + if (! class_exists($requestClass)) { + return null; + } + + try { + return new $requestClass($this->id); + } catch (\Throwable $e) { + return null; + } + } + + private function buildFallbackHref(string $targetClass): string + { + $plural = $this->resolvePlural($targetClass) ?? $this->resourceType; + + return $plural . '/' . $this->id; + } + + private function sendDynamic(Connector $connector, string $href, string $targetClass): BaseResource + { + return $connector->send( + (new DynamicGetRequest($href))->setHydratableResource($targetClass) + ); + } +} diff --git a/vendor/mollie/mollie-api-php/src/Webhooks/WebhookEventMapper.php b/vendor/mollie/mollie-api-php/src/Webhooks/WebhookEventMapper.php new file mode 100644 index 0000000..fbf7e03 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Webhooks/WebhookEventMapper.php @@ -0,0 +1,141 @@ +> */ + private array $map; + + public function __construct(array $map = []) + { + $this->setup($map); + } + + /** + * Process incoming webhook payload and create the appropriate event handler. + * + * @param array|string $payload The raw webhook payload from POST request + * @return BaseEvent The specific event handler + * @throws \InvalidArgumentException If payload is invalid + */ + public function processPayload($payload): BaseEvent + { + if (is_string($payload)) { + $payload = json_decode($payload, true); + } + + $this->validatePayload($payload); + + return $this->resolveEvent( + Arr::get($payload, 'id'), + Arr::get($payload, 'type'), + Arr::get($payload, 'entityId'), + Utility::transform(Arr::get($payload, 'createdAt'), fn (string $timestamp) => new DateTime($timestamp), DateTime::class), + (object) (Arr::get($payload, '_links') ?? []), + $this->createWebhookEntityFromPayload($payload) + ); + } + + /** + * Register or override a mapping for a given type string. + */ + public function register(string $type, string $handlerClass): void + { + $this->map[$type] = $handlerClass; + } + + /** + * Resolve the concrete event handler for a webhook event. + * + * @return BaseEvent + */ + public function resolveEvent( + string $id, + string $type, + string $entityId, + DateTime $createdAt, + object $links, + ?WebhookEntity $entity = null + ): BaseEvent { + if (! Arr::exists($this->map, $type)) { + throw new \InvalidArgumentException("Unsupported event type: {$type}"); + } + + /** @var class-string $class */ + $class = Arr::get($this->map, $type); + + return new $class( + $id, + $entityId, + $createdAt, + $links, + $entity + ); + } + + private function setup(array $map): void + { + $this->map = array_merge([ + PaymentLinkPaid::type() => PaymentLinkPaid::class, + BalanceTransactionCreated::type() => BalanceTransactionCreated::class, + ConnectBalanceTransferFailed::type() => ConnectBalanceTransferFailed::class, + ConnectBalanceTransferSucceeded::type() => ConnectBalanceTransferSucceeded::class, + SalesInvoiceCreated::type() => SalesInvoiceCreated::class, + SalesInvoiceIssued::type() => SalesInvoiceIssued::class, + SalesInvoiceCanceled::type() => SalesInvoiceCanceled::class, + SalesInvoicePaid::type() => SalesInvoicePaid::class, + ], $map); + } + + /** + * Validate that the payload contains required fields. + * + * @param array $payload + * @throws \InvalidArgumentException + */ + private function validatePayload(array $payload): void + { + $requiredFields = ['id', 'type', 'entityId', 'createdAt']; + + foreach ($requiredFields as $field) { + if (! Arr::exists($payload, $field) || empty(Arr::get($payload, $field))) { + throw new \InvalidArgumentException("Missing or empty required field: {$field}"); + } + } + } + + /** + * Create a webhook entity from the embedded data in the payload. + * + * @param array $payload + * @return WebhookEntity|null + */ + private function createWebhookEntityFromPayload(array $payload): ?WebhookEntity + { + $embedded = Arr::get($payload, '_embedded', []); + $entityData = array_pop($embedded); + + if (! $entityData) { + return null; + } + + $entity = WebhookEntity::create($entityData); + + return $entity; + } +} diff --git a/vendor/mollie/mollie-api-php/src/Webhooks/WebhookEventType.php b/vendor/mollie/mollie-api-php/src/Webhooks/WebhookEventType.php new file mode 100644 index 0000000..cc91359 --- /dev/null +++ b/vendor/mollie/mollie-api-php/src/Webhooks/WebhookEventType.php @@ -0,0 +1,68 @@ + + */ + public static function getAll(): array + { + return [ + self::PAYMENT_LINK_PAID, + self::BALANCE_TRANSACTION_CREATED, + self::CONNECT_BALANCE_TRANSFER_FAILED, + self::CONNECT_BALANCE_TRANSFER_SUCCEEDED, + self::SALES_INVOICE_CREATED, + self::SALES_INVOICE_ISSUED, + self::SALES_INVOICE_CANCELED, + self::SALES_INVOICE_PAID, + self::PROFILE_CREATED, + self::PROFILE_VERIFIED, + self::PROFILE_BLOCKED, + self::PROFILE_DELETED, + self::ALL, + ]; + } +} diff --git a/vendor/nyholm/psr7/CHANGELOG.md b/vendor/nyholm/psr7/CHANGELOG.md new file mode 100644 index 0000000..17a819f --- /dev/null +++ b/vendor/nyholm/psr7/CHANGELOG.md @@ -0,0 +1,172 @@ +# Changelog + +All notable changes to this project will be documented in this file, in reverse chronological order by release. + +## 1.8.2 + +- Fix deprecation warnings in PHP 8.4 + +## 1.8.1 + +- Fix error handling in Stream::getContents() + +## 1.8.0 + +- Deprecate HttplugFactory, use Psr17Factory instead +- Make depencendy on php-http/message-factory optional + +## 1.7.0 + +- Bump to PHP 7.2 minimum +- Allow psr/http-message v2 +- Use copy-on-write for streams created from strings + +## 1.6.1 + +- Security fix: CVE-2023-29197 + +## 1.6.0 + +### Changed + +- Seek to the begining of the string when using Stream::create() +- Populate ServerRequest::getQueryParams() on instantiation +- Encode [reserved characters](https://www.rfc-editor.org/rfc/rfc3986#appendix-A) in userinfo in Uri +- Normalize leading slashes for Uri::getPath() +- Make Stream's constructor public +- Add some missing type checks on arguments + +## 1.5.1 + +### Fixed + +- Fixed deprecations on PHP 8.1 + +## 1.5.0 + +### Added + +- Add explicit `@return mixed` +- Add explicit return types to HttplugFactory + +### Fixed + +- Improve error handling with streams + +## 1.4.1 + +### Fixed + +- `Psr17Factory::createStreamFromFile`, `UploadedFile::moveTo`, and + `UploadedFile::getStream` no longer throw `ValueError` in PHP 8. + +## 1.4.0 + +### Removed + +The `final` keyword was replaced by `@final` annotation. + +## 1.3.2 + +### Fixed + +- `Stream::read()` must not return boolean. +- Improved exception message when using wrong HTTP status code. + +## 1.3.1 + +### Fixed + +- Allow installation on PHP8 + +## 1.3.0 + +### Added + +- Make Stream::__toString() compatible with throwing exceptions on PHP 7.4. + +### Fixed + +- Support for UTF-8 hostnames +- Support for numeric header names + +## 1.2.1 + +### Changed + +- Added `.github` and `phpstan.neon.dist` to `.gitattributes`. + +## 1.2.0 + +### Changed + +- Change minimal port number to 0 (unix socket) +- Updated `Psr17Factory::createResponse` to respect the specification. If second + argument is not used, a standard reason phrase. If an empty string is passed, + then the reason phrase will be empty. + +### Fixed + +- Check for seekable on the stream resource. +- Fixed the `Response::$reason` should never be null. + +## 1.1.0 + +### Added + +- Improved performance +- More tests for `UploadedFile` and `HttplugFactory` + +### Removed + +- Dead code + +## 1.0.1 + +### Fixed + +- Handle `fopen` failing in createStreamFromFile according to PSR-7. +- Reduce execution path to speed up performance. +- Fixed typos. +- Code style. + +## 1.0.0 + +### Added + +- Support for final PSR-17 (HTTP factories). (`Psr17Factory`) +- Support for numeric header values. +- Support for empty header values. +- All classes are final +- `HttplugFactory` that implements factory interfaces from HTTPlug. + +### Changed + +- `ServerRequest` does not extend `Request`. + +### Removed + +- The HTTPlug discovery strategy was removed since it is included in php-http/discovery 1.4. +- `UploadedFileFactory()` was removed in favor for `Psr17Factory`. +- `ServerRequestFactory()` was removed in favor for `Psr17Factory`. +- `StreamFactory`, `UriFactory`, abd `MessageFactory`. Use `HttplugFactory` instead. +- `ServerRequestFactory::createServerRequestFromArray`, `ServerRequestFactory::createServerRequestFromArrays` and + `ServerRequestFactory::createServerRequestFromGlobals`. Please use the new `nyholm/psr7-server` instead. + +## 0.3.0 + +### Added + +- Return types. +- Many `InvalidArgumentException`s are thrown when you use invalid arguments. +- Integration tests for `UploadedFile` and `ServerRequest`. + +### Changed + +- We dropped PHP7.0 support. +- PSR-17 factories have been marked as internal. They do not fall under our BC promise until PSR-17 is accepted. +- `UploadedFileFactory::createUploadedFile` does not accept a string file path. + +## 0.2.3 + +No changelog before this release diff --git a/vendor/nyholm/psr7/LICENSE b/vendor/nyholm/psr7/LICENSE new file mode 100644 index 0000000..d6c5231 --- /dev/null +++ b/vendor/nyholm/psr7/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2016 Tobias Nyholm + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/nyholm/psr7/README.md b/vendor/nyholm/psr7/README.md new file mode 100644 index 0000000..7fc30bc --- /dev/null +++ b/vendor/nyholm/psr7/README.md @@ -0,0 +1,108 @@ +# PSR-7 implementation + +[![Latest Version](https://img.shields.io/github/release/Nyholm/psr7.svg?style=flat-square)](https://github.com/Nyholm/psr7/releases) +[![Total Downloads](https://poser.pugx.org/nyholm/psr7/downloads)](https://packagist.org/packages/nyholm/psr7) +[![Monthly Downloads](https://poser.pugx.org/nyholm/psr7/d/monthly.png)](https://packagist.org/packages/nyholm/psr7) +[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE) +[![Static analysis](https://github.com/Nyholm/psr7/actions/workflows/static.yml/badge.svg?branch=master)](https://github.com/Nyholm/psr7/actions/workflows/static.yml?query=branch%3Amaster) +[![Tests](https://github.com/Nyholm/psr7/actions/workflows/tests.yml/badge.svg?branch=master)](https://github.com/Nyholm/psr7/actions/workflows/tests.yml?query=branch%3Amaster) + +A super lightweight PSR-7 implementation. Very strict and very fast. + +| Description | Guzzle | Laminas | Slim | Nyholm | +| ---- | ------ | ---- | ---- | ------ | +| Lines of code | 3.300 | 3.100 | 1.900 | 1.000 | +| PSR-7* | 66% | 100% | 75% | 100% | +| PSR-17 | No | Yes | Yes | Yes | +| HTTPlug | No | No | No | Yes | +| Performance (runs per second)** | 14.553 | 14.703 | 13.416 | 17.734 | + +\* Percent of completed tests in https://github.com/php-http/psr7-integration-tests + +\** Benchmark with 50.000 runs. See https://github.com/devanych/psr-http-benchmark (higher is better) + +## Installation + +```bash +composer require nyholm/psr7 +``` + +If you are using Symfony Flex then you get all message factories registered as services. + +## Usage + +The PSR-7 objects do not contain any other public methods than those defined in +the [PSR-7 specification](https://www.php-fig.org/psr/psr-7/). + +### Create objects + +Use the PSR-17 factory to create requests, streams, URIs etc. + +```php +$psr17Factory = new \Nyholm\Psr7\Factory\Psr17Factory(); +$request = $psr17Factory->createRequest('GET', 'http://tnyholm.se'); +$stream = $psr17Factory->createStream('foobar'); +``` + +### Sending a request + +With [HTTPlug](http://httplug.io/) or any other PSR-18 (HTTP client) you may send +requests like: + +```bash +composer require kriswallsmith/buzz +``` + +```php +$psr17Factory = new \Nyholm\Psr7\Factory\Psr17Factory(); +$psr18Client = new \Buzz\Client\Curl($psr17Factory); + +$request = $psr17Factory->createRequest('GET', 'http://tnyholm.se'); +$response = $psr18Client->sendRequest($request); +``` + +### Create server requests + +The [`nyholm/psr7-server`](https://github.com/Nyholm/psr7-server) package can be used +to create server requests from PHP superglobals. + +```bash +composer require nyholm/psr7-server +``` + +```php +$psr17Factory = new \Nyholm\Psr7\Factory\Psr17Factory(); + +$creator = new \Nyholm\Psr7Server\ServerRequestCreator( + $psr17Factory, // ServerRequestFactory + $psr17Factory, // UriFactory + $psr17Factory, // UploadedFileFactory + $psr17Factory // StreamFactory +); + +$serverRequest = $creator->fromGlobals(); +``` + +### Emitting a response + +```bash +composer require laminas/laminas-httphandlerrunner +``` + +```php +$psr17Factory = new \Nyholm\Psr7\Factory\Psr17Factory(); + +$responseBody = $psr17Factory->createStream('Hello world'); +$response = $psr17Factory->createResponse(200)->withBody($responseBody); +(new \Laminas\HttpHandlerRunner\Emitter\SapiEmitter())->emit($response); +``` + +## Our goal + +This package is currently maintained by [Tobias Nyholm](http://nyholm.se) and +[Martijn van der Ven](https://vanderven.se/martijn/). They have decided that the +goal of this library should be to provide a super strict implementation of +[PSR-7](https://www.php-fig.org/psr/psr-7/) that is blazing fast. + +The package will never include any extra features nor helper methods. All our classes +and functions exist because they are required to fulfill the PSR-7 specification. diff --git a/vendor/nyholm/psr7/composer.json b/vendor/nyholm/psr7/composer.json new file mode 100644 index 0000000..c607615 --- /dev/null +++ b/vendor/nyholm/psr7/composer.json @@ -0,0 +1,49 @@ +{ + "name": "nyholm/psr7", + "description": "A fast PHP7 implementation of PSR-7", + "license": "MIT", + "keywords": ["psr-7", "psr-17"], + "homepage": "https://tnyholm.se", + "authors": [ + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com" + }, + { + "name": "Martijn van der Ven", + "email": "martijn@vanderven.se" + } + ], + "require": { + "php": ">=7.2", + "psr/http-message": "^1.1 || ^2.0", + "psr/http-factory": "^1.0" + }, + "require-dev": { + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.4", + "php-http/message-factory": "^1.0", + "php-http/psr7-integration-tests": "^1.0", + "http-interop/http-factory-tests": "^0.9", + "symfony/error-handler": "^4.4" + }, + "provide": { + "php-http/message-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0", + "psr/http-factory-implementation": "1.0" + }, + "autoload": { + "psr-4": { + "Nyholm\\Psr7\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "Tests\\Nyholm\\Psr7\\": "tests/" + } + }, + "extra": { + "branch-alias": { + "dev-master": "1.8-dev" + } + } +} diff --git a/vendor/nyholm/psr7/src/Factory/HttplugFactory.php b/vendor/nyholm/psr7/src/Factory/HttplugFactory.php new file mode 100644 index 0000000..cc9285d --- /dev/null +++ b/vendor/nyholm/psr7/src/Factory/HttplugFactory.php @@ -0,0 +1,53 @@ + + * @author Martijn van der Ven + * + * @final This class should never be extended. See https://github.com/Nyholm/psr7/blob/master/doc/final.md + * + * @deprecated since version 1.8, use Psr17Factory instead + */ +class HttplugFactory implements MessageFactory, StreamFactory, UriFactory +{ + public function createRequest($method, $uri, array $headers = [], $body = null, $protocolVersion = '1.1'): RequestInterface + { + return new Request($method, $uri, $headers, $body, $protocolVersion); + } + + public function createResponse($statusCode = 200, $reasonPhrase = null, array $headers = [], $body = null, $version = '1.1'): ResponseInterface + { + return new Response((int) $statusCode, $headers, $body, $version, $reasonPhrase); + } + + public function createStream($body = null): StreamInterface + { + return Stream::create($body ?? ''); + } + + public function createUri($uri = ''): UriInterface + { + if ($uri instanceof UriInterface) { + return $uri; + } + + return new Uri($uri); + } +} diff --git a/vendor/nyholm/psr7/src/Factory/Psr17Factory.php b/vendor/nyholm/psr7/src/Factory/Psr17Factory.php new file mode 100644 index 0000000..2fa98be --- /dev/null +++ b/vendor/nyholm/psr7/src/Factory/Psr17Factory.php @@ -0,0 +1,78 @@ + + * @author Martijn van der Ven + * + * @final This class should never be extended. See https://github.com/Nyholm/psr7/blob/master/doc/final.md + */ +class Psr17Factory implements RequestFactoryInterface, ResponseFactoryInterface, ServerRequestFactoryInterface, StreamFactoryInterface, UploadedFileFactoryInterface, UriFactoryInterface +{ + public function createRequest(string $method, $uri): RequestInterface + { + return new Request($method, $uri); + } + + public function createResponse(int $code = 200, string $reasonPhrase = ''): ResponseInterface + { + if (2 > \func_num_args()) { + // This will make the Response class to use a custom reasonPhrase + $reasonPhrase = null; + } + + return new Response($code, [], null, '1.1', $reasonPhrase); + } + + public function createStream(string $content = ''): StreamInterface + { + return Stream::create($content); + } + + public function createStreamFromFile(string $filename, string $mode = 'r'): StreamInterface + { + if ('' === $filename) { + throw new \RuntimeException('Path cannot be empty'); + } + + if (false === $resource = @\fopen($filename, $mode)) { + if ('' === $mode || false === \in_array($mode[0], ['r', 'w', 'a', 'x', 'c'], true)) { + throw new \InvalidArgumentException(\sprintf('The mode "%s" is invalid.', $mode)); + } + + throw new \RuntimeException(\sprintf('The file "%s" cannot be opened: %s', $filename, \error_get_last()['message'] ?? '')); + } + + return Stream::create($resource); + } + + public function createStreamFromResource($resource): StreamInterface + { + return Stream::create($resource); + } + + public function createUploadedFile(StreamInterface $stream, ?int $size = null, int $error = \UPLOAD_ERR_OK, ?string $clientFilename = null, ?string $clientMediaType = null): UploadedFileInterface + { + if (null === $size) { + $size = $stream->getSize(); + } + + return new UploadedFile($stream, $size, $error, $clientFilename, $clientMediaType); + } + + public function createUri(string $uri = ''): UriInterface + { + return new Uri($uri); + } + + public function createServerRequest(string $method, $uri, array $serverParams = []): ServerRequestInterface + { + return new ServerRequest($method, $uri, [], null, '1.1', $serverParams); + } +} diff --git a/vendor/nyholm/psr7/src/MessageTrait.php b/vendor/nyholm/psr7/src/MessageTrait.php new file mode 100644 index 0000000..7d02383 --- /dev/null +++ b/vendor/nyholm/psr7/src/MessageTrait.php @@ -0,0 +1,235 @@ + + * @author Martijn van der Ven + * + * @internal should not be used outside of Nyholm/Psr7 as it does not fall under our BC promise + */ +trait MessageTrait +{ + /** @var array Map of all registered headers, as original name => array of values */ + private $headers = []; + + /** @var array Map of lowercase header name => original name at registration */ + private $headerNames = []; + + /** @var string */ + private $protocol = '1.1'; + + /** @var StreamInterface|null */ + private $stream; + + public function getProtocolVersion(): string + { + return $this->protocol; + } + + /** + * @return static + */ + public function withProtocolVersion($version): MessageInterface + { + if (!\is_scalar($version)) { + throw new \InvalidArgumentException('Protocol version must be a string'); + } + + if ($this->protocol === $version) { + return $this; + } + + $new = clone $this; + $new->protocol = (string) $version; + + return $new; + } + + public function getHeaders(): array + { + return $this->headers; + } + + public function hasHeader($header): bool + { + return isset($this->headerNames[\strtr($header, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')]); + } + + public function getHeader($header): array + { + if (!\is_string($header)) { + throw new \InvalidArgumentException('Header name must be an RFC 7230 compatible string'); + } + + $header = \strtr($header, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'); + if (!isset($this->headerNames[$header])) { + return []; + } + + $header = $this->headerNames[$header]; + + return $this->headers[$header]; + } + + public function getHeaderLine($header): string + { + return \implode(', ', $this->getHeader($header)); + } + + /** + * @return static + */ + public function withHeader($header, $value): MessageInterface + { + $value = $this->validateAndTrimHeader($header, $value); + $normalized = \strtr($header, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'); + + $new = clone $this; + if (isset($new->headerNames[$normalized])) { + unset($new->headers[$new->headerNames[$normalized]]); + } + $new->headerNames[$normalized] = $header; + $new->headers[$header] = $value; + + return $new; + } + + /** + * @return static + */ + public function withAddedHeader($header, $value): MessageInterface + { + if (!\is_string($header) || '' === $header) { + throw new \InvalidArgumentException('Header name must be an RFC 7230 compatible string'); + } + + $new = clone $this; + $new->setHeaders([$header => $value]); + + return $new; + } + + /** + * @return static + */ + public function withoutHeader($header): MessageInterface + { + if (!\is_string($header)) { + throw new \InvalidArgumentException('Header name must be an RFC 7230 compatible string'); + } + + $normalized = \strtr($header, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'); + if (!isset($this->headerNames[$normalized])) { + return $this; + } + + $header = $this->headerNames[$normalized]; + $new = clone $this; + unset($new->headers[$header], $new->headerNames[$normalized]); + + return $new; + } + + public function getBody(): StreamInterface + { + if (null === $this->stream) { + $this->stream = Stream::create(''); + } + + return $this->stream; + } + + /** + * @return static + */ + public function withBody(StreamInterface $body): MessageInterface + { + if ($body === $this->stream) { + return $this; + } + + $new = clone $this; + $new->stream = $body; + + return $new; + } + + private function setHeaders(array $headers): void + { + foreach ($headers as $header => $value) { + if (\is_int($header)) { + // If a header name was set to a numeric string, PHP will cast the key to an int. + // We must cast it back to a string in order to comply with validation. + $header = (string) $header; + } + $value = $this->validateAndTrimHeader($header, $value); + $normalized = \strtr($header, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'); + if (isset($this->headerNames[$normalized])) { + $header = $this->headerNames[$normalized]; + $this->headers[$header] = \array_merge($this->headers[$header], $value); + } else { + $this->headerNames[$normalized] = $header; + $this->headers[$header] = $value; + } + } + } + + /** + * Make sure the header complies with RFC 7230. + * + * Header names must be a non-empty string consisting of token characters. + * + * Header values must be strings consisting of visible characters with all optional + * leading and trailing whitespace stripped. This method will always strip such + * optional whitespace. Note that the method does not allow folding whitespace within + * the values as this was deprecated for almost all instances by the RFC. + * + * header-field = field-name ":" OWS field-value OWS + * field-name = 1*( "!" / "#" / "$" / "%" / "&" / "'" / "*" / "+" / "-" / "." / "^" + * / "_" / "`" / "|" / "~" / %x30-39 / ( %x41-5A / %x61-7A ) ) + * OWS = *( SP / HTAB ) + * field-value = *( ( %x21-7E / %x80-FF ) [ 1*( SP / HTAB ) ( %x21-7E / %x80-FF ) ] ) + * + * @see https://tools.ietf.org/html/rfc7230#section-3.2.4 + */ + private function validateAndTrimHeader($header, $values): array + { + if (!\is_string($header) || 1 !== \preg_match("@^[!#$%&'*+.^_`|~0-9A-Za-z-]+$@D", $header)) { + throw new \InvalidArgumentException('Header name must be an RFC 7230 compatible string'); + } + + if (!\is_array($values)) { + // This is simple, just one value. + if ((!\is_numeric($values) && !\is_string($values)) || 1 !== \preg_match("@^[ \t\x21-\x7E\x80-\xFF]*$@", (string) $values)) { + throw new \InvalidArgumentException('Header values must be RFC 7230 compatible strings'); + } + + return [\trim((string) $values, " \t")]; + } + + if (empty($values)) { + throw new \InvalidArgumentException('Header values must be a string or an array of strings, empty array given'); + } + + // Assert Non empty array + $returnValues = []; + foreach ($values as $v) { + if ((!\is_numeric($v) && !\is_string($v)) || 1 !== \preg_match("@^[ \t\x21-\x7E\x80-\xFF]*$@D", (string) $v)) { + throw new \InvalidArgumentException('Header values must be RFC 7230 compatible strings'); + } + + $returnValues[] = \trim((string) $v, " \t"); + } + + return $returnValues; + } +} diff --git a/vendor/nyholm/psr7/src/Request.php b/vendor/nyholm/psr7/src/Request.php new file mode 100644 index 0000000..d50744e --- /dev/null +++ b/vendor/nyholm/psr7/src/Request.php @@ -0,0 +1,47 @@ + + * @author Martijn van der Ven + * + * @final This class should never be extended. See https://github.com/Nyholm/psr7/blob/master/doc/final.md + */ +class Request implements RequestInterface +{ + use MessageTrait; + use RequestTrait; + + /** + * @param string $method HTTP method + * @param string|UriInterface $uri URI + * @param array $headers Request headers + * @param string|resource|StreamInterface|null $body Request body + * @param string $version Protocol version + */ + public function __construct(string $method, $uri, array $headers = [], $body = null, string $version = '1.1') + { + if (!($uri instanceof UriInterface)) { + $uri = new Uri($uri); + } + + $this->method = $method; + $this->uri = $uri; + $this->setHeaders($headers); + $this->protocol = $version; + + if (!$this->hasHeader('Host')) { + $this->updateHostFromUri(); + } + + // If we got no body, defer initialization of the stream until Request::getBody() + if ('' !== $body && null !== $body) { + $this->stream = Stream::create($body); + } + } +} diff --git a/vendor/nyholm/psr7/src/RequestTrait.php b/vendor/nyholm/psr7/src/RequestTrait.php new file mode 100644 index 0000000..2dbb3ab --- /dev/null +++ b/vendor/nyholm/psr7/src/RequestTrait.php @@ -0,0 +1,127 @@ + + * @author Martijn van der Ven + * + * @internal should not be used outside of Nyholm/Psr7 as it does not fall under our BC promise + */ +trait RequestTrait +{ + /** @var string */ + private $method; + + /** @var string|null */ + private $requestTarget; + + /** @var UriInterface|null */ + private $uri; + + public function getRequestTarget(): string + { + if (null !== $this->requestTarget) { + return $this->requestTarget; + } + + if ('' === $target = $this->uri->getPath()) { + $target = '/'; + } + if ('' !== $this->uri->getQuery()) { + $target .= '?' . $this->uri->getQuery(); + } + + return $target; + } + + /** + * @return static + */ + public function withRequestTarget($requestTarget): RequestInterface + { + if (!\is_string($requestTarget)) { + throw new \InvalidArgumentException('Request target must be a string'); + } + + if (\preg_match('#\s#', $requestTarget)) { + throw new \InvalidArgumentException('Invalid request target provided; cannot contain whitespace'); + } + + $new = clone $this; + $new->requestTarget = $requestTarget; + + return $new; + } + + public function getMethod(): string + { + return $this->method; + } + + /** + * @return static + */ + public function withMethod($method): RequestInterface + { + if (!\is_string($method)) { + throw new \InvalidArgumentException('Method must be a string'); + } + + $new = clone $this; + $new->method = $method; + + return $new; + } + + public function getUri(): UriInterface + { + return $this->uri; + } + + /** + * @return static + */ + public function withUri(UriInterface $uri, $preserveHost = false): RequestInterface + { + if ($uri === $this->uri) { + return $this; + } + + $new = clone $this; + $new->uri = $uri; + + if (!$preserveHost || !$this->hasHeader('Host')) { + $new->updateHostFromUri(); + } + + return $new; + } + + private function updateHostFromUri(): void + { + if ('' === $host = $this->uri->getHost()) { + return; + } + + if (null !== ($port = $this->uri->getPort())) { + $host .= ':' . $port; + } + + if (isset($this->headerNames['host'])) { + $header = $this->headerNames['host']; + } else { + $this->headerNames['host'] = $header = 'Host'; + } + + // Ensure Host is the first header. + // See: http://tools.ietf.org/html/rfc7230#section-5.4 + $this->headers = [$header => [$host]] + $this->headers; + } +} diff --git a/vendor/nyholm/psr7/src/Response.php b/vendor/nyholm/psr7/src/Response.php new file mode 100644 index 0000000..71eb2fa --- /dev/null +++ b/vendor/nyholm/psr7/src/Response.php @@ -0,0 +1,93 @@ + + * @author Martijn van der Ven + * + * @final This class should never be extended. See https://github.com/Nyholm/psr7/blob/master/doc/final.md + */ +class Response implements ResponseInterface +{ + use MessageTrait; + + /** @var array Map of standard HTTP status code/reason phrases */ + private const PHRASES = [ + 100 => 'Continue', 101 => 'Switching Protocols', 102 => 'Processing', + 200 => 'OK', 201 => 'Created', 202 => 'Accepted', 203 => 'Non-Authoritative Information', 204 => 'No Content', 205 => 'Reset Content', 206 => 'Partial Content', 207 => 'Multi-status', 208 => 'Already Reported', + 300 => 'Multiple Choices', 301 => 'Moved Permanently', 302 => 'Found', 303 => 'See Other', 304 => 'Not Modified', 305 => 'Use Proxy', 306 => 'Switch Proxy', 307 => 'Temporary Redirect', + 400 => 'Bad Request', 401 => 'Unauthorized', 402 => 'Payment Required', 403 => 'Forbidden', 404 => 'Not Found', 405 => 'Method Not Allowed', 406 => 'Not Acceptable', 407 => 'Proxy Authentication Required', 408 => 'Request Time-out', 409 => 'Conflict', 410 => 'Gone', 411 => 'Length Required', 412 => 'Precondition Failed', 413 => 'Request Entity Too Large', 414 => 'Request-URI Too Large', 415 => 'Unsupported Media Type', 416 => 'Requested range not satisfiable', 417 => 'Expectation Failed', 418 => 'I\'m a teapot', 422 => 'Unprocessable Entity', 423 => 'Locked', 424 => 'Failed Dependency', 425 => 'Unordered Collection', 426 => 'Upgrade Required', 428 => 'Precondition Required', 429 => 'Too Many Requests', 431 => 'Request Header Fields Too Large', 451 => 'Unavailable For Legal Reasons', + 500 => 'Internal Server Error', 501 => 'Not Implemented', 502 => 'Bad Gateway', 503 => 'Service Unavailable', 504 => 'Gateway Time-out', 505 => 'HTTP Version not supported', 506 => 'Variant Also Negotiates', 507 => 'Insufficient Storage', 508 => 'Loop Detected', 511 => 'Network Authentication Required', + ]; + + /** @var string */ + private $reasonPhrase = ''; + + /** @var int */ + private $statusCode; + + /** + * @param int $status Status code + * @param array $headers Response headers + * @param string|resource|StreamInterface|null $body Response body + * @param string $version Protocol version + * @param string|null $reason Reason phrase (when empty a default will be used based on the status code) + */ + public function __construct(int $status = 200, array $headers = [], $body = null, string $version = '1.1', ?string $reason = null) + { + // If we got no body, defer initialization of the stream until Response::getBody() + if ('' !== $body && null !== $body) { + $this->stream = Stream::create($body); + } + + $this->statusCode = $status; + $this->setHeaders($headers); + if (null === $reason && isset(self::PHRASES[$this->statusCode])) { + $this->reasonPhrase = self::PHRASES[$status]; + } else { + $this->reasonPhrase = $reason ?? ''; + } + + $this->protocol = $version; + } + + public function getStatusCode(): int + { + return $this->statusCode; + } + + public function getReasonPhrase(): string + { + return $this->reasonPhrase; + } + + /** + * @return static + */ + public function withStatus($code, $reasonPhrase = ''): ResponseInterface + { + if (!\is_int($code) && !\is_string($code)) { + throw new \InvalidArgumentException('Status code has to be an integer'); + } + + $code = (int) $code; + if ($code < 100 || $code > 599) { + throw new \InvalidArgumentException(\sprintf('Status code has to be an integer between 100 and 599. A status code of %d was given', $code)); + } + + $new = clone $this; + $new->statusCode = $code; + if ((null === $reasonPhrase || '' === $reasonPhrase) && isset(self::PHRASES[$new->statusCode])) { + $reasonPhrase = self::PHRASES[$new->statusCode]; + } + $new->reasonPhrase = $reasonPhrase; + + return $new; + } +} diff --git a/vendor/nyholm/psr7/src/ServerRequest.php b/vendor/nyholm/psr7/src/ServerRequest.php new file mode 100644 index 0000000..a3c5ba9 --- /dev/null +++ b/vendor/nyholm/psr7/src/ServerRequest.php @@ -0,0 +1,201 @@ + + * @author Martijn van der Ven + * + * @final This class should never be extended. See https://github.com/Nyholm/psr7/blob/master/doc/final.md + */ +class ServerRequest implements ServerRequestInterface +{ + use MessageTrait; + use RequestTrait; + + /** @var array */ + private $attributes = []; + + /** @var array */ + private $cookieParams = []; + + /** @var array|object|null */ + private $parsedBody; + + /** @var array */ + private $queryParams = []; + + /** @var array */ + private $serverParams; + + /** @var UploadedFileInterface[] */ + private $uploadedFiles = []; + + /** + * @param string $method HTTP method + * @param string|UriInterface $uri URI + * @param array $headers Request headers + * @param string|resource|StreamInterface|null $body Request body + * @param string $version Protocol version + * @param array $serverParams Typically the $_SERVER superglobal + */ + public function __construct(string $method, $uri, array $headers = [], $body = null, string $version = '1.1', array $serverParams = []) + { + $this->serverParams = $serverParams; + + if (!($uri instanceof UriInterface)) { + $uri = new Uri($uri); + } + + $this->method = $method; + $this->uri = $uri; + $this->setHeaders($headers); + $this->protocol = $version; + \parse_str($uri->getQuery(), $this->queryParams); + + if (!$this->hasHeader('Host')) { + $this->updateHostFromUri(); + } + + // If we got no body, defer initialization of the stream until ServerRequest::getBody() + if ('' !== $body && null !== $body) { + $this->stream = Stream::create($body); + } + } + + public function getServerParams(): array + { + return $this->serverParams; + } + + public function getUploadedFiles(): array + { + return $this->uploadedFiles; + } + + /** + * @return static + */ + public function withUploadedFiles(array $uploadedFiles): ServerRequestInterface + { + $new = clone $this; + $new->uploadedFiles = $uploadedFiles; + + return $new; + } + + public function getCookieParams(): array + { + return $this->cookieParams; + } + + /** + * @return static + */ + public function withCookieParams(array $cookies): ServerRequestInterface + { + $new = clone $this; + $new->cookieParams = $cookies; + + return $new; + } + + public function getQueryParams(): array + { + return $this->queryParams; + } + + /** + * @return static + */ + public function withQueryParams(array $query): ServerRequestInterface + { + $new = clone $this; + $new->queryParams = $query; + + return $new; + } + + /** + * @return array|object|null + */ + public function getParsedBody() + { + return $this->parsedBody; + } + + /** + * @return static + */ + public function withParsedBody($data): ServerRequestInterface + { + if (!\is_array($data) && !\is_object($data) && null !== $data) { + throw new \InvalidArgumentException('First parameter to withParsedBody MUST be object, array or null'); + } + + $new = clone $this; + $new->parsedBody = $data; + + return $new; + } + + public function getAttributes(): array + { + return $this->attributes; + } + + /** + * @return mixed + */ + public function getAttribute($attribute, $default = null) + { + if (!\is_string($attribute)) { + throw new \InvalidArgumentException('Attribute name must be a string'); + } + + if (false === \array_key_exists($attribute, $this->attributes)) { + return $default; + } + + return $this->attributes[$attribute]; + } + + /** + * @return static + */ + public function withAttribute($attribute, $value): ServerRequestInterface + { + if (!\is_string($attribute)) { + throw new \InvalidArgumentException('Attribute name must be a string'); + } + + $new = clone $this; + $new->attributes[$attribute] = $value; + + return $new; + } + + /** + * @return static + */ + public function withoutAttribute($attribute): ServerRequestInterface + { + if (!\is_string($attribute)) { + throw new \InvalidArgumentException('Attribute name must be a string'); + } + + if (false === \array_key_exists($attribute, $this->attributes)) { + return $this; + } + + $new = clone $this; + unset($new->attributes[$attribute]); + + return $new; + } +} diff --git a/vendor/nyholm/psr7/src/Stream.php b/vendor/nyholm/psr7/src/Stream.php new file mode 100644 index 0000000..63b7d6d --- /dev/null +++ b/vendor/nyholm/psr7/src/Stream.php @@ -0,0 +1,399 @@ + + * @author Martijn van der Ven + * + * @final This class should never be extended. See https://github.com/Nyholm/psr7/blob/master/doc/final.md + */ +class Stream implements StreamInterface +{ + use StreamTrait; + + /** @var resource|null A resource reference */ + private $stream; + + /** @var bool */ + private $seekable; + + /** @var bool */ + private $readable; + + /** @var bool */ + private $writable; + + /** @var array|mixed|void|bool|null */ + private $uri; + + /** @var int|null */ + private $size; + + /** @var array Hash of readable and writable stream types */ + private const READ_WRITE_HASH = [ + 'read' => [ + 'r' => true, 'w+' => true, 'r+' => true, 'x+' => true, 'c+' => true, + 'rb' => true, 'w+b' => true, 'r+b' => true, 'x+b' => true, + 'c+b' => true, 'rt' => true, 'w+t' => true, 'r+t' => true, + 'x+t' => true, 'c+t' => true, 'a+' => true, + ], + 'write' => [ + 'w' => true, 'w+' => true, 'rw' => true, 'r+' => true, 'x+' => true, + 'c+' => true, 'wb' => true, 'w+b' => true, 'r+b' => true, + 'x+b' => true, 'c+b' => true, 'w+t' => true, 'r+t' => true, + 'x+t' => true, 'c+t' => true, 'a' => true, 'a+' => true, + ], + ]; + + /** + * @param resource $body + */ + public function __construct($body) + { + if (!\is_resource($body)) { + throw new \InvalidArgumentException('First argument to Stream::__construct() must be resource'); + } + + $this->stream = $body; + $meta = \stream_get_meta_data($this->stream); + $this->seekable = $meta['seekable'] && 0 === \fseek($this->stream, 0, \SEEK_CUR); + $this->readable = isset(self::READ_WRITE_HASH['read'][$meta['mode']]); + $this->writable = isset(self::READ_WRITE_HASH['write'][$meta['mode']]); + } + + /** + * Creates a new PSR-7 stream. + * + * @param string|resource|StreamInterface $body + * + * @throws \InvalidArgumentException + */ + public static function create($body = ''): StreamInterface + { + if ($body instanceof StreamInterface) { + return $body; + } + + if (\is_string($body)) { + if (200000 <= \strlen($body)) { + $body = self::openZvalStream($body); + } else { + $resource = \fopen('php://memory', 'r+'); + \fwrite($resource, $body); + \fseek($resource, 0); + $body = $resource; + } + } + + if (!\is_resource($body)) { + throw new \InvalidArgumentException('First argument to Stream::create() must be a string, resource or StreamInterface'); + } + + return new self($body); + } + + /** + * Closes the stream when the destructed. + */ + public function __destruct() + { + $this->close(); + } + + public function close(): void + { + if (isset($this->stream)) { + if (\is_resource($this->stream)) { + \fclose($this->stream); + } + $this->detach(); + } + } + + public function detach() + { + if (!isset($this->stream)) { + return null; + } + + $result = $this->stream; + unset($this->stream); + $this->size = $this->uri = null; + $this->readable = $this->writable = $this->seekable = false; + + return $result; + } + + private function getUri() + { + if (false !== $this->uri) { + $this->uri = $this->getMetadata('uri') ?? false; + } + + return $this->uri; + } + + public function getSize(): ?int + { + if (null !== $this->size) { + return $this->size; + } + + if (!isset($this->stream)) { + return null; + } + + // Clear the stat cache if the stream has a URI + if ($uri = $this->getUri()) { + \clearstatcache(true, $uri); + } + + $stats = \fstat($this->stream); + if (isset($stats['size'])) { + $this->size = $stats['size']; + + return $this->size; + } + + return null; + } + + public function tell(): int + { + if (!isset($this->stream)) { + throw new \RuntimeException('Stream is detached'); + } + + if (false === $result = @\ftell($this->stream)) { + throw new \RuntimeException('Unable to determine stream position: ' . (\error_get_last()['message'] ?? '')); + } + + return $result; + } + + public function eof(): bool + { + return !isset($this->stream) || \feof($this->stream); + } + + public function isSeekable(): bool + { + return $this->seekable; + } + + public function seek($offset, $whence = \SEEK_SET): void + { + if (!isset($this->stream)) { + throw new \RuntimeException('Stream is detached'); + } + + if (!$this->seekable) { + throw new \RuntimeException('Stream is not seekable'); + } + + if (-1 === \fseek($this->stream, $offset, $whence)) { + throw new \RuntimeException('Unable to seek to stream position "' . $offset . '" with whence ' . \var_export($whence, true)); + } + } + + public function rewind(): void + { + $this->seek(0); + } + + public function isWritable(): bool + { + return $this->writable; + } + + public function write($string): int + { + if (!isset($this->stream)) { + throw new \RuntimeException('Stream is detached'); + } + + if (!$this->writable) { + throw new \RuntimeException('Cannot write to a non-writable stream'); + } + + // We can't know the size after writing anything + $this->size = null; + + if (false === $result = @\fwrite($this->stream, $string)) { + throw new \RuntimeException('Unable to write to stream: ' . (\error_get_last()['message'] ?? '')); + } + + return $result; + } + + public function isReadable(): bool + { + return $this->readable; + } + + public function read($length): string + { + if (!isset($this->stream)) { + throw new \RuntimeException('Stream is detached'); + } + + if (!$this->readable) { + throw new \RuntimeException('Cannot read from non-readable stream'); + } + + if (false === $result = @\fread($this->stream, $length)) { + throw new \RuntimeException('Unable to read from stream: ' . (\error_get_last()['message'] ?? '')); + } + + return $result; + } + + public function getContents(): string + { + if (!isset($this->stream)) { + throw new \RuntimeException('Stream is detached'); + } + + $exception = null; + + \set_error_handler(static function ($type, $message) use (&$exception) { + throw $exception = new \RuntimeException('Unable to read stream contents: ' . $message); + }); + + try { + return \stream_get_contents($this->stream); + } catch (\Throwable $e) { + throw $e === $exception ? $e : new \RuntimeException('Unable to read stream contents: ' . $e->getMessage(), 0, $e); + } finally { + \restore_error_handler(); + } + } + + /** + * @return mixed + */ + public function getMetadata($key = null) + { + if (null !== $key && !\is_string($key)) { + throw new \InvalidArgumentException('Metadata key must be a string'); + } + + if (!isset($this->stream)) { + return $key ? null : []; + } + + $meta = \stream_get_meta_data($this->stream); + + if (null === $key) { + return $meta; + } + + return $meta[$key] ?? null; + } + + private static function openZvalStream(string $body) + { + static $wrapper; + + $wrapper ?? \stream_wrapper_register('Nyholm-Psr7-Zval', $wrapper = \get_class(new class() { + public $context; + + private $data; + private $position = 0; + + public function stream_open(): bool + { + $this->data = \stream_context_get_options($this->context)['Nyholm-Psr7-Zval']['data']; + \stream_context_set_option($this->context, 'Nyholm-Psr7-Zval', 'data', null); + + return true; + } + + public function stream_read(int $count): string + { + $result = \substr($this->data, $this->position, $count); + $this->position += \strlen($result); + + return $result; + } + + public function stream_write(string $data): int + { + $this->data = \substr_replace($this->data, $data, $this->position, \strlen($data)); + $this->position += \strlen($data); + + return \strlen($data); + } + + public function stream_tell(): int + { + return $this->position; + } + + public function stream_eof(): bool + { + return \strlen($this->data) <= $this->position; + } + + public function stream_stat(): array + { + return [ + 'mode' => 33206, // POSIX_S_IFREG | 0666 + 'nlink' => 1, + 'rdev' => -1, + 'size' => \strlen($this->data), + 'blksize' => -1, + 'blocks' => -1, + ]; + } + + public function stream_seek(int $offset, int $whence): bool + { + if (\SEEK_SET === $whence && (0 <= $offset && \strlen($this->data) >= $offset)) { + $this->position = $offset; + } elseif (\SEEK_CUR === $whence && 0 <= $offset) { + $this->position += $offset; + } elseif (\SEEK_END === $whence && (0 > $offset && 0 <= $offset = \strlen($this->data) + $offset)) { + $this->position = $offset; + } else { + return false; + } + + return true; + } + + public function stream_set_option(): bool + { + return true; + } + + public function stream_truncate(int $new_size): bool + { + if ($new_size) { + $this->data = \substr($this->data, 0, $new_size); + $this->position = \min($this->position, $new_size); + } else { + $this->data = ''; + $this->position = 0; + } + + return true; + } + })); + + $context = \stream_context_create(['Nyholm-Psr7-Zval' => ['data' => $body]]); + + if (!$stream = @\fopen('Nyholm-Psr7-Zval://', 'r+', false, $context)) { + \stream_wrapper_register('Nyholm-Psr7-Zval', $wrapper); + $stream = \fopen('Nyholm-Psr7-Zval://', 'r+', false, $context); + } + + return $stream; + } +} diff --git a/vendor/nyholm/psr7/src/StreamTrait.php b/vendor/nyholm/psr7/src/StreamTrait.php new file mode 100644 index 0000000..41a3f9d --- /dev/null +++ b/vendor/nyholm/psr7/src/StreamTrait.php @@ -0,0 +1,57 @@ += 70400 || (new \ReflectionMethod(StreamInterface::class, '__toString'))->hasReturnType()) { + /** + * @internal + */ + trait StreamTrait + { + public function __toString(): string + { + if ($this->isSeekable()) { + $this->seek(0); + } + + return $this->getContents(); + } + } +} else { + /** + * @internal + */ + trait StreamTrait + { + /** + * @return string + */ + public function __toString() + { + try { + if ($this->isSeekable()) { + $this->seek(0); + } + + return $this->getContents(); + } catch (\Throwable $e) { + if (\is_array($errorHandler = \set_error_handler('var_dump'))) { + $errorHandler = $errorHandler[0] ?? null; + } + \restore_error_handler(); + + if ($e instanceof \Error || $errorHandler instanceof SymfonyErrorHandler || $errorHandler instanceof SymfonyLegacyErrorHandler) { + return \trigger_error((string) $e, \E_USER_ERROR); + } + + return ''; + } + } + } +} diff --git a/vendor/nyholm/psr7/src/UploadedFile.php b/vendor/nyholm/psr7/src/UploadedFile.php new file mode 100644 index 0000000..c77dca4 --- /dev/null +++ b/vendor/nyholm/psr7/src/UploadedFile.php @@ -0,0 +1,179 @@ + + * @author Martijn van der Ven + * + * @final This class should never be extended. See https://github.com/Nyholm/psr7/blob/master/doc/final.md + */ +class UploadedFile implements UploadedFileInterface +{ + /** @var array */ + private const ERRORS = [ + \UPLOAD_ERR_OK => 1, + \UPLOAD_ERR_INI_SIZE => 1, + \UPLOAD_ERR_FORM_SIZE => 1, + \UPLOAD_ERR_PARTIAL => 1, + \UPLOAD_ERR_NO_FILE => 1, + \UPLOAD_ERR_NO_TMP_DIR => 1, + \UPLOAD_ERR_CANT_WRITE => 1, + \UPLOAD_ERR_EXTENSION => 1, + ]; + + /** @var string */ + private $clientFilename; + + /** @var string */ + private $clientMediaType; + + /** @var int */ + private $error; + + /** @var string|null */ + private $file; + + /** @var bool */ + private $moved = false; + + /** @var int */ + private $size; + + /** @var StreamInterface|null */ + private $stream; + + /** + * @param StreamInterface|string|resource $streamOrFile + * @param int $size + * @param int $errorStatus + * @param string|null $clientFilename + * @param string|null $clientMediaType + */ + public function __construct($streamOrFile, $size, $errorStatus, $clientFilename = null, $clientMediaType = null) + { + if (false === \is_int($errorStatus) || !isset(self::ERRORS[$errorStatus])) { + throw new \InvalidArgumentException('Upload file error status must be an integer value and one of the "UPLOAD_ERR_*" constants'); + } + + if (false === \is_int($size)) { + throw new \InvalidArgumentException('Upload file size must be an integer'); + } + + if (null !== $clientFilename && !\is_string($clientFilename)) { + throw new \InvalidArgumentException('Upload file client filename must be a string or null'); + } + + if (null !== $clientMediaType && !\is_string($clientMediaType)) { + throw new \InvalidArgumentException('Upload file client media type must be a string or null'); + } + + $this->error = $errorStatus; + $this->size = $size; + $this->clientFilename = $clientFilename; + $this->clientMediaType = $clientMediaType; + + if (\UPLOAD_ERR_OK === $this->error) { + // Depending on the value set file or stream variable. + if (\is_string($streamOrFile) && '' !== $streamOrFile) { + $this->file = $streamOrFile; + } elseif (\is_resource($streamOrFile)) { + $this->stream = Stream::create($streamOrFile); + } elseif ($streamOrFile instanceof StreamInterface) { + $this->stream = $streamOrFile; + } else { + throw new \InvalidArgumentException('Invalid stream or file provided for UploadedFile'); + } + } + } + + /** + * @throws \RuntimeException if is moved or not ok + */ + private function validateActive(): void + { + if (\UPLOAD_ERR_OK !== $this->error) { + throw new \RuntimeException('Cannot retrieve stream due to upload error'); + } + + if ($this->moved) { + throw new \RuntimeException('Cannot retrieve stream after it has already been moved'); + } + } + + public function getStream(): StreamInterface + { + $this->validateActive(); + + if ($this->stream instanceof StreamInterface) { + return $this->stream; + } + + if (false === $resource = @\fopen($this->file, 'r')) { + throw new \RuntimeException(\sprintf('The file "%s" cannot be opened: %s', $this->file, \error_get_last()['message'] ?? '')); + } + + return Stream::create($resource); + } + + public function moveTo($targetPath): void + { + $this->validateActive(); + + if (!\is_string($targetPath) || '' === $targetPath) { + throw new \InvalidArgumentException('Invalid path provided for move operation; must be a non-empty string'); + } + + if (null !== $this->file) { + $this->moved = 'cli' === \PHP_SAPI ? @\rename($this->file, $targetPath) : @\move_uploaded_file($this->file, $targetPath); + + if (false === $this->moved) { + throw new \RuntimeException(\sprintf('Uploaded file could not be moved to "%s": %s', $targetPath, \error_get_last()['message'] ?? '')); + } + } else { + $stream = $this->getStream(); + if ($stream->isSeekable()) { + $stream->rewind(); + } + + if (false === $resource = @\fopen($targetPath, 'w')) { + throw new \RuntimeException(\sprintf('The file "%s" cannot be opened: %s', $targetPath, \error_get_last()['message'] ?? '')); + } + + $dest = Stream::create($resource); + + while (!$stream->eof()) { + if (!$dest->write($stream->read(1048576))) { + break; + } + } + + $this->moved = true; + } + } + + public function getSize(): int + { + return $this->size; + } + + public function getError(): int + { + return $this->error; + } + + public function getClientFilename(): ?string + { + return $this->clientFilename; + } + + public function getClientMediaType(): ?string + { + return $this->clientMediaType; + } +} diff --git a/vendor/nyholm/psr7/src/Uri.php b/vendor/nyholm/psr7/src/Uri.php new file mode 100644 index 0000000..621e2e7 --- /dev/null +++ b/vendor/nyholm/psr7/src/Uri.php @@ -0,0 +1,356 @@ + + * @author Martijn van der Ven + * + * @final This class should never be extended. See https://github.com/Nyholm/psr7/blob/master/doc/final.md + */ +class Uri implements UriInterface +{ + private const SCHEMES = ['http' => 80, 'https' => 443]; + + private const CHAR_UNRESERVED = 'a-zA-Z0-9_\-\.~'; + + private const CHAR_SUB_DELIMS = '!\$&\'\(\)\*\+,;='; + + private const CHAR_GEN_DELIMS = ':\/\?#\[\]@'; + + /** @var string Uri scheme. */ + private $scheme = ''; + + /** @var string Uri user info. */ + private $userInfo = ''; + + /** @var string Uri host. */ + private $host = ''; + + /** @var int|null Uri port. */ + private $port; + + /** @var string Uri path. */ + private $path = ''; + + /** @var string Uri query string. */ + private $query = ''; + + /** @var string Uri fragment. */ + private $fragment = ''; + + public function __construct(string $uri = '') + { + if ('' !== $uri) { + if (false === $parts = \parse_url($uri)) { + throw new \InvalidArgumentException(\sprintf('Unable to parse URI: "%s"', $uri)); + } + + // Apply parse_url parts to a URI. + $this->scheme = isset($parts['scheme']) ? \strtr($parts['scheme'], 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') : ''; + $this->userInfo = $parts['user'] ?? ''; + $this->host = isset($parts['host']) ? \strtr($parts['host'], 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') : ''; + $this->port = isset($parts['port']) ? $this->filterPort($parts['port']) : null; + $this->path = isset($parts['path']) ? $this->filterPath($parts['path']) : ''; + $this->query = isset($parts['query']) ? $this->filterQueryAndFragment($parts['query']) : ''; + $this->fragment = isset($parts['fragment']) ? $this->filterQueryAndFragment($parts['fragment']) : ''; + if (isset($parts['pass'])) { + $this->userInfo .= ':' . $parts['pass']; + } + } + } + + public function __toString(): string + { + return self::createUriString($this->scheme, $this->getAuthority(), $this->path, $this->query, $this->fragment); + } + + public function getScheme(): string + { + return $this->scheme; + } + + public function getAuthority(): string + { + if ('' === $this->host) { + return ''; + } + + $authority = $this->host; + if ('' !== $this->userInfo) { + $authority = $this->userInfo . '@' . $authority; + } + + if (null !== $this->port) { + $authority .= ':' . $this->port; + } + + return $authority; + } + + public function getUserInfo(): string + { + return $this->userInfo; + } + + public function getHost(): string + { + return $this->host; + } + + public function getPort(): ?int + { + return $this->port; + } + + public function getPath(): string + { + $path = $this->path; + + if ('' !== $path && '/' !== $path[0]) { + if ('' !== $this->host) { + // If the path is rootless and an authority is present, the path MUST be prefixed by "/" + $path = '/' . $path; + } + } elseif (isset($path[1]) && '/' === $path[1]) { + // If the path is starting with more than one "/", the + // starting slashes MUST be reduced to one. + $path = '/' . \ltrim($path, '/'); + } + + return $path; + } + + public function getQuery(): string + { + return $this->query; + } + + public function getFragment(): string + { + return $this->fragment; + } + + /** + * @return static + */ + public function withScheme($scheme): UriInterface + { + if (!\is_string($scheme)) { + throw new \InvalidArgumentException('Scheme must be a string'); + } + + if ($this->scheme === $scheme = \strtr($scheme, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')) { + return $this; + } + + $new = clone $this; + $new->scheme = $scheme; + $new->port = $new->filterPort($new->port); + + return $new; + } + + /** + * @return static + */ + public function withUserInfo($user, $password = null): UriInterface + { + if (!\is_string($user)) { + throw new \InvalidArgumentException('User must be a string'); + } + + $info = \preg_replace_callback('/[' . self::CHAR_GEN_DELIMS . self::CHAR_SUB_DELIMS . ']++/', [__CLASS__, 'rawurlencodeMatchZero'], $user); + if (null !== $password && '' !== $password) { + if (!\is_string($password)) { + throw new \InvalidArgumentException('Password must be a string'); + } + + $info .= ':' . \preg_replace_callback('/[' . self::CHAR_GEN_DELIMS . self::CHAR_SUB_DELIMS . ']++/', [__CLASS__, 'rawurlencodeMatchZero'], $password); + } + + if ($this->userInfo === $info) { + return $this; + } + + $new = clone $this; + $new->userInfo = $info; + + return $new; + } + + /** + * @return static + */ + public function withHost($host): UriInterface + { + if (!\is_string($host)) { + throw new \InvalidArgumentException('Host must be a string'); + } + + if ($this->host === $host = \strtr($host, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')) { + return $this; + } + + $new = clone $this; + $new->host = $host; + + return $new; + } + + /** + * @return static + */ + public function withPort($port): UriInterface + { + if ($this->port === $port = $this->filterPort($port)) { + return $this; + } + + $new = clone $this; + $new->port = $port; + + return $new; + } + + /** + * @return static + */ + public function withPath($path): UriInterface + { + if ($this->path === $path = $this->filterPath($path)) { + return $this; + } + + $new = clone $this; + $new->path = $path; + + return $new; + } + + /** + * @return static + */ + public function withQuery($query): UriInterface + { + if ($this->query === $query = $this->filterQueryAndFragment($query)) { + return $this; + } + + $new = clone $this; + $new->query = $query; + + return $new; + } + + /** + * @return static + */ + public function withFragment($fragment): UriInterface + { + if ($this->fragment === $fragment = $this->filterQueryAndFragment($fragment)) { + return $this; + } + + $new = clone $this; + $new->fragment = $fragment; + + return $new; + } + + /** + * Create a URI string from its various parts. + */ + private static function createUriString(string $scheme, string $authority, string $path, string $query, string $fragment): string + { + $uri = ''; + if ('' !== $scheme) { + $uri .= $scheme . ':'; + } + + if ('' !== $authority) { + $uri .= '//' . $authority; + } + + if ('' !== $path) { + if ('/' !== $path[0]) { + if ('' !== $authority) { + // If the path is rootless and an authority is present, the path MUST be prefixed by "/" + $path = '/' . $path; + } + } elseif (isset($path[1]) && '/' === $path[1]) { + if ('' === $authority) { + // If the path is starting with more than one "/" and no authority is present, the + // starting slashes MUST be reduced to one. + $path = '/' . \ltrim($path, '/'); + } + } + + $uri .= $path; + } + + if ('' !== $query) { + $uri .= '?' . $query; + } + + if ('' !== $fragment) { + $uri .= '#' . $fragment; + } + + return $uri; + } + + /** + * Is a given port non-standard for the current scheme? + */ + private static function isNonStandardPort(string $scheme, int $port): bool + { + return !isset(self::SCHEMES[$scheme]) || $port !== self::SCHEMES[$scheme]; + } + + private function filterPort($port): ?int + { + if (null === $port) { + return null; + } + + $port = (int) $port; + if (0 > $port || 0xFFFF < $port) { + throw new \InvalidArgumentException(\sprintf('Invalid port: %d. Must be between 0 and 65535', $port)); + } + + return self::isNonStandardPort($this->scheme, $port) ? $port : null; + } + + private function filterPath($path): string + { + if (!\is_string($path)) { + throw new \InvalidArgumentException('Path must be a string'); + } + + return \preg_replace_callback('/(?:[^' . self::CHAR_UNRESERVED . self::CHAR_SUB_DELIMS . '%:@\/]++|%(?![A-Fa-f0-9]{2}))/', [__CLASS__, 'rawurlencodeMatchZero'], $path); + } + + private function filterQueryAndFragment($str): string + { + if (!\is_string($str)) { + throw new \InvalidArgumentException('Query and fragment must be a string'); + } + + return \preg_replace_callback('/(?:[^' . self::CHAR_UNRESERVED . self::CHAR_SUB_DELIMS . '%:@\/\?]++|%(?![A-Fa-f0-9]{2}))/', [__CLASS__, 'rawurlencodeMatchZero'], $str); + } + + private static function rawurlencodeMatchZero(array $match): string + { + return \rawurlencode($match[0]); + } +} diff --git a/vendor/psr/http-client/CHANGELOG.md b/vendor/psr/http-client/CHANGELOG.md new file mode 100644 index 0000000..babba7c --- /dev/null +++ b/vendor/psr/http-client/CHANGELOG.md @@ -0,0 +1,31 @@ +# Changelog + +All notable changes to this project will be documented in this file, in reverse chronological order by release. + +## 1.0.3 + +Add `source` link in composer.json. No code changes. + +## 1.0.2 + +Allow PSR-7 (psr/http-message) 2.0. No code changes. + +## 1.0.1 + +Allow installation with PHP 8. No code changes. + +## 1.0.0 + +First stable release. No changes since 0.3.0. + +## 0.3.0 + +Added Interface suffix on exceptions + +## 0.2.0 + +All exceptions are in `Psr\Http\Client` namespace + +## 0.1.0 + +First release diff --git a/vendor/psr/http-client/LICENSE b/vendor/psr/http-client/LICENSE new file mode 100644 index 0000000..cd5e002 --- /dev/null +++ b/vendor/psr/http-client/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2017 PHP Framework Interoperability Group + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/psr/http-client/README.md b/vendor/psr/http-client/README.md new file mode 100644 index 0000000..84af5c5 --- /dev/null +++ b/vendor/psr/http-client/README.md @@ -0,0 +1,12 @@ +HTTP Client +=========== + +This repository holds all the common code related to [PSR-18 (HTTP Client)][psr-url]. + +Note that this is not a HTTP Client implementation of its own. It is merely abstractions that describe the components of a HTTP Client. + +The installable [package][package-url] and [implementations][implementation-url] are listed on Packagist. + +[psr-url]: https://www.php-fig.org/psr/psr-18 +[package-url]: https://packagist.org/packages/psr/http-client +[implementation-url]: https://packagist.org/providers/psr/http-client-implementation diff --git a/vendor/psr/http-client/composer.json b/vendor/psr/http-client/composer.json new file mode 100644 index 0000000..6fed350 --- /dev/null +++ b/vendor/psr/http-client/composer.json @@ -0,0 +1,30 @@ +{ + "name": "psr/http-client", + "description": "Common interface for HTTP clients", + "keywords": ["psr", "psr-18", "http", "http-client"], + "homepage": "https://github.com/php-fig/http-client", + "license": "MIT", + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "support": { + "source": "https://github.com/php-fig/http-client" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + } +} diff --git a/vendor/psr/http-client/src/ClientExceptionInterface.php b/vendor/psr/http-client/src/ClientExceptionInterface.php new file mode 100644 index 0000000..aa0b9cf --- /dev/null +++ b/vendor/psr/http-client/src/ClientExceptionInterface.php @@ -0,0 +1,10 @@ +=7.1", + "psr/http-message": "^1.0 || ^2.0" + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + } +} diff --git a/vendor/psr/http-factory/src/RequestFactoryInterface.php b/vendor/psr/http-factory/src/RequestFactoryInterface.php new file mode 100644 index 0000000..cb39a08 --- /dev/null +++ b/vendor/psr/http-factory/src/RequestFactoryInterface.php @@ -0,0 +1,18 @@ + `RequestInterface`, `ServerRequestInterface`, `ResponseInterface` extend `MessageInterface` because the `Request` and the `Response` are `HTTP Messages`. +> When using `ServerRequestInterface`, both `RequestInterface` and `Psr\Http\Message\MessageInterface` methods are considered. + diff --git a/vendor/psr/http-message/docs/PSR7-Usage.md b/vendor/psr/http-message/docs/PSR7-Usage.md new file mode 100644 index 0000000..b6d048a --- /dev/null +++ b/vendor/psr/http-message/docs/PSR7-Usage.md @@ -0,0 +1,159 @@ +### PSR-7 Usage + +All PSR-7 applications comply with these interfaces +They were created to establish a standard between middleware implementations. + +> `RequestInterface`, `ServerRequestInterface`, `ResponseInterface` extend `MessageInterface` because the `Request` and the `Response` are `HTTP Messages`. +> When using `ServerRequestInterface`, both `RequestInterface` and `Psr\Http\Message\MessageInterface` methods are considered. + + +The following examples will illustrate how basic operations are done in PSR-7. + +##### Examples + + +For this examples to work (at least) a PSR-7 implementation package is required. (eg: zendframework/zend-diactoros, guzzlehttp/psr7, slim/slim, etc) +All PSR-7 implementations should have the same behaviour. + +The following will be assumed: +`$request` is an object of `Psr\Http\Message\RequestInterface` and + +`$response` is an object implementing `Psr\Http\Message\RequestInterface` + + +### Working with HTTP Headers + +#### Adding headers to response: + +```php +$response->withHeader('My-Custom-Header', 'My Custom Message'); +``` + +#### Appending values to headers + +```php +$response->withAddedHeader('My-Custom-Header', 'The second message'); +``` + +#### Checking if header exists: + +```php +$request->hasHeader('My-Custom-Header'); // will return false +$response->hasHeader('My-Custom-Header'); // will return true +``` + +> Note: My-Custom-Header was only added in the Response + +#### Getting comma-separated values from a header (also applies to request) + +```php +// getting value from request headers +$request->getHeaderLine('Content-Type'); // will return: "text/html; charset=UTF-8" +// getting value from response headers +$response->getHeaderLine('My-Custom-Header'); // will return: "My Custom Message; The second message" +``` + +#### Getting array of value from a header (also applies to request) +```php +// getting value from request headers +$request->getHeader('Content-Type'); // will return: ["text/html", "charset=UTF-8"] +// getting value from response headers +$response->getHeader('My-Custom-Header'); // will return: ["My Custom Message", "The second message"] +``` + +#### Removing headers from HTTP Messages +```php +// removing a header from Request, removing deprecated "Content-MD5" header +$request->withoutHeader('Content-MD5'); + +// removing a header from Response +// effect: the browser won't know the size of the stream +// the browser will download the stream till it ends +$response->withoutHeader('Content-Length'); +``` + +### Working with HTTP Message Body + +When working with the PSR-7 there are two methods of implementation: +#### 1. Getting the body separately + +> This method makes the body handling easier to understand and is useful when repeatedly calling body methods. (You only call `getBody()` once). Using this method mistakes like `$response->write()` are also prevented. + +```php +$body = $response->getBody(); +// operations on body, eg. read, write, seek +// ... +// replacing the old body +$response->withBody($body); +// this last statement is optional as we working with objects +// in this case the "new" body is same with the "old" one +// the $body variable has the same value as the one in $request, only the reference is passed +``` + +#### 2. Working directly on response + +> This method is useful when only performing few operations as the `$request->getBody()` statement fragment is required + +```php +$response->getBody()->write('hello'); +``` + +### Getting the body contents + +The following snippet gets the contents of a stream contents. +> Note: Streams must be rewinded, if content was written into streams, it will be ignored when calling `getContents()` because the stream pointer is set to the last character, which is `\0` - meaning end of stream. +```php +$body = $response->getBody(); +$body->rewind(); // or $body->seek(0); +$bodyText = $body->getContents(); +``` +> Note: If `$body->seek(1)` is called before `$body->getContents()`, the first character will be ommited as the starting pointer is set to `1`, not `0`. This is why using `$body->rewind()` is recommended. + +### Append to body + +```php +$response->getBody()->write('Hello'); // writing directly +$body = $request->getBody(); // which is a `StreamInterface` +$body->write('xxxxx'); +``` + +### Prepend to body +Prepending is different when it comes to streams. The content must be copied before writing the content to be prepended. +The following example will explain the behaviour of streams. + +```php +// assuming our response is initially empty +$body = $repsonse->getBody(); +// writing the string "abcd" +$body->write('abcd'); + +// seeking to start of stream +$body->seek(0); +// writing 'ef' +$body->write('ef'); // at this point the stream contains "efcd" +``` + +#### Prepending by rewriting separately + +```php +// assuming our response body stream only contains: "abcd" +$body = $response->getBody(); +$body->rewind(); +$contents = $body->getContents(); // abcd +// seeking the stream to beginning +$body->rewind(); +$body->write('ef'); // stream contains "efcd" +$body->write($contents); // stream contains "efabcd" +``` + +> Note: `getContents()` seeks the stream while reading it, therefore if the second `rewind()` method call was not present the stream would have resulted in `abcdefabcd` because the `write()` method appends to stream if not preceeded by `rewind()` or `seek(0)`. + +#### Prepending by using contents as a string +```php +$body = $response->getBody(); +$body->rewind(); +$contents = $body->getContents(); // efabcd +$contents = 'ef'.$contents; +$body->rewind(); +$body->write($contents); +``` diff --git a/vendor/psr/http-message/src/MessageInterface.php b/vendor/psr/http-message/src/MessageInterface.php new file mode 100644 index 0000000..a83c985 --- /dev/null +++ b/vendor/psr/http-message/src/MessageInterface.php @@ -0,0 +1,187 @@ +getHeaders() as $name => $values) { + * echo $name . ": " . implode(", ", $values); + * } + * + * // Emit headers iteratively: + * foreach ($message->getHeaders() as $name => $values) { + * foreach ($values as $value) { + * header(sprintf('%s: %s', $name, $value), false); + * } + * } + * + * While header names are not case-sensitive, getHeaders() will preserve the + * exact case in which headers were originally specified. + * + * @return string[][] Returns an associative array of the message's headers. Each + * key MUST be a header name, and each value MUST be an array of strings + * for that header. + */ + public function getHeaders(): array; + + /** + * Checks if a header exists by the given case-insensitive name. + * + * @param string $name Case-insensitive header field name. + * @return bool Returns true if any header names match the given header + * name using a case-insensitive string comparison. Returns false if + * no matching header name is found in the message. + */ + public function hasHeader(string $name): bool; + + /** + * Retrieves a message header value by the given case-insensitive name. + * + * This method returns an array of all the header values of the given + * case-insensitive header name. + * + * If the header does not appear in the message, this method MUST return an + * empty array. + * + * @param string $name Case-insensitive header field name. + * @return string[] An array of string values as provided for the given + * header. If the header does not appear in the message, this method MUST + * return an empty array. + */ + public function getHeader(string $name): array; + + /** + * Retrieves a comma-separated string of the values for a single header. + * + * This method returns all of the header values of the given + * case-insensitive header name as a string concatenated together using + * a comma. + * + * NOTE: Not all header values may be appropriately represented using + * comma concatenation. For such headers, use getHeader() instead + * and supply your own delimiter when concatenating. + * + * If the header does not appear in the message, this method MUST return + * an empty string. + * + * @param string $name Case-insensitive header field name. + * @return string A string of values as provided for the given header + * concatenated together using a comma. If the header does not appear in + * the message, this method MUST return an empty string. + */ + public function getHeaderLine(string $name): string; + + /** + * Return an instance with the provided value replacing the specified header. + * + * While header names are case-insensitive, the casing of the header will + * be preserved by this function, and returned from getHeaders(). + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return an instance that has the + * new and/or updated header and value. + * + * @param string $name Case-insensitive header field name. + * @param string|string[] $value Header value(s). + * @return static + * @throws \InvalidArgumentException for invalid header names or values. + */ + public function withHeader(string $name, $value): MessageInterface; + + /** + * Return an instance with the specified header appended with the given value. + * + * Existing values for the specified header will be maintained. The new + * value(s) will be appended to the existing list. If the header did not + * exist previously, it will be added. + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return an instance that has the + * new header and/or value. + * + * @param string $name Case-insensitive header field name to add. + * @param string|string[] $value Header value(s). + * @return static + * @throws \InvalidArgumentException for invalid header names or values. + */ + public function withAddedHeader(string $name, $value): MessageInterface; + + /** + * Return an instance without the specified header. + * + * Header resolution MUST be done without case-sensitivity. + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return an instance that removes + * the named header. + * + * @param string $name Case-insensitive header field name to remove. + * @return static + */ + public function withoutHeader(string $name): MessageInterface; + + /** + * Gets the body of the message. + * + * @return StreamInterface Returns the body as a stream. + */ + public function getBody(): StreamInterface; + + /** + * Return an instance with the specified message body. + * + * The body MUST be a StreamInterface object. + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return a new instance that has the + * new body stream. + * + * @param StreamInterface $body Body. + * @return static + * @throws \InvalidArgumentException When the body is not valid. + */ + public function withBody(StreamInterface $body): MessageInterface; +} diff --git a/vendor/psr/http-message/src/RequestInterface.php b/vendor/psr/http-message/src/RequestInterface.php new file mode 100644 index 0000000..33f85e5 --- /dev/null +++ b/vendor/psr/http-message/src/RequestInterface.php @@ -0,0 +1,130 @@ +getQuery()` + * or from the `QUERY_STRING` server param. + * + * @return array + */ + public function getQueryParams(): array; + + /** + * Return an instance with the specified query string arguments. + * + * These values SHOULD remain immutable over the course of the incoming + * request. They MAY be injected during instantiation, such as from PHP's + * $_GET superglobal, or MAY be derived from some other value such as the + * URI. In cases where the arguments are parsed from the URI, the data + * MUST be compatible with what PHP's parse_str() would return for + * purposes of how duplicate query parameters are handled, and how nested + * sets are handled. + * + * Setting query string arguments MUST NOT change the URI stored by the + * request, nor the values in the server params. + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return an instance that has the + * updated query string arguments. + * + * @param array $query Array of query string arguments, typically from + * $_GET. + * @return static + */ + public function withQueryParams(array $query): ServerRequestInterface; + + /** + * Retrieve normalized file upload data. + * + * This method returns upload metadata in a normalized tree, with each leaf + * an instance of Psr\Http\Message\UploadedFileInterface. + * + * These values MAY be prepared from $_FILES or the message body during + * instantiation, or MAY be injected via withUploadedFiles(). + * + * @return array An array tree of UploadedFileInterface instances; an empty + * array MUST be returned if no data is present. + */ + public function getUploadedFiles(): array; + + /** + * Create a new instance with the specified uploaded files. + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return an instance that has the + * updated body parameters. + * + * @param array $uploadedFiles An array tree of UploadedFileInterface instances. + * @return static + * @throws \InvalidArgumentException if an invalid structure is provided. + */ + public function withUploadedFiles(array $uploadedFiles): ServerRequestInterface; + + /** + * Retrieve any parameters provided in the request body. + * + * If the request Content-Type is either application/x-www-form-urlencoded + * or multipart/form-data, and the request method is POST, this method MUST + * return the contents of $_POST. + * + * Otherwise, this method may return any results of deserializing + * the request body content; as parsing returns structured content, the + * potential types MUST be arrays or objects only. A null value indicates + * the absence of body content. + * + * @return null|array|object The deserialized body parameters, if any. + * These will typically be an array or object. + */ + public function getParsedBody(); + + /** + * Return an instance with the specified body parameters. + * + * These MAY be injected during instantiation. + * + * If the request Content-Type is either application/x-www-form-urlencoded + * or multipart/form-data, and the request method is POST, use this method + * ONLY to inject the contents of $_POST. + * + * The data IS NOT REQUIRED to come from $_POST, but MUST be the results of + * deserializing the request body content. Deserialization/parsing returns + * structured data, and, as such, this method ONLY accepts arrays or objects, + * or a null value if nothing was available to parse. + * + * As an example, if content negotiation determines that the request data + * is a JSON payload, this method could be used to create a request + * instance with the deserialized parameters. + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return an instance that has the + * updated body parameters. + * + * @param null|array|object $data The deserialized body data. This will + * typically be in an array or object. + * @return static + * @throws \InvalidArgumentException if an unsupported argument type is + * provided. + */ + public function withParsedBody($data): ServerRequestInterface; + + /** + * Retrieve attributes derived from the request. + * + * The request "attributes" may be used to allow injection of any + * parameters derived from the request: e.g., the results of path + * match operations; the results of decrypting cookies; the results of + * deserializing non-form-encoded message bodies; etc. Attributes + * will be application and request specific, and CAN be mutable. + * + * @return array Attributes derived from the request. + */ + public function getAttributes(): array; + + /** + * Retrieve a single derived request attribute. + * + * Retrieves a single derived request attribute as described in + * getAttributes(). If the attribute has not been previously set, returns + * the default value as provided. + * + * This method obviates the need for a hasAttribute() method, as it allows + * specifying a default value to return if the attribute is not found. + * + * @see getAttributes() + * @param string $name The attribute name. + * @param mixed $default Default value to return if the attribute does not exist. + * @return mixed + */ + public function getAttribute(string $name, $default = null); + + /** + * Return an instance with the specified derived request attribute. + * + * This method allows setting a single derived request attribute as + * described in getAttributes(). + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return an instance that has the + * updated attribute. + * + * @see getAttributes() + * @param string $name The attribute name. + * @param mixed $value The value of the attribute. + * @return static + */ + public function withAttribute(string $name, $value): ServerRequestInterface; + + /** + * Return an instance that removes the specified derived request attribute. + * + * This method allows removing a single derived request attribute as + * described in getAttributes(). + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return an instance that removes + * the attribute. + * + * @see getAttributes() + * @param string $name The attribute name. + * @return static + */ + public function withoutAttribute(string $name): ServerRequestInterface; +} diff --git a/vendor/psr/http-message/src/StreamInterface.php b/vendor/psr/http-message/src/StreamInterface.php new file mode 100644 index 0000000..a62aabb --- /dev/null +++ b/vendor/psr/http-message/src/StreamInterface.php @@ -0,0 +1,158 @@ + + * [user-info@]host[:port] + *
+ * + * If the port component is not set or is the standard port for the current + * scheme, it SHOULD NOT be included. + * + * @see https://tools.ietf.org/html/rfc3986#section-3.2 + * @return string The URI authority, in "[user-info@]host[:port]" format. + */ + public function getAuthority(): string; + + /** + * Retrieve the user information component of the URI. + * + * If no user information is present, this method MUST return an empty + * string. + * + * If a user is present in the URI, this will return that value; + * additionally, if the password is also present, it will be appended to the + * user value, with a colon (":") separating the values. + * + * The trailing "@" character is not part of the user information and MUST + * NOT be added. + * + * @return string The URI user information, in "username[:password]" format. + */ + public function getUserInfo(): string; + + /** + * Retrieve the host component of the URI. + * + * If no host is present, this method MUST return an empty string. + * + * The value returned MUST be normalized to lowercase, per RFC 3986 + * Section 3.2.2. + * + * @see http://tools.ietf.org/html/rfc3986#section-3.2.2 + * @return string The URI host. + */ + public function getHost(): string; + + /** + * Retrieve the port component of the URI. + * + * If a port is present, and it is non-standard for the current scheme, + * this method MUST return it as an integer. If the port is the standard port + * used with the current scheme, this method SHOULD return null. + * + * If no port is present, and no scheme is present, this method MUST return + * a null value. + * + * If no port is present, but a scheme is present, this method MAY return + * the standard port for that scheme, but SHOULD return null. + * + * @return null|int The URI port. + */ + public function getPort(): ?int; + + /** + * Retrieve the path component of the URI. + * + * The path can either be empty or absolute (starting with a slash) or + * rootless (not starting with a slash). Implementations MUST support all + * three syntaxes. + * + * Normally, the empty path "" and absolute path "/" are considered equal as + * defined in RFC 7230 Section 2.7.3. But this method MUST NOT automatically + * do this normalization because in contexts with a trimmed base path, e.g. + * the front controller, this difference becomes significant. It's the task + * of the user to handle both "" and "/". + * + * The value returned MUST be percent-encoded, but MUST NOT double-encode + * any characters. To determine what characters to encode, please refer to + * RFC 3986, Sections 2 and 3.3. + * + * As an example, if the value should include a slash ("/") not intended as + * delimiter between path segments, that value MUST be passed in encoded + * form (e.g., "%2F") to the instance. + * + * @see https://tools.ietf.org/html/rfc3986#section-2 + * @see https://tools.ietf.org/html/rfc3986#section-3.3 + * @return string The URI path. + */ + public function getPath(): string; + + /** + * Retrieve the query string of the URI. + * + * If no query string is present, this method MUST return an empty string. + * + * The leading "?" character is not part of the query and MUST NOT be + * added. + * + * The value returned MUST be percent-encoded, but MUST NOT double-encode + * any characters. To determine what characters to encode, please refer to + * RFC 3986, Sections 2 and 3.4. + * + * As an example, if a value in a key/value pair of the query string should + * include an ampersand ("&") not intended as a delimiter between values, + * that value MUST be passed in encoded form (e.g., "%26") to the instance. + * + * @see https://tools.ietf.org/html/rfc3986#section-2 + * @see https://tools.ietf.org/html/rfc3986#section-3.4 + * @return string The URI query string. + */ + public function getQuery(): string; + + /** + * Retrieve the fragment component of the URI. + * + * If no fragment is present, this method MUST return an empty string. + * + * The leading "#" character is not part of the fragment and MUST NOT be + * added. + * + * The value returned MUST be percent-encoded, but MUST NOT double-encode + * any characters. To determine what characters to encode, please refer to + * RFC 3986, Sections 2 and 3.5. + * + * @see https://tools.ietf.org/html/rfc3986#section-2 + * @see https://tools.ietf.org/html/rfc3986#section-3.5 + * @return string The URI fragment. + */ + public function getFragment(): string; + + /** + * Return an instance with the specified scheme. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the specified scheme. + * + * Implementations MUST support the schemes "http" and "https" case + * insensitively, and MAY accommodate other schemes if required. + * + * An empty scheme is equivalent to removing the scheme. + * + * @param string $scheme The scheme to use with the new instance. + * @return static A new instance with the specified scheme. + * @throws \InvalidArgumentException for invalid or unsupported schemes. + */ + public function withScheme(string $scheme): UriInterface; + + /** + * Return an instance with the specified user information. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the specified user information. + * + * Password is optional, but the user information MUST include the + * user; an empty string for the user is equivalent to removing user + * information. + * + * @param string $user The user name to use for authority. + * @param null|string $password The password associated with $user. + * @return static A new instance with the specified user information. + */ + public function withUserInfo(string $user, ?string $password = null): UriInterface; + + /** + * Return an instance with the specified host. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the specified host. + * + * An empty host value is equivalent to removing the host. + * + * @param string $host The hostname to use with the new instance. + * @return static A new instance with the specified host. + * @throws \InvalidArgumentException for invalid hostnames. + */ + public function withHost(string $host): UriInterface; + + /** + * Return an instance with the specified port. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the specified port. + * + * Implementations MUST raise an exception for ports outside the + * established TCP and UDP port ranges. + * + * A null value provided for the port is equivalent to removing the port + * information. + * + * @param null|int $port The port to use with the new instance; a null value + * removes the port information. + * @return static A new instance with the specified port. + * @throws \InvalidArgumentException for invalid ports. + */ + public function withPort(?int $port): UriInterface; + + /** + * Return an instance with the specified path. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the specified path. + * + * The path can either be empty or absolute (starting with a slash) or + * rootless (not starting with a slash). Implementations MUST support all + * three syntaxes. + * + * If the path is intended to be domain-relative rather than path relative then + * it must begin with a slash ("/"). Paths not starting with a slash ("/") + * are assumed to be relative to some base path known to the application or + * consumer. + * + * Users can provide both encoded and decoded path characters. + * Implementations ensure the correct encoding as outlined in getPath(). + * + * @param string $path The path to use with the new instance. + * @return static A new instance with the specified path. + * @throws \InvalidArgumentException for invalid paths. + */ + public function withPath(string $path): UriInterface; + + /** + * Return an instance with the specified query string. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the specified query string. + * + * Users can provide both encoded and decoded query characters. + * Implementations ensure the correct encoding as outlined in getQuery(). + * + * An empty query string value is equivalent to removing the query string. + * + * @param string $query The query string to use with the new instance. + * @return static A new instance with the specified query string. + * @throws \InvalidArgumentException for invalid query strings. + */ + public function withQuery(string $query): UriInterface; + + /** + * Return an instance with the specified URI fragment. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the specified URI fragment. + * + * Users can provide both encoded and decoded fragment characters. + * Implementations ensure the correct encoding as outlined in getFragment(). + * + * An empty fragment value is equivalent to removing the fragment. + * + * @param string $fragment The fragment to use with the new instance. + * @return static A new instance with the specified fragment. + */ + public function withFragment(string $fragment): UriInterface; + + /** + * Return the string representation as a URI reference. + * + * Depending on which components of the URI are present, the resulting + * string is either a full URI or relative reference according to RFC 3986, + * Section 4.1. The method concatenates the various components of the URI, + * using the appropriate delimiters: + * + * - If a scheme is present, it MUST be suffixed by ":". + * - If an authority is present, it MUST be prefixed by "//". + * - The path can be concatenated without delimiters. But there are two + * cases where the path has to be adjusted to make the URI reference + * valid as PHP does not allow to throw an exception in __toString(): + * - If the path is rootless and an authority is present, the path MUST + * be prefixed by "/". + * - If the path is starting with more than one "/" and no authority is + * present, the starting slashes MUST be reduced to one. + * - If a query is present, it MUST be prefixed by "?". + * - If a fragment is present, it MUST be prefixed by "#". + * + * @see http://tools.ietf.org/html/rfc3986#section-4.1 + * @return string + */ + public function __toString(): string; +}