From 9707f3ddd125033449d375196ff105ad7825a5b8 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Sun, 7 Dec 2025 05:00:42 +0000 Subject: [PATCH] Auto commit: 2025-12-07T05:00:42.823Z --- add-availability.php | 48 + add-recurring-availability.php | 30 + admin/assign-content.php | 74 + admin/assign-package-content.php | 82 + admin/assign_survey.php | 80 + admin/broadcast.php | 51 + admin/client.php | 283 + admin/clients.php | 62 + admin/content.php | 90 + admin/contracts.php | 50 + admin/create_survey.php | 52 + admin/dashboard.php | 186 + admin/delete-contract.php | 17 + admin/discounts.php | 121 + admin/edit-content.php | 56 + admin/edit-contract.php | 69 + admin/edit-discount.php | 82 + admin/edit-package.php | 134 + admin/edit_question_options.php | 93 + admin/edit_survey.php | 110 + admin/manage-packages.php | 97 + admin/settings.php | 123 + admin/support.php | 46 + admin/survey_responses.php | 84 + admin/surveys.php | 58 + admin/upload-content.php | 69 + admin/view-ticket.php | 142 + admin/view_survey_response.php | 67 + api/availability.php | 107 + api/broadcast_sms.php | 70 + api/messages.php | 112 + api/send_sms.php | 71 + api/validate_coupon.php | 62 + api/validate_subscription_coupon.php | 60 + approve-booking.php | 48 + assets/css/custom.css | 85 + assets/js/main.js | 9 + book-session.php | 108 + cancel-booking.php | 72 + checkout.php | 99 + coaches.php | 183 + composer.json | 7 + composer.lock | 365 ++ content.php | 68 + create-checkout-session.php | 146 + create-portal-session.php | 31 + create-subscription-checkout-session.php | 117 + cron/send_reminders.php | 54 + dashboard.php | 497 ++ db/migrate.php | 43 + db/migrations/001_create_coaches_table.sql | 8 + db/migrations/002_create_clients_table.sql | 7 + db/migrations/003_create_bookings_table.sql | 10 + db/migrations/004_add_status_to_bookings.sql | 1 + .../005_create_coach_availability_table.sql | 7 + ...ate_coach_recurring_availability_table.sql | 8 + db/migrations/007_create_reviews_table.sql | 13 + db/migrations/008_add_stripe_to_bookings.sql | 3 + .../009_create_client_subscriptions_table.sql | 12 + .../010_create_service_packages_table.sql | 14 + .../011_create_client_packages_table.sql | 11 + .../012_add_portfolio_to_coaches.sql | 1 + ...013_create_coach_portfolio_items_table.sql | 9 + db/migrations/014_create_settings_table.sql | 8 + db/migrations/015_create_messages_table.sql | 10 + .../016_add_stripe_customer_id_to_clients.sql | 1 + .../017_create_support_tickets_table.sql | 10 + ...8_create_support_ticket_messages_table.sql | 10 + db/migrations/019_create_contracts_table.sql | 7 + .../020_create_client_contracts_table.sql | 9 + .../021_add_docuseal_to_client_contracts.sql | 3 + ...useal_document_url_to_client_contracts.sql | 1 + db/migrations/023_add_role_to_contracts.sql | 1 + .../024_create_client_notes_table.sql | 9 + db/migrations/025_create_surveys_table.sql | 11 + .../026_create_survey_questions_table.sql | 11 + ...7_create_survey_question_options_table.sql | 9 + .../028_create_client_surveys_table.sql | 14 + .../029_create_survey_responses_table.sql | 13 + db/migrations/030_create_content_table.sql | 44 + .../031_create_client_content_table.sql | 43 + .../032_create_package_content_table.sql | 43 + .../033_alter_service_packages_table.sql | 7 + ...034_create_package_service_items_table.sql | 10 + ...add_package_id_to_client_subscriptions.sql | 2 + .../036_add_buffer_time_to_coaches.sql | 1 + db/migrations/037_add_timezone_to_coaches.sql | 1 + db/migrations/038_add_timezone_to_clients.sql | 1 + db/migrations/039_add_email_to_coaches.sql | 1 + db/migrations/040_add_password_to_coaches.sql | 1 + db/migrations/041_create_discounts_table.sql | 14 + db/migrations/042_create_gift_codes_table.sql | 14 + ...ter_service_packages_for_payment_plans.sql | 7 + db/migrations/044_create_sms_logs_table.sql | 13 + decline-booking.php | 69 + delete-availability.php | 39 + delete-recurring-availability.php | 24 + docuseal-webhook.php | 30 + docuseal/config.php | 7 + edit-portfolio.php | 177 + includes/footer.php | 12 + includes/header.php | 100 + index.php | 369 +- login.php | 112 + logout.php | 6 + manage-packages.php | 269 + manage-subscription.php | 75 + messages.php | 205 + payment-cancel.php | 26 + payment-success.php | 50 + profile.php | 405 ++ purchase-gift-success.php | 49 + purchase-gift.php | 83 + purchase-package-cancel.php | 23 + purchase-package-success.php | 103 + purchase-package.php | 110 + redeem-gift.php | 77 + refund.php | 25 + register-client.php | 126 + register-coach.php | 113 + review-booking.php | 113 + sign-contract.php | 74 + signed-contracts.php | 49 + stripe/config.php | 26 + stripe/init.php | 5 + stripe/webhook.php | 242 + subscribe-checkout.php | 92 + subscription-cancel.php | 52 + subscription-plans.php | 54 + subscription-success.php | 45 + support.php | 100 + surveys.php | 56 + telnyx/config.php | 5 + update-client-settings.php | 23 + update-coach-settings.php | 24 + vendor/autoload.php | 22 + vendor/composer/ClassLoader.php | 579 ++ vendor/composer/InstalledVersions.php | 396 ++ vendor/composer/LICENSE | 21 + vendor/composer/autoload_classmap.php | 48 + vendor/composer/autoload_namespaces.php | 9 + vendor/composer/autoload_psr4.php | 10 + vendor/composer/autoload_real.php | 38 + vendor/composer/autoload_static.php | 74 + vendor/composer/installed.json | 100 + vendor/composer/installed.php | 41 + vendor/composer/platform_check.php | 25 + vendor/docusealco/docuseal-php/.gitignore | 3 + vendor/docusealco/docuseal-php/README.md | 483 ++ vendor/docusealco/docuseal-php/composer.json | 17 + vendor/docusealco/docuseal-php/init.php | 6 + vendor/docusealco/docuseal-php/src/Api.php | 138 + .../docusealco/docuseal-php/src/Docuseal.php | 8 + vendor/docusealco/docuseal-php/src/Http.php | 79 + vendor/stripe/stripe-php/.gitignore | 11 + vendor/stripe/stripe-php/.travis.yml | 17 + vendor/stripe/stripe-php/CHANGELOG | 189 + vendor/stripe/stripe-php/LICENSE | 21 + vendor/stripe/stripe-php/README.rdoc | 67 + vendor/stripe/stripe-php/VERSION | 1 + vendor/stripe/stripe-php/composer.json | 29 + vendor/stripe/stripe-php/lib/Stripe.php | 62 + .../stripe/stripe-php/lib/Stripe/Account.php | 15 + .../lib/Stripe/ApiConnectionError.php | 5 + .../stripe/stripe-php/lib/Stripe/ApiError.php | 5 + .../stripe-php/lib/Stripe/ApiRequestor.php | 462 ++ .../stripe-php/lib/Stripe/ApiResource.php | 174 + .../stripe-php/lib/Stripe/ApplicationFee.php | 53 + .../lib/Stripe/ApplicationFeeRefund.php | 36 + .../stripe-php/lib/Stripe/AttachedObject.php | 23 + .../lib/Stripe/AuthenticationError.php | 5 + .../stripe/stripe-php/lib/Stripe/Balance.php | 15 + .../lib/Stripe/BalanceTransaction.php | 39 + .../stripe-php/lib/Stripe/BitcoinReceiver.php | 61 + .../lib/Stripe/BitcoinTransaction.php | 7 + vendor/stripe/stripe-php/lib/Stripe/Card.php | 66 + .../stripe-php/lib/Stripe/CardError.php | 13 + .../stripe/stripe-php/lib/Stripe/Charge.php | 137 + .../stripe/stripe-php/lib/Stripe/Coupon.php | 60 + .../stripe/stripe-php/lib/Stripe/Customer.php | 157 + vendor/stripe/stripe-php/lib/Stripe/Error.php | 29 + vendor/stripe/stripe-php/lib/Stripe/Event.php | 28 + .../stripe-php/lib/Stripe/FileUpload.php | 50 + .../lib/Stripe/InvalidRequestError.php | 12 + .../stripe/stripe-php/lib/Stripe/Invoice.php | 75 + .../stripe-php/lib/Stripe/InvoiceItem.php | 58 + vendor/stripe/stripe-php/lib/Stripe/List.php | 54 + .../stripe/stripe-php/lib/Stripe/Object.php | 265 + vendor/stripe/stripe-php/lib/Stripe/Plan.php | 60 + .../stripe-php/lib/Stripe/RateLimitError.php | 11 + .../stripe-php/lib/Stripe/Recipient.php | 75 + .../stripe/stripe-php/lib/Stripe/Refund.php | 36 + .../stripe-php/lib/Stripe/RequestOptions.php | 43 + .../lib/Stripe/SingletonApiResource.php | 31 + .../stripe/stripe-php/lib/Stripe/Stripe.php | 77 + .../stripe-php/lib/Stripe/Subscription.php | 57 + vendor/stripe/stripe-php/lib/Stripe/Token.php | 28 + .../stripe/stripe-php/lib/Stripe/Transfer.php | 62 + vendor/stripe/stripe-php/lib/Stripe/Util.php | 94 + .../stripe/stripe-php/lib/Stripe/Util/Set.php | 39 + .../stripe-php/lib/data/ca-certificates.crt | 5165 +++++++++++++++++ vendor/stripe/stripe-php/test/Stripe.php | 57 + .../stripe-php/test/Stripe/AccountTest.php | 16 + .../test/Stripe/ApiRequestorTest.php | 124 + .../test/Stripe/ApplicationFeeRefundTest.php | 16 + .../test/Stripe/ApplicationFeeTest.php | 19 + .../test/Stripe/AuthenticationErrorTest.php | 14 + .../stripe-php/test/Stripe/BalanceTest.php | 13 + .../test/Stripe/BalanceTransactionTest.php | 11 + .../test/Stripe/BitcoinReceiverTest.php | 56 + .../stripe-php/test/Stripe/CardErrorTest.php | 29 + .../stripe-php/test/Stripe/ChargeTest.php | 200 + .../stripe-php/test/Stripe/CouponTest.php | 27 + .../stripe-php/test/Stripe/CustomerTest.php | 211 + .../stripe-php/test/Stripe/DiscountTest.php | 29 + .../stripe/stripe-php/test/Stripe/Error.php | 22 + .../stripe-php/test/Stripe/FileUploadTest.php | 38 + .../test/Stripe/InvalidRequestErrorTest.php | 24 + .../stripe-php/test/Stripe/InvoiceTest.php | 65 + .../stripe-php/test/Stripe/ObjectTest.php | 41 + .../stripe-php/test/Stripe/PlanTest.php | 53 + .../stripe-php/test/Stripe/RecipientTest.php | 116 + .../stripe-php/test/Stripe/RefundTest.php | 61 + .../test/Stripe/RequestOptionsTest.php | 70 + .../test/Stripe/SubscriptionTest.php | 60 + .../stripe-php/test/Stripe/TestCase.php | 165 + .../stripe/stripe-php/test/Stripe/Token.php | 11 + .../stripe-php/test/Stripe/TransferTest.php | 116 + .../stripe-php/test/Stripe/UtilTest.php | 28 + vendor/stripe/stripe-php/test/data/test.png | Bin 0 -> 95 bytes view-signed-contract.php | 53 + view-ticket.php | 123 + view_survey.php | 128 + 233 files changed, 20974 insertions(+), 145 deletions(-) create mode 100644 add-availability.php create mode 100644 add-recurring-availability.php create mode 100644 admin/assign-content.php create mode 100644 admin/assign-package-content.php create mode 100644 admin/assign_survey.php create mode 100644 admin/broadcast.php create mode 100644 admin/client.php create mode 100644 admin/clients.php create mode 100644 admin/content.php create mode 100644 admin/contracts.php create mode 100644 admin/create_survey.php create mode 100644 admin/dashboard.php create mode 100644 admin/delete-contract.php create mode 100644 admin/discounts.php create mode 100644 admin/edit-content.php create mode 100644 admin/edit-contract.php create mode 100644 admin/edit-discount.php create mode 100644 admin/edit-package.php create mode 100644 admin/edit_question_options.php create mode 100644 admin/edit_survey.php create mode 100644 admin/manage-packages.php create mode 100644 admin/settings.php create mode 100644 admin/support.php create mode 100644 admin/survey_responses.php create mode 100644 admin/surveys.php create mode 100644 admin/upload-content.php create mode 100644 admin/view-ticket.php create mode 100644 admin/view_survey_response.php create mode 100644 api/availability.php create mode 100644 api/broadcast_sms.php create mode 100644 api/messages.php create mode 100644 api/send_sms.php create mode 100644 api/validate_coupon.php create mode 100644 api/validate_subscription_coupon.php create mode 100644 approve-booking.php create mode 100644 assets/css/custom.css create mode 100644 assets/js/main.js create mode 100644 book-session.php create mode 100644 cancel-booking.php create mode 100644 checkout.php create mode 100644 coaches.php create mode 100644 composer.json create mode 100644 composer.lock create mode 100644 content.php create mode 100644 create-checkout-session.php create mode 100644 create-portal-session.php create mode 100644 create-subscription-checkout-session.php create mode 100644 cron/send_reminders.php create mode 100644 dashboard.php create mode 100644 db/migrate.php create mode 100644 db/migrations/001_create_coaches_table.sql create mode 100644 db/migrations/002_create_clients_table.sql create mode 100644 db/migrations/003_create_bookings_table.sql create mode 100644 db/migrations/004_add_status_to_bookings.sql create mode 100644 db/migrations/005_create_coach_availability_table.sql create mode 100644 db/migrations/006_create_coach_recurring_availability_table.sql create mode 100644 db/migrations/007_create_reviews_table.sql create mode 100644 db/migrations/008_add_stripe_to_bookings.sql create mode 100644 db/migrations/009_create_client_subscriptions_table.sql create mode 100644 db/migrations/010_create_service_packages_table.sql create mode 100644 db/migrations/011_create_client_packages_table.sql create mode 100644 db/migrations/012_add_portfolio_to_coaches.sql create mode 100644 db/migrations/013_create_coach_portfolio_items_table.sql create mode 100644 db/migrations/014_create_settings_table.sql create mode 100644 db/migrations/015_create_messages_table.sql create mode 100644 db/migrations/016_add_stripe_customer_id_to_clients.sql create mode 100644 db/migrations/017_create_support_tickets_table.sql create mode 100644 db/migrations/018_create_support_ticket_messages_table.sql create mode 100644 db/migrations/019_create_contracts_table.sql create mode 100644 db/migrations/020_create_client_contracts_table.sql create mode 100644 db/migrations/021_add_docuseal_to_client_contracts.sql create mode 100644 db/migrations/022_add_docuseal_document_url_to_client_contracts.sql create mode 100644 db/migrations/023_add_role_to_contracts.sql create mode 100644 db/migrations/024_create_client_notes_table.sql create mode 100644 db/migrations/025_create_surveys_table.sql create mode 100644 db/migrations/026_create_survey_questions_table.sql create mode 100644 db/migrations/027_create_survey_question_options_table.sql create mode 100644 db/migrations/028_create_client_surveys_table.sql create mode 100644 db/migrations/029_create_survey_responses_table.sql create mode 100644 db/migrations/030_create_content_table.sql create mode 100644 db/migrations/031_create_client_content_table.sql create mode 100644 db/migrations/032_create_package_content_table.sql create mode 100644 db/migrations/033_alter_service_packages_table.sql create mode 100644 db/migrations/034_create_package_service_items_table.sql create mode 100644 db/migrations/035_add_package_id_to_client_subscriptions.sql create mode 100644 db/migrations/036_add_buffer_time_to_coaches.sql create mode 100644 db/migrations/037_add_timezone_to_coaches.sql create mode 100644 db/migrations/038_add_timezone_to_clients.sql create mode 100644 db/migrations/039_add_email_to_coaches.sql create mode 100644 db/migrations/040_add_password_to_coaches.sql create mode 100644 db/migrations/041_create_discounts_table.sql create mode 100644 db/migrations/042_create_gift_codes_table.sql create mode 100644 db/migrations/043_alter_service_packages_for_payment_plans.sql create mode 100644 db/migrations/044_create_sms_logs_table.sql create mode 100644 decline-booking.php create mode 100644 delete-availability.php create mode 100644 delete-recurring-availability.php create mode 100644 docuseal-webhook.php create mode 100644 docuseal/config.php create mode 100644 edit-portfolio.php create mode 100644 includes/footer.php create mode 100644 includes/header.php create mode 100644 login.php create mode 100644 logout.php create mode 100644 manage-packages.php create mode 100644 manage-subscription.php create mode 100644 messages.php create mode 100644 payment-cancel.php create mode 100644 payment-success.php create mode 100644 profile.php create mode 100644 purchase-gift-success.php create mode 100644 purchase-gift.php create mode 100644 purchase-package-cancel.php create mode 100644 purchase-package-success.php create mode 100644 purchase-package.php create mode 100644 redeem-gift.php create mode 100644 refund.php create mode 100644 register-client.php create mode 100644 register-coach.php create mode 100644 review-booking.php create mode 100644 sign-contract.php create mode 100644 signed-contracts.php create mode 100644 stripe/config.php create mode 100644 stripe/init.php create mode 100644 stripe/webhook.php create mode 100644 subscribe-checkout.php create mode 100644 subscription-cancel.php create mode 100644 subscription-plans.php create mode 100644 subscription-success.php create mode 100644 support.php create mode 100644 surveys.php create mode 100644 telnyx/config.php create mode 100644 update-client-settings.php create mode 100644 update-coach-settings.php create mode 100644 vendor/autoload.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/installed.json create mode 100644 vendor/composer/installed.php create mode 100644 vendor/composer/platform_check.php create mode 100644 vendor/docusealco/docuseal-php/.gitignore create mode 100644 vendor/docusealco/docuseal-php/README.md create mode 100644 vendor/docusealco/docuseal-php/composer.json create mode 100644 vendor/docusealco/docuseal-php/init.php create mode 100644 vendor/docusealco/docuseal-php/src/Api.php create mode 100644 vendor/docusealco/docuseal-php/src/Docuseal.php create mode 100644 vendor/docusealco/docuseal-php/src/Http.php create mode 100644 vendor/stripe/stripe-php/.gitignore create mode 100644 vendor/stripe/stripe-php/.travis.yml create mode 100644 vendor/stripe/stripe-php/CHANGELOG create mode 100644 vendor/stripe/stripe-php/LICENSE create mode 100644 vendor/stripe/stripe-php/README.rdoc create mode 100644 vendor/stripe/stripe-php/VERSION create mode 100644 vendor/stripe/stripe-php/composer.json create mode 100644 vendor/stripe/stripe-php/lib/Stripe.php create mode 100644 vendor/stripe/stripe-php/lib/Stripe/Account.php create mode 100644 vendor/stripe/stripe-php/lib/Stripe/ApiConnectionError.php create mode 100644 vendor/stripe/stripe-php/lib/Stripe/ApiError.php create mode 100644 vendor/stripe/stripe-php/lib/Stripe/ApiRequestor.php create mode 100644 vendor/stripe/stripe-php/lib/Stripe/ApiResource.php create mode 100644 vendor/stripe/stripe-php/lib/Stripe/ApplicationFee.php create mode 100644 vendor/stripe/stripe-php/lib/Stripe/ApplicationFeeRefund.php create mode 100644 vendor/stripe/stripe-php/lib/Stripe/AttachedObject.php create mode 100644 vendor/stripe/stripe-php/lib/Stripe/AuthenticationError.php create mode 100644 vendor/stripe/stripe-php/lib/Stripe/Balance.php create mode 100644 vendor/stripe/stripe-php/lib/Stripe/BalanceTransaction.php create mode 100644 vendor/stripe/stripe-php/lib/Stripe/BitcoinReceiver.php create mode 100644 vendor/stripe/stripe-php/lib/Stripe/BitcoinTransaction.php create mode 100644 vendor/stripe/stripe-php/lib/Stripe/Card.php create mode 100644 vendor/stripe/stripe-php/lib/Stripe/CardError.php create mode 100644 vendor/stripe/stripe-php/lib/Stripe/Charge.php create mode 100644 vendor/stripe/stripe-php/lib/Stripe/Coupon.php create mode 100644 vendor/stripe/stripe-php/lib/Stripe/Customer.php create mode 100644 vendor/stripe/stripe-php/lib/Stripe/Error.php create mode 100644 vendor/stripe/stripe-php/lib/Stripe/Event.php create mode 100644 vendor/stripe/stripe-php/lib/Stripe/FileUpload.php create mode 100644 vendor/stripe/stripe-php/lib/Stripe/InvalidRequestError.php create mode 100644 vendor/stripe/stripe-php/lib/Stripe/Invoice.php create mode 100644 vendor/stripe/stripe-php/lib/Stripe/InvoiceItem.php create mode 100644 vendor/stripe/stripe-php/lib/Stripe/List.php create mode 100644 vendor/stripe/stripe-php/lib/Stripe/Object.php create mode 100644 vendor/stripe/stripe-php/lib/Stripe/Plan.php create mode 100644 vendor/stripe/stripe-php/lib/Stripe/RateLimitError.php create mode 100644 vendor/stripe/stripe-php/lib/Stripe/Recipient.php create mode 100644 vendor/stripe/stripe-php/lib/Stripe/Refund.php create mode 100644 vendor/stripe/stripe-php/lib/Stripe/RequestOptions.php create mode 100644 vendor/stripe/stripe-php/lib/Stripe/SingletonApiResource.php create mode 100644 vendor/stripe/stripe-php/lib/Stripe/Stripe.php create mode 100644 vendor/stripe/stripe-php/lib/Stripe/Subscription.php create mode 100644 vendor/stripe/stripe-php/lib/Stripe/Token.php create mode 100644 vendor/stripe/stripe-php/lib/Stripe/Transfer.php create mode 100644 vendor/stripe/stripe-php/lib/Stripe/Util.php create mode 100644 vendor/stripe/stripe-php/lib/Stripe/Util/Set.php create mode 100644 vendor/stripe/stripe-php/lib/data/ca-certificates.crt create mode 100644 vendor/stripe/stripe-php/test/Stripe.php create mode 100644 vendor/stripe/stripe-php/test/Stripe/AccountTest.php create mode 100644 vendor/stripe/stripe-php/test/Stripe/ApiRequestorTest.php create mode 100644 vendor/stripe/stripe-php/test/Stripe/ApplicationFeeRefundTest.php create mode 100644 vendor/stripe/stripe-php/test/Stripe/ApplicationFeeTest.php create mode 100644 vendor/stripe/stripe-php/test/Stripe/AuthenticationErrorTest.php create mode 100644 vendor/stripe/stripe-php/test/Stripe/BalanceTest.php create mode 100644 vendor/stripe/stripe-php/test/Stripe/BalanceTransactionTest.php create mode 100644 vendor/stripe/stripe-php/test/Stripe/BitcoinReceiverTest.php create mode 100644 vendor/stripe/stripe-php/test/Stripe/CardErrorTest.php create mode 100644 vendor/stripe/stripe-php/test/Stripe/ChargeTest.php create mode 100644 vendor/stripe/stripe-php/test/Stripe/CouponTest.php create mode 100644 vendor/stripe/stripe-php/test/Stripe/CustomerTest.php create mode 100644 vendor/stripe/stripe-php/test/Stripe/DiscountTest.php create mode 100644 vendor/stripe/stripe-php/test/Stripe/Error.php create mode 100644 vendor/stripe/stripe-php/test/Stripe/FileUploadTest.php create mode 100644 vendor/stripe/stripe-php/test/Stripe/InvalidRequestErrorTest.php create mode 100644 vendor/stripe/stripe-php/test/Stripe/InvoiceTest.php create mode 100644 vendor/stripe/stripe-php/test/Stripe/ObjectTest.php create mode 100644 vendor/stripe/stripe-php/test/Stripe/PlanTest.php create mode 100644 vendor/stripe/stripe-php/test/Stripe/RecipientTest.php create mode 100644 vendor/stripe/stripe-php/test/Stripe/RefundTest.php create mode 100644 vendor/stripe/stripe-php/test/Stripe/RequestOptionsTest.php create mode 100644 vendor/stripe/stripe-php/test/Stripe/SubscriptionTest.php create mode 100644 vendor/stripe/stripe-php/test/Stripe/TestCase.php create mode 100644 vendor/stripe/stripe-php/test/Stripe/Token.php create mode 100644 vendor/stripe/stripe-php/test/Stripe/TransferTest.php create mode 100644 vendor/stripe/stripe-php/test/Stripe/UtilTest.php create mode 100644 vendor/stripe/stripe-php/test/data/test.png create mode 100644 view-signed-contract.php create mode 100644 view-ticket.php create mode 100644 view_survey.php diff --git a/add-availability.php b/add-availability.php new file mode 100644 index 0000000..c88505d --- /dev/null +++ b/add-availability.php @@ -0,0 +1,48 @@ += strtotime($end_datetime)) { + header('Location: dashboard.php?status=error&message=End+time+must+be+after+start+time'); + exit; + } + + try { + $stmt = db()->prepare("INSERT INTO coach_availability (coach_id, start_time, end_time) VALUES (?, ?, ?)"); + $stmt->execute([$coach_id, $start_datetime, $end_datetime]); + + header('Location: dashboard.php?status=success&message=Availability+added+successfully'); + exit; + } catch (PDOException $e) { + // Log error and redirect + error_log('Error adding availability: ' . $e->getMessage()); + header('Location: dashboard.php?status=error&message=Could+not+add+availability'); + exit; + } +} + +// Redirect if accessed directly without POST +header('Location: dashboard.php'); +exit; diff --git a/add-recurring-availability.php b/add-recurring-availability.php new file mode 100644 index 0000000..9369af6 --- /dev/null +++ b/add-recurring-availability.php @@ -0,0 +1,30 @@ +prepare("INSERT INTO coach_recurring_availability (coach_id, day_of_week, start_time, end_time) VALUES (?, ?, ?, ?)"); + $stmt->execute([$coach_id, $day_of_week, $start_time, $end_time]); + header('Location: dashboard.php?status=recurring_added'); + } catch (PDOException $e) { + header('Location: dashboard.php?status=error'); + } + } else { + header('Location: dashboard.php?status=error'); + } +} else { + header('Location: dashboard.php'); +} +exit; diff --git a/admin/assign-content.php b/admin/assign-content.php new file mode 100644 index 0000000..3e5842f --- /dev/null +++ b/admin/assign-content.php @@ -0,0 +1,74 @@ +prepare("SELECT title FROM content WHERE id = ? AND coach_id = ?"); +$stmt->execute([$content_id, $coach_id]); +$content = $stmt->fetch(); + +if (!$content) { + header('Location: content.php'); + exit; +} + +if ($_SERVER['REQUEST_METHOD'] === 'POST') { + $client_ids = $_POST['client_ids']; + if (!empty($client_ids)) { + $assigned_count = 0; + foreach ($client_ids as $client_id) { + // Check if already assigned + $check_stmt = db()->prepare("SELECT id FROM client_content WHERE client_id = ? AND content_id = ?"); + $check_stmt->execute([$client_id, $content_id]); + if ($check_stmt->rowCount() == 0) { + $assign_stmt = db()->prepare("INSERT INTO client_content (client_id, content_id) VALUES (?, ?)"); + if ($assign_stmt->execute([$client_id, $content_id])) { + $assigned_count++; + } + } + } + $message = "Content assigned to " . $assigned_count . " client(s) successfully!"; + } else { + $error = "Please select at least one client."; + } +} + + +// Fetch all clients of the coach +$clients_stmt = db()->query('SELECT id, name FROM clients ORDER BY name'); +$clients = $clients_stmt->fetchAll(); + +?> + +
+

Assign Content:

+ + +
+ + +
+ + +
+
+ + +
+ + Back to Content +
+
+ + diff --git a/admin/assign-package-content.php b/admin/assign-package-content.php new file mode 100644 index 0000000..a3546a6 --- /dev/null +++ b/admin/assign-package-content.php @@ -0,0 +1,82 @@ +prepare("SELECT title FROM content WHERE id = ? AND coach_id = ?"); +$stmt->execute([$content_id, $coach_id]); +$content = $stmt->fetch(); + +if (!$content) { + header('Location: content.php'); + exit; +} + +if ($_SERVER['REQUEST_METHOD'] === 'POST') { + $package_id = $_POST['package_id']; + $delay_days = $_POST['delay_days']; + + if (!empty($package_id)) { + // Check if already assigned + $check_stmt = db()->prepare("SELECT id FROM package_content WHERE package_id = ? AND content_id = ?"); + $check_stmt->execute([$package_id, $content_id]); + if ($check_stmt->rowCount() == 0) { + $assign_stmt = db()->prepare("INSERT INTO package_content (package_id, content_id, delay_days) VALUES (?, ?, ?)"); + if ($assign_stmt->execute([$package_id, $content_id, $delay_days])) { + $message = "Content assigned to the package successfully!"; + } else { + $error = "Error: Could not assign content to the package."; + } + } else { + $error = "This content is already assigned to the selected package."; + } + } else { + $error = "Please select a package."; + } +} + +// Fetch all packages of the coach +$packages_stmt = db()->prepare('SELECT id, name FROM service_packages WHERE coach_id = ? ORDER BY name'); +$packages_stmt->execute([$coach_id]); +$packages = $packages_stmt->fetchAll(); + +?> + +
+

Assign Content to Package:

+ + +
+ + +
+ + +
+
+ + +
+
+ + +
Enter 0 for immediate access, or a number of days to delay access after purchase.
+
+ + Back to Content +
+
+ + diff --git a/admin/assign_survey.php b/admin/assign_survey.php new file mode 100644 index 0000000..5ec377a --- /dev/null +++ b/admin/assign_survey.php @@ -0,0 +1,80 @@ +prepare('SELECT * FROM surveys WHERE id = ? AND coach_id = ?'); +$stmt->execute([$survey_id, $coach_id]); +$survey = $stmt->fetch(); + +if (!$survey) { + header('Location: surveys.php'); + exit; +} + +// Fetch clients +$clients_stmt = db()->query('SELECT id, name FROM clients'); +$clients = $clients_stmt->fetchAll(); + +if ($_SERVER['REQUEST_METHOD'] === 'POST') { + if (isset($_POST['assign_survey'])) { + $client_ids = $_POST['client_ids'] ?? []; + if (!empty($client_ids)) { + $stmt = db()->prepare('INSERT INTO client_surveys (survey_id, client_id) VALUES (?, ?)'); + foreach ($client_ids as $client_id) { + // Check if already assigned + $check_stmt = db()->prepare('SELECT id FROM client_surveys WHERE survey_id = ? AND client_id = ?'); + $check_stmt->execute([$survey_id, $client_id]); + if ($check_stmt->rowCount() === 0) { + $stmt->execute([$survey_id, $client_id]); + } + } + header('Location: surveys.php'); + exit; + } + } +} + +// Get already assigned clients +$assigned_stmt = db()->prepare('SELECT client_id FROM client_surveys WHERE survey_id = ?'); +$assigned_stmt->execute([$survey_id]); +$assigned_clients = $assigned_stmt->fetchAll(PDO::FETCH_COLUMN); + +?> + +
+

Assign Survey:

+ +
+
+ + +
+ > + +
+ +
+ + Back to Surveys +
+
+ + diff --git a/admin/broadcast.php b/admin/broadcast.php new file mode 100644 index 0000000..68584b1 --- /dev/null +++ b/admin/broadcast.php @@ -0,0 +1,51 @@ + + +
+

Broadcast Message

+

Send a message to all clients.

+
+ +
+
+ + +
+ +
+
+ + + + diff --git a/admin/client.php b/admin/client.php new file mode 100644 index 0000000..15c4ede --- /dev/null +++ b/admin/client.php @@ -0,0 +1,283 @@ +
No client ID specified.
"; + require_once '../includes/footer.php'; + exit; +} + +$client_id = $_GET['id']; + +// Handle adding a new note +if (isset($_POST['add_note'])) { + $note = $_POST['note']; + $coach_id = $_SESSION['user_id']; // Assuming the logged-in user is a coach + + $sql = "INSERT INTO client_notes (client_id, coach_id, note) VALUES (?, ?, ?)"; + $stmt = db()->prepare($sql); + $stmt->execute([$client_id, $coach_id, $note]); +} + +// Fetch client data from the database +$sql = "SELECT * FROM clients WHERE id = ?"; +$stmt = db()->prepare($sql); +$stmt->execute([$client_id]); +$client = $stmt->fetch(PDO::FETCH_ASSOC); + +// Fetch notes for the client +$notes_sql = "SELECT cn.*, c.name as coach_name FROM client_notes cn JOIN coaches c ON cn.coach_id = c.id WHERE cn.client_id = ? ORDER BY cn.created_at DESC"; +$notes_stmt = db()->prepare($notes_sql); +$notes_stmt->execute([$client_id]); +$notes = $notes_stmt->fetchAll(PDO::FETCH_ASSOC); + +// Fetch purchase history for the client +$purchases_sql = "SELECT sp.name, sp.price, cp.purchased_at FROM client_packages cp JOIN service_packages sp ON cp.package_id = sp.id WHERE cp.client_id = ? ORDER BY cp.purchased_at DESC"; +$purchases_stmt = db()->prepare($purchases_sql); +$purchases_stmt->execute([$client_id]); +$purchases = $purchases_stmt->fetchAll(PDO::FETCH_ASSOC); + +// Fetch signed contracts for the client +$contracts_sql = "SELECT c.title, cc.signed_at, cc.docuseal_document_url FROM client_contracts cc JOIN contracts c ON cc.contract_id = c.id WHERE cc.client_id = ? AND cc.status = 'signed' ORDER BY cc.signed_at DESC"; +$contracts_stmt = db()->prepare($contracts_sql); +$contracts_stmt->execute([$client_id]); +$contracts = $contracts_stmt->fetchAll(PDO::FETCH_ASSOC); + +// Fetch appointment history for the client +$appointments_sql = "SELECT b.start_time, b.end_time, b.status, c.name as coach_name FROM bookings b JOIN coaches c ON b.coach_id = c.id WHERE b.client_id = ? ORDER BY b.start_time DESC"; +$appointments_stmt = db()->prepare($appointments_sql); +$appointments_stmt->execute([$client_id]); +$appointments = $appointments_stmt->fetchAll(PDO::FETCH_ASSOC); + +// Fetch SMS logs for the client +$sms_logs_sql = "SELECT * FROM sms_logs WHERE client_id = ? ORDER BY created_at DESC"; +$sms_logs_stmt = db()->prepare($sms_logs_sql); +$sms_logs_stmt->execute([$client_id]); +$sms_logs = $sms_logs_stmt->fetchAll(PDO::FETCH_ASSOC); + +// If client not found +if (!$client) { + echo "
Client not found.
"; + require_once '../includes/footer.php'; + exit; +} +?> + +
+

Client Details

+
+
+
+

Client Information

+

Name:

+

Email:

+

Joined:

+
+
+ +
+
+ +
+
+

Client Activity

+ +
+
+
+
Add a Note
+
+
+ +
+ +
+
+
Notes
+ +

No notes found for this client.

+ +
    + +
  • +

    + By on +
  • + +
+ + +
+ +
+
+
+ +

No purchase history found for this client.

+ + + + + + + + + + + + + + + + + + +
Package NamePriceDate
$
+ +
+
+
+
+ +

No signed contracts found for this client.

+ + + + + + + + + + + + + + + + + + +
Contract TitleDate SignedView Contract
+ + View + + Not available + +
+ +
+
+
+
+

No completed surveys found for this client.

+
+
+
+
+ +

No SMS history found for this client.

+ + + + + + + + + + + + + + + + + + + + + + +
FromToMessageStatusDate
+ +
+
+
+
+
+
+ + + + + + + diff --git a/admin/clients.php b/admin/clients.php new file mode 100644 index 0000000..3efe995 --- /dev/null +++ b/admin/clients.php @@ -0,0 +1,62 @@ +query('SELECT id, name, email FROM clients ORDER BY name'); +$clients = $stmt->fetchAll(); + +?> + +
+

Clients

+

View your clients and their signed contracts.

+ + + + + + + + + + + + + + + + + + + + +
NameEmailSigned Contracts
+ prepare('SELECT cc.id, c.title FROM client_contracts cc JOIN contracts c ON cc.contract_id = c.id WHERE cc.client_id = ?'); + $contract_stmt->execute([$client['id']]); + $signed_contracts = $contract_stmt->fetchAll(); + ?> +
    + +
  • + + +
  • No signed contracts
  • + +
+
+ View +
+
+ + diff --git a/admin/content.php b/admin/content.php new file mode 100644 index 0000000..2cd0983 --- /dev/null +++ b/admin/content.php @@ -0,0 +1,90 @@ +prepare('SELECT file_path FROM content WHERE id = ? AND coach_id = ?'); + $stmt->execute([$content_id, $coach_id]); + $content = $stmt->fetch(); + + if ($content) { + // Delete file from server + if (file_exists($content['file_path'])) { + unlink($content['file_path']); + } + + // Delete from database + $delete_stmt = db()->prepare('DELETE FROM content WHERE id = ?'); + $delete_stmt->execute([$content_id]); + $message = "Content deleted successfully!"; + } else { + $error = "Error: Content not found or you don't have permission to delete it."; + } +} + +$stmt = db()->prepare('SELECT * FROM content WHERE coach_id = ? ORDER BY created_at DESC'); +$stmt->execute([$coach_id]); +$contents = $stmt->fetchAll(); + +?> + +
+

Content

+

Manage your content library. You can upload PDFs, videos, worksheets, etc.

+ + Upload New Content + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
TitleDescriptionFileActions
No content uploaded yet.
View Content + Edit + Assign to Client + Assign to Package +
+ + +
+
+
+ + diff --git a/admin/contracts.php b/admin/contracts.php new file mode 100644 index 0000000..7990dfd --- /dev/null +++ b/admin/contracts.php @@ -0,0 +1,50 @@ +query('SELECT * FROM contracts ORDER BY created_at DESC'); +$contracts = $stmt->fetchAll(); + +?> + +
+

Manage Contracts

+

Create, edit, and delete contract templates for your clients.

+ + Add New Contract + + + + + + + + + + + + + + + + + + + + + + + +
TitleCreated AtActions
+ Edit + Delete +
No contracts found.
+
+ + diff --git a/admin/create_survey.php b/admin/create_survey.php new file mode 100644 index 0000000..b1d4813 --- /dev/null +++ b/admin/create_survey.php @@ -0,0 +1,52 @@ +prepare('INSERT INTO surveys (coach_id, title, description) VALUES (?, ?, ?)'); + if ($stmt->execute([$coach_id, $title, $description])) { + $survey_id = db()->lastInsertId(); + header('Location: edit_survey.php?id=' . $survey_id); + exit; + } else { + $error = 'Failed to create survey. Please try again.'; + } + } +} +?> + +
+

Create New Survey

+ + +
+ + +
+
+ + +
+
+ + +
+ + Cancel +
+
+ + diff --git a/admin/dashboard.php b/admin/dashboard.php new file mode 100644 index 0000000..fd50a0d --- /dev/null +++ b/admin/dashboard.php @@ -0,0 +1,186 @@ +query($clients_sql); +$total_clients = $clients_result->fetch(PDO::FETCH_ASSOC)['total_clients']; + +$coaches_sql = "SELECT COUNT(*) as total_coaches FROM coaches"; +$coaches_result = db()->query($coaches_sql); +$total_coaches = $coaches_result->fetch(PDO::FETCH_ASSOC)['total_coaches']; + +$bookings_sql = "SELECT COUNT(*) as total_bookings FROM bookings"; +$bookings_result = db()->query($bookings_sql); +$total_bookings = $bookings_result->fetch(PDO::FETCH_ASSOC)['total_bookings']; + +$bookings_revenue_sql = "SELECT SUM(price) as total_revenue FROM bookings WHERE status = 'confirmed'"; +$bookings_revenue_result = db()->query($bookings_revenue_sql); +$total_bookings_revenue = $bookings_revenue_result->fetch(PDO::FETCH_ASSOC)['total_revenue'] ?? 0; + +$packages_revenue_sql = "SELECT SUM(p.price) as total_revenue FROM client_packages cp JOIN service_packages p ON cp.package_id = p.id"; +$packages_revenue_result = db()->query($packages_revenue_sql); +$total_packages_revenue = $packages_revenue_result->fetch(PDO::FETCH_ASSOC)['total_revenue'] ?? 0; + +$popular_packages_sql = "SELECT p.name, COUNT(cp.id) as purchase_count FROM client_packages cp JOIN service_packages p ON cp.package_id = p.id GROUP BY p.name ORDER BY purchase_count DESC LIMIT 5"; +$popular_packages_result = db()->query($popular_packages_sql); +$popular_packages = $popular_packages_result->fetchAll(PDO::FETCH_ASSOC); + +$client_signups_sql = "SELECT DATE(created_at) as signup_date, COUNT(*) as signup_count FROM clients WHERE created_at >= DATE_SUB(NOW(), INTERVAL 30 DAY) GROUP BY DATE(created_at) ORDER BY signup_date ASC"; +$client_signups_result = db()->query($client_signups_sql); +$client_signups = $client_signups_result->fetchAll(PDO::FETCH_ASSOC); + +$daily_revenue_sql = "SELECT DATE(created_at) as revenue_date, SUM(price) as daily_revenue FROM bookings WHERE status = 'confirmed' AND created_at >= DATE_SUB(NOW(), INTERVAL 30 DAY) GROUP BY DATE(created_at) ORDER BY revenue_date ASC"; +$daily_revenue_result = db()->query($daily_revenue_sql); +$daily_revenue = $daily_revenue_result->fetchAll(PDO::FETCH_ASSOC); + + +// You can add more queries to fetch other business insights + +?> + +
+

Business Insights Dashboard

+
+
+
+
+
+
Total Clients
+

+
+
+
+
+
+
+
Total Coaches
+

+
+
+
+
+
+
+
Total Bookings
+

+
+
+
+
+
+
+
+
+
Total Revenue (Bookings)
+

$

+
+
+
+
+
+
+
Total Revenue (Packages)
+

$

+
+
+
+
+
+
+

Popular Service Packages

+
    + + +
  • + + +
  • + + +
  • No packages sold yet.
  • + +
+
+
+

Recent Client Signups

+ +
+
+
+
+

Daily Revenue (Last 30 Days)

+ +
+
+ +
+ + + + diff --git a/admin/delete-contract.php b/admin/delete-contract.php new file mode 100644 index 0000000..c8ebf60 --- /dev/null +++ b/admin/delete-contract.php @@ -0,0 +1,17 @@ +prepare('DELETE FROM contracts WHERE id = ?'); + $stmt->execute([$_GET['id']]); +} + +header('Location: /admin/contracts.php'); +exit; diff --git a/admin/discounts.php b/admin/discounts.php new file mode 100644 index 0000000..1a92feb --- /dev/null +++ b/admin/discounts.php @@ -0,0 +1,121 @@ +prepare('INSERT INTO discounts (code, type, value, start_date, end_date, uses_limit) VALUES (?, ?, ?, ?, ?, ?)'); + $stmt->execute([$code, $type, $value, $start_date, $end_date, $uses_limit]); + } elseif (isset($_POST['update_discount'])) { + $id = $_POST['id']; + $code = $_POST['code']; + $type = $_POST['type']; + $value = $_POST['value']; + $start_date = empty($_POST['start_date']) ? null : $_POST['start_date']; + $end_date = empty($_POST['end_date']) ? null : $_POST['end_date']; + $uses_limit = empty($_POST['uses_limit']) ? null : $_POST['uses_limit']; + $is_active = isset($_POST['is_active']) ? 1 : 0; + + $stmt = db()->prepare('UPDATE discounts SET code = ?, type = ?, value = ?, start_date = ?, end_date = ?, uses_limit = ?, is_active = ? WHERE id = ?'); + $stmt->execute([$code, $type, $value, $start_date, $end_date, $uses_limit, $is_active, $id]); + } elseif (isset($_POST['delete_discount'])) { + $id = $_POST['id']; + $stmt = db()->prepare('DELETE FROM discounts WHERE id = ?'); + $stmt->execute([$id]); + } + header('Location: discounts.php'); + exit; +} + +// Fetch all discounts +$stmt = db()->query('SELECT * FROM discounts ORDER BY created_at DESC'); +$discounts = $stmt->fetchAll(); +?> + +
+

Manage Discounts

+ + +
+
Add New Discount
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+
+
+ + +
+
Existing Discounts
+
+ + + + + + + + + + + + + + + + + + + + + + + +
CodeTypeValueUsed/LimitActiveActions
/ + Edit +
+ + +
+
+
+
+
+ + \ No newline at end of file diff --git a/admin/edit-content.php b/admin/edit-content.php new file mode 100644 index 0000000..5e799e7 --- /dev/null +++ b/admin/edit-content.php @@ -0,0 +1,56 @@ +prepare("SELECT * FROM content WHERE id = ? AND coach_id = ?"); +$stmt->execute([$content_id, $coach_id]); +$content = $stmt->fetch(); + +if (!$content) { + header('Location: content.php'); + exit; +} + +if ($_SERVER['REQUEST_METHOD'] === 'POST') { + $title = $_POST['title']; + $description = $_POST['description']; + + $update_stmt = db()->prepare("UPDATE content SET title = ?, description = ? WHERE id = ?"); + if ($update_stmt->execute([$title, $description, $content_id])) { + header("Location: content.php"); + exit; + } else { + $error = "Error: Could not update content."; + } +} +?> + +
+

Edit Content

+ + +
+ + +
+
+ + +
+
+ + +
+ +
+
+ + diff --git a/admin/edit-contract.php b/admin/edit-contract.php new file mode 100644 index 0000000..59dfab1 --- /dev/null +++ b/admin/edit-contract.php @@ -0,0 +1,69 @@ + '', 'title' => '', 'content' => '', 'role' => 'Client']; +$is_edit = false; + +if (isset($_GET['id'])) { + $is_edit = true; + $stmt = db()->prepare('SELECT * FROM contracts WHERE id = ?'); + $stmt->execute([$_GET['id']]); + $contract = $stmt->fetch(); +} + +if ($_SERVER['REQUEST_METHOD'] === 'POST') { + $title = $_POST['title']; + $content = $_POST['content']; + $role = $_POST['role']; + $contract_id = $_POST['id']; + + if ($contract_id) { + // Update existing contract + $stmt = db()->prepare('UPDATE contracts SET title = ?, content = ?, role = ? WHERE id = ?'); + $stmt->execute([$title, $content, $role, $contract_id]); + } else { + // Create new contract + $stmt = db()->prepare('INSERT INTO contracts (title, content, role) VALUES (?, ?, ?)'); + $stmt->execute([$title, $content, $role]); + } + + header('Location: /admin/contracts.php'); + exit; +} + +?> + +
+

+ +
+ + +
+ + +
+ +
+ + +
+ +
+ + +
+ + + Cancel +
+
+ + diff --git a/admin/edit-discount.php b/admin/edit-discount.php new file mode 100644 index 0000000..21dec42 --- /dev/null +++ b/admin/edit-discount.php @@ -0,0 +1,82 @@ +prepare('SELECT * FROM discounts WHERE id = ?'); +$stmt->execute([$id]); +$discount = $stmt->fetch(); + +if (!$discount) { + header('Location: discounts.php'); + exit; +} + +if ($_SERVER['REQUEST_METHOD'] === 'POST') { + $code = $_POST['code']; + $type = $_POST['type']; + $value = $_POST['value']; + $start_date = empty($_POST['start_date']) ? null : $_POST['start_date']; + $end_date = empty($_POST['end_date']) ? null : $_POST['end_date']; + $uses_limit = empty($_POST['uses_limit']) ? null : $_POST['uses_limit']; + $is_active = isset($_POST['is_active']) ? 1 : 0; + + $stmt = db()->prepare('UPDATE discounts SET code = ?, type = ?, value = ?, start_date = ?, end_date = ?, uses_limit = ?, is_active = ? WHERE id = ?'); + $stmt->execute([$code, $type, $value, $start_date, $end_date, $uses_limit, $is_active, $id]); + + header('Location: discounts.php'); + exit; +} + +?> + +
+

Edit Discount

+ +
+
Edit Discount:
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ > + +
+ +
+
+
+
+ + \ No newline at end of file diff --git a/admin/edit-package.php b/admin/edit-package.php new file mode 100644 index 0000000..9409688 --- /dev/null +++ b/admin/edit-package.php @@ -0,0 +1,134 @@ +prepare( + 'UPDATE service_packages SET ' + . 'name = ?, coach_id = ?, description = ?, price = ?, payment_type = ?, ' + . 'deposit_amount = ?, installments = ?, installment_interval = ?, pay_in_full_discount_percentage = ? ' + . 'WHERE id = ?' + ); + $stmt->execute([ + $name, $coach_id, $description, $price, $payment_type, + $deposit_amount, $installments, $installment_interval, $pay_in_full_discount_percentage, + $id + ]); + + header('Location: manage-packages.php'); + exit; +} + +$stmt = db()->prepare('SELECT * FROM service_packages WHERE id = ?'); +$stmt->execute([$id]); +$package = $stmt->fetch(); + +$coaches = db()->query('SELECT * FROM coaches')->fetchAll(); + +?> + +
+

Edit Package

+ +
+
Edit Package:
+
+
+ + +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ + + +
+ + +
+ + +
+
+
+
+ + + + diff --git a/admin/edit_question_options.php b/admin/edit_question_options.php new file mode 100644 index 0000000..f4a18ed --- /dev/null +++ b/admin/edit_question_options.php @@ -0,0 +1,93 @@ +prepare('SELECT q.*, s.coach_id, s.id as survey_id FROM survey_questions q JOIN surveys s ON q.survey_id = s.id WHERE q.id = ? AND s.coach_id = ?'); +$stmt->execute([$question_id, $coach_id]); +$question = $stmt->fetch(); + +if (!$question) { + header('Location: surveys.php'); + exit; +} + +// Handle option logic (add/delete) +if ($_SERVER['REQUEST_METHOD'] === 'POST') { + if (isset($_POST['add_option'])) { + $option_text = trim($_POST['option_text']); + if (!empty($option_text)) { + $stmt = db()->prepare('INSERT INTO survey_question_options (question_id, option_text) VALUES (?, ?)'); + $stmt->execute([$question_id, $option_text]); + } + } elseif (isset($_POST['delete_option'])) { + $option_id = $_POST['option_id']; + $stmt = db()->prepare('DELETE FROM survey_question_options WHERE id = ? AND question_id = ?'); + $stmt->execute([$option_id, $question_id]); + } +} + +// Fetch options +$options_stmt = db()->prepare('SELECT * FROM survey_question_options WHERE question_id = ?'); +$options_stmt->execute([$question_id]); +$options = $options_stmt->fetchAll(); + +?> + +
+

Manage Options for:

+ +
+
Add New Option
+
+
+
+ + +
+ +
+
+
+ +
+
Question Options
+
+ +

No options have been added for this question yet.

+ +
    + +
  • + +
    + + +
    +
  • + +
+ +
+
+ + +
+ + diff --git a/admin/edit_survey.php b/admin/edit_survey.php new file mode 100644 index 0000000..9f96819 --- /dev/null +++ b/admin/edit_survey.php @@ -0,0 +1,110 @@ +prepare('SELECT * FROM surveys WHERE id = ? AND coach_id = ?'); +$stmt->execute([$survey_id, $coach_id]); +$survey = $stmt->fetch(); + +if (!$survey) { + header('Location: surveys.php'); + exit; +} + +// Handle question logic (add/delete) +if ($_SERVER['REQUEST_METHOD'] === 'POST') { + if (isset($_POST['add_question'])) { + $question = trim($_POST['question']); + $type = $_POST['type']; + + if (!empty($question)) { + $stmt = db()->prepare('INSERT INTO survey_questions (survey_id, question, type) VALUES (?, ?, ?)'); + $stmt->execute([$survey_id, $question, $type]); + } + } elseif (isset($_POST['delete_question'])) { + $question_id = $_POST['question_id']; + $stmt = db()->prepare('DELETE FROM survey_questions WHERE id = ? AND survey_id = ?'); + $stmt->execute([$question_id, $survey_id]); + } +} + +// Fetch questions +$questions_stmt = db()->prepare('SELECT * FROM survey_questions WHERE survey_id = ? ORDER BY id'); +$questions_stmt->execute([$survey_id]); +$questions = $questions_stmt->fetchAll(); + +?> + +
+

Edit Survey:

+ +
+
Add New Question
+
+
+
+ + +
+
+ + +
+ +
+
+
+ +
+
Survey Questions
+
+ +

No questions have been added to this survey yet.

+ + + +
+
+ +
+ + diff --git a/admin/manage-packages.php b/admin/manage-packages.php new file mode 100644 index 0000000..4669969 --- /dev/null +++ b/admin/manage-packages.php @@ -0,0 +1,97 @@ +prepare('INSERT INTO service_packages (name, price, coach_id) VALUES (?, ?, ?)'); + $stmt->execute([$name, $price, $coach_id]); + header('Location: manage-packages.php'); + exit; + } elseif (isset($_POST['delete_package'])) { + $id = $_POST['id']; + $stmt = db()->prepare('DELETE FROM service_packages WHERE id = ?'); + $stmt->execute([$id]); + header('Location: manage-packages.php'); + exit; + } +} + +// Fetch all packages +$packages = db()->query('SELECT sp.*, c.name as coach_name FROM service_packages sp JOIN coaches c ON sp.coach_id = c.id ORDER BY sp.created_at DESC')->fetchAll(); +$coaches = db()->query('SELECT * FROM coaches')->fetchAll(); + +?> + +
+

Manage Service Packages

+ + +
+
Add New Package
+
+
+
+ + +
+
+ + +
+
+ + +
+ +
+
+
+ + +
+
Existing Packages
+
+ + + + + + + + + + + + + + + + + + + + + +
NameCoachPricePayment TypeActions
$ + Edit +
+ + +
+
+
+
+
+ + diff --git a/admin/settings.php b/admin/settings.php new file mode 100644 index 0000000..6462c8b --- /dev/null +++ b/admin/settings.php @@ -0,0 +1,123 @@ +query('SELECT * FROM settings'); +$settings = $settings_stmt->fetchAll(PDO::FETCH_KEY_PAIR); + +$coach_mode = $settings['coach_mode'] ?? 'multi'; +$single_coach_id = $settings['single_coach_id'] ?? null; + +// Fetch all coaches for the dropdown +$coaches_stmt = db()->query('SELECT id, name FROM coaches'); +$coaches = $coaches_stmt->fetchAll(PDO::FETCH_ASSOC); + +$success_message = ''; +$error_message = ''; + +// Handle form submission +if ($_SERVER['REQUEST_METHOD'] === 'POST') { + $new_coach_mode = $_POST['coach_mode'] ?? 'multi'; + $new_single_coach_id = $_POST['single_coach_id'] ?? null; + + if ($new_coach_mode === 'single' && empty($new_single_coach_id)) { + $error_message = 'Please select a coach for single coach mode.'; + } else { + try { + db()->beginTransaction(); + $update_mode_stmt = db()->prepare("UPDATE settings SET setting_value = ? WHERE setting_key = 'coach_mode'"); + $update_mode_stmt->execute([$new_coach_mode]); + + $update_id_stmt = db()->prepare("UPDATE settings SET setting_value = ? WHERE setting_key = 'single_coach_id'"); + $update_id_stmt->execute([$new_single_coach_id]); + db()->commit(); + $success_message = 'Settings updated successfully!'; + // Refresh settings after update + $coach_mode = $new_coach_mode; + $single_coach_id = $new_single_coach_id; + } catch (PDOException $e) { + db()->rollBack(); + $error_message = 'Failed to update settings: ' . $e->getMessage(); + } + } +} +?> + + + + + + Admin Settings + + + +
+

Admin Settings

+ + + + + + + + +
+
+

Coach Mode

+

Switch between featuring multiple coaches or a single business owner.

+
+ + +
+
+ +
+

Single Coach Settings

+ + +
+ + + Back to Dashboard +
+
+ + + + diff --git a/admin/support.php b/admin/support.php new file mode 100644 index 0000000..b6a54ae --- /dev/null +++ b/admin/support.php @@ -0,0 +1,46 @@ +prepare('SELECT st.*, c.name as client_name FROM support_tickets st JOIN clients c ON st.client_id = c.id ORDER BY st.updated_at DESC'); +$stmt->execute(); +$tickets = $stmt->fetchAll(); + +?> + +
+

Manage Support Tickets

+ +
+
All Tickets
+
+
+ +

There are no support tickets.

+ + + +
+
+ Last updated: +
+

Client:

+

Status:

+
+ + +
+
+
+
+ + \ No newline at end of file diff --git a/admin/survey_responses.php b/admin/survey_responses.php new file mode 100644 index 0000000..9706f96 --- /dev/null +++ b/admin/survey_responses.php @@ -0,0 +1,84 @@ +prepare('SELECT * FROM surveys WHERE id = ? AND coach_id = ?'); +$stmt->execute([$survey_id, $coach_id]); +$survey = $stmt->fetch(); + +if (!$survey) { + header('Location: surveys.php'); + exit; +} + +// Fetch completed surveys by clients +$completed_stmt = db()->prepare( + 'SELECT cs.id, c.name, c.email, cs.completed_at ' . + 'FROM client_surveys cs ' . + 'JOIN clients c ON cs.client_id = c.id ' . + 'WHERE cs.survey_id = ? AND cs.status = \'completed\' ' . + 'ORDER BY cs.completed_at DESC' +); +$completed_stmt->execute([$survey_id]); +$completed_surveys = $completed_stmt->fetchAll(); +?> + +
+

Responses for:

+ +
+
Completed Surveys
+
+ +

No clients have completed this survey yet.

+ + + + + + + + + + + + + + + + + + + + +
Client NameClient EmailCompleted OnAction
+ View Responses +
+ +
+
+ + +
+ + diff --git a/admin/surveys.php b/admin/surveys.php new file mode 100644 index 0000000..f25bfec --- /dev/null +++ b/admin/surveys.php @@ -0,0 +1,58 @@ +prepare('SELECT id, title, description, created_at FROM surveys WHERE coach_id = ? ORDER BY created_at DESC'); +$stmt->execute([$coach_id]); +$surveys = $stmt->fetchAll(); + +?> + +
+
+

Surveys

+ Create New Survey +
+

Create and manage surveys for your clients.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
TitleDescriptionCreated OnActions
+ View + Edit + View Responses + Assign to Client + Delete +
No surveys found.
+
+ + diff --git a/admin/upload-content.php b/admin/upload-content.php new file mode 100644 index 0000000..14ec205 --- /dev/null +++ b/admin/upload-content.php @@ -0,0 +1,69 @@ +prepare("INSERT INTO content (coach_id, title, description, file_path, file_type) VALUES (?, ?, ?, ?, ?)"); + if ($stmt->execute([$coach_id, $title, $description, 'uploads/content/' . $file_name, $file_type])) { + header("Location: content.php"); + exit; + } else { + $error = "Error: Could not save content to the database."; + } + } else { + $error = "Sorry, there was an error uploading your file."; + } + } else { + $error = "Sorry, only JPG, JPEG, PNG, GIF, PDF, MP4, MOV, & AVI files are allowed."; + } + } else { + $error = "Please select a file to upload."; + } +} +?> + +
+

Upload New Content

+ + +
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+
+ + diff --git a/admin/view-ticket.php b/admin/view-ticket.php new file mode 100644 index 0000000..7946404 --- /dev/null +++ b/admin/view-ticket.php @@ -0,0 +1,142 @@ +prepare('SELECT st.*, c.name as client_name FROM support_tickets st JOIN clients c ON st.client_id = c.id WHERE st.id = ?'); +$stmt->execute([$ticket_id]); +$ticket = $stmt->fetch(); + +if (!$ticket) { + header('Location: admin/support.php'); + exit; +} + +// Handle new message submission +if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['reply_to_ticket'])) { + $message = trim($_POST['message']); + + if (!empty($message)) { + try { + $pdo->beginTransaction(); + + // Insert the new message + $stmt = $pdo->prepare('INSERT INTO support_ticket_messages (ticket_id, user_id, is_admin, message) VALUES (?, ?, ?, ?)'); + $stmt->execute([$ticket_id, $admin_id, true, $message]); + + // Update the ticket's updated_at timestamp + $stmt = $pdo->prepare("UPDATE support_tickets SET updated_at = CURRENT_TIMESTAMP, status = 'In Progress' WHERE id = ?"); + $stmt->execute([$ticket_id]);\n\n $pdo->commit();\n\n // Send email notification to client\n require_once \'../mail/MailService.php\';\n $stmt = $pdo->prepare(\'SELECT email FROM clients WHERE id = ?\');\n $stmt->execute([$ticket[\'client_id\']]);\n $client = $stmt->fetch();\n\n if ($client) {\n $email_subject = \"Re: Support Ticket #{$ticket_id}: {$ticket[\'subject\']}\";\n $email_html = \"

A support team member has replied to your ticket.

\"\n . \"

Reply:

\" . nl2br(htmlspecialchars($message)) . \"
\"\n . \"

You can view the ticket here: View Ticket

\";\n $email_text = \"A support team member has replied to your ticket.\\n\\n\"\n . \"Reply:\\n\" . htmlspecialchars($message) . \"\\n\\n\"\n . \"You can view the ticket here: http://{\$GLOBALS[HTTP_HOST]}/view-ticket.php?id={$ticket_id}\";\n\n MailService::sendMail($client[\'email\'], $email_subject, $email_html, $email_text);\n }\n\n $_SESSION[\'success_message\'] = \'Your reply has been sent.\';\n header(\'Location: view-ticket.php?id=\' . $ticket_id); + exit; + } catch (Exception $e) { + $pdo->rollBack(); + $error_message = 'Failed to send reply. Please try again.'; + } + } +} + +// Handle status change +if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['change_status'])) { + $status = $_POST['status']; + if (in_array($status, ['Open', 'In Progress', 'Closed'])) { + $stmt = $pdo->prepare('UPDATE support_tickets SET status = ? WHERE id = ?'); + $stmt->execute([$status, $ticket_id]); + $_SESSION['success_message'] = 'Ticket status updated successfully.'; + header('Location: view-ticket.php?id=' . $ticket_id); + exit; + } +} + +// Fetch all messages for the ticket +$stmt = $pdo->prepare("SELECT m.*, c.name as client_name, co.name as coach_name FROM support_ticket_messages m LEFT JOIN clients c ON m.user_id = c.id AND m.is_admin = 0 LEFT JOIN coaches co ON m.user_id = co.id AND m.is_admin = 1 WHERE m.ticket_id = ? ORDER BY m.created_at ASC"); +$stmt->execute([$ticket_id]); +$messages = $stmt->fetchAll(); + +?> + +
+ Back to Tickets + +

+

Client:

+

Status:

+ + +
+ +
+ + +
+
Conversation
+
+ +
+ + + +

+
+
+ +
+
+ +
+
+
+
Reply
+
+
+
+ +
+ +
+
+
+
+
+
+
Change Status
+
+
+
+ +
+ +
+
+
+
+
+ +
+ + \ No newline at end of file diff --git a/admin/view_survey_response.php b/admin/view_survey_response.php new file mode 100644 index 0000000..b611c15 --- /dev/null +++ b/admin/view_survey_response.php @@ -0,0 +1,67 @@ +prepare( + 'SELECT cs.*, s.title, s.description, c.name as client_name ' . + 'FROM client_surveys cs ' . + 'JOIN surveys s ON cs.survey_id = s.id ' . + 'JOIN clients c ON cs.client_id = c.id ' . + 'WHERE cs.id = ? AND s.coach_id = ?' +); +$stmt->execute([$client_survey_id, $coach_id]); +$client_survey = $stmt->fetch(); + +if (!$client_survey) { + header('Location: surveys.php'); + exit; +} + +// Fetch questions and responses +$qa_stmt = db()->prepare( + 'SELECT q.question, qr.response ' . + 'FROM survey_responses qr ' . + 'JOIN survey_questions q ON qr.question_id = q.id ' . + 'WHERE qr.client_survey_id = ? ORDER BY q.id' +); +$qa_stmt->execute([$client_survey_id]); +$qas = $qa_stmt->fetchAll(); +?> + +
+

Survey Responses from

+

+ +
+
+ +
+

+

+
+
+ +
+
+ + +
+ + diff --git a/api/availability.php b/api/availability.php new file mode 100644 index 0000000..8291196 --- /dev/null +++ b/api/availability.php @@ -0,0 +1,107 @@ + 'Coach ID is required']); + exit; +} + +$coach_id = $_GET['coach_id']; +$start_date_str = isset($_GET['start']) ? $_GET['start'] : 'first day of this month'; +$end_date_str = isset($_GET['end']) ? $_GET['end'] : 'last day of this month'; + +// Fetch coach data +$coach_stmt = db()->prepare("SELECT buffer_time, timezone FROM coaches WHERE id = ?"); +$coach_stmt->execute([$coach_id]); +$coach = $coach_stmt->fetch(); +$buffer_time = $coach ? (int)$coach['buffer_time'] : 0; +$coach_timezone = new DateTimeZone($coach ? $coach['timezone'] : 'UTC'); + +// Fetch client timezone +$client_timezone_str = 'UTC'; // Default +if (isset($_SESSION['user_id'])) { + $client_stmt = db()->prepare("SELECT timezone FROM clients WHERE id = ?"); + $client_stmt->execute([$_SESSION['user_id']]); + $client = $client_stmt->fetch(); + if ($client && $client['timezone']) { + $client_timezone_str = $client['timezone']; + } +} +$client_timezone = new DateTimeZone($client_timezone_str); + +$start_date = new DateTime($start_date_str, $client_timezone); +$end_date = new DateTime($end_date_str, $client_timezone); + +$response = [ + 'availability' => [], + 'bookings' => [] +]; + +// Helper function to convert time +function convert_time($time_str, $from_tz, $to_tz) { + $dt = new DateTime($time_str, $from_tz); + $dt->setTimezone($to_tz); + return $dt->format('Y-m-d H:i:s'); +} + +// Fetch one-off availability +$stmt_availability = db()->prepare("SELECT start_time, end_time FROM coach_availability WHERE coach_id = ? AND start_time BETWEEN ? AND ?"); +$stmt_availability->execute([$coach_id, $start_date->format('Y-m-d H:i:s'), $end_date->format('Y-m-d H:i:s')]); +$one_off_availability = $stmt_availability->fetchAll(PDO::FETCH_ASSOC); + +foreach ($one_off_availability as $slot) { + $response['availability'][] = [ + 'start_time' => convert_time($slot['start_time'], $coach_timezone, $client_timezone), + 'end_time' => convert_time($slot['end_time'], $coach_timezone, $client_timezone) + ]; +} + + +// Fetch recurring availability and generate slots +$stmt_recurring = db()->prepare("SELECT day_of_week, start_time, end_time FROM coach_recurring_availability WHERE coach_id = ?"); +$stmt_recurring->execute([$coach_id]); +$recurring_availability = $stmt_recurring->fetchAll(PDO::FETCH_ASSOC); + +$interval = new DateInterval('P1D'); +$period = new DatePeriod($start_date, $interval, $end_date->modify('+1 day')); + +foreach ($period as $date) { + $day_of_week = $date->format('w'); + foreach ($recurring_availability as $rule) { + if ((int)$rule['day_of_week'] === (int)$day_of_week) { + $start_time_str = $date->format('Y-m-d') . ' ' . $rule['start_time']; + $end_time_str = $date->format('Y-m-d') . ' ' . $rule['end_time']; + + $start_dt = new DateTime($start_time_str, $coach_timezone); + + if ($start_dt >= new DateTime('now', $coach_timezone)) { + $response['availability'][] = [ + 'start_time' => convert_time($start_time_str, $coach_timezone, $client_timezone), + 'end_time' => convert_time($end_time_str, $coach_timezone, $client_timezone) + ]; + } + } + } +} + +// Fetch confirmed and pending bookings +$stmt_bookings = db()->prepare("SELECT booking_time FROM bookings WHERE coach_id = ? AND (status = 'confirmed' OR status = 'pending') AND booking_time BETWEEN ? AND ?"); +$stmt_bookings->execute([$coach_id, $start_date->format('Y-m-d H:i:s'), $end_date->format('Y-m-d H:i:s')]); +$bookings = $stmt_bookings->fetchAll(PDO::FETCH_ASSOC); + +// Assume each booking is for one hour and add buffer +foreach ($bookings as $booking) { + $start_booking_time = new DateTime($booking['booking_time'], $coach_timezone); + $end_booking_time = clone $start_booking_time; + $end_booking_time->add(new DateInterval('PT1H')); // Assuming 1-hour bookings + $end_booking_time->add(new DateInterval('PT' . $buffer_time . 'M')); + + $response['bookings'][] = [ + 'start_time' => $start_booking_time->setTimezone($client_timezone)->format('Y-m-d H:i:s'), + 'end_time' => $end_booking_time->setTimezone($client_timezone)->format('Y-m-d H:i:s') + ]; +} + +echo json_encode($response); \ No newline at end of file diff --git a/api/broadcast_sms.php b/api/broadcast_sms.php new file mode 100644 index 0000000..d3b03f9 --- /dev/null +++ b/api/broadcast_sms.php @@ -0,0 +1,70 @@ + 'Method not allowed']); + exit; +} + +$message = $_POST['message'] ?? null; + +if (empty($message)) { + http_response_code(400); + echo json_encode(['error' => 'Message is required']); + exit; +} + +// Get all clients with phone numbers +$stmt = db()->prepare("SELECT id, name, phone FROM clients WHERE phone IS NOT NULL AND phone != ''"); +$stmt->execute(); +$clients = $stmt->fetchAll(PDO::FETCH_ASSOC); + +// Set up Telnyx API +\Telnyx\Telnyx::setApiKey(TELNYX_API_KEY); + +$success_count = 0; +$error_count = 0; + +foreach ($clients as $client) { + try { + $response = \Telnyx\Message::create([ + 'from' => TELNYX_MESSAGING_PROFILE_ID, + 'to' => $client['phone'], + 'text' => $message, + ]); + + // Log the message + $log_stmt = db()->prepare("INSERT INTO sms_logs (client_id, sender, recipient, message, status) VALUES (?, ?, ?, ?, ?, ?)"); + $log_stmt->execute([ + $client['id'], + TELNYX_MESSAGING_PROFILE_ID, + $client['phone'], + $message, + 'sent' + ]); + + $success_count++; + + } catch (\Telnyx\Exception\ApiErrorException $e) { + $error_count++; + // Log the failure + $log_stmt = db()->prepare("INSERT INTO sms_logs (client_id, sender, recipient, message, status) VALUES (?, ?, ?, ?, ?, ?)"); + $log_stmt->execute([ + $client['id'], + TELNYX_MESSAGING_PROFILE_ID, + $client['phone'], + $message, + 'failed' + ]); + } +} + +if ($success_count > 0) { + echo json_encode(['success' => true, 'message' => "Broadcast sent to " . $success_count . " clients. " . $error_count . " failed."]); +} else { + http_response_code(500); + echo json_encode(['error' => 'Failed to send broadcast to any clients.']); +} diff --git a/api/messages.php b/api/messages.php new file mode 100644 index 0000000..567bad5 --- /dev/null +++ b/api/messages.php @@ -0,0 +1,112 @@ + 'Unauthorized']); + exit; +} + +$action = $_GET['action'] ?? null; +$userId = $_SESSION['user_id']; +$userType = $_SESSION['user_type']; + +header('Content-Type: application/json'); + +switch ($action) { + case 'get_conversations': + $db = db(); + // This query is complex. It gets the last message for each conversation. + $stmt = $db->prepare(" + SELECT + other_user.id as user_id, + other_user.type as user_type, + other_user.name, + last_message.message, + last_message.created_at, + (SELECT COUNT(*) FROM messages WHERE receiver_id = :user_id AND receiver_type = :user_type AND sender_id = other_user.id AND sender_type = other_user.type AND is_read = 0) as unread_count + FROM ( + SELECT + CASE WHEN sender_id = :user_id AND sender_type = :user_type THEN receiver_id ELSE sender_id END as other_id, + CASE WHEN sender_id = :user_id AND sender_type = :user_type THEN receiver_type ELSE sender_type END as other_type, + MAX(id) as last_message_id + FROM messages + WHERE (sender_id = :user_id AND sender_type = :user_type) OR (receiver_id = :user_id AND receiver_type = :user_type) + GROUP BY other_id, other_type + ) as conversations + JOIN messages as last_message ON last_message.id = conversations.last_message_id + JOIN ( + SELECT id, name, 'coach' as type FROM coaches + UNION ALL + SELECT id, name, 'client' as type FROM clients + ) as other_user ON other_user.id = conversations.other_id AND other_user.type = conversations.other_type + ORDER BY last_message.created_at DESC + "); + + $stmt->execute(['user_id' => $userId, 'user_type' => $userType]); + $conversations = $stmt->fetchAll(PDO::FETCH_ASSOC); + + echo json_encode($conversations); + break; + + case 'get_messages': + $peerId = $_GET['user_id'] ?? null; + $peerType = $_GET['user_type'] ?? null; + + if (empty($peerId) || empty($peerType)) { + http_response_code(400); + echo json_encode(['error' => 'Missing user_id or user_type']); + exit; + } + + $db = db(); + // Mark messages as read + $updateStmt = $db->prepare("UPDATE messages SET is_read = 1 WHERE sender_id = ? AND sender_type = ? AND receiver_id = ? AND receiver_type = ?"); + $updateStmt->execute([$peerId, $peerType, $userId, $userType]); + + // Fetch messages + $stmt = $db->prepare("SELECT * FROM messages WHERE (sender_id = ? AND sender_type = ? AND receiver_id = ? AND receiver_type = ?) OR (sender_id = ? AND sender_type = ? AND receiver_id = ? AND receiver_type = ?) ORDER BY created_at ASC"); + $stmt->execute([$userId, $userType, $peerId, $peerType, $peerId, $peerType, $userId, $userType]); + $messages = $stmt->fetchAll(PDO::FETCH_ASSOC); + + echo json_encode($messages); + break; + + case 'send_message': + $data = json_decode(file_get_contents('php://input'), true); + if (empty($data['receiver_id']) || empty($data['receiver_type']) || empty($data['message'])) { + http_response_code(400); + echo json_encode(['error' => 'Missing required fields']); + exit; + } + + $db = db(); + $stmt = $db->prepare("INSERT INTO messages (sender_id, sender_type, receiver_id, receiver_type, message) VALUES (?, ?, ?, ?, ?)"); + if ($stmt->execute([$userId, $userType, $data['receiver_id'], $data['receiver_type'], $data['message']])) { + // Send email notification + require_once __DIR__ . '/../mail/MailService.php'; + + $receiverTable = $data['receiver_type'] === 'coach' ? 'coaches' : 'clients'; + $stmt = $db->prepare("SELECT email FROM {$receiverTable} WHERE id = ?"); + $stmt->execute([$data['receiver_id']]); + $recipient = $stmt->fetch(PDO::FETCH_ASSOC); + + if ($recipient && !empty($recipient['email'])) { + $to = $recipient['email']; + $subject = 'You have a new message'; + $messageBody = 'You have received a new message. Click here to view: View Messages'; + MailService::sendMail($to, $subject, $messageBody, strip_tags($messageBody)); + } + echo json_encode(['success' => true]); + } else { + http_response_code(500); + echo json_encode(['error' => 'Failed to send message']); + } + break; + + default: + http_response_code(400); + echo json_encode(['error' => 'Invalid action']); + break; +} diff --git a/api/send_sms.php b/api/send_sms.php new file mode 100644 index 0000000..7826e49 --- /dev/null +++ b/api/send_sms.php @@ -0,0 +1,71 @@ + 'Method not allowed']); + exit; +} + +$client_id = $_POST['client_id'] ?? null; +$message = $_POST['message'] ?? null; + +if (empty($client_id) || empty($message)) { + http_response_code(400); + echo json_encode(['error' => 'Client ID and message are required']); + exit; +} + +// Fetch client phone number +$stmt = db()->prepare("SELECT phone FROM clients WHERE id = ?"); +$stmt->execute([$client_id]); +$client = $stmt->fetch(PDO::FETCH_ASSOC); + +if (!$client || empty($client['phone'])) { + http_response_code(404); + echo json_encode(['error' => 'Client not found or phone number is missing']); + exit; +} + +$recipient_phone = $client['phone']; + +// Initialize Telnyx +\Telnyx\Telnyx::setApiKey(TELNYX_API_KEY); + +try { + $response = \Telnyx\Message::create([ + 'from' => TELNYX_MESSAGING_PROFILE_ID, // Your Telnyx sending number or messaging profile ID + 'to' => $recipient_phone, + 'text' => $message, + ]); + + // Log the message to the database + $log_stmt = db()->prepare("INSERT INTO sms_logs (client_id, user_id, sender, recipient, message, status) VALUES (?, ?, ?, ?, ?, ?)"); + $log_stmt->execute([ + $client_id, + $_SESSION['user_id'], // Assuming admin/coach is logged in + TELNYX_MESSAGING_PROFILE_ID, + $recipient_phone, + $message, + 'sent' // or $response->status + ]); + + echo json_encode(['success' => true, 'message_id' => $response->id]); + +} catch (\Telnyx\Exception\ApiErrorException $e) { + http_response_code(500); + echo json_encode(['error' => 'Telnyx API error: ' . $e->getMessage()]); + + // Log the failure + $log_stmt = db()->prepare("INSERT INTO sms_logs (client_id, user_id, sender, recipient, message, status) VALUES (?, ?, ?, ?, ?, ?)"); + $log_stmt->execute([ + $client_id, + $_SESSION['user_id'], + TELNYX_MESSAGING_PROFILE_ID, + $recipient_phone, + $message, + 'failed' + ]); +} diff --git a/api/validate_coupon.php b/api/validate_coupon.php new file mode 100644 index 0000000..fa93a2d --- /dev/null +++ b/api/validate_coupon.php @@ -0,0 +1,62 @@ + false, 'error' => 'Missing coupon code or package ID']); + exit; +} + +// Fetch package details +$stmt = db()->prepare('SELECT * FROM service_packages WHERE id = ?'); +$stmt->execute([$package_id]); +$package = $stmt->fetch(); + +if (!$package) { + echo json_encode(['success' => false, 'error' => 'Invalid package']); + exit; +} + +// Fetch coupon details +$stmt = db()->prepare('SELECT * FROM discounts WHERE code = ? AND is_active = 1'); +$stmt->execute([$coupon_code]); +$coupon = $stmt->fetch(); + +if (!$coupon) { + echo json_encode(['success' => false, 'error' => 'Invalid or inactive coupon']); + exit; +} + +// Check date validity +if (($coupon['start_date'] && strtotime($coupon['start_date']) > time()) || ($coupon['end_date'] && strtotime($coupon['end_date']) < time())) { + echo json_encode(['success' => false, 'error' => 'Coupon is not valid at this time']); + exit; +} + +// Check usage limit +if ($coupon['uses_limit'] !== null && $coupon['times_used'] >= $coupon['uses_limit']) { + echo json_encode(['success' => false, 'error' => 'Coupon has reached its usage limit']); + exit; +} + +// Calculate discounted price +$original_price = $package['price']; +$discounted_price = 0; + +if ($coupon['type'] === 'percentage') { + $discounted_price = $original_price - ($original_price * ($coupon['value'] / 100)); +} else { // fixed + $discounted_price = $original_price - $coupon['value']; +} + +if ($discounted_price < 0) { + $discounted_price = 0; +} + +echo json_encode(['success' => true, 'discounted_price' => $discounted_price]); diff --git a/api/validate_subscription_coupon.php b/api/validate_subscription_coupon.php new file mode 100644 index 0000000..c593671 --- /dev/null +++ b/api/validate_subscription_coupon.php @@ -0,0 +1,60 @@ + false, 'error' => 'Missing coupon code or plan ID']); + exit; +} + +global $subscriptions; +if (!isset($subscriptions[$plan_id])) { + echo json_encode(['success' => false, 'error' => 'Invalid plan']); + exit; +} +$plan = $subscriptions[$plan_id]; + +// Fetch coupon details +$stmt = db()->prepare('SELECT * FROM discounts WHERE code = ? AND is_active = 1'); +$stmt->execute([$coupon_code]); +$coupon = $stmt->fetch(); + +if (!$coupon) { + echo json_encode(['success' => false, 'error' => 'Invalid or inactive coupon']); + exit; +} + +// Check date validity +if (($coupon['start_date'] && strtotime($coupon['start_date']) > time()) || ($coupon['end_date'] && strtotime($coupon['end_date']) < time())) { + echo json_encode(['success' => false, 'error' => 'Coupon is not valid at this time']); + exit; +} + +// Check usage limit +if ($coupon['uses_limit'] !== null && $coupon['times_used'] >= $coupon['uses_limit']) { + echo json_encode(['success' => false, 'error' => 'Coupon has reached its usage limit']); + exit; +} + +// Calculate discounted price +$original_price = $plan['price'] / 100; +$discounted_price = 0; + +if ($coupon['type'] === 'percentage') { + $discounted_price = $original_price - ($original_price * ($coupon['value'] / 100)); +} else { // fixed + $discounted_price = $original_price - $coupon['value']; +} + +if ($discounted_price < 0) { + $discounted_price = 0; +} + +echo json_encode(['success' => true, 'discounted_price' => $discounted_price]); diff --git a/approve-booking.php b/approve-booking.php new file mode 100644 index 0000000..106eddf --- /dev/null +++ b/approve-booking.php @@ -0,0 +1,48 @@ +prepare("SELECT * FROM bookings WHERE id = ? AND coach_id = ?"); +$stmt->execute([$booking_id, $coach_id]); +$booking = $stmt->fetch(); + +if ($booking) { + $stmt = db()->prepare("UPDATE bookings SET status = 'confirmed' WHERE id = ?"); + $stmt->execute([$booking_id]); + + // Notify client + $stmt = db()->prepare("SELECT c.email, c.name as client_name, co.name as coach_name, b.booking_time FROM bookings b JOIN clients c ON b.client_id = c.id JOIN coaches co ON b.coach_id = co.id WHERE b.id = ?"); + $stmt->execute([$booking_id]); + $booking_details = $stmt->fetch(); + + if ($booking_details) { + $to = $booking_details['email']; + $subject = 'Booking Confirmed'; + $body = "

Hello " . htmlspecialchars($booking_details['client_name']) . ",

"; + $body .= "

Your booking with " . htmlspecialchars($booking_details['coach_name']) . " on " . htmlspecialchars(date('F j, Y, g:i a', strtotime($booking_details['booking_time']))) . " has been confirmed.

"; + $body .= "

Thank you for using CoachConnect.

"; + + MailService::sendMail($to, $subject, $body, strip_tags($body)); + } + + header('Location: dashboard.php?status=approved'); +} else { + header('Location: dashboard.php?status=error'); +} + +exit; diff --git a/assets/css/custom.css b/assets/css/custom.css new file mode 100644 index 0000000..b5b73b1 --- /dev/null +++ b/assets/css/custom.css @@ -0,0 +1,85 @@ +body { + font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; + background-color: #F9FAFB; + color: #111827; +} + +h1, h2, h3, h4, h5, h6 { + font-family: Georgia, 'Times New Roman', Times, serif; +} + +.navbar { + background-color: #FFFFFF; + border-bottom: 1px solid #E5E7EB; +} + +.hero { + background: linear-gradient(45deg, #1E3A8A, #3B82F6); + color: #FFFFFF; + padding: 100px 0; + text-align: center; +} + +.hero h1 { + font-size: 3.5rem; + font-weight: bold; +} + +.hero p { + font-size: 1.25rem; + margin-bottom: 30px; +} + +.btn-primary { + background-color: #F59E0B; + border-color: #F59E0B; + padding: 15px 30px; + font-size: 1.25rem; + border-radius: 0.5rem; +} + +.btn-primary:hover { + background-color: #D97706; + border-color: #D97706; +} + +.featured-coaches { + padding: 80px 0; +} + +.coach-card { + background-color: #FFFFFF; + border: 1px solid #E5E7EB; + border-radius: 0.5rem; + padding: 20px; + text-align: center; + margin-bottom: 30px; +} + +.coach-card img { + width: 150px; + height: 150px; + border-radius: 50%; + object-fit: cover; + margin-bottom: 20px; +} + +.how-it-works { + background-color: #FFFFFF; + padding: 80px 0; +} + +.step { + text-align: center; +} + +.step .icon { + font-size: 3rem; + color: #3B82F6; +} + +footer { + background-color: #111827; + color: #FFFFFF; + padding: 40px 0; +} diff --git a/assets/js/main.js b/assets/js/main.js new file mode 100644 index 0000000..0ad547b --- /dev/null +++ b/assets/js/main.js @@ -0,0 +1,9 @@ +document.addEventListener('DOMContentLoaded', function() { + const findCoachBtn = document.querySelector('.find-coach-btn'); + if (findCoachBtn) { + findCoachBtn.addEventListener('click', function(e) { + e.preventDefault(); + document.querySelector('#featured-coaches').scrollIntoView({ behavior: 'smooth' }); + }); + } +}); diff --git a/book-session.php b/book-session.php new file mode 100644 index 0000000..6f871fd --- /dev/null +++ b/book-session.php @@ -0,0 +1,108 @@ +prepare( + "SELECT cp.id, cp.sessions_remaining, sp.type, sp.client_limit FROM client_packages cp JOIN service_packages sp ON cp.package_id = sp.id WHERE cp.client_id = ? AND sp.coach_id = ? AND cp.sessions_remaining > 0 ORDER BY cp.purchase_date ASC LIMIT 1" + ); + $pkg_stmt->execute([$client_id, $coach_id]); + $active_package = $pkg_stmt->fetch(); + + if ($active_package) { + // Use a session from the package + try { + $pdo->beginTransaction(); + + $is_recurring = isset($_POST['recurring']) && $_POST['recurring'] === 'on'; + $recurrences = $is_recurring ? (int)$_POST['recurrences'] : 1; + $frequency = $is_recurring ? $_POST['frequency'] : 'weekly'; // Default to weekly + + if ($active_package['sessions_remaining'] < $recurrences) { + throw new Exception('Not enough sessions remaining in the package.'); + } + + $current_booking_time = new DateTime($booking_time); + + for ($i = 0; $i < $recurrences; $i++) { + if ($active_package['type'] === 'group') { + $count_stmt = $pdo->prepare("SELECT COUNT(*) FROM bookings WHERE coach_id = ? AND booking_time = ? AND status IN ('pending', 'confirmed')"); + $count_stmt->execute([$coach_id, $current_booking_time->format('Y-m-d H:i:s')]); + $current_bookings = $count_stmt->fetchColumn(); + + if ($current_bookings >= $active_package['client_limit']) { + throw new Exception('This group session is already full.'); + } + } + + // 1. Create the booking + $book_stmt = $pdo->prepare( + "INSERT INTO bookings (coach_id, client_id, booking_time, status, payment_status) VALUES (?, ?, ?, 'pending', 'paid_with_package')" + ); + $book_stmt->execute([$coach_id, $client_id, $current_booking_time->format('Y-m-d H:i:s')]); + + // 2. Decrement remaining sessions + $update_pkg_stmt = $pdo->prepare("UPDATE client_packages SET sessions_remaining = sessions_remaining - 1 WHERE id = ?"); + $update_pkg_stmt->execute([$active_package['id']]); + + // Calculate next booking time + if ($i < $recurrences - 1) { + if ($frequency === 'weekly') { + $current_booking_time->modify('+1 week'); + } elseif ($frequency === 'bi-weekly') { + $current_booking_time->modify('+2 weeks'); + } + } + } + + $pdo->commit(); + + // Send email notification to coach + require_once __DIR__ . '/mail/MailService.php'; + $coach_stmt = $pdo->prepare("SELECT email FROM coaches WHERE id = ?"); + $coach_stmt->execute([$coach_id]); + $coach = $coach_stmt->fetch(); + + $client_stmt = $pdo->prepare("SELECT name FROM clients WHERE id = ?"); + $client_stmt->execute([$client_id]); + $client = $client_stmt->fetch(); + + if ($coach && $client) { + $to = $coach['email']; + $subject = 'New Pending Booking'; + $message = "You have a new booking from {$client['name']} for {$booking_time}. Please log in to your dashboard to approve or decline it."; + MailService::sendMail($to, $subject, $message, $message); + } + + header('Location: dashboard.php?booking=pending'); + exit; + + } catch (Exception $e) { + $pdo->rollBack(); + error_log('Package booking failed: ' . $e->getMessage()); + header('Location: profile.php?id=' . $coach_id . '&error=booking_failed'); + exit; + } + + } else { + // No active package, redirect to coach's profile to purchase one + header('Location: profile.php?id=' . $coach_id . '&error=no_package'); + exit; + } +} else { + header('Location: coaches.php'); + exit; +} \ No newline at end of file diff --git a/cancel-booking.php b/cancel-booking.php new file mode 100644 index 0000000..581e8f5 --- /dev/null +++ b/cancel-booking.php @@ -0,0 +1,72 @@ +prepare("SELECT * FROM bookings WHERE id = ? AND client_id = ?"); +$stmt->execute([$booking_id, $client_id]); +$booking = $stmt->fetch(); + +if ($booking) { + if (!empty($booking['stripe_payment_intent_id'])) { + try { + $refund = \Stripe\Refund::create([ + 'payment_intent' => $booking['stripe_payment_intent_id'], + ]); + + if ($refund->status == 'succeeded') { + // Optionally, you can store the refund ID in your database + $stmt = db()->prepare("UPDATE bookings SET status = 'cancelled', payment_status = 'refunded' WHERE id = ?"); + $stmt->execute([$booking_id]); + } else { + // Handle refund failure + header('Location: dashboard.php?status=error'); + exit; + } + } catch (\Stripe\Exception\ApiErrorException $e) { + // Handle Stripe API errors + error_log('Stripe API error: ' . $e->getMessage()); + header('Location: dashboard.php?status=error'); + exit; + } + } else { + $stmt = db()->prepare("UPDATE bookings SET status = 'cancelled' WHERE id = ?"); + $stmt->execute([$booking_id]); + } + + // Notify coach + $stmt = db()->prepare("SELECT co.email, co.name as coach_name, c.name as client_name, b.booking_time FROM bookings b JOIN coaches co ON b.coach_id = co.id JOIN clients c ON b.client_id = c.id WHERE b.id = ?"); + $stmt->execute([$booking_id]); + $booking_details = $stmt->fetch(); + + if ($booking_details) { + $to = $booking_details['email']; + $subject = 'Booking Cancellation & Refund'; + $body = "

Hello " . htmlspecialchars($booking_details['coach_name']) . ",

"; + $body .= "

The booking with " . htmlspecialchars($booking_details['client_name']) . " on " . htmlspecialchars(date('F j, Y, g:i a', strtotime($booking_details['booking_time']))) . " has been cancelled and a refund has been issued.

"; + $body .= "

Thank you for using CoachConnect.

"; + + MailService::sendMail($to, $subject, $body, strip_tags($body)); + } + + header('Location: dashboard.php?status=cancelled'); +} else { + header('Location: dashboard.php?status=error'); +} + +exit; diff --git a/checkout.php b/checkout.php new file mode 100644 index 0000000..3419fe1 --- /dev/null +++ b/checkout.php @@ -0,0 +1,99 @@ +prepare('SELECT * FROM service_packages WHERE id = ?'); +$stmt->execute([$package_id]); +$package = $stmt->fetch(); + +if (!$package) { + header('Location: coaches.php?error=invalid_package'); + exit; +} +?> + +
+

Checkout

+
+
+
+
+ Package Details +
+
+
+

+

Price: $

+
+
+
+
+
+
+ Payment +
+
+
+
+ + +
+
+ + +
+ +
+

Total: $

+ +
+
+
+
+
+
+ + + + diff --git a/coaches.php b/coaches.php new file mode 100644 index 0000000..89f17cc --- /dev/null +++ b/coaches.php @@ -0,0 +1,183 @@ +query('SELECT * FROM settings'); +$settings = $settings_stmt->fetchAll(PDO::FETCH_KEY_PAIR); +$coach_mode = $settings['coach_mode'] ?? 'multi'; +$single_coach_id = $settings['single_coach_id'] ?? null; + +if ($coach_mode === 'single' && !empty($single_coach_id)) { + header('Location: profile.php?id=' . $single_coach_id); + exit; +} + +// Pagination +$limit = 6; // Number of coaches per page +$page = isset($_GET['page']) && is_numeric($_GET['page']) ? (int)$_GET['page'] : 1; +$offset = ($page - 1) * $limit; + +try { + // Get total number of coaches for pagination + $total_coaches_stmt = db()->query('SELECT count(*) FROM coaches'); + $total_coaches = $total_coaches_stmt->fetchColumn(); + $total_pages = ceil($total_coaches / $limit); + + // Fetch coaches for the current page + $stmt = db()->prepare('SELECT id, name, specialties, bio, photo_url FROM coaches ORDER BY name ASC LIMIT :limit OFFSET :offset'); + $stmt->bindValue(':limit', $limit, PDO::PARAM_INT); + $stmt->bindValue(':offset', $offset, PDO::PARAM_INT); + $stmt->execute(); + $coaches = $stmt->fetchAll(PDO::FETCH_ASSOC); +} catch (PDOException $e) { + // It's a good practice to log the error and show a user-friendly message + error_log($e->getMessage()); + $coaches = []; + $total_pages = 0; + // For a real application, you might want to redirect to an error page +} + +?> + + + + + + Browse Coaches + + + + + + +
+ +
+ + +
+

Meet Our Coaches

+ + +
+ + prepare('SELECT * FROM service_packages WHERE coach_id = ?'); + $package_stmt->execute([$coach['id']]); + $packages = $package_stmt->fetchAll(PDO::FETCH_ASSOC); + ?> +
+ <?= htmlspecialchars($coach['name']) ?> +
+

+

+ +

...

+ + View Profile +
+ +
+

Coaching Packages

+
+ + prepare('SELECT SUM(quantity) as total_sessions FROM package_service_items WHERE package_id = ? AND service_type IN ("one_on_one", "group_session")'); + $items_stmt->execute([$package['id']]); + $items_result = $items_stmt->fetch(); + $total_sessions = $items_result['total_sessions'] ?? 0; + ?> +
+

+

+
+
+ + + $ + + $ / for installments + + + 0): ?> + for sessions + +
+ Purchase + Purchase as Gift + +
+
+ Type: + + | Client Limit: + + + | Starts: + + + | Ends: + +
+
+ +
+
+ +
+ +
+ + +
+ +
+ + +
+

No coaches found.

+
+ +
+ + + + + + diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..6cf0dfe --- /dev/null +++ b/composer.json @@ -0,0 +1,7 @@ +{ + "require": { + "stripe/stripe-php": "^1.8", + "docusealco/docuseal-php": "^1.0", + "telnyx/telnyx-php": "*" + } +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..65f892d --- /dev/null +++ b/composer.lock @@ -0,0 +1,365 @@ +{ + "_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": "b63113b587353672ca1085f160a5b41e", + "packages": [ + { + "name": "docusealco/docuseal-php", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/docusealco/docuseal-php.git", + "reference": "f12a490e95bdb13ef61f46b72dffcdc646d8b0a4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/docusealco/docuseal-php/zipball/f12a490e95bdb13ef61f46b72dffcdc646d8b0a4", + "reference": "f12a490e95bdb13ef61f46b72dffcdc646d8b0a4", + "shasum": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Docuseal\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "DocuSeal" + } + ], + "description": "PHP bindings for DocuSeal API", + "support": { + "issues": "https://github.com/docusealco/docuseal-php/issues", + "source": "https://github.com/docusealco/docuseal-php/tree/1.0.5" + }, + "time": "2025-09-14T21:27:12+00:00" + }, + { + "name": "php-http/discovery", + "version": "1.20.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/discovery.git", + "reference": "82fe4c73ef3363caed49ff8dd1539ba06044910d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/discovery/zipball/82fe4c73ef3363caed49ff8dd1539ba06044910d", + "reference": "82fe4c73ef3363caed49ff8dd1539ba06044910d", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0|^2.0", + "php": "^7.1 || ^8.0" + }, + "conflict": { + "nyholm/psr7": "<1.0", + "zendframework/zend-diactoros": "*" + }, + "provide": { + "php-http/async-client-implementation": "*", + "php-http/client-implementation": "*", + "psr/http-client-implementation": "*", + "psr/http-factory-implementation": "*", + "psr/http-message-implementation": "*" + }, + "require-dev": { + "composer/composer": "^1.0.2|^2.0", + "graham-campbell/phpspec-skip-example-extension": "^5.0", + "php-http/httplug": "^1.0 || ^2.0", + "php-http/message-factory": "^1.0", + "phpspec/phpspec": "^5.1 || ^6.1 || ^7.3", + "sebastian/comparator": "^3.0.5 || ^4.0.8", + "symfony/phpunit-bridge": "^6.4.4 || ^7.0.1" + }, + "type": "composer-plugin", + "extra": { + "class": "Http\\Discovery\\Composer\\Plugin", + "plugin-optional": true + }, + "autoload": { + "psr-4": { + "Http\\Discovery\\": "src/" + }, + "exclude-from-classmap": [ + "src/Composer/Plugin.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Finds and installs PSR-7, PSR-17, PSR-18 and HTTPlug implementations", + "homepage": "http://php-http.org", + "keywords": [ + "adapter", + "client", + "discovery", + "factory", + "http", + "message", + "psr17", + "psr7" + ], + "support": { + "issues": "https://github.com/php-http/discovery/issues", + "source": "https://github.com/php-http/discovery/tree/1.20.0" + }, + "time": "2024-10-02T11:20:13+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-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" + }, + { + "name": "stripe/stripe-php", + "version": "v1.18.0", + "source": { + "type": "git", + "url": "https://github.com/stripe/stripe-php.git", + "reference": "022c3f21ec1e4141b46738bd5e7ab730d04f78cc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/stripe/stripe-php/zipball/022c3f21ec1e4141b46738bd5e7ab730d04f78cc", + "reference": "022c3f21ec1e4141b46738bd5e7ab730d04f78cc", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "ext-mbstring": "*", + "php": ">=5.2" + }, + "require-dev": { + "simpletest/simpletest": "*" + }, + "type": "library", + "autoload": { + "classmap": [ + "lib/Stripe/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Stripe and contributors", + "homepage": "https://github.com/stripe/stripe-php/contributors" + } + ], + "description": "Stripe PHP Library", + "homepage": "https://stripe.com/", + "keywords": [ + "api", + "payment processing", + "stripe" + ], + "support": { + "issues": "https://github.com/stripe/stripe-php/issues", + "source": "https://github.com/stripe/stripe-php/tree/v1.18.0" + }, + "time": "2015-01-22T05:01:46+00:00" + }, + { + "name": "telnyx/telnyx-php", + "version": "v5.0.0", + "source": { + "type": "git", + "url": "https://github.com/team-telnyx/telnyx-php.git", + "reference": "0e6da9d1afe3bb9844079b163a207c4546b49d36" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/team-telnyx/telnyx-php/zipball/0e6da9d1afe3bb9844079b163a207c4546b49d36", + "reference": "0e6da9d1afe3bb9844079b163a207c4546b49d36", + "shasum": "" + }, + "require": { + "php": "^8.1", + "php-http/discovery": "^1", + "psr/http-client": "^1", + "psr/http-client-implementation": "^1", + "psr/http-factory-implementation": "^1", + "psr/http-message": "^1|^2" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3", + "nyholm/psr7": "^1", + "pestphp/pest": "^3", + "phpstan/extension-installer": "^1", + "phpstan/phpstan": "^2", + "phpstan/phpstan-phpunit": "^2", + "phpunit/phpunit": "^11", + "symfony/http-client": "^7" + }, + "type": "library", + "autoload": { + "files": [ + "src/Core.php", + "src/Client.php" + ], + "psr-4": { + "Telnyx\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Official Telnyx PHP SDK — APIs for Voice, SMS, MMS, WhatsApp, Fax, SIP Trunking, Wireless IoT, Call Control, and more. Build global communications on Telnyx's private carrier-grade network.", + "keywords": [ + "api", + "call control", + "communications", + "connectivity", + "emergency services", + "esim", + "fax", + "iot", + "mms", + "numbers", + "porting", + "sip", + "sms", + "telephony", + "telnyx", + "trunking", + "voice", + "voip", + "whatsapp" + ], + "support": { + "issues": "https://github.com/team-telnyx/telnyx-php/issues", + "source": "https://github.com/team-telnyx/telnyx-php/tree/v5.0.0" + }, + "time": "2025-10-27T22:06:49+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": {}, + "prefer-stable": false, + "prefer-lowest": false, + "platform": {}, + "platform-dev": {}, + "plugin-api-version": "2.9.0" +} diff --git a/content.php b/content.php new file mode 100644 index 0000000..493e5d1 --- /dev/null +++ b/content.php @@ -0,0 +1,68 @@ +prepare( + 'SELECT c.id, c.title, c.description, c.file_path, c.file_type, 'now()' as available_at FROM content c JOIN client_content cc ON c.id = cc.content_id WHERE cc.client_id = ?' +); +$direct_content_stmt->execute([$client_id]); +$direct_content = $direct_content_stmt->fetchAll(); + +// Fetch content assigned via packages +$package_content_stmt = db()->prepare( + 'SELECT c.id, c.title, c.description, c.file_path, c.file_type, DATE_ADD(cp.purchase_date, INTERVAL pc.delay_days DAY) as available_at FROM content c JOIN package_content pc ON c.id = pc.content_id JOIN client_packages cp ON pc.package_id = cp.package_id WHERE cp.client_id = ?' +); +$package_content_stmt->execute([$client_id]); +$package_content = $package_content_stmt->fetchAll(); + +$all_content = array_merge($direct_content, $package_content); + +// Filter out duplicates and unavailable content +$displayed_content_ids = []; +$final_content_list = []; +$current_time = new DateTime(); + +foreach ($all_content as $content) { + $available_at = new DateTime($content['available_at']); + if (!in_array($content['id'], $displayed_content_ids) && $current_time >= $available_at) { + $final_content_list[] = $content; + $displayed_content_ids[] = $content['id']; + } +} + +?> + +
+

My Content

+

Here you can find all the materials shared with you by your coach.

+ +
+ +
+

No content has been assigned to you yet.

+
+ + +
+
+
+
+

+ View Content +
+
+
+ + +
+
+ + diff --git a/create-checkout-session.php b/create-checkout-session.php new file mode 100644 index 0000000..119121d --- /dev/null +++ b/create-checkout-session.php @@ -0,0 +1,146 @@ + 'Unauthorized']); + exit; +} + +// --- 1. Get Input Data --- +$package_id = $_POST['package_id'] ?? null; +$coupon_code = $_POST['coupon_code'] ?? null; +$is_gift = isset($_POST['is_gift']) && $_POST['is_gift'] === 'true'; +$payment_option = $_POST['payment_option'] ?? 'pay_full'; +$client_id = $_SESSION['user_id']; + +if (!$package_id) { + header('Location: coaches.php?error=missing_package'); + exit; +} + +// --- 2. Fetch Package Details --- +$stmt = db()->prepare('SELECT * FROM service_packages WHERE id = ?'); +$stmt->execute([$package_id]); +$package = $stmt->fetch(PDO::FETCH_ASSOC); + +if (!$package) { + header('Location: coaches.php?error=invalid_package'); + exit; +} + +// --- 3. Determine Price, Mode, and Metadata --- +$line_items = []; +$metadata = [ + 'package_id' => $package_id, + 'client_id' => $client_id, + 'is_gift' => $is_gift ? 'true' : 'false', + 'payment_option' => $payment_option +]; +$mode = 'payment'; // Default to one-time payment + +$unit_amount = 0; +$product_name = $package['name']; + +if ($package['payment_type'] === 'payment_plan' && $payment_option === 'payment_plan') { + // --- PAYMENT PLAN --- + if ($package['deposit_amount'] > 0) { + // A. Plan with a deposit: Create a one-time payment for the deposit. + // Webhook will handle creating the subscription for the rest. + $unit_amount = $package['deposit_amount'] * 100; + $product_name .= ' - Deposit'; + $metadata['payment_plan_action'] = 'start_subscription_after_deposit'; + } else { + // B. Plan with no deposit: Create a subscription directly. + $mode = 'subscription'; + $unit_amount = ($package['price'] * 100) / $package['installments']; + $line_items[] = [ + 'price_data' => [ + 'currency' => 'usd', + 'product_data' => ['name' => $product_name], + 'unit_amount' => $unit_amount, + 'recurring' => [ + 'interval' => $package['installment_interval'], + 'interval_count' => 1, + ], + ], + 'quantity' => 1, + ]; + } +} else { + // --- PAY IN FULL (or one-time package) --- + $unit_amount = $package['price'] * 100; + if ($package['payment_type'] === 'payment_plan' && !empty($package['pay_in_full_discount_percentage'])) { + $discount = $unit_amount * ($package['pay_in_full_discount_percentage'] / 100); + $unit_amount -= $discount; + $metadata['discount_applied'] = 'pay_in_full'; + } +} + +// Add the primary line item if not already added (for non-subscription cases) +if (empty($line_items)) { + $line_items[] = [ + 'price_data' => [ + 'currency' => 'usd', + 'product_data' => ['name' => $product_name], + 'unit_amount' => round($unit_amount, 0), + ], + 'quantity' => 1, + ]; +} + + +// --- 4. Handle Coupon --- +$discounts = []; +if ($coupon_code) { + $stmt = db()->prepare('SELECT * FROM discounts WHERE code = ? AND is_active = 1'); + $stmt->execute([$coupon_code]); + $coupon = $stmt->fetch(); + + $is_valid = $coupon && + (!$coupon['start_date'] || strtotime($coupon['start_date']) <= time()) && + (!$coupon['end_date'] || strtotime($coupon['end_date']) >= time()) && + ($coupon['uses_limit'] === null || $coupon['times_used'] < $coupon['uses_limit']); + + if ($is_valid) { + try { + $stripe_coupon_params = ['duration' => 'once', 'name' => $coupon['code']]; + if ($coupon['type'] === 'percentage') { + $stripe_coupon_params['percent_off'] = $coupon['value']; + } else { + $stripe_coupon_params['amount_off'] = $coupon['value'] * 100; + $stripe_coupon_params['currency'] = 'usd'; + } + $stripe_coupon = \Stripe\Coupon::create($stripe_coupon_params); + $discounts[] = ['coupon' => $stripe_coupon->id]; + $metadata['coupon_code'] = $coupon_code; + } catch (\Exception $e) { /* Ignore Stripe error, proceed without coupon */ } + } +} + +// --- 5. Define Success/Cancel URLs --- +$success_url = 'http://' . $_SERVER['HTTP_HOST'] . ($is_gift ? '/purchase-gift-success.php' : '/purchase-package-success.php') . '?session_id={CHECKOUT_SESSION_ID}'; +$cancel_url = 'http://' . $_SERVER['HTTP_HOST'] . '/purchase-package-cancel.php'; + +// --- 6. Create and Redirect to Checkout --- +try { + $checkout_session = \Stripe\Checkout\Session::create([ + 'payment_method_types' => ['card'], + 'line_items' => $line_items, + 'mode' => $mode, + 'success_url' => $success_url, + 'cancel_url' => $cancel_url, + 'metadata' => $metadata, + 'discounts' => $discounts, + ]); + + header("Location: " . $checkout_session->url); + exit; +} catch (\Exception $e) { + $error_message = urlencode($e->getMessage()); + header("Location: purchase-package.php?package_id={$package_id}&error=stripe_error&message={$error_message}"); + exit; +} \ No newline at end of file diff --git a/create-portal-session.php b/create-portal-session.php new file mode 100644 index 0000000..e801c7b --- /dev/null +++ b/create-portal-session.php @@ -0,0 +1,31 @@ +prepare("SELECT stripe_customer_id FROM clients WHERE id = ?"); +$stmt->execute([$user_id]); +$client = $stmt->fetch(); + +if (!$client || !$client['stripe_customer_id']) { + // This should not happen if the user has a subscription + header('Location: subscribe.php'); + exit; +} + +$return_url = 'http://' . $_SERVER['HTTP_HOST'] . '/manage-subscription.php'; + +$portalSession = \Stripe\BillingPortal\Session::create([ + 'customer' => $client['stripe_customer_id'], + 'return_url' => $return_url, +]); + +header("Location: " . $portalSession->url); +exit(); diff --git a/create-subscription-checkout-session.php b/create-subscription-checkout-session.php new file mode 100644 index 0000000..dc5b496 --- /dev/null +++ b/create-subscription-checkout-session.php @@ -0,0 +1,117 @@ +prepare('SELECT * FROM discounts WHERE code = ? AND is_active = 1'); + $stmt->execute([$coupon_code]); + $coupon = $stmt->fetch(); + + if ($coupon) { + // Check date validity and usage limit (already done in previous step, but good to double check) + // ... + + try { + $stripe_coupon_params = []; + if ($coupon['type'] === 'percentage') { + $stripe_coupon_params['percent_off'] = $coupon['value']; + } else { // fixed + $stripe_coupon_params['amount_off'] = $coupon['value'] * 100; + $stripe_coupon_params['currency'] = 'usd'; + } + $stripe_coupon_params['duration'] = 'once'; // Or 'repeating', 'forever' + $stripe_coupon_params['name'] = $coupon['code']; + + $stripe_coupon = \Stripe\Coupon::create($stripe_coupon_params); + $stripe_coupon_id = $stripe_coupon->id; + } catch (\Stripe\Exception\ApiErrorException $e) { + // Coupon creation failed, proceed without discount + } + } +} + +// Get client's stripe customer id or create a new one +$stmt = db()->prepare("SELECT stripe_customer_id, email, name FROM clients WHERE id = ?"); +$stmt->execute([$client_id]); +$client = $stmt->fetch(); + +$stripe_customer_id = $client['stripe_customer_id']; +if (!$stripe_customer_id) { + $customer = \Stripe\Customer::create([ + 'email' => $client['email'], + 'name' => $client['name'], + ]); + $stripe_customer_id = $customer->id; + $update_stmt = db()->prepare("UPDATE clients SET stripe_customer_id = ? WHERE id = ?"); + $update_stmt->execute([$stripe_customer_id, $client_id]); +} + +// Create a Stripe Checkout Session +try { + $checkout_params = [ + 'payment_method_types' => ['card'], + 'line_items' => [[ + 'price_data' => [ + 'currency' => $plan['currency'], + 'product_data' => [ + 'name' => $plan['name'], + ], + 'unit_amount' => $plan['price'], + 'recurring' => [ + 'interval' => $plan['interval'], + ], + ], + 'quantity' => 1, + ]], + 'mode' => 'subscription', + 'success_url' => 'http://' . $_SERVER['HTTP_HOST'] . '/subscription-success.php?session_id={CHECKOUT_SESSION_ID}', + 'cancel_url' => 'http://' . $_SERVER['HTTP_HOST'] . '/subscription-cancel.php', + 'client_reference_id' => $client_id, + 'customer' => $stripe_customer_id, + ]; + + if ($stripe_coupon_id) { + $checkout_params['discounts'] = [['coupon' => $stripe_coupon_id]]; + } + + $checkout_session = \Stripe\Checkout\Session::create($checkout_params); + + header("HTTP/1.1 303 See Other"); + header("Location: " . $checkout_session->url); + exit; + +} catch (\Stripe\Exception\ApiErrorException $e) { + header('Location: subscribe-checkout.php?plan_id='. $plan_id .'&error=stripe_error&message=' . urlencode($e->getMessage())); + exit; +} catch (Exception $e) { + header('Location: subscribe-checkout.php?plan_id=' . $plan_id .'&error=generic_error&message=' . urlencode($e->getMessage())); + exit; +} diff --git a/cron/send_reminders.php b/cron/send_reminders.php new file mode 100644 index 0000000..73e4a24 --- /dev/null +++ b/cron/send_reminders.php @@ -0,0 +1,54 @@ +prepare("SELECT b.*, c.name as client_name, c.phone as client_phone FROM bookings b JOIN clients c ON b.client_id = c.id WHERE b.start_time BETWEEN NOW() AND NOW() + INTERVAL 24 HOUR AND b.status = 'confirmed'"); +$stmt->execute(); +$bookings = $stmt->fetchAll(PDO::FETCH_ASSOC); + +foreach ($bookings as $booking) { + if (empty($booking['client_phone'])) { + continue; + } + + $message = "Hi " . $booking['client_name'] . ", this is a reminder for your upcoming session tomorrow at " . date("g:i a", strtotime($booking['start_time'])) . "."; + + try { + $response = \Telnyx\Message::create([ + 'from' => TELNYX_MESSAGING_PROFILE_ID, + 'to' => $booking['client_phone'], + 'text' => $message, + ]); + + // Log the message + $log_stmt = db()->prepare("INSERT INTO sms_logs (client_id, sender, recipient, message, status) VALUES (?, ?, ?, ?, ?, ?)"); + $log_stmt->execute([ + $booking['client_id'], + TELNYX_MESSAGING_PROFILE_ID, + $booking['client_phone'], + $message, + 'sent' + ]); + + echo "Reminder sent to " . $booking['client_name'] . "\n"; + + } catch (\Telnyx\Exception\ApiErrorException $e) { + echo "Error sending reminder to " . $booking['client_name'] . ": " . $e->getMessage() . "\n"; + + // Log the failure + $log_stmt = db()->prepare("INSERT INTO sms_logs (client_id, sender, recipient, message, status) VALUES (?, ?, ?, ?, ?, ?)"); + $log_stmt->execute([ + $booking['client_id'], + TELNYX_MESSAGING_PROFILE_ID, + $booking['client_phone'], + $message, + 'failed' + ]); + } +} + diff --git a/dashboard.php b/dashboard.php new file mode 100644 index 0000000..8f55658 --- /dev/null +++ b/dashboard.php @@ -0,0 +1,497 @@ +query('SELECT setting_key, setting_value FROM settings'); +$settings = $settings_stmt->fetchAll(PDO::FETCH_KEY_PAIR); +$coach_mode = $settings['coach_mode'] ?? 'multi'; + +if (!isset($_SESSION['user_id'])) { + header('Location: login.php'); + exit; +} + +$user_id = $_SESSION['user_id']; +$user_role = $_SESSION['user_role']; +$bookings = []; +$existing_reviews = []; +$subscription = null; + +// Update status of past bookings to 'completed' +$update_stmt = db()->prepare("UPDATE bookings SET status = 'completed' WHERE status = 'confirmed' AND booking_time < NOW()"); +$update_stmt->execute(); + +if ($user_role === 'client') { + $stmt = db()->prepare("SELECT b.*, c.name as coach_name FROM bookings b JOIN coaches c ON b.coach_id = c.id WHERE b.client_id = ? ORDER BY b.booking_time DESC"); + $stmt->execute([$user_id]); + $bookings = $stmt->fetchAll(); + + $review_stmt = db()->prepare("SELECT booking_id FROM reviews WHERE client_id = ?"); + $review_stmt->execute([$user_id]); + $existing_reviews = $review_stmt->fetchAll(PDO::FETCH_COLUMN); + + $sub_stmt = db()->prepare("SELECT * FROM client_subscriptions WHERE client_id = ? AND (status = 'active' OR status = 'trialing') ORDER BY created_at DESC LIMIT 1"); + $sub_stmt->execute([$user_id]); + $subscription = $sub_stmt->fetch(); + + $client_stmt = db()->prepare("SELECT timezone FROM clients WHERE id = ?"); + $client_stmt->execute([$user_id]); + $client = $client_stmt->fetch(); + +} elseif ($user_role === 'coach') { + $stmt = db()->prepare("SELECT b.*, c.name as client_name FROM bookings b JOIN clients c ON b.client_id = c.id WHERE b.coach_id = ? ORDER BY b.booking_time DESC"); + $stmt->execute([$user_id]); + $bookings = $stmt->fetchAll(); + + $coach_stmt = db()->prepare("SELECT buffer_time, timezone FROM coaches WHERE id = ?"); + $coach_stmt->execute([$user_id]); + $coach = $coach_stmt->fetch(); +} + +?> + + + + + + Dashboard - CoachConnect + + + + + +
+ +
+ +
+ + + + +
+

Manage Your One-Off Availability

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

Manage Your Recurring Weekly Availability

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

Manage Your Settings

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

Manage Service Packages

+

Create, view, and manage your coaching packages.

+ Manage Packages +
+
+

Manage Your Portfolio

+

Update your bio, specialties, and upload media to showcase your work.

+ Edit Portfolio +
+
+

Admin Settings

+

Configure site-wide settings and modes.

+ Go to Settings +
+ + +
+

Manage Your Settings

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

Your Packages

+ prepare("SELECT cp.sessions_remaining, sp.name FROM client_packages cp JOIN service_packages sp ON cp.package_id = sp.id WHERE cp.client_id = ?"); + $packages_stmt->execute([$user_id]); + $client_packages = $packages_stmt->fetchAll(); + ?> + +
    + +
  • : sessions remaining
  • + +
+ +

You have not purchased any packages yet.

+ Browse Packages + +
+ +
+

Your Subscriptions

+ prepare("SELECT cs.*, sp.name FROM client_subscriptions cs JOIN service_packages sp ON cs.package_id = sp.id WHERE cs.client_id = ? ORDER BY cs.created_at DESC"); + $subs_stmt->execute([$user_id]); + $subscriptions = $subs_stmt->fetchAll(); + ?> + +
    + +
  • :
  • + +
+ Manage Subscriptions + +

You do not have any active subscriptions.

+ +
+ + +

Your Bookings

+ + + + + + + + + +
+
+ + + + + + + + + + prepare("SELECT * FROM coach_availability WHERE coach_id = ? ORDER BY start_time DESC"); + $stmt->execute([$user_id]); + $availability = $stmt->fetchAll(); + } + + if (empty($availability)): + ?> + + + + + + + + + + + + + +
+ Start Time + + End Time +
No availability set.
+

+
+

+
+ Delete +
+
+
+

Your Recurring Weekly Availability

+ + + + + + + + + + + prepare("SELECT * FROM coach_recurring_availability WHERE coach_id = ? ORDER BY day_of_week, start_time"); + $stmt->execute([$user_id]); + $recurring_availability = $stmt->fetchAll(); + $days_of_week = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']; + } + + if (empty($recurring_availability)): + ?> + + + + + + + + + + + + + + +
+ Day of Week + + Start Time + + End Time +
No recurring availability set.
+

+
+

+
+

+
+ Delete +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + Booking Time + + Status +
No bookings found.
+

+ +

+
+

+
+ + + + + + + Approve + Decline + + Cancel + + Review + + Refund + +
+
+
+
+ + + + + diff --git a/db/migrate.php b/db/migrate.php new file mode 100644 index 0000000..37b0bfe --- /dev/null +++ b/db/migrate.php @@ -0,0 +1,43 @@ +exec('CREATE TABLE IF NOT EXISTS migrations (migration VARCHAR(255) PRIMARY KEY)'); + } catch (PDOException $e) { + die("Could not create migrations table: " . $e->getMessage() . "\n"); + } + + // Get all migration files + $migrations_dir = __DIR__ . '/migrations'; + $files = glob($migrations_dir . '/*.sql'); + + // Get already run migrations + $ran_migrations_stmt = $pdo->query('SELECT migration FROM migrations'); + $ran_migrations = $ran_migrations_stmt->fetchAll(PDO::FETCH_COLUMN); + + foreach ($files as $file) { + $migration_name = basename($file); + + if (in_array($migration_name, $ran_migrations)) { + continue; // Skip already run migration + } + + $sql = file_get_contents($file); + try { + $pdo->exec($sql); + $stmt = $pdo->prepare('INSERT INTO migrations (migration) VALUES (?)'); + $stmt->execute([$migration_name]); + echo "Migration from $file ran successfully.\n"; + } catch (PDOException $e) { + die("Migration failed on file $file: " . $e->getMessage() . "\n"); + } + } + echo "All new migrations have been run.\n"; +} + +run_migrations(); + diff --git a/db/migrations/001_create_coaches_table.sql b/db/migrations/001_create_coaches_table.sql new file mode 100644 index 0000000..738d1db --- /dev/null +++ b/db/migrations/001_create_coaches_table.sql @@ -0,0 +1,8 @@ +CREATE TABLE IF NOT EXISTS coaches ( + id INT AUTO_INCREMENT PRIMARY KEY, + name VARCHAR(255) NOT NULL, + specialty VARCHAR(255) NOT NULL, + bio TEXT, + photo_url VARCHAR(255), + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); diff --git a/db/migrations/002_create_clients_table.sql b/db/migrations/002_create_clients_table.sql new file mode 100644 index 0000000..00f4960 --- /dev/null +++ b/db/migrations/002_create_clients_table.sql @@ -0,0 +1,7 @@ +CREATE TABLE IF NOT EXISTS clients ( + id INT AUTO_INCREMENT PRIMARY KEY, + name VARCHAR(255) NOT NULL, + email VARCHAR(255) NOT NULL UNIQUE, + password VARCHAR(255) NOT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); diff --git a/db/migrations/003_create_bookings_table.sql b/db/migrations/003_create_bookings_table.sql new file mode 100644 index 0000000..b084799 --- /dev/null +++ b/db/migrations/003_create_bookings_table.sql @@ -0,0 +1,10 @@ +CREATE TABLE IF NOT EXISTS bookings ( + id INT AUTO_INCREMENT PRIMARY KEY, + client_id INT NOT NULL, + coach_id INT NOT NULL, + booking_time DATETIME NOT NULL, + status VARCHAR(255) NOT NULL DEFAULT 'pending', + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (client_id) REFERENCES clients(id), + FOREIGN KEY (coach_id) REFERENCES coaches(id) +); diff --git a/db/migrations/004_add_status_to_bookings.sql b/db/migrations/004_add_status_to_bookings.sql new file mode 100644 index 0000000..94e30b2 --- /dev/null +++ b/db/migrations/004_add_status_to_bookings.sql @@ -0,0 +1 @@ +ALTER TABLE `bookings` ADD `status` VARCHAR(255) NOT NULL DEFAULT 'pending'; \ No newline at end of file diff --git a/db/migrations/005_create_coach_availability_table.sql b/db/migrations/005_create_coach_availability_table.sql new file mode 100644 index 0000000..00eb3f0 --- /dev/null +++ b/db/migrations/005_create_coach_availability_table.sql @@ -0,0 +1,7 @@ +CREATE TABLE IF NOT EXISTS coach_availability ( + id INT AUTO_INCREMENT PRIMARY KEY, + coach_id INT NOT NULL, + start_time DATETIME NOT NULL, + end_time DATETIME NOT NULL, + FOREIGN KEY (coach_id) REFERENCES coaches(id) +); diff --git a/db/migrations/006_create_coach_recurring_availability_table.sql b/db/migrations/006_create_coach_recurring_availability_table.sql new file mode 100644 index 0000000..4faf385 --- /dev/null +++ b/db/migrations/006_create_coach_recurring_availability_table.sql @@ -0,0 +1,8 @@ +CREATE TABLE IF NOT EXISTS coach_recurring_availability ( + id INT AUTO_INCREMENT PRIMARY KEY, + coach_id INT NOT NULL, + day_of_week INT NOT NULL, -- 0 for Sunday, 1 for Monday, etc. + start_time TIME NOT NULL, + end_time TIME NOT NULL, + FOREIGN KEY (coach_id) REFERENCES coaches(id) +); diff --git a/db/migrations/007_create_reviews_table.sql b/db/migrations/007_create_reviews_table.sql new file mode 100644 index 0000000..60e741b --- /dev/null +++ b/db/migrations/007_create_reviews_table.sql @@ -0,0 +1,13 @@ +CREATE TABLE IF NOT EXISTS reviews ( + id INT AUTO_INCREMENT PRIMARY KEY, + booking_id INT NOT NULL, + coach_id INT NOT NULL, + client_id INT NOT NULL, + rating INT NOT NULL, + review TEXT, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + UNIQUE KEY `uniq_booking_id` (`booking_id`), + FOREIGN KEY (booking_id) REFERENCES bookings(id) ON DELETE CASCADE, + FOREIGN KEY (coach_id) REFERENCES coaches(id) ON DELETE CASCADE, + FOREIGN KEY (client_id) REFERENCES clients(id) ON DELETE CASCADE +); \ No newline at end of file diff --git a/db/migrations/008_add_stripe_to_bookings.sql b/db/migrations/008_add_stripe_to_bookings.sql new file mode 100644 index 0000000..305a421 --- /dev/null +++ b/db/migrations/008_add_stripe_to_bookings.sql @@ -0,0 +1,3 @@ +ALTER TABLE `bookings` +ADD COLUMN `stripe_payment_intent_id` VARCHAR(255) DEFAULT NULL, +ADD COLUMN `payment_status` VARCHAR(50) DEFAULT 'unpaid'; \ No newline at end of file diff --git a/db/migrations/009_create_client_subscriptions_table.sql b/db/migrations/009_create_client_subscriptions_table.sql new file mode 100644 index 0000000..662b67d --- /dev/null +++ b/db/migrations/009_create_client_subscriptions_table.sql @@ -0,0 +1,12 @@ +CREATE TABLE IF NOT EXISTS `client_subscriptions` ( + `id` INT AUTO_INCREMENT PRIMARY KEY, + `client_id` INT NOT NULL, + `stripe_subscription_id` VARCHAR(255) NOT NULL, + `stripe_product_id` VARCHAR(255) NOT NULL, + `status` VARCHAR(50) NOT NULL, + `start_date` TIMESTAMP NOT NULL, + `end_date` TIMESTAMP NULL, + `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + FOREIGN KEY (`client_id`) REFERENCES `clients`(`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; \ No newline at end of file diff --git a/db/migrations/010_create_service_packages_table.sql b/db/migrations/010_create_service_packages_table.sql new file mode 100644 index 0000000..e135b05 --- /dev/null +++ b/db/migrations/010_create_service_packages_table.sql @@ -0,0 +1,14 @@ +-- 010_create_service_packages_table.sql +CREATE TABLE IF NOT EXISTS service_packages ( + id INT AUTO_INCREMENT PRIMARY KEY, + coach_id INT NOT NULL, + name VARCHAR(255) NOT NULL, + description TEXT, + price DECIMAL(10, 2) NOT NULL, + num_sessions INT NOT NULL, + stripe_product_id VARCHAR(255), + stripe_price_id VARCHAR(255), + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + FOREIGN KEY (coach_id) REFERENCES coaches(id) ON DELETE CASCADE +); diff --git a/db/migrations/011_create_client_packages_table.sql b/db/migrations/011_create_client_packages_table.sql new file mode 100644 index 0000000..55dd44f --- /dev/null +++ b/db/migrations/011_create_client_packages_table.sql @@ -0,0 +1,11 @@ +-- 011_create_client_packages_table.sql +CREATE TABLE IF NOT EXISTS client_packages ( + id INT AUTO_INCREMENT PRIMARY KEY, + client_id INT NOT NULL, + package_id INT NOT NULL, + sessions_remaining INT NOT NULL, + purchase_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + stripe_checkout_session_id VARCHAR(255), + FOREIGN KEY (client_id) REFERENCES clients(id) ON DELETE CASCADE, + FOREIGN KEY (package_id) REFERENCES service_packages(id) ON DELETE CASCADE +); diff --git a/db/migrations/012_add_portfolio_to_coaches.sql b/db/migrations/012_add_portfolio_to_coaches.sql new file mode 100644 index 0000000..d9b2f33 --- /dev/null +++ b/db/migrations/012_add_portfolio_to_coaches.sql @@ -0,0 +1 @@ +ALTER TABLE `coaches` ADD `bio` TEXT, ADD `specialties` VARCHAR(255); \ No newline at end of file diff --git a/db/migrations/013_create_coach_portfolio_items_table.sql b/db/migrations/013_create_coach_portfolio_items_table.sql new file mode 100644 index 0000000..e41e6b1 --- /dev/null +++ b/db/migrations/013_create_coach_portfolio_items_table.sql @@ -0,0 +1,9 @@ +CREATE TABLE IF NOT EXISTS `coach_portfolio_items` ( + `id` INT AUTO_INCREMENT PRIMARY KEY, + `coach_id` INT NOT NULL, + `item_type` ENUM('image', 'video') NOT NULL, + `url` VARCHAR(255) NOT NULL, + `caption` VARCHAR(255), + `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (`coach_id`) REFERENCES `coaches`(`id`) ON DELETE CASCADE +); \ No newline at end of file diff --git a/db/migrations/014_create_settings_table.sql b/db/migrations/014_create_settings_table.sql new file mode 100644 index 0000000..7b55af9 --- /dev/null +++ b/db/migrations/014_create_settings_table.sql @@ -0,0 +1,8 @@ +CREATE TABLE settings ( + id INT AUTO_INCREMENT PRIMARY KEY, + setting_key VARCHAR(255) NOT NULL UNIQUE, + setting_value VARCHAR(255) +); + +INSERT INTO settings (setting_key, setting_value) VALUES ('coach_mode', 'multi'); +INSERT INTO settings (setting_key, setting_value) VALUES ('single_coach_id', NULL); diff --git a/db/migrations/015_create_messages_table.sql b/db/migrations/015_create_messages_table.sql new file mode 100644 index 0000000..f200dad --- /dev/null +++ b/db/migrations/015_create_messages_table.sql @@ -0,0 +1,10 @@ +CREATE TABLE IF NOT EXISTS messages ( + id INT AUTO_INCREMENT PRIMARY KEY, + sender_id INT NOT NULL, + sender_type ENUM('coach', 'client') NOT NULL, + receiver_id INT NOT NULL, + receiver_type ENUM('coach', 'client') NOT NULL, + message TEXT NOT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + is_read BOOLEAN DEFAULT FALSE +); diff --git a/db/migrations/016_add_stripe_customer_id_to_clients.sql b/db/migrations/016_add_stripe_customer_id_to_clients.sql new file mode 100644 index 0000000..c2367a1 --- /dev/null +++ b/db/migrations/016_add_stripe_customer_id_to_clients.sql @@ -0,0 +1 @@ +ALTER TABLE `clients` ADD `stripe_customer_id` VARCHAR(255) NULL; diff --git a/db/migrations/017_create_support_tickets_table.sql b/db/migrations/017_create_support_tickets_table.sql new file mode 100644 index 0000000..c2692d6 --- /dev/null +++ b/db/migrations/017_create_support_tickets_table.sql @@ -0,0 +1,10 @@ + +CREATE TABLE IF NOT EXISTS `support_tickets` ( + `id` INT AUTO_INCREMENT PRIMARY KEY, + `client_id` INT NOT NULL, + `subject` VARCHAR(255) NOT NULL, + `status` ENUM('Open', 'In Progress', 'Closed') NOT NULL DEFAULT 'Open', + `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + FOREIGN KEY (`client_id`) REFERENCES `clients`(`id`) ON DELETE CASCADE +); diff --git a/db/migrations/018_create_support_ticket_messages_table.sql b/db/migrations/018_create_support_ticket_messages_table.sql new file mode 100644 index 0000000..4129c84 --- /dev/null +++ b/db/migrations/018_create_support_ticket_messages_table.sql @@ -0,0 +1,10 @@ + +CREATE TABLE IF NOT EXISTS `support_ticket_messages` ( + `id` INT AUTO_INCREMENT PRIMARY KEY, + `ticket_id` INT NOT NULL, + `user_id` INT NOT NULL COMMENT 'Can be client_id or coach_id/admin_id', + `is_admin` BOOLEAN NOT NULL DEFAULT FALSE COMMENT 'TRUE if the message is from an admin/coach, FALSE if from a client', + `message` TEXT NOT NULL, + `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (`ticket_id`) REFERENCES `support_tickets`(`id`) ON DELETE CASCADE +); diff --git a/db/migrations/019_create_contracts_table.sql b/db/migrations/019_create_contracts_table.sql new file mode 100644 index 0000000..c7bbe47 --- /dev/null +++ b/db/migrations/019_create_contracts_table.sql @@ -0,0 +1,7 @@ +CREATE TABLE IF NOT EXISTS `contracts` ( + `id` INT AUTO_INCREMENT PRIMARY KEY, + `title` VARCHAR(255) NOT NULL, + `content` TEXT NOT NULL, + `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP +); diff --git a/db/migrations/020_create_client_contracts_table.sql b/db/migrations/020_create_client_contracts_table.sql new file mode 100644 index 0000000..a8569b7 --- /dev/null +++ b/db/migrations/020_create_client_contracts_table.sql @@ -0,0 +1,9 @@ +CREATE TABLE IF NOT EXISTS `client_contracts` ( + `id` INT AUTO_INCREMENT PRIMARY KEY, + `client_id` INT NOT NULL, + `contract_id` INT NOT NULL, + `signature_data` TEXT NOT NULL, + `signed_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (`client_id`) REFERENCES `clients`(`id`) ON DELETE CASCADE, + FOREIGN KEY (`contract_id`) REFERENCES `contracts`(`id`) ON DELETE CASCADE +); diff --git a/db/migrations/021_add_docuseal_to_client_contracts.sql b/db/migrations/021_add_docuseal_to_client_contracts.sql new file mode 100644 index 0000000..9a9654f --- /dev/null +++ b/db/migrations/021_add_docuseal_to_client_contracts.sql @@ -0,0 +1,3 @@ +ALTER TABLE `client_contracts` +ADD COLUMN `docuseal_submission_id` VARCHAR(255) DEFAULT NULL, +DROP COLUMN `signature_data`; \ No newline at end of file diff --git a/db/migrations/022_add_docuseal_document_url_to_client_contracts.sql b/db/migrations/022_add_docuseal_document_url_to_client_contracts.sql new file mode 100644 index 0000000..9db2b8b --- /dev/null +++ b/db/migrations/022_add_docuseal_document_url_to_client_contracts.sql @@ -0,0 +1 @@ +ALTER TABLE `client_contracts` ADD COLUMN `docuseal_document_url` VARCHAR(255) DEFAULT NULL; \ No newline at end of file diff --git a/db/migrations/023_add_role_to_contracts.sql b/db/migrations/023_add_role_to_contracts.sql new file mode 100644 index 0000000..48eacd1 --- /dev/null +++ b/db/migrations/023_add_role_to_contracts.sql @@ -0,0 +1 @@ +ALTER TABLE `contracts` ADD COLUMN `role` VARCHAR(255) NOT NULL DEFAULT 'Client'; \ No newline at end of file diff --git a/db/migrations/024_create_client_notes_table.sql b/db/migrations/024_create_client_notes_table.sql new file mode 100644 index 0000000..7a028d6 --- /dev/null +++ b/db/migrations/024_create_client_notes_table.sql @@ -0,0 +1,9 @@ +CREATE TABLE IF NOT EXISTS client_notes ( + id INT AUTO_INCREMENT PRIMARY KEY, + client_id INT NOT NULL, + coach_id INT NOT NULL, + note TEXT NOT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (client_id) REFERENCES clients(id) ON DELETE CASCADE, + FOREIGN KEY (coach_id) REFERENCES coaches(id) ON DELETE CASCADE +); diff --git a/db/migrations/025_create_surveys_table.sql b/db/migrations/025_create_surveys_table.sql new file mode 100644 index 0000000..a2163d1 --- /dev/null +++ b/db/migrations/025_create_surveys_table.sql @@ -0,0 +1,11 @@ + +CREATE TABLE `surveys` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `coach_id` int(11) NOT NULL, + `title` varchar(255) NOT NULL, + `description` text, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + KEY `coach_id` (`coach_id`), + CONSTRAINT `surveys_ibfk_1` FOREIGN KEY (`coach_id`) REFERENCES `coaches` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; diff --git a/db/migrations/026_create_survey_questions_table.sql b/db/migrations/026_create_survey_questions_table.sql new file mode 100644 index 0000000..1d190db --- /dev/null +++ b/db/migrations/026_create_survey_questions_table.sql @@ -0,0 +1,11 @@ + +CREATE TABLE `survey_questions` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `survey_id` int(11) NOT NULL, + `question` text NOT NULL, + `type` enum('text','textarea','select','radio','checkbox') NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + KEY `survey_id` (`survey_id`), + CONSTRAINT `survey_questions_ibfk_1` FOREIGN KEY (`survey_id`) REFERENCES `surveys` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; diff --git a/db/migrations/027_create_survey_question_options_table.sql b/db/migrations/027_create_survey_question_options_table.sql new file mode 100644 index 0000000..4c1537e --- /dev/null +++ b/db/migrations/027_create_survey_question_options_table.sql @@ -0,0 +1,9 @@ + +CREATE TABLE `survey_question_options` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `question_id` int(11) NOT NULL, + `option_text` varchar(255) NOT NULL, + PRIMARY KEY (`id`), + KEY `question_id` (`question_id`), + CONSTRAINT `survey_question_options_ibfk_1` FOREIGN KEY (`question_id`) REFERENCES `survey_questions` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; diff --git a/db/migrations/028_create_client_surveys_table.sql b/db/migrations/028_create_client_surveys_table.sql new file mode 100644 index 0000000..82cf88c --- /dev/null +++ b/db/migrations/028_create_client_surveys_table.sql @@ -0,0 +1,14 @@ + +CREATE TABLE `client_surveys` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `client_id` int(11) NOT NULL, + `survey_id` int(11) NOT NULL, + `status` enum('pending','completed') NOT NULL DEFAULT 'pending', + `completed_at` timestamp NULL DEFAULT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + KEY `client_id` (`client_id`), + KEY `survey_id` (`survey_id`), + CONSTRAINT `client_surveys_ibfk_1` FOREIGN KEY (`client_id`) REFERENCES `clients` (`id`) ON DELETE CASCADE, + CONSTRAINT `client_surveys_ibfk_2` FOREIGN KEY (`survey_id`) REFERENCES `surveys` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; diff --git a/db/migrations/029_create_survey_responses_table.sql b/db/migrations/029_create_survey_responses_table.sql new file mode 100644 index 0000000..a4ea25f --- /dev/null +++ b/db/migrations/029_create_survey_responses_table.sql @@ -0,0 +1,13 @@ + +CREATE TABLE `survey_responses` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `client_survey_id` int(11) NOT NULL, + `question_id` int(11) NOT NULL, + `response` text, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + KEY `client_survey_id` (`client_survey_id`), + KEY `question_id` (`question_id`), + CONSTRAINT `survey_responses_ibfk_1` FOREIGN KEY (`client_survey_id`) REFERENCES `client_surveys` (`id`) ON DELETE CASCADE, + CONSTRAINT `survey_responses_ibfk_2` FOREIGN KEY (`question_id`) REFERENCES `survey_questions` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; diff --git a/db/migrations/030_create_content_table.sql b/db/migrations/030_create_content_table.sql new file mode 100644 index 0000000..5c0b5aa --- /dev/null +++ b/db/migrations/030_create_content_table.sql @@ -0,0 +1,44 @@ +-- +-- Table structure for table `content` +-- + +CREATE TABLE `content` ( + `id` int(11) NOT NULL, + `coach_id` int(11) NOT NULL, + `title` varchar(255) NOT NULL, + `description` text DEFAULT NULL, + `file_path` varchar(255) NOT NULL, + `file_type` varchar(50) DEFAULT NULL, + `created_at` timestamp NOT NULL DEFAULT current_timestamp() +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- +-- Indexes for dumped tables +-- + +-- +-- Indexes for table `content` +-- +ALTER TABLE `content` + ADD PRIMARY KEY (`id`), + ADD KEY `coach_id` (`coach_id`); + +-- +-- AUTO_INCREMENT for dumped tables +-- + +-- +-- AUTO_INCREMENT for table `content` +-- +ALTER TABLE `content` + MODIFY `id` int(11) NOT NULL AUTO_INCREMENT; + +-- +-- Constraints for dumped tables +-- + +-- +-- Constraints for table `content` +-- +ALTER TABLE `content` + ADD CONSTRAINT `content_ibfk_1` FOREIGN KEY (`coach_id`) REFERENCES `coaches` (`id`) ON DELETE CASCADE; diff --git a/db/migrations/031_create_client_content_table.sql b/db/migrations/031_create_client_content_table.sql new file mode 100644 index 0000000..6861675 --- /dev/null +++ b/db/migrations/031_create_client_content_table.sql @@ -0,0 +1,43 @@ +-- +-- Table structure for table `client_content` +-- + +CREATE TABLE `client_content` ( + `id` int(11) NOT NULL, + `client_id` int(11) NOT NULL, + `content_id` int(11) NOT NULL, + `assigned_at` timestamp NOT NULL DEFAULT current_timestamp() +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- +-- Indexes for dumped tables +-- + +-- +-- Indexes for table `client_content` +-- +ALTER TABLE `client_content` + ADD PRIMARY KEY (`id`), + ADD KEY `client_id` (`client_id`), + ADD KEY `content_id` (`content_id`); + +-- +-- AUTO_INCREMENT for dumped tables +-- + +-- +-- AUTO_INCREMENT for table `client_content` +-- +ALTER TABLE `client_content` + MODIFY `id` int(11) NOT NULL AUTO_INCREMENT; + +-- +-- Constraints for dumped tables +-- + +-- +-- Constraints for table `client_content` +-- +ALTER TABLE `client_content` + ADD CONSTRAINT `client_content_ibfk_1` FOREIGN KEY (`client_id`) REFERENCES `clients` (`id`) ON DELETE CASCADE, + ADD CONSTRAINT `client_content_ibfk_2` FOREIGN KEY (`content_id`) REFERENCES `content` (`id`) ON DELETE CASCADE; diff --git a/db/migrations/032_create_package_content_table.sql b/db/migrations/032_create_package_content_table.sql new file mode 100644 index 0000000..56022b8 --- /dev/null +++ b/db/migrations/032_create_package_content_table.sql @@ -0,0 +1,43 @@ +-- +-- Table structure for table `package_content` +-- + +CREATE TABLE `package_content` ( + `id` int(11) NOT NULL, + `package_id` int(11) NOT NULL, + `content_id` int(11) NOT NULL, + `delay_days` int(11) DEFAULT 0 +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- +-- Indexes for dumped tables +-- + +-- +-- Indexes for table `package_content` +-- +ALTER TABLE `package_content` + ADD PRIMARY KEY (`id`), + ADD KEY `package_id` (`package_id`), + ADD KEY `content_id` (`content_id`); + +-- +-- AUTO_INCREMENT for dumped tables +-- + +-- +-- AUTO_INCREMENT for table `package_content` +-- +ALTER TABLE `package_content` + MODIFY `id` int(11) NOT NULL AUTO_INCREMENT; + +-- +-- Constraints for dumped tables +-- + +-- +-- Constraints for table `package_content` +-- +ALTER TABLE `package_content` + ADD CONSTRAINT `package_content_ibfk_1` FOREIGN KEY (`package_id`) REFERENCES `service_packages` (`id`) ON DELETE CASCADE, + ADD CONSTRAINT `package_content_ibfk_2` FOREIGN KEY (`content_id`) REFERENCES `content` (`id`) ON DELETE CASCADE; diff --git a/db/migrations/033_alter_service_packages_table.sql b/db/migrations/033_alter_service_packages_table.sql new file mode 100644 index 0000000..cf2c940 --- /dev/null +++ b/db/migrations/033_alter_service_packages_table.sql @@ -0,0 +1,7 @@ +-- 033_alter_service_packages_table.sql +ALTER TABLE service_packages +ADD COLUMN package_type ENUM('individual', 'group', 'workshop') NOT NULL DEFAULT 'individual', +ADD COLUMN max_clients INT, +ADD COLUMN start_date DATETIME, +ADD COLUMN end_date DATETIME, +ADD COLUMN payment_plan TEXT; diff --git a/db/migrations/034_create_package_service_items_table.sql b/db/migrations/034_create_package_service_items_table.sql new file mode 100644 index 0000000..40c3ad5 --- /dev/null +++ b/db/migrations/034_create_package_service_items_table.sql @@ -0,0 +1,10 @@ +-- 034_create_package_service_items_table.sql +CREATE TABLE IF NOT EXISTS package_service_items ( + id INT AUTO_INCREMENT PRIMARY KEY, + package_id INT NOT NULL, + service_type ENUM('individual_session', 'group_session') NOT NULL, + quantity INT NOT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + FOREIGN KEY (package_id) REFERENCES service_packages(id) ON DELETE CASCADE +); diff --git a/db/migrations/035_add_package_id_to_client_subscriptions.sql b/db/migrations/035_add_package_id_to_client_subscriptions.sql new file mode 100644 index 0000000..49fe08b --- /dev/null +++ b/db/migrations/035_add_package_id_to_client_subscriptions.sql @@ -0,0 +1,2 @@ +ALTER TABLE `client_subscriptions` ADD `package_id` INT NOT NULL AFTER `client_id`; +ALTER TABLE `client_subscriptions` ADD FOREIGN KEY (`package_id`) REFERENCES `service_packages`(`id`) ON DELETE CASCADE; \ No newline at end of file diff --git a/db/migrations/036_add_buffer_time_to_coaches.sql b/db/migrations/036_add_buffer_time_to_coaches.sql new file mode 100644 index 0000000..49c92e8 --- /dev/null +++ b/db/migrations/036_add_buffer_time_to_coaches.sql @@ -0,0 +1 @@ +ALTER TABLE coaches ADD COLUMN buffer_time INT NOT NULL DEFAULT 0; \ No newline at end of file diff --git a/db/migrations/037_add_timezone_to_coaches.sql b/db/migrations/037_add_timezone_to_coaches.sql new file mode 100644 index 0000000..284a178 --- /dev/null +++ b/db/migrations/037_add_timezone_to_coaches.sql @@ -0,0 +1 @@ +ALTER TABLE coaches ADD COLUMN timezone VARCHAR(255) NOT NULL DEFAULT 'UTC'; \ No newline at end of file diff --git a/db/migrations/038_add_timezone_to_clients.sql b/db/migrations/038_add_timezone_to_clients.sql new file mode 100644 index 0000000..abd65ed --- /dev/null +++ b/db/migrations/038_add_timezone_to_clients.sql @@ -0,0 +1 @@ +ALTER TABLE clients ADD COLUMN timezone VARCHAR(255) NOT NULL DEFAULT 'UTC'; \ No newline at end of file diff --git a/db/migrations/039_add_email_to_coaches.sql b/db/migrations/039_add_email_to_coaches.sql new file mode 100644 index 0000000..e544133 --- /dev/null +++ b/db/migrations/039_add_email_to_coaches.sql @@ -0,0 +1 @@ +ALTER TABLE coaches ADD COLUMN email VARCHAR(255) NOT NULL UNIQUE; \ No newline at end of file diff --git a/db/migrations/040_add_password_to_coaches.sql b/db/migrations/040_add_password_to_coaches.sql new file mode 100644 index 0000000..49ae279 --- /dev/null +++ b/db/migrations/040_add_password_to_coaches.sql @@ -0,0 +1 @@ +ALTER TABLE coaches ADD COLUMN password VARCHAR(255) NOT NULL; \ No newline at end of file diff --git a/db/migrations/041_create_discounts_table.sql b/db/migrations/041_create_discounts_table.sql new file mode 100644 index 0000000..dfb4cfa --- /dev/null +++ b/db/migrations/041_create_discounts_table.sql @@ -0,0 +1,14 @@ + +CREATE TABLE IF NOT EXISTS `discounts` ( + `id` INT PRIMARY KEY AUTO_INCREMENT, + `code` VARCHAR(255) NOT NULL UNIQUE, + `type` ENUM('percentage', 'fixed') NOT NULL, + `value` DECIMAL(10, 2) NOT NULL, + `start_date` DATETIME, + `end_date` DATETIME, + `uses_limit` INT, + `times_used` INT DEFAULT 0, + `is_active` BOOLEAN DEFAULT TRUE, + `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP +); diff --git a/db/migrations/042_create_gift_codes_table.sql b/db/migrations/042_create_gift_codes_table.sql new file mode 100644 index 0000000..4369851 --- /dev/null +++ b/db/migrations/042_create_gift_codes_table.sql @@ -0,0 +1,14 @@ + +CREATE TABLE IF NOT EXISTS `gift_codes` ( + `id` INT PRIMARY KEY AUTO_INCREMENT, + `code` VARCHAR(255) NOT NULL UNIQUE, + `package_id` INT NOT NULL, + `stripe_checkout_session_id` VARCHAR(255) NOT NULL, + `is_redeemed` BOOLEAN DEFAULT FALSE, + `redeemed_by_client_id` INT, + `redeemed_at` DATETIME, + `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + FOREIGN KEY (`package_id`) REFERENCES `service_packages`(`id`), + FOREIGN KEY (`redeemed_by_client_id`) REFERENCES `clients`(`id`) +); diff --git a/db/migrations/043_alter_service_packages_for_payment_plans.sql b/db/migrations/043_alter_service_packages_for_payment_plans.sql new file mode 100644 index 0000000..2a3cd2b --- /dev/null +++ b/db/migrations/043_alter_service_packages_for_payment_plans.sql @@ -0,0 +1,7 @@ + +ALTER TABLE `service_packages` +ADD COLUMN `payment_type` ENUM('one_time', 'subscription', 'payment_plan') NOT NULL DEFAULT 'one_time', +ADD COLUMN `deposit_amount` DECIMAL(10, 2) DEFAULT NULL, +ADD COLUMN `installments` INT DEFAULT NULL, +ADD COLUMN `installment_interval` ENUM('day', 'week', 'month', 'year') DEFAULT NULL, +ADD COLUMN `pay_in_full_discount_percentage` DECIMAL(5, 2) DEFAULT NULL; diff --git a/db/migrations/044_create_sms_logs_table.sql b/db/migrations/044_create_sms_logs_table.sql new file mode 100644 index 0000000..f9ddd21 --- /dev/null +++ b/db/migrations/044_create_sms_logs_table.sql @@ -0,0 +1,13 @@ +CREATE TABLE IF NOT EXISTS `sms_logs` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `client_id` int(11) DEFAULT NULL, + `user_id` int(11) DEFAULT NULL, + `sender` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `recipient` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `message` text COLLATE utf8mb4_unicode_ci NOT NULL, + `status` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL, + `created_at` timestamp NOT NULL DEFAULT current_timestamp(), + PRIMARY KEY (`id`), + KEY `client_id` (`client_id`), + KEY `user_id` (`user_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; diff --git a/decline-booking.php b/decline-booking.php new file mode 100644 index 0000000..0d2a737 --- /dev/null +++ b/decline-booking.php @@ -0,0 +1,69 @@ +prepare("SELECT * FROM bookings WHERE id = ? AND coach_id = ?"); +$stmt->execute([$booking_id, $coach_id]); +$booking = $stmt->fetch(); + +if ($booking) { + if (!empty($booking['stripe_payment_intent_id'])) { + try { + $refund = \Stripe\Refund::create([ + 'payment_intent' => $booking['stripe_payment_intent_id'], + ]); + + if ($refund->status == 'succeeded') { + $stmt = db()->prepare("UPDATE bookings SET status = 'declined', payment_status = 'refunded' WHERE id = ?"); + $stmt->execute([$booking_id]); + } else { + header('Location: dashboard.php?status=error'); + exit; + } + } catch (\Stripe\Exception\ApiErrorException $e) { + error_log('Stripe API error: ' . $e->getMessage()); + header('Location: dashboard.php?status=error'); + exit; + } + } else { + $stmt = db()->prepare("UPDATE bookings SET status = 'declined' WHERE id = ?"); + $stmt->execute([$booking_id]); + } + + // Notify client + $stmt = db()->prepare("SELECT c.email, c.name as client_name, co.name as coach_name, b.booking_time FROM bookings b JOIN clients c ON b.client_id = c.id JOIN coaches co ON b.coach_id = co.id WHERE b.id = ?"); + $stmt->execute([$booking_id]); + $booking_details = $stmt->fetch(); + + if ($booking_details) { + $to = $booking_details['email']; + $subject = 'Booking Declined and Refunded'; + $body = "

Hello " . htmlspecialchars($booking_details['client_name']) . ",

"; + $body .= "

We are sorry to inform you that your booking with " . htmlspecialchars($booking_details['coach_name']) . " on " . htmlspecialchars(date('F j, Y, g:i a', strtotime($booking_details['booking_time']))) . " has been declined. A full refund has been issued.

"; + $body .= "

Thank you for using CoachConnect.

"; + + MailService::sendMail($to, $subject, $body, strip_tags($body)); + } + + header('Location: dashboard.php?status=declined'); +} else { + header('Location: dashboard.php?status=error'); +} + +exit; diff --git a/delete-availability.php b/delete-availability.php new file mode 100644 index 0000000..d0bb3d6 --- /dev/null +++ b/delete-availability.php @@ -0,0 +1,39 @@ +prepare("SELECT * FROM coach_availability WHERE id = ? AND coach_id = ?"); + $stmt->execute([$availability_id, $coach_id]); + $availability = $stmt->fetch(); + + if (!$availability) { + header('Location: dashboard.php?status=error&message=Availability+not+found'); + exit; + } + + // Delete the availability slot + $delete_stmt = db()->prepare("DELETE FROM coach_availability WHERE id = ?"); + $delete_stmt->execute([$availability_id]); + + header('Location: dashboard.php?status=success&message=Availability+deleted+successfully'); + exit; +} catch (PDOException $e) { + error_log('Error deleting availability: ' . $e->getMessage()); + header('Location: dashboard.php?status=error&message=Could+not+delete+availability'); + exit; +} diff --git a/delete-recurring-availability.php b/delete-recurring-availability.php new file mode 100644 index 0000000..eaf3c6f --- /dev/null +++ b/delete-recurring-availability.php @@ -0,0 +1,24 @@ +prepare("DELETE FROM coach_recurring_availability WHERE id = ? AND coach_id = ?"); + $stmt->execute([$availability_id, $coach_id]); + header('Location: dashboard.php?status=recurring_deleted'); + } catch (PDOException $e) { + header('Location: dashboard.php?status=error'); + } +} else { + header('Location: dashboard.php'); +} +exit; diff --git a/docuseal-webhook.php b/docuseal-webhook.php new file mode 100644 index 0000000..ba0db9c --- /dev/null +++ b/docuseal-webhook.php @@ -0,0 +1,30 @@ +submissions->retrieve($submissionId); + $documentUrl = $submission['url']; + + // Update the client_contracts table + $stmt = db()->prepare('UPDATE client_contracts SET docuseal_document_url = ? WHERE docuseal_submission_id = ?'); + $stmt->execute([$documentUrl, $submissionId]); + + } catch (Exception $e) { + // Log the error + error_log('DocuSeal webhook error: ' . $e->getMessage()); + } + } + } +} + +http_response_code(200); diff --git a/docuseal/config.php b/docuseal/config.php new file mode 100644 index 0000000..6abd1b9 --- /dev/null +++ b/docuseal/config.php @@ -0,0 +1,7 @@ +prepare("SELECT bio, specialties FROM coaches WHERE id = ?"); +$stmt->execute([$coach_id]); +$coach = $stmt->fetch(); + +$bio = $coach['bio'] ?? ''; +$specialties = $coach['specialties'] ?? ''; + +// Handle form submission for bio and specialties +if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['update_profile'])) { + $bio = trim($_POST['bio']); + $specialties = trim($_POST['specialties']); + + $stmt = $pdo->prepare("UPDATE coaches SET bio = ?, specialties = ? WHERE id = ?"); + $stmt->execute([$bio, $specialties, $coach_id]); + + header('Location: edit-portfolio.php?success=1'); + exit(); +} + +// Handle media upload +if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['upload_media'])) { + if (isset($_FILES['media']) && $_FILES['media']['error'] == 0) { + $caption = trim($_POST['caption']); + $allowed = ['jpg' => 'image/jpeg', 'jpeg' => 'image/jpeg', 'png' => 'image/png', 'gif' => 'image/gif']; + $filename = $_FILES['media']['name']; + $filetype = $_FILES['media']['type']; + $filesize = $_FILES['media']['size']; + + $ext = pathinfo($filename, PATHINFO_EXTENSION); + if (!array_key_exists($ext, $allowed)) { + die("Error: Please select a valid file format."); + } + + $maxsize = 5 * 1024 * 1024; + if ($filesize > $maxsize) { + die("Error: File size is larger than the allowed limit."); + } + + if (in_array($filetype, $allowed)) { + $new_filename = uniqid() . '.' . $ext; + $filepath = 'uploads/portfolio/' . $new_filename; + + $error_message = ''; + if (move_uploaded_file($_FILES['media']['tmp_name'], $filepath)) { + $stmt = $pdo->prepare("INSERT INTO coach_portfolio_items (coach_id, item_type, url, caption) VALUES (?, 'image', ?, ?)"); + $stmt->execute([$coach_id, $filepath, $caption]); + header('Location: edit-portfolio.php?success=2'); + exit(); + } else { + $error_message = 'Error: There was a problem uploading your file. Please try again.'; + } } + } +} + +// Handle media deletion +if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['delete_media'])) { + $item_id = $_POST['delete_item_id']; + + // First, get the file path to delete the file + $stmt = $pdo->prepare("SELECT url FROM coach_portfolio_items WHERE id = ? AND coach_id = ?"); + $stmt->execute([$item_id, $coach_id]); + $item = $stmt->fetch(); + + if ($item) { + // Delete file from server + if (file_exists($item['url'])) { + unlink($item['url']); + } + + // Delete from database + $stmt = $pdo->prepare("DELETE FROM coach_portfolio_items WHERE id = ?"); + $stmt->execute([$item_id]); + + header('Location: edit-portfolio.php?success=3'); + exit(); + } +} + +// Fetch all portfolio items for the coach +$stmt = $pdo->prepare("SELECT * FROM coach_portfolio_items WHERE coach_id = ? ORDER BY created_at DESC"); +$stmt->execute([$coach_id]); +$portfolio_items = $stmt->fetchAll(); + +?> + + + + + + Edit Portfolio + + + + + +
+

Edit Portfolio

+ + +
Portfolio updated successfully.
+ + + +
+ + +
+
+
Profile Information
+
+
+ + +
+
+ + +
+ +
+
+
+ +
+
+
Portfolio Media
+
+
+ + +
+
+ + +
+ +
+
+
+ +
+
+ <?php echo htmlspecialchars($item['caption']); ?> +
+

+
+ + +
+
+
+
+ +
+
+
+
+ + + + + + diff --git a/includes/footer.php b/includes/footer.php new file mode 100644 index 0000000..9c0896d --- /dev/null +++ b/includes/footer.php @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/includes/header.php b/includes/header.php new file mode 100644 index 0000000..3527909 --- /dev/null +++ b/includes/header.php @@ -0,0 +1,100 @@ + + + + + + + Coaching Platform + + + + + + + +
\ No newline at end of file diff --git a/index.php b/index.php index 7205f3d..42e67f6 100644 --- a/index.php +++ b/index.php @@ -1,150 +1,229 @@ -query('SELECT setting_key, setting_value FROM settings'); +$settings = $settings_stmt->fetchAll(PDO::FETCH_KEY_PAIR); +$coach_mode = $settings['coach_mode'] ?? 'multi'; +$single_coach_id = $settings['single_coach_id'] ?? null; + +if ($coach_mode === 'single' && !empty($single_coach_id)) { + header('Location: profile.php?id=' . $single_coach_id); + exit; +} ?> - + - - - New Style - - - - - - - - - - - - - - - - - - - + + + Coaching Platform + + - -
-
-

Analyzing your requirements and generating your website…

-
- Loading… -
-

AI is collecting your requirements and applying the first changes.

-

This page will update automatically as the plan is implemented.

-

Runtime: PHP — UTC

-
-
-
- Page updated: (UTC) -
- - + + + +
+ +
+ + + +
+ +
+ +

Unlock Your Potential

+ +

Find the perfect coach to help you achieve your goals.

+ + Find Your Coach + +
+ + + + + + + + + + + + + +
+ +

How It Works

+ +
+ +
+ +
1
+ +

Browse Coaches

+ +

Find the perfect coach from our curated list of experts.

+ +
+ +
+ +
2
+ +

Book a Session

+ +

Schedule a session that fits your time and needs.

+ +
+ +
+ +
3
+ +

Start Learning

+ +

Begin your journey of growth with personalized coaching.

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

© CoachConnect. All rights reserved.

+ +
+ +
+ + + + + + + + + + \ No newline at end of file diff --git a/login.php b/login.php new file mode 100644 index 0000000..48df535 --- /dev/null +++ b/login.php @@ -0,0 +1,112 @@ +prepare("SELECT * FROM clients WHERE email = ?"); + $stmt->execute([$email]); + $client = $stmt->fetch(); + + if ($client && password_verify($password, $client['password'])) { + $_SESSION['user_id'] = $client['id']; + $_SESSION['user_role'] = 'client'; + header("Location: index.php"); + exit; + } + + // Check coaches table + $stmt = $pdo->prepare("SELECT * FROM coaches WHERE email = ?"); + $stmt->execute([$email]); + $coach = $stmt->fetch(); + + if ($coach && password_verify($password, $coach['password'])) { + $_SESSION['user_id'] = $coach['id']; + $_SESSION['user_role'] = 'coach'; + header("Location: profile.php?id=" . $coach['id']); + exit; + } + + $errors[] = "Invalid email or password."; + } +} +?> + + + + + + + Login + + + + +
+

Login

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

+ Don't have a client account? Register as a Client +

+

+ Are you a coach? Register as a Coach +

+
+ + + diff --git a/logout.php b/logout.php new file mode 100644 index 0000000..f83284d --- /dev/null +++ b/logout.php @@ -0,0 +1,6 @@ + $name, + 'description' => $description, + ]); + + // Step 2: Create a Price in Stripe + $price_obj = \Stripe\Price::create([ + 'product' => $product->id, + 'unit_amount' => $price * 100, // Price in cents + 'currency' => 'usd', + ]); + + // Step 3: Save the package to the database + $stmt = db()->prepare( + 'INSERT INTO service_packages (coach_id, name, description, price, stripe_product_id, stripe_price_id, package_type, max_clients, start_date, end_date, payment_plan, num_sessions) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0)' + ); + $stmt->execute([$coach_id, $name, $description, $price, $product->id, $price_obj->id, $package_type, $max_clients, $start_date, $end_date, $payment_plan]); + $package_id = db()->lastInsertId(); + + // Step 4: Save service items + $total_sessions = 0; + foreach ($service_items as $item) { + $item_type = $item['type']; + $item_quantity = $item['quantity']; + if (!empty($item_type) && !empty($item_quantity)) { + $stmt = db()->prepare('INSERT INTO package_service_items (package_id, service_type, quantity) VALUES (?, ?, ?)'); + $stmt->execute([$package_id, $item_type, $item_quantity]); + $total_sessions += $item_quantity; + } + } + + // Step 5: Update num_sessions in service_packages + $stmt = db()->prepare('UPDATE service_packages SET num_sessions = ? WHERE id = ?'); + $stmt->execute([$total_sessions, $package_id]); + + + $success_message = 'Service package created successfully!'; + } catch (\Stripe\Exception\ApiErrorException $e) { + $error_message = 'Stripe Error: ' . $e->getMessage(); + } catch (PDOException $e) { + $error_message = 'Database Error: ' . $e->getMessage(); + } +} + +// Fetch existing packages for the coach +$stmt = db()->prepare('SELECT * FROM service_packages WHERE coach_id = ?'); +$stmt->execute([$coach_id]); +$packages = $stmt->fetchAll(); + +?> + + + + + + + Manage Service Packages + + + +
+

Manage Service Packages

+ + +
+ + +
+ + +
+
Create New Package
+
+
+
+ + +
+
+ + +
+
+
+ + +
+
+ + +
+
+ + +
+ + +
+ +
+
Service Items
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+ +
+
+
+ +
+ + +
+
+
+ +
+
Your Packages
+
+ +

You have not created any packages yet.

+ +
    + +
  • +
    +

    +

    + Price: $ | + Type: | + Total Sessions: +

    + +

    Max Clients:

    + + +

    Date: -

    + + +

    Payment Plan:

    + + + +
  • + +
+ +
+
+ + Back to Dashboard +
+ + + + \ No newline at end of file diff --git a/manage-subscription.php b/manage-subscription.php new file mode 100644 index 0000000..f58e3d2 --- /dev/null +++ b/manage-subscription.php @@ -0,0 +1,75 @@ +prepare("SELECT * FROM client_subscriptions WHERE client_id = ? AND (status = 'active' OR status = 'trialing') ORDER BY created_at DESC LIMIT 1"); +$sub_stmt->execute([$user_id]); +$subscription = $sub_stmt->fetch(); + +if (!$subscription) { + header('Location: subscribe.php'); + exit; +} + +?> + + + + + + Manage Subscription - CoachConnect + + + + +
+ +
+ +
+
+

Manage Your Subscription

+ + + + + +
+

Subscription Details

+

Status:

+

Plan:

+
+ +
+

Billing Management

+

Update your payment method and view your billing history.

+ Manage Billing +
+ +
+

Cancel Subscription

+

If you cancel, you will lose access to subscription benefits at the end of your current billing period. This action cannot be undone.

+ Cancel Subscription +
+
+
+ + + diff --git a/messages.php b/messages.php new file mode 100644 index 0000000..0cfe1cf --- /dev/null +++ b/messages.php @@ -0,0 +1,205 @@ +prepare("SELECT coach_mode, single_coach_id FROM settings ORDER BY id DESC LIMIT 1"); +$stmt->execute(); +$settings = $stmt->fetch(PDO::FETCH_ASSOC); +$coach_mode = $settings['coach_mode'] ?? 'multi'; +?> + + + + + + Messages + + + + + + + +
+
+
+
+
Conversations
+
    + +
+
+
+
+
+
Select a conversation
+
+ +
+ +
+
+
+
+ + + + + + diff --git a/payment-cancel.php b/payment-cancel.php new file mode 100644 index 0000000..86223cb --- /dev/null +++ b/payment-cancel.php @@ -0,0 +1,26 @@ + + + + + + + Payment Cancelled + + + +
+ +
+ + diff --git a/payment-success.php b/payment-success.php new file mode 100644 index 0000000..a476afd --- /dev/null +++ b/payment-success.php @@ -0,0 +1,50 @@ +payment_status === 'paid') { + $booking_details = $_SESSION['pending_booking']; + $pdo = db(); + $stmt = $pdo->prepare("INSERT INTO bookings (coach_id, client_id, booking_time, stripe_payment_intent_id, payment_status) VALUES (?, ?, ?, ?, 'paid')"); + $stmt->execute([$booking_details['coach_id'], $booking_details['client_id'], $booking_details['booking_time'], $checkout_session->payment_intent]); + + // Send email notification to coach + require_once __DIR__ . '/mail/MailService.php'; + $coach_stmt = $pdo->prepare("SELECT email FROM coaches WHERE id = ?"); + $coach_stmt->execute([$booking_details['coach_id']]); + $coach = $coach_stmt->fetch(); + + $client_stmt = $pdo->prepare("SELECT name FROM clients WHERE id = ?"); + $client_stmt->execute([$booking_details['client_id']]); + $client = $client_stmt->fetch(); + + if ($coach && $client) { + $to = $coach['email']; + $subject = 'New Booking Confirmation'; + $message = "You have a new booking from {$client['name']} for {$booking_details['booking_time']}."; + MailService::sendMail($to, $subject, $message, $message); + } + + // Clear the pending booking from the session + unset($_SESSION['pending_booking']); + + header('Location: dashboard.php?booking=success'); + exit; + } else { + header('Location: payment-cancel.php?reason=payment_not_complete'); + exit; + } +} catch (\Stripe\Exception\ApiErrorException $e) { + // Handle error + header('Location: payment-cancel.php?reason=invalid_session'); + exit; +} diff --git a/profile.php b/profile.php new file mode 100644 index 0000000..e0163bf --- /dev/null +++ b/profile.php @@ -0,0 +1,405 @@ +query('SELECT setting_key, setting_value FROM settings'); +$settings = $settings_stmt->fetchAll(PDO::FETCH_KEY_PAIR); +$coach_mode = $settings['coach_mode'] ?? 'multi'; + +$coach_id = $_GET['id'] ?? null; +$coach = null; +$error_message = ''; +$reviews = []; +$average_rating = 0; + +if ($coach_id) { + try { + $pdo = db(); + $stmt = $pdo->prepare("SELECT * FROM coaches WHERE id = ?"); + $stmt->execute([$coach_id]); + $coach = $stmt->fetch(); + if (!$coach) { + $error_message = 'Coach not found.'; + } else { + $stmt = $pdo->prepare("SELECT r.*, c.name as client_name FROM reviews r JOIN clients c ON r.client_id = c.id WHERE r.coach_id = ? ORDER BY r.created_at DESC"); + $stmt->execute([$coach_id]); + $reviews = $stmt->fetchAll(); + + $portfolio_stmt = $pdo->prepare("SELECT * FROM coach_portfolio_items WHERE coach_id = ? ORDER BY created_at DESC"); + $portfolio_stmt->execute([$coach_id]); + $portfolio_items = $portfolio_stmt->fetchAll(); + + if (count($reviews) > 0) { + $total_rating = 0; + foreach ($reviews as $review) { + $total_rating += $review['rating']; + } + $average_rating = round($total_rating / count($reviews), 1); + } + } + } catch (PDOException $e) { + $error_message = 'Error fetching coach details: ' . $e->getMessage(); + } +} else { + $error_message = 'No coach ID specified.'; +} +?> + + + + + + <?php echo $coach ? htmlspecialchars($coach['name']) : 'Coach Profile'; ?> - CoachConnect + + + + + + +
+ +
+ +
+ + + + + +
+
+
+ <?php echo htmlspecialchars($coach['name']); ?> +
+
+

+

+
+ + Message + +
+
+
+ + +

Portfolio

+
+ +
+ <?php echo htmlspecialchars($item['caption']); ?> + +
+

+
+ +
+ +
+ + + + prepare('SELECT * FROM service_packages WHERE coach_id = ?'); + $package_stmt->execute([$coach_id]); + $packages = $package_stmt->fetchAll(PDO::FETCH_ASSOC); + ?> + +
+

Coaching Packages

+
+ + prepare('SELECT SUM(quantity) as total_sessions FROM package_service_items WHERE package_id = ? AND service_type IN ("one_on_one", "group_session")'); + $items_stmt->execute([$package['id']]); + $items_result = $items_stmt->fetch(); + $total_sessions = $items_result['total_sessions'] ?? 0; + ?> +
+

+

+
+
+ + + $ + + $ / for installments + + + 0): ?> + for sessions + +
+ Purchase +
+
+ Type: + + | Client Limit: + + + | Starts: + + + | Ends: + +
+
+ +
+
+ + + prepare("SELECT cp.*, sp.name FROM client_packages cp JOIN service_packages sp ON cp.package_id = sp.id WHERE cp.client_id = ? AND sp.coach_id = ? AND cp.sessions_remaining > 0"); + $packages_stmt->execute([$client_id, $coach_id]); + $client_packages = $packages_stmt->fetchAll(); + + if ($client_packages) { + echo ''; + } + } + ?> + + +
+

Select a Date

+
+

Available Time Slots

+
+ +
+ + +
+

Reviews

+ 0): ?> +
+

Average Rating: / 5

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

+ +
+ + + + + +
+
+

+
+ +
+ +

No reviews yet.

+ +
+ + +
+

Error

+

+ Back to Home +
+ +
+ +
+
+

© CoachConnect. All rights reserved.

+
+
+ + + + + diff --git a/purchase-gift-success.php b/purchase-gift-success.php new file mode 100644 index 0000000..10fc6d2 --- /dev/null +++ b/purchase-gift-success.php @@ -0,0 +1,49 @@ +prepare('SELECT * FROM gift_codes WHERE stripe_checkout_session_id = ?'); +$stmt->execute([$stripe_checkout_session_id]); +$gift_code_entry = $stmt->fetch(); + +if ($gift_code_entry) { + $gift_code = $gift_code_entry['code']; +} else { + // Generate a unique gift code + $gift_code = 'GIFT-' . strtoupper(bin2hex(random_bytes(8))); + $package_id = $session->metadata->package_id; + + $stmt = db()->prepare('INSERT INTO gift_codes (code, package_id, stripe_checkout_session_id) VALUES (?, ?, ?)'); + $stmt->execute([$gift_code, $package_id, $stripe_checkout_session_id]); +} + +?> + +
+
+

Purchase Successful!

+

Thank you for your purchase. Here is your gift code. Share it with the recipient!

+

+
+ Go to Dashboard +
+ +prepare('SELECT * FROM service_packages WHERE id = ?'); +$stmt->execute([$package_id]); +$package = $stmt->fetch(); + +if (!$package) { + header('Location: coaches.php?error=invalid_package'); + exit; +} +?> + +
+

Purchase Gift

+
+
+
+
Package:
+
+

+

Price: $

+ +
+ + +
+ + + +
+
+ +
+
+
+
+
+
+ + + + diff --git a/purchase-package-cancel.php b/purchase-package-cancel.php new file mode 100644 index 0000000..619db18 --- /dev/null +++ b/purchase-package-cancel.php @@ -0,0 +1,23 @@ + + + + + + + Purchase Cancelled + + + +
+ + Go to Dashboard +
+ + diff --git a/purchase-package-success.php b/purchase-package-success.php new file mode 100644 index 0000000..6fb4eee --- /dev/null +++ b/purchase-package-success.php @@ -0,0 +1,103 @@ + ['subscription']]); + + $package_id = $checkout_session->metadata->package_id; + $client_id = $checkout_session->metadata->client_id; + $is_gift = $checkout_session->metadata->is_gift ?? false; + + if ($is_gift) { + header('Location: purchase-gift-success.php?session_id=' . $checkout_session_id); + exit; + } + + // Check if this purchase has already been processed + if ($checkout_session->mode === 'payment') { + $check_stmt = db()->prepare('SELECT id FROM client_packages WHERE stripe_checkout_session_id = ?'); + $check_stmt->execute([$checkout_session_id]); + if ($check_stmt->fetch()) { + header('Location: dashboard.php?purchase=already_processed'); + exit; + } + } elseif ($checkout_session->mode === 'subscription') { + $check_stmt = db()->prepare('SELECT id FROM client_subscriptions WHERE stripe_subscription_id = ?'); + $check_stmt->execute([$checkout_session->subscription->id]); + if ($check_stmt->fetch()) { + header('Location: dashboard.php?purchase=already_processed'); + exit; + } + } + + if ($checkout_session->payment_status === 'paid') { + if (isset($checkout_session->metadata->coupon_code) && $checkout_session->metadata->coupon_code) { + $coupon_code = $checkout_session->metadata->coupon_code; + $stmt = db()->prepare('UPDATE discounts SET times_used = times_used + 1 WHERE code = ?'); + $stmt->execute([$coupon_code]); + } + if ($checkout_session->mode === 'payment') { + $stmt = db()->prepare('SELECT SUM(quantity) as total_sessions FROM package_service_items WHERE package_id = ? AND service_type IN ( 'one_on_one', 'group_session ')'); + $stmt->execute([$package_id]); + $result = $stmt->fetch(); + $total_sessions = $result['total_sessions'] ?? 0; + + $insert_stmt = db()->prepare( + 'INSERT INTO client_packages (client_id, package_id, sessions_remaining, stripe_checkout_session_id) VALUES (?, ?, ?, ?)' + ); + $insert_stmt->execute([$client_id, $package_id, $total_sessions, $checkout_session_id]); + } elseif ($checkout_session->mode === 'subscription') { + $subscription = $checkout_session->subscription; + + $insert_stmt = db()->prepare( + 'INSERT INTO client_subscriptions (client_id, package_id, stripe_subscription_id, stripe_product_id, status, start_date, end_date) VALUES (?, ?, ?, ?, ?, FROM_UNIXTIME(?), NULL)' + ); + $insert_stmt->execute([ + $client_id, + $package_id, + $subscription->id, + $subscription->items->data[0]->price->product, + $subscription->status, + $subscription->current_period_start + ]); + + // Also create a client_packages record for the initial set of sessions + $stmt = db()->prepare('SELECT SUM(quantity) as total_sessions FROM package_service_items WHERE package_id = ? AND service_type IN ( 'one_on_one', 'group_session ')'); + $stmt->execute([$package_id]); + $result = $stmt->fetch(); + $total_sessions = $result['total_sessions'] ?? 0; + + $insert_stmt = db()->prepare( + 'INSERT INTO client_packages (client_id, package_id, sessions_remaining, stripe_checkout_session_id) VALUES (?, ?, ?, ?)' + ); + $insert_stmt->execute([$client_id, $package_id, $total_sessions, $checkout_session_id]); + } + + header('Location: dashboard.php?purchase=success'); + exit; + } else { + header('Location: dashboard.php?error=payment_not_successful'); + exit; + } +} catch ( Stripe Exception ApiErrorException $e) { + header('Location: dashboard.php?error=stripe_error&message=' . urlencode($e->getMessage())); + exit; +} catch (PDOException $e) { + header('Location: dashboard.php?error=db_error&message=' . urlencode($e->getMessage())); + exit; +} \ No newline at end of file diff --git a/purchase-package.php b/purchase-package.php new file mode 100644 index 0000000..592a405 --- /dev/null +++ b/purchase-package.php @@ -0,0 +1,110 @@ +prepare('SELECT * FROM service_packages WHERE id = ?'); +$stmt->execute([$package_id]); +$package = $stmt->fetch(); + +if (!$package) { + header('Location: coaches.php?error=invalid_package'); + exit; +} +?> + +
+

Purchase Package

+
+
+
+
+
+

+ +
+ + + +

Payment Options

+
+ + + +
+
+ + +
+ +

Price: $

+ + +
+ + + +
+
+ +
+
+
+
+
+
+ + + + \ No newline at end of file diff --git a/redeem-gift.php b/redeem-gift.php new file mode 100644 index 0000000..2b9d623 --- /dev/null +++ b/redeem-gift.php @@ -0,0 +1,77 @@ +prepare('SELECT * FROM gift_codes WHERE code = ?'); + $stmt->execute([$gift_code]); + $gift = $stmt->fetch(); + + if (!$gift) { + $error = 'Invalid gift code.'; + } elseif ($gift['is_redeemed']) { + $error = 'This gift code has already been redeemed.'; + } else { + // Assign the package to the user + $package_id = $gift['package_id']; + + $stmt = db()->prepare('SELECT SUM(quantity) as total_sessions FROM package_service_items WHERE package_id = ? AND service_type IN (\'one_on_one\',\'group_session\')'); + $stmt->execute([$package_id]); + $result = $stmt->fetch(); + $total_sessions = $result['total_sessions'] ?? 0; + + $insert_stmt = db()->prepare( + 'INSERT INTO client_packages (client_id, package_id, sessions_remaining) VALUES (?, ?, ?)' + ); + $insert_stmt->execute([$client_id, $package_id, $total_sessions]); + + // Mark the code as redeemed + $update_stmt = db()->prepare( + 'UPDATE gift_codes SET is_redeemed = 1, redeemed_by_client_id = ?, redeemed_at = NOW() WHERE id = ?' + ); + $update_stmt->execute([$client_id, $gift['id']]); + + $success = 'Gift redeemed successfully! The package has been added to your account.'; + } +} +?> + +
+

Redeem Gift

+

Enter your gift code below to redeem your package.

+ + +
+ + + +
+ Go to Dashboard + +
+
+
+
+ + +
+ +
+
+
+ +
+ + diff --git a/refund.php b/refund.php new file mode 100644 index 0000000..29d539e --- /dev/null +++ b/refund.php @@ -0,0 +1,25 @@ + + +
+
+
+

Refund Booking

+

This page will be used to process refunds for a booking.

+
+
+
+ + diff --git a/register-client.php b/register-client.php new file mode 100644 index 0000000..269fddf --- /dev/null +++ b/register-client.php @@ -0,0 +1,126 @@ +prepare("INSERT INTO clients (name, email, password, timezone) VALUES (?, ?, ?, ?)"); + $stmt->execute([$name, $email, $hashed_password, $timezone]); + $client_id = $pdo->lastInsertId(); + + $customer = \Stripe\Customer::create([ + 'email' => $email, + 'name' => $name, + ]); + $stripe_customer_id = $customer->id; + + $stmt = $pdo->prepare("UPDATE clients SET stripe_customer_id = ? WHERE id = ?"); + $stmt->execute([$stripe_customer_id, $client_id]); + + $_SESSION['user_id'] = $client_id; + $_SESSION['user_type'] = 'client'; + + header("Location: sign-contract.php"); + exit; + } catch (PDOException $e) { + if ($e->getCode() == 23000) { // Integrity constraint violation + $errors[] = "Email address already registered."; + } else { + $errors[] = "Database error: " . $e->getMessage(); + } + } + } +} +?> + + + + + + + Client Registration + + + + +
+

Create Your Client Account

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

+ Already have an account? Login +

+
+ + + diff --git a/register-coach.php b/register-coach.php new file mode 100644 index 0000000..1e7dee9 --- /dev/null +++ b/register-coach.php @@ -0,0 +1,113 @@ +prepare("INSERT INTO coaches (name, email, password, specialty, bio, photo_url, timezone) VALUES (?, ?, ?, ?, ?, ?, ?)"); + $stmt->execute([$name, $email, $hashed_password, $specialty, $bio, $photo_url, $timezone]); + $message = 'Success! Your profile has been created. You can now log in.'; + } catch (PDOException $e) { + if ($e->errorInfo[1] == 1062) { + $message = 'Error: An account with this email address already exists.'; + } else { + $message = 'Error: Could not create profile. ' . $e->getMessage(); + } + } + } else { + $message = 'Error: Name, email, password, and specialty are required.'; + } +} +$timezones = DateTimeZone::listIdentifiers(DateTimeZone::ALL); +?> + + + + + + Register as a Coach - CoachConnect + + + + + +
+ +
+ +
+
+

Create Your Coach Profile

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

© CoachConnect. All rights reserved.

+
+
+ + + diff --git a/review-booking.php b/review-booking.php new file mode 100644 index 0000000..64357bc --- /dev/null +++ b/review-booking.php @@ -0,0 +1,113 @@ +prepare("SELECT * FROM bookings WHERE id = ? AND client_id = ? AND status = 'completed'"); +$stmt->execute([$booking_id, $client_id]); +$booking = $stmt->fetch(); + +if (!$booking) { + header('Location: dashboard.php?status=error'); + exit; +} + +// Check if already reviewed +$stmt = db()->prepare("SELECT id FROM reviews WHERE booking_id = ?"); +$stmt->execute([$booking_id]); +if ($stmt->fetch()) { + header('Location: dashboard.php?status=already_reviewed'); + exit; +} + +if ($_SERVER['REQUEST_METHOD'] === 'POST') { + $rating = $_POST['rating'] ?? null; + $review = $_POST['review'] ?? null; + $coach_id = $booking['coach_id']; + + if ($rating && $rating >= 1 && $rating <= 5) { + $stmt = db()->prepare("INSERT INTO reviews (booking_id, coach_id, client_id, rating, review) VALUES (?, ?, ?, ?, ?)"); + $stmt->execute([$booking_id, $coach_id, $client_id, $rating, $review]); + header('Location: dashboard.php?status=review_success'); + exit; + } else { + $error = "Please select a rating between 1 and 5."; + } +} + +?> + + + + + + Review Booking - CoachConnect + + + + + +
+ +
+ +
+
+

Review Your Session

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

© CoachConnect. All rights reserved.

+
+
+ + + diff --git a/sign-contract.php b/sign-contract.php new file mode 100644 index 0000000..0dee1e6 --- /dev/null +++ b/sign-contract.php @@ -0,0 +1,74 @@ +prepare('SELECT email FROM clients WHERE id = ?'); +$stmt->execute([$client_id]); +$client = $stmt->fetch(); + +if (!$client) { + // Client not found + header('Location: dashboard.php'); + exit; +} + +// Fetch the latest contract +$stmt = db()->query('SELECT * FROM contracts ORDER BY created_at DESC LIMIT 1'); +$contract = $stmt->fetch(); + +if (!$contract) { + // No contract found, so redirect to dashboard + header('Location: dashboard.php'); + exit; +} + +try { + $submission = $docuseal->submissions->create([ + 'template_id' => DOCUSEAL_TEMPLATE_ID, + 'submitters' => [ + [ + 'email' => $client['email'], + 'role' => $contract['role'] + ] + ], + 'custom_fields' => [ + ['name' => 'contract_content', 'value' => $contract['content']] + ] + ]); + + // Store the submission ID + $stmt = db()->prepare('INSERT INTO client_contracts (client_id, contract_id, docuseal_submission_id) VALUES (?, ?, ?)'); + $stmt->execute([$client_id, $contract['id'], $submission['id']]); + +} catch (Exception $e) { + // Handle API errors + echo 'Error creating DocuSeal submission: ' . $e->getMessage(); + exit; +} + +?> + +
+

Sign Your Contract

+

Please review and sign the following contract to complete your registration.

+ +
+
+

+
+
+ +
+
+
+ + diff --git a/signed-contracts.php b/signed-contracts.php new file mode 100644 index 0000000..df300b4 --- /dev/null +++ b/signed-contracts.php @@ -0,0 +1,49 @@ +prepare('SELECT cc.id, cc.signed_at, c.title FROM client_contracts cc JOIN contracts c ON cc.contract_id = c.id WHERE cc.client_id = ? ORDER BY cc.signed_at DESC'); +$stmt->execute([$client_id]); +$signed_contracts = $stmt->fetchAll(); + +?> + +
+

Your Signed Contracts

+

Here is a list of all the contracts you have signed.

+ + + + + + + + + + + + + + + + + + + + + + + +
Contract TitleDate SignedActions
+ View +
You have not signed any contracts yet.
+
+ + diff --git a/stripe/config.php b/stripe/config.php new file mode 100644 index 0000000..c0e7d21 --- /dev/null +++ b/stripe/config.php @@ -0,0 +1,26 @@ + [ + 'name' => 'Basic Subscription', + 'price' => 10000, // in cents, e.g., $100.00 + 'currency' => 'usd', + 'interval' => 'month', + 'sessions' => 4, + ], + 'monthly-premium' => [ + 'name' => 'Premium Subscription', + 'price' => 18000, // in cents, e.g., $180.00 + 'currency' => 'usd', + 'interval' => 'month', + 'sessions' => 8, + ], +]; diff --git a/stripe/init.php b/stripe/init.php new file mode 100644 index 0000000..041be41 --- /dev/null +++ b/stripe/init.php @@ -0,0 +1,5 @@ +getMessage()); + http_response_code(400); + exit(); +} catch(\Stripe\Exception\SignatureVerificationException $e) { + // Invalid signature + log_webhook_event("Error: Invalid signature. " . $e->getMessage()); + http_response_code(400); + exit(); +} + +log_webhook_event("Received event: " . $event->type); +log_webhook_event(json_encode($event->data->object)); + + +// Handle the event +switch ($event->type) { + case 'checkout.session.completed': + $session = $event->data->object; + $metadata = $session->metadata; + + // --- Idempotency Check --- + // Check if we have already processed this session for a package or gift + $stmt_check = db()->prepare("SELECT id FROM client_packages WHERE stripe_session_id = ? UNION SELECT id FROM gift_codes WHERE stripe_session_id = ?"); + $stmt_check->execute([$session->id, $session->id]); + if ($stmt_check->fetch()) { + log_webhook_event("Event {$session->id} already processed. Exiting."); + http_response_code(200); + exit(); + } + + // --- Validate Metadata --- + $client_id = $metadata->client_id ?? null; + $package_id = $metadata->package_id ?? null; + $payment_option = $metadata->payment_option ?? 'full_price'; // e.g., 'full_price', 'deposit' + $is_gift = $metadata->is_gift === 'true'; + + if (!$client_id || !$package_id) { + log_webhook_event("Webhook Error: Missing client_id or package_id in session metadata for session {$session->id}."); + http_response_code(400); + exit(); + } + + // --- Get Package and Client Details --- + $stmt_pkg = db()->prepare("SELECT * FROM service_packages WHERE id = ?"); + $stmt_pkg->execute([$package_id]); + $package = $stmt_pkg->fetch(PDO::FETCH_ASSOC); + + $stmt_client = db()->prepare("SELECT * FROM clients WHERE id = ?"); + $stmt_client->execute([$client_id]); + $client = $stmt_client->fetch(PDO::FETCH_ASSOC); + + if (!$package || !$client) { + log_webhook_event("Webhook Error: Package or Client not found for session {$session->id}."); + http_response_code(404); + exit(); + } + + // --- Update Client with Stripe Customer ID --- + $stripe_customer_id = $session->customer ?? $client['stripe_customer_id']; + if ($stripe_customer_id && empty($client['stripe_customer_id'])) { + $update_stmt = db()->prepare("UPDATE clients SET stripe_customer_id = ? WHERE id = ?"); + $update_stmt->execute([$stripe_customer_id, $client_id]); + log_webhook_event("Updated stripe_customer_id for client {$client_id}."); + } + + // --- Handle Purchase based on Type --- + if ($is_gift) { + // --- Handle Gift Purchase --- + $gift_code = 'GIFT' . strtoupper(bin2hex(random_bytes(8))); + $stmt_gift = db()->prepare("INSERT INTO gift_codes (code, package_id, purchaser_client_id, stripe_session_id, is_redeemed, created_at) VALUES (?, ?, ?, ?, 0, NOW())"); + $stmt_gift->execute([$gift_code, $package_id, $client_id, $session->id]); + log_webhook_event("Created gift code {$gift_code} for package {$package_id} purchased by client {$client_id}."); + } else { + // --- Handle Regular Purchase (Package for Self) --- + + // 1. Create the client package record + $sessions_to_add = $package['sessions_per_package'] ?? 0; + if ($package['payment_type'] === 'subscription') { + $sessions_to_add = 0; // Sessions are added on invoice payment for subscriptions + } + + $stmt_cp = db()->prepare("INSERT INTO client_packages (client_id, package_id, stripe_session_id, purchase_date, sessions_remaining) VALUES (?, ?, ?, NOW(), ?)"); + $stmt_cp->execute([$client_id, $package_id, $session->id, $sessions_to_add]); + log_webhook_event("Created client_packages record for client {$client_id}, package {$package_id}."); + + // 2. Handle Subscription Creation + if ($session->mode === 'subscription') { + // This was a recurring package from the start + $stmt_sub = db()->prepare("INSERT INTO client_subscriptions (client_id, package_id, stripe_subscription_id, status, start_date) VALUES (?, ?, ?, 'active', NOW())"); + $stmt_sub->execute([$client_id, $package_id, $session->subscription]); + log_webhook_event("Created client_subscriptions record for Stripe subscription {$session->subscription}."); + + } else if ($payment_option === 'deposit' && $package['payment_type'] === 'payment_plan' && $package['installments'] > 1) { + // This was a deposit, now create the subscription for the rest + $remaining_amount = $package['price'] - $package['deposit_amount']; + $installments_count = $package['installments'] - 1; // Already paid one installment (the deposit) + + if ($installments_count > 0 && $remaining_amount > 0) { + $installment_amount = round(($remaining_amount / $installments_count) * 100); + + try { + // Create a new Price for the installments + $stripe_price = \Stripe\Price::create([ + 'product_data' => ['name' => $package['name'] . ' - Installment Plan'], + 'unit_amount' => $installment_amount, + 'currency' => 'usd', + 'recurring' => ['interval' => $package['installment_interval']], + ]); + + // Create the subscription + $subscription = \Stripe\Subscription::create([ + 'customer' => $stripe_customer_id, + 'items' => [['price' => $stripe_price->id]], + 'metadata' => [ + 'client_id' => $client_id, + 'package_id' => $package_id, + 'is_installment_plan' => 'true' + ], + 'payment_behavior' => 'default_incomplete', + 'payment_settings' => ['save_default_payment_method' => 'on_subscription'], + 'proration_behavior' => 'none', + 'trial_end' => strtotime('+1 ' . $package['installment_interval']), // Start billing after one interval + ]); + + // Save subscription to our DB + $stmt_db_sub = db()->prepare("INSERT INTO client_subscriptions (client_id, package_id, stripe_subscription_id, status, start_date) VALUES (?, ?, ?, 'active', NOW())"); + $stmt_db_sub->execute([$client_id, $package_id, $subscription->id]); + log_webhook_event("Created Stripe subscription {$subscription->id} for client {$client_id} after deposit."); + + } catch(\Exception $e) { + log_webhook_event("Webhook Error: Failed to create subscription for client {$client_id} after deposit. Error: " . $e->getMessage()); + } + } + } + } + + // --- Update Coupon Usage --- + if (isset($metadata->coupon_code)) { + $stmt_coupon = db()->prepare('UPDATE discounts SET times_used = times_used + 1 WHERE code = ?'); + $stmt_coupon->execute([$metadata->coupon_code]); + log_webhook_event("Incremented usage count for coupon {$metadata->coupon_code}."); + } + + break; + + case 'invoice.payment_succeeded': + $invoice = $event->data->object; + $subscription_id = $invoice->subscription; + + if (!$subscription_id) break; + + // Retrieve our subscription record + $stmt = db()->prepare('SELECT * FROM client_subscriptions WHERE stripe_subscription_id = ?'); + $stmt->execute([$subscription_id]); + $subscription_record = $stmt->fetch(PDO::FETCH_ASSOC); + + if ($subscription_record) { + $client_id = $subscription_record['client_id']; + $package_id = $subscription_record['package_id']; + + // Get the package details to find out how many sessions to add + $stmt_pkg = db()->prepare("SELECT sessions_per_package FROM service_packages WHERE id = ?"); + $stmt_pkg->execute([$package_id]); + $package = $stmt_pkg->fetch(PDO::FETCH_ASSOC); + $sessions_to_add = $package['sessions_per_package'] ?? 0; + + if ($sessions_to_add > 0) { + // Find the corresponding client_package to update sessions + $update_stmt = db()->prepare('UPDATE client_packages SET sessions_remaining = sessions_remaining + ? WHERE client_id = ? AND package_id = ?'); + $update_stmt->execute([$sessions_to_add, $client_id, $package_id]); + log_webhook_event("Added {$sessions_to_add} sessions to client {$client_id} for package {$package_id} after invoice payment."); + } + + // Ensure subscription status is active + $update_sub_stmt = db()->prepare('UPDATE client_subscriptions SET status = ? WHERE id = ?'); + $update_sub_stmt->execute(['active', $subscription_record['id']]); + } else { + log_webhook_event("Webhook Warning: Received invoice.payment_succeeded for an unknown subscription: {$subscription_id}"); + } + break; + + case 'invoice.payment_failed': + $invoice = $event->data->object; + $customer_id = $invoice->customer; + $subscription_id = $invoice->subscription; + + if (!$subscription_id) break; + + // Update subscription status in our DB + $stmt = db()->prepare("UPDATE client_subscriptions SET status = 'past_due' WHERE stripe_subscription_id = ?"); + $stmt->execute([$subscription_id]); + log_webhook_event("Set subscription status to 'past_due' for {$subscription_id}."); + + // Find client to send email + $stmt_client = db()->prepare("SELECT * FROM clients WHERE stripe_customer_id = ?"); + $stmt_client->execute([$customer_id]); + $client = $stmt_client->fetch(PDO::FETCH_ASSOC); + + if ($client) { + $to = $client['email']; + $subject = 'Your Subscription Payment Failed'; + $message_html = '

Hi ' . htmlspecialchars($client['name']) . ',

' . + '

We were unable to process your recent subscription payment. Please update your payment method to keep your subscription active.

' . + '

You can manage your subscription here: Manage Subscription

'; + MailService::sendMail($to, $subject, $message_html, strip_tags($message_html)); + log_webhook_event("Sent payment failed email to {$to}."); + } + break; + + case 'customer.subscription.deleted': + $subscription = $event->data->object; + $stmt = db()->prepare("UPDATE client_subscriptions SET status = 'canceled' WHERE stripe_subscription_id = ?"); + $stmt->execute([$subscription->id]); + log_webhook_event("Set subscription status to 'canceled' for {$subscription->id}."); + break; + + default: + log_webhook_event("Received unhandled event type: " . $event->type); +} + +http_response_code(200); diff --git a/subscribe-checkout.php b/subscribe-checkout.php new file mode 100644 index 0000000..02df3aa --- /dev/null +++ b/subscribe-checkout.php @@ -0,0 +1,92 @@ + + +
+

Checkout

+
+
+
+
+ Subscription Details +
+
+
+

$ per

+
+
+
+
+
+
+ Payment +
+
+
+
+ + +
+ +
+

Total: $

+ +
+
+
+
+
+
+ + + + diff --git a/subscription-cancel.php b/subscription-cancel.php new file mode 100644 index 0000000..2e9f482 --- /dev/null +++ b/subscription-cancel.php @@ -0,0 +1,52 @@ +subscriptions->cancel($subscription_id, []); + + $stmt = db()->prepare("UPDATE client_subscriptions SET status = 'cancelled' WHERE stripe_subscription_id = ?"); + $stmt->execute([$subscription_id]); + + header('Location: manage-subscription.php?status=cancelled'); + exit; +} catch (\Stripe\Exception\ApiErrorException $e) { + // Display error message + $error = $e->getMessage(); +} +?> + + + + + + + Subscription Cancellation Error + + + +
+
+

Cancellation Error

+

There was an error cancelling your subscription:

+

+ +
+
+ + \ No newline at end of file diff --git a/subscription-plans.php b/subscription-plans.php new file mode 100644 index 0000000..8bf3356 --- /dev/null +++ b/subscription-plans.php @@ -0,0 +1,54 @@ + + + + + + + Subscribe + + + +
+

Subscription Plans

+
+ $plan): ?> +
+
+
+
+

+ $ per
+ Includes sessions. +

+ Subscribe +
+
+
+ +
+ +
+ +
+ +
+ + \ No newline at end of file diff --git a/subscription-success.php b/subscription-success.php new file mode 100644 index 0000000..f2a7e3a --- /dev/null +++ b/subscription-success.php @@ -0,0 +1,45 @@ + ['subscription.discount.coupon']]); + $subscription = $checkout_session->subscription; + + if ($subscription->status === 'active') { + if (isset($subscription->discount) && $subscription->discount->coupon) { + $coupon_code = $subscription->discount->coupon->name; + if ($coupon_code) { + $stmt = db()->prepare('UPDATE discounts SET times_used = times_used + 1 WHERE code = ?'); + $stmt->execute([$coupon_code]); + } + } + + $client_id = $_SESSION['user_id']; + $stripe_subscription_id = $subscription->id; + $stripe_product_id = $subscription->items->data[0]->price->product; + $status = $subscription->status; + $start_date = date('Y-m-d H:i:s', $subscription->current_period_start); + $end_date = date('Y-m-d H:i:s', $subscription->current_period_end); + + $pdo = db(); + $stmt = $pdo->prepare("INSERT INTO client_subscriptions (client_id, stripe_subscription_id, stripe_product_id, status, start_date, end_date) VALUES (?, ?, ?, ?, ?, ?)"); + $stmt->execute([$client_id, $stripe_subscription_id, $stripe_product_id, $status, $start_date, $end_date]); + + header('Location: dashboard.php?subscription=success'); + exit; + } else { + header('Location: subscription-cancel.php?reason=payment_not_complete'); + exit; + } +} catch (\Stripe\Exception\ApiErrorException $e) { + // Handle error + header('Location: subscription-cancel.php?reason=invalid_session'); + exit; +} diff --git a/support.php b/support.php new file mode 100644 index 0000000..32ae472 --- /dev/null +++ b/support.php @@ -0,0 +1,100 @@ +beginTransaction(); + + // Insert into support_tickets + $stmt = $pdo->prepare('INSERT INTO support_tickets (client_id, subject) VALUES (?, ?)'); + $stmt->execute([$client_id, $subject]); + $ticket_id = $pdo->lastInsertId(); + + // Insert into support_ticket_messages + $stmt = $pdo->prepare('INSERT INTO support_ticket_messages (ticket_id, user_id, is_admin, message) VALUES (?, ?, ?, ?)'); + $stmt->execute([$ticket_id, $client_id, false, $message]);\n\n $pdo->commit();\n\n // Send email notification to admin\n require_once \'mail/MailService.php\';\n $stmt = $pdo->prepare(\'SELECT name, email FROM clients WHERE id = ?\');\n $stmt->execute([$client_id]);\n $client = $stmt->fetch();\n\n $admin_email = getenv(\'MAIL_TO\') ?: getenv(\'MAIL_FROM\');\n if ($admin_email && $client) {\n $email_subject = \"New Support Ticket #{$ticket_id}: {$subject}\";\n $email_html = \"

A new support ticket has been created by {\$client[\'name\']} ({$client[\'email\']}).

\"\n . \"

Subject: {$subject}

\"\n . \"

Message:

\" . nl2br(htmlspecialchars($message)) . \"
\"\n . \"

You can view the ticket here: View Ticket

\";\n $email_text = \"A new support ticket has been created by {\$client[\'name\']} ({\$client[\'email\']}).\\n\\n\"\n . \"Subject: {$subject}\\n\\n\"\n . \"Message:\\n\" . htmlspecialchars($message) . \"\\n\\n\"\n . \"You can view the ticket here: http://{\$GLOBALS[HTTP_HOST]}/admin/view-ticket.php?id={$ticket_id}\";\n\n MailService::sendMail($admin_email, $email_subject, $email_html, $email_text);\n }\n\n $_SESSION[\'success_message\'] = \'Support ticket created successfully.\';\n // Redirect to prevent form resubmission\n header(\'Location: support.php\'); + exit; + } catch (Exception $e) { + $pdo->rollBack(); + $error_message = 'Failed to create support ticket. Please try again. Error: ' . $e->getMessage(); + } + } + +} + +// Fetch existing tickets for the client +$stmt = db()->prepare('SELECT * FROM support_tickets WHERE client_id = ? ORDER BY updated_at DESC'); +$stmt->execute([$client_id]); +$tickets = $stmt->fetchAll(); + +?> + +
+

Support Tickets

+ + +
+ +
+ + + +
+ +
+ + +
+
Create New Ticket
+
+
+
+ + +
+
+ + +
+ +
+
+
+ +
+
Your Tickets
+
+
+ +

You have no support tickets.

+ + + +
+
+ Last updated: +
+

Status:

+
+ + +
+
+
+
+ + diff --git a/surveys.php b/surveys.php new file mode 100644 index 0000000..1289cd3 --- /dev/null +++ b/surveys.php @@ -0,0 +1,56 @@ +prepare('SELECT cs.id as client_survey_id, s.title, s.description, cs.status FROM client_surveys cs JOIN surveys s ON cs.survey_id = s.id WHERE cs.client_id = ? ORDER BY cs.created_at DESC'); +$stmt->execute([$client_id]); +$surveys = $stmt->fetchAll(); + +?> + +
+

My Surveys

+

Please complete the following surveys assigned to you by your coach.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
TitleDescriptionStatusAction
+ + Start Survey + + View Submission + +
No surveys assigned to you yet.
+
+ + diff --git a/telnyx/config.php b/telnyx/config.php new file mode 100644 index 0000000..ae3b1de --- /dev/null +++ b/telnyx/config.php @@ -0,0 +1,5 @@ + diff --git a/update-client-settings.php b/update-client-settings.php new file mode 100644 index 0000000..9e11a7d --- /dev/null +++ b/update-client-settings.php @@ -0,0 +1,23 @@ +prepare("UPDATE clients SET timezone = ? WHERE id = ?"); + $stmt->execute([$timezone, $client_id]); + + header('Location: dashboard.php?status=settings_updated'); + exit; +} else { + header('Location: dashboard.php'); + exit; +} diff --git a/update-coach-settings.php b/update-coach-settings.php new file mode 100644 index 0000000..b4def77 --- /dev/null +++ b/update-coach-settings.php @@ -0,0 +1,24 @@ +prepare("UPDATE coaches SET buffer_time = ?, timezone = ? WHERE id = ?"); + $stmt->execute([$buffer_time, $timezone, $coach_id]); + + header('Location: dashboard.php?status=settings_updated'); + exit; +} else { + header('Location: dashboard.php'); + exit; +} diff --git a/vendor/autoload.php b/vendor/autoload.php new file mode 100644 index 0000000..d285af7 --- /dev/null +++ b/vendor/autoload.php @@ -0,0 +1,22 @@ + + * 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..ed77294 --- /dev/null +++ b/vendor/composer/autoload_classmap.php @@ -0,0 +1,48 @@ + $vendorDir . '/composer/InstalledVersions.php', + 'Stripe' => $vendorDir . '/stripe/stripe-php/lib/Stripe/Stripe.php', + 'Stripe_Account' => $vendorDir . '/stripe/stripe-php/lib/Stripe/Account.php', + 'Stripe_ApiConnectionError' => $vendorDir . '/stripe/stripe-php/lib/Stripe/ApiConnectionError.php', + 'Stripe_ApiError' => $vendorDir . '/stripe/stripe-php/lib/Stripe/ApiError.php', + 'Stripe_ApiRequestor' => $vendorDir . '/stripe/stripe-php/lib/Stripe/ApiRequestor.php', + 'Stripe_ApiResource' => $vendorDir . '/stripe/stripe-php/lib/Stripe/ApiResource.php', + 'Stripe_ApplicationFee' => $vendorDir . '/stripe/stripe-php/lib/Stripe/ApplicationFee.php', + 'Stripe_ApplicationFeeRefund' => $vendorDir . '/stripe/stripe-php/lib/Stripe/ApplicationFeeRefund.php', + 'Stripe_AttachedObject' => $vendorDir . '/stripe/stripe-php/lib/Stripe/AttachedObject.php', + 'Stripe_AuthenticationError' => $vendorDir . '/stripe/stripe-php/lib/Stripe/AuthenticationError.php', + 'Stripe_Balance' => $vendorDir . '/stripe/stripe-php/lib/Stripe/Balance.php', + 'Stripe_BalanceTransaction' => $vendorDir . '/stripe/stripe-php/lib/Stripe/BalanceTransaction.php', + 'Stripe_BitcoinReceiver' => $vendorDir . '/stripe/stripe-php/lib/Stripe/BitcoinReceiver.php', + 'Stripe_BitcoinTransaction' => $vendorDir . '/stripe/stripe-php/lib/Stripe/BitcoinTransaction.php', + 'Stripe_Card' => $vendorDir . '/stripe/stripe-php/lib/Stripe/Card.php', + 'Stripe_CardError' => $vendorDir . '/stripe/stripe-php/lib/Stripe/CardError.php', + 'Stripe_Charge' => $vendorDir . '/stripe/stripe-php/lib/Stripe/Charge.php', + 'Stripe_Coupon' => $vendorDir . '/stripe/stripe-php/lib/Stripe/Coupon.php', + 'Stripe_Customer' => $vendorDir . '/stripe/stripe-php/lib/Stripe/Customer.php', + 'Stripe_Error' => $vendorDir . '/stripe/stripe-php/lib/Stripe/Error.php', + 'Stripe_Event' => $vendorDir . '/stripe/stripe-php/lib/Stripe/Event.php', + 'Stripe_FileUpload' => $vendorDir . '/stripe/stripe-php/lib/Stripe/FileUpload.php', + 'Stripe_InvalidRequestError' => $vendorDir . '/stripe/stripe-php/lib/Stripe/InvalidRequestError.php', + 'Stripe_Invoice' => $vendorDir . '/stripe/stripe-php/lib/Stripe/Invoice.php', + 'Stripe_InvoiceItem' => $vendorDir . '/stripe/stripe-php/lib/Stripe/InvoiceItem.php', + 'Stripe_List' => $vendorDir . '/stripe/stripe-php/lib/Stripe/List.php', + 'Stripe_Object' => $vendorDir . '/stripe/stripe-php/lib/Stripe/Object.php', + 'Stripe_Plan' => $vendorDir . '/stripe/stripe-php/lib/Stripe/Plan.php', + 'Stripe_RateLimitError' => $vendorDir . '/stripe/stripe-php/lib/Stripe/RateLimitError.php', + 'Stripe_Recipient' => $vendorDir . '/stripe/stripe-php/lib/Stripe/Recipient.php', + 'Stripe_Refund' => $vendorDir . '/stripe/stripe-php/lib/Stripe/Refund.php', + 'Stripe_RequestOptions' => $vendorDir . '/stripe/stripe-php/lib/Stripe/RequestOptions.php', + 'Stripe_SingletonApiResource' => $vendorDir . '/stripe/stripe-php/lib/Stripe/SingletonApiResource.php', + 'Stripe_Subscription' => $vendorDir . '/stripe/stripe-php/lib/Stripe/Subscription.php', + 'Stripe_Token' => $vendorDir . '/stripe/stripe-php/lib/Stripe/Token.php', + 'Stripe_Transfer' => $vendorDir . '/stripe/stripe-php/lib/Stripe/Transfer.php', + 'Stripe_Util' => $vendorDir . '/stripe/stripe-php/lib/Stripe/Util.php', + 'Stripe_Util_Set' => $vendorDir . '/stripe/stripe-php/lib/Stripe/Util/Set.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 . '/docusealco/docuseal-php/src'), +); diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php new file mode 100644 index 0000000..4efc34c --- /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..06b2bb1 --- /dev/null +++ b/vendor/composer/autoload_static.php @@ -0,0 +1,74 @@ + + array ( + 'Docuseal\\' => 9, + ), + ); + + public static $prefixDirsPsr4 = array ( + 'Docuseal\\' => + array ( + 0 => __DIR__ . '/..' . '/docusealco/docuseal-php/src', + ), + ); + + public static $classMap = array ( + 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', + 'Stripe' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Stripe/Stripe.php', + 'Stripe_Account' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Stripe/Account.php', + 'Stripe_ApiConnectionError' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Stripe/ApiConnectionError.php', + 'Stripe_ApiError' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Stripe/ApiError.php', + 'Stripe_ApiRequestor' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Stripe/ApiRequestor.php', + 'Stripe_ApiResource' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Stripe/ApiResource.php', + 'Stripe_ApplicationFee' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Stripe/ApplicationFee.php', + 'Stripe_ApplicationFeeRefund' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Stripe/ApplicationFeeRefund.php', + 'Stripe_AttachedObject' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Stripe/AttachedObject.php', + 'Stripe_AuthenticationError' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Stripe/AuthenticationError.php', + 'Stripe_Balance' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Stripe/Balance.php', + 'Stripe_BalanceTransaction' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Stripe/BalanceTransaction.php', + 'Stripe_BitcoinReceiver' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Stripe/BitcoinReceiver.php', + 'Stripe_BitcoinTransaction' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Stripe/BitcoinTransaction.php', + 'Stripe_Card' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Stripe/Card.php', + 'Stripe_CardError' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Stripe/CardError.php', + 'Stripe_Charge' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Stripe/Charge.php', + 'Stripe_Coupon' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Stripe/Coupon.php', + 'Stripe_Customer' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Stripe/Customer.php', + 'Stripe_Error' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Stripe/Error.php', + 'Stripe_Event' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Stripe/Event.php', + 'Stripe_FileUpload' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Stripe/FileUpload.php', + 'Stripe_InvalidRequestError' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Stripe/InvalidRequestError.php', + 'Stripe_Invoice' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Stripe/Invoice.php', + 'Stripe_InvoiceItem' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Stripe/InvoiceItem.php', + 'Stripe_List' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Stripe/List.php', + 'Stripe_Object' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Stripe/Object.php', + 'Stripe_Plan' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Stripe/Plan.php', + 'Stripe_RateLimitError' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Stripe/RateLimitError.php', + 'Stripe_Recipient' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Stripe/Recipient.php', + 'Stripe_Refund' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Stripe/Refund.php', + 'Stripe_RequestOptions' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Stripe/RequestOptions.php', + 'Stripe_SingletonApiResource' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Stripe/SingletonApiResource.php', + 'Stripe_Subscription' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Stripe/Subscription.php', + 'Stripe_Token' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Stripe/Token.php', + 'Stripe_Transfer' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Stripe/Transfer.php', + 'Stripe_Util' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Stripe/Util.php', + 'Stripe_Util_Set' => __DIR__ . '/..' . '/stripe/stripe-php/lib/Stripe/Util/Set.php', + ); + + public static function getInitializer(ClassLoader $loader) + { + return \Closure::bind(function () use ($loader) { + $loader->prefixLengthsPsr4 = ComposerStaticInit40aa654f2e66c20881ae0572fe987a10::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInit40aa654f2e66c20881ae0572fe987a10::$prefixDirsPsr4; + $loader->classMap = ComposerStaticInit40aa654f2e66c20881ae0572fe987a10::$classMap; + + }, null, ClassLoader::class); + } +} diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json new file mode 100644 index 0000000..77fb5ec --- /dev/null +++ b/vendor/composer/installed.json @@ -0,0 +1,100 @@ +{ + "packages": [ + { + "name": "docusealco/docuseal-php", + "version": "1.0.5", + "version_normalized": "1.0.5.0", + "source": { + "type": "git", + "url": "https://github.com/docusealco/docuseal-php.git", + "reference": "f12a490e95bdb13ef61f46b72dffcdc646d8b0a4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/docusealco/docuseal-php/zipball/f12a490e95bdb13ef61f46b72dffcdc646d8b0a4", + "reference": "f12a490e95bdb13ef61f46b72dffcdc646d8b0a4", + "shasum": "" + }, + "time": "2025-09-14T21:27:12+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Docuseal\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "DocuSeal" + } + ], + "description": "PHP bindings for DocuSeal API", + "support": { + "issues": "https://github.com/docusealco/docuseal-php/issues", + "source": "https://github.com/docusealco/docuseal-php/tree/1.0.5" + }, + "install-path": "../docusealco/docuseal-php" + }, + { + "name": "stripe/stripe-php", + "version": "v1.18.0", + "version_normalized": "1.18.0.0", + "source": { + "type": "git", + "url": "https://github.com/stripe/stripe-php.git", + "reference": "022c3f21ec1e4141b46738bd5e7ab730d04f78cc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/stripe/stripe-php/zipball/022c3f21ec1e4141b46738bd5e7ab730d04f78cc", + "reference": "022c3f21ec1e4141b46738bd5e7ab730d04f78cc", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "ext-mbstring": "*", + "php": ">=5.2" + }, + "require-dev": { + "simpletest/simpletest": "*" + }, + "time": "2015-01-22T05:01:46+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "classmap": [ + "lib/Stripe/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Stripe and contributors", + "homepage": "https://github.com/stripe/stripe-php/contributors" + } + ], + "description": "Stripe PHP Library", + "homepage": "https://stripe.com/", + "keywords": [ + "api", + "payment processing", + "stripe" + ], + "support": { + "issues": "https://github.com/stripe/stripe-php/issues", + "source": "https://github.com/stripe/stripe-php/tree/v1.18.0" + }, + "install-path": "../stripe/stripe-php" + } + ], + "dev": true, + "dev-package-names": [] +} diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php new file mode 100644 index 0000000..879cb44 --- /dev/null +++ b/vendor/composer/installed.php @@ -0,0 +1,41 @@ + array( + 'name' => '__root__', + 'pretty_version' => 'dev-master', + 'version' => 'dev-master', + 'reference' => '156b441da0ce5c2c99bba586e70fb88c418f7c49', + 'type' => 'library', + 'install_path' => __DIR__ . '/../../', + 'aliases' => array(), + 'dev' => true, + ), + 'versions' => array( + '__root__' => array( + 'pretty_version' => 'dev-master', + 'version' => 'dev-master', + 'reference' => '156b441da0ce5c2c99bba586e70fb88c418f7c49', + 'type' => 'library', + 'install_path' => __DIR__ . '/../../', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'docusealco/docuseal-php' => array( + 'pretty_version' => '1.0.5', + 'version' => '1.0.5.0', + 'reference' => 'f12a490e95bdb13ef61f46b72dffcdc646d8b0a4', + 'type' => 'library', + 'install_path' => __DIR__ . '/../docusealco/docuseal-php', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'stripe/stripe-php' => array( + 'pretty_version' => 'v1.18.0', + 'version' => '1.18.0.0', + 'reference' => '022c3f21ec1e4141b46738bd5e7ab730d04f78cc', + 'type' => 'library', + 'install_path' => __DIR__ . '/../stripe/stripe-php', + 'aliases' => array(), + 'dev_requirement' => false, + ), + ), +); diff --git a/vendor/composer/platform_check.php b/vendor/composer/platform_check.php new file mode 100644 index 0000000..57a9802 --- /dev/null +++ b/vendor/composer/platform_check.php @@ -0,0 +1,25 @@ += 50200)) { + $issues[] = 'Your Composer dependencies require a PHP version ">= 5.2.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/docusealco/docuseal-php/.gitignore b/vendor/docusealco/docuseal-php/.gitignore new file mode 100644 index 0000000..37fa37b --- /dev/null +++ b/vendor/docusealco/docuseal-php/.gitignore @@ -0,0 +1,3 @@ +composer.phar +.composer +vendor diff --git a/vendor/docusealco/docuseal-php/README.md b/vendor/docusealco/docuseal-php/README.md new file mode 100644 index 0000000..7e64934 --- /dev/null +++ b/vendor/docusealco/docuseal-php/README.md @@ -0,0 +1,483 @@ +# DocuSeal PHP + +The DocuSeal PHP library provides seamless integration with the DocuSeal API, allowing developers to interact with DocuSeal's electronic signature and document management features directly within PHP applications. This library is designed to simplify API interactions and provide tools for efficient implementation. + +## Documentation + +Detailed documentation is available at [DocuSeal API Docs](https://www.docuseal.com/docs/api?lang=php). + +## Requirements + +PHP 5.6.0 and later. + +## Installation + +To install using [Composer](http://getcomposer.org/): + +```sh +composer require docusealco/docuseal-php +``` + +To use the bindings, use Composer's [autoload](https://getcomposer.org/doc/01-basic-usage.md#autoloading): + +```php +require_once 'vendor/autoload.php'; +``` + +## Manual Installation + +Download the latest docuseal-php package and then, include the init.php file: + +```php +require_once '/path/to/docuseal-php/init.php'; +``` + +## Usage + +### Configuration + +Set up the library with your DocuSeal API key based on your deployment. Retrieve your API key from the appropriate location: + +#### Global Cloud + +API keys for the global cloud can be obtained from your [Global DocuSeal Console](https://console.docuseal.com/api). + +```ts +$docuseal = new \Docuseal\Api('API_KEY'); +``` + +#### EU Cloud + +API keys for the EU cloud can be obtained from your [EU DocuSeal Console](https://console.docuseal.eu/api). + +```ts +$docuseal = new \Docuseal\Api('API_KEY', 'https://api.docuseal.eu'); +``` + +#### On-Premises + +For on-premises installations, API keys can be retrieved from the API settings page of your deployed application, e.g., https://yourdocusealapp.com/settings/api. + +```ts +$docuseal = new \Docuseal\Api('API_KEY', 'https://yourdocusealapp.com/api'); +``` + +## API Methods + +### listSubmissions(params) + +[Documentation](https://www.docuseal.com/docs/api?lang=php#list-all-submissions) + +Provides the ability to retrieve a list of available submissions. + + +```php +$docuseal->listSubmissions(['limit' => 10]); +``` + +### getSubmission(id) + +[Documentation](https://www.docuseal.com/docs/api?lang=php#get-a-submission) + +Provides the functionality to retrieve information about a submission. + + +```php +$docuseal->getSubmission(1001); +``` + +### getSubmissionDocuments(id) + +[Documentation](https://www.docuseal.com/docs/api?lang=php#get-submission-documents) + +This endpoint returns a list of partially filled documents for a submission. If the submission has been completed, the final signed documents are returned. + + +```php +$docuseal->getSubmissionDocuments(1001); +``` + +### createSubmission(data) + +[Documentation](https://www.docuseal.com/docs/api?lang=php#create-a-submission) + +This API endpoint allows you to create signature requests (submissions) for a document template and send them to the specified submitters (signers). + +**Related Guides:**
+[Send documents for signature via API](https://www.docuseal.com/guides/send-documents-for-signature-via-api) +[Pre-fill PDF document form fields with API](https://www.docuseal.com/guides/pre-fill-pdf-document-form-fields-with-api) + + +```php +$docuseal->createSubmission([ + 'template_id' => 1000001, + 'send_email' => true, + 'submitters' => [ + [ + 'role' => 'First Party', + 'email' => 'john.doe@example.com' + ] + ] +]); +``` + +### createSubmissionFromPdf(data) + +[Documentation](https://www.docuseal.com/docs/api?lang=php#create-a-submission-from-pdf) + +Provides the functionality to create one-off submission request from a PDF. Use `{{Field Name;role=Signer1;type=date}}` text tags to define fillable fields in the document. See [https://www.docuseal.com/examples/fieldtags.pdf](https://www.docuseal.com/examples/fieldtags.pdf) for more text tag formats. Or specify the exact pixel coordinates of the document fields using `fields` param. + +**Related Guides:**
+[Use embedded text field tags to create a fillable form](https://www.docuseal.com/guides/use-embedded-text-field-tags-in-the-pdf-to-create-a-fillable-form) + + +```php +$docuseal->createSubmissionFromPdf([ + 'name' => 'Test Submission Document', + 'documents' => [ + [ + 'name' => 'string', + 'file' => 'base64', + 'fields' => [ + [ + 'name' => 'string', + 'areas' => [ + [ + 'x' => 0, + 'y' => 0, + 'w' => 0, + 'h' => 0, + 'page' => 1 + ] + ] + ] + ] + ] + ], + 'submitters' => [ + [ + 'role' => 'First Party', + 'email' => 'john.doe@example.com' + ] + ] +]); +``` + +### createSubmissionFromDocx(data) + +[Documentation](https://www.docuseal.com/docs/api?lang=php#create-a-submission-from-docx) + +Provides functionality to create a one-off submission request from a DOCX file with dynamic content variables. Use `[[variable_name]]` text tags to define dynamic content variables in the document. See [https://www.docuseal.com/examples/demo\_template.docx](https://www.docuseal.com/examples/demo_template.docx) for the specific text variable syntax, including dynamic content tables and list. You can also use the `{{signature}}` fillable field syntax to define fillable fields, as in a PDF. + +**Related Guides:**
+[Use embedded text field tags to create a fillable form](https://www.docuseal.com/guides/use-embedded-text-field-tags-in-the-pdf-to-create-a-fillable-form) + + +```php +$docuseal->createSubmissionFromDocx([ + 'name' => 'Test Submission Document', + 'variables' => [ + 'variable_name' => 'value' + ], + 'documents' => [ + [ + 'name' => 'string', + 'file' => 'base64' + ] + ], + 'submitters' => [ + [ + 'role' => 'First Party', + 'email' => 'john.doe@example.com' + ] + ] +]); +``` + +### createSubmissionFromHtml(data) + +[Documentation](https://www.docuseal.com/docs/api?lang=php#create-a-submission-from-html) + +This API endpoint allows you to create a one-off submission request document using the provided HTML content, with special field tags rendered as a fillable and signable form. + +**Related Guides:**
+[Create PDF document fillable form with HTML](https://www.docuseal.com/guides/create-pdf-document-fillable-form-with-html-api) + + +```php +$docuseal->createSubmissionFromHtml([ + 'name' => 'Test Submission Document', + 'documents' => [ + [ + 'name' => 'Test Document', + 'html' => '

Lorem Ipsum is simply dummy text of the + + +and typesetting industry

+' + ] + ], + 'submitters' => [ + [ + 'role' => 'First Party', + 'email' => 'john.doe@example.com' + ] + ] +]); +``` + +### archiveSubmission(id) + +[Documentation](https://www.docuseal.com/docs/api?lang=php#archive-a-submission) + +Allows you to archive a submission. + + +```php +$docuseal->archiveSubmission(1001); +``` + +### listSubmitters(params) + +[Documentation](https://www.docuseal.com/docs/api?lang=php#list-all-submitters) + +Provides the ability to retrieve a list of submitters. + + +```php +$docuseal->listSubmitters(['limit' => 10]); +``` + +### getSubmitter(id) + +[Documentation](https://www.docuseal.com/docs/api?lang=php#get-a-submitter) + +Provides functionality to retrieve information about a submitter, along with the submitter documents and field values. + + +```php +$docuseal->getSubmitter(500001); +``` + +### updateSubmitter(id, data) + +[Documentation](https://www.docuseal.com/docs/api?lang=php#update-a-submitter) + +Allows you to update submitter details, pre-fill or update field values and re-send emails. + +**Related Guides:**
+[Automatically sign documents via API](https://www.docuseal.com/guides/pre-fill-pdf-document-form-fields-with-api#automatically_sign_documents_via_api) + + +```php +$docuseal->updateSubmitter(500001, [ + 'email' => 'john.doe@example.com', + 'fields' => [ + [ + 'name' => 'First Name', + 'default_value' => 'Acme' + ] + ] +]); +``` + +### listTemplates(params) + +[Documentation](https://www.docuseal.com/docs/api?lang=php#list-all-templates) + +Provides the ability to retrieve a list of available document templates. + + +```php +$docuseal->listTemplates(['limit' => 10]); +``` + +### getTemplate(id) + +[Documentation](https://www.docuseal.com/docs/api?lang=php#get-a-template) + +Provides the functionality to retrieve information about a document template. + + +```php +$docuseal->getTemplate(1000001); +``` + +### createTemplateFromPdf(data) + +[Documentation](https://www.docuseal.com/docs/api?lang=php#create-a-template-from-pdf) + +Provides the functionality to create a fillable document template for a PDF file. Use `{{Field Name;role=Signer1;type=date}}` text tags to define fillable fields in the document. See [https://www.docuseal.com/examples/fieldtags.pdf](https://www.docuseal.com/examples/fieldtags.pdf) for more text tag formats. Or specify the exact pixel coordinates of the document fields using `fields` param. + +**Related Guides:**
+[Use embedded text field tags to create a fillable form](https://www.docuseal.com/guides/use-embedded-text-field-tags-in-the-pdf-to-create-a-fillable-form) + + +```php +$docuseal->createTemplateFromPdf([ + 'name' => 'Test PDF', + 'documents' => [ + [ + 'name' => 'string', + 'file' => 'base64', + 'fields' => [ + [ + 'name' => 'string', + 'areas' => [ + [ + 'x' => 0, + 'y' => 0, + 'w' => 0, + 'h' => 0, + 'page' => 1 + ] + ] + ] + ] + ] + ] +]); +``` + +### createTemplateFromDocx(data) + +[Documentation](https://www.docuseal.com/docs/api?lang=php#create-a-template-from-word-docx) + +Provides the functionality to create a fillable document template for existing Microsoft Word document. Use `{{Field Name;role=Signer1;type=date}}` text tags to define fillable fields in the document. See [https://www.docuseal.com/examples/fieldtags.docx](https://www.docuseal.com/examples/fieldtags.docx) for more text tag formats. Or specify the exact pixel coordinates of the document fields using `fields` param. + +**Related Guides:**
+[Use embedded text field tags to create a fillable form](https://www.docuseal.com/guides/use-embedded-text-field-tags-in-the-pdf-to-create-a-fillable-form) + + +```php +$docuseal->createTemplateFromDocx([ + 'name' => 'Test DOCX', + 'documents' => [ + [ + 'name' => 'string', + 'file' => 'base64' + ] + ] +]); +``` + +### createTemplateFromHtml(data) + +[Documentation](https://www.docuseal.com/docs/api?lang=php#create-a-template-from-html) + +Provides the functionality to seamlessly generate a PDF document template by utilizing the provided HTML content while incorporating pre-defined fields. + +**Related Guides:**
+[Create PDF document fillable form with HTML](https://www.docuseal.com/guides/create-pdf-document-fillable-form-with-html-api) + + +```php +$docuseal->createTemplateFromHtml([ + 'html' => '

Lorem Ipsum is simply dummy text of the + + +and typesetting industry

+', + 'name' => 'Test Template' +]); +``` + +### cloneTemplate(id, data) + +[Documentation](https://www.docuseal.com/docs/api?lang=php#clone-a-template) + +Allows you to clone existing template into a new template. + + +```php +$docuseal->cloneTemplate(1000001, [ + 'name' => 'Cloned Template' +]); +``` + +### mergeTemplates(data) + +[Documentation](https://www.docuseal.com/docs/api?lang=php#merge-templates) + +Allows you to merge multiple templates with documents and fields into a new combined template. + + +```php +$docuseal->mergeTemplates([ + 'template_ids' => [ + 321, + 432 + ], + 'name' => 'Merged Template' +]); +``` + +### updateTemplate(id, data) + +[Documentation](https://www.docuseal.com/docs/api?lang=php#update-a-template) + +Provides the functionality to move a document template to a different folder and update the name of the template. + + +```php +$docuseal->updateTemplate(1000001, [ + 'name' => 'New Document Name', + 'folder_name' => 'New Folder' +]); +``` + +### updateTemplateDocuments(id, data) + +[Documentation](https://www.docuseal.com/docs/api?lang=php#update-template-documents) + +Allows you to add, remove or replace documents in the template with provided PDF/DOCX file or HTML content. + + +```php +$docuseal->updateTemplateDocuments(1000001, [ + 'documents' => [ + [ + 'file' => 'string' + ] + ] +]); +``` + +### archiveTemplate(id) + +[Documentation](https://www.docuseal.com/docs/api?lang=php#archive-a-template) + +Allows you to archive a document template. + + +```php +$docuseal->archiveTemplate(1000001); +``` + +### Configuring Timeouts + +Set timeouts to avoid hanging requests: + +```ts +$docuseal = new \Docuseal\Api('API_KEY', 'https://api.docuseal.com', [ + 'read_timeout' => 60, + 'open_timeout' => 60, +]); +``` + +## Support + +For feature requests or bug reports, visit our [GitHub Issues page](https://github.com/docusealco/docuseal-php/issues). + + +## License + +The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT). diff --git a/vendor/docusealco/docuseal-php/composer.json b/vendor/docusealco/docuseal-php/composer.json new file mode 100644 index 0000000..e54ecb8 --- /dev/null +++ b/vendor/docusealco/docuseal-php/composer.json @@ -0,0 +1,17 @@ +{ + "name": "docusealco/docuseal-php", + "description": "PHP bindings for DocuSeal API", + "type": "library", + "license": "MIT", + "autoload": { + "psr-4": { + "Docuseal\\": "src/" + } + }, + "authors": [ + { + "name": "DocuSeal" + } + ], + "require": {} +} diff --git a/vendor/docusealco/docuseal-php/init.php b/vendor/docusealco/docuseal-php/init.php new file mode 100644 index 0000000..ba18983 --- /dev/null +++ b/vendor/docusealco/docuseal-php/init.php @@ -0,0 +1,6 @@ + 60, + 'read_timeout' => 60 + ]; + + public function __construct($key, $url = 'https://api.docuseal.com', $config = []) + { + $mergedConfig = array_merge(self::$defaultConfig, $config, ['key' => $key, 'url' => $url]); + $this->http = new Http($mergedConfig); + } + + public function listTemplates($params = []) + { + return $this->http->get('/templates', $params); + } + + public function getTemplate($id, $params = []) + { + return $this->http->get("/templates/{$id}", $params); + } + + public function createTemplateFromDocx($data) + { + return $this->http->post('/templates/docx', $data); + } + + public function createTemplateFromHtml($data) + { + return $this->http->post('/templates/html', $data); + } + + public function createTemplateFromPdf($data) + { + return $this->http->post('/templates/pdf', $data); + } + + public function mergeTemplates($data) + { + return $this->http->post('/templates/merge', $data); + } + + public function cloneTemplate($id, $data) + { + return $this->http->post("/templates/{$id}/clone", $data); + } + + public function updateTemplate($id, $data) + { + return $this->http->put("/templates/{$id}", $data); + } + + public function updateTemplateDocuments($id, $data) + { + return $this->http->put("/templates/{$id}/documents", $data); + } + + public function archiveTemplate($id) + { + return $this->http->delete("/templates/{$id}"); + } + + public function permanentlyDeleteTemplate($id) + { + return $this->http->delete("/templates/{$id}", ['permanently' => true]); + } + + public function listSubmissions($params = []) + { + return $this->http->get('/submissions', $params); + } + + public function getSubmission($id, $params = []) + { + return $this->http->get("/submissions/{$id}", $params); + } + + public function getSubmissionDocuments($id, $params = []) + { + return $this->http->get("/submissions/{$id}/documents", $params); + } + + public function createSubmission($data) + { + return $this->http->post('/submissions/init', $data); + } + + public function createSubmissionFromEmails($data) + { + return $this->http->post('/submissions/emails', $data); + } + + public function createSubmissionFromPdf($data) + { + return $this->http->post('/submissions/pdf', $data); + } + + public function createSubmissionFromHtml($data) + { + return $this->http->post('/submissions/html', $data); + } + + public function createSubmissionFromDocx($data) + { + return $this->http->post('/submissions/docx', $data); + } + + public function archiveSubmission($id) + { + return $this->http->delete("/submissions/{$id}"); + } + + public function permanentlyDeleteSubmission($id) + { + return $this->http->delete("/submissions/{$id}", ['permanently' => true]); + } + + public function listSubmitters($params = []) + { + return $this->http->get('/submitters', $params); + } + + public function getSubmitter($id, $params = []) + { + return $this->http->get("/submitters/{$id}", $params); + } + + public function updateSubmitter($id, $data) + { + return $this->http->put("/submitters/{$id}", $data); + } +} diff --git a/vendor/docusealco/docuseal-php/src/Docuseal.php b/vendor/docusealco/docuseal-php/src/Docuseal.php new file mode 100644 index 0000000..6b1f81c --- /dev/null +++ b/vendor/docusealco/docuseal-php/src/Docuseal.php @@ -0,0 +1,8 @@ +config = $config; + } + + public function get($path, $params = []) { + return $this->sendRequest('GET', $path, $params); + } + + public function post($path, $body = []) { + return $this->sendRequest('POST', $path, [], $body); + } + + public function put($path, $body = []) { + return $this->sendRequest('PUT', $path, [], $body); + } + + public function delete($path, $params = []) { + return $this->sendRequest('DELETE', $path, $params); + } + + private function sendRequest($method, $path, $params = [], $body = []) { + $url = $this->config['url'] . $path . $this->toQuery($params); + $curl = curl_init($url); + + $headers = $this->headers(); + + curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); + curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); + curl_setopt($curl, CURLOPT_TIMEOUT, $this->config['read_timeout']); + curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, $this->config['open_timeout']); + + if (in_array($method, self::$BODY_METHODS)) { + curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method); + curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($body)); + } elseif ($method !== 'GET') { + curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method); + } + + $response = curl_exec($curl); + $http_code = curl_getinfo($curl, CURLINFO_HTTP_CODE); + + curl_close($curl); + + return $this->handleResponse($response, $http_code); + } + + private function headers() { + return [ + 'X-Auth-Token: ' . $this->config['key'], + 'Content-Type: application/json', + "User-Agent: DocuSeal PHP v" . Docuseal::VERSION + ]; + } + + private function toQuery($params) { + if (empty($params)) { + return ''; + } + return '?' . http_build_query($params); + } + + private function handleResponse($response, $http_code) { + if ($http_code >= 200 && $http_code < 300) { + return json_decode($response, true); + } else { + throw new Exception("API Error $http_code: $response"); + } + } +} diff --git a/vendor/stripe/stripe-php/.gitignore b/vendor/stripe/stripe-php/.gitignore new file mode 100644 index 0000000..8328056 --- /dev/null +++ b/vendor/stripe/stripe-php/.gitignore @@ -0,0 +1,11 @@ +# Mac OS X dumps these all over the place. +.DS_Store + +# Ignore the SimpleTest library if it is installed to /test/. +/test/simpletest/ + +# Ignore the /vendor/ directory for people using composer +/vendor/ + +# If the vendor directory isn't being commited the composer.lock file should also be ignored +composer.lock diff --git a/vendor/stripe/stripe-php/.travis.yml b/vendor/stripe/stripe-php/.travis.yml new file mode 100644 index 0000000..408711b --- /dev/null +++ b/vendor/stripe/stripe-php/.travis.yml @@ -0,0 +1,17 @@ +language: php + +php: + - 5.2 + - 5.3 + - 5.4 + - 5.5 + - 5.6 + - hhvm + +before_script: + - sh -c "if [ '$TRAVIS_PHP_VERSION' = '5.2' ]; then wget http://iweb.dl.sourceforge.net/project/simpletest/simpletest/simpletest_1.1/simpletest_1.1.0.tar.gz; tar xf simpletest_1.1.0.tar.gz -C test; else composer install --dev --prefer-source; fi" + - sh -c "if [ '$TRAVIS_PHP_VERSION' = '5.6' ]; then pear install pear/PHP_CodeSniffer; phpenv rehash; fi" + +script: + - sh -c "if [ '$TRAVIS_PHP_VERSION' = '5.6' ]; then phpcs --standard=zend --encoding=UTF-8 --ignore=vendor -p ./; fi" + - php test/Stripe.php diff --git a/vendor/stripe/stripe-php/CHANGELOG b/vendor/stripe/stripe-php/CHANGELOG new file mode 100644 index 0000000..3e2a353 --- /dev/null +++ b/vendor/stripe/stripe-php/CHANGELOG @@ -0,0 +1,189 @@ +=== 1.18.0 2015-01-21 + +* Support making bitcoin charges through BitcoinReceiver source object + +=== 1.17.5 2014-12-23 + +* Adding support for creating file uploads. + +=== 1.17.4 2014-12-15 + +* Saving objects fetched with a custom key now works (thanks @JustinHook & @jpasilan) +* Added methods for reporting charges as safe or fraudulent and for specifying the reason for refunds + +=== 1.17.3 2014-11-06 + +* Better handling of HHVM support for SSL certificate blacklist checking. + +=== 1.17.2 2014-09-23 + +* Coupons now are backed by a `Stripe_Coupon` instead of `Stripe_Object`, and support updating metadata +* Running operations (`create`, `retrieve`, `all`) on upcoming invoice items now works + +=== 1.17.1 2014-07-31 + +* Requests now send Content-Type header + +=== 1.17.0 2014-07-29 + +* Application Fee refunds now a list instead of array +* HHVM now works +* Small bug fixes (thanks @bencromwell & @fastest963) +* __toString now returns the name of the object in addition to its JSON representation + +=== 1.16.0 2014-06-17 + +* Add metadata for refunds and disputes + +=== 1.15.0 2014-05-28 + +* Support canceling transfers + +=== 1.14.1 2014-05-21 + +* Support cards for recipients. + +=== 1.13.1 2014-05-15 + +* Fix bug in account resource where `id` wasn't in the result + +=== 1.13.0 2014-04-10 + +* Add support for certificate blacklisting +* Update ca bundle +* Drop support for HHVM (Temporarily) + +=== 1.12.0 2014-04-01 + +* Add Stripe_RateLimitError for catching rate limit errors. +* Update to Zend coding style (thanks, @jpiasetz) + +=== 1.11.0 2014-01-29 + +* Add support for multiple subscriptions per customer + +=== 1.10.1 2013-12-02 + +* Add new ApplicationFee + +=== 1.9.1 2013-11-08 + +* Fix a bug where a null nestable object causes warnings to fire. + +=== 1.9.0 2013-10-16 + +* Add support for metadata API. + +=== 1.8.4 2013-09-18 + +* Add support for closing disputes. + +=== 1.8.3 2013-08-13 + +* Add new Balance and BalanceTransaction + +=== 1.8.2 2013-08-12 + +* Add support for unsetting attributes by updating to NULL. + Setting properties to a blank string is now an error. + +=== 1.8.1 2013-07-12 + +* Add support for multiple cards API (Stripe API version 2013-07-12: https://stripe.com/docs/upgrades#2013-07-05) + +=== 1.8.0 2013-04-11 + +* Allow Transfers to be creatable +* Add new Recipient resource + +=== 1.7.15 2013-02-21 + +* Add 'id' to the list of permanent object attributes + +=== 1.7.14 2013-02-20 + +* Don't re-encode strings that are already encoded in UTF-8. If you + were previously using plan or coupon objects with UTF-8 IDs, they + may have been treated as ISO-8859-1 (Latin-1) and encoded to UTF-8 a + 2nd time. You may now need to pass the IDs to utf8_encode before + passing them to Stripe_Plan::retrieve or Stripe_Coupon::retrieve. +* Ensure that all input is encoded in UTF-8 before submitting it to + Stripe's servers. (github issue #27) + +=== 1.7.13 2013-02-01 + +* Add support for passing options when retrieving Stripe objects + e.g., Stripe_Charge::retrieve(array("id"=>"foo", "expand" => array("customer"))) + Stripe_Charge::retrieve("foo") will continue to work + +=== 1.7.12 2013-01-15 + +* Add support for setting a Stripe API version override + +=== 1.7.11 2012-12-30 + +* Version bump to cleanup constants and such (github issue #26) + +=== 1.7.10 2012-11-08 + +* Add support for updating charge disputes. +* Fix bug preventing retrieval of null attributes + +=== 1.7.9 2012-11-08 + +* Fix usage under autoloaders such as the one generated by composer + (github issue #22) + +=== 1.7.8 2012-10-30 +* Add support for creating invoices. +* Add support for new invoice lines return format +* Add support for new list objects + +=== 1.7.7 2012-09-14 + +* Get all of the various version numbers in the repo in sync (no other + changes) + +=== 1.7.6 2012-08-31 + +* Add update and pay methods to Invoice resource + +=== 1.7.5 2012-08-23 + +* Change internal function names so that Stripe_SingletonApiRequest is + E_STRICT-clean (github issue #16) + +=== 1.7.4 2012-08-21 + +* Bugfix so that Stripe objects (e.g. Customer, Charge objects) used + in API calls are transparently converted to their object IDs + +=== 1.7.3 2012-08-15 + +* Add new Account resource + +=== 1.7.2 2012-06-26 + +* Make clearer that you should be including lib/Stripe.php, not + test/Stripe.php (github issue #14) + +=== 1.7.1 2012-05-24 + +* Add missing argument to Stripe_InvalidRequestError constructor in + Stripe_ApiResource::instanceUrl. Fixes a warning when + Stripe_ApiResource::instanceUrl is called on a resource with no ID + (github issue #12) + +=== 1.7.0 2012-05-17 + +* Support Composer and Packagist (github issue #9) + +* Add new deleteDiscount method to Stripe_Customer + +* Add new Transfer resource + +* Switch from using HTTP Basic auth to Bearer auth. (Note: Stripe will + support Basic auth for the indefinite future, but recommends Bearer + auth when possible going forward) + +* Numerous test suite improvements diff --git a/vendor/stripe/stripe-php/LICENSE b/vendor/stripe/stripe-php/LICENSE new file mode 100644 index 0000000..ac9fd37 --- /dev/null +++ b/vendor/stripe/stripe-php/LICENSE @@ -0,0 +1,21 @@ +The MIT License + +Copyright (c) 2010-2014 Stripe + +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/stripe/stripe-php/README.rdoc b/vendor/stripe/stripe-php/README.rdoc new file mode 100644 index 0000000..7a0a1e1 --- /dev/null +++ b/vendor/stripe/stripe-php/README.rdoc @@ -0,0 +1,67 @@ += Stripe PHP bindings +{Build Status}[https://travis-ci.org/stripe/stripe-php] +{Latest Stable Version}[https://packagist.org/packages/stripe/stripe-php] +{Total Downloads}[https://packagist.org/packages/stripe/stripe-php] +{License}[https://packagist.org/packages/stripe/stripe-php] + +You can sign up for a Stripe account at https://stripe.com. + +== Requirements + +PHP 5.2 and later. + +== Composer + +You can install the bindings via Composer[http://getcomposer.org/]. Add this to your +composer.json+: + + { + "require": { + "stripe/stripe-php": "1.*" + } + } + +Then install via: + + composer.phar install + +To use the bindings, either user Composer's autoload[https://getcomposer.org/doc/00-intro.md#autoloading]: + + require_once('vendor/autoload.php'); + +Or manually: + + require_once('/path/to/vendor/stripe/stripe-php/lib/Stripe.php'); + +== Manual Installation + +Obtain the latest version of the Stripe PHP bindings with: + + git clone https://github.com/stripe/stripe-php + +To use the bindings, add the following to your PHP script: + + require_once("/path/to/stripe-php/lib/Stripe.php"); + +== Getting Started + +Simple usage looks like: + + Stripe::setApiKey('d8e8fca2dc0f896fd7cb4cb0031ba249'); + $myCard = array('number' => '4242424242424242', 'exp_month' => 5, 'exp_year' => 2015); + $charge = Stripe_Charge::create(array('card' => $myCard, 'amount' => 2000, 'currency' => 'usd')); + echo $charge; + +== Documentation + +Please see https://stripe.com/docs/api for up-to-date documentation. + +== Tests + +In order to run tests you have to install SimpleTest[http://packagist.org/packages/simpletest/simpletest] via Composer[http://getcomposer.org/] (recommended way): + + composer.phar update --dev + +Run test suite: + + php ./test/Stripe.php + diff --git a/vendor/stripe/stripe-php/VERSION b/vendor/stripe/stripe-php/VERSION new file mode 100644 index 0000000..84cc529 --- /dev/null +++ b/vendor/stripe/stripe-php/VERSION @@ -0,0 +1 @@ +1.18.0 diff --git a/vendor/stripe/stripe-php/composer.json b/vendor/stripe/stripe-php/composer.json new file mode 100644 index 0000000..42b50e3 --- /dev/null +++ b/vendor/stripe/stripe-php/composer.json @@ -0,0 +1,29 @@ +{ + "name": "stripe/stripe-php", + "description": "Stripe PHP Library", + "keywords": [ + "stripe", + "payment processing", + "api" + ], + "homepage": "https://stripe.com/", + "license": "MIT", + "authors": [ + { + "name": "Stripe and contributors", + "homepage": "https://github.com/stripe/stripe-php/contributors" + } + ], + "require": { + "php": ">=5.2", + "ext-curl": "*", + "ext-json": "*", + "ext-mbstring": "*" + }, + "require-dev": { + "simpletest/simpletest": "*" + }, + "autoload": { + "classmap": ["lib/Stripe/"] + } +} diff --git a/vendor/stripe/stripe-php/lib/Stripe.php b/vendor/stripe/stripe-php/lib/Stripe.php new file mode 100644 index 0000000..44fc056 --- /dev/null +++ b/vendor/stripe/stripe-php/lib/Stripe.php @@ -0,0 +1,62 @@ +_apiKey = $apiKey; + if (!$apiBase) { + $apiBase = Stripe::$apiBase; + } + $this->_apiBase = $apiBase; + } + + /** + * @param string|mixed $value A string to UTF8-encode. + * + * @returns string|mixed The UTF8-encoded string, or the object passed in if + * it wasn't a string. + */ + public static function utf8($value) + { + if (is_string($value) + && mb_detect_encoding($value, "UTF-8", TRUE) != "UTF-8") { + return utf8_encode($value); + } else { + return $value; + } + } + + private static function _encodeObjects($d) + { + if ($d instanceof Stripe_ApiResource) { + return self::utf8($d->id); + } else if ($d === true) { + return 'true'; + } else if ($d === false) { + return 'false'; + } else if (is_array($d)) { + $res = array(); + foreach ($d as $k => $v) + $res[$k] = self::_encodeObjects($v); + return $res; + } else { + return self::utf8($d); + } + } + + /** + * @param array $arr An map of param keys to values. + * @param string|null $prefix (It doesn't look like we ever use $prefix...) + * + * @returns string A querystring, essentially. + */ + public static function encode($arr, $prefix=null) + { + if (!is_array($arr)) + return $arr; + + $r = array(); + foreach ($arr as $k => $v) { + if (is_null($v)) + continue; + + if ($prefix && $k && !is_int($k)) + $k = $prefix."[".$k."]"; + else if ($prefix) + $k = $prefix."[]"; + + if (is_array($v)) { + $r[] = self::encode($v, $k, true); + } else { + $r[] = urlencode($k)."=".urlencode($v); + } + } + + return implode("&", $r); + } + + /** + * @param string $method + * @param string $url + * @param array|null $params + * @param array|null $headers + * + * @return array An array whose first element is the response and second + * element is the API key used to make the request. + */ + public function request($method, $url, $params=null, $headers=null) + { + if (!$params) { + $params = array(); + } + if (!$headers) { + $headers = array(); + } + list($rbody, $rcode, $myApiKey) = + $this->_requestRaw($method, $url, $params, $headers); + $resp = $this->_interpretResponse($rbody, $rcode); + return array($resp, $myApiKey); + } + + + /** + * @param string $rbody A JSON string. + * @param int $rcode + * @param array $resp + * + * @throws Stripe_InvalidRequestError if the error is caused by the user. + * @throws Stripe_AuthenticationError if the error is caused by a lack of + * permissions. + * @throws Stripe_CardError if the error is the error code is 402 (payment + * required) + * @throws Stripe_ApiError otherwise. + */ + public function handleApiError($rbody, $rcode, $resp) + { + if (!is_array($resp) || !isset($resp['error'])) { + $msg = "Invalid response object from API: $rbody " + ."(HTTP response code was $rcode)"; + throw new Stripe_ApiError($msg, $rcode, $rbody, $resp); + } + + $error = $resp['error']; + $msg = isset($error['message']) ? $error['message'] : null; + $param = isset($error['param']) ? $error['param'] : null; + $code = isset($error['code']) ? $error['code'] : null; + + switch ($rcode) { + case 400: + if ($code == 'rate_limit') { + throw new Stripe_RateLimitError( + $msg, $param, $rcode, $rbody, $resp + ); + } + case 404: + throw new Stripe_InvalidRequestError( + $msg, $param, $rcode, $rbody, $resp + ); + case 401: + throw new Stripe_AuthenticationError($msg, $rcode, $rbody, $resp); + case 402: + throw new Stripe_CardError($msg, $param, $code, $rcode, $rbody, $resp); + default: + throw new Stripe_ApiError($msg, $rcode, $rbody, $resp); + } + } + + private function _requestRaw($method, $url, $params, $headers) + { + if (!array_key_exists($this->_apiBase, self::$_preFlight) + || !self::$_preFlight[$this->_apiBase]) { + self::$_preFlight[$this->_apiBase] = $this->checkSslCert($this->_apiBase); + } + + $myApiKey = $this->_apiKey; + if (!$myApiKey) { + $myApiKey = Stripe::$apiKey; + } + + if (!$myApiKey) { + $msg = 'No API key provided. (HINT: set your API key using ' + . '"Stripe::setApiKey()". You can generate API keys from ' + . 'the Stripe web interface. See https://stripe.com/api for ' + . 'details, or email support@stripe.com if you have any questions.'; + throw new Stripe_AuthenticationError($msg); + } + + $absUrl = $this->_apiBase.$url; + $params = self::_encodeObjects($params); + $langVersion = phpversion(); + $uname = php_uname(); + $ua = array( + 'bindings_version' => Stripe::VERSION, + 'lang' => 'php', + 'lang_version' => $langVersion, + 'publisher' => 'stripe', + 'uname' => $uname, + ); + $defaultHeaders = array( + 'X-Stripe-Client-User-Agent' => json_encode($ua), + 'User-Agent' => 'Stripe/v1 PhpBindings/' . Stripe::VERSION, + 'Authorization' => 'Bearer ' . $myApiKey, + ); + + if (Stripe::$apiVersion) { + $defaultHeaders['Stripe-Version'] = Stripe::$apiVersion; + } + + $hasFile = false; + $hasCurlFile = class_exists('CURLFile', false); + foreach ($params as $k => $v) { + if (is_resource($v)) { + $hasFile = true; + $params[$k] = self::_processResourceParam($v, $hasCurlFile); + } else if ($hasCurlFile && $v instanceof CURLFile) { + $hasFile = true; + } + } + + if ($hasFile) { + $defaultHeaders['Content-Type'] = 'multipart/form-data'; + } else { + $defaultHeaders['Content-Type'] = 'application/x-www-form-urlencoded'; + } + + $combinedHeaders = array_merge($defaultHeaders, $headers); + $rawHeaders = array(); + + foreach ($combinedHeaders as $header => $value) { + $rawHeaders[] = $header . ': ' . $value; + } + + list($rbody, $rcode) = $this->_curlRequest( + $method, + $absUrl, + $rawHeaders, + $params, + $hasFile + ); + return array($rbody, $rcode, $myApiKey); + } + + private function _processResourceParam($resource, $hasCurlFile) + { + if (get_resource_type($resource) !== 'stream') { + throw new Stripe_ApiError( + 'Attempted to upload a resource that is not a stream' + ); + } + + $metaData = stream_get_meta_data($resource); + if ($metaData['wrapper_type'] !== 'plainfile') { + throw new Stripe_ApiError( + 'Only plainfile resource streams are supported' + ); + } + + if ($hasCurlFile) { + // We don't have the filename or mimetype, but the API doesn't care + return new CURLFile($metaData['uri']); + } else { + return '@'.$metaData['uri']; + } + } + + private function _interpretResponse($rbody, $rcode) + { + try { + $resp = json_decode($rbody, true); + } catch (Exception $e) { + $msg = "Invalid response body from API: $rbody " + . "(HTTP response code was $rcode)"; + throw new Stripe_ApiError($msg, $rcode, $rbody); + } + + if ($rcode < 200 || $rcode >= 300) { + $this->handleApiError($rbody, $rcode, $resp); + } + return $resp; + } + + private function _curlRequest($method, $absUrl, $headers, $params, $hasFile) + { + $curl = curl_init(); + $method = strtolower($method); + $opts = array(); + if ($method == 'get') { + if ($hasFile) { + throw new Stripe_ApiError( + "Issuing a GET request with a file parameter" + ); + } + $opts[CURLOPT_HTTPGET] = 1; + if (count($params) > 0) { + $encoded = self::encode($params); + $absUrl = "$absUrl?$encoded"; + } + } else if ($method == 'post') { + $opts[CURLOPT_POST] = 1; + $opts[CURLOPT_POSTFIELDS] = $hasFile ? $params : self::encode($params); + } else if ($method == 'delete') { + $opts[CURLOPT_CUSTOMREQUEST] = 'DELETE'; + if (count($params) > 0) { + $encoded = self::encode($params); + $absUrl = "$absUrl?$encoded"; + } + } else { + throw new Stripe_ApiError("Unrecognized method $method"); + } + + $absUrl = self::utf8($absUrl); + $opts[CURLOPT_URL] = $absUrl; + $opts[CURLOPT_RETURNTRANSFER] = true; + $opts[CURLOPT_CONNECTTIMEOUT] = 30; + $opts[CURLOPT_TIMEOUT] = 80; + $opts[CURLOPT_RETURNTRANSFER] = true; + $opts[CURLOPT_HTTPHEADER] = $headers; + if (!Stripe::$verifySslCerts) + $opts[CURLOPT_SSL_VERIFYPEER] = false; + + curl_setopt_array($curl, $opts); + $rbody = curl_exec($curl); + + if (!defined('CURLE_SSL_CACERT_BADFILE')) { + define('CURLE_SSL_CACERT_BADFILE', 77); // constant not defined in PHP + } + + $errno = curl_errno($curl); + if ($errno == CURLE_SSL_CACERT || + $errno == CURLE_SSL_PEER_CERTIFICATE || + $errno == CURLE_SSL_CACERT_BADFILE) { + array_push( + $headers, + 'X-Stripe-Client-Info: {"ca":"using Stripe-supplied CA bundle"}' + ); + $cert = $this->caBundle(); + curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); + curl_setopt($curl, CURLOPT_CAINFO, $cert); + $rbody = curl_exec($curl); + } + + if ($rbody === false) { + $errno = curl_errno($curl); + $message = curl_error($curl); + curl_close($curl); + $this->handleCurlError($errno, $message); + } + + $rcode = curl_getinfo($curl, CURLINFO_HTTP_CODE); + curl_close($curl); + return array($rbody, $rcode); + } + + /** + * @param number $errno + * @param string $message + * @throws Stripe_ApiConnectionError + */ + public function handleCurlError($errno, $message) + { + $apiBase = $this->_apiBase; + switch ($errno) { + case CURLE_COULDNT_CONNECT: + case CURLE_COULDNT_RESOLVE_HOST: + case CURLE_OPERATION_TIMEOUTED: + $msg = "Could not connect to Stripe ($apiBase). Please check your " + . "internet connection and try again. If this problem persists, " + . "you should check Stripe's service status at " + . "https://twitter.com/stripestatus, or"; + break; + case CURLE_SSL_CACERT: + case CURLE_SSL_PEER_CERTIFICATE: + $msg = "Could not verify Stripe's SSL certificate. Please make sure " + . "that your network is not intercepting certificates. " + . "(Try going to $apiBase in your browser.) " + . "If this problem persists,"; + break; + default: + $msg = "Unexpected error communicating with Stripe. " + . "If this problem persists,"; + } + $msg .= " let us know at support@stripe.com."; + + $msg .= "\n\n(Network error [errno $errno]: $message)"; + throw new Stripe_ApiConnectionError($msg); + } + + /** + * Preflight the SSL certificate presented by the backend. This isn't 100% + * bulletproof, in that we're not actually validating the transport used to + * communicate with Stripe, merely that the first attempt to does not use a + * revoked certificate. + * + * Unfortunately the interface to OpenSSL doesn't make it easy to check the + * certificate before sending potentially sensitive data on the wire. This + * approach raises the bar for an attacker significantly. + */ + private function checkSslCert($url) + { + if (!function_exists('stream_context_get_params') || + !function_exists('stream_socket_enable_crypto')) { + error_log( + 'Warning: This version of PHP does not support checking SSL '. + 'certificates Stripe cannot guarantee that the server has a '. + 'certificate which is not blacklisted.' + ); + return true; + } + + $url = parse_url($url); + $port = isset($url["port"]) ? $url["port"] : 443; + $url = "ssl://{$url["host"]}:{$port}"; + + $sslContext = stream_context_create( + array('ssl' => array( + 'capture_peer_cert' => true, + 'verify_peer' => true, + 'cafile' => $this->caBundle(), + )) + ); + $result = stream_socket_client( + $url, $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $sslContext + ); + if (($errno !== 0 && $errno !== NULL) || $result === false) { + throw new Stripe_ApiConnectionError( + 'Could not connect to Stripe (' . $url . '). Please check your '. + 'internet connection and try again. If this problem persists, '. + 'you should check Stripe\'s service status at '. + 'https://twitter.com/stripestatus. Reason was: '.$errstr + ); + } + + $params = stream_context_get_params($result); + + $cert = $params['options']['ssl']['peer_certificate']; + + openssl_x509_export($cert, $pemCert); + + if (self::isBlackListed($pemCert)) { + throw new Stripe_ApiConnectionError( + 'Invalid server certificate. You tried to connect to a server that '. + 'has a revoked SSL certificate, which means we cannot securely send '. + 'data to that server. Please email support@stripe.com if you need '. + 'help connecting to the correct API server.' + ); + } + + return true; + } + + /* Checks if a valid PEM encoded certificate is blacklisted + * @return boolean + */ + public static function isBlackListed($certificate) + { + $certificate = trim($certificate); + $lines = explode("\n", $certificate); + + // Kludgily remove the PEM padding + array_shift($lines); array_pop($lines); + + $derCert = base64_decode(implode("", $lines)); + $fingerprint = sha1($derCert); + return in_array($fingerprint, self::$_blacklistedCerts); + } + + private function caBundle() + { + return dirname(__FILE__) . '/../data/ca-certificates.crt'; + } +} diff --git a/vendor/stripe/stripe-php/lib/Stripe/ApiResource.php b/vendor/stripe/stripe-php/lib/Stripe/ApiResource.php new file mode 100644 index 0000000..a1c933c --- /dev/null +++ b/vendor/stripe/stripe-php/lib/Stripe/ApiResource.php @@ -0,0 +1,174 @@ +apiKey); + $instance->refresh(); + return $instance; + } + + /** + * @returns Stripe_ApiResource The refreshed resource. + */ + public function refresh() + { + $requestor = new Stripe_ApiRequestor($this->_apiKey, self::baseUrl()); + $url = $this->instanceUrl(); + + list($response, $apiKey) = $requestor->request( + 'get', + $url, + $this->_retrieveOptions + ); + $this->refreshFrom($response, $apiKey); + return $this; + } + + /** + * @param array options + * + * @returns Stripe_RequestOptions with either passed in or saved API key + */ + public function parseOptions($options) + { + $opts = Stripe_RequestOptions::parse($options); + $key = ($opts->apiKey ? $opts->apiKey : $this->_apiKey); + $opts->apiKey = $key; + return $opts; + } + + /** + * @param string $class + * + * @returns string The name of the class, with namespacing and underscores + * stripped. + */ + public static function className($class) + { + // Useful for namespaces: Foo\Stripe_Charge + if ($postfixNamespaces = strrchr($class, '\\')) { + $class = substr($postfixNamespaces, 1); + } + // Useful for underscored 'namespaces': Foo_Stripe_Charge + if ($postfixFakeNamespaces = strrchr($class, 'Stripe_')) { + $class = $postfixFakeNamespaces; + } + if (substr($class, 0, strlen('Stripe')) == 'Stripe') { + $class = substr($class, strlen('Stripe')); + } + $class = str_replace('_', '', $class); + $name = urlencode($class); + $name = strtolower($name); + return $name; + } + + /** + * @param string $class + * + * @returns string The endpoint URL for the given class. + */ + public static function classUrl($class) + { + $base = self::_scopedLsb($class, 'className', $class); + return "/v1/${base}s"; + } + + /** + * @returns string The full API URL for this API resource. + */ + public function instanceUrl() + { + $id = $this['id']; + $class = get_class($this); + if ($id === null) { + $message = "Could not determine which URL to request: " + . "$class instance has invalid ID: $id"; + throw new Stripe_InvalidRequestError($message, null); + } + $id = Stripe_ApiRequestor::utf8($id); + $base = $this->_lsb('classUrl', $class); + $extn = urlencode($id); + return "$base/$extn"; + } + + private static function _validateCall($method, $params=null, $options=null) + { + if ($params && !is_array($params)) { + $message = "You must pass an array as the first argument to Stripe API " + . "method calls. (HINT: an example call to create a charge " + . "would be: \"StripeCharge::create(array('amount' => 100, " + . "'currency' => 'usd', 'card' => array('number' => " + . "4242424242424242, 'exp_month' => 5, 'exp_year' => 2015)))\")"; + throw new Stripe_Error($message); + } + + if ($options && (!is_string($options) && !is_array($options))) { + $message = 'The second argument to Stripe API method calls is an ' + . 'optional per-request apiKey, which must be a string, or ' + . 'per-request options, which must be an array. ' + . '(HINT: you can set a global apiKey by ' + . '"Stripe::setApiKey()")'; + throw new Stripe_Error($message); + } + } + + protected static function _scopedAll($class, $params=null, $options=null) + { + self::_validateCall('all', $params, $options); + $base = self::_scopedLsb($class, 'baseUrl'); + $url = self::_scopedLsb($class, 'classUrl', $class); + $opts = Stripe_RequestOptions::parse($options); + $requestor = new Stripe_ApiRequestor($opts->apiKey, $base); + list($response, $apiKey) = + $requestor->request('get', $url, $params, $opts->headers); + return Stripe_Util::convertToStripeObject($response, $apiKey); + } + + protected static function _scopedCreate($class, $params=null, $options=null) + { + self::_validateCall('create', $params, $options); + $opts = Stripe_RequestOptions::parse($options); + $base = self::_scopedLsb($class, 'baseUrl'); + $requestor = new Stripe_ApiRequestor($opts->apiKey, $base); + $url = self::_scopedLsb($class, 'classUrl', $class); + list($response, $apiKey) = + $requestor->request('post', $url, $params, $opts->headers); + return Stripe_Util::convertToStripeObject($response, $apiKey); + } + + protected function _scopedSave($class, $options=null) + { + self::_validateCall('save', null, $options); + $opts = Stripe_RequestOptions::parse($options); + $key = ($opts->apiKey ? $opts->apiKey : $this->_apiKey); + $requestor = new Stripe_ApiRequestor($key, self::baseUrl()); + $params = $this->serializeParameters(); + + if (count($params) > 0) { + $url = $this->instanceUrl(); + list($response, $apiKey) = $requestor->request('post', $url, $params); + $this->refreshFrom($response, $apiKey); + } + return $this; + } + + protected function _scopedDelete($class, $params=null, $options=null) + { + self::_validateCall('delete', $params, $options); + $opts = Stripe_RequestOptions::parse($options); + $key = ($opts->apiKey ? $opts->apiKey : $this->_apiKey); + $requestor = new Stripe_ApiRequestor($key, self::baseUrl()); + $url = $this->instanceUrl(); + list($response, $apiKey) = $requestor->request('delete', $url, $params); + $this->refreshFrom($response, $apiKey); + return $this; + } +} diff --git a/vendor/stripe/stripe-php/lib/Stripe/ApplicationFee.php b/vendor/stripe/stripe-php/lib/Stripe/ApplicationFee.php new file mode 100644 index 0000000..7cf4200 --- /dev/null +++ b/vendor/stripe/stripe-php/lib/Stripe/ApplicationFee.php @@ -0,0 +1,53 @@ +_apiKey); + $url = $this->instanceUrl() . '/refund'; + list($response, $apiKey) = $requestor->request('post', $url, $params); + $this->refreshFrom($response, $apiKey); + return $this; + } +} diff --git a/vendor/stripe/stripe-php/lib/Stripe/ApplicationFeeRefund.php b/vendor/stripe/stripe-php/lib/Stripe/ApplicationFeeRefund.php new file mode 100644 index 0000000..93bfdf5 --- /dev/null +++ b/vendor/stripe/stripe-php/lib/Stripe/ApplicationFeeRefund.php @@ -0,0 +1,36 @@ +_values), array_keys($properties)); + // Don't unset, but rather set to null so we send up '' for deletion. + foreach ($removed as $k) { + $this->$k = null; + } + + foreach ($properties as $k => $v) { + $this->$k = $v; + } + } +} diff --git a/vendor/stripe/stripe-php/lib/Stripe/AuthenticationError.php b/vendor/stripe/stripe-php/lib/Stripe/AuthenticationError.php new file mode 100644 index 0000000..0c82030 --- /dev/null +++ b/vendor/stripe/stripe-php/lib/Stripe/AuthenticationError.php @@ -0,0 +1,5 @@ +param = $param; + $this->code = $code; + } +} diff --git a/vendor/stripe/stripe-php/lib/Stripe/Charge.php b/vendor/stripe/stripe-php/lib/Stripe/Charge.php new file mode 100644 index 0000000..5c0f6dd --- /dev/null +++ b/vendor/stripe/stripe-php/lib/Stripe/Charge.php @@ -0,0 +1,137 @@ +parseOptions($options); + $requestor = new Stripe_ApiRequestor($opts->apiKey); + $url = $this->instanceUrl() . '/refund'; + list($response, $apiKey) = + $requestor->request('post', $url, $params, $opts->headers); + $this->refreshFrom($response, $apiKey); + return $this; + } + + /** + * @param array|null $params + * + * @return Stripe_Charge The captured charge. + */ + public function capture($params=null, $options=null) + { + $opts = $this->parseOptions($options); + $requestor = new Stripe_ApiRequestor($opts->apiKey); + $url = $this->instanceUrl() . '/capture'; + list($response, $apiKey) = + $requestor->request('post', $url, $params, $opts->headers); + $this->refreshFrom($response, $apiKey); + return $this; + } + + /** + * @param array|null $params + * + * @return array The updated dispute. + */ + public function updateDispute($params=null, $option=null) + { + $opts = $this->parseOptions($options); + $requestor = new Stripe_ApiRequestor($opts->apiKey); + $url = $this->instanceUrl() . '/dispute'; + list($response, $apiKey) = + $requestor->request('post', $url, $params, $headers); + $this->refreshFrom(array('dispute' => $response), $apiKey, true); + return $this->dispute; + } + + /** + * @return Stripe_Charge The updated charge. + */ + public function closeDispute($options=null) + { + $opts = $this->parseOptions($options); + $requestor = new Stripe_ApiRequestor($opts->apiKey); + $url = $this->instanceUrl() . '/dispute/close'; + list($response, $apiKey) = + $requestor->request('post', $url, null, $opts->headers); + $this->refreshFrom($response, $apiKey); + return $this; + } + + /** + * @return Stripe_Charge The updated charge. + */ + public function markAsFraudulent() + { + $params = array('fraud_details' => array('user_report' => 'fraudulent')); + $requestor = new Stripe_ApiRequestor($this->_apiKey); + $url = $this->instanceUrl(); + list($response, $apiKey) = $requestor->request('post', $url, $params); + $this->refreshFrom($response, $apiKey); + return $this; + } + + /** + * @return Stripe_Charge The updated charge. + */ + public function markAsSafe() + { + $params = array('fraud_details' => array('user_report' => 'safe')); + $requestor = new Stripe_ApiRequestor($this->_apiKey); + $url = $this->instanceUrl(); + list($response, $apiKey) = $requestor->request('post', $url, $params); + $this->refreshFrom($response, $apiKey); + return $this; + } +} diff --git a/vendor/stripe/stripe-php/lib/Stripe/Coupon.php b/vendor/stripe/stripe-php/lib/Stripe/Coupon.php new file mode 100644 index 0000000..1a479eb --- /dev/null +++ b/vendor/stripe/stripe-php/lib/Stripe/Coupon.php @@ -0,0 +1,60 @@ +id; + $ii = Stripe_InvoiceItem::create($params, $this->_apiKey); + return $ii; + } + + /** + * @param array|null $params + * + * @returns array An array of the customer's Stripe_Invoices. + */ + public function invoices($params=null) + { + if (!$params) + $params = array(); + $params['customer'] = $this->id; + $invoices = Stripe_Invoice::all($params, $this->_apiKey); + return $invoices; + } + + /** + * @param array|null $params + * + * @returns array An array of the customer's Stripe_InvoiceItems. + */ + public function invoiceItems($params=null) + { + if (!$params) + $params = array(); + $params['customer'] = $this->id; + $iis = Stripe_InvoiceItem::all($params, $this->_apiKey); + return $iis; + } + + /** + * @param array|null $params + * + * @returns array An array of the customer's Stripe_Charges. + */ + public function charges($params=null) + { + if (!$params) + $params = array(); + $params['customer'] = $this->id; + $charges = Stripe_Charge::all($params, $this->_apiKey); + return $charges; + } + + /** + * @param array|null $params + * + * @returns Stripe_Subscription The updated subscription. + */ + public function updateSubscription($params=null) + { + $requestor = new Stripe_ApiRequestor($this->_apiKey); + $url = $this->instanceUrl() . '/subscription'; + list($response, $apiKey) = $requestor->request('post', $url, $params); + $this->refreshFrom(array('subscription' => $response), $apiKey, true); + return $this->subscription; + } + + /** + * @param array|null $params + * + * @returns Stripe_Subscription The cancelled subscription. + */ + public function cancelSubscription($params=null) + { + $requestor = new Stripe_ApiRequestor($this->_apiKey); + $url = $this->instanceUrl() . '/subscription'; + list($response, $apiKey) = $requestor->request('delete', $url, $params); + $this->refreshFrom(array('subscription' => $response), $apiKey, true); + return $this->subscription; + } + + /** + * @param array|null $params + * + * @returns Stripe_Customer The updated customer. + */ + public function deleteDiscount() + { + $requestor = new Stripe_ApiRequestor($this->_apiKey); + $url = $this->instanceUrl() . '/discount'; + list($response, $apiKey) = $requestor->request('delete', $url); + $this->refreshFrom(array('discount' => null), $apiKey, true); + } +} diff --git a/vendor/stripe/stripe-php/lib/Stripe/Error.php b/vendor/stripe/stripe-php/lib/Stripe/Error.php new file mode 100644 index 0000000..19705c9 --- /dev/null +++ b/vendor/stripe/stripe-php/lib/Stripe/Error.php @@ -0,0 +1,29 @@ +httpStatus = $httpStatus; + $this->httpBody = $httpBody; + $this->jsonBody = $jsonBody; + } + + public function getHttpStatus() + { + return $this->httpStatus; + } + + public function getHttpBody() + { + return $this->httpBody; + } + + public function getJsonBody() + { + return $this->jsonBody; + } +} diff --git a/vendor/stripe/stripe-php/lib/Stripe/Event.php b/vendor/stripe/stripe-php/lib/Stripe/Event.php new file mode 100644 index 0000000..6bd3f63 --- /dev/null +++ b/vendor/stripe/stripe-php/lib/Stripe/Event.php @@ -0,0 +1,28 @@ +param = $param; + } +} diff --git a/vendor/stripe/stripe-php/lib/Stripe/Invoice.php b/vendor/stripe/stripe-php/lib/Stripe/Invoice.php new file mode 100644 index 0000000..29b2473 --- /dev/null +++ b/vendor/stripe/stripe-php/lib/Stripe/Invoice.php @@ -0,0 +1,75 @@ +request('get', $url, $params); + return Stripe_Util::convertToStripeObject($response, $apiKey); + } + + /** + * @return Stripe_Invoice The saved invoice. + */ + public function save() + { + $class = get_class(); + return self::_scopedSave($class); + } + + /** + * @return Stripe_Invoice The paid invoice. + */ + public function pay() + { + $requestor = new Stripe_ApiRequestor($this->_apiKey); + $url = $this->instanceUrl() . '/pay'; + list($response, $apiKey) = $requestor->request('post', $url); + $this->refreshFrom($response, $apiKey); + return $this; + } +} diff --git a/vendor/stripe/stripe-php/lib/Stripe/InvoiceItem.php b/vendor/stripe/stripe-php/lib/Stripe/InvoiceItem.php new file mode 100644 index 0000000..4987d27 --- /dev/null +++ b/vendor/stripe/stripe-php/lib/Stripe/InvoiceItem.php @@ -0,0 +1,58 @@ +extractPathAndUpdateParams($params); + + $requestor = new Stripe_ApiRequestor($this->_apiKey); + list($response, $apiKey) = $requestor->request('get', $url, $params); + return Stripe_Util::convertToStripeObject($response, $apiKey); + } + + public function create($params=null) + { + list($url, $params) = $this->extractPathAndUpdateParams($params); + + $requestor = new Stripe_ApiRequestor($this->_apiKey); + list($response, $apiKey) = $requestor->request('post', $url, $params); + return Stripe_Util::convertToStripeObject($response, $apiKey); + } + + public function retrieve($id, $params=null) + { + list($url, $params) = $this->extractPathAndUpdateParams($params); + + $requestor = new Stripe_ApiRequestor($this->_apiKey); + $id = Stripe_ApiRequestor::utf8($id); + $extn = urlencode($id); + list($response, $apiKey) = $requestor->request( + 'get', "$url/$extn", $params + ); + return Stripe_Util::convertToStripeObject($response, $apiKey); + } + + private function extractPathAndUpdateParams($params) + { + $url = parse_url($this->url); + if (!isset($url['path'])) { + throw new Stripe_APIError("Could not parse list url into parts: $url"); + } + + if (isset($url['query'])) { + // If the URL contains a query param, parse it out into $params so they + // don't interact weirdly with each other. + $query = array(); + parse_str($url['query'], $query); + // PHP 5.2 doesn't support the ?: operator :( + $params = array_merge($params ? $params : array(), $query); + } + + return array($url['path'], $params); + } +} diff --git a/vendor/stripe/stripe-php/lib/Stripe/Object.php b/vendor/stripe/stripe-php/lib/Stripe/Object.php new file mode 100644 index 0000000..bab08b9 --- /dev/null +++ b/vendor/stripe/stripe-php/lib/Stripe/Object.php @@ -0,0 +1,265 @@ +_apiKey = $apiKey; + $this->_values = array(); + $this->_unsavedValues = new Stripe_Util_Set(); + $this->_transientValues = new Stripe_Util_Set(); + + $this->_retrieveOptions = array(); + if (is_array($id)) { + foreach ($id as $key => $value) { + if ($key != 'id') { + $this->_retrieveOptions[$key] = $value; + } + } + $id = $id['id']; + } + + if ($id !== null) { + $this->id = $id; + } + } + + // Standard accessor magic methods + public function __set($k, $v) + { + if ($v === "") { + throw new InvalidArgumentException( + 'You cannot set \''.$k.'\'to an empty string. ' + .'We interpret empty strings as NULL in requests. ' + .'You may set obj->'.$k.' = NULL to delete the property' + ); + } + + if (self::$nestedUpdatableAttributes->includes($k) + && isset($this->$k) && is_array($v)) { + $this->$k->replaceWith($v); + } else { + // TODO: may want to clear from $_transientValues (Won't be user-visible). + $this->_values[$k] = $v; + } + if (!self::$permanentAttributes->includes($k)) + $this->_unsavedValues->add($k); + } + public function __isset($k) + { + return isset($this->_values[$k]); + } + public function __unset($k) + { + unset($this->_values[$k]); + $this->_transientValues->add($k); + $this->_unsavedValues->discard($k); + } + public function __get($k) + { + if (array_key_exists($k, $this->_values)) { + return $this->_values[$k]; + } else if ($this->_transientValues->includes($k)) { + $class = get_class($this); + $attrs = join(', ', array_keys($this->_values)); + $message = "Stripe Notice: Undefined property of $class instance: $k. " + . "HINT: The $k attribute was set in the past, however. " + . "It was then wiped when refreshing the object " + . "with the result returned by Stripe's API, " + . "probably as a result of a save(). The attributes currently " + . "available on this object are: $attrs"; + error_log($message); + return null; + } else { + $class = get_class($this); + error_log("Stripe Notice: Undefined property of $class instance: $k"); + return null; + } + } + + // ArrayAccess methods + public function offsetSet($k, $v) + { + $this->$k = $v; + } + + public function offsetExists($k) + { + return array_key_exists($k, $this->_values); + } + + public function offsetUnset($k) + { + unset($this->$k); + } + public function offsetGet($k) + { + return array_key_exists($k, $this->_values) ? $this->_values[$k] : null; + } + + public function keys() + { + return array_keys($this->_values); + } + + /** + * This unfortunately needs to be public to be used in Util.php + * + * @param string $class + * @param array $values + * @param string|null $apiKey + * + * @return Stripe_Object The object constructed from the given values. + */ + public static function scopedConstructFrom($class, $values, $apiKey=null) + { + $obj = new $class(isset($values['id']) ? $values['id'] : null, $apiKey); + $obj->refreshFrom($values, $apiKey); + return $obj; + } + + /** + * @param array $values + * @param string|null $apiKey + * + * @return Stripe_Object The object of the same class as $this constructed + * from the given values. + */ + public static function constructFrom($values, $apiKey=null) + { + return self::scopedConstructFrom(__CLASS__, $values, $apiKey); + } + + /** + * Refreshes this object using the provided values. + * + * @param array $values + * @param string $apiKey + * @param boolean $partial Defaults to false. + */ + public function refreshFrom($values, $apiKey, $partial=false) + { + $this->_apiKey = $apiKey; + + // Wipe old state before setting new. This is useful for e.g. updating a + // customer, where there is no persistent card parameter. Mark those values + // which don't persist as transient + if ($partial) { + $removed = new Stripe_Util_Set(); + } else { + $removed = array_diff(array_keys($this->_values), array_keys($values)); + } + + foreach ($removed as $k) { + if (self::$permanentAttributes->includes($k)) + continue; + unset($this->$k); + } + + foreach ($values as $k => $v) { + if (self::$permanentAttributes->includes($k) && isset($this[$k])) + continue; + + if (self::$nestedUpdatableAttributes->includes($k) && is_array($v)) { + $this->_values[$k] = Stripe_Object::scopedConstructFrom( + 'Stripe_AttachedObject', $v, $apiKey + ); + } else { + $this->_values[$k] = Stripe_Util::convertToStripeObject($v, $apiKey); + } + + $this->_transientValues->discard($k); + $this->_unsavedValues->discard($k); + } + } + + /** + * @return array A recursive mapping of attributes to values for this object, + * including the proper value for deleted attributes. + */ + public function serializeParameters() + { + $params = array(); + if ($this->_unsavedValues) { + foreach ($this->_unsavedValues->toArray() as $k) { + $v = $this->$k; + if ($v === NULL) { + $v = ''; + } + $params[$k] = $v; + } + } + + // Get nested updates. + foreach (self::$nestedUpdatableAttributes->toArray() as $property) { + if (isset($this->$property) + && $this->$property instanceOf Stripe_Object) { + $params[$property] = $this->$property->serializeParameters(); + } + } + return $params; + } + + // Pretend to have late static bindings, even in PHP 5.2 + protected function _lsb($method) + { + $class = get_class($this); + $args = array_slice(func_get_args(), 1); + return call_user_func_array(array($class, $method), $args); + } + protected static function _scopedLsb($class, $method) + { + $args = array_slice(func_get_args(), 2); + return call_user_func_array(array($class, $method), $args); + } + + public function __toJSON() + { + if (defined('JSON_PRETTY_PRINT')) { + return json_encode($this->__toArray(true), JSON_PRETTY_PRINT); + } else { + return json_encode($this->__toArray(true)); + } + } + + public function __toString() + { + $class = get_class($this); + return $class . ' JSON: ' . $this->__toJSON(); + } + + public function __toArray($recursive=false) + { + if ($recursive) { + return Stripe_Util::convertStripeObjectToArray($this->_values); + } else { + return $this->_values; + } + } +} + + +Stripe_Object::init(); diff --git a/vendor/stripe/stripe-php/lib/Stripe/Plan.php b/vendor/stripe/stripe-php/lib/Stripe/Plan.php new file mode 100644 index 0000000..2d7d99e --- /dev/null +++ b/vendor/stripe/stripe-php/lib/Stripe/Plan.php @@ -0,0 +1,60 @@ +id; + $transfers = Stripe_Transfer::all($params, $this->_apiKey); + return $transfers; + } +} diff --git a/vendor/stripe/stripe-php/lib/Stripe/Refund.php b/vendor/stripe/stripe-php/lib/Stripe/Refund.php new file mode 100644 index 0000000..f9d5463 --- /dev/null +++ b/vendor/stripe/stripe-php/lib/Stripe/Refund.php @@ -0,0 +1,36 @@ +apiKey = $key; + $this->headers = $headers; + } + + /** + * Unpacks an options array into an Options object + * @param array|string $options a key => value array + * @return Options + */ + public static function parse($options) + { + if (is_null($options)) { + return new Stripe_RequestOptions(null, array()); + } + + if (is_string($options)) { + return new Stripe_RequestOptions($options, array()); + } + + if (is_array($options)) { + $headers = array(); + $key = null; + if (array_key_exists('api_key', $options)) { + $key = $options['api_key']; + } + if (array_key_exists('idempotency_key', $options)) { + $headers['Idempotency-Key'] = $options['idempotency_key']; + } + return new Stripe_RequestOptions($key, $headers); + } + + throw new Stripe_Error("options must be a string, an array, or null"); + } +} diff --git a/vendor/stripe/stripe-php/lib/Stripe/SingletonApiResource.php b/vendor/stripe/stripe-php/lib/Stripe/SingletonApiResource.php new file mode 100644 index 0000000..8cd4436 --- /dev/null +++ b/vendor/stripe/stripe-php/lib/Stripe/SingletonApiResource.php @@ -0,0 +1,31 @@ +refresh(); + return $instance; + } + + /** + * @param Stripe_SingletonApiResource $class + * @return string The endpoint associated with this singleton class. + */ + public static function classUrl($class) + { + $base = self::className($class); + return "/v1/${base}"; + } + + /** + * @return string The endpoint associated with this singleton API resource. + */ + public function instanceUrl() + { + $class = get_class($this); + $base = self::classUrl($class); + return "$base"; + } +} diff --git a/vendor/stripe/stripe-php/lib/Stripe/Stripe.php b/vendor/stripe/stripe-php/lib/Stripe/Stripe.php new file mode 100644 index 0000000..281d058 --- /dev/null +++ b/vendor/stripe/stripe-php/lib/Stripe/Stripe.php @@ -0,0 +1,77 @@ +_apiKey); + $url = $this->instanceUrl() . '/discount'; + list($response, $apiKey) = $requestor->request('delete', $url); + $this->refreshFrom(array('discount' => null), $apiKey, true); + } +} diff --git a/vendor/stripe/stripe-php/lib/Stripe/Token.php b/vendor/stripe/stripe-php/lib/Stripe/Token.php new file mode 100644 index 0000000..14195c1 --- /dev/null +++ b/vendor/stripe/stripe-php/lib/Stripe/Token.php @@ -0,0 +1,28 @@ +_apiKey); + $url = $this->instanceUrl() . '/cancel'; + list($response, $apiKey) = $requestor->request('post', $url); + $this->refreshFrom($response, $apiKey); + return $this; + } + + /** + * @return Stripe_Transfer The saved transfer. + */ + public function save() + { + $class = get_class(); + return self::_scopedSave($class); + } + +} diff --git a/vendor/stripe/stripe-php/lib/Stripe/Util.php b/vendor/stripe/stripe-php/lib/Stripe/Util.php new file mode 100644 index 0000000..4b3cddc --- /dev/null +++ b/vendor/stripe/stripe-php/lib/Stripe/Util.php @@ -0,0 +1,94 @@ + $v) { + // FIXME: this is an encapsulation violation + if ($k[0] == '_') { + continue; + } + if ($v instanceof Stripe_Object) { + $results[$k] = $v->__toArray(true); + } else if (is_array($v)) { + $results[$k] = self::convertStripeObjectToArray($v); + } else { + $results[$k] = $v; + } + } + return $results; + } + + /** + * Converts a response from the Stripe API to the corresponding PHP object. + * + * @param array $resp The response from the Stripe API. + * @param string $apiKey + * @return Stripe_Object|array + */ + public static function convertToStripeObject($resp, $apiKey) + { + $types = array( + 'card' => 'Stripe_Card', + 'charge' => 'Stripe_Charge', + 'coupon' => 'Stripe_Coupon', + 'customer' => 'Stripe_Customer', + 'list' => 'Stripe_List', + 'invoice' => 'Stripe_Invoice', + 'invoiceitem' => 'Stripe_InvoiceItem', + 'event' => 'Stripe_Event', + 'transfer' => 'Stripe_Transfer', + 'plan' => 'Stripe_Plan', + 'recipient' => 'Stripe_Recipient', + 'refund' => 'Stripe_Refund', + 'subscription' => 'Stripe_Subscription', + 'fee_refund' => 'Stripe_ApplicationFeeRefund', + 'bitcoin_receiver' => 'Stripe_BitcoinReceiver', + 'bitcoin_transaction' => 'Stripe_BitcoinTransaction' + ); + if (self::isList($resp)) { + $mapped = array(); + foreach ($resp as $i) + array_push($mapped, self::convertToStripeObject($i, $apiKey)); + return $mapped; + } else if (is_array($resp)) { + if (isset($resp['object']) + && is_string($resp['object']) + && isset($types[$resp['object']])) { + $class = $types[$resp['object']]; + } else { + $class = 'Stripe_Object'; + } + return Stripe_Object::scopedConstructFrom($class, $resp, $apiKey); + } else { + return $resp; + } + } +} diff --git a/vendor/stripe/stripe-php/lib/Stripe/Util/Set.php b/vendor/stripe/stripe-php/lib/Stripe/Util/Set.php new file mode 100644 index 0000000..bae9622 --- /dev/null +++ b/vendor/stripe/stripe-php/lib/Stripe/Util/Set.php @@ -0,0 +1,39 @@ +_elts = array(); + foreach ($members as $item) { + $this->_elts[$item] = true; + } + } + + public function includes($elt) + { + return isset($this->_elts[$elt]); + } + + public function add($elt) + { + $this->_elts[$elt] = true; + } + + public function discard($elt) + { + unset($this->_elts[$elt]); + } + + public function toArray() + { + return array_keys($this->_elts); + } + + public function getIterator() + { + return new ArrayIterator($this->toArray()); + } +} diff --git a/vendor/stripe/stripe-php/lib/data/ca-certificates.crt b/vendor/stripe/stripe-php/lib/data/ca-certificates.crt new file mode 100644 index 0000000..0e11f6d --- /dev/null +++ b/vendor/stripe/stripe-php/lib/data/ca-certificates.crt @@ -0,0 +1,5165 @@ +# Generated by https://gist.github.com/ab/9756531 on 2014-03-25 +# from Ubuntu ca-certificates 20130906. +# See http://www.ubuntu.com/usn/usn-2154-1/ for version info. + +================================================================ +C: AT +O: A-Trust Ges. f. Sicherheitssysteme im elektr. Datenverkehr GmbH +OU: A-Trust-nQual-03 +CN: A-Trust-nQual-03 +-----BEGIN CERTIFICATE----- +MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJB +VDFIMEYGA1UECgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBp +bSBlbGVrdHIuIERhdGVudmVya2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5R +dWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5RdWFsLTAzMB4XDTA1MDgxNzIyMDAw +MFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgwRgYDVQQKDD9BLVRy +dXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0ZW52 +ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMM +EEEtVHJ1c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCtPWFuA/OQO8BBC4SAzewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUj +lUC5B3ilJfYKvUWG6Nm9wASOhURh73+nyfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZ +znF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPESU7l0+m0iKsMrmKS1GWH +2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4iHQF63n1 +k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs +2e3Vcuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYD +VR0OBAoECERqlWdVeRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC +AQEAVdRU0VlIXLOThaq/Yy/kgM40ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fG +KOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmrsQd7TZjTXLDR8KdCoLXEjq/+ +8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZdJXDRZslo+S4R +FGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS +mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmE +DNuxUCAKGkq6ahq97BvIxYSazQ== +-----END CERTIFICATE----- + +================================================================ +C: BE +O: GlobalSign nv-sa +OU: Root CA +CN: GlobalSign Root CA +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG +A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv +b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw +MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i +YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT +aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ +jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp +xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp +1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG +snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ +U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 +9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E +BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B +AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz +yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE +38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP +AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad +DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME +HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- + +================================================================ +C: BM +O: QuoVadis Limited +CN: QuoVadis Root CA 2 +-----BEGIN CERTIFICATE----- +MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa +GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg +Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J +WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB +rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp ++ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 +ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i +Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz +PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og +/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH +oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI +yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud +EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 +A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL +MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT +ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f +BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn +g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl +fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K +WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha +B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc +hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR +TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD +mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z +ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y +4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza +8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u +-----END CERTIFICATE----- + +================================================================ +C: BM +O: QuoVadis Limited +CN: QuoVadis Root CA 3 +-----BEGIN CERTIFICATE----- +MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM +V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB +4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr +H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd +8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv +vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT +mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe +btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc +T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt +WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ +c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A +4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD +VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG +CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 +aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 +aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu +dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw +czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G +A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg +Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 +7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem +d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd ++LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B +4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN +t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x +DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 +k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s +zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j +Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT +mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK +4SVhM7JZG+Ju1zdXtg2pEto= +-----END CERTIFICATE----- + +================================================================ +C: BM +O: QuoVadis Limited +OU: Root Certification Authority +CN: QuoVadis Root Certification Authority +-----BEGIN CERTIFICATE----- +MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz +MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw +IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR +dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp +li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D +rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ +WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug +F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU +xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC +Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv +dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw +ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl +IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh +c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy +ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh +Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI +KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T +KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq +y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p +dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD +VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL +MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk +fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8 +7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R +cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y +mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW +xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK +SnQ2+Q== +-----END CERTIFICATE----- + +================================================================ +C: CH +O: SwissSign AG +CN: SwissSign Gold CA - G2 +-----BEGIN CERTIFICATE----- +MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV +BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln +biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF +MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT +d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC +CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8 +76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+ +bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c +6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE +emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd +MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt +MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y +MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y +FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi +aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM +gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB +qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7 +lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn +8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov +L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6 +45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO +UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5 +O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC +bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv +GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a +77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC +hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3 +92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp +Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w +ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt +Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ +-----END CERTIFICATE----- + +================================================================ +C: CH +O: SwissSign AG +CN: SwissSign Platinum CA - G2 +-----BEGIN CERTIFICATE----- +MIIFwTCCA6mgAwIBAgIITrIAZwwDXU8wDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UE +BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEjMCEGA1UEAxMaU3dpc3NTaWdu +IFBsYXRpbnVtIENBIC0gRzIwHhcNMDYxMDI1MDgzNjAwWhcNMzYxMDI1MDgzNjAw +WjBJMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMSMwIQYDVQQD +ExpTd2lzc1NpZ24gUGxhdGludW0gQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAMrfogLi2vj8Bxax3mCq3pZcZB/HL37PZ/pEQtZ2Y5Wu669y +IIpFR4ZieIbWIDkm9K6j/SPnpZy1IiEZtzeTIsBQnIJ71NUERFzLtMKfkr4k2Htn +IuJpX+UFeNSH2XFwMyVTtIc7KZAoNppVRDBopIOXfw0enHb/FZ1glwCNioUD7IC+ +6ixuEFGSzH7VozPY1kneWCqv9hbrS3uQMpe5up1Y8fhXSQQeol0GcN1x2/ndi5ob +jM89o03Oy3z2u5yg+gnOI2Ky6Q0f4nIoj5+saCB9bzuohTEJfwvH6GXp43gOCWcw +izSC+13gzJ2BbWLuCB4ELE6b7P6pT1/9aXjvCR+htL/68++QHkwFix7qepF6w9fl ++zC8bBsQWJj3Gl/QKTIDE0ZNYWqFTFJ0LwYfexHihJfGmfNtf9dng34TaNhxKFrY +zt3oEBSa/m0jh26OWnA81Y0JAKeqvLAxN23IhBQeW71FYyBrS3SMvds6DsHPWhaP +pZjydomyExI7C3d3rLvlPClKknLKYRorXkzig3R3+jVIeoVNjZpTxN94ypeRSCtF +KwH3HBqi7Ri6Cr2D+m+8jVeTO9TUps4e8aCxzqv9KyiaTxvXw3LbpMS/XUz13XuW +ae5ogObnmLo2t/5u7Su9IPhlGdpVCX4l3P5hYnL5fhgC72O00Puv5TtjjGePAgMB +AAGjgawwgakwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O +BBYEFFCvzAeHFUdvOMW0ZdHelarp35zMMB8GA1UdIwQYMBaAFFCvzAeHFUdvOMW0 +ZdHelarp35zMMEYGA1UdIAQ/MD0wOwYJYIV0AVkBAQEBMC4wLAYIKwYBBQUHAgEW +IGh0dHA6Ly9yZXBvc2l0b3J5LnN3aXNzc2lnbi5jb20vMA0GCSqGSIb3DQEBBQUA +A4ICAQAIhab1Fgz8RBrBY+D5VUYI/HAcQiiWjrfFwUF1TglxeeVtlspLpYhg0DB0 +uMoI3LQwnkAHFmtllXcBrqS3NQuB2nEVqXQXOHtYyvkv+8Bldo1bAbl93oI9ZLi+ +FHSjClTTLJUYFzX1UWs/j6KWYTl4a0vlpqD4U99REJNi54Av4tHgvI42Rncz7Lj7 +jposiU0xEQ8mngS7twSNC/K5/FqdOxa3L8iYq/6KUFkuozv8KV2LwUvJ4ooTHbG/ +u0IdUt1O2BReEMYxB+9xJ/cbOQncguqLs5WGXv312l0xpuAxtpTmREl0xRbl9x8D +YSjFyMsSoEJL+WuICI20MhjzdZ/EfwBPBZWcoxcCw7NTm6ogOSkrZvqdr16zktK1 +puEa+S1BaYEUtLS17Yk9zvupnTVCRLEcFHOBzyoBNZox1S2PbYTfgE1X4z/FhHXa +icYwu+uPyyIIoK6q8QNsOktNCaUOcsZWayFCTiMlFGiudgp8DAdwZPmaL/YFOSbG +DI8Zf0NebvRbFS/bYV3mZy8/CJT5YLSYMdp08YSTcU1f+2BY0fvEwW2JorsgH51x +kcsymxM9Pn2SUjWskpSi0xjCfMfqr3YFFt1nJ8J+HAciIfNAChs0B0QTwoRqjt8Z +Wr9/6x3iGjjRXK9HkmuAtTClyY3YqzGBH9/CZjfTk6mFhnll0g== +-----END CERTIFICATE----- + +================================================================ +C: CH +O: SwissSign AG +CN: SwissSign Silver CA - G2 +-----BEGIN CERTIFICATE----- +MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UE +BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWdu +IFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0Nlow +RzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMY +U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644N0Mv +Fz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7br +YT7QbNHm+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieF +nbAVlDLaYQ1HTWBCrpJH6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH +6ATK72oxh9TAtvmUcXtnZLi2kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZt +eJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/ +c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJ +MoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRH +HTBsROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTf +jNFusB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb6 +5i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOB +rDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU +F6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRBtjpbO8tFnb0c +wpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 +cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIB +AHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShp +WJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9 +xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ +2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZ +IseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8 +aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2X +em1ZqSqPe97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQR +dAtq/gsD/KNVV4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/ +OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+ +hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLy +tGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u +-----END CERTIFICATE----- + +================================================================ +C: CH +O: WISeKey +OU: Copyright (c) 2005 +OU: OISTE Foundation Endorsed +CN: OISTE WISeKey Global Root GA CA +-----BEGIN CERTIFICATE----- +MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB +ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly +aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl +ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w +NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G +A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD +VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX +SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR +VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2 +w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF +mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg +4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9 +4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw +EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx +SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2 +ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8 +vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa +hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi +Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ +/L7fCg0= +-----END CERTIFICATE----- + +================================================================ +C: CN +O: CNNIC +CN: CNNIC ROOT +-----BEGIN CERTIFICATE----- +MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJD +TjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2 +MDcwOTE0WhcNMjcwNDE2MDcwOTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMF +Q05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzDo+/hn7E7SIX1mlwh +IhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tizVHa6 +dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZO +V/kbZKKTVrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrC +GHn2emU1z5DrvTOTn1OrczvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gN +v7Sg2Ca+I19zN38m5pIEo3/PIKe38zrKy5nLAgMBAAGjczBxMBEGCWCGSAGG+EIB +AQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscCwQ7vptU7ETAPBgNVHRMB +Af8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991SlgrHAsEO +76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnK +OOK5Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvH +ugDnuL8BV8F3RTIMO/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7Hgvi +yJA/qIYM/PmLXoXLT1tLYhFHxUV8BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fL +buXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2G8kS1sHNzYDzAgE8yGnLRUhj +2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5mmxE= +-----END CERTIFICATE----- + +================================================================ +C: CN +O: China Internet Network Information Center +CN: China Internet Network Information Center EV Certificates Root +-----BEGIN CERTIFICATE----- +MIID9zCCAt+gAwIBAgIESJ8AATANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMC +Q04xMjAwBgNVBAoMKUNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24g +Q2VudGVyMUcwRQYDVQQDDD5DaGluYSBJbnRlcm5ldCBOZXR3b3JrIEluZm9ybWF0 +aW9uIENlbnRlciBFViBDZXJ0aWZpY2F0ZXMgUm9vdDAeFw0xMDA4MzEwNzExMjVa +Fw0zMDA4MzEwNzExMjVaMIGKMQswCQYDVQQGEwJDTjEyMDAGA1UECgwpQ2hpbmEg +SW50ZXJuZXQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIxRzBFBgNVBAMMPkNo +aW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyIEVWIENlcnRp +ZmljYXRlcyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm35z +7r07eKpkQ0H1UN+U8i6yjUqORlTSIRLIOTJCBumD1Z9S7eVnAztUwYyZmczpwA// +DdmEEbK40ctb3B75aDFk4Zv6dOtouSCV98YPjUesWgbdYavi7NifFy2cyjw1l1Vx +zUOFsUcW9SxTgHbP0wBkvUCZ3czY28Sf1hNfQYOL+Q2HklY0bBoQCxfVWhyXWIQ8 +hBouXJE0bhlffxdpxWXvayHG1VA6v2G5BY3vbzQ6sm8UY78WO5upKv23KzhmBsUs +4qpnHkWnjQRmQvaPK++IIGmPMowUc9orhpFjIpryp9vOiYurXccUwVswah+xt54u +gQEC7c+WXmPbqOY4twIDAQABo2MwYTAfBgNVHSMEGDAWgBR8cks5x8DbYqVPm6oY +NJKiyoOCWTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4E +FgQUfHJLOcfA22KlT5uqGDSSosqDglkwDQYJKoZIhvcNAQEFBQADggEBACrDx0M3 +j92tpLIM7twUbY8opJhJywyA6vPtI2Z1fcXTIWd50XPFtQO3WKwMVC/GVhMPMdoG +52U7HW8228gd+f2ABsqjPWYWqJ1MFn3AlUa1UeTiH9fqBk1jjZaM7+czV0I664zB +echNdn3e9rG3geCg+aF4RhcaVpjwTj2rHO3sOdwHSPdj/gauwqRcalsyiMXHM4Ws +ZkJHwlgkmeHlPuV1LI5D1l08eB6olYIpUNHRFrrvwb562bTYzB5MRuF3sTGrvSrI +zo9uoV1/A3U05K2JRVRevq4opbs/eHnrc7MKDf2+yfdWrPa37S+bISnHOLaVxATy +wy39FCqQmbkHzJ8= +-----END CERTIFICATE----- + +================================================================ +C: CO +O: Sociedad Cameral de Certificación Digital - Certicámara S.A. +CN: AC Raíz Certicámara S.A. +-----BEGIN CERTIFICATE----- +MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsx +CzAJBgNVBAYTAkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRp +ZmljYWNpw7NuIERpZ2l0YWwgLSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwa +QUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4wHhcNMDYxMTI3MjA0NjI5WhcNMzAw +NDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+U29jaWVkYWQgQ2Ft +ZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJhIFMu +QS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkq +hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeG +qentLhM0R7LQcNzJPNCNyu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzL +fDe3fezTf3MZsGqy2IiKLUV0qPezuMDU2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQ +Y5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU34ojC2I+GdV75LaeHM/J4 +Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP2yYe68yQ +54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+b +MMCm8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48j +ilSH5L887uvDdUhfHjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++Ej +YfDIJss2yKHzMI+ko6Kh3VOz3vCaMh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/zt +A/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK5lw1omdMEWux+IBkAC1vImHF +rEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1bczwmPS9KvqfJ +pxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE +AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCB +lTCBkgYEVR0gADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFy +YS5jb20vZHBjLzBaBggrBgEFBQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW50 +7WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2UgcHVlZGVuIGVuY29udHJhciBlbiBs +YSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEfAygPU3zmpFmps4p6 +xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuXEpBc +unvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/ +Jre7Ir5v/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dp +ezy4ydV/NgIlqmjCMRW3MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42 +gzmRkBDI8ck1fj+404HGIGQatlDCIaR43NAvO2STdPCWkPHv+wlaNECW8DYSwaN0 +jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wkeZBWN7PGKX6jD/EpOe9+ +XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f/RWmnkJD +W2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/ +RL5hRqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35r +MDOhYil/SrnhLecUIw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxk +BYn8eNZcLCZDqQ== +-----END CERTIFICATE----- + +================================================================ +C: DE +O: D-Trust GmbH +CN: D-TRUST Root Class 3 CA 2 2009 +-----BEGIN CERTIFICATE----- +MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF +MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD +bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha +ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM +HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03 +UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42 +tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R +ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM +lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp +/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G +A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G +A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj +dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy +MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl +cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js +L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL +BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni +acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 +o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K +zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8 +PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y +Johw1+qRzT65ysCQblrGXnRl11z+o+I= +-----END CERTIFICATE----- + +================================================================ +C: DE +O: D-Trust GmbH +CN: D-TRUST Root Class 3 CA 2 EV 2009 +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF +MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD +bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw +NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV +BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn +ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0 +3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z +qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR +p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8 +HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw +ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea +HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw +Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh +c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E +RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt +dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku +Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp +3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 +nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF +CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na +xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX +KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1 +-----END CERTIFICATE----- + +================================================================ +C: DE +O: Deutsche Telekom AG +OU: T-TeleSec Trust Center +CN: Deutsche Telekom Root CA 2 +-----BEGIN CERTIFICATE----- +MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc +MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj +IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB +IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE +RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl +U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290 +IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU +ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC +QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr +rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S +NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc +QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH +txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP +BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC +AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp +tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa +IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl +6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+ +xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU +Cm26OWMohpLzGITY+9HPBVZkVw== +-----END CERTIFICATE----- + +================================================================ +C: DE +O: T-Systems Enterprise Services GmbH +OU: T-Systems Trust Center +CN: T-TeleSec GlobalRoot Class 3 +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx +KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd +BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl +YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1 +OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy +aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 +ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN +8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/ +RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4 +hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5 +ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM +EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1 +A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy +WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ +1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30 +6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT +91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml +e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p +TpPDpFQUWw== +-----END CERTIFICATE----- + +================================================================ +C: DE +O: TC TrustCenter GmbH +OU: TC TrustCenter Class 2 CA +CN: TC TrustCenter Class 2 CA II +-----BEGIN CERTIFICATE----- +MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjEL +MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV +BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0 +Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYwMTEyMTQzODQzWhcNMjUxMjMxMjI1 +OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i +SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UEAxMc +VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jf +tMjWQ+nEdVl//OEd+DFwIxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKg +uNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2J +XjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQXa7pIXSSTYtZgo+U4+lK +8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7uSNQZu+99 +5OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3 +kUrL84J6E1wIqzCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy +dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6 +Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz +JTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290 +Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u +TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iS +GNn3Bzn1LL4GdXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprt +ZjluS5TmVfwLG4t3wVMTZonZKNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8 +au0WOB9/WIFaGusyiC2y8zl3gK9etmF1KdsjTYjKUCjLhdLTEKJZbtOTVAB6okaV +hgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kPJOzHdiEoZa5X6AeI +dUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfkvQ== +-----END CERTIFICATE----- + +================================================================ +C: DE +O: TC TrustCenter GmbH +OU: TC TrustCenter Class 3 CA +CN: TC TrustCenter Class 3 CA II +-----BEGIN CERTIFICATE----- +MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjEL +MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV +BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0 +Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYwMTEyMTQ0MTU3WhcNMjUxMjMxMjI1 +OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i +SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UEAxMc +VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJW +Ht4bNwcwIi9v8Qbxq63WyKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+Q +Vl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo6SI7dYnWRBpl8huXJh0obazovVkdKyT2 +1oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZuV3bOx4a+9P/FRQI2Alq +ukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk2ZyqBwi1 +Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NX +XAek0CSnwPIA1DCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy +dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6 +Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz +JTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290 +Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u +TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlN +irTzwppVMXzEO2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8 +TtXqluJucsG7Kv5sbviRmEb8yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6 +g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9IJqDnxrcOfHFcqMRA/07QlIp2+gB +95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal092Y+tTmBvTwtiBj +S+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc5A== +-----END CERTIFICATE----- + +================================================================ +C: DE +O: TC TrustCenter GmbH +OU: TC TrustCenter Universal CA +CN: TC TrustCenter Universal CA I +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTEL +MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNV +BAsTG1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1 +c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcNMDYwMzIyMTU1NDI4WhcNMjUxMjMx +MjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIg +R21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYwJAYD +VQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSR +JJZ4Hgmgm5qVSkr1YnwCqMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3T +fCZdzHd55yx4Oagmcw6iXSVphU9VDprvxrlE4Vc93x9UIuVvZaozhDrzznq+VZeu +jRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtwag+1m7Z3W0hZneTvWq3z +wZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9OgdwZu5GQ +fezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYD +VR0jBBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0G +CSqGSIb3DQEBBQUAA4IBAQAo0uCG1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X1 +7caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/CyvwbZ71q+s2IhtNerNXxTPqYn +8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3ghUJGooWMNjs +ydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT +ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/ +2TYcuiUaUj0a7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY +-----END CERTIFICATE----- + +================================================================ +C: DE +ST: Baden-Wuerttemberg (BW) +L: Stuttgart +O: Deutscher Sparkassen Verlag GmbH +CN: S-TRUST Authentication and Encryption Root CA 2005:PN +-----BEGIN CERTIFICATE----- +MIIEezCCA2OgAwIBAgIQNxkY5lNUfBq1uMtZWts1tzANBgkqhkiG9w0BAQUFADCB +rjELMAkGA1UEBhMCREUxIDAeBgNVBAgTF0JhZGVuLVd1ZXJ0dGVtYmVyZyAoQlcp +MRIwEAYDVQQHEwlTdHV0dGdhcnQxKTAnBgNVBAoTIERldXRzY2hlciBTcGFya2Fz +c2VuIFZlcmxhZyBHbWJIMT4wPAYDVQQDEzVTLVRSVVNUIEF1dGhlbnRpY2F0aW9u +IGFuZCBFbmNyeXB0aW9uIFJvb3QgQ0EgMjAwNTpQTjAeFw0wNTA2MjIwMDAwMDBa +Fw0zMDA2MjEyMzU5NTlaMIGuMQswCQYDVQQGEwJERTEgMB4GA1UECBMXQmFkZW4t +V3VlcnR0ZW1iZXJnIChCVykxEjAQBgNVBAcTCVN0dXR0Z2FydDEpMCcGA1UEChMg +RGV1dHNjaGVyIFNwYXJrYXNzZW4gVmVybGFnIEdtYkgxPjA8BgNVBAMTNVMtVFJV +U1QgQXV0aGVudGljYXRpb24gYW5kIEVuY3J5cHRpb24gUm9vdCBDQSAyMDA1OlBO +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2bVKwdMz6tNGs9HiTNL1 +toPQb9UY6ZOvJ44TzbUlNlA0EmQpoVXhOmCTnijJ4/Ob4QSwI7+Vio5bG0F/WsPo +TUzVJBY+h0jUJ67m91MduwwA7z5hca2/OnpYH5Q9XIHV1W/fuJvS9eXLg3KSwlOy +ggLrra1fFi2SU3bxibYs9cEv4KdKb6AwajLrmnQDaHgTncovmwsdvs91DSaXm8f1 +XgqfeN+zvOyauu9VjxuapgdjKRdZYgkqeQd3peDRF2npW932kKvimAoA0SVtnteF +hy+S8dF2g08LOlk3KC8zpxdQ1iALCvQm+Z845y2kuJuJja2tyWp9iRe79n+Ag3rm +7QIDAQABo4GSMIGPMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEG +MCkGA1UdEQQiMCCkHjAcMRowGAYDVQQDExFTVFJvbmxpbmUxLTIwNDgtNTAdBgNV +HQ4EFgQUD8oeXHngovMpttKFswtKtWXsa1IwHwYDVR0jBBgwFoAUD8oeXHngovMp +ttKFswtKtWXsa1IwDQYJKoZIhvcNAQEFBQADggEBAK8B8O0ZPCjoTVy7pWMciDMD +pwCHpB8gq9Yc4wYfl35UvbfRssnV2oDsF9eK9XvCAPbpEW+EoFolMeKJ+aQAPzFo +LtU96G7m1R08P7K9n3frndOMusDXtk3sU5wPBG7qNWdX4wple5A64U8+wwCSersF +iXOMy6ZNwPv2AtawB6MDwidAnwzkhYItr5pCHdDHjfhA7p0GVxzZotiAFP7hYy0y +h9WUUpY6RsZxlj33mA6ykaqP2vROJAA5VeitF7nTNCtKqUDMFypVZUF0Qn71wK/I +k63yGFs9iQzbRzkk+OBM8h+wPQrKBU6JIRrjKpms/H+h8Q8bHz2eBIPdltkdOpQ= +-----END CERTIFICATE----- + +================================================================ +C: DK +O: TDC +CN: TDC OCES CA +-----BEGIN CERTIFICATE----- +MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQGEwJE +SzEMMAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0wMzAyMTEw +ODM5MzBaFw0zNzAyMTEwOTA5MzBaMDExCzAJBgNVBAYTAkRLMQwwCgYDVQQKEwNU +REMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSjhFuHnEz9pPPEXyG9VhDr +2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8z3sM8W9Hpg1DTeLpHTk0zY0s +2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJHhNlktxmW/OwZ5LKXJk5KTMuPJItU +GBxIYXvViGjaXbXqzRowwYCDdlCqT9HU3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKj +dGqPqcNiKXEx5TukYBdedObaE+3pHx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+r +TpPGWOmlgtt3xDqZsXKVSQTwtyv6e1mO3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/ +BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwgewGA1UdIASB5DCB4TCB3gYIKoFQgSkB +AQEwgdEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5kay9yZXBv +c2l0b3J5MIGdBggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRl +ciBmcmEgZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEu +MS4xLiBDZXJ0aWZpY2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIg +T0lEIDEuMi4yMDguMTY5LjEuMS4xLjARBglghkgBhvhCAQEEBAMCAAcwgYEGA1Ud +HwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEMMAoGA1UEChMDVERDMRQwEgYD +VQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYmaHR0cDovL2Ny +bC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0QBCQwIoAPMjAwMzAy +MTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0jBBgwFoAUYLWF7FZkfhIZ +J2cdUBVLc647+RIwHQYDVR0OBBYEFGC1hexWZH4SGSdnHVAVS3OuO/kSMB0GCSqG +SIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEACrom +JkbTc6gJ82sLMJn9iuFXehHTuJTXCRBuo7E4A9G28kNBKWKnctj7fAXmMXAnVBhO +inxO5dHKjHiIzxvTkIvmI/gLDjNDfZziChmPyQE+dF10yYscA+UYyAFMP8uXBV2Y +caaYb7Z8vTd/vuGTJW1v8AqtFxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9AOoB +mbgGglGBTvH1tJFUuSN6AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQ +YqbsFbS1AoLbrIyigfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9 +BKNDLdr8C2LqL19iUw== +-----END CERTIFICATE----- + +================================================================ +C: DK +O: TDC Internet +OU: TDC Internet Root CA +-----BEGIN CERTIFICATE----- +MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJE +SzEVMBMGA1UEChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQg +Um9vdCBDQTAeFw0wMTA0MDUxNjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNV +BAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJuZXQxHTAbBgNVBAsTFFREQyBJbnRl +cm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxLhA +vJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20jxsNu +Zp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a +0vnRrEvLznWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc1 +4izbSysseLlJ28TQx5yc5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGN +eGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcD +R0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZIAYb4QgEBBAQDAgAHMGUG +A1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMMVERDIElu +dGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxME +Q1JMMTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3 +WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAw +HQYDVR0OBBYEFGxkAcf9hW2syNqeUAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJ +KoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4IBAQBO +Q8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540mgwV5dOy0uaOX +wTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+ +2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm89 +9qNLPg7kbWzbO0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0 +jUNAE4z9mQNUecYu6oah9jrUCbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38 +aQNiuJkFBT1reBK9sG9l +-----END CERTIFICATE----- + +================================================================ +C: EE +O: AS Sertifitseerimiskeskus +CN: EE Certification Centre Root CA +emailAddress: pki@sk.ee +-----BEGIN CERTIFICATE----- +MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1 +MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1 +czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYG +CSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIwMTAxMDMwMTAxMDMwWhgPMjAzMDEy +MTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlBUyBTZXJ0aWZpdHNl +ZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBS +b290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUy +euuOF0+W2Ap7kaJjbMeMTC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvO +bntl8jixwKIy72KyaOBhU8E2lf/slLo2rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIw +WFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw93X2PaRka9ZP585ArQ/d +MtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtNP2MbRMNE +1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYD +VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/ +zQas8fElyalL1BSZMEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYB +BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEF +BQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+RjxY6hUFaTlrg4wCQiZrxTFGGV +v9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqMlIpPnTX/dqQG +E5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u +uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIW +iAYLtqZLICjU3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/v +GVCJYMzpJJUPwssd8m92kMfMdcGWxZ0= +-----END CERTIFICATE----- + +================================================================ +C: ES +CN: Autoridad de Certificacion Firmaprofesional CIF A62634068 +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE +BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h +cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy +MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg +Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 +thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM +cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG +L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i +NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h +X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b +m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy +Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja +EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T +KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF +6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh +OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD +VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp +cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv +ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl +AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF +661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9 +am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1 +ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481 +PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS +3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k +SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF +3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM +ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g +StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz +Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB +jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V +-----END CERTIFICATE----- + +================================================================ +C: ES +L: C/ Muntaner 244 Barcelona +CN: Autoridad de Certificacion Firmaprofesional CIF A62634068 +emailAddress: ca@firmaprofesional.com +-----BEGIN CERTIFICATE----- +MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMx +IjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1 +dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 +MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20w +HhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTELMAkGA1UEBhMCRVMx +IjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1 +dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 +MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20w +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5u +Cp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5Vj1H5WuretXDE7aTt/6MNbg9kUDGvASdY +rv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJHlShbz++AbOCQl4oBPB3z +hxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf3H5idPay +BQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcL +iam8NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcb +AgMBAAGjgZ8wgZwwKgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lv +bmFsLmNvbTASBgNVHRMBAf8ECDAGAQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0 +MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4E +FgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQADggEBAEdz/o0n +VPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq +u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36m +hoEyIwOdyPdfwUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzfl +ZKG+TQyTmAyX9odtsz/ny4Cm7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBp +QWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YGVM+h4k0460tQtcsm9MracEpqoeJ5 +quGnM/b9Sh/22WA= +-----END CERTIFICATE----- + +================================================================ +C: ES +O: Agencia Catalana de Certificacio (NIF Q-0801176-I) +OU: Serveis Publics de Certificacio +OU: Vegeu https://www.catcert.net/verarrel (c)03 +OU: Jerarquia Entitats de Certificacio Catalanes +CN: EC-ACC +-----BEGIN CERTIFICATE----- +MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB +8zELMAkGA1UEBhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2Vy +dGlmaWNhY2lvIChOSUYgUS0wODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1 +YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYDVQQLEyxWZWdldSBodHRwczovL3d3 +dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UECxMsSmVyYXJxdWlh +IEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMTBkVD +LUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQG +EwJFUzE7MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8g +KE5JRiBRLTA4MDExNzYtSSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBD +ZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZlZ2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQu +bmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJhcnF1aWEgRW50aXRhdHMg +ZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUNDMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R +85iKw5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm +4CgPukLjbo73FCeTae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaV +HMf5NLWUhdWZXqBIoH7nF2W4onW4HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNd +QlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0aE9jD2z3Il3rucO2n5nzbcc8t +lGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw0JDnJwIDAQAB +o4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4 +opvpXY0wfwYDVR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBo +dHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidW +ZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAwDQYJKoZIhvcN +AQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJlF7W2u++AVtd0x7Y +/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNaAl6k +SBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhy +Rp/7SNVel+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOS +Agu+TGbrIP65y7WZf+a2E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xl +nJ2lYJU6Un/10asIbvPuW/mIPX64b24D5EI= +-----END CERTIFICATE----- + +================================================================ +C: ES +O: Generalitat Valenciana +OU: PKIGVA +CN: Root CA Generalitat Valenciana +-----BEGIN CERTIFICATE----- +MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJF +UzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJ +R1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcN +MDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3WjBoMQswCQYDVQQGEwJFUzEfMB0G +A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScw +JQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+ +WmmmO3I2F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKj +SgbwJ/BXufjpTjJ3Cj9BZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGl +u6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQD0EbtFpKd71ng+CT516nDOeB0/RSrFOy +A8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXteJajCq+TA81yc477OMUxk +Hl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMBAAGjggM7 +MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBr +aS5ndmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIIC +IwYKKwYBBAG/VQIBADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8A +cgBpAGQAYQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIA +YQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIAYQBsAGkAdABhAHQAIABWAGEA +bABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQByAGEAYwBpAPMA +bgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA +aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMA +aQBvAG4AYQBtAGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQA +ZQAgAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEA +YwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBuAHQAcgBhACAAZQBuACAAbABhACAA +ZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAAOgAvAC8AdwB3AHcA +LgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0dHA6 +Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+y +eAT8MIGVBgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQsw +CQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0G +A1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVu +Y2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRhTvW1yEICKrNcda3Fbcrn +lD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdzCkj+IHLt +b8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg +9J63NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XF +ducTZnV+ZfsBn5OHiJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmC +IoaZM3Fa6hlXPZHNqcCjbgcTpsnt+GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM= +-----END CERTIFICATE----- + +================================================================ +C: ES +O: IZENPE S.A. +CN: Izenpe.com +-----BEGIN CERTIFICATE----- +MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4 +MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6 +ZW5wZS5jb20wHhcNMDcxMjEzMTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYD +VQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5j +b20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ03rKDx6sp4boFmVq +scIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAKClaO +xdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6H +LmYRY2xU+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFX +uaOKmMPsOzTFlUFpfnXCPCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQD +yCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxTOTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+ +JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbKF7jJeodWLBoBHmy+E60Q +rLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK0GqfvEyN +BjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8L +hij+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIB +QFqNeb+Lz0vPqhbBleStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+ +HMh3/1uaD7euBUbl8agW7EekFwIDAQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2lu +Zm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+SVpFTlBFIFMuQS4gLSBDSUYg +QTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBGNjIgUzgxQzBB +BgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx +MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwHQYDVR0OBBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUA +A4ICAQB4pgwWSp9MiDrAyw6lFn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWb +laQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbgakEyrkgPH7UIBzg/YsfqikuFgba56 +awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8qhT/AQKM6WfxZSzwo +JNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Csg1lw +LDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCT +VyvehQP5aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGk +LhObNA5me0mrZJfQRsN5nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJb +UjWumDqtujWTI6cfSN01RpiyEGjkpTHCClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/ +QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZoQ0iy2+tzJOeRf1SktoA+ +naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1ZWrOZyGls +QyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== +-----END CERTIFICATE----- + +================================================================ +C: EU +L: Madrid (see current address at www.camerfirma.com/address) +serialNumber: A82743287 +O: AC Camerfirma S.A. +CN: Chambers of Commerce Root - 2008 +-----BEGIN CERTIFICATE----- +MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD +VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 +IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 +MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJz +IG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEyMjk1MFoXDTM4MDcz +MTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBj +dXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIw +EAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEp +MCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW9 +28sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKAXuFixrYp4YFs8r/lfTJq +VKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorjh40G072Q +DuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR +5gN/ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfL +ZEFHcpOrUMPrCXZkNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05a +Sd+pZgvMPMZ4fKecHePOjlO+Bd5gD2vlGts/4+EhySnB8esHnFIbAURRPHsl18Tl +UlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331lubKgdaX8ZSD6e2wsWsSaR6s ++12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ0wlf2eOKNcx5 +Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj +ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAx +hduub+84Mxh2EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNV +HQ4EFgQU+SSsD7K1+HnA+mCIG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1 ++HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpN +YWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29t +L2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVy +ZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAt +IDIwMDiCCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRV +HSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20w +DQYJKoZIhvcNAQEFBQADggIBAJASryI1wqM58C7e6bXpeHxIvj99RZJe6dqxGfwW +PJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH3qLPaYRgM+gQDROpI9CF +5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbURWpGqOt1 +glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaH +FoI6M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2 +pSB7+R5KBWIBpih1YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MD +xvbxrN8y8NmBGuScvfaAFPDRLLmF9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QG +tjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcKzBIKinmwPQN/aUv0NCB9szTq +jktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvGnrDQWzilm1De +fhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg +OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZ +d0jQ +-----END CERTIFICATE----- + +================================================================ +C: EU +L: Madrid (see current address at www.camerfirma.com/address) +serialNumber: A82743287 +O: AC Camerfirma S.A. +CN: Global Chambersign Root - 2008 +-----BEGIN CERTIFICATE----- +MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD +VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 +IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 +MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD +aGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzEx +MjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3Vy +cmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAG +A1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAl +BgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZI +hvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xed +KYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7 +G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2 +zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4 +ddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyG +HoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2 +Id3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3V +yJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3e +beksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r +6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh +wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsog +zCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQW +BBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDpr +ru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJp +ZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRk +cmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJt +YSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiC +CQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCow +KAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZI +hvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZ +UohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXoz +X1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/x +fxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVz +a2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yyd +Yhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMd +SqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9O +AP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rso +M0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4ge +v8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z +09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B +-----END CERTIFICATE----- + +================================================================ +C: EU +O: AC Camerfirma SA CIF A82743287 +OU: http://www.chambersign.org +CN: Chambers of Commerce Root +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEn +MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL +ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMg +b2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAxNjEzNDNaFw0zNzA5MzAxNjEzNDRa +MH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZpcm1hIFNBIENJRiBB +ODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3JnMSIw +IAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0B +AQEFAAOCAQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtb +unXF/KGIJPov7coISjlUxFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0d +BmpAPrMMhe5cG3nCYsS4No41XQEMIwRHNaqbYE6gZj3LJgqcQKH0XZi/caulAGgq +7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jWDA+wWFjbw2Y3npuRVDM3 +0pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFVd9oKDMyX +roDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIG +A1UdEwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5j +aGFtYmVyc2lnbi5vcmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p +26EpW1eLTXYGduHRooowDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIA +BzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hhbWJlcnNpZ24ub3JnMCcGA1Ud +EgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYDVR0gBFEwTzBN +BgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz +aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEB +AAxBl8IahsAifJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZd +p0AJPaxJRUXcLo0waLIJuvvDL8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi +1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wNUPf6s+xCX6ndbcj0dc97wXImsQEc +XCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/nADydb47kMgkdTXg0 +eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1erfu +tGWaIZDgqtCYvDi1czyL+Nw= +-----END CERTIFICATE----- + +================================================================ +C: EU +O: AC Camerfirma SA CIF A82743287 +OU: http://www.chambersign.org +CN: Global Chambersign Root +-----BEGIN CERTIFICATE----- +MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEn +MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL +ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENo +YW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYxNDE4WhcNMzcwOTMwMTYxNDE4WjB9 +MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgy +NzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4G +A1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUA +A4IBDQAwggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0 +Mi+ITaFgCPS3CU6gSS9J1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/s +QJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8Oby4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpV +eAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl6DJWk0aJqCWKZQbua795 +B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c8lCrEqWh +z0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0T +AQH/BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1i +ZXJzaWduLm9yZy9jaGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4w +TcbOX60Qq+UDpfqpFDAOBgNVHQ8BAf8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAH +MCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBjaGFtYmVyc2lnbi5vcmcwKgYD +VR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9yZzBbBgNVHSAE +VDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh +bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0B +AQUFAAOCAQEAPDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUM +bKGKfKX0j//U2K0X1S0E0T9YgOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXi +ryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJPJ7oKXqJ1/6v/2j1pReQvayZzKWG +VwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4IBHNfTIzSJRUTN3c +ecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREest2d/ +AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== +-----END CERTIFICATE----- + +================================================================ +C: FI +O: Sonera +CN: Sonera Class1 CA +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBJDANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP +MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MxIENBMB4XDTAx +MDQwNjEwNDkxM1oXDTIxMDQwNjEwNDkxM1owOTELMAkGA1UEBhMCRkkxDzANBgNV +BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMSBDQTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBALWJHytPZwp5/8Ue+H887dF+2rDNbS82rDTG +29lkFwhjMDMiikzujrsPDUJVyZ0upe/3p4zDq7mXy47vPxVnqIJyY1MPQYx9EJUk +oVqlBvqSV536pQHydekfvFYmUk54GWVYVQNYwBSujHxVX3BbdyMGNpfzJLWaRpXk +3w0LBUXl0fIdgrvGE+D+qnr9aTCU89JFhfzyMlsy3uhsXR/LpCJ0sICOXZT3BgBL +qdReLjVQCfOAl/QMF6452F/NM8EcyonCIvdFEu1eEpOdY6uCLrnrQkFEy0oaAIIN +nvmLVz5MxxftLItyM19yejhW1ebZrgUaHXVFsculJRwSVzb9IjcCAwEAAaMzMDEw +DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQIR+IMi/ZTiFIwCwYDVR0PBAQDAgEG +MA0GCSqGSIb3DQEBBQUAA4IBAQCLGrLJXWG04bkruVPRsoWdd44W7hE928Jj2VuX +ZfsSZ9gqXLar5V7DtxYvyOirHYr9qxp81V9jz9yw3Xe5qObSIjiHBxTZ/75Wtf0H +DjxVyhbMp6Z3N/vbXB9OWQaHowND9Rart4S9Tu+fMTfwRvFAttEMpWT4Y14h21VO +TzF2nBBhjrZTOqMRvq9tfB69ri3iDGnHhVNoomG6xT60eVR4ngrHAr5i0RGCS2Uv +kVrCqIexVmiUefkl98HVrhq4uz2PqYo4Ffdz0Fpg0YCw8NzVUM1O7pJIae2yIx4w +zMiUyLb1O4Z/P6Yun/Y+LLWSlj7fLJOK/4GMDw9ZIRlXvVWa +-----END CERTIFICATE----- + +================================================================ +C: FI +O: Sonera +CN: Sonera Class2 CA +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP +MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx +MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV +BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o +Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt +5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s +3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej +vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu +8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw +DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG +MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil +zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/ +3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD +FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 +Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2 +ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M +-----END CERTIFICATE----- + +================================================================ +C: FR +O: Certinomis +OU: 0002 433998903 +CN: Certinomis - Autorité Racine +-----BEGIN CERTIFICATE----- +MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjET +MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAk +BgNVBAMMHUNlcnRpbm9taXMgLSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4 +Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNl +cnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYwJAYDVQQDDB1DZXJ0 +aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jY +F1AMnmHawE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N +8y4oH3DfVS9O7cdxbwlyLu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWe +rP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K +/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92NjMD2AR5vpTESOH2VwnHu +7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9qc1pkIuVC +28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6 +lSTClrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1E +nn1So2+WLhl+HPNbxxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB +0iSVL1N6aaLwD4ZFjliCK0wi1F6g530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql09 +5gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna4NH4+ej9Uji29YnfAgMBAAGj +WzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBQN +jLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ +KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9s +ov3/4gbIOZ/xWqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZM +OH8oMDX/nyNTt7buFHAAQCvaR6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q +619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40nJ+U8/aGH88bc62UeYdocMMzpXDn +2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1BCxMjidPJC+iKunqj +o3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjvJL1v +nxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG +5ERQL1TEqkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWq +pdEdnV1j6CTmNhTih60bWfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZb +dsLLO7XSAPCjDuGtbkD326C00EauFddEwk01+dIL8hf2rGbVJLJP0RyZwG71fet0 +BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/vgt2Fl43N+bYdJeimUV5 +-----END CERTIFICATE----- + +================================================================ +C: FR +O: Certplus +CN: Class 2 Primary CA +-----BEGIN CERTIFICATE----- +MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw +PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz +cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9 +MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz +IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ +ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR +VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL +kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd +EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas +H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0 +HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud +DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4 +QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu +Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/ +AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8 +yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR +FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA +ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB +kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 +l7+ijrRU +-----END CERTIFICATE----- + +================================================================ +C: FR +O: Dhimyotis +CN: Certigna +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV +BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X +DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ +BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 +QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny +gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw +zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q +130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 +JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw +ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT +AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj +AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG +9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h +bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc +fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu +HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w +t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- + +================================================================ +C: FR +ST: France +L: Paris +O: PM/SGDN +OU: DCSSI +CN: IGC/A +emailAddress: igca@sgdn.pm.gouv.fr +-----BEGIN CERTIFICATE----- +MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYT +AkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQ +TS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG +9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMB4XDTAyMTIxMzE0MjkyM1oXDTIw +MTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAM +BgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEO +MAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2 +LmZyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaI +s9z4iPf930Pfeo2aSVz2TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2 +xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCWSo7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4 +u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYyHF2fYPepraX/z9E0+X1b +F8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNdfrGoRpAx +Vs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGd +PDPQtQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNV +HSAEDjAMMAoGCCqBegF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAx +NjAfBgNVHSMEGDAWgBSjBS8YYFDCiQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUF +AAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RKq89toB9RlPhJy3Q2FLwV3duJ +L92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3QMZsyK10XZZOY +YLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg +Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2a +NjSaTFR+FwNIlQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R +0982gaEbeC9xs/FZTEYYKKuF0mBWWg== +-----END CERTIFICATE----- + +================================================================ +C: GB +O: Trustis Limited +OU: Trustis FPS Root CA +-----BEGIN CERTIFICATE----- +MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF +MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL +ExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx +MzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc +MBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+ +AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH +iTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj +vSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA +0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB +OrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/ +BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E +FgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01 +GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW +zaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4 +1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE +f1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F +jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN +ZetX2fNXlrtIzYE= +-----END CERTIFICATE----- + +================================================================ +C: GB +ST: Greater Manchester +L: Salford +O: Comodo CA Limited +CN: AAA Certificate Services +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj +YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM +GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua +BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe +3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 +YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR +rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm +ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU +oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v +QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t +b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF +AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q +GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 +G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi +l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 +smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- + +================================================================ +C: GB +ST: Greater Manchester +L: Salford +O: Comodo CA Limited +CN: Secure Certificate Services +-----BEGIN CERTIFICATE----- +MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRp +ZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVow +fjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAiBgNV +BAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPM +cm3ye5drswfxdySRXyWP9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3S +HpR7LZQdqnXXs5jLrLxkU0C8j6ysNstcrbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996 +CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rCoznl2yY4rYsK7hljxxwk +3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3Vp6ea5EQz +6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNV +HQ4EFgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1Ud +EwEB/wQFMAMBAf8wgYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2Rv +Y2EuY29tL1NlY3VyZUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRw +Oi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmww +DQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm4J4oqF7Tt/Q0 +5qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj +Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtI +gKvcnDe4IRRLDXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJ +aD61JlfutuC23bkpgHl9j6PwpCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDl +izeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1HRR3B7Hzs/Sk= +-----END CERTIFICATE----- + +================================================================ +C: GB +ST: Greater Manchester +L: Salford +O: Comodo CA Limited +CN: Trusted Certificate Services +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0 +aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEwMDAwMDBaFw0yODEyMzEyMzU5NTla +MH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO +BgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUwIwYD +VQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWW +fnJSoBVC21ndZHoa0Lh73TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMt +TGo87IvDktJTdyR0nAducPy9C1t2ul/y/9c3S0pgePfw+spwtOpZqqPOSC+pw7IL +fhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6juljatEPmsbS9Is6FARW +1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsSivnkBbA7 +kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0G +A1UdDgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21v +ZG9jYS5jb20vVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRo +dHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMu +Y3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8NtwuleGFTQQuS9/ +HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 +pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxIS +jBc/lDb+XbDABHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+ +xqFx7D+gIIxmOom0jtTYsU0lR+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/Atyjcn +dBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O9y5Xt5hwXsjEeLBi +-----END CERTIFICATE----- + +================================================================ +C: GB +ST: Greater Manchester +L: Salford +O: COMODO CA Limited +CN: COMODO Certification Authority +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB +gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV +BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw +MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl +YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P +RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 +UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI +2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 +Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp ++2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ +DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O +nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW +/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g +PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u +QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY +SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv +IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 +zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd +BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB +ZQ== +-----END CERTIFICATE----- + +================================================================ +C: GB +ST: Greater Manchester +L: Salford +O: COMODO CA Limited +CN: COMODO ECC Certification Authority +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT +IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw +MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy +ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N +T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR +FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J +cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW +BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm +fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv +GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +================================================================ +C: GR +O: Hellenic Academic and Research Institutions Cert. Authority +CN: Hellenic Academic and Research Institutions RootCA 2011 +-----BEGIN CERTIFICATE----- +MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix +RDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 +dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p +YyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw +NjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK +EztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl +cnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl +c2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz +dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ +fel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns +bgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD +75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP +FEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV +HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp +5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu +b3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA +A4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p +6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 +TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7 +dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys +Nnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI +l7WdmplNsDz4SgCbZN2fOUvRJ9e4 +-----END CERTIFICATE----- + +================================================================ +C: HK +O: Hongkong Post +CN: Hongkong Post Root CA 1 +-----BEGIN CERTIFICATE----- +MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx +FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg +Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG +A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr +b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ +jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn +PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh +ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9 +nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h +q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED +MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC +mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3 +7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB +oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs +EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO +fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi +AmvZWg== +-----END CERTIFICATE----- + +================================================================ +C: HU +L: Budapest +O: Microsec Ltd. +CN: Microsec e-Szigno Root CA 2009 +emailAddress: info@e-szigno.hu +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD +VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 +ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G +CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y +OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx +FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp +Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP +kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc +cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U +fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 +N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC +xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 ++rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM +Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG +SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h +mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk +ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c +2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t +HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW +-----END CERTIFICATE----- + +================================================================ +C: HU +L: Budapest +O: NetLock Kft. +OU: Tanúsítványkiadók (Certification Services) +CN: NetLock Arany (Class Gold) Főtanúsítvány +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG +EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 +MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl +cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR +dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB +pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM +b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm +aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz +IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT +lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz +AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 +VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG +ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 +BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG +AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M +U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh +bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C ++C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F +uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 +XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- + +================================================================ +C: HU +L: Budapest +O: Microsec Ltd. +OU: e-Szigno CA +CN: Microsec e-Szigno Root CA +-----BEGIN CERTIFICATE----- +MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAw +cjELMAkGA1UEBhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNy +b3NlYyBMdGQuMRQwEgYDVQQLEwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9z +ZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0MDYxMjI4NDRaFw0xNzA0MDYxMjI4 +NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEWMBQGA1UEChMN +TWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMTGU1p +Y3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2u +uO/TEdyB5s87lozWbxXGd36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+ +LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/NoqdNAoI/gqyFxuEPkEeZlApxcpMqyabA +vjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjcQR/Ji3HWVBTji1R4P770 +Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJPqW+jqpx +62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcB +AQRbMFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3Aw +LQYIKwYBBQUHMAKGIWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAP +BgNVHRMBAf8EBTADAQH/MIIBcwYDVR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIB +AQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3LmUtc3ppZ25vLmh1L1NaU1ov +MIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0AdAB2AOEAbgB5 +ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn +AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABT +AHoAbwBsAGcA4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABh +ACAAcwB6AGUAcgBpAG4AdAAgAGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABo +AHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMAegBpAGcAbgBvAC4AaAB1AC8AUwBa +AFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6Ly93d3cuZS1zemln +bm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NOPU1p +Y3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxP +PU1pY3Jvc2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZv +Y2F0aW9uTGlzdDtiaW5hcnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuB +EGluZm9AZS1zemlnbm8uaHWkdzB1MSMwIQYDVQQDDBpNaWNyb3NlYyBlLVN6aWdu +w7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhTWjEWMBQGA1UEChMNTWlj +cm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhVMIGsBgNV +HSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJI +VTERMA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDAS +BgNVBAsTC2UtU3ppZ25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBS +b290IENBghEAzLjnv04pGv2i3GalHCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS +8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMTnGZjWS7KXHAM/IO8VbH0jgds +ZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FEaGAHQzAxQmHl +7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a +86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfR +hUZLphK3dehKyVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/ +MPMMNz7UwiiAc7EBt51alhQBS6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU= +-----END CERTIFICATE----- + +================================================================ +C: HU +L: Budapest +O: NetLock Halozatbiztonsagi Kft. +OU: Tanusitvanykiadok +CN: NetLock Expressz (Class C) Tanusitvanykiado +-----BEGIN CERTIFICATE----- +MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUx +ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 +b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQD +EytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBDKSBUYW51c2l0dmFueWtpYWRvMB4X +DTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJBgNVBAYTAkhVMREw +DwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9u +c2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMr +TmV0TG9jayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzAN +BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNA +OoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3ZW3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC +2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63euyucYT2BDMIJTLrdKwW +RMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQwDgYDVR0P +AQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEW +ggJNRklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0 +YWxhbm9zIFN6b2xnYWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFz +b2sgYWxhcGphbiBrZXN6dWx0LiBBIGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBO +ZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1iaXp0b3NpdGFzYSB2ZWRpLiBB +IGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0ZWxlIGF6IGVs +b2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs +ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25s +YXBqYW4gYSBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kg +a2VyaGV0byBheiBlbGxlbm9yemVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4g +SU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5kIHRoZSB1c2Ugb2YgdGhpcyBjZXJ0 +aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQUyBhdmFpbGFibGUg +YXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwgYXQg +Y3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmY +ta3UzbM2xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2g +pO0u9f38vf5NNwgMvOOWgyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4 +Fp1hBWeAyNDYpQcCNJgEjTME1A== +-----END CERTIFICATE----- + +================================================================ +C: HU +L: Budapest +O: NetLock Halozatbiztonsagi Kft. +OU: Tanusitvanykiadok +CN: NetLock Minositett Kozjegyzoi (Class QA) Tanusitvanykiado +emailAddress: info@netlock.hu +-----BEGIN CERTIFICATE----- +MIIG0TCCBbmgAwIBAgIBezANBgkqhkiG9w0BAQUFADCByTELMAkGA1UEBhMCSFUx +ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 +b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMUIwQAYDVQQD +EzlOZXRMb2NrIE1pbm9zaXRldHQgS296amVneXpvaSAoQ2xhc3MgUUEpIFRhbnVz +aXR2YW55a2lhZG8xHjAcBgkqhkiG9w0BCQEWD2luZm9AbmV0bG9jay5odTAeFw0w +MzAzMzAwMTQ3MTFaFw0yMjEyMTUwMTQ3MTFaMIHJMQswCQYDVQQGEwJIVTERMA8G +A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh +Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxQjBABgNVBAMTOU5l +dExvY2sgTWlub3NpdGV0dCBLb3pqZWd5em9pIChDbGFzcyBRQSkgVGFudXNpdHZh +bnlraWFkbzEeMBwGCSqGSIb3DQEJARYPaW5mb0BuZXRsb2NrLmh1MIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx1Ilstg91IRVCacbvWy5FPSKAtt2/Goq +eKvld/Bu4IwjZ9ulZJm53QE+b+8tmjwi8F3JV6BVQX/yQ15YglMxZc4e8ia6AFQe +r7C8HORSjKAyr7c3sVNnaHRnUPYtLmTeriZ539+Zhqurf4XsoPuAzPS4DB6TRWO5 +3Lhbm+1bOdRfYrCnjnxmOCyqsQhjF2d9zL2z8cM/z1A57dEZgxXbhxInlrfa6uWd +vLrqOU+L73Sa58XQ0uqGURzk/mQIKAR5BevKxXEOC++r6uwSEaEYBTJp0QwsGj0l +mT+1fMptsK6ZmfoIYOcZwvK9UdPM0wKswREMgM6r3JSda6M5UzrWhQIDAMV9o4IC +wDCCArwwEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8EBAMCAQYwggJ1Bglg +hkgBhvhCAQ0EggJmFoICYkZJR1lFTEVNISBFemVuIHRhbnVzaXR2YW55IGEgTmV0 +TG9jayBLZnQuIE1pbm9zaXRldHQgU3pvbGdhbHRhdGFzaSBTemFiYWx5emF0YWJh +biBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBBIG1pbm9zaXRldHQg +ZWxla3Ryb25pa3VzIGFsYWlyYXMgam9naGF0YXMgZXJ2ZW55ZXN1bGVzZW5laywg +dmFsYW1pbnQgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYSBNaW5vc2l0ZXR0IFN6 +b2xnYWx0YXRhc2kgU3phYmFseXphdGJhbiwgYXogQWx0YWxhbm9zIFN6ZXJ6b2Rl +c2kgRmVsdGV0ZWxla2JlbiBlbG9pcnQgZWxsZW5vcnplc2kgZWxqYXJhcyBtZWd0 +ZXRlbGUuIEEgZG9rdW1lbnR1bW9rIG1lZ3RhbGFsaGF0b2sgYSBodHRwczovL3d3 +dy5uZXRsb2NrLmh1L2RvY3MvIGNpbWVuIHZhZ3kga2VyaGV0b2sgYXogaW5mb0Bu +ZXRsb2NrLm5ldCBlLW1haWwgY2ltZW4uIFdBUk5JTkchIFRoZSBpc3N1YW5jZSBh +bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGFyZSBzdWJqZWN0IHRvIHRo +ZSBOZXRMb2NrIFF1YWxpZmllZCBDUFMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3 +Lm5ldGxvY2suaHUvZG9jcy8gb3IgYnkgZS1tYWlsIGF0IGluZm9AbmV0bG9jay5u +ZXQwHQYDVR0OBBYEFAlqYhaSsFq7VQ7LdTI6MuWyIckoMA0GCSqGSIb3DQEBBQUA +A4IBAQCRalCc23iBmz+LQuM7/KbD7kPgz/PigDVJRXYC4uMvBcXxKufAQTPGtpvQ +MznNwNuhrWw3AkxYQTvyl5LGSKjN5Yo5iWH5Upfpvfb5lHTocQ68d4bDBsxafEp+ +NFAwLvt/MpqNPfMgW/hqyobzMUwsWYACff44yTB1HLdV47yfuqhthCgFdbOLDcCR +VCHnpgu0mfVRQdzNo0ci2ccBgcTcR08m6h/t280NmPSjnLRzMkqWmf68f8glWPhY +83ZmiVSkpj7EUFy6iRiCdUgh0k8T6GB+B3bbELVR5qq5aKrN9p2QdRLqOBrKROi3 +macqaJVmlaut74nLYKkGEsaUR+ko +-----END CERTIFICATE----- + +================================================================ +C: HU +L: Budapest +O: NetLock Halozatbiztonsagi Kft. +OU: Tanusitvanykiadok +CN: NetLock Uzleti (Class B) Tanusitvanykiado +-----BEGIN CERTIFICATE----- +MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUx +ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 +b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQD +EylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikgVGFudXNpdHZhbnlraWFkbzAeFw05 +OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYDVQQGEwJIVTERMA8G +A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh +Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5l +dExvY2sgVXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqG +SIb3DQEBAQUAA4GNADCBiQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xK +gZjupNTKihe5In+DCnVMm8Bp2GQ5o+2So/1bXHQawEfKOml2mrriRBf8TKPV/riX +iK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr1nGTLbO/CVRY7QbrqHvc +Q7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8E +BAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1G +SUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFu +b3MgU3pvbGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBh +bGFwamFuIGtlc3p1bHQuIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExv +Y2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGln +aXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0 +IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh +c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGph +biBhIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJo +ZXRvIGF6IGVsbGVub3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBP +UlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmlj +YXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBo +dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNA +bmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06 +sPgzTEdM43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXa +n3BukxowOR0w2y7jfLKRstE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKS +NitjrFgBazMpUIaD8QFI +-----END CERTIFICATE----- + +================================================================ +C: HU +ST: Hungary +L: Budapest +O: NetLock Halozatbiztonsagi Kft. +OU: Tanusitvanykiadok +CN: NetLock Kozjegyzoi (Class A) Tanusitvanykiado +-----BEGIN CERTIFICATE----- +MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhV +MRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMe +TmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0 +dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFzcyBB +KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oXDTE5MDIxOTIzMTQ0 +N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhC +dWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQu +MRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBL +b3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSMD7tM9DceqQWC2ObhbHDqeLVu0ThEDaiD +zl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZz+qMkjvN9wfcZnSX9EUi +3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC/tmwqcm8 +WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LY +Oph7tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2Esi +NCubMvJIH5+hCoR64sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCC +ApswDgYDVR0PAQH/BAQDAgAGMBIGA1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4 +QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZRUxFTSEgRXplbiB0 +YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRhdGFz +aSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu +IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtm +ZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMg +ZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVs +amFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJhc2EgbWVndGFsYWxoYXRv +IGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBzOi8vd3d3 +Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6 +ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1 +YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3Qg +dG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRs +b2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNAbmV0bG9jay5uZXQuMA0G +CSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5ayZrU3/b39/zcT0mwBQO +xmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjPytoUMaFP +0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQ +QeJBCWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxk +f1qbFFgBJ34TUMdrKuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK +8CtmdWOMovsEPoMOmzbwGOQmIMOM8CgHrTwXZoi1/baI +-----END CERTIFICATE----- + +================================================================ +C: IE +O: Baltimore +OU: CyberTrust +CN: Baltimore CyberTrust Root +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ +RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD +VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX +DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y +ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy +VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr +mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr +IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK +mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu +XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy +dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye +jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 +BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 +DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 +9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx +jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 +Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz +ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS +R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + +================================================================ +C: IL +O: StartCom Ltd. +CN: StartCom Certification Authority G2 +-----BEGIN CERTIFICATE----- +MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEW +MBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkgRzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1 +OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoG +A1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRzIwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8Oo1XJ +JZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsD +vfOpL9HG4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnoo +D/Uefyf3lLE3PbfHkffiAez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/ +Q0kGi4xDuFby2X8hQxfqp0iVAXV16iulQ5XqFYSdCI0mblWbq9zSOdIxHWDirMxW +RST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbsO+wmETRIjfaAKxojAuuK +HDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8HvKTlXcxN +nw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM +0D4LnMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/i +UUjXuG+v+E5+M5iSFGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9 +Ha90OrInwMEePnWjFqmveiJdnxMaz6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHg +TuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE +AwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJKoZIhvcNAQEL +BQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K +2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfX +UfEpY9Z1zRbkJ4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl +6/2o1PXWT6RbdejF0mCy2wl+JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK +9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG/+gyRr61M3Z3qAFdlsHB1b6uJcDJ +HgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTcnIhT76IxW1hPkWLI +wpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/XldblhY +XzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5l +IxKVCCIcl85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoo +hdVddLHRDiBYmxOlsGOm7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulr +so8uBtjRkcfGEvRM/TAXw8HaOFvjqermobp573PYtlNXLfbQ4ddI +-----END CERTIFICATE----- + +================================================================ +C: IL +O: StartCom Ltd. +OU: Secure Digital Certificate Signing +CN: StartCom Certification Authority +-----BEGIN CERTIFICATE----- +MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW +MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg +Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYwOTE3MTk0NjM2WjB9 +MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi +U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh +cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk +pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf +OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C +Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT +Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi +HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM +Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w ++2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+ +Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3 +Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B +26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID +AQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE +FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9j +ZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3Js +LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFM +BgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0 +Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFy +dGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3Rh +cnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlh +YmlsaXR5LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2Yg +dGhlIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFp +bGFibGUgYXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJ +YIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNT +TCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEAFmyZ +9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8 +jhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUW +FjgKXlf2Ysd6AgXmvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJz +ewT4F+irsfMuXGRuczE6Eri8sxHkfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1 +ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3fsNrarnDy0RLrHiQi+fHLB5L +EUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZEoalHmdkrQYu +L6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq +yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuC +O3NJo2pXh5Tl1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6V +um0ABj6y6koQOdjQK/W/7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkySh +NOsF/5oirpt9P/FlUQqmMGqz9IgcgA38corog14= +-----END CERTIFICATE----- + +================================================================ +C: IL +O: StartCom Ltd. +OU: Secure Digital Certificate Signing +CN: StartCom Certification Authority +-----BEGIN CERTIFICATE----- +MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEW +MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg +Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM3WhcNMzYwOTE3MTk0NjM2WjB9 +MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi +U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh +cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk +pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf +OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C +Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT +Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi +HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM +Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w ++2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+ +Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3 +Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B +26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID +AQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD +VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFul +F2mHMMo0aEPQQa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCC +ATgwLgYIKwYBBQUHAgEWImh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5w +ZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL2ludGVybWVk +aWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENvbW1lcmNpYWwgKFN0 +YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0aGUg +c2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93 +d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgG +CWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5fPGFf59Jb2vKXfuM/gTF +wWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWmN3PH/UvS +Ta0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst +0OcNOrg+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNc +pRJvkrKTlMeIFw6Ttn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKl +CcWw0bdT82AUuoVpaiF8H3VhFyAXe2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVF +P0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA2MFrLH9ZXF2RsXAiV+uKa0hK +1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBsHvUwyKMQ5bLm +KhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE +JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ +8dCAWZvLMdibD4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnm +fyWl8kgAwKQB2j8= +-----END CERTIFICATE----- + +================================================================ +C: IT +L: Milan +O: Actalis S.p.A./03358520967 +CN: Actalis Authentication Root CA +-----BEGIN CERTIFICATE----- +MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE +BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w +MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 +IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC +SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1 +ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv +UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX +4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9 +KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/ +gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb +rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ +51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F +be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe +KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F +v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn +fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7 +jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz +ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt +ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL +e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70 +jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz +WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V +SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j +pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX +X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok +fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R +K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU +ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU +LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT +LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== +-----END CERTIFICATE----- + +================================================================ +C: JP +O: Japan Certification Services, Inc. +CN: SecureSign RootCA11 +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr +MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG +A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0 +MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp +Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD +QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz +i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8 +h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV +MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9 +UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni +8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC +h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD +VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB +AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm +KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ +X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr +QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5 +pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN +QSdJQO7e5iNEOdyhIta6A/I= +-----END CERTIFICATE----- + +================================================================ +C: JP +O: Japanese Government +OU: ApplicationCA +-----BEGIN CERTIFICATE----- +MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEc +MBoGA1UEChMTSmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRp +b25DQTAeFw0wNzEyMTIxNTAwMDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYT +AkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zlcm5tZW50MRYwFAYDVQQLEw1BcHBs +aWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp23gdE6H +j6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4fl+K +f5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55 +IrmTwcrNwVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cw +FO5cjFW6WY2H/CPek9AEjP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDiht +QWEjdnjDuGWk81quzMKq2edY3rZ+nYVunyoKb58DKTCXKB28t89UKU5RMfkntigm +/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRUWssmP3HMlEYNllPqa0jQ +k/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNVBAYTAkpQ +MRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOC +seODvOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD +ggEBADlqRHZ3ODrso2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJ +hyzjVOGjprIIC8CFqMjSnHH2HZ9g/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+ +eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYDio+nEhEMy/0/ecGc/WLuo89U +DNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmWdupwX3kSa+Sj +B1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL +rosot4LKGAfmt1t06SAZf7IbiVQ= +-----END CERTIFICATE----- + +================================================================ +C: JP +O: SECOM Trust Systems CO.,LTD. +OU: Security Communication EV RootCA1 +-----BEGIN CERTIFICATE----- +MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDEl +MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMh +U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIz +MloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09N +IFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNlY3VyaXR5IENvbW11 +bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSE +RMqm4miO/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gO +zXppFodEtZDkBp2uoQSXWHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5 +bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4zZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDF +MxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4bepJz11sS6/vmsJWXMY1 +VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK9U2vP9eC +OKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G +CSqGSIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HW +tWS3irO4G8za+6xmiEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZ +q51ihPZRwSzJIxXYKLerJRO1RuGGAv8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDb +EJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnWmHyojf6GPgcWkuF75x3sM3Z+ +Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEWT1MKZPlO9L9O +VL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 +-----END CERTIFICATE----- + +================================================================ +C: JP +O: SECOM Trust Systems CO.,LTD. +OU: Security Communication RootCA2 +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl +MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe +U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX +DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy +dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj +YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV +OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr +zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM +VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ +hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO +ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw +awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs +OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 +DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF +coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc +okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8 +t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy +1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/ +SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE----- + +================================================================ +C: JP +O: SECOM Trust.net +OU: Security Communication RootCA1 +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY +MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t +dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5 +WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD +VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8 +9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ +DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9 +Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N +QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ +xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G +A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG +kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr +Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 +Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU +JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot +RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== +-----END CERTIFICATE----- + +================================================================ +C: NL +O: Staat der Nederlanden +CN: Staat der Nederlanden Root CA - G2 +-----BEGIN CERTIFICATE----- +MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO +TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh +dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX +DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl +ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv +b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291 +qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp +uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU +Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE +pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp +5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M +UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN +GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy +5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv +6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK +eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6 +B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/ +BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov +L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG +SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS +CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen +5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897 +IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK +gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL ++63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL +vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm +bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk +N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC +Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z +ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ== +-----END CERTIFICATE----- + +================================================================ +C: NL +O: Staat der Nederlanden +CN: Staat der Nederlanden Root CA +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJO +TDEeMBwGA1UEChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFh +dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEy +MTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4wHAYDVQQKExVTdGFhdCBkZXIgTmVk +ZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENB +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFtvszn +ExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw71 +9tV2U02PjLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MO +hXeiD+EwR+4A5zN9RGcaC1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+U +tFE5A3+y3qcym7RHjm+0Sq7lr7HcsBthvJly3uSJt3omXdozSVtSnA71iq3DuD3o +BmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn622r+I/q85Ej0ZytqERAh +SQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRVHSAAMDww +OgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMv +cm9vdC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA +7Jbg0zTBLL9s+DANBgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k +/rvuFbQvBgwp8qiSpGEN/KtcCFtREytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzm +eafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbwMVcoEoJz6TMvplW0C5GUR5z6 +u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3ynGQI0DvDKcWy +7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR +iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== +-----END CERTIFICATE----- + +================================================================ +C: NO +O: Buypass AS-983163327 +CN: Buypass Class 2 CA 1 +-----BEGIN CERTIFICATE----- +MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3Mg +Q2xhc3MgMiBDQSAxMB4XDTA2MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzEL +MAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MR0wGwYD +VQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7McXA0 +ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLX +l18xoS830r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVB +HfCuuCkslFJgNJQ72uA40Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B +5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/RuFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3 +WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNCMEAwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0PAQH/BAQD +AgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLP +gcIV1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+ +DKhQ7SLHrQVMdvvt7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKu +BctN518fV4bVIJwo+28TOPX2EZL2fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHs +h7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5wwDX3OaJdZtB7WZ+oRxKaJyOk +LY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho +-----END CERTIFICATE----- + +================================================================ +C: NO +O: Buypass AS-983163327 +CN: Buypass Class 2 Root CA +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow +TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr +6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV +L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91 +1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx +MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ +QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB +arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr +Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi +FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS +P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN +9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz +uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h +9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s +A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t +OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo ++fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7 +KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2 +DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us +H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ +I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7 +5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h +3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz +Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA= +-----END CERTIFICATE----- + +================================================================ +C: NO +O: Buypass AS-983163327 +CN: Buypass Class 3 CA 1 +-----BEGIN CERTIFICATE----- +MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3Mg +Q2xhc3MgMyBDQSAxMB4XDTA1MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzEL +MAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MR0wGwYD +VQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKxifZg +isRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//z +NIqeKNc0n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI ++MkcVyzwPX6UvCWThOiaAJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2R +hzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+ +mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNCMEAwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0PAQH/BAQD +AgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFP +Bdy7pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27s +EzNxZy5p+qksP2bAEllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2 +mSlf56oBzKwzqBwKu5HEA6BvtjT5htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yC +e/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQjel/wroQk5PMr+4okoyeYZdow +dXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915 +-----END CERTIFICATE----- + +================================================================ +C: NO +O: Buypass AS-983163327 +CN: Buypass Class 3 Root CA +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow +TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y +ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E +N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9 +tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX +0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c +/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X +KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY +zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS +O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D +34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP +K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3 +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv +Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj +QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV +cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS +IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2 +HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa +O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv +033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u +dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE +kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41 +3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD +u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq +4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc= +-----END CERTIFICATE----- + +================================================================ +C: PL +O: Unizeto Sp. z o.o. +CN: Certum CA +-----BEGIN CERTIFICATE----- +MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBM +MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD +QTAeFw0wMjA2MTExMDQ2MzlaFw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBM +MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD +QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6xwS7TT3zNJc4YPk/E +jG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdLkKWo +ePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GI +ULdtlkIJ89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapu +Ob7kky/ZR6By6/qmW6/KUz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUg +AKpoC6EahQGcxEZjgoi2IrHu/qpGWX7PNSzVttpd90gzFFS269lvzs2I1qsb2pY7 +HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEA +uI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+GXYkHAQa +TOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTg +xSvgGrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1q +CjqTE5s7FCMTY5w/0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5x +O/fIR/RpbxXyEV6DHpx8Uq79AtoSqFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs +6GAqm4VKQPNriiTsBhYscw== +-----END CERTIFICATE----- + +================================================================ +C: PL +O: Unizeto Technologies S.A. +OU: Certum Certification Authority +CN: Certum Trusted Network CA +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM +MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D +ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU +cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 +WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg +Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw +IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH +UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM +TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU +BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM +kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x +AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV +HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y +sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL +I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 +J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY +VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- + +================================================================ +C: RO +O: certSIGN +OU: certSIGN ROOT CA +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT +AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD +QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP +MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do +0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ +UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d +RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ +OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv +JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C +AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O +BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ +LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY +MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ +44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I +Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw +i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN +9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- + +================================================================ +C: SE +O: AddTrust AB +OU: AddTrust External TTP Network +CN: AddTrust External CA Root +-----BEGIN CERTIFICATE----- +MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs +IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 +MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux +FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h +bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v +dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt +H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 +uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX +mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX +a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN +E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 +WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD +VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 +Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU +cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx +IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN +AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH +YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 +6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC +Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX +c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a +mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= +-----END CERTIFICATE----- + +================================================================ +C: SE +O: AddTrust AB +OU: AddTrust TTP Network +CN: AddTrust Class 1 CA Root +-----BEGIN CERTIFICATE----- +MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 +b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMw +MTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYD +VQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUA +A4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ul +CDtbKRY654eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6n +tGO0/7Gcrjyvd7ZWxbWroulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyl +dI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1Zmne3yzxbrww2ywkEtvrNTVokMsAsJch +PXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJuiGMx1I4S+6+JNM3GOGvDC ++Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8wHQYDVR0O +BBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8E +BTADAQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBl +MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFk +ZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENB +IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxtZBsfzQ3duQH6lmM0MkhHma6X +7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0PhiVYrqW9yTkkz +43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY +eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJl +pz/+0WatC7xrmYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOA +WiFeIc9TVPC6b4nbqKqVz4vjccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= +-----END CERTIFICATE----- + +================================================================ +C: SE +O: AddTrust AB +OU: AddTrust TTP Network +CN: AddTrust Public CA Root +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 +b3JrMSAwHgYDVQQDExdBZGRUcnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAx +MDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtB +ZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIDAeBgNV +BAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV +6tsfSlbunyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nX +GCwwfQ56HmIexkvA/X1id9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnP +dzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSGAa2Il+tmzV7R/9x98oTaunet3IAIx6eH +1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAwHM+A+WD+eeSI8t0A65RF +62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0GA1UdDgQW +BBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUw +AwEB/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDEL +MAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRU +cnVzdCBUVFAgTmV0d29yazEgMB4GA1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJv +b3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4JNojVhaTdt02KLmuG7jD8WS6 +IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL+YPoRNWyQSW/ +iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao +GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh +4SINhwBk/ox9Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQm +XiLsks3/QppEIW1cxeMiHV9HEufOX1362KqxMy3ZdvJOOjMMK7MtkAY= +-----END CERTIFICATE----- + +================================================================ +C: SE +O: AddTrust AB +OU: AddTrust TTP Network +CN: AddTrust Qualified CA Root +-----BEGIN CERTIFICATE----- +MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 +b3JrMSMwIQYDVQQDExpBZGRUcnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1 +MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcxCzAJBgNVBAYTAlNFMRQwEgYDVQQK +EwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIzAh +BgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwq +xBb/4Oxx64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G +87B4pfYOQnrjfxvM0PC3KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i +2O+tCBGaKZnhqkRFmhJePp1tUvznoD1oL/BLcHwTOK28FSXx1s6rosAx1i+f4P8U +WfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GRwVY18BTcZTYJbqukB8c1 +0cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HUMIHRMB0G +A1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6Fr +pGkwZzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQL +ExRBZGRUcnVzdCBUVFAgTmV0d29yazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlm +aWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBABmrder4i2VhlRO6aQTv +hsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxGGuoYQ992zPlm +hpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X +dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3 +P6CxB9bpT9zeRXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9Y +iQBCYz95OdBEsIJuQRno3eDBiFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5no +xqE= +-----END CERTIFICATE----- + +================================================================ +C: SK +L: Bratislava +O: Disig a.s. +CN: CA Disig +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzET +MBEGA1UEBxMKQnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UE +AxMIQ0EgRGlzaWcwHhcNMDYwMzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQsw +CQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcg +YS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgmGErE +Nx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnX +mjxUizkDPw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYD +XcDtab86wYqg6I7ZuUUohwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhW +S8+2rT+MitcE5eN4TPWGqvWP+j1scaMtymfraHtuM6kMgiioTGohQBUgDCZbg8Kp +FhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8wgfwwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0PAQH/BAQD +AgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cu +ZGlzaWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5z +ay9jYS9jcmwvY2FfZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2sv +Y2EvY3JsL2NhX2Rpc2lnLmNybDAaBgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEw +DQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59tWDYcPQuBDRIrRhCA/ec8J9B6 +yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3mkkp7M5+cTxq +EEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/ +CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeB +EicTXxChds6KezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFN +PGO+I++MzVpQuGhU+QqZMxEA4Z7CRneC9VkGjCFMhwnN5ag= +-----END CERTIFICATE----- + +================================================================ +C: SK +L: Bratislava +O: Disig a.s. +CN: CA Disig Root R1 +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNV +BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu +MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQy +MDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx +EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjEw +ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy3QRk +D2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/o +OI7bm+V8u8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3A +fQ+lekLZWnDZv6fXARz2m6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJe +IgpFy4QxTaz+29FHuvlglzmxZcfe+5nkCiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8n +oc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTaYVKvJrT1cU/J19IG32PK +/yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6vpmumwKj +rckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD +3AjLLhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE +7cderVC6xkGbrPAXZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkC +yC2fg69naQanMVXVz0tv/wQFx1isXxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLd +qvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ04IwDQYJKoZI +hvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR +xVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaA +SfX8MPWbTx9BLxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXo +HqJPYNcHKfyyo6SdbhWSVhlMCrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpB +emOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5GfbVSUZP/3oNn6z4eGBrxEWi1CXYBmC +AMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85YmLLW1AL14FABZyb +7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKSds+x +DzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvk +F7mGnjixlAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqF +a3qdnom2piiZk4hA9z7NUaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsT +Q6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJa7+h89n07eLw4+1knj0vllJPgFOL +-----END CERTIFICATE----- + +================================================================ +C: SK +L: Bratislava +O: Disig a.s. +CN: CA Disig Root R2 +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV +BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu +MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy +MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx +EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw +ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe +NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH +PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I +x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe +QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR +yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO +QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912 +H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ +QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD +i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs +nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1 +rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI +hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM +tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf +GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb +lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka ++elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal +TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i +nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3 +gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr +G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os +zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x +L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL +-----END CERTIFICATE----- + +================================================================ +C: TR +L: Gebze - Kocaeli +O: Türkiye Bilimsel ve Teknolojik Araştırma Kurumu - TÜBİTAK +OU: Ulusal Elektronik ve Kriptoloji Araştırma Enstitüsü - UEKAE +OU: Kamu Sertifikasyon Merkezi +CN: TÜBİTAK UEKAE Kök Sertifika Hizmet Sağlayıcısı - Sürüm 3 +-----BEGIN CERTIFICATE----- +MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRS +MRgwFgYDVQQHDA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJp +bGltc2VsIHZlIFRla25vbG9qaWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSw +VEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ryb25payB2ZSBLcmlwdG9sb2ppIEFy +YcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNVBAsMGkthbXUgU2Vy +dGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUgS8O2 +ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAe +Fw0wNzA4MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIx +GDAWBgNVBAcMD0dlYnplIC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmls +aW1zZWwgdmUgVGVrbm9sb2ppayBBcmHFn3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBU +QUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZlIEtyaXB0b2xvamkgQXJh +xZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2FtdSBTZXJ0 +aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7Zr +IFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4h +gb46ezzb8R1Sf1n68yJMlaCQvEhOEav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yK +O7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1xnnRFDDtG1hba+818qEhTsXO +fJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR6Oqeyjh1jmKw +lZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL +hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQID +AQABo0IwQDAdBgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/ +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmP +NOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4N5EY3ATIZJkrGG2AA1nJrvhY0D7t +wyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLTy9LQQfMmNkqblWwM +7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYhLBOh +gLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5n +oN+J1q2MdqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUs +yZyQ2uypQjyttgI= +-----END CERTIFICATE----- + +================================================================ +C: TR +O: Elektronik Bilgi Guvenligi A.S. +CN: e-Guven Kok Elektronik Sertifika Hizmet Saglayicisi +-----BEGIN CERTIFICATE----- +MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1 +MQswCQYDVQQGEwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxp +Z2kgQS5TLjE8MDoGA1UEAxMzZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZp +a2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3MDEwNDExMzI0OFoXDTE3MDEwNDEx +MzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0cm9uaWsgQmlsZ2kg +R3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9uaWsg +U2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdU +MZTe1RK6UxYC6lhj71vY8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlT +L/jDj/6z/P2douNffb7tC+Bg62nsM+3YjfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H +5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAIJjjcJRFHLfO6IxClv7wC +90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk9Ok0oSy1 +c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/ +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoE +VtstxNulMA0GCSqGSIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLP +qk/CaOv/gKlR6D1id4k9CnU58W5dF4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S +/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwqD2fK/A+JYZ1lpTzlvBNbCNvj +/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4Vwpm+Vganf2X +KWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq +fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX +-----END CERTIFICATE----- + +================================================================ +C: TW +O: Chunghwa Telecom Co., Ltd. +OU: ePKI Root Certification Authority +-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe +MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 +ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw +IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL +SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH +SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh +ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X +DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 +TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ +fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA +sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU +WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS +nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH +dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip +NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC +AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF +MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB +uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl +PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP +JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ +gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 +j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 +5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB +o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS +/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z +Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE +W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D +hNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- + +================================================================ +C: TW +O: Government Root Certification Authority +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/ +MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow +PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB +AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR +IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q +gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy +yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts +F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2 +jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx +ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC +VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK +YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH +EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN +Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud +DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE +MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK +UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ +TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf +qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK +ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE +JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7 +hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1 +EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm +nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX +udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz +ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe +LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl +pYYsfPQS +-----END CERTIFICATE----- + +================================================================ +C: TW +O: TAIWAN-CA +OU: Root CA +CN: TWCA Root Certification Authority +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES +MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU +V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz +WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO +LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE +AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH +K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX +RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z +rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx +3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq +hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC +MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls +XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D +lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn +aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ +YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE----- + +================================================================ +C: US +O: AffirmTrust +CN: AffirmTrust Commercial +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP +Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr +ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL +MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 +yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr +VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ +nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG +XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj +vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt +Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g +N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC +nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE----- + +================================================================ +C: US +O: AffirmTrust +CN: AffirmTrust Networking +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y +YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua +kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL +QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp +6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG +yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i +QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO +tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu +QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ +Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u +olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 +x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- + +================================================================ +C: US +O: AffirmTrust +CN: AffirmTrust Premium +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz +dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG +A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U +cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf +qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ +JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ ++jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS +s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 +HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 +70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG +V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S +qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S +5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia +C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX +OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE +FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 +KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B +8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ +MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc +0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ +u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF +u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH +YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 +GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO +RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e +KeC2uAloGRwYQw== +-----END CERTIFICATE----- + +================================================================ +C: US +O: AffirmTrust +CN: AffirmTrust Premium ECC +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC +VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ +cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ +BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt +VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D +0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 +ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G +A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs +aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I +flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== +-----END CERTIFICATE----- + +================================================================ +C: US +O: America Online Inc. +CN: America Online Root Certification Authority 1 +-----BEGIN CERTIFICATE----- +MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP +bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2 +MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft +ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lk +hsmj76CGv2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym +1BW32J/X3HGrfpq/m44zDyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsW +OqMFf6Dch9Wc/HKpoH145LcxVR5lu9RhsCFg7RAycsWSJR74kEoYeEfffjA3PlAb +2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP8c9GsEsPPt2IYriMqQko +O3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAU +AK3Zo/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB +BQUAA4IBAQB8itEfGDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkF +Zu90821fnZmv9ov761KyBZiibyrFVL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAb +LjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft3OJvx8Fi8eNy1gTIdGcL+oir +oQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43gKd8hdIaC2y+C +MMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds +sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 +-----END CERTIFICATE----- + +================================================================ +C: US +O: America Online Inc. +CN: America Online Root Certification Authority 2 +-----BEGIN CERTIFICATE----- +MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP +bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2 +MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft +ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC +206B89enfHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFci +KtZHgVdEglZTvYYUAQv8f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2 +JxhP7JsowtS013wMPgwr38oE18aO6lhOqKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9 +BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JNRvCAOVIyD+OEsnpD8l7e +Xz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0gBe4lL8B +PeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67 +Xnfn6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEq +Z8A9W6Wa6897GqidFEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZ +o2C7HK2JNDJiuEMhBnIMoVxtRsX6Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3 ++L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnjB453cMor9H124HhnAgMBAAGj +YzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3OpaaEg5+31IqEj +FNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmn +xPBUlgtk87FYT15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2 +LHo1YGwRgJfMqZJS5ivmae2p+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzccc +obGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXgJXUjhx5c3LqdsKyzadsXg8n33gy8 +CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//ZoyzH1kUQ7rVyZ2OuMe +IjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgOZtMA +DjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2F +AjgQ5ANh1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUX +Om/9riW99XJZZLF0KjhfGEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPb +AZO1XB4Y3WRayhgoPmMEEf0cjQAPuDffZ4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQl +Zvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuPcX/9XhmgD0uRuMRUvAaw +RY8mkaKO/qk= +-----END CERTIFICATE----- + +================================================================ +C: US +O: DigiCert Inc +OU: www.digicert.com +CN: DigiCert Assured ID Root CA +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c +JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP +mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ +wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 +VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ +AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB +AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun +pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC +dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf +fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm +NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx +H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +================================================================ +C: US +O: DigiCert Inc +OU: www.digicert.com +CN: DigiCert Global Root CA +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD +QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB +CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 +nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt +43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P +T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 +gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR +TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw +DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr +hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg +06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF +PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls +YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +================================================================ +C: US +O: DigiCert Inc +OU: www.digicert.com +CN: DigiCert High Assurance EV Root CA +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm ++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW +PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM +xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB +Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 +hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg +EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA +FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec +nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z +eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF +hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 +Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep ++OkuE6N36B9K +-----END CERTIFICATE----- + +================================================================ +C: US +O: Digital Signature Trust +OU: DST ACES +CN: DST ACES CA X6 +-----BEGIN CERTIFICATE----- +MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBb +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3Qx +ETAPBgNVBAsTCERTVCBBQ0VTMRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0w +MzExMjAyMTE5NThaFw0xNzExMjAyMTE5NThaMFsxCzAJBgNVBAYTAlVTMSAwHgYD +VQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UECxMIRFNUIEFDRVMx +FzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPu +ktKe1jzIDZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7 +gLFViYsx+tC3dr5BPTCapCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZH +fAjIgrrep4c9oW24MFbCswKBXy314powGCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4a +ahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPyMjwmR/onJALJfh1biEIT +ajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1UdEwEB/wQF +MAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rk +c3QuY29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjto +dHRwOi8vd3d3LnRydXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMt +aW5kZXguaHRtbDAdBgNVHQ4EFgQUCXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZI +hvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V25FYrnJmQ6AgwbN99Pe7lv7Uk +QIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6tFr8hlxCBPeP/ +h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq +nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpR +rscL9yuwNwXsvFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf2 +9w4LTJxoeHtxMcfrHuBnQfO3oKfN5XozNmr6mis= +-----END CERTIFICATE----- + +================================================================ +C: US +O: Digital Signature Trust Co. +OU: DSTCA E1 +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJV +UzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQL +EwhEU1RDQSBFMTAeFw05ODEyMTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJ +BgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4x +ETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCg +bIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJENySZ +j9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlV +Sn5JTe2io74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCG +SAGG+EIBAQQEAwIABzBoBgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMx +JDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMI +RFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMTAxODEw +MjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFGp5 +fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i ++DAMBgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqG +SIb3DQEBBQUAA4GBACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lN +QseSJqBcNJo4cvj9axY+IO6CizEqkzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+ +gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4RbyhkwS7hp86W0N6w4pl +-----END CERTIFICATE----- + +================================================================ +C: US +O: Digital Signature Trust Co. +OU: DSTCA E2 +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJV +UzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQL +EwhEU1RDQSBFMjAeFw05ODEyMDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJ +BgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4x +ETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQC/ +k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGODVvso +LeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3o +TQPMx7JSxhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCG +SAGG+EIBAQQEAwIABzBoBgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMx +JDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMI +RFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMDkxOTE3 +MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFB6C +TShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5 +WzAMBgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqG +SIb3DQEBBQUAA4GBAEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHR +xdf0CiUPPXiBng+xZ8SQTGPdXqfiup/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVL +B3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1mPnHfxsb1gYgAlihw6ID +-----END CERTIFICATE----- + +================================================================ +C: US +O: Entrust, Inc. +OU: www.entrust.net/CPS is incorporated by reference +OU: (c) 2006 Entrust, Inc. +CN: Entrust Root Certification Authority +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 +Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW +KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw +NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw +NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy +ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV +BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo +Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 +4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 +KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI +rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi +94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB +sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi +gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo +kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE +vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t +O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua +AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP +9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ +eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m +0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- + +================================================================ +C: US +O: Entrust.net +OU: www.entrust.net/CPS incorp. by ref. (limits liab.) +OU: (c) 1999 Entrust.net Limited +CN: Entrust.net Secure Server Certification Authority +-----BEGIN CERTIFICATE----- +MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC +VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u +ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc +KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u +ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1 +MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE +ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j +b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF +bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg +U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA +A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/ +I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3 +wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC +AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb +oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 +BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p +dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk +MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp +b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu +dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0 +MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi +E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa +MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI +hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN +95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd +2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= +-----END CERTIFICATE----- + +================================================================ +C: US +O: Equifax +OU: Equifax Secure Certificate Authority +-----BEGIN CERTIFICATE----- +MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV +UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy +dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1 +MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx +dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B +AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f +BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A +cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC +AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ +MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm +aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw +ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj +IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF +MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA +A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y +7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh +1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4 +-----END CERTIFICATE----- + +================================================================ +C: US +O: Equifax Secure Inc. +CN: Equifax Secure Global eBusiness CA-1 +-----BEGIN CERTIFICATE----- +MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT +ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw +MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj +dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l +c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC +UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc +58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/ +o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH +MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr +aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA +A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA +Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv +8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV +-----END CERTIFICATE----- + +================================================================ +C: US +O: Equifax Secure Inc. +CN: Equifax Secure eBusiness CA-1 +-----BEGIN CERTIFICATE----- +MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT +ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw +MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j +LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ +KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo +RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu +WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw +Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD +AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK +eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM +zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+ +WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN +/Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ== +-----END CERTIFICATE----- + +================================================================ +C: US +O: GTE Corporation +OU: GTE CyberTrust Solutions, Inc. +CN: GTE CyberTrust Global Root +-----BEGIN CERTIFICATE----- +MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD +VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv +bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv +b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV +UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU +cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds +b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH +iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS +r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4 +04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r +GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9 +3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P +lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ +-----END CERTIFICATE----- + +================================================================ +C: US +O: GeoTrust Inc. +CN: GeoTrust Global CA +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i +YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg +R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 +9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq +fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv +iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU +1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ +bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW +MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA +ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l +uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn +Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS +tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF +PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un +hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV +5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== +-----END CERTIFICATE----- + +================================================================ +C: US +O: GeoTrust Inc. +CN: GeoTrust Global CA 2 +-----BEGIN CERTIFICATE----- +MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFs +IENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3Qg +R2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDvPE1A +PRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/NTL8 +Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hL +TytCOb1kLUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL +5mkWRxHCJ1kDs6ZgwiFAVvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7 +S4wMcoKK+xfNAGw6EzywhIdLFnopsk/bHdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe +2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNHK266ZUap +EBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6td +EPx7srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv +/NgdRN3ggX+d6YvhZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywN +A0ZF66D0f0hExghAzN4bcLUprbqLOzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0 +abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkCx1YAzUm5s2x7UwQa4qjJqhIF +I8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqFH4z1Ir+rzoPz +4iIprn2DQKi6bA== +-----END CERTIFICATE----- + +================================================================ +C: US +O: GeoTrust Inc. +CN: GeoTrust Primary Certification Authority +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY +MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo +R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx +MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK +Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 +AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA +ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 +7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W +kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI +mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ +KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 +6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl +4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K +oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj +UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU +AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= +-----END CERTIFICATE----- + +================================================================ +C: US +O: GeoTrust Inc. +CN: GeoTrust Universal CA +-----BEGIN CERTIFICATE----- +MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy +c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE +BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 +IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV +VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 +cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT +QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh +F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v +c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w +mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd +VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX +teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ +f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe +Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ +nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB +/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY +MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG +9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc +aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX +IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn +ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z +uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN +Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja +QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW +koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 +ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt +DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm +bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= +-----END CERTIFICATE----- + +================================================================ +C: US +O: GeoTrust Inc. +CN: GeoTrust Universal CA 2 +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy +c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD +VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1 +c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81 +WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG +FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq +XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL +se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb +KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd +IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73 +y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt +hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc +QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4 +Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV +HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ +KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z +dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ +L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr +Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo +ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY +T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz +GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m +1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV +OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH +6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX +QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS +-----END CERTIFICATE----- + +================================================================ +C: US +O: GeoTrust Inc. +OU: (c) 2007 GeoTrust Inc. - For authorized use only +CN: GeoTrust Primary Certification Authority - G2 +-----BEGIN CERTIFICATE----- +MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL +MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj +KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2 +MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV +BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw +NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV +BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH +MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL +So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal +tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG +CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT +qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz +rD6ogRLQy7rQkgu2npaqBA+K +-----END CERTIFICATE----- + +================================================================ +C: US +O: GeoTrust Inc. +OU: (c) 2008 GeoTrust Inc. - For authorized use only +CN: GeoTrust Primary Certification Authority - G3 +-----BEGIN CERTIFICATE----- +MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB +mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT +MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ +BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg +MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0 +BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz ++uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm +hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn +5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W +JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL +DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC +huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw +HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB +AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB +zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN +kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD +AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH +SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G +spki4cErx5z481+oghLrGREt +-----END CERTIFICATE----- + +================================================================ +C: US +O: Network Solutions L.L.C. +CN: Network Solutions Certificate Authority +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi +MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu +MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp +dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV +UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO +ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz +c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP +OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl +mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF +BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 +qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw +gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu +bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp +dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 +6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ +h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH +/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv +wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN +pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey +-----END CERTIFICATE----- + +================================================================ +C: US +O: SecureTrust Corporation +CN: Secure Global CA +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx +MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg +Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ +iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa +/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ +jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI +HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 +sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w +gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw +KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG +AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L +URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO +H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm +I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY +iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- + +================================================================ +C: US +O: SecureTrust Corporation +CN: SecureTrust CA +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz +MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv +cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz +Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO +0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao +wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj +7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS +8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT +BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg +JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 +6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ +3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm +D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS +CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + +================================================================ +C: US +O: Starfield Technologies, Inc. +OU: Starfield Class 2 Certification Authority +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl +MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp +U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw +NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE +ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp +ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 +DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf +8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN ++lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 +X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa +K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA +1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G +A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR +zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 +YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD +bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w +DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 +L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D +eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp +VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY +WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- + +================================================================ +C: US +O: The Go Daddy Group, Inc. +OU: Go Daddy Class 2 Certification Authority +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh +MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE +YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 +MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo +ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg +MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN +ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA +PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w +wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi +EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY +avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ +YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE +sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h +/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 +IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD +ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy +OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P +TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER +dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf +ReYNnyicsbkqWletNw+vHX/bvZ8= +-----END CERTIFICATE----- + +================================================================ +C: US +O: VISA +OU: Visa International Service Association +CN: Visa eCommerce Root +-----BEGIN CERTIFICATE----- +MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr +MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl +cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv +bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw +CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h +dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l +cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h +2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E +lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV +ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq +299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t +vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL +dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF +AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR +zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3 +LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd +7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw +++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt +398znM/jra6O1I7mT1GvFpLgXPYHDw== +-----END CERTIFICATE----- + +================================================================ +C: US +O: VeriSign, Inc. +OU: Class 1 Public Primary Certification Authority +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCED9pHoGc8JpK83P/uUii5N0wDQYJKoZIhvcNAQEFBQAwXzELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz +cyAxIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 +MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV +BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAxIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN +ADCBiQKBgQDlGb9to1ZhLZlIcfZn3rmN67eehoAKkQ76OCWvRoiC5XOooJskXQ0f +zGVuDLDQVoQYh5oGmxChc9+0WDlrbsH2FdWoqD+qEgaNMax/sDTXjzRniAnNFBHi +TkVWaR94AoDa3EeRKbs2yWNcxeDXLYd7obcysHswuiovMaruo2fa2wIDAQABMA0G +CSqGSIb3DQEBBQUAA4GBAFgVKTk8d6PaXCUDfGD67gmZPCcQcMgMCeazh88K4hiW +NWLMv5sneYlfycQJ9M61Hd8qveXbhpxoJeUwfLaJFf5n0a3hUKw8fGJLj7qE1xIV +Gx/KXQ/BUpQqEZnae88MNhPVNdwQGVnqlMEAv3WP2fr9dgTbYruQagPZRjXZ+Hxb +-----END CERTIFICATE----- + +================================================================ +C: US +O: VeriSign, Inc. +OU: Class 1 Public Primary Certification Authority - G2 +OU: (c) 1998 VeriSign, Inc. - For authorized use only +OU: VeriSign Trust Network +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcExCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh +c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy +MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp +emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X +DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw +FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMg +UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo +YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 +MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQCq0Lq+Fi24g9TK0g+8djHKlNgdk4xWArzZbxpvUjZudVYK +VdPfQ4chEWWKfo+9Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIqWpDBucSm +Fc/IReumXY6cPvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQID +AQABMA0GCSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0J +h9ZrbWB85a7FkCMMXErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2ul +uIncrKTdcu1OofdPvAbT6shkdHvClUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4iP/68 +DzFc6PLZ +-----END CERTIFICATE----- + +================================================================ +C: US +O: VeriSign, Inc. +OU: Class 2 Public Primary Certification Authority - G2 +OU: (c) 1998 VeriSign, Inc. - For authorized use only +OU: VeriSign Trust Network +-----BEGIN CERTIFICATE----- +MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0Ns +YXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH +MjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y +aXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazAe +Fw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJVUzEX +MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGlj +IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMx +KGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazCBnzANBgkqhkiG9w0B +AQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjxnNuX6Zr8wgQGE75fUsjM +HiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRCwiNPStjw +DqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cC +AwEAATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9ji +nb3/7aHmZuovCfTK1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAX +rXfMSTWqz9iP0b63GJZHc2pUIjRkLbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnIn +jBJ7xUS0rg== +-----END CERTIFICATE----- + +================================================================ +C: US +O: VeriSign, Inc. +OU: Class 3 Public Primary Certification Authority +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz +cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 +MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV +BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN +ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE +BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is +I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G +CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do +lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc +AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k +-----END CERTIFICATE----- + +================================================================ +C: US +O: VeriSign, Inc. +OU: Class 3 Public Primary Certification Authority +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz +cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 +MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV +BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN +ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE +BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is +I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G +CSqGSIb3DQEBBQUAA4GBABByUqkFFBkyCEHwxWsKzH4PIRnN5GfcX6kb5sroc50i +2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWXbj9T/UWZYB2oK0z5XqcJ +2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/D/xwzoiQ +-----END CERTIFICATE----- + +================================================================ +C: US +O: VeriSign, Inc. +OU: Class 3 Public Primary Certification Authority - G2 +OU: (c) 1998 VeriSign, Inc. - For authorized use only +OU: VeriSign Trust Network +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh +c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy +MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp +emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X +DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw +FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg +UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo +YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 +MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4 +pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0 +13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID +AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk +U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i +F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY +oJ2daZH9 +-----END CERTIFICATE----- + +================================================================ +C: US +O: VeriSign, Inc. +OU: VeriSign Trust Network +OU: (c) 1999 VeriSign, Inc. - For authorized use only +CN: VeriSign Class 1 Public Primary Certification Authority - G3 +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN2E1Lm0+afY8wR4 +nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/EbRrsC+MO +8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjV +ojYJrKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjb +PG7PoBMAGrgnoeS+Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP2 +6KbqxzcSXKMpHgLZ2x87tNcPVkeBFQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vr +n5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAq2aN17O6x5q25lXQBfGfMY1a +qtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/Ny9Sn2WCVhDr4 +wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3 +ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrs +pSCAaWihT37ha88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4 +E1Z5T21Q6huwtVexN2ZYI/PcD98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g== +-----END CERTIFICATE----- + +================================================================ +C: US +O: VeriSign, Inc. +OU: VeriSign Trust Network +OU: (c) 1999 VeriSign, Inc. - For authorized use only +CN: VeriSign Class 2 Public Primary Certification Authority - G3 +-----BEGIN CERTIFICATE----- +MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVy +aVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24s +IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNp +Z24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJBgNV +BAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNp +Z24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIElu +Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24g +Q2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt +IEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArwoNwtUs22e5LeWU +J92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6tW8UvxDO +JxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUY +wZF7C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9o +koqQHgiBVrKtaaNS0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjN +qWm6o+sdDZykIKbBoMXRRkwXbdKsZj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/E +Srg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0JhU8wI1NQ0kdvekhktdmnLfe +xbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf0xwLRtxyID+u +7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU +sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RI +sH/7NiXaldDxJBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTP +cjnhsUPgKM+351psE2tJs//jGHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q +-----END CERTIFICATE----- + +================================================================ +C: US +O: VeriSign, Inc. +OU: VeriSign Trust Network +OU: (c) 1999 VeriSign, Inc. - For authorized use only +CN: VeriSign Class 3 Public Primary Certification Authority - G3 +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b +N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t +KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu +kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm +CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ +Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu +imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te +2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe +DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC +/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p +F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt +TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +-----END CERTIFICATE----- + +================================================================ +C: US +O: VeriSign, Inc. +OU: VeriSign Trust Network +OU: (c) 1999 VeriSign, Inc. - For authorized use only +CN: VeriSign Class 4 Public Primary Certification Authority - G3 +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1 +GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ ++mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0Gbd +U6LM8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLm +NxdLMEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY +ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ +ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1WrIhVZPMq1 +CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXttmhwwjIDLk5Mq +g6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm +fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c +2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/ +bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== +-----END CERTIFICATE----- + +================================================================ +C: US +O: VeriSign, Inc. +OU: VeriSign Trust Network +OU: (c) 2006 VeriSign, Inc. - For authorized use only +CN: VeriSign Class 3 Public Primary Certification Authority - G5 +-----BEGIN CERTIFICATE----- +MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB +yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW +ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 +nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex +t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz +SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG +BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ +rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ +NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E +BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH +BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy +aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv +MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE +p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y +5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK +WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ +4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N +hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +-----END CERTIFICATE----- + +================================================================ +C: US +O: VeriSign, Inc. +OU: VeriSign Trust Network +OU: (c) 2007 VeriSign, Inc. - For authorized use only +CN: VeriSign Class 3 Public Primary Certification Authority - G4 +-----BEGIN CERTIFICATE----- +MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp +U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg +SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln +biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm +GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve +fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ +aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj +aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW +kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC +4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga +FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== +-----END CERTIFICATE----- + +================================================================ +C: US +O: VeriSign, Inc. +OU: VeriSign Trust Network +OU: (c) 2008 VeriSign, Inc. - For authorized use only +CN: VeriSign Universal Root Certification Authority +-----BEGIN CERTIFICATE----- +MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB +vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W +ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX +MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0 +IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y +IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh +bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF +9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH +H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H +LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN +/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT +rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw +WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs +exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud +DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4 +sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+ +seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz +4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+ +BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR +lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3 +7M2CYfE45k+XmCpajQ== +-----END CERTIFICATE----- + +================================================================ +C: US +O: Wells Fargo +OU: Wells Fargo Certification Authority +CN: Wells Fargo Root Certificate Authority +-----BEGIN CERTIFICATE----- +MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMC +VVMxFDASBgNVBAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9v +dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDAxMDExMTY0MTI4WhcNMjEwMTE0 +MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dlbGxzIEZhcmdvMSww +KgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEvMC0G +A1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n13 +5zHCLielTWi5MbqNQ1mXx3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHE +SxP9cMIlrCL1dQu3U+SlK93OvRw6esP3E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4O +JgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5OEL8pahbSCOz6+MlsoCu +ltQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4jsNtlAHCE +AQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMB +AAGjYTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcB +CzAyMDAGCCsGAQUFBwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRw +b2xpY3kwDQYJKoZIhvcNAQEFBQADggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo +7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrvm+0fazbuSCUlFLZWohDo7qd/ +0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0ROhPs7fpvcmR7 +nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx +x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ +33ZwmVxwQ023tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s= +-----END CERTIFICATE----- + +================================================================ +C: US +O: Wells Fargo WellsSecure +OU: Wells Fargo Bank NA +CN: WellsSecure Public Root Certificate Authority +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMx +IDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxs +cyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9v +dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDcxMjEzMTcwNzU0WhcNMjIxMjE0 +MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdl +bGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQD +DC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+r +WxxTkqxtnt3CxC5FlAM1iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjU +Dk/41itMpBb570OYj7OeUt9tkTmPOL13i0Nj67eT/DBMHAGTthP796EfvyXhdDcs +HqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8bJVhHlfXBIEyg1J55oNj +z7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiBK0HmOFaf +SZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/Slwxl +AgMBAAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqG +KGh0dHA6Ly9jcmwucGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0P +AQH/BAQDAgHGMB0GA1UdDgQWBBQmlRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0j +BIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGBi6SBiDCBhTELMAkGA1UEBhMC +VVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNX +ZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg +Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEB +ALkVsUSRzCPIK0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd +/ZDJPHV3V3p9+N701NX3leZ0bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pB +A4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSljqHyita04pO2t/caaH/+Xc/77szWn +k4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+esE2fDbbFwRnzVlhE9 +iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJtylv +2G0xffX8oRAHh84vWdw+WNs= +-----END CERTIFICATE----- + +================================================================ +C: US +O: thawte, Inc. +OU: (c) 2007 thawte, Inc. - For authorized use only +CN: thawte Primary Root CA - G2 +-----BEGIN CERTIFICATE----- +MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp +IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi +BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw +MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh +d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig +YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v +dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/ +BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6 +papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K +DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3 +KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox +XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== +-----END CERTIFICATE----- + +================================================================ +C: US +O: thawte, Inc. +OU: Certification Services Division +OU: (c) 2006 thawte, Inc. - For authorized use only +CN: thawte Primary Root CA +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB +qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV +BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw +NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j +LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG +A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs +W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta +3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk +6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 +Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J +NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP +r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU +DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz +YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 +/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ +LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 +jVaMaA== +-----END CERTIFICATE----- + +================================================================ +C: US +O: thawte, Inc. +OU: Certification Services Division +OU: (c) 2008 thawte, Inc. - For authorized use only +CN: thawte Primary Root CA - G3 +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB +rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV +BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa +Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl +LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u +MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl +ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm +gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8 +YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf +b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9 +9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S +zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk +OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV +HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA +2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW +oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu +t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c +KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM +m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu +MdRAGmI0Nj81Aa6sY6A= +-----END CERTIFICATE----- + +================================================================ +C: US +OU: www.xrampsecurity.com +O: XRamp Security Services Inc +CN: XRamp Global Certification Authority +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB +gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk +MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY +UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx +NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 +dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy +dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 +38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP +KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q +DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 +qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa +JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi +PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P +BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs +jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 +eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD +ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR +vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa +IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy +i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ +O+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- + +================================================================ +C: US +ST: Arizona +L: Scottsdale +O: GoDaddy.com, Inc. +CN: Go Daddy Root Certificate Authority - G2 +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT +EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp +ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz +NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH +EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE +AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD +E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH +/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy +DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh +GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR +tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA +AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX +WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu +9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr +gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo +2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI +4uJEvlz36hz1 +-----END CERTIFICATE----- + +================================================================ +C: US +ST: Arizona +L: Scottsdale +O: Starfield Technologies, Inc. +CN: Starfield Root Certificate Authority - G2 +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs +ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw +MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj +aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp +Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg +nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 +HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N +Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN +dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 +HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G +CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU +sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 +4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg +8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 +mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- + +================================================================ +C: US +ST: Arizona +L: Scottsdale +O: Starfield Technologies, Inc. +CN: Starfield Services Root Certificate Authority - G2 +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs +ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD +VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy +ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy +dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p +OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 +8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K +Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe +hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk +6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw +DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q +AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI +bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB +ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z +qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn +0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN +sSi6 +-----END CERTIFICATE----- + +================================================================ +C: US +ST: Indiana +L: Indianapolis +O: Software in the Public Interest +OU: hostmaster +CN: Certificate Authority +emailAddress: hostmaster@spi-inc.org +-----BEGIN CERTIFICATE----- +MIIIDjCCBfagAwIBAgIJAOiOtsn4KhQoMA0GCSqGSIb3DQEBBQUAMIG8MQswCQYD +VQQGEwJVUzEQMA4GA1UECBMHSW5kaWFuYTEVMBMGA1UEBxMMSW5kaWFuYXBvbGlz +MSgwJgYDVQQKEx9Tb2Z0d2FyZSBpbiB0aGUgUHVibGljIEludGVyZXN0MRMwEQYD +VQQLEwpob3N0bWFzdGVyMR4wHAYDVQQDExVDZXJ0aWZpY2F0ZSBBdXRob3JpdHkx +JTAjBgkqhkiG9w0BCQEWFmhvc3RtYXN0ZXJAc3BpLWluYy5vcmcwHhcNMDgwNTEz +MDgwNzU2WhcNMTgwNTExMDgwNzU2WjCBvDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0luZGlhbmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UEChMfU29mdHdh +cmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9zdG1hc3RlcjEe +MBwGA1UEAxMVQ2VydGlmaWNhdGUgQXV0aG9yaXR5MSUwIwYJKoZIhvcNAQkBFhZo +b3N0bWFzdGVyQHNwaS1pbmMub3JnMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC +CgKCAgEA3DbmR0LCxFF1KYdAw9iOIQbSGE7r7yC9kDyFEBOMKVuUY/b0LfEGQpG5 +GcRCaQi/izZF6igFM0lIoCdDkzWKQdh4s/Dvs24t3dHLfer0dSbTPpA67tfnLAS1 +fOH1fMVO73e9XKKTM5LOfYFIz2u1IiwIg/3T1c87Lf21SZBb9q1NE8re06adU1Fx +Y0b4ShZcmO4tbZoWoXaQ4mBDmdaJ1mwuepiyCwMs43pPx93jzONKao15Uvr0wa8u +jyoIyxspgpJyQ7zOiKmqp4pRQ1WFmjcDeJPI8L20QcgHQprLNZd6ioFl3h1UCAHx +ZFy3FxpRvB7DWYd2GBaY7r/2Z4GLBjXFS21ZGcfSxki+bhQog0oQnBv1b7ypjvVp +/rLBVcznFMn5WxRTUQfqzj3kTygfPGEJ1zPSbqdu1McTCW9rXRTunYkbpWry9vjQ +co7qch8vNGopCsUK7BxAhRL3pqXTT63AhYxMfHMgzFMY8bJYTAH1v+pk1Vw5xc5s +zFNaVrpBDyXfa1C2x4qgvQLCxTtVpbJkIoRRKFauMe5e+wsWTUYFkYBE7axt8Feo ++uthSKDLG7Mfjs3FIXcDhB78rKNDCGOM7fkn77SwXWfWT+3Qiz5dW8mRvZYChD3F +TbxCP3T9PF2sXEg2XocxLxhsxGjuoYvJWdAY4wCAs1QnLpnwFVMCAwEAAaOCAg8w +ggILMB0GA1UdDgQWBBQ0cdE41xU2g0dr1zdkQjuOjVKdqzCB8QYDVR0jBIHpMIHm +gBQ0cdE41xU2g0dr1zdkQjuOjVKdq6GBwqSBvzCBvDELMAkGA1UEBhMCVVMxEDAO +BgNVBAgTB0luZGlhbmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UEChMf +U29mdHdhcmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9zdG1h +c3RlcjEeMBwGA1UEAxMVQ2VydGlmaWNhdGUgQXV0aG9yaXR5MSUwIwYJKoZIhvcN +AQkBFhZob3N0bWFzdGVyQHNwaS1pbmMub3JnggkA6I62yfgqFCgwDwYDVR0TAQH/ +BAUwAwEB/zARBglghkgBhvhCAQEEBAMCAAcwCQYDVR0SBAIwADAuBglghkgBhvhC +AQ0EIRYfU29mdHdhcmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDAwBglghkgBhvhC +AQQEIxYhaHR0cHM6Ly9jYS5zcGktaW5jLm9yZy9jYS1jcmwucGVtMDIGCWCGSAGG ++EIBAwQlFiNodHRwczovL2NhLnNwaS1pbmMub3JnL2NlcnQtY3JsLnBlbTAhBgNV +HREEGjAYgRZob3N0bWFzdGVyQHNwaS1pbmMub3JnMA4GA1UdDwEB/wQEAwIBBjAN +BgkqhkiG9w0BAQUFAAOCAgEAtM294LnqsgMrfjLp3nI/yUuCXp3ir1UJogxU6M8Y +PCggHam7AwIvUjki+RfPrWeQswN/2BXja367m1YBrzXU2rnHZxeb1NUON7MgQS4M +AcRb+WU+wmHo0vBqlXDDxm/VNaSsWXLhid+hoJ0kvSl56WEq2dMeyUakCHhBknIP +qxR17QnwovBc78MKYiC3wihmrkwvLo9FYyaW8O4x5otVm6o6+YI5HYg84gd1GuEP +sTC8cTLSOv76oYnzQyzWcsR5pxVIBcDYLXIC48s9Fmq6ybgREOJJhcyWR2AFJS7v +dVkz9UcZFu/abF8HyKZQth3LZjQl/GaD68W2MEH4RkRiqMEMVObqTFoo5q7Gt/5/ +O5aoLu7HaD7dAD0prypjq1/uSSotxdz70cbT0ZdWUoa2lOvUYFG3/B6bzAKb1B+P ++UqPti4oOxfMxaYF49LTtcYDyeFIQpvLP+QX4P4NAZUJurgNceQJcHdC2E3hQqlg +g9cXiUPS1N2nGLar1CQlh7XU4vwuImm9rWgs/3K1mKoGnOcqarihk3bOsPN/nOHg +T7jYhkalMwIsJWE3KpLIrIF0aGOHM3a9BX9e1dUCbb2v/ypaqknsmHlHU5H2DjRa +yaXG67Ljxay2oHA1u8hRadDytaIybrw/oDc5fHE2pgXfDBLkFqfF1stjo5VwP+YE +o2A= +-----END CERTIFICATE----- + +================================================================ +C: US +ST: UT +L: Salt Lake City +O: The USERTRUST Network +OU: http://www.usertrust.com +CN: UTN - DATACorp SGC +-----BEGIN CERTIFICATE----- +MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCB +kzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug +Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZBgNVBAMTElVUTiAtIERBVEFDb3Jw +IFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBaMIGTMQswCQYDVQQG +EwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYD +VQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cu +dXNlcnRydXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6 +E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ysraP6LnD43m77VkIVni5c7yPeIbkFdicZ +D0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlowHDyUwDAXlCCpVZvNvlK +4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA9P4yPykq +lXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulW +bfXv33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQAB +o4GrMIGoMAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRT +MtGzz3/64PGgXYVOktKeRR20TzA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3Js +LnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dDLmNybDAqBgNVHSUEIzAhBggr +BgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3DQEBBQUAA4IB +AQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft +Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyj +j98C5OBxOvG0I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVH +KWss5nbZqSl9Mt3JNjy9rjXxEZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv +2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwPDPafepE39peC4N1xaf92P2BNPM/3 +mfnGV/TJVTl4uix5yaaIK/QI +-----END CERTIFICATE----- + +================================================================ +C: US +ST: UT +L: Salt Lake City +O: The USERTRUST Network +OU: http://www.usertrust.com +CN: UTN-USERFirst-Client Authentication and Email +-----BEGIN CERTIFICATE----- +MIIEojCCA4qgAwIBAgIQRL4Mi1AAJLQR0zYlJWfJiTANBgkqhkiG9w0BAQUFADCB +rjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug +Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0BgNVBAMTLVVUTi1VU0VSRmlyc3Qt +Q2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbDAeFw05OTA3MDkxNzI4NTBa +Fw0xOTA3MDkxNzM2NThaMIGuMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAV +BgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5l +dHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTE2MDQGA1UE +AxMtVVROLVVTRVJGaXJzdC1DbGllbnQgQXV0aGVudGljYXRpb24gYW5kIEVtYWls +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsjmFpPJ9q0E7YkY3rs3B +YHW8OWX5ShpHornMSMxqmNVNNRm5pELlzkniii8efNIxB8dOtINknS4p1aJkxIW9 +hVE1eaROaJB7HHqkkqgX8pgV8pPMyaQylbsMTzC9mKALi+VuG6JG+ni8om+rWV6l +L8/K2m2qL+usobNqqrcuZzWLeeEeaYji5kbNoKXqvgvOdjp6Dpvq/NonWz1zHyLm +SGHGTPNpsaguG7bUMSAsvIKKjqQOpdeJQ/wWWq8dcdcRWdq6hw2v+vPhwvCkxWeM +1tZUOt4KpLoDd7NlyP0e03RiqhjKaJMeoYV+9Udly/hNVyh00jT/MLbu9mIwFIws +6wIDAQABo4G5MIG2MAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBSJgmd9xJ0mcABLtFBIfN49rgRufTBYBgNVHR8EUTBPME2gS6BJhkdodHRw +Oi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJGaXJzdC1DbGllbnRBdXRoZW50 +aWNhdGlvbmFuZEVtYWlsLmNybDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUH +AwQwDQYJKoZIhvcNAQEFBQADggEBALFtYV2mGn98q0rkMPxTbyUkxsrt4jFcKw7u +7mFVbwQ+zznexRtJlOTrIEy05p5QLnLZjfWqo7NK2lYcYJeA3IKirUq9iiv/Cwm0 +xtcgBEXkzYABurorbs6q15L+5K/r9CYdFip/bDCVNy8zEqx/3cfREYxRmLLQo5HQ +rfafnoOTHh1CuEava2bwm3/q4wMC5QJRwarVNZ1yQAOJujEdxRBoUp7fooXFXAim +eOZTT7Hot9MUnpOmw2TjrH5xzbyf6QMbzPvprDHBr3wVdAKZw7JHpsIyYdfHb0gk +USeh1YdV8nuPmD0Wnu51tvjQjvLzxq4oW6fw8zYX/MMF08oDSlQ= +-----END CERTIFICATE----- + +================================================================ +C: US +ST: UT +L: Salt Lake City +O: The USERTRUST Network +OU: http://www.usertrust.com +CN: UTN-USERFirst-Hardware +-----BEGIN CERTIFICATE----- +MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCB +lzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug +Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3Qt +SGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgxOTIyWjCBlzELMAkG +A1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEe +MBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8v +d3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdh +cmUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn +0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJ +M6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4a +MXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNd +oI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqI +DsjfPe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9Ksy +oUhbAgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0 +dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3YXJlLmNy +bDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEF +BQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM +//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28Gpgoiskli +CE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gE +CJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t +3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kniCrVWFCVH/A7HFe7fRQ5YiuayZSS +KqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67nfhmqA== +-----END CERTIFICATE----- + +================================================================ +C: ZA +ST: Western Cape +L: Cape Town +O: Thawte Consulting cc +OU: Certification Services Division +CN: Thawte Premium Server CA +emailAddress: premium-server@thawte.com +-----BEGIN CERTIFICATE----- +MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD +VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy +dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t +MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB +MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG +A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp +b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl +cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv +bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE +VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ +ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR +uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG +9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI +hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM +pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg== +-----END CERTIFICATE----- + +================================================================ +C: ZA +ST: Western Cape +L: Cape Town +O: Thawte Consulting cc +OU: Certification Services Division +CN: Thawte Server CA +emailAddress: server-certs@thawte.com +-----BEGIN CERTIFICATE----- +MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD +VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm +MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx +MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3 +dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl +cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3 +DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD +gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91 +yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX +L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj +EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG +7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e +QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ +qdq5snUb9kLy78fyGPmJvKP/iiMucEc= +-----END CERTIFICATE----- + +================================================================ +C: ch +O: Swisscom +OU: Digital Certificate Services +CN: Swisscom Root CA 1 +-----BEGIN CERTIFICATE----- +MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBk +MQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0 +YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3Qg +Q0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4MTgyMjA2MjBaMGQxCzAJBgNVBAYT +AmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGlnaXRhbCBDZXJ0aWZp +Y2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIICIjAN +BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9 +m2BtRsiMMW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdih +FvkcxC7mlSpnzNApbjyFNDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/ +TilftKaNXXsLmREDA/7n29uj/x2lzZAeAR81sH8A25Bvxn570e56eqeqDFdvpG3F +EzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkCb6dJtDZd0KTeByy2dbco +kdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn7uHbHaBu +HYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNF +vJbNcA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo +19AOeCMgkckkKmUpWyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjC +L3UcPX7ape8eYIVpQtPM+GP+HkM5haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJW +bjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNYMUJDLXT5xp6mig/p/r+D5kNX +JLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0hBBYw +FDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j +BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzc +K6FptWfUjNP9MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzf +ky9NfEBWMXrrpA9gzXrzvsMnjgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7Ik +Vh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQMbFamIp1TpBcahQq4FJHgmDmHtqB +sfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4HVtA4oJVwIHaM190e +3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtlvrsR +ls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ip +mXeascClOS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HH +b6D0jqTsNFFbjCYDcKF31QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksf +rK/7DZBaZmBwXarNeNQk7shBoJMBkpxqnvy5JMWzFYJ+vq6VK+uxwNrjAWALXmms +hFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCyx/yP2FS1k2Kdzs9Z+z0Y +zirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMWNY6E0F/6 +MBr1mmz0DlP5OlvRHA== +-----END CERTIFICATE----- + +================================================================ +C: ch +O: Swisscom +OU: Digital Certificate Services +CN: Swisscom Root CA 2 +-----BEGIN CERTIFICATE----- +MIIF2TCCA8GgAwIBAgIQHp4o6Ejy5e/DfEoeWhhntjANBgkqhkiG9w0BAQsFADBk +MQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0 +YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3Qg +Q0EgMjAeFw0xMTA2MjQwODM4MTRaFw0zMTA2MjUwNzM4MTRaMGQxCzAJBgNVBAYT +AmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGlnaXRhbCBDZXJ0aWZp +Y2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAyMIICIjAN +BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlUJOhJ1R5tMJ6HJaI2nbeHCOFvEr +jw0DzpPMLgAIe6szjPTpQOYXTKueuEcUMncy3SgM3hhLX3af+Dk7/E6J2HzFZ++r +0rk0X2s682Q2zsKwzxNoysjL67XiPS4h3+os1OD5cJZM/2pYmLcX5BtS5X4HAB1f +2uY+lQS3aYg5oUFgJWFLlTloYhyxCwWJwDaCFCE/rtuh/bxvHGCGtlOUSbkrRsVP +ACu/obvLP+DHVxxX6NZp+MEkUp2IVd3Chy50I9AU/SpHWrumnf2U5NGKpV+GY3aF +y6//SSj8gO1MedK75MDvAe5QQQg1I3ArqRa0jG6F6bYRzzHdUyYb3y1aSgJA/MTA +tukxGggo5WDDH8SQjhBiYEQN7Aq+VRhxLKX0srwVYv8c474d2h5Xszx+zYIdkeNL +6yxSNLCK/RJOlrDrcH+eOfdmQrGrrFLadkBXeyq96G4DsguAhYidDMfCd7Camlf0 +uPoTXGiTOmekl9AbmbeGMktg2M7v0Ax/lZ9vh0+Hio5fCHyqW/xavqGRn1V9TrAL +acywlKinh/LTSlDcX3KwFnUey7QYYpqwpzmqm59m2I2mbJYV4+by+PGDYmy7Velh +k6M99bFXi08jsJvllGov34zflVEpYKELKeRcVVi3qPyZ7iVNTA6z00yPhOgpD/0Q +VAKFyPnlw4vP5w8CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0hBBYw +FDASBgdghXQBUwIBBgdghXQBUwIBMBIGA1UdEwEB/wQIMAYBAf8CAQcwHQYDVR0O +BBYEFE0mICKJS9PVpAqhb97iEoHF8TwuMB8GA1UdIwQYMBaAFE0mICKJS9PVpAqh +b97iEoHF8TwuMA0GCSqGSIb3DQEBCwUAA4ICAQAyCrKkG8t9voJXiblqf/P0wS4R +fbgZPnm3qKhyN2abGu2sEzsOv2LwnN+ee6FTSA5BesogpxcbtnjsQJHzQq0Qw1zv +/2BZf82Fo4s9SBwlAjxnffUy6S8w5X2lejjQ82YqZh6NM4OKb3xuqFp1mrjX2lhI +REeoTPpMSQpKwhI3qEAMw8jh0FcNlzKVxzqfl9NX+Ave5XLzo9v/tdhZsnPdTSpx +srpJ9csc1fV5yJmz/MFMdOO0vSk3FQQoHt5FRnDsr7p4DooqzgB53MBfGWcsa0vv +aGgLQ+OswWIJ76bdZWGgr4RVSJFSHMYlkSrQwSIjYVmvRRGFHQEkNI/Ps/8XciAT +woCqISxxOQ7Qj1zB09GOInJGTB2Wrk9xseEFKZZZ9LuedT3PDTcNYtsmjGOpI99n +Bjx8Oto0QuFmtEYE3saWmA9LSHokMnWRn6z3aOkquVVlzl1h0ydw2Df+n7mvoC5W +t6NlUe07qxS/TFED6F+KBZvuim6c779o+sjaC+NCydAXFJy3SuCvkychVSa1ZC+N +8f+mQAWFBVzKBxlcCxMoTFh/wqXvRdpg065lYZ1Tg3TCrvJcwhbtkj6EPnNgiLx2 +9CzP0H1907he0ZESEOnN3col49XtmS++dYFLJPlFRpTJKSFTnCZFqhMX5OfNeOI5 +wSsSnqaeG8XmDtkx2Q== +-----END CERTIFICATE----- + +================================================================ +C: ch +O: Swisscom +OU: Digital Certificate Services +CN: Swisscom Root EV CA 2 +-----BEGIN CERTIFICATE----- +MIIF4DCCA8igAwIBAgIRAPL6ZOJ0Y9ON/RAdBB92ylgwDQYJKoZIhvcNAQELBQAw +ZzELMAkGA1UEBhMCY2gxETAPBgNVBAoTCFN3aXNzY29tMSUwIwYDVQQLExxEaWdp +dGFsIENlcnRpZmljYXRlIFNlcnZpY2VzMR4wHAYDVQQDExVTd2lzc2NvbSBSb290 +IEVWIENBIDIwHhcNMTEwNjI0MDk0NTA4WhcNMzEwNjI1MDg0NTA4WjBnMQswCQYD +VQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2Vy +dGlmaWNhdGUgU2VydmljZXMxHjAcBgNVBAMTFVN3aXNzY29tIFJvb3QgRVYgQ0Eg +MjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMT3HS9X6lds93BdY7Bx +UglgRCgzo3pOCvrY6myLURYaVa5UJsTMRQdBTxB5f3HSek4/OE6zAMaVylvNwSqD +1ycfMQ4jFrclyxy0uYAyXhqdk/HoPGAsp15XGVhRXrwsVgu42O+LgrQ8uMIkqBPH +oCE2G3pXKSinLr9xJZDzRINpUKTk4RtiGZQJo/PDvO/0vezbE53PnUgJUmfANykR +HvvSEaeFGHR55E+FFOtSN+KxRdjMDUN/rhPSays/p8LiqG12W0OfvrSdsyaGOx9/ +5fLoZigWJdBLlzin5M8J0TbDC77aO0RYjb7xnglrPvMyxyuHxuxenPaHZa0zKcQv +idm5y8kDnftslFGXEBuGCxobP/YCfnvUxVFkKJ3106yDgYjTdLRZncHrYTNaRdHL +OdAGalNgHa/2+2m8atwBz735j9m9W8E6X47aD0upm50qKGsaCnw8qyIL5XctcfaC +NYGu+HuB5ur+rPQam3Rc6I8k9l2dRsQs0h4rIWqDJ2dVSqTjyDKXZpBy2uPUZC5f +46Fq9mDU5zXNysRojddxyNMkM3OxbPlq4SjbX8Y96L5V5jcb7STZDxmPX2MYWFCB +UWVv8p9+agTnNCRxunZLWB4ZvRVgRaoMEkABnRDixzgHcgplwLa7JSnaFp6LNYth +7eVxV4O1PHGf40+/fh6Bn0GXAgMBAAGjgYYwgYMwDgYDVR0PAQH/BAQDAgGGMB0G +A1UdIQQWMBQwEgYHYIV0AVMCAgYHYIV0AVMCAjASBgNVHRMBAf8ECDAGAQH/AgED +MB0GA1UdDgQWBBRF2aWBbj2ITY1x0kbBbkUe88SAnTAfBgNVHSMEGDAWgBRF2aWB +bj2ITY1x0kbBbkUe88SAnTANBgkqhkiG9w0BAQsFAAOCAgEAlDpzBp9SSzBc1P6x +XCX5145v9Ydkn+0UjrgEjihLj6p7jjm02Vj2e6E1CqGdivdj5eu9OYLU43otb98T +PLr+flaYC/NUn81ETm484T4VvwYmneTwkLbUwp4wLh/vx3rEUMfqe9pQy3omywC0 +Wqu1kx+AiYQElY2NfwmTv9SoqORjbdlk5LgpWgi/UOGED1V7XwgiG/W9mR4U9s70 +WBCCswo9GcG/W6uqmdjyMb3lOGbcWAXH7WMaLgqXfIeTK7KK4/HsGOV1timH59yL +Gn602MnTihdsfSlEvoqq9X46Lmgxk7lq2prg2+kupYTNHAq4Sgj5nPFhJpiTt3tm +7JFe3VE/23MPrQRYCd0EApUKPtN236YQHoA96M2kZNEzx5LH4k5E4wnJTsJdhw4S +nr8PyQUQ3nqjsTzyP6WqJ3mtMX0f/fwZacXduT98zca0wjAefm6S139hdlqP65VN +vBFuIXxZN5nQBrz5Bm0yFqXZaajh3DyAHmBR3NdUIR7KYndP+tiPsys6DXhyyWhB +WkdKwqPrGtcKqzwyVcgKEZzfdNbwQBUdyLmPtTbFr/giuMod89a2GQ+fYWVq6nTI +fI/DT11lgh/ZDYnadXL77/FHZxOzyNEZiCcmmpl5fx7kLD977vHeTYuWl8PVP3wb +I+2ksx0WckNLIOFZfsLorSa/ovc= +-----END CERTIFICATE----- + +================================================================ +CN: ACEDICOM Root +OU: PKI +O: EDICOM +C: ES +-----BEGIN CERTIFICATE----- +MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UE +AwwNQUNFRElDT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00x +CzAJBgNVBAYTAkVTMB4XDTA4MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEW +MBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZF +RElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKC +AgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHkWLn7 +09gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7 +XBZXehuDYAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5P +Grjm6gSSrj0RuVFCPYewMYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAK +t0SdE3QrwqXrIhWYENiLxQSfHY9g5QYbm8+5eaA9oiM/Qj9r+hwDezCNzmzAv+Yb +X79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbkHQl/Sog4P75n/TSW9R28 +MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTTxKJxqvQU +fecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI +2Sf23EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyH +K9caUPgn6C9D4zq92Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEae +ZAwUswdbxcJzbPEHXEUkFDWug/FqTYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAP +BgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz4SsrSbbXc6GqlPUB53NlTKxQ +MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU9QHnc2VMrFAw +RAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv +bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWIm +fQwng4/F9tqgaHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3 +gvoFNTPhNahXwOf9jU8/kzJPeGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKe +I6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1PwkzQSulgUV1qzOMPPKC8W64iLgpq0i +5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1ThCojz2GuHURwCRi +ipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oIKiMn +MCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZ +o5NjEFIqnxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6 +zqylfDJKZ0DcMDQj3dcEI2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacN +GHk0vFQYXlPKNFHtRQrmjseCNj6nOGOpMCwXEGCSn1WHElkQwg9naRHMTh5+Spqt +r0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3otkYNbn5XOmeUwssfnHdK +Z05phkOTOPu220+DkdRgfks+KzgHVZhepA== +-----END CERTIFICATE----- + +================================================================ +CN: ComSign CA +O: ComSign +C: IL +-----BEGIN CERTIFICATE----- +MIIDkzCCAnugAwIBAgIQFBOWgxRVjOp7Y+X8NId3RDANBgkqhkiG9w0BAQUFADA0 +MRMwEQYDVQQDEwpDb21TaWduIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQG +EwJJTDAeFw0wNDAzMjQxMTMyMThaFw0yOTAzMTkxNTAyMThaMDQxEzARBgNVBAMT +CkNvbVNpZ24gQ0ExEDAOBgNVBAoTB0NvbVNpZ24xCzAJBgNVBAYTAklMMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8ORUaSvTx49qROR+WCf4C9DklBKK +8Rs4OC8fMZwG1Cyn3gsqrhqg455qv588x26i+YtkbDqthVVRVKU4VbirgwTyP2Q2 +98CNQ0NqZtH3FyrV7zb6MBBC11PN+fozc0yz6YQgitZBJzXkOPqUm7h65HkfM/sb +2CEJKHxNGGleZIp6GZPKfuzzcuc3B1hZKKxC+cX/zT/npfo4sdAMx9lSGlPWgcxC +ejVb7Us6eva1jsz/D3zkYDaHL63woSV9/9JLEYhwVKZBqGdTUkJe5DSe5L6j7Kpi +Xd3DTKaCQeQzC6zJMw9kglcq/QytNuEMrkvF7zuZ2SOzW120V+x0cAwqTwIDAQAB +o4GgMIGdMAwGA1UdEwQFMAMBAf8wPQYDVR0fBDYwNDAyoDCgLoYsaHR0cDovL2Zl +ZGlyLmNvbXNpZ24uY28uaWwvY3JsL0NvbVNpZ25DQS5jcmwwDgYDVR0PAQH/BAQD +AgGGMB8GA1UdIwQYMBaAFEsBmz5WGmU2dst7l6qSBe4y5ygxMB0GA1UdDgQWBBRL +AZs+VhplNnbLe5eqkgXuMucoMTANBgkqhkiG9w0BAQUFAAOCAQEA0Nmlfv4pYEWd +foPPbrxHbvUanlR2QnG0PFg/LUAlQvaBnPGJEMgOqnhPOAlXsDzACPw1jvFIUY0M +cXS6hMTXcpuEfDhOZAYnKuGntewImbQKDdSFc8gS4TXt8QUxHXOZDOuWyt3T5oWq +8Ir7dcHyCTxlZWTzTNity4hp8+SDtwy9F1qWF8pb/627HOkthIDYIb6FUtnUdLlp +hbpN7Sgy6/lhSuTENh4Z3G+EER+V9YMoGKgzkkMn3V0TBEVPh9VGzT2ouvDzuFYk +Res3x+F2T3I5GN9+dHLHcy056mDmrRGiVod7w2ia/viMcKjfZTL0pECMocJEAw6U +AGegcQCCSA== +-----END CERTIFICATE----- + +================================================================ +CN: ComSign Secured CA +O: ComSign +C: IL +-----BEGIN CERTIFICATE----- +MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAw +PDEbMBkGA1UEAxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWdu +MQswCQYDVQQGEwJJTDAeFw0wNDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwx +GzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBDQTEQMA4GA1UEChMHQ29tU2lnbjEL +MAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGtWhf +HZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs49oh +gHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sW +v+bznkqH7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ue +Mv5WJDmyVIRD9YTC2LxBkMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr +9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d19guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt +6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUwAwEB/zBEBgNVHR8EPTA7 +MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29tU2lnblNl +Y3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58 +ADsAj8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkq +hkiG9w0BAQUFAAOCAQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7p +iL1DRYHjZiM/EoZNGeQFsOY3wo3aBijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtC +dsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtpFhpFfTMDZflScZAmlaxMDPWL +kz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP51qJThRv4zdL +hfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz +OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw== +-----END CERTIFICATE----- + +================================================================ +CN: EBG Elektronik Sertifika Hizmet Sağlayıcısı +O: EBG Bilişim Teknolojileri ve Hizmetleri A.Ş. +C: TR +-----BEGIN CERTIFICATE----- +MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNV +BAMML0VCRyBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx +c8SxMTcwNQYDVQQKDC5FQkcgQmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXpt +ZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAeFw0wNjA4MTcwMDIxMDlaFw0xNjA4 +MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25payBTZXJ0aWZpa2Eg +SGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2ltIFRl +a25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h +4fuXd7hxlugTlkaDT7byX3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAk +tiHq6yOU/im/+4mRDGSaBUorzAzu8T2bgmmkTPiab+ci2hC6X5L8GCcKqKpE+i4s +tPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfreYteIAbTdgtsApWjluTL +dlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZTqNGFav4 +c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8Um +TDGyY5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z ++kI2sSXFCjEmN1ZnuqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0O +Lna9XvNRiYuoP1Vzv9s6xiQFlpJIqkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMW +OeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vmExH8nYQKE3vwO9D8owrXieqW +fo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0Nokb+Clsi7n2 +l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB +/wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgw +FoAU587GT/wWZ5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+ +8ygjdsZs93/mQJ7ANtyVDR2tFcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI +6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgmzJNSroIBk5DKd8pNSe/iWtkqvTDO +TLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64kXPBfrAowzIpAoHME +wfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqTbCmY +Iai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJn +xk1Gj7sURT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4Q +DgZxGhBM/nV+/x5XOULK1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9q +Kd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11t +hie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQY9iJSrSq3RZj9W6+YKH4 +7ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9AahH3eU7 +QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT +-----END CERTIFICATE----- + +================================================================ +CN: TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı +C: TR +L: ANKARA +O: (c) 2005 TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. +-----BEGIN CERTIFICATE----- +MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOc +UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx +c8SxMQswCQYDVQQGDAJUUjEPMA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykg +MjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8 +dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMxMDI3MTdaFw0xNTAz +MjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsgU2Vy +dGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYD +VQQHDAZBTktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kg +xLBsZXRpxZ9pbSB2ZSBCaWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEu +xZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7 +XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GXyGl8hMW0kWxsE2qkVa2k +heiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8iSi9BB35J +YbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5C +urKZ8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1 +JuTm5Rh8i27fbMx4W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51 +b0dewQIDAQABoxAwDjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV +9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46sWrv7/hg0Uw2ZkUd82YCdAR7 +kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxEq8Sn5RTOPEFh +fEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy +B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdA +aLX/7KfS0zgYnNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKS +RGQDJereW26fyfJOrN3H +-----END CERTIFICATE----- + +================================================================ +CN: TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı +C: TR +L: Ankara +O: TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. (c) Aralık 2007 +-----BEGIN CERTIFICATE----- +MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOc +UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx +c8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xS +S1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kg +SGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4XDTA3MTIyNTE4Mzcx +OVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxla3Ry +b25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMC +VFIxDzANBgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDE +sGxldGnFn2ltIHZlIEJpbGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7F +ni4gKGMpIEFyYWzEsWsgMjAwNzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9NYvDdE3ePYakqtdTyuTFY +KTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQvKUmi8wUG ++7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveG +HtyaKhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6P +IzdezKKqdfcYbwnTrqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M +733WB2+Y8a+xwXrXgTW4qhe04MsCAwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHk +Yb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G +CSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/sPx+EnWVUXKgW +AkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I +aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5 +mxRZNTZPz/OOXl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsa +XRik7r4EW5nVcV9VZWRi1aKbBFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZ +qxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAKpoRq0Tl9 +-----END CERTIFICATE----- + +================================================================ +CN: TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı +C: TR +L: Ankara +O: TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. (c) Kasım 2005 +-----BEGIN CERTIFICATE----- +MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOc +UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx +c8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xS +S1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kg +SGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcNMDUxMTA3MTAwNzU3 +WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVrdHJv +bmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJU +UjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSw +bGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWe +LiAoYykgS2FzxLFtIDIwMDUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqeLCDe2JAOCtFp0if7qnef +J1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKIx+XlZEdh +R3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJ +Qv2gQrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGX +JHpsmxcPbe9TmJEr5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1p +zpwACPI2/z7woQ8arBT9pmAPAgMBAAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58S +Fq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8GA1UdEwEB/wQFMAMBAf8wDQYJ +KoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/nttRbj2hWyfIvwq +ECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4 +Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFz +gw2lGh1uEpJ+hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotH +uFEJjOp9zYhys2AzsfAKRO8P9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LS +y3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5UrbnBEI= +-----END CERTIFICATE----- + +================================================================ +L: ValiCert Validation Network +O: ValiCert, Inc. +OU: ValiCert Class 1 Policy Validation Authority +CN: http://www.valicert.com/ +emailAddress: info@valicert.com +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIyMjM0OFoXDTE5MDYy +NTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9Y +LqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+ +TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8Y +TfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0 +LBwGlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLW +I8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw +nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI +-----END CERTIFICATE----- + +================================================================ +L: ValiCert Validation Network +O: ValiCert, Inc. +OU: ValiCert Class 2 Policy Validation Authority +CN: http://www.valicert.com/ +emailAddress: info@valicert.com +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy +NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY +dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9 +WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS +v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v +UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu +IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC +W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd +-----END CERTIFICATE----- + +================================================================ +L: ValiCert Validation Network +O: ValiCert, Inc. +OU: ValiCert Class 3 Policy Validation Authority +CN: http://www.valicert.com/ +emailAddress: info@valicert.com +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy +NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD +cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs +2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY +JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE +Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ +n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A +PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu +-----END CERTIFICATE----- + +================================================================ +O: Cybertrust, Inc +CN: Cybertrust Global Root +-----BEGIN CERTIFICATE----- +MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG +A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh +bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE +ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS +b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5 +7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS +J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y +HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP +t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz +FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY +XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ +MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw +hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js +MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA +A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj +Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx +XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o +omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc +A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW +WL1WMRJOEcgh4LMRkWXbtKaIOM5V +-----END CERTIFICATE----- + +================================================================ +O: Digital Signature Trust Co. +CN: DST Root CA X3 +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ +MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT +DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow +PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD +Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O +rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq +OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b +xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw +7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD +aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG +SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 +ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr +AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz +R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 +JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo +Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ +-----END CERTIFICATE----- + +================================================================ +O: Entrust.net +OU: www.entrust.net/CPS_2048 incorp. by ref. (limits liab.) +OU: (c) 1999 Entrust.net Limited +CN: Entrust.net Certification Authority (2048) +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML +RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp +bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 +IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3 +MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 +LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp +YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG +A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq +K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe +sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX +MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT +XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ +HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH +4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub +j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo +U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf +zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b +u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+ +bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er +fF6adulZkMV8gzURZVE= +-----END CERTIFICATE----- + +================================================================ +O: RSA Security Inc +OU: RSA Security 2048 V3 +-----BEGIN CERTIFICATE----- +MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6 +MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJp +dHkgMjA0OCBWMzAeFw0wMTAyMjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAX +BgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJTQSBTZWN1cml0eSAy +MDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt49VcdKA3Xtp +eafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7Jylg +/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGl +wSMiuLgbWhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnh +AMFRD0xS+ARaqn1y07iHKrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2 +PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpu +AWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4EFgQUB8NR +MKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYc +HnmYv/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/ +Zb5gEydxiKRz44Rj0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+ +f00/FGj1EVDVwfSQpQgdMWD/YIwjVAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVO +rSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395nzIlQnQFgCi/vcEkllgVsRch +6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kApKnXwiJPZ9d3 +7CAFYd4= +-----END CERTIFICATE----- + +================================================================ +OU: GlobalSign Root CA - R2 +O: GlobalSign +CN: GlobalSign +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 +MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL +v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 +eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq +tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd +C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa +zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB +mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH +V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n +bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG +3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs +J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO +291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS +ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd +AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 +TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== +-----END CERTIFICATE----- + +================================================================ +OU: GlobalSign Root CA - R3 +O: GlobalSign +CN: GlobalSign +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 +MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 +RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT +gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm +KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd +QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ +XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw +DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o +LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU +RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp +jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK +6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX +mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs +Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH +WD9f +-----END CERTIFICATE----- + +================================================================ +emailAddress: contacto@procert.net.ve +L: Chacao +ST: Miranda +OU: Proveedor de Certificados PROCERT +O: Sistema Nacional de Certificacion Electronica +C: VE +CN: PSCProcert +-----BEGIN CERTIFICATE----- +MIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1 +dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9s +YW5vMQswCQYDVQQGEwJWRTEQMA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlz +dHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0 +aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBlcmludGVuZGVuY2lh +IGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUwIwYJ +KoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEw +MFoXDTIwMTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHBy +b2NlcnQubmV0LnZlMQ8wDQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGEx +KjAoBgNVBAsTIVByb3ZlZWRvciBkZSBDZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQG +A1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9u +aWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIwDQYJKoZI +hvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo9 +7BVCwfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74 +BCXfgI8Qhd19L3uA3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38G +ieU89RLAu9MLmV+QfI4tL3czkkohRqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9 +JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmOEO8GqQKJ/+MMbpfg353bIdD0 +PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG20qCZyFSTXai2 +0b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH +0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/ +6mnbVSKVUyqUtd+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1m +v6JpIzi4mWCZDlZTOpx+FIywBm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7 +K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvpr2uKGcfLFFb14dq12fy/czja+eev +bqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/AgEBMDcGA1UdEgQw +MC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAzNi0w +MB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFD +gBStuyIdxuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0 +b3JpZGFkIGRlIENlcnRpZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xh +bm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQHEwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0 +cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5hY2lvbmFsIGRlIENlcnRp +ZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5kZW5jaWEg +ZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkq +hkiG9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQD +AgEGME0GA1UdEQRGMESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0w +MDAwMDKgGwYFYIZeAgKgEgwQUklGLUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEag +RKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9sY3IvQ0VSVElGSUNBRE8t +UkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNyYWl6LnN1c2Nl +cnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v +Y3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsG +AQUFBwIBFh5odHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcN +AQELBQADggIBACtZ6yKZu4SqT96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS +1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmNg7+mvTV+LFwxNG9s2/NkAZiqlCxB +3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4quxtxj7mkoP3Yldmv +Wb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1n8Gh +HVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHm +pHmJWhSnFFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXz +sOfIt+FTvZLm8wyWuevo5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bE +qCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq3TNWOByyrYDT13K9mmyZY+gAu0F2Bbdb +mRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5poLWccret9W6aAjtmcz9 +opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3YeMLEYC/H +YvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km +-----END CERTIFICATE----- + +================================================================ +emailAddress: pki@sk.ee +C: EE +O: AS Sertifitseerimiskeskus +CN: Juur-SK +-----BEGIN CERTIFICATE----- +MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcN +AQkBFglwa2lAc2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZp +dHNlZXJpbWlza2Vza3VzMRAwDgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMw +MVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMQsw +CQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEQ +MA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOB +SvZiF3tfTQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkz +ABpTpyHhOEvWgxutr2TC+Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvH +LCu3GFH+4Hv2qEivbDtPL+/40UceJlfwUR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMP +PbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDaTpxt4brNj3pssAki14sL +2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQFMAMBAf8w +ggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwIC +MIHDHoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDk +AGwAagBhAHMAdABhAHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0 +AHMAZQBlAHIAaQBtAGkAcwBrAGUAcwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABz +AGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABrAGkAbgBuAGkAdABhAG0AaQBz +AGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nwcy8wKwYDVR0f +BCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE +FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcY +P2/v6X2+MA4GA1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOi +CfP+JmeaUOTDBS8rNXiRTHyoERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+g +kcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyLabVAyJRld/JXIWY7zoVAtjNjGr95 +HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678IIbsSt4beDI3poHS +na9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkhMp6q +qIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0Z +TbvGRNs2yyqcjg== +-----END CERTIFICATE----- diff --git a/vendor/stripe/stripe-php/test/Stripe.php b/vendor/stripe/stripe-php/test/Stripe.php new file mode 100644 index 0000000..6c2a51f --- /dev/null +++ b/vendor/stripe/stripe-php/test/Stripe.php @@ -0,0 +1,57 @@ +, and either install it ". + "in your PHP include_path or put it in the test/ directory.\n"; + exit(1); +} + +// Throw an exception on any error +// @codingStandardsIgnoreStart +function exception_error_handler($errno, $errstr, $errfile, $errline) +{ + throw new ErrorException($errstr, $errno, 0, $errfile, $errline); +} +// @codingStandardsIgnoreEnd +set_error_handler('exception_error_handler'); +error_reporting(E_ALL | E_STRICT); + +require_once(dirname(__FILE__) . '/../lib/Stripe.php'); + +require_once(dirname(__FILE__) . '/Stripe/TestCase.php'); + +require_once(dirname(__FILE__) . '/Stripe/ApiRequestorTest.php'); +require_once(dirname(__FILE__) . '/Stripe/AuthenticationErrorTest.php'); +require_once(dirname(__FILE__) . '/Stripe/CardErrorTest.php'); +require_once(dirname(__FILE__) . '/Stripe/AccountTest.php'); +require_once(dirname(__FILE__) . '/Stripe/BalanceTest.php'); +require_once(dirname(__FILE__) . '/Stripe/BalanceTransactionTest.php'); +require_once(dirname(__FILE__) . '/Stripe/ChargeTest.php'); +require_once(dirname(__FILE__) . '/Stripe/CouponTest.php'); +require_once(dirname(__FILE__) . '/Stripe/CustomerTest.php'); +require_once(dirname(__FILE__) . '/Stripe/DiscountTest.php'); +require_once(dirname(__FILE__) . '/Stripe/Error.php'); +require_once(dirname(__FILE__) . '/Stripe/InvalidRequestErrorTest.php'); +require_once(dirname(__FILE__) . '/Stripe/InvoiceTest.php'); +require_once(dirname(__FILE__) . '/Stripe/ObjectTest.php'); +require_once(dirname(__FILE__) . '/Stripe/PlanTest.php'); +require_once(dirname(__FILE__) . '/Stripe/SubscriptionTest.php'); +require_once(dirname(__FILE__) . '/Stripe/Token.php'); +require_once(dirname(__FILE__) . '/Stripe/TransferTest.php'); +require_once(dirname(__FILE__) . '/Stripe/RecipientTest.php'); +require_once(dirname(__FILE__) . '/Stripe/RefundTest.php'); +require_once(dirname(__FILE__) . '/Stripe/ApplicationFeeTest.php'); +require_once(dirname(__FILE__) . '/Stripe/ApplicationFeeRefundTest.php'); +require_once(dirname(__FILE__) . '/Stripe/BitcoinReceiverTest.php'); +require_once(dirname(__FILE__) . '/Stripe/UtilTest.php'); +require_once(dirname(__FILE__) . '/Stripe/RequestOptionsTest.php'); diff --git a/vendor/stripe/stripe-php/test/Stripe/AccountTest.php b/vendor/stripe/stripe-php/test/Stripe/AccountTest.php new file mode 100644 index 0000000..8ac629c --- /dev/null +++ b/vendor/stripe/stripe-php/test/Stripe/AccountTest.php @@ -0,0 +1,16 @@ +assertEqual($d->id, "cuD9Rwx8pgmRZRpVe02lsuR9cwp2Bzf7"); + $this->assertEqual($d->email, "test+bindings@stripe.com"); + // @codingStandardsIgnoreStart + $this->assertEqual($d->charges_enabled, false); + $this->assertEqual($d->details_submitted, false); + // @codingStandardsIgnoreEnd + } +} diff --git a/vendor/stripe/stripe-php/test/Stripe/ApiRequestorTest.php b/vendor/stripe/stripe-php/test/Stripe/ApiRequestorTest.php new file mode 100644 index 0000000..749f8fd --- /dev/null +++ b/vendor/stripe/stripe-php/test/Stripe/ApiRequestorTest.php @@ -0,0 +1,124 @@ + 'value', + 'that' => array('your' => 'example'), + 'bar' => 1, + 'baz' => null + ); + + $enc = Stripe_APIRequestor::encode($a); + $this->assertEqual($enc, 'my=value&that%5Byour%5D=example&bar=1'); + + $a = array('that' => array('your' => 'example', 'foo' => null)); + $enc = Stripe_APIRequestor::encode($a); + $this->assertEqual($enc, 'that%5Byour%5D=example'); + + $a = array('that' => 'example', 'foo' => array('bar', 'baz')); + $enc = Stripe_APIRequestor::encode($a); + $this->assertEqual($enc, 'that=example&foo%5B%5D=bar&foo%5B%5D=baz'); + + $a = array( + 'my' => 'value', + 'that' => array('your' => array('cheese', 'whiz', null)), + 'bar' => 1, + 'baz' => null + ); + + $enc = Stripe_APIRequestor::encode($a); + $expected = 'my=value&that%5Byour%5D%5B%5D=cheese' + . '&that%5Byour%5D%5B%5D=whiz&bar=1'; + $this->assertEqual($enc, $expected); + } + + public function testUtf8() + { + // UTF-8 string + $x = "\xc3\xa9"; + $this->assertEqual(Stripe_ApiRequestor::utf8($x), $x); + + // Latin-1 string + $x = "\xe9"; + $this->assertEqual(Stripe_ApiRequestor::utf8($x), "\xc3\xa9"); + + // Not a string + $x = TRUE; + $this->assertEqual(Stripe_ApiRequestor::utf8($x), $x); + } + + public function testEncodeObjects() + { + // We have to do some work here because this is normally + // private. This is just for testing! Also it only works on PHP >= + // 5.3 + if (version_compare(PHP_VERSION, '5.3.2', '>=')) { + $reflector = new ReflectionClass('Stripe_APIRequestor'); + $method = $reflector->getMethod('_encodeObjects'); + $method->setAccessible(true); + + $a = array('customer' => new Stripe_Customer('abcd')); + $enc = $method->invoke(null, $a); + $this->assertEqual($enc, array('customer' => 'abcd')); + + // Preserves UTF-8 + $v = array('customer' => "☃"); + $enc = $method->invoke(null, $v); + $this->assertEqual($enc, $v); + + // Encodes latin-1 -> UTF-8 + $v = array('customer' => "\xe9"); + $enc = $method->invoke(null, $v); + $this->assertEqual($enc, array('customer' => "\xc3\xa9")); + } + } + + public function testBlacklistedPEMCert() + { + $cert = + // {{{ Revoked certificate from api.stripe.com +'-----BEGIN CERTIFICATE----- +MIIGoDCCBYigAwIBAgIQATGh1aL1Q3mXYwp7zTQ8+zANBgkqhkiG9w0BAQUFADBm +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSUwIwYDVQQDExxEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBDQS0zMB4XDTEzMDkyNzAwMDAwMFoXDTE1MDEwODEyMDAwMFowajELMAkGA1UE +BhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFuY2lz +Y28xFTATBgNVBAoTDFN0cmlwZSwgSW5jLjEXMBUGA1UEAxMOYXBpLnN0cmlwZS5j +b20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9a37/epvqPM/9ExSv +L4jOFyuT+h9+kSePtjRD4N2z/r9zqUt88TRe2TSPM0o7yqRAmggqck1iFQmmgkU8 +i5YjaGBVUSp9jyWZ7U+G9L9IRmxxWoYKaofpnGiGuTnpWgPPYtooXx+mhatvmiiM +tdJCU5QCN4rSvH9QnMHGrGupSw0Hb68d5nbbfk5f3IdYpjFR0+b0RHIoSrYPhiJF +r3/4h61Iu3PFea70wASLnP0olKlstQ6FONpsoYBRONvgs8/gUPQVY/VllbEceEpt +Bm5fIP5Cgd+Zya9uGqXsru1MyPIrR93u/YHDSYpC1TJ+BlSAamoC8ahtRNXLueRM +OFn5AgMBAAGjggNEMIIDQDAfBgNVHSMEGDAWgBRQ6nOJ2yn7EI+e5QEg1N55mUiD +9zAdBgNVHQ4EFgQUVhDDlYPPyDwTr1hy5uUZYYHEJyYwGQYDVR0RBBIwEIIOYXBp +LnN0cmlwZS5jb20wDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMB +BggrBgEFBQcDAjBhBgNVHR8EWjBYMCqgKKAmhiRodHRwOi8vY3JsMy5kaWdpY2Vy +dC5jb20vY2EzLWcyNC5jcmwwKqAooCaGJGh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNv +bS9jYTMtZzI0LmNybDCCAcQGA1UdIASCAbswggG3MIIBswYJYIZIAYb9bAEBMIIB +pDA6BggrBgEFBQcCARYuaHR0cDovL3d3dy5kaWdpY2VydC5jb20vc3NsLWNwcy1y +ZXBvc2l0b3J5Lmh0bTCCAWQGCCsGAQUFBwICMIIBVh6CAVIAQQBuAHkAIAB1AHMA +ZQAgAG8AZgAgAHQAaABpAHMAIABDAGUAcgB0AGkAZgBpAGMAYQB0AGUAIABjAG8A +bgBzAHQAaQB0AHUAdABlAHMAIABhAGMAYwBlAHAAdABhAG4AYwBlACAAbwBmACAA +dABoAGUAIABEAGkAZwBpAEMAZQByAHQAIABDAFAALwBDAFAAUwAgAGEAbgBkACAA +dABoAGUAIABSAGUAbAB5AGkAbgBnACAAUABhAHIAdAB5ACAAQQBnAHIAZQBlAG0A +ZQBuAHQAIAB3AGgAaQBjAGgAIABsAGkAbQBpAHQAIABsAGkAYQBiAGkAbABpAHQA +eQAgAGEAbgBkACAAYQByAGUAIABpAG4AYwBvAHIAcABvAHIAYQB0AGUAZAAgAGgA +ZQByAGUAaQBuACAAYgB5ACAAcgBlAGYAZQByAGUAbgBjAGUALjB7BggrBgEFBQcB +AQRvMG0wJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBFBggr +BgEFBQcwAoY5aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0SGln +aEFzc3VyYW5jZUNBLTMuY3J0MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQEFBQAD +ggEBAKPiwJIeR52VOjhPew9cx19nmkHXDxxPzcOmSsF3gk9jogXh61yA6DevcTBY +KTNUhkTRWujOUdwZqNuvaLCLwn/TEGV9hM4lOKah8yqCQB8PhT7baMiL7mltAhEE +SBs2soRGVXHr3AczRKLW3G+IbIpUc3vilOul/PXWHutfzz7/asxXSTk/siVKROQ8 +/KWrujG6wopwEEGExhlYOYBuXObwoSCV2nqIgr92fpHGvbMIFKSICoT7RCm8EVcb +3PGuaL8B8TZVbTOPYoJHdPzeRxL8Rbg8sDogHR+jkqwwyhUCfuzVbOjWFJU1DKvr +CBoD8xKYd5r7CYf1Du+nNMmDmrE= +-----END CERTIFICATE-----'; + // }}} + $this->assertTrue(Stripe_APIRequestor::isBlackListed($cert)); + } +} diff --git a/vendor/stripe/stripe-php/test/Stripe/ApplicationFeeRefundTest.php b/vendor/stripe/stripe-php/test/Stripe/ApplicationFeeRefundTest.php new file mode 100644 index 0000000..2e0a12f --- /dev/null +++ b/vendor/stripe/stripe-php/test/Stripe/ApplicationFeeRefundTest.php @@ -0,0 +1,16 @@ +id = 'refund_id'; + $refund->fee = 'fee_id'; + + $this->assertEqual( + $refund->instanceUrl(), + '/v1/application_fees/fee_id/refunds/refund_id' + ); + } +} diff --git a/vendor/stripe/stripe-php/test/Stripe/ApplicationFeeTest.php b/vendor/stripe/stripe-php/test/Stripe/ApplicationFeeTest.php new file mode 100644 index 0000000..8753509 --- /dev/null +++ b/vendor/stripe/stripe-php/test/Stripe/ApplicationFeeTest.php @@ -0,0 +1,19 @@ +assertEqual( + $applicationFee->instanceUrl(), '/v1/application_fees/abcd%2Fefgh' + ); + } + + public function testList() + { + self::authorizeFromEnv(); + $d = Stripe_ApplicationFee::all(); + $this->assertEqual($d->url, '/v1/application_fees'); + } +} diff --git a/vendor/stripe/stripe-php/test/Stripe/AuthenticationErrorTest.php b/vendor/stripe/stripe-php/test/Stripe/AuthenticationErrorTest.php new file mode 100644 index 0000000..2368d8e --- /dev/null +++ b/vendor/stripe/stripe-php/test/Stripe/AuthenticationErrorTest.php @@ -0,0 +1,14 @@ +assertEqual(401, $e->getHttpStatus()); + } + } +} diff --git a/vendor/stripe/stripe-php/test/Stripe/BalanceTest.php b/vendor/stripe/stripe-php/test/Stripe/BalanceTest.php new file mode 100644 index 0000000..23bbcc4 --- /dev/null +++ b/vendor/stripe/stripe-php/test/Stripe/BalanceTest.php @@ -0,0 +1,13 @@ +assertEqual($d->object, "balance"); + $this->assertTrue(Stripe_Util::isList($d->available)); + $this->assertTrue(Stripe_Util::isList($d->pending)); + } +} diff --git a/vendor/stripe/stripe-php/test/Stripe/BalanceTransactionTest.php b/vendor/stripe/stripe-php/test/Stripe/BalanceTransactionTest.php new file mode 100644 index 0000000..e1c3df2 --- /dev/null +++ b/vendor/stripe/stripe-php/test/Stripe/BalanceTransactionTest.php @@ -0,0 +1,11 @@ +assertEqual($d->url, '/v1/balance/history'); + } +} diff --git a/vendor/stripe/stripe-php/test/Stripe/BitcoinReceiverTest.php b/vendor/stripe/stripe-php/test/Stripe/BitcoinReceiverTest.php new file mode 100644 index 0000000..2846a54 --- /dev/null +++ b/vendor/stripe/stripe-php/test/Stripe/BitcoinReceiverTest.php @@ -0,0 +1,56 @@ +assertEqual($classUrl, '/v1/bitcoin/receivers'); + $receiver = new Stripe_BitcoinReceiver('abcd/efgh'); + $instanceUrl = $receiver->instanceUrl(); + $this->assertEqual($instanceUrl, '/v1/bitcoin/receivers/abcd%2Fefgh'); + } + + public function testCreate() + { + self::authorizeFromEnv(); + + $receiver = $this->createTestBitcoinReceiver("do+fill_now@stripe.com"); + + $this->assertEqual(100, $receiver->amount); + $this->assertNotNull($receiver->id); + } + + public function testRetrieve() + { + self::authorizeFromEnv(); + + $receiver = $this->createTestBitcoinReceiver("do+fill_now@stripe.com"); + + $r = Stripe_BitcoinReceiver::retrieve($receiver->id); + $this->assertEqual($receiver->id, $r->id); + + $this->assertIsA($r->transactions->data[0], 'Stripe_BitcoinTransaction'); + } + + public function testList() + { + self::authorizeFromEnv(); + + $receiver = $this->createTestBitcoinReceiver("do+fill_now@stripe.com"); + + $receivers = Stripe_BitcoinReceiver::all(); + $this->assertTrue(count($receivers->data) > 0); + } + + public function testListTransactions() + { + self::authorizeFromEnv(); + + $receiver = $this->createTestBitcoinReceiver("do+fill_now@stripe.com"); + $this->assertEqual(0, count($receiver->transactions->data)); + + $transactions = $receiver->transactions->all(array("limit" => 1)); + $this->assertEqual(1, count($transactions->data)); + } +} diff --git a/vendor/stripe/stripe-php/test/Stripe/CardErrorTest.php b/vendor/stripe/stripe-php/test/Stripe/CardErrorTest.php new file mode 100644 index 0000000..9140620 --- /dev/null +++ b/vendor/stripe/stripe-php/test/Stripe/CardErrorTest.php @@ -0,0 +1,29 @@ + '4000000000000002', + 'exp_month' => '3', + 'exp_year' => '2020' + ); + + $charge = array( + 'amount' => 100, + 'currency' => 'usd', + 'card' => $card + ); + + try { + Stripe_Charge::create($charge); + } catch (Stripe_CardError $e) { + $this->assertEqual(402, $e->getHttpStatus()); + $body = $e->getJsonBody(); + $this->assertTrue($body['error']); + } + } +} diff --git a/vendor/stripe/stripe-php/test/Stripe/ChargeTest.php b/vendor/stripe/stripe-php/test/Stripe/ChargeTest.php new file mode 100644 index 0000000..4b48118 --- /dev/null +++ b/vendor/stripe/stripe-php/test/Stripe/ChargeTest.php @@ -0,0 +1,200 @@ +assertEqual(Stripe_Charge::classUrl('Stripe_Charge'), '/v1/charges'); + $charge = new Stripe_Charge('abcd/efgh'); + $this->assertEqual($charge->instanceUrl(), '/v1/charges/abcd%2Fefgh'); + } + + public function testCreate() + { + self::authorizeFromEnv(); + + $card = array( + 'number' => '4242424242424242', + 'exp_month' => 5, + 'exp_year' => 2015 + ); + + $c = Stripe_Charge::create( + array( + 'amount' => 100, + 'currency' => 'usd', + 'card' => $card + ) + ); + $this->assertTrue($c->paid); + $this->assertFalse($c->refunded); + } + + public function testIdempotentCreate() + { + self::authorizeFromEnv(); + + $card = array( + 'number' => '4242424242424242', + 'exp_month' => 5, + 'exp_year' => 2015 + ); + + $c = Stripe_Charge::create( + array( + 'amount' => 100, + 'currency' => 'usd', + 'card' => $card + ), + array( + 'idempotency_key' => $this->generateRandomString(), + ) + ); + + $this->assertTrue($c->paid); + $this->assertFalse($c->refunded); + } + + + public function testRetrieve() + { + self::authorizeFromEnv(); + + $card = array( + 'number' => '4242424242424242', + 'exp_month' => 5, + 'exp_year' => 2015 + ); + + $c = Stripe_Charge::create( + array( + 'amount' => 100, + 'currency' => 'usd', + 'card' => $card + ) + ); + $d = Stripe_Charge::retrieve($c->id); + $this->assertEqual($d->id, $c->id); + } + + public function testUpdateMetadata() + { + self::authorizeFromEnv(); + + $card = array( + 'number' => '4242424242424242', + 'exp_month' => 5, + 'exp_year' => 2015 + ); + + $charge = Stripe_Charge::create( + array( + 'amount' => 100, + 'currency' => 'usd', + 'card' => $card + ) + ); + + $charge->metadata['test'] = 'foo bar'; + $charge->save(); + + $updatedCharge = Stripe_Charge::retrieve($charge->id); + $this->assertEqual('foo bar', $updatedCharge->metadata['test']); + } + + public function testUpdateMetadataAll() + { + self::authorizeFromEnv(); + + $card = array( + 'number' => '4242424242424242', + 'exp_month' => 5, + 'exp_year' => 2015 + ); + + $charge = Stripe_Charge::create( + array( + 'amount' => 100, + 'currency' => 'usd', + 'card' => $card + ) + ); + + $charge->metadata = array('test' => 'foo bar'); + $charge->save(); + + $updatedCharge = Stripe_Charge::retrieve($charge->id); + $this->assertEqual('foo bar', $updatedCharge->metadata['test']); + } + + public function testMarkAsFraudulent() + { + self::authorizeFromEnv(); + + $card = array( + 'number' => '4242424242424242', + 'exp_month' => 5, + 'exp_year' => 2015 + ); + + $charge = Stripe_Charge::create( + array( + 'amount' => 100, + 'currency' => 'usd', + 'card' => $card + ) + ); + + $charge->refunds->create(); + $charge->markAsFraudulent(); + + $updatedCharge = Stripe_Charge::retrieve($charge->id); + $this->assertEqual( + 'fraudulent', $updatedCharge['fraud_details']['user_report'] + ); + } + + public function testCreateWithBitcoinReceiverSource() + { + self::authorizeFromEnv(); + + $receiver = $this->createTestBitcoinReceiver("do+fill_now@stripe.com"); + + $charge = Stripe_Charge::create( + array( + 'amount' => 100, + 'currency' => 'usd', + 'source' => $receiver->id + ) + ); + + $this->assertEqual($receiver->id, $charge->source->id); + $this->assertEqual("bitcoin_receiver", $charge->source->object); + $this->assertEqual("paid", $charge->status); + $this->assertTrue(get_class($charge->source) == 'Stripe_BitcoinReceiver'); + } + + public function markAsSafe() + { + self::authorizeFromEnv(); + + $card = array( + 'number' => '4242424242424242', + 'exp_month' => 5, + 'exp_year' => 2015 + ); + + $charge = Stripe_Charge::create( + array( + 'amount' => 100, + 'currency' => 'usd', + 'card' => $card + ) + ); + + $charge->markAsSafe(); + + $updatedCharge = Stripe_Charge::retrieve($charge->id); + $this->assertEqual('safe', $updatedCharge['fraud_details']['user_report']); + } +} diff --git a/vendor/stripe/stripe-php/test/Stripe/CouponTest.php b/vendor/stripe/stripe-php/test/Stripe/CouponTest.php new file mode 100644 index 0000000..d7e124c --- /dev/null +++ b/vendor/stripe/stripe-php/test/Stripe/CouponTest.php @@ -0,0 +1,27 @@ + 25, + 'duration' => 'repeating', + 'duration_in_months' => 5, + 'id' => $id, + ) + ); + $this->assertEqual($id, $c->id); + // @codingStandardsIgnoreStart + $this->assertEqual(25, $c->percent_off); + // @codingStandardsIgnoreEnd + $c->metadata['foo'] = 'bar'; + $c->save(); + + $stripeCoupon = Stripe_Coupon::retrieve($id); + $this->assertEqual($c->metadata, $stripeCoupon->metadata); + } +} diff --git a/vendor/stripe/stripe-php/test/Stripe/CustomerTest.php b/vendor/stripe/stripe-php/test/Stripe/CustomerTest.php new file mode 100644 index 0000000..d747624 --- /dev/null +++ b/vendor/stripe/stripe-php/test/Stripe/CustomerTest.php @@ -0,0 +1,211 @@ +delete(); + + $this->assertTrue($customer->deleted); + $this->assertNull($customer['active_card']); + } + + public function testSave() + { + $customer = self::createTestCustomer(); + + $customer->email = 'gdb@stripe.com'; + $customer->save(); + $this->assertEqual($customer->email, 'gdb@stripe.com'); + + $stripeCustomer = Stripe_Customer::retrieve($customer->id); + $this->assertEqual($customer->email, $stripeCustomer->email); + + + Stripe::setApiKey(null); + $customer = Stripe_Customer::create(null, StripeTestCase::API_KEY); + $customer->email = 'gdb@stripe.com'; + $customer->save(); + + StripeTestCase::authorizeFromEnv(); + $updatedCustomer = Stripe_Customer::retrieve($customer->id); + $this->assertEqual($updatedCustomer->email, 'gdb@stripe.com'); + } + + public function testBogusAttribute() + { + $customer = self::createTestCustomer(); + $customer->bogus = 'bogus'; + $this->expectException(new IsAExpectation('Stripe_InvalidRequestError')); + $customer->save(); + } + + public function testUpdateDescriptionEmpty() + { + $customer = self::createTestCustomer(); + + $this->expectException(new IsAExpectation('InvalidArgumentException')); + + $customer->description = ''; + } + + public function testUpdateDescriptionNull() + { + $customer = self::createTestCustomer(array('description' => 'foo bar')); + $customer->description = NULL; + + $customer->save(); + + $updatedCustomer = Stripe_Customer::retrieve($customer->id); + $this->assertEqual(NULL, $updatedCustomer->description); + } + + public function testUpdateMetadata() + { + $customer = self::createTestCustomer(); + + $customer->metadata['test'] = 'foo bar'; + $customer->save(); + + $updatedCustomer = Stripe_Customer::retrieve($customer->id); + $this->assertEqual('foo bar', $updatedCustomer->metadata['test']); + } + + public function testDeleteMetadata() + { + $customer = self::createTestCustomer(); + + $customer->metadata = NULL; + $customer->save(); + + $updatedCustomer = Stripe_Customer::retrieve($customer->id); + $this->assertEqual(0, count($updatedCustomer->metadata->keys())); + } + + public function testUpdateSomeMetadata() + { + $customer = self::createTestCustomer(); + $customer->metadata['shoe size'] = '7'; + $customer->metadata['shirt size'] = 'XS'; + $customer->save(); + + $customer->metadata['shoe size'] = '9'; + $customer->save(); + + $updatedCustomer = Stripe_Customer::retrieve($customer->id); + $this->assertEqual('XS', $updatedCustomer->metadata['shirt size']); + $this->assertEqual('9', $updatedCustomer->metadata['shoe size']); + } + + public function testUpdateAllMetadata() + { + $customer = self::createTestCustomer(); + $customer->metadata['shoe size'] = '7'; + $customer->metadata['shirt size'] = 'XS'; + $customer->save(); + + $customer->metadata = array('shirt size' => 'XL'); + $customer->save(); + + $updatedCustomer = Stripe_Customer::retrieve($customer->id); + $this->assertEqual('XL', $updatedCustomer->metadata['shirt size']); + $this->assertFalse(isset($updatedCustomer->metadata['shoe size'])); + } + + public function testUpdateInvalidMetadata() + { + $customer = self::createTestCustomer(); + + $this->expectException(new IsAExpectation('Stripe_InvalidRequestError')); + + $customer->metadata = 'something'; + $customer->save(); + } + + public function testCancelSubscription() + { + $planID = 'gold-' . self::randomString(); + self::retrieveOrCreatePlan($planID); + + $customer = self::createTestCustomer( + array( + 'plan' => $planID, + ) + ); + + $customer->cancelSubscription(array('at_period_end' => true)); + $this->assertEqual($customer->subscription->status, 'active'); + $this->assertTrue($customer->subscription->cancel_at_period_end); + $customer->cancelSubscription(); + $this->assertEqual($customer->subscription->status, 'canceled'); + } + + public function testCustomerAddCard() + { + $token = Stripe_Token::create( + array("card" => array( + "number" => "4242424242424242", + "exp_month" => 5, + "exp_year" => date('Y') + 3, + "cvc" => "314" + )) + ); + + $customer = $this->createTestCustomer(); + $createdCard = $customer->cards->create(array("card" => $token->id)); + $customer->save(); + + $updatedCustomer = Stripe_Customer::retrieve($customer->id); + $updatedCards = $updatedCustomer->cards->all(); + $this->assertEqual(count($updatedCards["data"]), 2); + + } + + public function testCustomerUpdateCard() + { + $customer = $this->createTestCustomer(); + $customer->save(); + + $cards = $customer->cards->all(); + $this->assertEqual(count($cards["data"]), 1); + + $card = $cards['data'][0]; + $card->name = "Jane Austen"; + $card->save(); + + $updatedCustomer = Stripe_Customer::retrieve($customer->id); + $updatedCards = $updatedCustomer->cards->all(); + $this->assertEqual($updatedCards["data"][0]->name, "Jane Austen"); + } + + public function testCustomerDeleteCard() + { + $token = Stripe_Token::create( + array("card" => array( + "number" => "4242424242424242", + "exp_month" => 5, + "exp_year" => date('Y') + 3, + "cvc" => "314" + )) + ); + + $customer = $this->createTestCustomer(); + $createdCard = $customer->cards->create(array("card" => $token->id)); + $customer->save(); + + $updatedCustomer = Stripe_Customer::retrieve($customer->id); + $updatedCards = $updatedCustomer->cards->all(); + $this->assertEqual(count($updatedCards["data"]), 2); + + $deleteStatus = + $updatedCustomer->cards->retrieve($createdCard->id)->delete(); + $this->assertEqual($deleteStatus->deleted, 1); + $updatedCustomer->save(); + + $postDeleteCustomer = Stripe_Customer::retrieve($customer->id); + $postDeleteCards = $postDeleteCustomer->cards->all(); + $this->assertEqual(count($postDeleteCards["data"]), 1); + } + +} diff --git a/vendor/stripe/stripe-php/test/Stripe/DiscountTest.php b/vendor/stripe/stripe-php/test/Stripe/DiscountTest.php new file mode 100644 index 0000000..69b87ba --- /dev/null +++ b/vendor/stripe/stripe-php/test/Stripe/DiscountTest.php @@ -0,0 +1,29 @@ + 25, + 'duration' => 'repeating', + 'duration_in_months' => 5, + 'id' => $id, + ) + ); + $customer = self::createTestCustomer(array('coupon' => $id)); + + $this->assertTrue(isset($customer->discount)); + $this->assertTrue(isset($customer->discount->coupon)); + $this->assertEqual($id, $customer->discount->coupon->id); + + $customer->deleteDiscount(); + $this->assertFalse(isset($customer->discount)); + + $customer = Stripe_Customer::retrieve($customer->id); + $this->assertFalse(isset($customer->discount)); + } +} \ No newline at end of file diff --git a/vendor/stripe/stripe-php/test/Stripe/Error.php b/vendor/stripe/stripe-php/test/Stripe/Error.php new file mode 100644 index 0000000..34d63d8 --- /dev/null +++ b/vendor/stripe/stripe-php/test/Stripe/Error.php @@ -0,0 +1,22 @@ + 'bar') + ); + $this->fail("Did not raise error"); + } catch (Stripe_Error $e) { + $this->assertEqual("hello", $e->getMessage()); + $this->assertEqual(500, $e->getHttpStatus()); + $this->assertEqual("{'foo':'bar'}", $e->getHttpBody()); + $this->assertEqual(array('foo' => 'bar'), $e->getJsonBody()); + } + } +} diff --git a/vendor/stripe/stripe-php/test/Stripe/FileUploadTest.php b/vendor/stripe/stripe-php/test/Stripe/FileUploadTest.php new file mode 100644 index 0000000..adb143a --- /dev/null +++ b/vendor/stripe/stripe-php/test/Stripe/FileUploadTest.php @@ -0,0 +1,38 @@ + 'dispute_evidence', + 'file' => $fp, + ) + ); + fclose($fp); + $this->assertEqual(95, $file->size); + $this->assertEqual('image/png', $file->mimetype); + } + + public function testCreateCurlFile() + { + if (!class_exists('CurlFile')) { + // Older PHP versions don't support this + return; + } + + $file = new CurlFile(dirname(__FILE__).'/../data/test.png'); + self::authorizeFromEnv(); + $file = Stripe_FileUpload::create( + array( + 'purpose' => 'dispute_evidence', + 'file' => $file, + ) + ); + $this->assertEqual(95, $file->size); + $this->assertEqual('image/png', $file->mimetype); + } +} diff --git a/vendor/stripe/stripe-php/test/Stripe/InvalidRequestErrorTest.php b/vendor/stripe/stripe-php/test/Stripe/InvalidRequestErrorTest.php new file mode 100644 index 0000000..9eddc34 --- /dev/null +++ b/vendor/stripe/stripe-php/test/Stripe/InvalidRequestErrorTest.php @@ -0,0 +1,24 @@ +assertEqual(404, $e->getHttpStatus()); + } + } + + public function testBadData() + { + self::authorizeFromEnv(); + try { + Stripe_Charge::create(); + } catch (Stripe_InvalidRequestError $e) { + $this->assertEqual(400, $e->getHttpStatus()); + } + } +} diff --git a/vendor/stripe/stripe-php/test/Stripe/InvoiceTest.php b/vendor/stripe/stripe-php/test/Stripe/InvoiceTest.php new file mode 100644 index 0000000..490605d --- /dev/null +++ b/vendor/stripe/stripe-php/test/Stripe/InvoiceTest.php @@ -0,0 +1,65 @@ + $customer->id, + 'amount' => 0, + 'currency' => 'usd', + ) + ); + + $invoice = Stripe_Invoice::upcoming( + array( + 'customer' => $customer->id, + ) + ); + $this->assertEqual($invoice->customer, $customer->id); + $this->assertEqual($invoice->attempted, false); + } + + public function testItemsAccessWithParameter() + { + self::authorizeFromEnv(); + $customer = self::createTestCustomer(); + + Stripe_InvoiceItem::create( + array( + 'customer' => $customer->id, + 'amount' => 100, + 'currency' => 'usd', + ) + ); + + $invoice = Stripe_Invoice::upcoming( + array( + 'customer' => $customer->id, + ) + ); + + $lines = $invoice->lines->all( + array( + 'limit' => 10, + ) + ); + + $this->assertEqual(count($lines->data), 1); + $this->assertEqual($lines->data[0]->amount, 100); + } + + // This is really just making sure that this operation does not trigger any + // warnings, as it's highly nested. + public function testAll() + { + self::authorizeFromEnv(); + $invoices = Stripe_Invoice::all(); + $this->assertTrue(count($invoices) > 0); + } + +} diff --git a/vendor/stripe/stripe-php/test/Stripe/ObjectTest.php b/vendor/stripe/stripe-php/test/Stripe/ObjectTest.php new file mode 100644 index 0000000..929edcb --- /dev/null +++ b/vendor/stripe/stripe-php/test/Stripe/ObjectTest.php @@ -0,0 +1,41 @@ +assertEqual($s['foo'], 'a'); + $this->assertTrue(isset($s['foo'])); + unset($s['foo']); + $this->assertFalse(isset($s['foo'])); + } + + public function testNormalAccessorsSemantics() + { + $s = new Stripe_Object(); + $s->foo = 'a'; + $this->assertEqual($s->foo, 'a'); + $this->assertTrue(isset($s->foo)); + unset($s->foo); + $this->assertFalse(isset($s->foo)); + } + + public function testArrayAccessorsMatchNormalAccessors() + { + $s = new Stripe_Object(); + $s->foo = 'a'; + $this->assertEqual($s['foo'], 'a'); + + $s['bar'] = 'b'; + $this->assertEqual($s->bar, 'b'); + } + + public function testKeys() + { + $s = new Stripe_Object(); + $s->foo = 'a'; + $this->assertEqual($s->keys(), array('foo')); + } +} diff --git a/vendor/stripe/stripe-php/test/Stripe/PlanTest.php b/vendor/stripe/stripe-php/test/Stripe/PlanTest.php new file mode 100644 index 0000000..0df0551 --- /dev/null +++ b/vendor/stripe/stripe-php/test/Stripe/PlanTest.php @@ -0,0 +1,53 @@ + 2000, + 'interval' => 'month', + 'currency' => 'usd', + 'name' => 'Plan', + 'id' => 'gold-' . self::randomString() + ) + ); + $p->delete(); + $this->assertTrue($p->deleted); + } + + public function testFalseyId() + { + try { + $retrievedPlan = Stripe_Plan::retrieve('0'); + } catch (Stripe_InvalidRequestError $e) { + // Can either succeed or 404, all other errors are bad + if ($e->httpStatus !== 404) { + $this->fail(); + } + } + } + + public function testSave() + { + self::authorizeFromEnv(); + $planID = 'gold-' . self::randomString(); + $p = Stripe_Plan::create( + array( + 'amount' => 2000, + 'interval' => 'month', + 'currency' => 'usd', + 'name' => 'Plan', + 'id' => $planID + ) + ); + $p->name = 'A new plan name'; + $p->save(); + $this->assertEqual($p->name, 'A new plan name'); + + $stripePlan = Stripe_Plan::retrieve($planID); + $this->assertEqual($p->name, $stripePlan->name); + } +} diff --git a/vendor/stripe/stripe-php/test/Stripe/RecipientTest.php b/vendor/stripe/stripe-php/test/Stripe/RecipientTest.php new file mode 100644 index 0000000..e6ff1c1 --- /dev/null +++ b/vendor/stripe/stripe-php/test/Stripe/RecipientTest.php @@ -0,0 +1,116 @@ +delete(); + + $this->assertTrue($recipient->deleted); + } + + public function testSave() + { + $recipient = self::createTestRecipient(); + + $recipient->email = 'gdb@stripe.com'; + $recipient->save(); + $this->assertEqual($recipient->email, 'gdb@stripe.com'); + + $stripeRecipient = Stripe_Recipient::retrieve($recipient->id); + $this->assertEqual($recipient->email, $stripeRecipient->email); + } + + public function testBogusAttribute() + { + $recipient = self::createTestRecipient(); + $recipient->bogus = 'bogus'; + + $caught = null; + try { + $recipient->save(); + } catch (Stripe_InvalidRequestError $exception) { + $caught = $exception; + } + + $this->assertTrue($caught instanceof Stripe_InvalidRequestError); + } + + public function testRecipientAddCard() + { + $token = Stripe_Token::create( + array("card" => array( + "number" => "4000056655665556", + "exp_month" => 5, + "exp_year" => date('Y') + 3, + "cvc" => "314" + )) + ); + + $recipient = $this->createTestRecipient(); + $createdCard = $recipient->cards->create(array("card" => $token->id)); + $recipient->save(); + + $updatedRecipient = Stripe_Recipient::retrieve($recipient->id); + $updatedCards = $updatedRecipient->cards->all(); + $this->assertEqual(count($updatedCards["data"]), 1); + + } + + public function testRecipientUpdateCard() + { + $token = Stripe_Token::create( + array("card" => array( + "number" => "4000056655665556", + "exp_month" => 5, + "exp_year" => date('Y') + 3, + "cvc" => "314" + )) + ); + + $recipient = $this->createTestRecipient(); + $createdCard = $recipient->cards->create(array("card" => $token->id)); + $recipient->save(); + + $createdCards = $recipient->cards->all(); + $this->assertEqual(count($createdCards["data"]), 1); + + $card = $createdCards['data'][0]; + $card->name = "Jane Austen"; + $card->save(); + + $updatedRecipient = Stripe_Recipient::retrieve($recipient->id); + $updatedCards = $updatedRecipient->cards->all(); + $this->assertEqual($updatedCards["data"][0]->name, "Jane Austen"); + } + + public function testRecipientDeleteCard() + { + $token = Stripe_Token::create( + array("card" => array( + "number" => "4000056655665556", + "exp_month" => 5, + "exp_year" => date('Y') + 3, + "cvc" => "314" + )) + ); + + $recipient = $this->createTestRecipient(); + $createdCard = $recipient->cards->create(array("card" => $token->id)); + $recipient->save(); + + $updatedRecipient = Stripe_Recipient::retrieve($recipient->id); + $updatedCards = $updatedRecipient->cards->all(); + $this->assertEqual(count($updatedCards["data"]), 1); + + $deleteStatus = + $updatedRecipient->cards->retrieve($createdCard->id)->delete(); + $this->assertEqual($deleteStatus->deleted, 1); + $updatedRecipient->save(); + + $postDeleteRecipient = Stripe_Recipient::retrieve($recipient->id); + $postDeleteCards = $postDeleteRecipient->cards->all(); + $this->assertEqual(count($postDeleteCards["data"]), 0); + } +} diff --git a/vendor/stripe/stripe-php/test/Stripe/RefundTest.php b/vendor/stripe/stripe-php/test/Stripe/RefundTest.php new file mode 100644 index 0000000..e9dcbb0 --- /dev/null +++ b/vendor/stripe/stripe-php/test/Stripe/RefundTest.php @@ -0,0 +1,61 @@ +refunds->create(array('amount' => 100)); + $this->assertEqual(100, $ref->amount); + $this->assertEqual($charge->id, $ref->charge); + } + + public function testUpdateAndRetrieve() + { + $charge = self::createTestCharge(); + $ref = $charge->refunds->create(array('amount' => 100)); + $ref->metadata["key"] = "value"; + $ref->save(); + $ref = $charge->refunds->retrieve($ref->id); + $this->assertEqual("value", $ref->metadata["key"], "value"); + } + + public function testList() + { + $charge = self::createTestCharge(); + $refA = $charge->refunds->create(array('amount' => 50)); + $refB = $charge->refunds->create(array('amount' => 50)); + + $all = $charge->refunds->all(); + $this->assertEqual(false, $all['has_more']); + $this->assertEqual(2, count($all->data)); + $this->assertEqual($refB->id, $all->data[0]->id); + $this->assertEqual($refA->id, $all->data[1]->id); + } + + public function testCreateForBitcoin() + { + self::authorizeFromEnv(); + + $receiver = $this->createTestBitcoinReceiver("do+fill_now@stripe.com"); + + $charge = Stripe_Charge::create( + array( + "amount" => $receiver->amount, + "currency" => $receiver->currency, + "description" => $receiver->description, + 'source' => $receiver->id + ) + ); + + $ref = $charge->refunds->create( + array( + 'amount' => $receiver->amount, + 'refund_address' => 'ABCDEF' + ) + ); + $this->assertEqual($receiver->amount, $ref->amount); + $this->assertNotNull($ref->id); + } +} diff --git a/vendor/stripe/stripe-php/test/Stripe/RequestOptionsTest.php b/vendor/stripe/stripe-php/test/Stripe/RequestOptionsTest.php new file mode 100644 index 0000000..3f1ec1f --- /dev/null +++ b/vendor/stripe/stripe-php/test/Stripe/RequestOptionsTest.php @@ -0,0 +1,70 @@ +assertEqual("foo", $opts->apiKey); + $this->assertEqual(array(), $opts->headers); + } + + public function testNull() + { + $opts = Stripe_RequestOptions::parse(null); + $this->assertEqual(null, $opts->apiKey); + $this->assertEqual(array(), $opts->headers); + } + + public function testEmptyArray() + { + $opts = Stripe_RequestOptions::parse(array()); + $this->assertEqual(null, $opts->apiKey); + $this->assertEqual(array(), $opts->headers); + } + + public function testAPIKeyArray() + { + $opts = Stripe_RequestOptions::parse( + array( + 'api_key' => 'foo', + ) + ); + $this->assertEqual('foo', $opts->apiKey); + $this->assertEqual(array(), $opts->headers); + } + + public function testIdempotentKeyArray() + { + $opts = Stripe_RequestOptions::parse( + array( + 'idempotency_key' => 'foo', + ) + ); + $this->assertEqual(null, $opts->apiKey); + $this->assertEqual(array('Idempotency-Key' => 'foo'), $opts->headers); + } + + public function testKeyArray() + { + $opts = Stripe_RequestOptions::parse( + array( + 'idempotency_key' => 'foo', + 'api_key' => 'foo' + ) + ); + $this->assertEqual('foo', $opts->apiKey); + $this->assertEqual(array('Idempotency-Key' => 'foo'), $opts->headers); + } + + public function testWrongType() + { + $caught = false; + try { + $opts = Stripe_RequestOptions::parse(5); + } catch (Stripe_Error $e) { + $caught = true; + } + $this->assertTrue($caught); + } +} diff --git a/vendor/stripe/stripe-php/test/Stripe/SubscriptionTest.php b/vendor/stripe/stripe-php/test/Stripe/SubscriptionTest.php new file mode 100644 index 0000000..73a780a --- /dev/null +++ b/vendor/stripe/stripe-php/test/Stripe/SubscriptionTest.php @@ -0,0 +1,60 @@ +subscriptions->create(array('plan' => $planID)); + + $this->assertEqual($sub->status, 'active'); + $this->assertEqual($sub->plan->id, $planID); + + $sub->quantity = 2; + $sub->save(); + + $sub = $customer->subscriptions->retrieve($sub->id); + $this->assertEqual($sub->status, 'active'); + $this->assertEqual($sub->plan->id, $planID); + $this->assertEqual($sub->quantity, 2); + + $sub->cancel(array('at_period_end' => true)); + + $sub = $customer->subscriptions->retrieve($sub->id); + $this->assertEqual($sub->status, 'active'); + // @codingStandardsIgnoreStart + $this->assertTrue($sub->cancel_at_period_end); + // @codingStandardsIgnoreEnd + } + + public function testDeleteDiscount() + { + $planID = 'gold-' . self::randomString(); + self::retrieveOrCreatePlan($planID); + + $couponID = '25off-' . self::randomString(); + self::retrieveOrCreateCoupon($couponID); + + $customer = self::createTestCustomer(); + + $sub = $customer->subscriptions->create( + array( + 'plan' => $planID, + 'coupon' => $couponID + ) + ); + + $this->assertEqual($sub->status, 'active'); + $this->assertEqual($sub->plan->id, $planID); + $this->assertEqual($sub->discount->coupon->id, $couponID); + + $sub->deleteDiscount(); + $sub = $customer->subscriptions->retrieve($sub->id); + $this->assertNull($sub->discount); + } +} diff --git a/vendor/stripe/stripe-php/test/Stripe/TestCase.php b/vendor/stripe/stripe-php/test/Stripe/TestCase.php new file mode 100644 index 0000000..5c2f77e --- /dev/null +++ b/vendor/stripe/stripe-php/test/Stripe/TestCase.php @@ -0,0 +1,165 @@ + 2000, + "currency" => "usd", + "description" => "Charge for test@example.com", + 'card' => array( + 'number' => '4242424242424242', + 'exp_month' => 5, + 'exp_year' => date('Y') + 3, + ), + ) + ); + } + + + /** + * Create a valid test customer. + */ + protected static function createTestCustomer(array $attributes = array()) + { + self::authorizeFromEnv(); + + return Stripe_Customer::create( + $attributes + array( + 'card' => array( + 'number' => '4242424242424242', + 'exp_month' => 5, + 'exp_year' => date('Y') + 3, + ), + ) + ); + } + + /** + * Create a valid test recipient + */ + protected static function createTestRecipient(array $attributes = array()) + { + self::authorizeFromEnv(); + + return Stripe_Recipient::create( + $attributes + array( + 'name' => 'PHP Test', + 'type' => 'individual', + 'tax_id' => '000000000', + 'bank_account' => array( + 'country' => 'US', + 'routing_number' => '110000000', + 'account_number' => '000123456789' + ), + ) + ); + } + + /** + * Generate a random 8-character string. Useful for ensuring + * multiple test suite runs don't conflict + */ + protected static function randomString() + { + $chars = "abcdefghijklmnopqrstuvwxyz"; + $str = ""; + for ($i = 0; $i < 10; $i++) { + $str .= $chars[rand(0, strlen($chars)-1)]; + } + return $str; + } + + /** + * Verify that a plan with a given ID exists, or create a new one if it does + * not. + */ + protected static function retrieveOrCreatePlan($id) + { + self::authorizeFromEnv(); + + try { + $plan = Stripe_Plan::retrieve($id); + } catch (Stripe_InvalidRequestError $exception) { + $plan = Stripe_Plan::create( + array( + 'id' => $id, + 'amount' => 0, + 'currency' => 'usd', + 'interval' => 'month', + 'name' => 'Gold Test Plan', + ) + ); + } + } + + /** + * Verify that a coupon with a given ID exists, or create a new one if it does + * not. + */ + protected static function retrieveOrCreateCoupon($id) + { + self::authorizeFromEnv(); + + try { + $coupon = Stripe_Coupon::retrieve($id); + } catch (Stripe_InvalidRequestError $exception) { + $coupon = Stripe_Coupon::create( + array( + 'id' => $id, + 'duration' => 'forever', + 'percent_off' => 25, + ) + ); + } + } + + /** + * Genereate a semi-random string + */ + public function generateRandomString($length = 24) + { + $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTU'; + $charactersLength = strlen($characters); + $randomString = ''; + for ($i = 0; $i < $length; $i++) { + $randomString .= $characters[rand(0, $charactersLength - 1)]; + } + return $randomString; + } + + protected static function createTestBitcoinReceiver($email) + { + $receiver = Stripe_BitcoinReceiver::create( + array( + 'amount' => 100, + 'currency' => 'usd', + 'description' => 'some details', + 'email' => $email + ) + ); + return $receiver; + } +} diff --git a/vendor/stripe/stripe-php/test/Stripe/Token.php b/vendor/stripe/stripe-php/test/Stripe/Token.php new file mode 100644 index 0000000..342c30a --- /dev/null +++ b/vendor/stripe/stripe-php/test/Stripe/Token.php @@ -0,0 +1,11 @@ +assertEqual(Stripe_Token::classUrl('Stripe_Token'), '/v1/tokens'); + $token = new Stripe_Token('abcd/efgh'); + $this->assertEqual($token->instanceUrl(), '/v1/tokens/abcd%2Fefgh'); + } +} \ No newline at end of file diff --git a/vendor/stripe/stripe-php/test/Stripe/TransferTest.php b/vendor/stripe/stripe-php/test/Stripe/TransferTest.php new file mode 100644 index 0000000..e34a1ce --- /dev/null +++ b/vendor/stripe/stripe-php/test/Stripe/TransferTest.php @@ -0,0 +1,116 @@ + 100, + 'currency' => 'usd', + 'recipient' => $recipient->id + ) + ); + $this->assertEqual('pending', $transfer->status); + } + + public function testRetrieve() + { + $recipient = self::createTestRecipient(); + + self::authorizeFromEnv(); + $transfer = Stripe_Transfer::create( + array( + 'amount' => 100, + 'currency' => 'usd', + 'recipient' => $recipient->id + ) + ); + $reloaded = Stripe_Transfer::retrieve($transfer->id); + $this->assertEqual($reloaded->id, $transfer->id); + } + + public function testCancel() + { + $this->expectException(new IsAExpectation('Stripe_InvalidRequestError')); + $recipient = self::createTestRecipient(); + + self::authorizeFromEnv(); + $transfer = Stripe_Transfer::create( + array( + 'amount' => 100, + 'currency' => 'usd', + 'recipient' => $recipient->id + ) + ); + $reloaded = Stripe_Transfer::retrieve($transfer->id); + $this->assertEqual($reloaded->id, $transfer->id); + + $reloaded->cancel(); + } + + public function testTransferUpdateMetadata() + { + $recipient = self::createTestRecipient(); + + self::authorizeFromEnv(); + $transfer = Stripe_Transfer::create( + array( + 'amount' => 100, + 'currency' => 'usd', + 'recipient' => $recipient->id + ) + ); + + $transfer->metadata['test'] = 'foo bar'; + $transfer->save(); + + $updatedTransfer = Stripe_Transfer::retrieve($transfer->id); + $this->assertEqual('foo bar', $updatedTransfer->metadata['test']); + } + + public function testTransferUpdateMetadataAll() + { + $recipient = self::createTestRecipient(); + + self::authorizeFromEnv(); + $transfer = Stripe_Transfer::create( + array( + 'amount' => 100, + 'currency' => 'usd', + 'recipient' => $recipient->id + ) + ); + + $transfer->metadata = array('test' => 'foo bar'); + $transfer->save(); + + $updatedTransfer = Stripe_Transfer::retrieve($transfer->id); + $this->assertEqual('foo bar', $updatedTransfer->metadata['test']); + } + + public function testRecipientUpdateMetadata() + { + $recipient = self::createTestRecipient(); + + $recipient->metadata['test'] = 'foo bar'; + $recipient->save(); + + $updatedRecipient = Stripe_Recipient::retrieve($recipient->id); + $this->assertEqual('foo bar', $updatedRecipient->metadata['test']); + } + + public function testRecipientUpdateMetadataAll() + { + $recipient = self::createTestRecipient(); + + $recipient->metadata = array('test' => 'foo bar'); + $recipient->save(); + + $updatedRecipient = Stripe_Recipient::retrieve($recipient->id); + $this->assertEqual('foo bar', $updatedRecipient->metadata['test']); + } +} diff --git a/vendor/stripe/stripe-php/test/Stripe/UtilTest.php b/vendor/stripe/stripe-php/test/Stripe/UtilTest.php new file mode 100644 index 0000000..32a0f41 --- /dev/null +++ b/vendor/stripe/stripe-php/test/Stripe/UtilTest.php @@ -0,0 +1,28 @@ +assertTrue(Stripe_Util::isList($list)); + + $notlist = array(5, 'nstaoush', array(), 'bar' => 'baz'); + $this->assertFalse(Stripe_Util::isList($notlist)); + } + + public function testThatPHPHasValueSemanticsForArrays() + { + $original = array('php-arrays' => 'value-semantics'); + $derived = $original; + $derived['php-arrays'] = 'reference-semantics'; + + $this->assertEqual('value-semantics', $original['php-arrays']); + } + + public function testConvertStripeObjectToArrayIncludesId() + { + $customer = self::createTestCustomer(); + $this->assertTrue(array_key_exists("id", $customer->__toArray(true))); + } +} diff --git a/vendor/stripe/stripe-php/test/data/test.png b/vendor/stripe/stripe-php/test/data/test.png new file mode 100644 index 0000000000000000000000000000000000000000..1914264c08781d1f30ee0b8482bccf44586f2dc1 GIT binary patch literal 95 zcmeAS@N?(olHy`uVBq!ia0vp^j3CU&3?x-=hn)ga%mF?ju0VQumF+E%TuG2$FoVOh l8)-lem#2$k2*>s01R$Gz9%CSj!PC{xWt~$(697H@6ZHT9 literal 0 HcmV?d00001 diff --git a/view-signed-contract.php b/view-signed-contract.php new file mode 100644 index 0000000..51c41ab --- /dev/null +++ b/view-signed-contract.php @@ -0,0 +1,53 @@ +prepare('SELECT cc.*, c.title, c.content FROM client_contracts cc JOIN contracts c ON cc.contract_id = c.id WHERE cc.id = ?'); +$stmt->execute([$client_contract_id]); +$contract = $stmt->fetch(); + +if (!$contract) { + die('Contract not found.'); +} + +if ($_SESSION['user_type'] === 'client' && $contract['client_id'] !== $_SESSION['user_id']) { + die('Access denied.'); +} + +if ($_SESSION['user_type'] === 'coach') { + // A coach can see any contract, for now. In a real app, you would check if the client belongs to the coach. +} + +?> + +
+
+
+

+

Signed on

+
+
+ + + +

The contract has not been signed yet.

+ +
+
+ Back +
+ + diff --git a/view-ticket.php b/view-ticket.php new file mode 100644 index 0000000..d681832 --- /dev/null +++ b/view-ticket.php @@ -0,0 +1,123 @@ +prepare('SELECT * FROM support_tickets WHERE id = ? AND client_id = ?'); +$stmt->execute([$ticket_id, $client_id]); +$ticket = $stmt->fetch(); + +if (!$ticket) { + // Ticket not found or doesn't belong to the client + header('Location: support.php'); + exit; +} + +// Handle new message submission +if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['reply_to_ticket'])) { + $message = trim($_POST['message']); + + if (!empty($message)) { + try { + $pdo->beginTransaction(); + + // Insert the new message + $stmt = $pdo->prepare('INSERT INTO support_ticket_messages (ticket_id, user_id, is_admin, message) VALUES (?, ?, ?, ?)'); + $stmt->execute([$ticket_id, $client_id, false, $message]); + + // Update the ticket's updated_at timestamp + $stmt = $pdo->prepare('UPDATE support_tickets SET updated_at = CURRENT_TIMESTAMP WHERE id = ?'); + $stmt->execute([$ticket_id]); + + $pdo->commit(); + $_SESSION['success_message'] = 'Your reply has been sent.'; + header('Location: view-ticket.php?id=' . $ticket_id); + exit; + } catch (Exception $e) { + $pdo->rollBack(); + $error_message = 'Failed to send reply. Please try again.'; + } + } +} + +// Fetch all messages for the ticket +$stmt = $pdo->prepare("SELECT m.*, c.name as client_name, co.name as coach_name FROM support_ticket_messages m LEFT JOIN clients c ON m.user_id = c.id AND m.is_admin = 0 LEFT JOIN coaches co ON m.user_id = co.id AND m.is_admin = 1 WHERE m.ticket_id = ? ORDER BY m.created_at ASC"); +$stmt->execute([$ticket_id]); +$messages = $stmt->fetchAll(); + +?> + +
+ Back to Tickets + +

+

Status:

+ + +
+ +
+ + + +
+ +
+ + +
+
Conversation
+
+ +
+ + + +

+
+
+ +
+
+ + +
+
Reply
+
+
+
+ +
+ +
+
+
+ +
This ticket is closed. You cannot add new replies.
+ + +
+ + diff --git a/view_survey.php b/view_survey.php new file mode 100644 index 0000000..92a86b0 --- /dev/null +++ b/view_survey.php @@ -0,0 +1,128 @@ +prepare('SELECT cs.*, s.title, s.description FROM client_surveys cs JOIN surveys s ON cs.survey_id = s.id WHERE cs.id = ? AND cs.client_id = ?'); +$stmt->execute([$client_survey_id, $client_id]); +$client_survey = $stmt->fetch(); + +if (!$client_survey) { + header('Location: surveys.php'); + exit; +} + +// Fetch survey questions +$questions_stmt = db()->prepare('SELECT * FROM survey_questions WHERE survey_id = ? ORDER BY id'); +$questions_stmt->execute([$client_survey['survey_id']]); +$questions = $questions_stmt->fetchAll(); + +// Handle submission +if ($_SERVER['REQUEST_METHOD'] === 'POST' && $client_survey['status'] === 'pending') { + foreach ($questions as $question) { + $response_value = $_POST['responses'][$question['id']] ?? ''; + if (is_array($response_value)) { + $response_value = implode(', ', $response_value); + } + + $stmt = db()->prepare('INSERT INTO survey_responses (client_survey_id, question_id, response) VALUES (?, ?, ?)'); + $stmt->execute([$client_survey_id, $question['id'], $response_value]); + } + + // Mark as completed + $stmt = db()->prepare('UPDATE client_surveys SET status = \'completed\', completed_at = NOW() WHERE id = ?'); + $stmt->execute([$client_survey_id]); + + header('Location: surveys.php'); + exit; +} + +// If already completed, fetch responses +$responses = []; +if ($client_survey['status'] === 'completed') { + $responses_stmt = db()->prepare('SELECT question_id, response FROM survey_responses WHERE client_survey_id = ?'); + $responses_stmt->execute([$client_survey_id]); + $responses_data = $responses_stmt->fetchAll(); + foreach ($responses_data as $response) { + $responses[$response['question_id']] = $response['response']; + } +} +?> + +
+

+

+ + +
You have already completed this survey.
+ + +
+ $question): + ?> +
+
+
+ + '; + break; + case 'textarea': + echo ''; + break; + case 'select': + case 'radio': + case 'checkbox': + $options_stmt = db()->prepare('SELECT * FROM survey_question_options WHERE question_id = ?'); + $options_stmt->execute([$question['id']]); + $options = $options_stmt->fetchAll(); + + if ($question['type'] === 'select') { + echo ''; + } else { + $response_array = explode(', ', $response_value); + foreach ($options as $option) { + $checked = in_array($option['option_text'], $response_array) ? 'checked' : ''; + echo '
'; + echo ''; + echo ''; + echo '
'; + } + } + break; + } + ?> +
+
+ + + + + + Back to Surveys +
+
+ +