Make WordPress Core

Ticket #33055: 33055.3.diff

File 33055.3.diff, 428.0 KB (added by rmccue, 9 years ago)

Updated patch

  • src/wp-includes/Requests/Auth/Basic.php

     
     1<?php
     2/**
     3 * Basic Authentication provider
     4 *
     5 * @package Requests
     6 * @subpackage Authentication
     7 */
     8
     9/**
     10 * Basic Authentication provider
     11 *
     12 * Provides a handler for Basic HTTP authentication via the Authorization
     13 * header.
     14 *
     15 * @package Requests
     16 * @subpackage Authentication
     17 */
     18class Requests_Auth_Basic implements Requests_Auth {
     19        /**
     20         * Username
     21         *
     22         * @var string
     23         */
     24        public $user;
     25
     26        /**
     27         * Password
     28         *
     29         * @var string
     30         */
     31        public $pass;
     32
     33        /**
     34         * Constructor
     35         *
     36         * @throws Requests_Exception On incorrect number of arguments (`authbasicbadargs`)
     37         * @param array|null $args Array of user and password. Must have exactly two elements
     38         */
     39        public function __construct($args = null) {
     40                if (is_array($args)) {
     41                        if (count($args) !== 2) {
     42                                throw new Requests_Exception('Invalid number of arguments', 'authbasicbadargs');
     43                        }
     44
     45                        list($this->user, $this->pass) = $args;
     46                }
     47        }
     48
     49        /**
     50         * Register the necessary callbacks
     51         *
     52         * @see curl_before_send
     53         * @see fsockopen_header
     54         * @param Requests_Hooks $hooks Hook system
     55         */
     56        public function register(Requests_Hooks &$hooks) {
     57                $hooks->register('curl.before_send', array(&$this, 'curl_before_send'));
     58                $hooks->register('fsockopen.after_headers', array(&$this, 'fsockopen_header'));
     59        }
     60
     61        /**
     62         * Set cURL parameters before the data is sent
     63         *
     64         * @param resource $handle cURL resource
     65         */
     66        public function curl_before_send(&$handle) {
     67                curl_setopt($handle, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
     68                curl_setopt($handle, CURLOPT_USERPWD, $this->getAuthString());
     69        }
     70
     71        /**
     72         * Add extra headers to the request before sending
     73         *
     74         * @param string $out HTTP header string
     75         */
     76        public function fsockopen_header(&$out) {
     77                $out .= sprintf("Authorization: Basic %s\r\n", base64_encode($this->getAuthString()));
     78        }
     79
     80        /**
     81         * Get the authentication string (user:pass)
     82         *
     83         * @return string
     84         */
     85        public function getAuthString() {
     86                return $this->user . ':' . $this->pass;
     87        }
     88}
     89 No newline at end of file
  • src/wp-includes/Requests/Auth.php

     
     1<?php
     2/**
     3 * Authentication provider interface
     4 *
     5 * @package Requests
     6 * @subpackage Authentication
     7 */
     8
     9/**
     10 * Authentication provider interface
     11 *
     12 * Implement this interface to act as an authentication provider.
     13 *
     14 * Parameters should be passed via the constructor where possible, as this
     15 * makes it much easier for users to use your provider.
     16 *
     17 * @see Requests_Hooks
     18 * @package Requests
     19 * @subpackage Authentication
     20 */
     21interface Requests_Auth {
     22        /**
     23         * Register hooks as needed
     24         *
     25         * This method is called in {@see Requests::request} when the user has set
     26         * an instance as the 'auth' option. Use this callback to register all the
     27         * hooks you'll need.
     28         *
     29         * @see Requests_Hooks::register
     30         * @param Requests_Hooks $hooks Hook system
     31         */
     32        public function register(Requests_Hooks &$hooks);
     33}
     34 No newline at end of file
  • src/wp-includes/Requests/Cookie/Jar.php

     
     1<?php
     2/**
     3 * Cookie holder object
     4 *
     5 * @package Requests
     6 * @subpackage Cookies
     7 */
     8
     9/**
     10 * Cookie holder object
     11 *
     12 * @package Requests
     13 * @subpackage Cookies
     14 */
     15class Requests_Cookie_Jar implements ArrayAccess, IteratorAggregate {
     16        /**
     17         * Actual item data
     18         *
     19         * @var array
     20         */
     21        protected $cookies = array();
     22
     23        /**
     24         * Create a new jar
     25         *
     26         * @param array $cookies Existing cookie values
     27         */
     28        public function __construct($cookies = array()) {
     29                $this->cookies = $cookies;
     30        }
     31
     32        /**
     33         * Normalise cookie data into a Requests_Cookie
     34         *
     35         * @param string|Requests_Cookie $cookie
     36         * @return Requests_Cookie
     37         */
     38        public function normalize_cookie($cookie, $key = null) {
     39                if ($cookie instanceof Requests_Cookie) {
     40                        return $cookie;
     41                }
     42
     43                return Requests_Cookie::parse($cookie, $key);
     44        }
     45
     46        /**
     47         * Normalise cookie data into a Requests_Cookie
     48         *
     49         * @deprecated Use {@see Requests_Cookie_Jar::normalize_cookie}
     50         * @return Requests_Cookie
     51         */
     52        public function normalizeCookie($cookie, $key = null) {
     53                return $this->normalize_cookie($cookie, $key);
     54        }
     55
     56        /**
     57         * Check if the given item exists
     58         *
     59         * @param string $key Item key
     60         * @return boolean Does the item exist?
     61         */
     62        public function offsetExists($key) {
     63                return isset($this->cookies[$key]);
     64        }
     65
     66        /**
     67         * Get the value for the item
     68         *
     69         * @param string $key Item key
     70         * @return string Item value
     71         */
     72        public function offsetGet($key) {
     73                if (!isset($this->cookies[$key])) {
     74                        return null;
     75                }
     76
     77                return $this->cookies[$key];
     78        }
     79
     80        /**
     81         * Set the given item
     82         *
     83         * @throws Requests_Exception On attempting to use dictionary as list (`invalidset`)
     84         *
     85         * @param string $key Item name
     86         * @param string $value Item value
     87         */
     88        public function offsetSet($key, $value) {
     89                if ($key === null) {
     90                        throw new Requests_Exception('Object is a dictionary, not a list', 'invalidset');
     91                }
     92
     93                $this->cookies[$key] = $value;
     94        }
     95
     96        /**
     97         * Unset the given header
     98         *
     99         * @param string $key
     100         */
     101        public function offsetUnset($key) {
     102                unset($this->cookies[$key]);
     103        }
     104
     105        /**
     106         * Get an iterator for the data
     107         *
     108         * @return ArrayIterator
     109         */
     110        public function getIterator() {
     111                return new ArrayIterator($this->cookies);
     112        }
     113
     114        /**
     115         * Register the cookie handler with the request's hooking system
     116         *
     117         * @param Requests_Hooker $hooks Hooking system
     118         */
     119        public function register(Requests_Hooker $hooks) {
     120                $hooks->register('requests.before_request', array($this, 'before_request'));
     121                $hooks->register('requests.before_redirect_check', array($this, 'before_redirect_check'));
     122        }
     123
     124        /**
     125         * Add Cookie header to a request if we have any
     126         *
     127         * As per RFC 6265, cookies are separated by '; '
     128         *
     129         * @param string $url
     130         * @param array $headers
     131         * @param array $data
     132         * @param string $type
     133         * @param array $options
     134         */
     135        public function before_request($url, &$headers, &$data, &$type, &$options) {
     136                if (!$url instanceof Requests_IRI) {
     137                        $url = new Requests_IRI($url);
     138                }
     139
     140                if (!empty($this->cookies)) {
     141                        $cookies = array();
     142                        foreach ($this->cookies as $key => $cookie) {
     143                                $cookie = $this->normalize_cookie($cookie, $key);
     144
     145                                // Skip expired cookies
     146                                if ($cookie->is_expired()) {
     147                                        continue;
     148                                }
     149
     150                                if ($cookie->domain_matches($url->host)) {
     151                                        $cookies[] = $cookie->format_for_header();
     152                                }
     153                        }
     154
     155                        $headers['Cookie'] = implode('; ', $cookies);
     156                }
     157        }
     158
     159        /**
     160         * Parse all cookies from a response and attach them to the response
     161         *
     162         * @var Requests_Response $response
     163         */
     164        public function before_redirect_check(Requests_Response &$return) {
     165                $url = $return->url;
     166                if (!$url instanceof Requests_IRI) {
     167                        $url = new Requests_IRI($url);
     168                }
     169
     170                $cookies = Requests_Cookie::parse_from_headers($return->headers, $url);
     171                $this->cookies = array_merge($this->cookies, $cookies);
     172                $return->cookies = $this;
     173        }
     174}
     175 No newline at end of file
  • src/wp-includes/Requests/Cookie.php

     
     1<?php
     2/**
     3 * Cookie storage object
     4 *
     5 * @package Requests
     6 * @subpackage Cookies
     7 */
     8
     9/**
     10 * Cookie storage object
     11 *
     12 * @package Requests
     13 * @subpackage Cookies
     14 */
     15class Requests_Cookie {
     16        /**
     17         * Cookie name.
     18         *
     19         * @var string
     20         */
     21        public $name;
     22
     23        /**
     24         * Cookie value.
     25         *
     26         * @var string
     27         */
     28        public $value;
     29
     30        /**
     31         * Cookie attributes
     32         *
     33         * Valid keys are (currently) path, domain, expires, max-age, secure and
     34         * httponly.
     35         *
     36         * @var Requests_Utility_CaseInsensitiveDictionary|array Array-like object
     37         */
     38        public $attributes = array();
     39
     40        /**
     41         * Cookie flags
     42         *
     43         * Valid keys are (currently) creation, last-access, persistent and
     44         * host-only.
     45         *
     46         * @var array
     47         */
     48        public $flags = array();
     49
     50        /**
     51         * Reference time for relative calculations
     52         *
     53         * This is used in place of `time()` when calculating Max-Age expiration and
     54         * checking time validity.
     55         *
     56         * @var int
     57         */
     58        public $reference_time = 0;
     59
     60        /**
     61         * Create a new cookie object
     62         *
     63         * @param string $name
     64         * @param string $value
     65         * @param array|Requests_Utility_CaseInsensitiveDictionary $attributes Associative array of attribute data
     66         */
     67        public function __construct($name, $value, $attributes = array(), $flags = array(), $reference_time = null) {
     68                $this->name = $name;
     69                $this->value = $value;
     70                $this->attributes = $attributes;
     71                $default_flags = array(
     72                        'creation' => time(),
     73                        'last-access' => time(),
     74                        'persistent' => false,
     75                        'host-only' => true,
     76                );
     77                $this->flags = array_merge($default_flags, $flags);
     78
     79                $this->reference_time = time();
     80                if ($reference_time !== null) {
     81                        $this->reference_time = $reference_time;
     82                }
     83
     84                $this->normalize();
     85        }
     86
     87        /**
     88         * Check if a cookie is expired.
     89         *
     90         * Checks the age against $this->reference_time to determine if the cookie
     91         * is expired.
     92         *
     93         * @return boolean True if expired, false if time is valid.
     94         */
     95        public function is_expired() {
     96                // RFC6265, s. 4.1.2.2:
     97                // If a cookie has both the Max-Age and the Expires attribute, the Max-
     98                // Age attribute has precedence and controls the expiration date of the
     99                // cookie.
     100                if (isset($this->attributes['max-age'])) {
     101                        $max_age = $this->attributes['max-age'];
     102                        return $max_age < $this->reference_time;
     103                }
     104
     105                if (isset($this->attributes['expires'])) {
     106                        $expires = $this->attributes['expires'];
     107                        return $expires < $this->reference_time;
     108                }
     109
     110                return false;
     111        }
     112
     113        /**
     114         * Check if a cookie is valid for a given URI
     115         *
     116         * @param Requests_IRI $uri URI to check
     117         * @return boolean Whether the cookie is valid for the given URI
     118         */
     119        public function uri_matches(Requests_IRI $uri) {
     120                if (!$this->domain_matches($uri->host)) {
     121                        return false;
     122                }
     123
     124                if (!$this->path_matches($uri->path)) {
     125                        return false;
     126                }
     127
     128                return empty($this->attributes['secure']) || $uri->scheme === 'https';
     129        }
     130
     131        /**
     132         * Check if a cookie is valid for a given domain
     133         *
     134         * @param string $string Domain to check
     135         * @return boolean Whether the cookie is valid for the given domain
     136         */
     137        public function domain_matches($string) {
     138                if (!isset($this->attributes['domain'])) {
     139                        // Cookies created manually; cookies created by Requests will set
     140                        // the domain to the requested domain
     141                        return true;
     142                }
     143
     144                $domain_string = $this->attributes['domain'];
     145                if ($domain_string === $string) {
     146                        // The domain string and the string are identical.
     147                        return true;
     148                }
     149
     150                // If the cookie is marked as host-only and we don't have an exact
     151                // match, reject the cookie
     152                if ($this->flags['host-only'] === true) {
     153                        return false;
     154                }
     155
     156                if (strlen($string) <= strlen($domain_string)) {
     157                        // For obvious reasons, the string cannot be a suffix if the domain
     158                        // is shorter than the domain string
     159                        return false;
     160                }
     161
     162                if (substr($string, -1 * strlen($domain_string)) !== $domain_string) {
     163                        // The domain string should be a suffix of the string.
     164                        return false;
     165                }
     166
     167                $prefix = substr($string, 0, strlen($string) - strlen($domain_string));
     168                if (substr($prefix, -1) !== '.') {
     169                        // The last character of the string that is not included in the
     170                        // domain string should be a %x2E (".") character.
     171                        return false;
     172                }
     173
     174                // The string should be a host name (i.e., not an IP address).
     175                return !preg_match('#^(.+\.)\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$#', $string);
     176        }
     177
     178        /**
     179         * Check if a cookie is valid for a given path
     180         *
     181         * From the path-match check in RFC 6265 section 5.1.4
     182         *
     183         * @param string $request_path Path to check
     184         * @return boolean Whether the cookie is valid for the given path
     185         */
     186        public function path_matches($request_path) {
     187                if (empty($request_path)) {
     188                        // Normalize empty path to root
     189                        $request_path = '/';
     190                }
     191
     192                if (!isset($this->attributes['path'])) {
     193                        // Cookies created manually; cookies created by Requests will set
     194                        // the path to the requested path
     195                        return true;
     196                }
     197
     198                $cookie_path = $this->attributes['path'];
     199
     200                if ($cookie_path === $request_path) {
     201                        // The cookie-path and the request-path are identical.
     202                        return true;
     203                }
     204
     205                if (strlen($request_path) > strlen($cookie_path) && substr($request_path, 0, strlen($cookie_path)) === $cookie_path) {
     206                        if (substr($cookie_path, -1) === '/') {
     207                                // The cookie-path is a prefix of the request-path, and the last
     208                                // character of the cookie-path is %x2F ("/").
     209                                return true;
     210                        }
     211
     212                        if (substr($request_path, strlen($cookie_path), 1) === '/') {
     213                                // The cookie-path is a prefix of the request-path, and the
     214                                // first character of the request-path that is not included in
     215                                // the cookie-path is a %x2F ("/") character.
     216                                return true;
     217                        }
     218                }
     219
     220                return false;
     221        }
     222
     223        /**
     224         * Normalize cookie and attributes
     225         *
     226         * @return boolean Whether the cookie was successfully normalized
     227         */
     228        public function normalize() {
     229                foreach ($this->attributes as $key => $value) {
     230                        $orig_value = $value;
     231                        $value = $this->normalize_attribute($key, $value);
     232                        if ($value === null) {
     233                                unset($this->attributes[$key]);
     234                                continue;
     235                        }
     236
     237                        if ($value !== $orig_value) {
     238                                $this->attributes[$key] = $value;
     239                        }
     240                }
     241
     242                return true;
     243        }
     244
     245        /**
     246         * Parse an individual cookie attribute
     247         *
     248         * Handles parsing individual attributes from the cookie values.
     249         *
     250         * @param string $name Attribute name
     251         * @param string|boolean $value Attribute value (string value, or true if empty/flag)
     252         * @return mixed Value if available, or null if the attribute value is invalid (and should be skipped)
     253         */
     254        protected function normalize_attribute($name, $value) {
     255                switch (strtolower($name)) {
     256                        case 'expires':
     257                                // Expiration parsing, as per RFC 6265 section 5.2.1
     258                                if (is_int($value)) {
     259                                        return $value;
     260                                }
     261
     262                                $expiry_time = strtotime($value);
     263                                if ($expiry_time === false) {
     264                                        return null;
     265                                }
     266
     267                                return $expiry_time;
     268
     269                        case 'max-age':
     270                                // Expiration parsing, as per RFC 6265 section 5.2.2
     271                                if (is_int($value)) {
     272                                        return $value;
     273                                }
     274
     275                                // Check that we have a valid age
     276                                if (!preg_match('/^-?\d+$/', $value)) {
     277                                        return null;
     278                                }
     279
     280                                $delta_seconds = (int) $value;
     281                                if ($delta_seconds <= 0) {
     282                                        $expiry_time = 0;
     283                                }
     284                                else {
     285                                        $expiry_time = $this->reference_time + $delta_seconds;
     286                                }
     287
     288                                return $expiry_time;
     289
     290                        case 'domain':
     291                                // Domain normalization, as per RFC 6265 section 5.2.3
     292                                if ($value[0] === '.') {
     293                                        $value = substr($value, 1);
     294                                }
     295
     296                                return $value;
     297
     298                        default:
     299                                return $value;
     300                }
     301        }
     302
     303        /**
     304         * Format a cookie for a Cookie header
     305         *
     306         * This is used when sending cookies to a server.
     307         *
     308         * @return string Cookie formatted for Cookie header
     309         */
     310        public function format_for_header() {
     311                return sprintf('%s=%s', $this->name, $this->value);
     312        }
     313
     314        /**
     315         * Format a cookie for a Cookie header
     316         *
     317         * @deprecated Use {@see Requests_Cookie::format_for_header}
     318         * @return string
     319         */
     320        public function formatForHeader() {
     321                return $this->format_for_header();
     322        }
     323
     324        /**
     325         * Format a cookie for a Set-Cookie header
     326         *
     327         * This is used when sending cookies to clients. This isn't really
     328         * applicable to client-side usage, but might be handy for debugging.
     329         *
     330         * @return string Cookie formatted for Set-Cookie header
     331         */
     332        public function format_for_set_cookie() {
     333                $header_value = $this->format_for_header();
     334                if (!empty($this->attributes)) {
     335                        $parts = array();
     336                        foreach ($this->attributes as $key => $value) {
     337                                // Ignore non-associative attributes
     338                                if (is_numeric($key)) {
     339                                        $parts[] = $value;
     340                                }
     341                                else {
     342                                        $parts[] = sprintf('%s=%s', $key, $value);
     343                                }
     344                        }
     345
     346                        $header_value .= '; ' . implode('; ', $parts);
     347                }
     348                return $header_value;
     349        }
     350
     351        /**
     352         * Format a cookie for a Set-Cookie header
     353         *
     354         * @deprecated Use {@see Requests_Cookie::format_for_set_cookie}
     355         * @return string
     356         */
     357        public function formatForSetCookie() {
     358                return $this->format_for_set_cookie();
     359        }
     360
     361        /**
     362         * Get the cookie value
     363         *
     364         * Attributes and other data can be accessed via methods.
     365         */
     366        public function __toString() {
     367                return $this->value;
     368        }
     369
     370        /**
     371         * Parse a cookie string into a cookie object
     372         *
     373         * Based on Mozilla's parsing code in Firefox and related projects, which
     374         * is an intentional deviation from RFC 2109 and RFC 2616. RFC 6265
     375         * specifies some of this handling, but not in a thorough manner.
     376         *
     377         * @param string Cookie header value (from a Set-Cookie header)
     378         * @return Requests_Cookie Parsed cookie object
     379         */
     380        public static function parse($string, $name = '', $reference_time = null) {
     381                $parts = explode(';', $string);
     382                $kvparts = array_shift($parts);
     383
     384                if (!empty($name)) {
     385                        $value = $string;
     386                }
     387                elseif (strpos($kvparts, '=') === false) {
     388                        // Some sites might only have a value without the equals separator.
     389                        // Deviate from RFC 6265 and pretend it was actually a blank name
     390                        // (`=foo`)
     391                        //
     392                        // https://bugzilla.mozilla.org/show_bug.cgi?id=169091
     393                        $name = '';
     394                        $value = $kvparts;
     395                }
     396                else {
     397                        list($name, $value) = explode('=', $kvparts, 2);
     398                }
     399                $name = trim($name);
     400                $value = trim($value);
     401
     402                // Attribute key are handled case-insensitively
     403                $attributes = new Requests_Utility_CaseInsensitiveDictionary();
     404
     405                if (!empty($parts)) {
     406                        foreach ($parts as $part) {
     407                                if (strpos($part, '=') === false) {
     408                                        $part_key = $part;
     409                                        $part_value = true;
     410                                }
     411                                else {
     412                                        list($part_key, $part_value) = explode('=', $part, 2);
     413                                        $part_value = trim($part_value);
     414                                }
     415
     416                                $part_key = trim($part_key);
     417                                $attributes[$part_key] = $part_value;
     418                        }
     419                }
     420
     421                return new Requests_Cookie($name, $value, $attributes, array(), $reference_time);
     422        }
     423
     424        /**
     425         * Parse all Set-Cookie headers from request headers
     426         *
     427         * @param Requests_Response_Headers $headers Headers to parse from
     428         * @param Requests_IRI|null $origin URI for comparing cookie origins
     429         * @param int|null $time Reference time for expiration calculation
     430         * @return array
     431         */
     432        public static function parse_from_headers(Requests_Response_Headers $headers, Requests_IRI $origin = null, $time = null) {
     433                $cookie_headers = $headers->getValues('Set-Cookie');
     434                if (empty($cookie_headers)) {
     435                        return array();
     436                }
     437
     438                $cookies = array();
     439                foreach ($cookie_headers as $header) {
     440                        $parsed = self::parse($header, '', $time);
     441
     442                        // Default domain/path attributes
     443                        if (empty($parsed->attributes['domain']) && !empty($origin)) {
     444                                $parsed->attributes['domain'] = $origin->host;
     445                                $parsed->flags['host-only'] = true;
     446                        }
     447                        else {
     448                                $parsed->flags['host-only'] = false;
     449                        }
     450
     451                        $path_is_valid = (!empty($parsed->attributes['path']) && $parsed->attributes['path'][0] === '/');
     452                        if (!$path_is_valid && !empty($origin)) {
     453                                $path = $origin->path;
     454
     455                                // Default path normalization as per RFC 6265 section 5.1.4
     456                                if (substr($path, 0, 1) !== '/') {
     457                                        // If the uri-path is empty or if the first character of
     458                                        // the uri-path is not a %x2F ("/") character, output
     459                                        // %x2F ("/") and skip the remaining steps.
     460                                        $path = '/';
     461                                }
     462                                elseif (substr_count($path, '/') === 1) {
     463                                        // If the uri-path contains no more than one %x2F ("/")
     464                                        // character, output %x2F ("/") and skip the remaining
     465                                        // step.
     466                                        $path = '/';
     467                                }
     468                                else {
     469                                        // Output the characters of the uri-path from the first
     470                                        // character up to, but not including, the right-most
     471                                        // %x2F ("/").
     472                                        $path = substr($path, 0, strrpos($path, '/'));
     473                                }
     474                                $parsed->attributes['path'] = $path;
     475                        }
     476
     477                        // Reject invalid cookie domains
     478                        if (!empty($origin) && !$parsed->domain_matches($origin->host)) {
     479                                continue;
     480                        }
     481
     482                        $cookies[$parsed->name] = $parsed;
     483                }
     484
     485                return $cookies;
     486        }
     487
     488        /**
     489         * Parse all Set-Cookie headers from request headers
     490         *
     491         * @deprecated Use {@see Requests_Cookie::parse_from_headers}
     492         * @return string
     493         */
     494        public static function parseFromHeaders(Requests_Response_Headers $headers) {
     495                return self::parse_from_headers($headers);
     496        }
     497}
  • src/wp-includes/Requests/Exception/HTTP/304.php

     
     1<?php
     2/**
     3 * Exception for 304 Not Modified responses
     4 *
     5 * @package Requests
     6 */
     7
     8/**
     9 * Exception for 304 Not Modified responses
     10 *
     11 * @package Requests
     12 */
     13class Requests_Exception_HTTP_304 extends Requests_Exception_HTTP {
     14        /**
     15         * HTTP status code
     16         *
     17         * @var integer
     18         */
     19        protected $code = 304;
     20
     21        /**
     22         * Reason phrase
     23         *
     24         * @var string
     25         */
     26        protected $reason = 'Not Modified';
     27}
     28 No newline at end of file
  • src/wp-includes/Requests/Exception/HTTP/305.php

     
     1<?php
     2/**
     3 * Exception for 305 Use Proxy responses
     4 *
     5 * @package Requests
     6 */
     7
     8/**
     9 * Exception for 305 Use Proxy responses
     10 *
     11 * @package Requests
     12 */
     13class Requests_Exception_HTTP_305 extends Requests_Exception_HTTP {
     14        /**
     15         * HTTP status code
     16         *
     17         * @var integer
     18         */
     19        protected $code = 305;
     20
     21        /**
     22         * Reason phrase
     23         *
     24         * @var string
     25         */
     26        protected $reason = 'Use Proxy';
     27}
  • src/wp-includes/Requests/Exception/HTTP/306.php

     
     1<?php
     2/**
     3 * Exception for 306 Switch Proxy responses
     4 *
     5 * @package Requests
     6 */
     7
     8/**
     9 * Exception for 306 Switch Proxy responses
     10 *
     11 * @package Requests
     12 */
     13class Requests_Exception_HTTP_306 extends Requests_Exception_HTTP {
     14        /**
     15         * HTTP status code
     16         *
     17         * @var integer
     18         */
     19        protected $code = 306;
     20
     21        /**
     22         * Reason phrase
     23         *
     24         * @var string
     25         */
     26        protected $reason = 'Switch Proxy';
     27}
  • src/wp-includes/Requests/Exception/HTTP/400.php

     
     1<?php
     2/**
     3 * Exception for 400 Bad Request responses
     4 *
     5 * @package Requests
     6 */
     7
     8/**
     9 * Exception for 400 Bad Request responses
     10 *
     11 * @package Requests
     12 */
     13class Requests_Exception_HTTP_400 extends Requests_Exception_HTTP {
     14        /**
     15         * HTTP status code
     16         *
     17         * @var integer
     18         */
     19        protected $code = 400;
     20
     21        /**
     22         * Reason phrase
     23         *
     24         * @var string
     25         */
     26        protected $reason = 'Bad Request';
     27}
     28 No newline at end of file
  • src/wp-includes/Requests/Exception/HTTP/401.php

     
     1<?php
     2/**
     3 * Exception for 401 Unauthorized responses
     4 *
     5 * @package Requests
     6 */
     7
     8/**
     9 * Exception for 401 Unauthorized responses
     10 *
     11 * @package Requests
     12 */
     13class Requests_Exception_HTTP_401 extends Requests_Exception_HTTP {
     14        /**
     15         * HTTP status code
     16         *
     17         * @var integer
     18         */
     19        protected $code = 401;
     20
     21        /**
     22         * Reason phrase
     23         *
     24         * @var string
     25         */
     26        protected $reason = 'Unauthorized';
     27}
     28 No newline at end of file
  • src/wp-includes/Requests/Exception/HTTP/402.php

     
     1<?php
     2/**
     3 * Exception for 402 Payment Required responses
     4 *
     5 * @package Requests
     6 */
     7
     8/**
     9 * Exception for 402 Payment Required responses
     10 *
     11 * @package Requests
     12 */
     13class Requests_Exception_HTTP_402 extends Requests_Exception_HTTP {
     14        /**
     15         * HTTP status code
     16         *
     17         * @var integer
     18         */
     19        protected $code = 402;
     20
     21        /**
     22         * Reason phrase
     23         *
     24         * @var string
     25         */
     26        protected $reason = 'Payment Required';
     27}
     28 No newline at end of file
  • src/wp-includes/Requests/Exception/HTTP/403.php

     
     1<?php
     2/**
     3 * Exception for 403 Forbidden responses
     4 *
     5 * @package Requests
     6 */
     7
     8/**
     9 * Exception for 403 Forbidden responses
     10 *
     11 * @package Requests
     12 */
     13class Requests_Exception_HTTP_403 extends Requests_Exception_HTTP {
     14        /**
     15         * HTTP status code
     16         *
     17         * @var integer
     18         */
     19        protected $code = 403;
     20
     21        /**
     22         * Reason phrase
     23         *
     24         * @var string
     25         */
     26        protected $reason = 'Forbidden';
     27}
     28 No newline at end of file
  • src/wp-includes/Requests/Exception/HTTP/404.php

     
     1<?php
     2/**
     3 * Exception for 404 Not Found responses
     4 *
     5 * @package Requests
     6 */
     7
     8/**
     9 * Exception for 404 Not Found responses
     10 *
     11 * @package Requests
     12 */
     13class Requests_Exception_HTTP_404 extends Requests_Exception_HTTP {
     14        /**
     15         * HTTP status code
     16         *
     17         * @var integer
     18         */
     19        protected $code = 404;
     20
     21        /**
     22         * Reason phrase
     23         *
     24         * @var string
     25         */
     26        protected $reason = 'Not Found';
     27}
     28 No newline at end of file
  • src/wp-includes/Requests/Exception/HTTP/405.php

     
     1<?php
     2/**
     3 * Exception for 405 Method Not Allowed responses
     4 *
     5 * @package Requests
     6 */
     7
     8/**
     9 * Exception for 405 Method Not Allowed responses
     10 *
     11 * @package Requests
     12 */
     13class Requests_Exception_HTTP_405 extends Requests_Exception_HTTP {
     14        /**
     15         * HTTP status code
     16         *
     17         * @var integer
     18         */
     19        protected $code = 405;
     20
     21        /**
     22         * Reason phrase
     23         *
     24         * @var string
     25         */
     26        protected $reason = 'Method Not Allowed';
     27}
     28 No newline at end of file
  • src/wp-includes/Requests/Exception/HTTP/406.php

     
     1<?php
     2/**
     3 * Exception for 406 Not Acceptable responses
     4 *
     5 * @package Requests
     6 */
     7
     8/**
     9 * Exception for 406 Not Acceptable responses
     10 *
     11 * @package Requests
     12 */
     13class Requests_Exception_HTTP_406 extends Requests_Exception_HTTP {
     14        /**
     15         * HTTP status code
     16         *
     17         * @var integer
     18         */
     19        protected $code = 406;
     20
     21        /**
     22         * Reason phrase
     23         *
     24         * @var string
     25         */
     26        protected $reason = 'Not Acceptable';
     27}
     28 No newline at end of file
  • src/wp-includes/Requests/Exception/HTTP/407.php

     
     1<?php
     2/**
     3 * Exception for 407 Proxy Authentication Required responses
     4 *
     5 * @package Requests
     6 */
     7
     8/**
     9 * Exception for 407 Proxy Authentication Required responses
     10 *
     11 * @package Requests
     12 */
     13class Requests_Exception_HTTP_407 extends Requests_Exception_HTTP {
     14        /**
     15         * HTTP status code
     16         *
     17         * @var integer
     18         */
     19        protected $code = 407;
     20
     21        /**
     22         * Reason phrase
     23         *
     24         * @var string
     25         */
     26        protected $reason = 'Proxy Authentication Required';
     27}
     28 No newline at end of file
  • src/wp-includes/Requests/Exception/HTTP/408.php

     
     1<?php
     2/**
     3 * Exception for 408 Request Timeout responses
     4 *
     5 * @package Requests
     6 */
     7
     8/**
     9 * Exception for 408 Request Timeout responses
     10 *
     11 * @package Requests
     12 */
     13class Requests_Exception_HTTP_408 extends Requests_Exception_HTTP {
     14        /**
     15         * HTTP status code
     16         *
     17         * @var integer
     18         */
     19        protected $code = 408;
     20
     21        /**
     22         * Reason phrase
     23         *
     24         * @var string
     25         */
     26        protected $reason = 'Request Timeout';
     27}
     28 No newline at end of file
  • src/wp-includes/Requests/Exception/HTTP/409.php

     
     1<?php
     2/**
     3 * Exception for 409 Conflict responses
     4 *
     5 * @package Requests
     6 */
     7
     8/**
     9 * Exception for 409 Conflict responses
     10 *
     11 * @package Requests
     12 */
     13class Requests_Exception_HTTP_409 extends Requests_Exception_HTTP {
     14        /**
     15         * HTTP status code
     16         *
     17         * @var integer
     18         */
     19        protected $code = 409;
     20
     21        /**
     22         * Reason phrase
     23         *
     24         * @var string
     25         */
     26        protected $reason = 'Conflict';
     27}
     28 No newline at end of file
  • src/wp-includes/Requests/Exception/HTTP/410.php

     
     1<?php
     2/**
     3 * Exception for 410 Gone responses
     4 *
     5 * @package Requests
     6 */
     7
     8/**
     9 * Exception for 410 Gone responses
     10 *
     11 * @package Requests
     12 */
     13class Requests_Exception_HTTP_410 extends Requests_Exception_HTTP {
     14        /**
     15         * HTTP status code
     16         *
     17         * @var integer
     18         */
     19        protected $code = 410;
     20
     21        /**
     22         * Reason phrase
     23         *
     24         * @var string
     25         */
     26        protected $reason = 'Gone';
     27}
     28 No newline at end of file
  • src/wp-includes/Requests/Exception/HTTP/411.php

     
     1<?php
     2/**
     3 * Exception for 411 Length Required responses
     4 *
     5 * @package Requests
     6 */
     7
     8/**
     9 * Exception for 411 Length Required responses
     10 *
     11 * @package Requests
     12 */
     13class Requests_Exception_HTTP_411 extends Requests_Exception_HTTP {
     14        /**
     15         * HTTP status code
     16         *
     17         * @var integer
     18         */
     19        protected $code = 411;
     20
     21        /**
     22         * Reason phrase
     23         *
     24         * @var string
     25         */
     26        protected $reason = 'Length Required';
     27}
     28 No newline at end of file
  • src/wp-includes/Requests/Exception/HTTP/412.php

     
     1<?php
     2/**
     3 * Exception for 412 Precondition Failed responses
     4 *
     5 * @package Requests
     6 */
     7
     8/**
     9 * Exception for 412 Precondition Failed responses
     10 *
     11 * @package Requests
     12 */
     13class Requests_Exception_HTTP_412 extends Requests_Exception_HTTP {
     14        /**
     15         * HTTP status code
     16         *
     17         * @var integer
     18         */
     19        protected $code = 412;
     20
     21        /**
     22         * Reason phrase
     23         *
     24         * @var string
     25         */
     26        protected $reason = 'Precondition Failed';
     27}
     28 No newline at end of file
  • src/wp-includes/Requests/Exception/HTTP/413.php

     
     1<?php
     2/**
     3 * Exception for 413 Request Entity Too Large responses
     4 *
     5 * @package Requests
     6 */
     7
     8/**
     9 * Exception for 413 Request Entity Too Large responses
     10 *
     11 * @package Requests
     12 */
     13class Requests_Exception_HTTP_413 extends Requests_Exception_HTTP {
     14        /**
     15         * HTTP status code
     16         *
     17         * @var integer
     18         */
     19        protected $code = 413;
     20
     21        /**
     22         * Reason phrase
     23         *
     24         * @var string
     25         */
     26        protected $reason = 'Request Entity Too Large';
     27}
     28 No newline at end of file
  • src/wp-includes/Requests/Exception/HTTP/414.php

     
     1<?php
     2/**
     3 * Exception for 414 Request-URI Too Large responses
     4 *
     5 * @package Requests
     6 */
     7
     8/**
     9 * Exception for 414 Request-URI Too Large responses
     10 *
     11 * @package Requests
     12 */
     13class Requests_Exception_HTTP_414 extends Requests_Exception_HTTP {
     14        /**
     15         * HTTP status code
     16         *
     17         * @var integer
     18         */
     19        protected $code = 414;
     20
     21        /**
     22         * Reason phrase
     23         *
     24         * @var string
     25         */
     26        protected $reason = 'Request-URI Too Large';
     27}
     28 No newline at end of file
  • src/wp-includes/Requests/Exception/HTTP/415.php

     
     1<?php
     2/**
     3 * Exception for 415 Unsupported Media Type responses
     4 *
     5 * @package Requests
     6 */
     7
     8/**
     9 * Exception for 415 Unsupported Media Type responses
     10 *
     11 * @package Requests
     12 */
     13class Requests_Exception_HTTP_415 extends Requests_Exception_HTTP {
     14        /**
     15         * HTTP status code
     16         *
     17         * @var integer
     18         */
     19        protected $code = 415;
     20
     21        /**
     22         * Reason phrase
     23         *
     24         * @var string
     25         */
     26        protected $reason = 'Unsupported Media Type';
     27}
     28 No newline at end of file
  • src/wp-includes/Requests/Exception/HTTP/416.php

     
     1<?php
     2/**
     3 * Exception for 416 Requested Range Not Satisfiable responses
     4 *
     5 * @package Requests
     6 */
     7
     8/**
     9 * Exception for 416 Requested Range Not Satisfiable responses
     10 *
     11 * @package Requests
     12 */
     13class Requests_Exception_HTTP_416 extends Requests_Exception_HTTP {
     14        /**
     15         * HTTP status code
     16         *
     17         * @var integer
     18         */
     19        protected $code = 416;
     20
     21        /**
     22         * Reason phrase
     23         *
     24         * @var string
     25         */
     26        protected $reason = 'Requested Range Not Satisfiable';
     27}
     28 No newline at end of file
  • src/wp-includes/Requests/Exception/HTTP/417.php

     
     1<?php
     2/**
     3 * Exception for 417 Expectation Failed responses
     4 *
     5 * @package Requests
     6 */
     7
     8/**
     9 * Exception for 417 Expectation Failed responses
     10 *
     11 * @package Requests
     12 */
     13class Requests_Exception_HTTP_417 extends Requests_Exception_HTTP {
     14        /**
     15         * HTTP status code
     16         *
     17         * @var integer
     18         */
     19        protected $code = 417;
     20
     21        /**
     22         * Reason phrase
     23         *
     24         * @var string
     25         */
     26        protected $reason = 'Expectation Failed';
     27}
     28 No newline at end of file
  • src/wp-includes/Requests/Exception/HTTP/418.php

     
     1<?php
     2/**
     3 * Exception for 418 I'm A Teapot responses
     4 *
     5 * @see http://tools.ietf.org/html/rfc2324
     6 * @package Requests
     7 */
     8
     9/**
     10 * Exception for 418 I'm A Teapot responses
     11 *
     12 * @see http://tools.ietf.org/html/rfc2324
     13 * @package Requests
     14 */
     15class Requests_Exception_HTTP_418 extends Requests_Exception_HTTP {
     16        /**
     17         * HTTP status code
     18         *
     19         * @var integer
     20         */
     21        protected $code = 418;
     22
     23        /**
     24         * Reason phrase
     25         *
     26         * @var string
     27         */
     28        protected $reason = "I'm A Teapot";
     29}
     30 No newline at end of file
  • src/wp-includes/Requests/Exception/HTTP/428.php

     
     1<?php
     2/**
     3 * Exception for 428 Precondition Required responses
     4 *
     5 * @see http://tools.ietf.org/html/rfc6585
     6 * @package Requests
     7 */
     8
     9/**
     10 * Exception for 428 Precondition Required responses
     11 *
     12 * @see http://tools.ietf.org/html/rfc6585
     13 * @package Requests
     14 */
     15class Requests_Exception_HTTP_428 extends Requests_Exception_HTTP {
     16        /**
     17         * HTTP status code
     18         *
     19         * @var integer
     20         */
     21        protected $code = 428;
     22
     23        /**
     24         * Reason phrase
     25         *
     26         * @var string
     27         */
     28        protected $reason = 'Precondition Required';
     29}
     30 No newline at end of file
  • src/wp-includes/Requests/Exception/HTTP/429.php

     
     1<?php
     2/**
     3 * Exception for 429 Too Many Requests responses
     4 *
     5 * @see http://tools.ietf.org/html/draft-nottingham-http-new-status-04
     6 * @package Requests
     7 */
     8
     9/**
     10 * Exception for 429 Too Many Requests responses
     11 *
     12 * @see http://tools.ietf.org/html/draft-nottingham-http-new-status-04
     13 * @package Requests
     14 */
     15class Requests_Exception_HTTP_429 extends Requests_Exception_HTTP {
     16        /**
     17         * HTTP status code
     18         *
     19         * @var integer
     20         */
     21        protected $code = 429;
     22
     23        /**
     24         * Reason phrase
     25         *
     26         * @var string
     27         */
     28        protected $reason = 'Too Many Requests';
     29}
     30 No newline at end of file
  • src/wp-includes/Requests/Exception/HTTP/431.php

     
     1<?php
     2/**
     3 * Exception for 431 Request Header Fields Too Large responses
     4 *
     5 * @see http://tools.ietf.org/html/rfc6585
     6 * @package Requests
     7 */
     8
     9/**
     10 * Exception for 431 Request Header Fields Too Large responses
     11 *
     12 * @see http://tools.ietf.org/html/rfc6585
     13 * @package Requests
     14 */
     15class Requests_Exception_HTTP_431 extends Requests_Exception_HTTP {
     16        /**
     17         * HTTP status code
     18         *
     19         * @var integer
     20         */
     21        protected $code = 431;
     22
     23        /**
     24         * Reason phrase
     25         *
     26         * @var string
     27         */
     28        protected $reason = 'Request Header Fields Too Large';
     29}
     30 No newline at end of file
  • src/wp-includes/Requests/Exception/HTTP/500.php

     
     1<?php
     2/**
     3 * Exception for 500 Internal Server Error responses
     4 *
     5 * @package Requests
     6 */
     7
     8/**
     9 * Exception for 500 Internal Server Error responses
     10 *
     11 * @package Requests
     12 */
     13class Requests_Exception_HTTP_500 extends Requests_Exception_HTTP {
     14        /**
     15         * HTTP status code
     16         *
     17         * @var integer
     18         */
     19        protected $code = 500;
     20
     21        /**
     22         * Reason phrase
     23         *
     24         * @var string
     25         */
     26        protected $reason = 'Internal Server Error';
     27}
     28 No newline at end of file
  • src/wp-includes/Requests/Exception/HTTP/501.php

     
     1<?php
     2/**
     3 * Exception for 501 Not Implemented responses
     4 *
     5 * @package Requests
     6 */
     7
     8/**
     9 * Exception for 501 Not Implemented responses
     10 *
     11 * @package Requests
     12 */
     13class Requests_Exception_HTTP_501 extends Requests_Exception_HTTP {
     14        /**
     15         * HTTP status code
     16         *
     17         * @var integer
     18         */
     19        protected $code = 501;
     20
     21        /**
     22         * Reason phrase
     23         *
     24         * @var string
     25         */
     26        protected $reason = 'Not Implemented';
     27}
     28 No newline at end of file
  • src/wp-includes/Requests/Exception/HTTP/502.php

     
     1<?php
     2/**
     3 * Exception for 502 Bad Gateway responses
     4 *
     5 * @package Requests
     6 */
     7
     8/**
     9 * Exception for 502 Bad Gateway responses
     10 *
     11 * @package Requests
     12 */
     13class Requests_Exception_HTTP_502 extends Requests_Exception_HTTP {
     14        /**
     15         * HTTP status code
     16         *
     17         * @var integer
     18         */
     19        protected $code = 502;
     20
     21        /**
     22         * Reason phrase
     23         *
     24         * @var string
     25         */
     26        protected $reason = 'Bad Gateway';
     27}
     28 No newline at end of file
  • src/wp-includes/Requests/Exception/HTTP/503.php

     
     1<?php
     2/**
     3 * Exception for 503 Service Unavailable responses
     4 *
     5 * @package Requests
     6 */
     7
     8/**
     9 * Exception for 503 Service Unavailable responses
     10 *
     11 * @package Requests
     12 */
     13class Requests_Exception_HTTP_503 extends Requests_Exception_HTTP {
     14        /**
     15         * HTTP status code
     16         *
     17         * @var integer
     18         */
     19        protected $code = 503;
     20
     21        /**
     22         * Reason phrase
     23         *
     24         * @var string
     25         */
     26        protected $reason = 'Service Unavailable';
     27}
     28 No newline at end of file
  • src/wp-includes/Requests/Exception/HTTP/504.php

     
     1<?php
     2/**
     3 * Exception for 504 Gateway Timeout responses
     4 *
     5 * @package Requests
     6 */
     7
     8/**
     9 * Exception for 504 Gateway Timeout responses
     10 *
     11 * @package Requests
     12 */
     13class Requests_Exception_HTTP_504 extends Requests_Exception_HTTP {
     14        /**
     15         * HTTP status code
     16         *
     17         * @var integer
     18         */
     19        protected $code = 504;
     20
     21        /**
     22         * Reason phrase
     23         *
     24         * @var string
     25         */
     26        protected $reason = 'Gateway Timeout';
     27}
     28 No newline at end of file
  • src/wp-includes/Requests/Exception/HTTP/505.php

     
     1<?php
     2/**
     3 * Exception for 505 HTTP Version Not Supported responses
     4 *
     5 * @package Requests
     6 */
     7
     8/**
     9 * Exception for 505 HTTP Version Not Supported responses
     10 *
     11 * @package Requests
     12 */
     13class Requests_Exception_HTTP_505 extends Requests_Exception_HTTP {
     14        /**
     15         * HTTP status code
     16         *
     17         * @var integer
     18         */
     19        protected $code = 505;
     20
     21        /**
     22         * Reason phrase
     23         *
     24         * @var string
     25         */
     26        protected $reason = 'HTTP Version Not Supported';
     27}
     28 No newline at end of file
  • src/wp-includes/Requests/Exception/HTTP/511.php

     
     1<?php
     2/**
     3 * Exception for 511 Network Authentication Required responses
     4 *
     5 * @see http://tools.ietf.org/html/rfc6585
     6 * @package Requests
     7 */
     8
     9/**
     10 * Exception for 511 Network Authentication Required responses
     11 *
     12 * @see http://tools.ietf.org/html/rfc6585
     13 * @package Requests
     14 */
     15class Requests_Exception_HTTP_511 extends Requests_Exception_HTTP {
     16        /**
     17         * HTTP status code
     18         *
     19         * @var integer
     20         */
     21        protected $code = 511;
     22
     23        /**
     24         * Reason phrase
     25         *
     26         * @var string
     27         */
     28        protected $reason = 'Network Authentication Required';
     29}
     30 No newline at end of file
  • src/wp-includes/Requests/Exception/HTTP/Unknown.php

     
     1<?php
     2/**
     3 * Exception for unknown status responses
     4 *
     5 * @package Requests
     6 */
     7
     8/**
     9 * Exception for unknown status responses
     10 *
     11 * @package Requests
     12 */
     13class Requests_Exception_HTTP_Unknown extends Requests_Exception_HTTP {
     14        /**
     15         * HTTP status code
     16         *
     17         * @var integer|bool Code if available, false if an error occurred
     18         */
     19        protected $code = 0;
     20
     21        /**
     22         * Reason phrase
     23         *
     24         * @var string
     25         */
     26        protected $reason = 'Unknown';
     27
     28        /**
     29         * Create a new exception
     30         *
     31         * If `$data` is an instance of {@see Requests_Response}, uses the status
     32         * code from it. Otherwise, sets as 0
     33         *
     34         * @param string|null $reason Reason phrase
     35         * @param mixed $data Associated data
     36         */
     37        public function __construct($reason = null, $data = null) {
     38                if ($data instanceof Requests_Response) {
     39                        $this->code = $data->status_code;
     40                }
     41
     42                parent::__construct($reason, $data);
     43        }
     44}
     45 No newline at end of file
  • src/wp-includes/Requests/Exception/HTTP.php

     
     1<?php
     2/**
     3 * Exception based on HTTP response
     4 *
     5 * @package Requests
     6 */
     7
     8/**
     9 * Exception based on HTTP response
     10 *
     11 * @package Requests
     12 */
     13class Requests_Exception_HTTP extends Requests_Exception {
     14        /**
     15         * HTTP status code
     16         *
     17         * @var integer
     18         */
     19        protected $code = 0;
     20
     21        /**
     22         * Reason phrase
     23         *
     24         * @var string
     25         */
     26        protected $reason = 'Unknown';
     27
     28        /**
     29         * Create a new exception
     30         *
     31         * There is no mechanism to pass in the status code, as this is set by the
     32         * subclass used. Reason phrases can vary, however.
     33         *
     34         * @param string|null $reason Reason phrase
     35         * @param mixed $data Associated data
     36         */
     37        public function __construct($reason = null, $data = null) {
     38                if ($reason !== null) {
     39                        $this->reason = $reason;
     40                }
     41
     42                $message = sprintf('%d %s', $this->code, $this->reason);
     43                parent::__construct($message, 'httpresponse', $data, $this->code);
     44        }
     45
     46        /**
     47         * Get the status message
     48         */
     49        public function getReason() {
     50                return $this->reason;
     51        }
     52
     53        /**
     54         * Get the correct exception class for a given error code
     55         *
     56         * @param int|bool $code HTTP status code, or false if unavailable
     57         * @return string Exception class name to use
     58         */
     59        public static function get_class($code) {
     60                if (!$code) {
     61                        return 'Requests_Exception_HTTP_Unknown';
     62                }
     63
     64                $class = sprintf('Requests_Exception_HTTP_%d', $code);
     65                if (class_exists($class)) {
     66                        return $class;
     67                }
     68
     69                return 'Requests_Exception_HTTP_Unknown';
     70        }
     71}
     72 No newline at end of file
  • src/wp-includes/Requests/Exception.php

     
     1<?php
     2/**
     3 * Exception for HTTP requests
     4 *
     5 * @package Requests
     6 */
     7
     8/**
     9 * Exception for HTTP requests
     10 *
     11 * @package Requests
     12 */
     13class Requests_Exception extends Exception {
     14        /**
     15         * Type of exception
     16         *
     17         * @var string
     18         */
     19        protected $type;
     20
     21        /**
     22         * Data associated with the exception
     23         *
     24         * @var mixed
     25         */
     26        protected $data;
     27
     28        /**
     29         * Create a new exception
     30         *
     31         * @param string $message Exception message
     32         * @param string $type Exception type
     33         * @param mixed $data Associated data
     34         * @param integer $code Exception numerical code, if applicable
     35         */
     36        public function __construct($message, $type, $data = null, $code = 0) {
     37                parent::__construct($message, $code);
     38
     39                $this->type = $type;
     40                $this->data = $data;
     41        }
     42
     43        /**
     44         * Like {@see getCode()}, but a string code.
     45         *
     46         * @codeCoverageIgnore
     47         * @return string
     48         */
     49        public function getType() {
     50                return $this->type;
     51        }
     52
     53        /**
     54         * Gives any relevant data
     55         *
     56         * @codeCoverageIgnore
     57         * @return mixed
     58         */
     59        public function getData() {
     60                return $this->data;
     61        }
     62}
     63 No newline at end of file
  • src/wp-includes/Requests/Hooker.php

     
     1<?php
     2/**
     3 * Event dispatcher
     4 *
     5 * @package Requests
     6 * @subpackage Utilities
     7 */
     8
     9/**
     10 * Event dispatcher
     11 *
     12 * @package Requests
     13 * @subpackage Utilities
     14 */
     15interface Requests_Hooker {
     16        /**
     17         * Register a callback for a hook
     18         *
     19         * @param string $hook Hook name
     20         * @param callback $callback Function/method to call on event
     21         * @param int $priority Priority number. <0 is executed earlier, >0 is executed later
     22         */
     23        public function register($hook, $callback, $priority = 0);
     24
     25        /**
     26         * Dispatch a message
     27         *
     28         * @param string $hook Hook name
     29         * @param array $parameters Parameters to pass to callbacks
     30         * @return boolean Successfulness
     31         */
     32        public function dispatch($hook, $parameters = array());
     33}
     34 No newline at end of file
  • src/wp-includes/Requests/Hooks.php

     
     1<?php
     2/**
     3 * Handles adding and dispatching events
     4 *
     5 * @package Requests
     6 * @subpackage Utilities
     7 */
     8
     9/**
     10 * Handles adding and dispatching events
     11 *
     12 * @package Requests
     13 * @subpackage Utilities
     14 */
     15class Requests_Hooks implements Requests_Hooker {
     16        /**
     17         * Registered callbacks for each hook
     18         *
     19         * @var array
     20         */
     21        protected $hooks = array();
     22
     23        /**
     24         * Constructor
     25         */
     26        public function __construct() {
     27                // pass
     28        }
     29
     30        /**
     31         * Register a callback for a hook
     32         *
     33         * @param string $hook Hook name
     34         * @param callback $callback Function/method to call on event
     35         * @param int $priority Priority number. <0 is executed earlier, >0 is executed later
     36         */
     37        public function register($hook, $callback, $priority = 0) {
     38                if (!isset($this->hooks[$hook])) {
     39                        $this->hooks[$hook] = array();
     40                }
     41                if (!isset($this->hooks[$hook][$priority])) {
     42                        $this->hooks[$hook][$priority] = array();
     43                }
     44
     45                $this->hooks[$hook][$priority][] = $callback;
     46        }
     47
     48        /**
     49         * Dispatch a message
     50         *
     51         * @param string $hook Hook name
     52         * @param array $parameters Parameters to pass to callbacks
     53         * @return boolean Successfulness
     54         */
     55        public function dispatch($hook, $parameters = array()) {
     56                if (empty($this->hooks[$hook])) {
     57                        return false;
     58                }
     59
     60                foreach ($this->hooks[$hook] as $priority => $hooked) {
     61                        foreach ($hooked as $callback) {
     62                                call_user_func_array($callback, $parameters);
     63                        }
     64                }
     65
     66                return true;
     67        }
     68}
     69 No newline at end of file
  • src/wp-includes/Requests/IDNAEncoder.php

     
     1<?php
     2
     3/**
     4 * IDNA URL encoder
     5 *
     6 * Note: Not fully compliant, as nameprep does nothing yet.
     7 *
     8 * @package Requests
     9 * @subpackage Utilities
     10 * @see http://tools.ietf.org/html/rfc3490 IDNA specification
     11 * @see http://tools.ietf.org/html/rfc3492 Punycode/Bootstrap specification
     12 */
     13class Requests_IDNAEncoder {
     14        /**
     15         * ACE prefix used for IDNA
     16         *
     17         * @see http://tools.ietf.org/html/rfc3490#section-5
     18         * @var string
     19         */
     20        const ACE_PREFIX = 'xn--';
     21
     22        /**#@+
     23         * Bootstrap constant for Punycode
     24         *
     25         * @see http://tools.ietf.org/html/rfc3492#section-5
     26         * @var int
     27         */
     28        const BOOTSTRAP_BASE         = 36;
     29        const BOOTSTRAP_TMIN         = 1;
     30        const BOOTSTRAP_TMAX         = 26;
     31        const BOOTSTRAP_SKEW         = 38;
     32        const BOOTSTRAP_DAMP         = 700;
     33        const BOOTSTRAP_INITIAL_BIAS = 72;
     34        const BOOTSTRAP_INITIAL_N    = 128;
     35        /**#@-*/
     36
     37        /**
     38         * Encode a hostname using Punycode
     39         *
     40         * @param string $string Hostname
     41         * @return string Punycode-encoded hostname
     42         */
     43        public static function encode($string) {
     44                $parts = explode('.', $string);
     45                foreach ($parts as &$part) {
     46                        $part = self::to_ascii($part);
     47                }
     48                return implode('.', $parts);
     49        }
     50
     51        /**
     52         * Convert a UTF-8 string to an ASCII string using Punycode
     53         *
     54         * @throws Requests_Exception Provided string longer than 64 ASCII characters (`idna.provided_too_long`)
     55         * @throws Requests_Exception Prepared string longer than 64 ASCII characters (`idna.prepared_too_long`)
     56         * @throws Requests_Exception Provided string already begins with xn-- (`idna.provided_is_prefixed`)
     57         * @throws Requests_Exception Encoded string longer than 64 ASCII characters (`idna.encoded_too_long`)
     58         *
     59         * @param string $string ASCII or UTF-8 string (max length 64 characters)
     60         * @return string ASCII string
     61         */
     62        public static function to_ascii($string) {
     63                // Step 1: Check if the string is already ASCII
     64                if (self::is_ascii($string)) {
     65                        // Skip to step 7
     66                        if (strlen($string) < 64) {
     67                                return $string;
     68                        }
     69
     70                        throw new Requests_Exception('Provided string is too long', 'idna.provided_too_long', $string);
     71                }
     72
     73                // Step 2: nameprep
     74                $string = self::nameprep($string);
     75
     76                // Step 3: UseSTD3ASCIIRules is false, continue
     77                // Step 4: Check if it's ASCII now
     78                if (self::is_ascii($string)) {
     79                        // Skip to step 7
     80                        if (strlen($string) < 64) {
     81                                return $string;
     82                        }
     83
     84                        throw new Requests_Exception('Prepared string is too long', 'idna.prepared_too_long', $string);
     85                }
     86
     87                // Step 5: Check ACE prefix
     88                if (strpos($string, self::ACE_PREFIX) === 0) {
     89                        throw new Requests_Exception('Provided string begins with ACE prefix', 'idna.provided_is_prefixed', $string);
     90                }
     91
     92                // Step 6: Encode with Punycode
     93                $string = self::punycode_encode($string);
     94
     95                // Step 7: Prepend ACE prefix
     96                $string = self::ACE_PREFIX . $string;
     97
     98                // Step 8: Check size
     99                if (strlen($string) < 64) {
     100                        return $string;
     101                }
     102
     103                throw new Requests_Exception('Encoded string is too long', 'idna.encoded_too_long', $string);
     104        }
     105
     106        /**
     107         * Check whether a given string contains only ASCII characters
     108         *
     109         * @internal (Testing found regex was the fastest implementation)
     110         *
     111         * @param string $string
     112         * @return bool Is the string ASCII-only?
     113         */
     114        protected static function is_ascii($string) {
     115                return (preg_match('/(?:[^\x00-\x7F])/', $string) !== 1);
     116        }
     117
     118        /**
     119         * Prepare a string for use as an IDNA name
     120         *
     121         * @todo Implement this based on RFC 3491 and the newer 5891
     122         * @param string $string
     123         * @return string Prepared string
     124         */
     125        protected static function nameprep($string) {
     126                return $string;
     127        }
     128
     129        /**
     130         * Convert a UTF-8 string to a UCS-4 codepoint array
     131         *
     132         * Based on Requests_IRI::replace_invalid_with_pct_encoding()
     133         *
     134         * @throws Requests_Exception Invalid UTF-8 codepoint (`idna.invalidcodepoint`)
     135         * @param string $input
     136         * @return array Unicode code points
     137         */
     138        protected static function utf8_to_codepoints($input) {
     139                $codepoints = array();
     140
     141                // Get number of bytes
     142                $strlen = strlen($input);
     143
     144                for ($position = 0; $position < $strlen; $position++) {
     145                        $value = ord($input[$position]);
     146
     147                        // One byte sequence:
     148                        if ((~$value & 0x80) === 0x80) {
     149                                $character = $value;
     150                                $length = 1;
     151                                $remaining = 0;
     152                        }
     153                        // Two byte sequence:
     154                        elseif (($value & 0xE0) === 0xC0) {
     155                                $character = ($value & 0x1F) << 6;
     156                                $length = 2;
     157                                $remaining = 1;
     158                        }
     159                        // Three byte sequence:
     160                        elseif (($value & 0xF0) === 0xE0) {
     161                                $character = ($value & 0x0F) << 12;
     162                                $length = 3;
     163                                $remaining = 2;
     164                        }
     165                        // Four byte sequence:
     166                        elseif (($value & 0xF8) === 0xF0) {
     167                                $character = ($value & 0x07) << 18;
     168                                $length = 4;
     169                                $remaining = 3;
     170                        }
     171                        // Invalid byte:
     172                        else {
     173                                throw new Requests_Exception('Invalid Unicode codepoint', 'idna.invalidcodepoint', $value);
     174                        }
     175
     176                        if ($remaining > 0) {
     177                                if ($position + $length > $strlen) {
     178                                        throw new Requests_Exception('Invalid Unicode codepoint', 'idna.invalidcodepoint', $character);
     179                                }
     180                                for ($position++; $remaining > 0; $position++) {
     181                                        $value = ord($input[$position]);
     182
     183                                        // If it is invalid, count the sequence as invalid and reprocess the current byte:
     184                                        if (($value & 0xC0) !== 0x80) {
     185                                                throw new Requests_Exception('Invalid Unicode codepoint', 'idna.invalidcodepoint', $character);
     186                                        }
     187
     188                                        $character |= ($value & 0x3F) << (--$remaining * 6);
     189                                }
     190                                $position--;
     191                        }
     192
     193                        if (
     194                                // Non-shortest form sequences are invalid
     195                                   $length > 1 && $character <= 0x7F
     196                                || $length > 2 && $character <= 0x7FF
     197                                || $length > 3 && $character <= 0xFFFF
     198                                // Outside of range of ucschar codepoints
     199                                // Noncharacters
     200                                || ($character & 0xFFFE) === 0xFFFE
     201                                || $character >= 0xFDD0 && $character <= 0xFDEF
     202                                || (
     203                                        // Everything else not in ucschar
     204                                           $character > 0xD7FF && $character < 0xF900
     205                                        || $character < 0x20
     206                                        || $character > 0x7E && $character < 0xA0
     207                                        || $character > 0xEFFFD
     208                                )
     209                        ) {
     210                                throw new Requests_Exception('Invalid Unicode codepoint', 'idna.invalidcodepoint', $character);
     211                        }
     212
     213                        $codepoints[] = $character;
     214                }
     215
     216                return $codepoints;
     217        }
     218
     219        /**
     220         * RFC3492-compliant encoder
     221         *
     222         * @internal Pseudo-code from Section 6.3 is commented with "#" next to relevant code
     223         * @throws Requests_Exception On character outside of the domain (never happens with Punycode) (`idna.character_outside_domain`)
     224         *
     225         * @param string $input UTF-8 encoded string to encode
     226         * @return string Punycode-encoded string
     227         */
     228        public static function punycode_encode($input) {
     229                $output = '';
     230#               let n = initial_n
     231                $n = self::BOOTSTRAP_INITIAL_N;
     232#               let delta = 0
     233                $delta = 0;
     234#               let bias = initial_bias
     235                $bias = self::BOOTSTRAP_INITIAL_BIAS;
     236#               let h = b = the number of basic code points in the input
     237                $h = $b = 0; // see loop
     238#               copy them to the output in order
     239                $codepoints = self::utf8_to_codepoints($input);
     240                $extended = array();
     241
     242                foreach ($codepoints as $char) {
     243                        if ($char < 128) {
     244                                // Character is valid ASCII
     245                                // TODO: this should also check if it's valid for a URL
     246                                $output .= chr($char);
     247                                $h++;
     248                        }
     249                        // Check if the character is non-ASCII, but below initial n
     250                        // This never occurs for Punycode, so ignore in coverage
     251                        // @codeCoverageIgnoreStart
     252                        elseif ($char < $n) {
     253                                throw new Requests_Exception('Invalid character', 'idna.character_outside_domain', $char);
     254                        }
     255                        // @codeCoverageIgnoreEnd
     256                        else {
     257                                $extended[$char] = true;
     258                        }
     259                }
     260                $extended = array_keys($extended);
     261                sort($extended);
     262                $b = $h;
     263#               [copy them] followed by a delimiter if b > 0
     264                if (strlen($output) > 0) {
     265                        $output .= '-';
     266                }
     267#               {if the input contains a non-basic code point < n then fail}
     268#               while h < length(input) do begin
     269                while ($h < count($codepoints)) {
     270#                       let m = the minimum code point >= n in the input
     271                        $m = array_shift($extended);
     272                        //printf('next code point to insert is %s' . PHP_EOL, dechex($m));
     273#                       let delta = delta + (m - n) * (h + 1), fail on overflow
     274                        $delta += ($m - $n) * ($h + 1);
     275#                       let n = m
     276                        $n = $m;
     277#                       for each code point c in the input (in order) do begin
     278                        for ($num = 0; $num < count($codepoints); $num++) {
     279                                $c = $codepoints[$num];
     280#                               if c < n then increment delta, fail on overflow
     281                                if ($c < $n) {
     282                                        $delta++;
     283                                }
     284#                               if c == n then begin
     285                                elseif ($c === $n) {
     286#                                       let q = delta
     287                                        $q = $delta;
     288#                                       for k = base to infinity in steps of base do begin
     289                                        for ($k = self::BOOTSTRAP_BASE; ; $k += self::BOOTSTRAP_BASE) {
     290#                                               let t = tmin if k <= bias {+ tmin}, or
     291#                                                               tmax if k >= bias + tmax, or k - bias otherwise
     292                                                if ($k <= ($bias + self::BOOTSTRAP_TMIN)) {
     293                                                        $t = self::BOOTSTRAP_TMIN;
     294                                                }
     295                                                elseif ($k >= ($bias + self::BOOTSTRAP_TMAX)) {
     296                                                        $t = self::BOOTSTRAP_TMAX;
     297                                                }
     298                                                else {
     299                                                        $t = $k - $bias;
     300                                                }
     301#                                               if q < t then break
     302                                                if ($q < $t) {
     303                                                        break;
     304                                                }
     305#                                               output the code point for digit t + ((q - t) mod (base - t))
     306                                                $digit = $t + (($q - $t) % (self::BOOTSTRAP_BASE - $t));
     307                                                $output .= self::digit_to_char($digit);
     308#                                               let q = (q - t) div (base - t)
     309                                                $q = floor(($q - $t) / (self::BOOTSTRAP_BASE - $t));
     310#                                       end
     311                                        }
     312#                                       output the code point for digit q
     313                                        $output .= self::digit_to_char($q);
     314#                                       let bias = adapt(delta, h + 1, test h equals b?)
     315                                        $bias = self::adapt($delta, $h + 1, $h === $b);
     316#                                       let delta = 0
     317                                        $delta = 0;
     318#                                       increment h
     319                                        $h++;
     320#                               end
     321                                }
     322#                       end
     323                        }
     324#                       increment delta and n
     325                        $delta++;
     326                        $n++;
     327#               end
     328                }
     329
     330                return $output;
     331        }
     332
     333        /**
     334         * Convert a digit to its respective character
     335         *
     336         * @see http://tools.ietf.org/html/rfc3492#section-5
     337         * @throws Requests_Exception On invalid digit (`idna.invalid_digit`)
     338         *
     339         * @param int $digit Digit in the range 0-35
     340         * @return string Single character corresponding to digit
     341         */
     342        protected static function digit_to_char($digit) {
     343                // @codeCoverageIgnoreStart
     344                // As far as I know, this never happens, but still good to be sure.
     345                if ($digit < 0 || $digit > 35) {
     346                        throw new Requests_Exception(sprintf('Invalid digit %d', $digit), 'idna.invalid_digit', $digit);
     347                }
     348                // @codeCoverageIgnoreEnd
     349                $digits = 'abcdefghijklmnopqrstuvwxyz0123456789';
     350                return substr($digits, $digit, 1);
     351        }
     352
     353        /**
     354         * Adapt the bias
     355         *
     356         * @see http://tools.ietf.org/html/rfc3492#section-6.1
     357         * @param int $delta
     358         * @param int $numpoints
     359         * @param bool $firsttime
     360         * @return int New bias
     361         */
     362        protected static function adapt($delta, $numpoints, $firsttime) {
     363#       function adapt(delta,numpoints,firsttime):
     364#               if firsttime then let delta = delta div damp
     365                if ($firsttime) {
     366                        $delta = floor($delta / self::BOOTSTRAP_DAMP);
     367                }
     368#               else let delta = delta div 2
     369                else {
     370                        $delta = floor($delta / 2);
     371                }
     372#               let delta = delta + (delta div numpoints)
     373                $delta += floor($delta / $numpoints);
     374#               let k = 0
     375                $k = 0;
     376#               while delta > ((base - tmin) * tmax) div 2 do begin
     377                $max = floor(((self::BOOTSTRAP_BASE - self::BOOTSTRAP_TMIN) * self::BOOTSTRAP_TMAX) / 2);
     378                while ($delta > $max) {
     379#                       let delta = delta div (base - tmin)
     380                        $delta = floor($delta / (self::BOOTSTRAP_BASE - self::BOOTSTRAP_TMIN));
     381#                       let k = k + base
     382                        $k += self::BOOTSTRAP_BASE;
     383#               end
     384                }
     385#               return k + (((base - tmin + 1) * delta) div (delta + skew))
     386                return $k + floor(((self::BOOTSTRAP_BASE - self::BOOTSTRAP_TMIN + 1) * $delta) / ($delta + self::BOOTSTRAP_SKEW));
     387        }
     388}
     389 No newline at end of file
  • src/wp-includes/Requests/IPv6.php

     
     1<?php
     2/**
     3 * Class to validate and to work with IPv6 addresses
     4 *
     5 * @package Requests
     6 * @subpackage Utilities
     7 */
     8
     9/**
     10 * Class to validate and to work with IPv6 addresses
     11 *
     12 * This was originally based on the PEAR class of the same name, but has been
     13 * entirely rewritten.
     14 *
     15 * @package Requests
     16 * @subpackage Utilities
     17 */
     18class Requests_IPv6 {
     19        /**
     20         * Uncompresses an IPv6 address
     21         *
     22         * RFC 4291 allows you to compress consecutive zero pieces in an address to
     23         * '::'. This method expects a valid IPv6 address and expands the '::' to
     24         * the required number of zero pieces.
     25         *
     26         * Example:  FF01::101   ->  FF01:0:0:0:0:0:0:101
     27         *           ::1         ->  0:0:0:0:0:0:0:1
     28         *
     29         * @author Alexander Merz <alexander.merz@web.de>
     30         * @author elfrink at introweb dot nl
     31         * @author Josh Peck <jmp at joshpeck dot org>
     32         * @copyright 2003-2005 The PHP Group
     33         * @license http://www.opensource.org/licenses/bsd-license.php
     34         * @param string $ip An IPv6 address
     35         * @return string The uncompressed IPv6 address
     36         */
     37        public static function uncompress($ip) {
     38                if (substr_count($ip, '::') !== 1) {
     39                        return $ip;
     40                }
     41
     42                list($ip1, $ip2) = explode('::', $ip);
     43                $c1 = ($ip1 === '') ? -1 : substr_count($ip1, ':');
     44                $c2 = ($ip2 === '') ? -1 : substr_count($ip2, ':');
     45
     46                if (strpos($ip2, '.') !== false) {
     47                        $c2++;
     48                }
     49                // ::
     50                if ($c1 === -1 && $c2 === -1) {
     51                        $ip = '0:0:0:0:0:0:0:0';
     52                }
     53                // ::xxx
     54                else if ($c1 === -1) {
     55                        $fill = str_repeat('0:', 7 - $c2);
     56                        $ip = str_replace('::', $fill, $ip);
     57                }
     58                // xxx::
     59                else if ($c2 === -1) {
     60                        $fill = str_repeat(':0', 7 - $c1);
     61                        $ip = str_replace('::', $fill, $ip);
     62                }
     63                // xxx::xxx
     64                else {
     65                        $fill = ':' . str_repeat('0:', 6 - $c2 - $c1);
     66                        $ip = str_replace('::', $fill, $ip);
     67                }
     68                return $ip;
     69        }
     70
     71        /**
     72         * Compresses an IPv6 address
     73         *
     74         * RFC 4291 allows you to compress consecutive zero pieces in an address to
     75         * '::'. This method expects a valid IPv6 address and compresses consecutive
     76         * zero pieces to '::'.
     77         *
     78         * Example:  FF01:0:0:0:0:0:0:101   ->  FF01::101
     79         *           0:0:0:0:0:0:0:1        ->  ::1
     80         *
     81         * @see uncompress()
     82         * @param string $ip An IPv6 address
     83         * @return string The compressed IPv6 address
     84         */
     85        public static function compress($ip) {
     86                // Prepare the IP to be compressed
     87                $ip = self::uncompress($ip);
     88                $ip_parts = self::split_v6_v4($ip);
     89
     90                // Replace all leading zeros
     91                $ip_parts[0] = preg_replace('/(^|:)0+([0-9])/', '\1\2', $ip_parts[0]);
     92
     93                // Find bunches of zeros
     94                if (preg_match_all('/(?:^|:)(?:0(?::|$))+/', $ip_parts[0], $matches, PREG_OFFSET_CAPTURE)) {
     95                        $max = 0;
     96                        $pos = null;
     97                        foreach ($matches[0] as $match) {
     98                                if (strlen($match[0]) > $max) {
     99                                        $max = strlen($match[0]);
     100                                        $pos = $match[1];
     101                                }
     102                        }
     103
     104                        $ip_parts[0] = substr_replace($ip_parts[0], '::', $pos, $max);
     105                }
     106
     107                if ($ip_parts[1] !== '') {
     108                        return implode(':', $ip_parts);
     109                }
     110                else {
     111                        return $ip_parts[0];
     112                }
     113        }
     114
     115        /**
     116         * Splits an IPv6 address into the IPv6 and IPv4 representation parts
     117         *
     118         * RFC 4291 allows you to represent the last two parts of an IPv6 address
     119         * using the standard IPv4 representation
     120         *
     121         * Example:  0:0:0:0:0:0:13.1.68.3
     122         *           0:0:0:0:0:FFFF:129.144.52.38
     123         *
     124         * @param string $ip An IPv6 address
     125         * @return string[] [0] contains the IPv6 represented part, and [1] the IPv4 represented part
     126         */
     127        protected static function split_v6_v4($ip) {
     128                if (strpos($ip, '.') !== false) {
     129                        $pos = strrpos($ip, ':');
     130                        $ipv6_part = substr($ip, 0, $pos);
     131                        $ipv4_part = substr($ip, $pos + 1);
     132                        return array($ipv6_part, $ipv4_part);
     133                }
     134                else {
     135                        return array($ip, '');
     136                }
     137        }
     138
     139        /**
     140         * Checks an IPv6 address
     141         *
     142         * Checks if the given IP is a valid IPv6 address
     143         *
     144         * @param string $ip An IPv6 address
     145         * @return bool true if $ip is a valid IPv6 address
     146         */
     147        public static function check_ipv6($ip) {
     148                $ip = self::uncompress($ip);
     149                list($ipv6, $ipv4) = self::split_v6_v4($ip);
     150                $ipv6 = explode(':', $ipv6);
     151                $ipv4 = explode('.', $ipv4);
     152                if (count($ipv6) === 8 && count($ipv4) === 1 || count($ipv6) === 6 && count($ipv4) === 4) {
     153                        foreach ($ipv6 as $ipv6_part) {
     154                                // The section can't be empty
     155                                if ($ipv6_part === '') {
     156                                        return false;
     157                                }
     158
     159                                // Nor can it be over four characters
     160                                if (strlen($ipv6_part) > 4) {
     161                                        return false;
     162                                }
     163
     164                                // Remove leading zeros (this is safe because of the above)
     165                                $ipv6_part = ltrim($ipv6_part, '0');
     166                                if ($ipv6_part === '') {
     167                                        $ipv6_part = '0';
     168                                }
     169
     170                                // Check the value is valid
     171                                $value = hexdec($ipv6_part);
     172                                if (dechex($value) !== strtolower($ipv6_part) || $value < 0 || $value > 0xFFFF) {
     173                                        return false;
     174                                }
     175                        }
     176                        if (count($ipv4) === 4) {
     177                                foreach ($ipv4 as $ipv4_part) {
     178                                        $value = (int) $ipv4_part;
     179                                        if ((string) $value !== $ipv4_part || $value < 0 || $value > 0xFF) {
     180                                                return false;
     181                                        }
     182                                }
     183                        }
     184                        return true;
     185                }
     186                else {
     187                        return false;
     188                }
     189        }
     190}
  • src/wp-includes/Requests/IRI.php

     
     1<?php
     2/**
     3 * IRI parser/serialiser/normaliser
     4 *
     5 * @package Requests
     6 * @subpackage Utilities
     7 */
     8
     9/**
     10 * IRI parser/serialiser/normaliser
     11 *
     12 * Copyright (c) 2007-2010, Geoffrey Sneddon and Steve Minutillo.
     13 * All rights reserved.
     14 *
     15 * Redistribution and use in source and binary forms, with or without
     16 * modification, are permitted provided that the following conditions are met:
     17 *
     18 *  * Redistributions of source code must retain the above copyright notice,
     19 *       this list of conditions and the following disclaimer.
     20 *
     21 *  * Redistributions in binary form must reproduce the above copyright notice,
     22 *       this list of conditions and the following disclaimer in the documentation
     23 *       and/or other materials provided with the distribution.
     24 *
     25 *  * Neither the name of the SimplePie Team nor the names of its contributors
     26 *       may be used to endorse or promote products derived from this software
     27 *       without specific prior written permission.
     28 *
     29 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
     30 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     31 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     32 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE
     33 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     34 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     35 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     36 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     37 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     38 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     39 * POSSIBILITY OF SUCH DAMAGE.
     40 *
     41 * @package Requests
     42 * @subpackage Utilities
     43 * @author Geoffrey Sneddon
     44 * @author Steve Minutillo
     45 * @copyright 2007-2009 Geoffrey Sneddon and Steve Minutillo
     46 * @license http://www.opensource.org/licenses/bsd-license.php
     47 * @link http://hg.gsnedders.com/iri/
     48 *
     49 * @property string $iri IRI we're working with
     50 * @property-read string $uri IRI in URI form, {@see to_uri}
     51 * @property string $scheme Scheme part of the IRI
     52 * @property string $authority Authority part, formatted for a URI (userinfo + host + port)
     53 * @property string $iauthority Authority part of the IRI (userinfo + host + port)
     54 * @property string $userinfo Userinfo part, formatted for a URI (after '://' and before '@')
     55 * @property string $iuserinfo Userinfo part of the IRI (after '://' and before '@')
     56 * @property string $host Host part, formatted for a URI
     57 * @property string $ihost Host part of the IRI
     58 * @property string $port Port part of the IRI (after ':')
     59 * @property string $path Path part, formatted for a URI (after first '/')
     60 * @property string $ipath Path part of the IRI (after first '/')
     61 * @property string $query Query part, formatted for a URI (after '?')
     62 * @property string $iquery Query part of the IRI (after '?')
     63 * @property string $fragment Fragment, formatted for a URI (after '#')
     64 * @property string $ifragment Fragment part of the IRI (after '#')
     65 */
     66class Requests_IRI {
     67        /**
     68         * Scheme
     69         *
     70         * @var string
     71         */
     72        protected $scheme = null;
     73
     74        /**
     75         * User Information
     76         *
     77         * @var string
     78         */
     79        protected $iuserinfo = null;
     80
     81        /**
     82         * ihost
     83         *
     84         * @var string
     85         */
     86        protected $ihost = null;
     87
     88        /**
     89         * Port
     90         *
     91         * @var string
     92         */
     93        protected $port = null;
     94
     95        /**
     96         * ipath
     97         *
     98         * @var string
     99         */
     100        protected $ipath = '';
     101
     102        /**
     103         * iquery
     104         *
     105         * @var string
     106         */
     107        protected $iquery = null;
     108
     109        /**
     110         * ifragment
     111         *
     112         * @var string
     113         */
     114        protected $ifragment = null;
     115
     116        /**
     117         * Normalization database
     118         *
     119         * Each key is the scheme, each value is an array with each key as the IRI
     120         * part and value as the default value for that part.
     121         */
     122        protected $normalization = array(
     123                'acap' => array(
     124                        'port' => 674
     125                ),
     126                'dict' => array(
     127                        'port' => 2628
     128                ),
     129                'file' => array(
     130                        'ihost' => 'localhost'
     131                ),
     132                'http' => array(
     133                        'port' => 80,
     134                ),
     135                'https' => array(
     136                        'port' => 443,
     137                ),
     138        );
     139
     140        /**
     141         * Return the entire IRI when you try and read the object as a string
     142         *
     143         * @return string
     144         */
     145        public function __toString() {
     146                return $this->get_iri();
     147        }
     148
     149        /**
     150         * Overload __set() to provide access via properties
     151         *
     152         * @param string $name Property name
     153         * @param mixed $value Property value
     154         */
     155        public function __set($name, $value) {
     156                if (method_exists($this, 'set_' . $name)) {
     157                        call_user_func(array($this, 'set_' . $name), $value);
     158                }
     159                elseif (
     160                           $name === 'iauthority'
     161                        || $name === 'iuserinfo'
     162                        || $name === 'ihost'
     163                        || $name === 'ipath'
     164                        || $name === 'iquery'
     165                        || $name === 'ifragment'
     166                ) {
     167                        call_user_func(array($this, 'set_' . substr($name, 1)), $value);
     168                }
     169        }
     170
     171        /**
     172         * Overload __get() to provide access via properties
     173         *
     174         * @param string $name Property name
     175         * @return mixed
     176         */
     177        public function __get($name) {
     178                // isset() returns false for null, we don't want to do that
     179                // Also why we use array_key_exists below instead of isset()
     180                $props = get_object_vars($this);
     181
     182                if (
     183                        $name === 'iri' ||
     184                        $name === 'uri' ||
     185                        $name === 'iauthority' ||
     186                        $name === 'authority'
     187                ) {
     188                        $method = 'get_' . $name;
     189                        $return = $this->$method();
     190                }
     191                elseif (array_key_exists($name, $props)) {
     192                        $return = $this->$name;
     193                }
     194                // host -> ihost
     195                elseif (($prop = 'i' . $name) && array_key_exists($prop, $props)) {
     196                        $name = $prop;
     197                        $return = $this->$prop;
     198                }
     199                // ischeme -> scheme
     200                elseif (($prop = substr($name, 1)) && array_key_exists($prop, $props)) {
     201                        $name = $prop;
     202                        $return = $this->$prop;
     203                }
     204                else {
     205                        trigger_error('Undefined property: ' . get_class($this) . '::' . $name, E_USER_NOTICE);
     206                        $return = null;
     207                }
     208
     209                if ($return === null && isset($this->normalization[$this->scheme][$name])) {
     210                        return $this->normalization[$this->scheme][$name];
     211                }
     212                else {
     213                        return $return;
     214                }
     215        }
     216
     217        /**
     218         * Overload __isset() to provide access via properties
     219         *
     220         * @param string $name Property name
     221         * @return bool
     222         */
     223        public function __isset($name) {
     224                return (method_exists($this, 'get_' . $name) || isset($this->$name));
     225        }
     226
     227        /**
     228         * Overload __unset() to provide access via properties
     229         *
     230         * @param string $name Property name
     231         */
     232        public function __unset($name) {
     233                if (method_exists($this, 'set_' . $name)) {
     234                        call_user_func(array($this, 'set_' . $name), '');
     235                }
     236        }
     237
     238        /**
     239         * Create a new IRI object, from a specified string
     240         *
     241         * @param string|null $iri
     242         */
     243        public function __construct($iri = null) {
     244                $this->set_iri($iri);
     245        }
     246
     247        /**
     248         * Create a new IRI object by resolving a relative IRI
     249         *
     250         * Returns false if $base is not absolute, otherwise an IRI.
     251         *
     252         * @param IRI|string $base (Absolute) Base IRI
     253         * @param IRI|string $relative Relative IRI
     254         * @return IRI|false
     255         */
     256        public static function absolutize($base, $relative) {
     257                if (!($relative instanceof Requests_IRI)) {
     258                        $relative = new Requests_IRI($relative);
     259                }
     260                if (!$relative->is_valid()) {
     261                        return false;
     262                }
     263                elseif ($relative->scheme !== null) {
     264                        return clone $relative;
     265                }
     266
     267                if (!($base instanceof Requests_IRI)) {
     268                        $base = new Requests_IRI($base);
     269                }
     270                if ($base->scheme === null || !$base->is_valid()) {
     271                        return false;
     272                }
     273
     274                if ($relative->get_iri() !== '') {
     275                        if ($relative->iuserinfo !== null || $relative->ihost !== null || $relative->port !== null) {
     276                                $target = clone $relative;
     277                                $target->scheme = $base->scheme;
     278                        }
     279                        else {
     280                                $target = new Requests_IRI;
     281                                $target->scheme = $base->scheme;
     282                                $target->iuserinfo = $base->iuserinfo;
     283                                $target->ihost = $base->ihost;
     284                                $target->port = $base->port;
     285                                if ($relative->ipath !== '') {
     286                                        if ($relative->ipath[0] === '/') {
     287                                                $target->ipath = $relative->ipath;
     288                                        }
     289                                        elseif (($base->iuserinfo !== null || $base->ihost !== null || $base->port !== null) && $base->ipath === '') {
     290                                                $target->ipath = '/' . $relative->ipath;
     291                                        }
     292                                        elseif (($last_segment = strrpos($base->ipath, '/')) !== false) {
     293                                                $target->ipath = substr($base->ipath, 0, $last_segment + 1) . $relative->ipath;
     294                                        }
     295                                        else {
     296                                                $target->ipath = $relative->ipath;
     297                                        }
     298                                        $target->ipath = $target->remove_dot_segments($target->ipath);
     299                                        $target->iquery = $relative->iquery;
     300                                }
     301                                else {
     302                                        $target->ipath = $base->ipath;
     303                                        if ($relative->iquery !== null) {
     304                                                $target->iquery = $relative->iquery;
     305                                        }
     306                                        elseif ($base->iquery !== null) {
     307                                                $target->iquery = $base->iquery;
     308                                        }
     309                                }
     310                                $target->ifragment = $relative->ifragment;
     311                        }
     312                }
     313                else {
     314                        $target = clone $base;
     315                        $target->ifragment = null;
     316                }
     317                $target->scheme_normalization();
     318                return $target;
     319        }
     320
     321        /**
     322         * Parse an IRI into scheme/authority/path/query/fragment segments
     323         *
     324         * @param string $iri
     325         * @return array
     326         */
     327        protected function parse_iri($iri) {
     328                $iri = trim($iri, "\x20\x09\x0A\x0C\x0D");
     329                $has_match = preg_match('/^((?P<scheme>[^:\/?#]+):)?(\/\/(?P<authority>[^\/?#]*))?(?P<path>[^?#]*)(\?(?P<query>[^#]*))?(#(?P<fragment>.*))?$/', $iri, $match);
     330                if (!$has_match) {
     331                        throw new Requests_Exception('Cannot parse supplied IRI', 'iri.cannot_parse', $iri);
     332                }
     333
     334                if ($match[1] === '') {
     335                        $match['scheme'] = null;
     336                }
     337                if (!isset($match[3]) || $match[3] === '') {
     338                        $match['authority'] = null;
     339                }
     340                if (!isset($match[5])) {
     341                        $match['path'] = '';
     342                }
     343                if (!isset($match[6]) || $match[6] === '') {
     344                        $match['query'] = null;
     345                }
     346                if (!isset($match[8]) || $match[8] === '') {
     347                        $match['fragment'] = null;
     348                }
     349                return $match;
     350        }
     351
     352        /**
     353         * Remove dot segments from a path
     354         *
     355         * @param string $input
     356         * @return string
     357         */
     358        protected function remove_dot_segments($input) {
     359                $output = '';
     360                while (strpos($input, './') !== false || strpos($input, '/.') !== false || $input === '.' || $input === '..') {
     361                        // A: If the input buffer begins with a prefix of "../" or "./",
     362                        // then remove that prefix from the input buffer; otherwise,
     363                        if (strpos($input, '../') === 0) {
     364                                $input = substr($input, 3);
     365                        }
     366                        elseif (strpos($input, './') === 0) {
     367                                $input = substr($input, 2);
     368                        }
     369                        // B: if the input buffer begins with a prefix of "/./" or "/.",
     370                        // where "." is a complete path segment, then replace that prefix
     371                        // with "/" in the input buffer; otherwise,
     372                        elseif (strpos($input, '/./') === 0) {
     373                                $input = substr($input, 2);
     374                        }
     375                        elseif ($input === '/.') {
     376                                $input = '/';
     377                        }
     378                        // C: if the input buffer begins with a prefix of "/../" or "/..",
     379                        // where ".." is a complete path segment, then replace that prefix
     380                        // with "/" in the input buffer and remove the last segment and its
     381                        // preceding "/" (if any) from the output buffer; otherwise,
     382                        elseif (strpos($input, '/../') === 0) {
     383                                $input = substr($input, 3);
     384                                $output = substr_replace($output, '', strrpos($output, '/'));
     385                        }
     386                        elseif ($input === '/..') {
     387                                $input = '/';
     388                                $output = substr_replace($output, '', strrpos($output, '/'));
     389                        }
     390                        // D: if the input buffer consists only of "." or "..", then remove
     391                        // that from the input buffer; otherwise,
     392                        elseif ($input === '.' || $input === '..') {
     393                                $input = '';
     394                        }
     395                        // E: move the first path segment in the input buffer to the end of
     396                        // the output buffer, including the initial "/" character (if any)
     397                        // and any subsequent characters up to, but not including, the next
     398                        // "/" character or the end of the input buffer
     399                        elseif (($pos = strpos($input, '/', 1)) !== false) {
     400                                $output .= substr($input, 0, $pos);
     401                                $input = substr_replace($input, '', 0, $pos);
     402                        }
     403                        else {
     404                                $output .= $input;
     405                                $input = '';
     406                        }
     407                }
     408                return $output . $input;
     409        }
     410
     411        /**
     412         * Replace invalid character with percent encoding
     413         *
     414         * @param string $string Input string
     415         * @param string $extra_chars Valid characters not in iunreserved or
     416         *                            iprivate (this is ASCII-only)
     417         * @param bool $iprivate Allow iprivate
     418         * @return string
     419         */
     420        protected function replace_invalid_with_pct_encoding($string, $extra_chars, $iprivate = false) {
     421                // Normalize as many pct-encoded sections as possible
     422                $string = preg_replace_callback('/(?:%[A-Fa-f0-9]{2})+/', array(&$this, 'remove_iunreserved_percent_encoded'), $string);
     423
     424                // Replace invalid percent characters
     425                $string = preg_replace('/%(?![A-Fa-f0-9]{2})/', '%25', $string);
     426
     427                // Add unreserved and % to $extra_chars (the latter is safe because all
     428                // pct-encoded sections are now valid).
     429                $extra_chars .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~%';
     430
     431                // Now replace any bytes that aren't allowed with their pct-encoded versions
     432                $position = 0;
     433                $strlen = strlen($string);
     434                while (($position += strspn($string, $extra_chars, $position)) < $strlen) {
     435                        $value = ord($string[$position]);
     436
     437                        // Start position
     438                        $start = $position;
     439
     440                        // By default we are valid
     441                        $valid = true;
     442
     443                        // No one byte sequences are valid due to the while.
     444                        // Two byte sequence:
     445                        if (($value & 0xE0) === 0xC0) {
     446                                $character = ($value & 0x1F) << 6;
     447                                $length = 2;
     448                                $remaining = 1;
     449                        }
     450                        // Three byte sequence:
     451                        elseif (($value & 0xF0) === 0xE0) {
     452                                $character = ($value & 0x0F) << 12;
     453                                $length = 3;
     454                                $remaining = 2;
     455                        }
     456                        // Four byte sequence:
     457                        elseif (($value & 0xF8) === 0xF0) {
     458                                $character = ($value & 0x07) << 18;
     459                                $length = 4;
     460                                $remaining = 3;
     461                        }
     462                        // Invalid byte:
     463                        else {
     464                                $valid = false;
     465                                $length = 1;
     466                                $remaining = 0;
     467                        }
     468
     469                        if ($remaining) {
     470                                if ($position + $length <= $strlen) {
     471                                        for ($position++; $remaining; $position++) {
     472                                                $value = ord($string[$position]);
     473
     474                                                // Check that the byte is valid, then add it to the character:
     475                                                if (($value & 0xC0) === 0x80) {
     476                                                        $character |= ($value & 0x3F) << (--$remaining * 6);
     477                                                }
     478                                                // If it is invalid, count the sequence as invalid and reprocess the current byte:
     479                                                else {
     480                                                        $valid = false;
     481                                                        $position--;
     482                                                        break;
     483                                                }
     484                                        }
     485                                }
     486                                else {
     487                                        $position = $strlen - 1;
     488                                        $valid = false;
     489                                }
     490                        }
     491
     492                        // Percent encode anything invalid or not in ucschar
     493                        if (
     494                                // Invalid sequences
     495                                !$valid
     496                                // Non-shortest form sequences are invalid
     497                                || $length > 1 && $character <= 0x7F
     498                                || $length > 2 && $character <= 0x7FF
     499                                || $length > 3 && $character <= 0xFFFF
     500                                // Outside of range of ucschar codepoints
     501                                // Noncharacters
     502                                || ($character & 0xFFFE) === 0xFFFE
     503                                || $character >= 0xFDD0 && $character <= 0xFDEF
     504                                || (
     505                                        // Everything else not in ucschar
     506                                           $character > 0xD7FF && $character < 0xF900
     507                                        || $character < 0xA0
     508                                        || $character > 0xEFFFD
     509                                )
     510                                && (
     511                                        // Everything not in iprivate, if it applies
     512                                           !$iprivate
     513                                        || $character < 0xE000
     514                                        || $character > 0x10FFFD
     515                                )
     516                        ) {
     517                                // If we were a character, pretend we weren't, but rather an error.
     518                                if ($valid) {
     519                                        $position--;
     520                                }
     521
     522                                for ($j = $start; $j <= $position; $j++) {
     523                                        $string = substr_replace($string, sprintf('%%%02X', ord($string[$j])), $j, 1);
     524                                        $j += 2;
     525                                        $position += 2;
     526                                        $strlen += 2;
     527                                }
     528                        }
     529                }
     530
     531                return $string;
     532        }
     533
     534        /**
     535         * Callback function for preg_replace_callback.
     536         *
     537         * Removes sequences of percent encoded bytes that represent UTF-8
     538         * encoded characters in iunreserved
     539         *
     540         * @param array $match PCRE match
     541         * @return string Replacement
     542         */
     543        protected function remove_iunreserved_percent_encoded($match) {
     544                // As we just have valid percent encoded sequences we can just explode
     545                // and ignore the first member of the returned array (an empty string).
     546                $bytes = explode('%', $match[0]);
     547
     548                // Initialize the new string (this is what will be returned) and that
     549                // there are no bytes remaining in the current sequence (unsurprising
     550                // at the first byte!).
     551                $string = '';
     552                $remaining = 0;
     553
     554                // Loop over each and every byte, and set $value to its value
     555                for ($i = 1, $len = count($bytes); $i < $len; $i++) {
     556                        $value = hexdec($bytes[$i]);
     557
     558                        // If we're the first byte of sequence:
     559                        if (!$remaining) {
     560                                // Start position
     561                                $start = $i;
     562
     563                                // By default we are valid
     564                                $valid = true;
     565
     566                                // One byte sequence:
     567                                if ($value <= 0x7F) {
     568                                        $character = $value;
     569                                        $length = 1;
     570                                }
     571                                // Two byte sequence:
     572                                elseif (($value & 0xE0) === 0xC0) {
     573                                        $character = ($value & 0x1F) << 6;
     574                                        $length = 2;
     575                                        $remaining = 1;
     576                                }
     577                                // Three byte sequence:
     578                                elseif (($value & 0xF0) === 0xE0) {
     579                                        $character = ($value & 0x0F) << 12;
     580                                        $length = 3;
     581                                        $remaining = 2;
     582                                }
     583                                // Four byte sequence:
     584                                elseif (($value & 0xF8) === 0xF0) {
     585                                        $character = ($value & 0x07) << 18;
     586                                        $length = 4;
     587                                        $remaining = 3;
     588                                }
     589                                // Invalid byte:
     590                                else {
     591                                        $valid = false;
     592                                        $remaining = 0;
     593                                }
     594                        }
     595                        // Continuation byte:
     596                        else {
     597                                // Check that the byte is valid, then add it to the character:
     598                                if (($value & 0xC0) === 0x80) {
     599                                        $remaining--;
     600                                        $character |= ($value & 0x3F) << ($remaining * 6);
     601                                }
     602                                // If it is invalid, count the sequence as invalid and reprocess the current byte as the start of a sequence:
     603                                else {
     604                                        $valid = false;
     605                                        $remaining = 0;
     606                                        $i--;
     607                                }
     608                        }
     609
     610                        // If we've reached the end of the current byte sequence, append it to Unicode::$data
     611                        if (!$remaining) {
     612                                // Percent encode anything invalid or not in iunreserved
     613                                if (
     614                                        // Invalid sequences
     615                                        !$valid
     616                                        // Non-shortest form sequences are invalid
     617                                        || $length > 1 && $character <= 0x7F
     618                                        || $length > 2 && $character <= 0x7FF
     619                                        || $length > 3 && $character <= 0xFFFF
     620                                        // Outside of range of iunreserved codepoints
     621                                        || $character < 0x2D
     622                                        || $character > 0xEFFFD
     623                                        // Noncharacters
     624                                        || ($character & 0xFFFE) === 0xFFFE
     625                                        || $character >= 0xFDD0 && $character <= 0xFDEF
     626                                        // Everything else not in iunreserved (this is all BMP)
     627                                        || $character === 0x2F
     628                                        || $character > 0x39 && $character < 0x41
     629                                        || $character > 0x5A && $character < 0x61
     630                                        || $character > 0x7A && $character < 0x7E
     631                                        || $character > 0x7E && $character < 0xA0
     632                                        || $character > 0xD7FF && $character < 0xF900
     633                                ) {
     634                                        for ($j = $start; $j <= $i; $j++) {
     635                                                $string .= '%' . strtoupper($bytes[$j]);
     636                                        }
     637                                }
     638                                else {
     639                                        for ($j = $start; $j <= $i; $j++) {
     640                                                $string .= chr(hexdec($bytes[$j]));
     641                                        }
     642                                }
     643                        }
     644                }
     645
     646                // If we have any bytes left over they are invalid (i.e., we are
     647                // mid-way through a multi-byte sequence)
     648                if ($remaining) {
     649                        for ($j = $start; $j < $len; $j++) {
     650                                $string .= '%' . strtoupper($bytes[$j]);
     651                        }
     652                }
     653
     654                return $string;
     655        }
     656
     657        protected function scheme_normalization() {
     658                if (isset($this->normalization[$this->scheme]['iuserinfo']) && $this->iuserinfo === $this->normalization[$this->scheme]['iuserinfo']) {
     659                        $this->iuserinfo = null;
     660                }
     661                if (isset($this->normalization[$this->scheme]['ihost']) && $this->ihost === $this->normalization[$this->scheme]['ihost']) {
     662                        $this->ihost = null;
     663                }
     664                if (isset($this->normalization[$this->scheme]['port']) && $this->port === $this->normalization[$this->scheme]['port']) {
     665                        $this->port = null;
     666                }
     667                if (isset($this->normalization[$this->scheme]['ipath']) && $this->ipath === $this->normalization[$this->scheme]['ipath']) {
     668                        $this->ipath = '';
     669                }
     670                if (isset($this->ihost) && empty($this->ipath)) {
     671                        $this->ipath = '/';
     672                }
     673                if (isset($this->normalization[$this->scheme]['iquery']) && $this->iquery === $this->normalization[$this->scheme]['iquery']) {
     674                        $this->iquery = null;
     675                }
     676                if (isset($this->normalization[$this->scheme]['ifragment']) && $this->ifragment === $this->normalization[$this->scheme]['ifragment']) {
     677                        $this->ifragment = null;
     678                }
     679        }
     680
     681        /**
     682         * Check if the object represents a valid IRI. This needs to be done on each
     683         * call as some things change depending on another part of the IRI.
     684         *
     685         * @return bool
     686         */
     687        public function is_valid() {
     688                $isauthority = $this->iuserinfo !== null || $this->ihost !== null || $this->port !== null;
     689                if ($this->ipath !== '' &&
     690                        (
     691                                $isauthority && (
     692                                        $this->ipath[0] !== '/' ||
     693                                        substr($this->ipath, 0, 2) === '//'
     694                                ) ||
     695                                (
     696                                        $this->scheme === null &&
     697                                        !$isauthority &&
     698                                        strpos($this->ipath, ':') !== false &&
     699                                        (strpos($this->ipath, '/') === false ? true : strpos($this->ipath, ':') < strpos($this->ipath, '/'))
     700                                )
     701                        )
     702                ) {
     703                        return false;
     704                }
     705
     706                return true;
     707        }
     708
     709        /**
     710         * Set the entire IRI. Returns true on success, false on failure (if there
     711         * are any invalid characters).
     712         *
     713         * @param string $iri
     714         * @return bool
     715         */
     716        protected function set_iri($iri) {
     717                static $cache;
     718                if (!$cache) {
     719                        $cache = array();
     720                }
     721
     722                if ($iri === null) {
     723                        return true;
     724                }
     725                if (isset($cache[$iri])) {
     726                        list($this->scheme,
     727                                 $this->iuserinfo,
     728                                 $this->ihost,
     729                                 $this->port,
     730                                 $this->ipath,
     731                                 $this->iquery,
     732                                 $this->ifragment,
     733                                 $return) = $cache[$iri];
     734                        return $return;
     735                }
     736
     737                $parsed = $this->parse_iri((string) $iri);
     738
     739                $return = $this->set_scheme($parsed['scheme'])
     740                        && $this->set_authority($parsed['authority'])
     741                        && $this->set_path($parsed['path'])
     742                        && $this->set_query($parsed['query'])
     743                        && $this->set_fragment($parsed['fragment']);
     744
     745                $cache[$iri] = array($this->scheme,
     746                                                         $this->iuserinfo,
     747                                                         $this->ihost,
     748                                                         $this->port,
     749                                                         $this->ipath,
     750                                                         $this->iquery,
     751                                                         $this->ifragment,
     752                                                         $return);
     753                return $return;
     754        }
     755
     756        /**
     757         * Set the scheme. Returns true on success, false on failure (if there are
     758         * any invalid characters).
     759         *
     760         * @param string $scheme
     761         * @return bool
     762         */
     763        protected function set_scheme($scheme) {
     764                if ($scheme === null) {
     765                        $this->scheme = null;
     766                }
     767                elseif (!preg_match('/^[A-Za-z][0-9A-Za-z+\-.]*$/', $scheme)) {
     768                        $this->scheme = null;
     769                        return false;
     770                }
     771                else {
     772                        $this->scheme = strtolower($scheme);
     773                }
     774                return true;
     775        }
     776
     777        /**
     778         * Set the authority. Returns true on success, false on failure (if there are
     779         * any invalid characters).
     780         *
     781         * @param string $authority
     782         * @return bool
     783         */
     784        protected function set_authority($authority) {
     785                static $cache;
     786                if (!$cache) {
     787                        $cache = array();
     788                }
     789
     790                if ($authority === null) {
     791                        $this->iuserinfo = null;
     792                        $this->ihost = null;
     793                        $this->port = null;
     794                        return true;
     795                }
     796                if (isset($cache[$authority])) {
     797                        list($this->iuserinfo,
     798                                 $this->ihost,
     799                                 $this->port,
     800                                 $return) = $cache[$authority];
     801
     802                        return $return;
     803                }
     804
     805                $remaining = $authority;
     806                if (($iuserinfo_end = strrpos($remaining, '@')) !== false) {
     807                        $iuserinfo = substr($remaining, 0, $iuserinfo_end);
     808                        $remaining = substr($remaining, $iuserinfo_end + 1);
     809                }
     810                else {
     811                        $iuserinfo = null;
     812                }
     813                if (($port_start = strpos($remaining, ':', strpos($remaining, ']'))) !== false) {
     814                        $port = substr($remaining, $port_start + 1);
     815                        if ($port === false || $port === '') {
     816                                $port = null;
     817                        }
     818                        $remaining = substr($remaining, 0, $port_start);
     819                }
     820                else {
     821                        $port = null;
     822                }
     823
     824                $return = $this->set_userinfo($iuserinfo) &&
     825                                  $this->set_host($remaining) &&
     826                                  $this->set_port($port);
     827
     828                $cache[$authority] = array($this->iuserinfo,
     829                                                                   $this->ihost,
     830                                                                   $this->port,
     831                                                                   $return);
     832
     833                return $return;
     834        }
     835
     836        /**
     837         * Set the iuserinfo.
     838         *
     839         * @param string $iuserinfo
     840         * @return bool
     841         */
     842        protected function set_userinfo($iuserinfo) {
     843                if ($iuserinfo === null) {
     844                        $this->iuserinfo = null;
     845                }
     846                else {
     847                        $this->iuserinfo = $this->replace_invalid_with_pct_encoding($iuserinfo, '!$&\'()*+,;=:');
     848                        $this->scheme_normalization();
     849                }
     850
     851                return true;
     852        }
     853
     854        /**
     855         * Set the ihost. Returns true on success, false on failure (if there are
     856         * any invalid characters).
     857         *
     858         * @param string $ihost
     859         * @return bool
     860         */
     861        protected function set_host($ihost) {
     862                if ($ihost === null) {
     863                        $this->ihost = null;
     864                        return true;
     865                }
     866                if (substr($ihost, 0, 1) === '[' && substr($ihost, -1) === ']') {
     867                        if (Requests_IPv6::check_ipv6(substr($ihost, 1, -1))) {
     868                                $this->ihost = '[' . Requests_IPv6::compress(substr($ihost, 1, -1)) . ']';
     869                        }
     870                        else {
     871                                $this->ihost = null;
     872                                return false;
     873                        }
     874                }
     875                else {
     876                        $ihost = $this->replace_invalid_with_pct_encoding($ihost, '!$&\'()*+,;=');
     877
     878                        // Lowercase, but ignore pct-encoded sections (as they should
     879                        // remain uppercase). This must be done after the previous step
     880                        // as that can add unescaped characters.
     881                        $position = 0;
     882                        $strlen = strlen($ihost);
     883                        while (($position += strcspn($ihost, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ%', $position)) < $strlen) {
     884                                if ($ihost[$position] === '%') {
     885                                        $position += 3;
     886                                }
     887                                else {
     888                                        $ihost[$position] = strtolower($ihost[$position]);
     889                                        $position++;
     890                                }
     891                        }
     892
     893                        $this->ihost = $ihost;
     894                }
     895
     896                $this->scheme_normalization();
     897
     898                return true;
     899        }
     900
     901        /**
     902         * Set the port. Returns true on success, false on failure (if there are
     903         * any invalid characters).
     904         *
     905         * @param string $port
     906         * @return bool
     907         */
     908        protected function set_port($port) {
     909                if ($port === null) {
     910                        $this->port = null;
     911                        return true;
     912                }
     913
     914                if (strspn($port, '0123456789') === strlen($port)) {
     915                        $this->port = (int) $port;
     916                        $this->scheme_normalization();
     917                        return true;
     918                }
     919
     920                $this->port = null;
     921                return false;
     922        }
     923
     924        /**
     925         * Set the ipath.
     926         *
     927         * @param string $ipath
     928         * @return bool
     929         */
     930        protected function set_path($ipath) {
     931                static $cache;
     932                if (!$cache) {
     933                        $cache = array();
     934                }
     935
     936                $ipath = (string) $ipath;
     937
     938                if (isset($cache[$ipath])) {
     939                        $this->ipath = $cache[$ipath][(int) ($this->scheme !== null)];
     940                }
     941                else {
     942                        $valid = $this->replace_invalid_with_pct_encoding($ipath, '!$&\'()*+,;=@:/');
     943                        $removed = $this->remove_dot_segments($valid);
     944
     945                        $cache[$ipath] = array($valid, $removed);
     946                        $this->ipath = ($this->scheme !== null) ? $removed : $valid;
     947                }
     948                $this->scheme_normalization();
     949                return true;
     950        }
     951
     952        /**
     953         * Set the iquery.
     954         *
     955         * @param string $iquery
     956         * @return bool
     957         */
     958        protected function set_query($iquery) {
     959                if ($iquery === null) {
     960                        $this->iquery = null;
     961                }
     962                else {
     963                        $this->iquery = $this->replace_invalid_with_pct_encoding($iquery, '!$&\'()*+,;=:@/?', true);
     964                        $this->scheme_normalization();
     965                }
     966                return true;
     967        }
     968
     969        /**
     970         * Set the ifragment.
     971         *
     972         * @param string $ifragment
     973         * @return bool
     974         */
     975        protected function set_fragment($ifragment) {
     976                if ($ifragment === null) {
     977                        $this->ifragment = null;
     978                }
     979                else {
     980                        $this->ifragment = $this->replace_invalid_with_pct_encoding($ifragment, '!$&\'()*+,;=:@/?');
     981                        $this->scheme_normalization();
     982                }
     983                return true;
     984        }
     985
     986        /**
     987         * Convert an IRI to a URI (or parts thereof)
     988         *
     989         * @param string|bool IRI to convert (or false from {@see get_iri})
     990         * @return string|false URI if IRI is valid, false otherwise.
     991         */
     992        protected function to_uri($string) {
     993                if (!is_string($string)) {
     994                        return false;
     995                }
     996
     997                static $non_ascii;
     998                if (!$non_ascii) {
     999                        $non_ascii = implode('', range("\x80", "\xFF"));
     1000                }
     1001
     1002                $position = 0;
     1003                $strlen = strlen($string);
     1004                while (($position += strcspn($string, $non_ascii, $position)) < $strlen) {
     1005                        $string = substr_replace($string, sprintf('%%%02X', ord($string[$position])), $position, 1);
     1006                        $position += 3;
     1007                        $strlen += 2;
     1008                }
     1009
     1010                return $string;
     1011        }
     1012
     1013        /**
     1014         * Get the complete IRI
     1015         *
     1016         * @return string
     1017         */
     1018        protected function get_iri() {
     1019                if (!$this->is_valid()) {
     1020                        return false;
     1021                }
     1022
     1023                $iri = '';
     1024                if ($this->scheme !== null) {
     1025                        $iri .= $this->scheme . ':';
     1026                }
     1027                if (($iauthority = $this->get_iauthority()) !== null) {
     1028                        $iri .= '//' . $iauthority;
     1029                }
     1030                $iri .= $this->ipath;
     1031                if ($this->iquery !== null) {
     1032                        $iri .= '?' . $this->iquery;
     1033                }
     1034                if ($this->ifragment !== null) {
     1035                        $iri .= '#' . $this->ifragment;
     1036                }
     1037
     1038                return $iri;
     1039        }
     1040
     1041        /**
     1042         * Get the complete URI
     1043         *
     1044         * @return string
     1045         */
     1046        protected function get_uri() {
     1047                return $this->to_uri($this->get_iri());
     1048        }
     1049
     1050        /**
     1051         * Get the complete iauthority
     1052         *
     1053         * @return string
     1054         */
     1055        protected function get_iauthority() {
     1056                if ($this->iuserinfo === null && $this->ihost === null && $this->port === null) {
     1057                        return null;
     1058                }
     1059
     1060                $iauthority = '';
     1061                if ($this->iuserinfo !== null) {
     1062                        $iauthority .= $this->iuserinfo . '@';
     1063                }
     1064                if ($this->ihost !== null) {
     1065                        $iauthority .= $this->ihost;
     1066                }
     1067                if ($this->port !== null) {
     1068                        $iauthority .= ':' . $this->port;
     1069                }
     1070                return $iauthority;
     1071        }
     1072
     1073        /**
     1074         * Get the complete authority
     1075         *
     1076         * @return string
     1077         */
     1078        protected function get_authority() {
     1079                $iauthority = $this->get_iauthority();
     1080                if (is_string($iauthority)) {
     1081                        return $this->to_uri($iauthority);
     1082                }
     1083                else {
     1084                        return $iauthority;
     1085                }
     1086        }
     1087}
  • src/wp-includes/Requests/Proxy/HTTP.php

     
     1<?php
     2/**
     3 * HTTP Proxy connection interface
     4 *
     5 * @package Requests
     6 * @subpackage Proxy
     7 * @since 1.6
     8 */
     9
     10/**
     11 * HTTP Proxy connection interface
     12 *
     13 * Provides a handler for connection via an HTTP proxy
     14 *
     15 * @package Requests
     16 * @subpackage Proxy
     17 * @since 1.6
     18 */
     19class Requests_Proxy_HTTP implements Requests_Proxy {
     20        /**
     21         * Proxy host and port
     22         *
     23         * Notation: "host:port" (eg 127.0.0.1:8080 or someproxy.com:3128)
     24         *
     25         * @var string
     26         */
     27        public $proxy;
     28
     29        /**
     30         * Username
     31         *
     32         * @var string
     33         */
     34        public $user;
     35
     36        /**
     37         * Password
     38         *
     39         * @var string
     40         */
     41        public $pass;
     42
     43        /**
     44         * Do we need to authenticate? (ie username & password have been provided)
     45         *
     46         * @var boolean
     47         */
     48        public $use_authentication;
     49
     50        /**
     51         * Constructor
     52         *
     53         * @since 1.6
     54         * @throws Requests_Exception On incorrect number of arguments (`authbasicbadargs`)
     55         * @param array|null $args Array of user and password. Must have exactly two elements
     56         */
     57        public function __construct($args = null) {
     58                if (is_string($args)) {
     59                        $this->proxy = $args;
     60                }
     61                elseif (is_array($args)) {
     62                        if (count($args) == 1) {
     63                                list($this->proxy) = $args;
     64                        }
     65                        elseif (count($args) == 3) {
     66                                list($this->proxy, $this->user, $this->pass) = $args;
     67                                $this->use_authentication = true;
     68                        }
     69                        else {
     70                                throw new Requests_Exception('Invalid number of arguments', 'proxyhttpbadargs');
     71                        }
     72                }
     73        }
     74
     75        /**
     76         * Register the necessary callbacks
     77         *
     78         * @since 1.6
     79         * @see curl_before_send
     80         * @see fsockopen_remote_socket
     81         * @see fsockopen_remote_host_path
     82         * @see fsockopen_header
     83         * @param Requests_Hooks $hooks Hook system
     84         */
     85        public function register(Requests_Hooks &$hooks) {
     86                $hooks->register('curl.before_send', array(&$this, 'curl_before_send'));
     87
     88                $hooks->register('fsockopen.remote_socket', array(&$this, 'fsockopen_remote_socket'));
     89                $hooks->register('fsockopen.remote_host_path', array(&$this, 'fsockopen_remote_host_path'));
     90                if ($this->use_authentication) {
     91                        $hooks->register('fsockopen.after_headers', array(&$this, 'fsockopen_header'));
     92                }
     93        }
     94
     95        /**
     96         * Set cURL parameters before the data is sent
     97         *
     98         * @since 1.6
     99         * @param resource $handle cURL resource
     100         */
     101        public function curl_before_send(&$handle) {
     102                curl_setopt($handle, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
     103                curl_setopt($handle, CURLOPT_PROXY, $this->proxy);
     104
     105                if ($this->use_authentication) {
     106                        curl_setopt($handle, CURLOPT_PROXYAUTH, CURLAUTH_ANY);
     107                        curl_setopt($handle, CURLOPT_PROXYUSERPWD, $this->get_auth_string());
     108                }
     109        }
     110
     111        /**
     112         * Alter remote socket information before opening socket connection
     113         *
     114         * @since 1.6
     115         * @param string $remote_socket Socket connection string
     116         */
     117        public function fsockopen_remote_socket(&$remote_socket) {
     118                $remote_socket = $this->proxy;
     119        }
     120
     121        /**
     122         * Alter remote path before getting stream data
     123         *
     124         * @since 1.6
     125         * @param string $path Path to send in HTTP request string ("GET ...")
     126         * @param string $url Full URL we're requesting
     127         */
     128        public function fsockopen_remote_host_path(&$path, $url) {
     129                $path = $url;
     130        }
     131
     132        /**
     133         * Add extra headers to the request before sending
     134         *
     135         * @since 1.6
     136         * @param string $out HTTP header string
     137         */
     138        public function fsockopen_header(&$out) {
     139                $out .= sprintf("Proxy-Authorization: Basic %s\r\n", base64_encode($this->get_auth_string()));
     140        }
     141
     142        /**
     143         * Get the authentication string (user:pass)
     144         *
     145         * @since 1.6
     146         * @return string
     147         */
     148        public function get_auth_string() {
     149                return $this->user . ':' . $this->pass;
     150        }
     151}
     152 No newline at end of file
  • src/wp-includes/Requests/Proxy.php

     
     1<?php
     2/**
     3 * Proxy connection interface
     4 *
     5 * @package Requests
     6 * @subpackage Proxy
     7 * @since 1.6
     8 */
     9
     10/**
     11 * Proxy connection interface
     12 *
     13 * Implement this interface to handle proxy settings and authentication
     14 *
     15 * Parameters should be passed via the constructor where possible, as this
     16 * makes it much easier for users to use your provider.
     17 *
     18 * @see Requests_Hooks
     19 * @package Requests
     20 * @subpackage Proxy
     21 * @since 1.6
     22 */
     23interface Requests_Proxy {
     24        /**
     25         * Register hooks as needed
     26         *
     27         * This method is called in {@see Requests::request} when the user has set
     28         * an instance as the 'auth' option. Use this callback to register all the
     29         * hooks you'll need.
     30         *
     31         * @see Requests_Hooks::register
     32         * @param Requests_Hooks $hooks Hook system
     33         */
     34        public function register(Requests_Hooks &$hooks);
     35}
     36 No newline at end of file
  • src/wp-includes/Requests/Response/Headers.php

     
     1<?php
     2/**
     3 * Case-insensitive dictionary, suitable for HTTP headers
     4 *
     5 * @package Requests
     6 */
     7
     8/**
     9 * Case-insensitive dictionary, suitable for HTTP headers
     10 *
     11 * @package Requests
     12 */
     13class Requests_Response_Headers extends Requests_Utility_CaseInsensitiveDictionary {
     14        /**
     15         * Get the given header
     16         *
     17         * Unlike {@see self::getValues()}, this returns a string. If there are
     18         * multiple values, it concatenates them with a comma as per RFC2616.
     19         *
     20         * Avoid using this where commas may be used unquoted in values, such as
     21         * Set-Cookie headers.
     22         *
     23         * @param string $key
     24         * @return string Header value
     25         */
     26        public function offsetGet($key) {
     27                $key = strtolower($key);
     28                if (!isset($this->data[$key])) {
     29                        return null;
     30                }
     31
     32                return $this->flatten($this->data[$key]);
     33        }
     34
     35        /**
     36         * Set the given item
     37         *
     38         * @throws Requests_Exception On attempting to use dictionary as list (`invalidset`)
     39         *
     40         * @param string $key Item name
     41         * @param string $value Item value
     42         */
     43        public function offsetSet($key, $value) {
     44                if ($key === null) {
     45                        throw new Requests_Exception('Object is a dictionary, not a list', 'invalidset');
     46                }
     47
     48                $key = strtolower($key);
     49
     50                if (!isset($this->data[$key])) {
     51                        $this->data[$key] = array();
     52                }
     53
     54                $this->data[$key][] = $value;
     55        }
     56
     57        /**
     58         * Get all values for a given header
     59         *
     60         * @param string $key
     61         * @return array Header values
     62         */
     63        public function getValues($key) {
     64                $key = strtolower($key);
     65                if (!isset($this->data[$key])) {
     66                        return null;
     67                }
     68
     69                return $this->data[$key];
     70        }
     71
     72        /**
     73         * Flattens a value into a string
     74         *
     75         * Converts an array into a string by imploding values with a comma, as per
     76         * RFC2616's rules for folding headers.
     77         *
     78         * @param string|array $value Value to flatten
     79         * @return string Flattened value
     80         */
     81        public function flatten($value) {
     82                if (is_array($value)) {
     83                        $value = implode(',', $value);
     84                }
     85
     86                return $value;
     87        }
     88
     89        /**
     90         * Get an iterator for the data
     91         *
     92         * Converts the internal
     93         * @return ArrayIterator
     94         */
     95        public function getIterator() {
     96                return new Requests_Utility_FilteredIterator($this->data, array($this, 'flatten'));
     97        }
     98}
  • src/wp-includes/Requests/Response.php

     
     1<?php
     2/**
     3 * HTTP response class
     4 *
     5 * Contains a response from Requests::request()
     6 * @package Requests
     7 */
     8
     9/**
     10 * HTTP response class
     11 *
     12 * Contains a response from Requests::request()
     13 * @package Requests
     14 */
     15class Requests_Response {
     16        /**
     17         * Constructor
     18         */
     19        public function __construct() {
     20                $this->headers = new Requests_Response_Headers();
     21                $this->cookies = new Requests_Cookie_Jar();
     22        }
     23
     24        /**
     25         * Response body
     26         *
     27         * @var string
     28         */
     29        public $body = '';
     30
     31        /**
     32         * Raw HTTP data from the transport
     33         *
     34         * @var string
     35         */
     36        public $raw = '';
     37
     38        /**
     39         * Headers, as an associative array
     40         *
     41         * @var Requests_Response_Headers Array-like object representing headers
     42         */
     43        public $headers = array();
     44
     45        /**
     46         * Status code, false if non-blocking
     47         *
     48         * @var integer|boolean
     49         */
     50        public $status_code = false;
     51
     52        /**
     53         * Protocol version, false if non-blocking
     54         * @var float|boolean
     55         */
     56        public $protocol_version = false;
     57
     58        /**
     59         * Whether the request succeeded or not
     60         *
     61         * @var boolean
     62         */
     63        public $success = false;
     64
     65        /**
     66         * Number of redirects the request used
     67         *
     68         * @var integer
     69         */
     70        public $redirects = 0;
     71
     72        /**
     73         * URL requested
     74         *
     75         * @var string
     76         */
     77        public $url = '';
     78
     79        /**
     80         * Previous requests (from redirects)
     81         *
     82         * @var array Array of Requests_Response objects
     83         */
     84        public $history = array();
     85
     86        /**
     87         * Cookies from the request
     88         *
     89         * @var Requests_Cookie_Jar Array-like object representing a cookie jar
     90         */
     91        public $cookies = array();
     92
     93        /**
     94         * Is the response a redirect?
     95         *
     96         * @return boolean True if redirect (3xx status), false if not.
     97         */
     98        public function is_redirect() {
     99                $code = $this->status_code;
     100                return in_array($code, array(300, 301, 302, 303, 307)) || $code > 307 && $code < 400;
     101        }
     102
     103        /**
     104         * Throws an exception if the request was not successful
     105         *
     106         * @throws Requests_Exception If `$allow_redirects` is false, and code is 3xx (`response.no_redirects`)
     107         * @throws Requests_Exception_HTTP On non-successful status code. Exception class corresponds to code (e.g. {@see Requests_Exception_HTTP_404})
     108         * @param boolean $allow_redirects Set to false to throw on a 3xx as well
     109         */
     110        public function throw_for_status($allow_redirects = true) {
     111                if ($this->is_redirect()) {
     112                        if (!$allow_redirects) {
     113                                throw new Requests_Exception('Redirection not allowed', 'response.no_redirects', $this);
     114                        }
     115                }
     116                elseif (!$this->success) {
     117                        $exception = Requests_Exception_HTTP::get_class($this->status_code);
     118                        throw new $exception(null, $this);
     119                }
     120        }
     121}
  • src/wp-includes/Requests/SSL.php

     
     1<?php
     2/**
     3 * SSL utilities for Requests
     4 *
     5 * @package Requests
     6 * @subpackage Utilities
     7 */
     8
     9/**
     10 * SSL utilities for Requests
     11 *
     12 * Collection of utilities for working with and verifying SSL certificates.
     13 *
     14 * @package Requests
     15 * @subpackage Utilities
     16 */
     17class Requests_SSL {
     18        /**
     19         * Verify the certificate against common name and subject alternative names
     20         *
     21         * Unfortunately, PHP doesn't check the certificate against the alternative
     22         * names, leading things like 'https://www.github.com/' to be invalid.
     23         * Instead
     24         *
     25         * @see http://tools.ietf.org/html/rfc2818#section-3.1 RFC2818, Section 3.1
     26         *
     27         * @throws Requests_Exception On not obtaining a match for the host (`fsockopen.ssl.no_match`)
     28         * @param string $host Host name to verify against
     29         * @param array $cert Certificate data from openssl_x509_parse()
     30         * @return bool
     31         */
     32        public static function verify_certificate($host, $cert) {
     33                // Calculate the valid wildcard match if the host is not an IP address
     34                $parts = explode('.', $host);
     35                if (ip2long($host) === false) {
     36                        $parts[0] = '*';
     37                }
     38                $wildcard = implode('.', $parts);
     39
     40                $has_dns_alt = false;
     41
     42                // Check the subjectAltName
     43                if (!empty($cert['extensions']) && !empty($cert['extensions']['subjectAltName'])) {
     44                        $altnames = explode(',', $cert['extensions']['subjectAltName']);
     45                        foreach ($altnames as $altname) {
     46                                $altname = trim($altname);
     47                                if (strpos($altname, 'DNS:') !== 0) {
     48                                        continue;
     49                                }
     50
     51                                $has_dns_alt = true;
     52
     53                                // Strip the 'DNS:' prefix and trim whitespace
     54                                $altname = trim(substr($altname, 4));
     55
     56                                // Check for a match
     57                                if (self::match_domain($host, $altname) === true) {
     58                                        return true;
     59                                }
     60                        }
     61                }
     62
     63                // Fall back to checking the common name if we didn't get any dNSName
     64                // alt names, as per RFC2818
     65                if (!$has_dns_alt && !empty($cert['subject']['CN'])) {
     66                        // Check for a match
     67                        if (self::match_domain($host, $cert['subject']['CN']) === true) {
     68                                return true;
     69                        }
     70                }
     71
     72                return false;
     73        }
     74
     75        /**
     76         * Verify that a reference name is valid
     77         *
     78         * Verifies a dNSName for HTTPS usage, (almost) as per Firefox's rules:
     79         * - Wildcards can only occur in a name with more than 3 components
     80         * - Wildcards can only occur as the last character in the first
     81         *   component
     82         * - Wildcards may be preceded by additional characters
     83         *
     84         * We modify these rules to be a bit stricter and only allow the wildcard
     85         * character to be the full first component; that is, with the exclusion of
     86         * the third rule.
     87         *
     88         * @param string $reference Reference dNSName
     89         * @return boolean Is the name valid?
     90         */
     91        public static function verify_reference_name($reference) {
     92                $parts = explode('.', $reference);
     93
     94                // Check the first part of the name
     95                $first = array_shift($parts);
     96
     97                if (strpos($first, '*') !== false) {
     98                        // Check that the wildcard is the full part
     99                        if ($first !== '*') {
     100                                return false;
     101                        }
     102
     103                        // Check that we have at least 3 components (including first)
     104                        if (count($parts) < 2) {
     105                                return false;
     106                        }
     107                }
     108
     109                // Check the remaining parts
     110                foreach ($parts as $part) {
     111                        if (strpos($part, '*') !== false) {
     112                                return false;
     113                        }
     114                }
     115
     116                // Nothing found, verified!
     117                return true;
     118        }
     119
     120        /**
     121         * Match a hostname against a dNSName reference
     122         *
     123         * @param string $host Requested host
     124         * @param string $reference dNSName to match against
     125         * @return boolean Does the domain match?
     126         */
     127        public static function match_domain($host, $reference) {
     128                // Check if the reference is blacklisted first
     129                if (self::verify_reference_name($reference) !== true) {
     130                        return false;
     131                }
     132
     133                // Check for a direct match
     134                if ($host === $reference) {
     135                        return true;
     136                }
     137
     138                // Calculate the valid wildcard match if the host is not an IP address
     139                // Also validates that the host has 3 parts or more, as per Firefox's
     140                // ruleset.
     141                if (ip2long($host) === false) {
     142                        $parts = explode('.', $host);
     143                        $parts[0] = '*';
     144                        $wildcard = implode('.', $parts);
     145                        if ($wildcard === $reference) {
     146                                return true;
     147                        }
     148                }
     149
     150                return false;
     151        }
     152}
     153 No newline at end of file
  • src/wp-includes/Requests/Session.php

     
     1<?php
     2/**
     3 * Session handler for persistent requests and default parameters
     4 *
     5 * @package Requests
     6 * @subpackage Session Handler
     7 */
     8
     9/**
     10 * Session handler for persistent requests and default parameters
     11 *
     12 * Allows various options to be set as default values, and merges both the
     13 * options and URL properties together. A base URL can be set for all requests,
     14 * with all subrequests resolved from this. Base options can be set (including
     15 * a shared cookie jar), then overridden for individual requests.
     16 *
     17 * @package Requests
     18 * @subpackage Session Handler
     19 */
     20class Requests_Session {
     21        /**
     22         * Base URL for requests
     23         *
     24         * URLs will be made absolute using this as the base
     25         * @var string|null
     26         */
     27        public $url = null;
     28
     29        /**
     30         * Base headers for requests
     31         * @var array
     32         */
     33        public $headers = array();
     34
     35        /**
     36         * Base data for requests
     37         *
     38         * If both the base data and the per-request data are arrays, the data will
     39         * be merged before sending the request.
     40         *
     41         * @var array
     42         */
     43        public $data = array();
     44
     45        /**
     46         * Base options for requests
     47         *
     48         * The base options are merged with the per-request data for each request.
     49         * The only default option is a shared cookie jar between requests.
     50         *
     51         * Values here can also be set directly via properties on the Session
     52         * object, e.g. `$session->useragent = 'X';`
     53         *
     54         * @var array
     55         */
     56        public $options = array();
     57
     58        /**
     59         * Create a new session
     60         *
     61         * @param string|null $url Base URL for requests
     62         * @param array $headers Default headers for requests
     63         * @param array $data Default data for requests
     64         * @param array $options Default options for requests
     65         */
     66        public function __construct($url = null, $headers = array(), $data = array(), $options = array()) {
     67                $this->url = $url;
     68                $this->headers = $headers;
     69                $this->data = $data;
     70                $this->options = $options;
     71
     72                if (empty($this->options['cookies'])) {
     73                        $this->options['cookies'] = new Requests_Cookie_Jar();
     74                }
     75        }
     76
     77        /**
     78         * Get a property's value
     79         *
     80         * @param string $key Property key
     81         * @return mixed|null Property value, null if none found
     82         */
     83        public function __get($key) {
     84                if (isset($this->options[$key])) {
     85                        return $this->options[$key];
     86                }
     87
     88                return null;
     89        }
     90
     91        /**
     92         * Set a property's value
     93         *
     94         * @param string $key Property key
     95         * @param mixed $value Property value
     96         */
     97        public function __set($key, $value) {
     98                $this->options[$key] = $value;
     99        }
     100
     101        /**
     102         * Remove a property's value
     103         *
     104         * @param string $key Property key
     105         */
     106        public function __isset($key) {
     107                return isset($this->options[$key]);
     108        }
     109
     110        /**
     111         * Remove a property's value
     112         *
     113         * @param string $key Property key
     114         */
     115        public function __unset($key) {
     116                if (isset($this->options[$key])) {
     117                        unset($this->options[$key]);
     118                }
     119        }
     120
     121        /**#@+
     122         * @see request()
     123         * @param string $url
     124         * @param array $headers
     125         * @param array $options
     126         * @return Requests_Response
     127         */
     128        /**
     129         * Send a GET request
     130         */
     131        public function get($url, $headers = array(), $options = array()) {
     132                return $this->request($url, $headers, null, Requests::GET, $options);
     133        }
     134
     135        /**
     136         * Send a HEAD request
     137         */
     138        public function head($url, $headers = array(), $options = array()) {
     139                return $this->request($url, $headers, null, Requests::HEAD, $options);
     140        }
     141
     142        /**
     143         * Send a DELETE request
     144         */
     145        public function delete($url, $headers = array(), $options = array()) {
     146                return $this->request($url, $headers, null, Requests::DELETE, $options);
     147        }
     148        /**#@-*/
     149
     150        /**#@+
     151         * @see request()
     152         * @param string $url
     153         * @param array $headers
     154         * @param array $data
     155         * @param array $options
     156         * @return Requests_Response
     157         */
     158        /**
     159         * Send a POST request
     160         */
     161        public function post($url, $headers = array(), $data = array(), $options = array()) {
     162                return $this->request($url, $headers, $data, Requests::POST, $options);
     163        }
     164
     165        /**
     166         * Send a PUT request
     167         */
     168        public function put($url, $headers = array(), $data = array(), $options = array()) {
     169                return $this->request($url, $headers, $data, Requests::PUT, $options);
     170        }
     171
     172        /**
     173         * Send a PATCH request
     174         *
     175         * Note: Unlike {@see post} and {@see put}, `$headers` is required, as the
     176         * specification recommends that should send an ETag
     177         *
     178         * @link http://tools.ietf.org/html/rfc5789
     179         */
     180        public function patch($url, $headers, $data = array(), $options = array()) {
     181                return $this->request($url, $headers, $data, Requests::PATCH, $options);
     182        }
     183        /**#@-*/
     184
     185        /**
     186         * Main interface for HTTP requests
     187         *
     188         * This method initiates a request and sends it via a transport before
     189         * parsing.
     190         *
     191         * @see Requests::request()
     192         *
     193         * @throws Requests_Exception On invalid URLs (`nonhttp`)
     194         *
     195         * @param string $url URL to request
     196         * @param array $headers Extra headers to send with the request
     197         * @param array|null $data Data to send either as a query string for GET/HEAD requests, or in the body for POST requests
     198         * @param string $type HTTP request type (use Requests constants)
     199         * @param array $options Options for the request (see {@see Requests::request})
     200         * @return Requests_Response
     201         */
     202        public function request($url, $headers = array(), $data = array(), $type = Requests::GET, $options = array()) {
     203                $request = $this->merge_request(compact('url', 'headers', 'data', 'options'));
     204
     205                return Requests::request($request['url'], $request['headers'], $request['data'], $type, $request['options']);
     206        }
     207
     208        /**
     209         * Send multiple HTTP requests simultaneously
     210         *
     211         * @see Requests::request_multiple()
     212         *
     213         * @param array $requests Requests data (see {@see Requests::request_multiple})
     214         * @param array $options Global and default options (see {@see Requests::request})
     215         * @return array Responses (either Requests_Response or a Requests_Exception object)
     216         */
     217        public function request_multiple($requests, $options = array()) {
     218                foreach ($requests as $key => $request) {
     219                        $requests[$key] = $this->merge_request($request, false);
     220                }
     221
     222                $options = array_merge($this->options, $options);
     223
     224                // Disallow forcing the type, as that's a per request setting
     225                unset($options['type']);
     226
     227                return Requests::request_multiple($requests, $options);
     228        }
     229
     230        /**
     231         * Merge a request's data with the default data
     232         *
     233         * @param array $request Request data (same form as {@see request_multiple})
     234         * @param boolean $merge_options Should we merge options as well?
     235         * @return array Request data
     236         */
     237        protected function merge_request($request, $merge_options = true) {
     238                if ($this->url !== null) {
     239                        $request['url'] = Requests_IRI::absolutize($this->url, $request['url']);
     240                        $request['url'] = $request['url']->uri;
     241                }
     242
     243                $request['headers'] = array_merge($this->headers, $request['headers']);
     244
     245                if (is_array($request['data']) && is_array($this->data)) {
     246                        $request['data'] = array_merge($this->data, $request['data']);
     247                }
     248
     249                if ($merge_options !== false) {
     250                        $request['options'] = array_merge($this->options, $request['options']);
     251
     252                        // Disallow forcing the type, as that's a per request setting
     253                        unset($request['options']['type']);
     254                }
     255
     256                return $request;
     257        }
     258}
  • src/wp-includes/Requests/Transport/cURL.php

     
     1<?php
     2/**
     3 * cURL HTTP transport
     4 *
     5 * @package Requests
     6 * @subpackage Transport
     7 */
     8
     9/**
     10 * cURL HTTP transport
     11 *
     12 * @package Requests
     13 * @subpackage Transport
     14 */
     15class Requests_Transport_cURL implements Requests_Transport {
     16        const CURL_7_10_5 = 0x070A05;
     17        const CURL_7_16_2 = 0x071002;
     18
     19        /**
     20         * Raw HTTP data
     21         *
     22         * @var string
     23         */
     24        public $headers = '';
     25
     26        /**
     27         * Raw body data
     28         *
     29         * @var string
     30         */
     31        public $response_data = '';
     32
     33        /**
     34         * Information on the current request
     35         *
     36         * @var array cURL information array, see {@see http://php.net/curl_getinfo}
     37         */
     38        public $info;
     39
     40        /**
     41         * Version string
     42         *
     43         * @var long
     44         */
     45        public $version;
     46
     47        /**
     48         * cURL handle
     49         *
     50         * @var resource
     51         */
     52        protected $handle;
     53
     54        /**
     55         * Hook dispatcher instance
     56         *
     57         * @var Requests_Hooks
     58         */
     59        protected $hooks;
     60
     61        /**
     62         * Have we finished the headers yet?
     63         *
     64         * @var boolean
     65         */
     66        protected $done_headers = false;
     67
     68        /**
     69         * If streaming to a file, keep the file pointer
     70         *
     71         * @var resource
     72         */
     73        protected $stream_handle;
     74
     75        /**
     76         * How many bytes are in the response body?
     77         *
     78         * @var int
     79         */
     80        protected $response_bytes;
     81
     82        /**
     83         * What's the maximum number of bytes we should keep?
     84         *
     85         * @var int|bool Byte count, or false if no limit.
     86         */
     87        protected $response_byte_limit;
     88
     89        /**
     90         * Constructor
     91         */
     92        public function __construct() {
     93                $curl = curl_version();
     94                $this->version = $curl['version_number'];
     95                $this->handle = curl_init();
     96
     97                curl_setopt($this->handle, CURLOPT_HEADER, false);
     98                curl_setopt($this->handle, CURLOPT_RETURNTRANSFER, 1);
     99                if ($this->version >= self::CURL_7_10_5) {
     100                        curl_setopt($this->handle, CURLOPT_ENCODING, '');
     101                }
     102                if (defined('CURLOPT_PROTOCOLS')) {
     103                        curl_setopt($this->handle, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS);
     104                }
     105                if (defined('CURLOPT_REDIR_PROTOCOLS')) {
     106                        curl_setopt($this->handle, CURLOPT_REDIR_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS);
     107                }
     108        }
     109
     110        /**
     111         * Destructor
     112         */
     113        public function __destruct() {
     114                if (is_resource($this->handle)) {
     115                        curl_close($this->handle);
     116                }
     117        }
     118
     119        /**
     120         * Perform a request
     121         *
     122         * @throws Requests_Exception On a cURL error (`curlerror`)
     123         *
     124         * @param string $url URL to request
     125         * @param array $headers Associative array of request headers
     126         * @param string|array $data Data to send either as the POST body, or as parameters in the URL for a GET/HEAD
     127         * @param array $options Request options, see {@see Requests::response()} for documentation
     128         * @return string Raw HTTP result
     129         */
     130        public function request($url, $headers = array(), $data = array(), $options = array()) {
     131                $this->hooks = $options['hooks'];
     132
     133                $this->setup_handle($url, $headers, $data, $options);
     134
     135                $options['hooks']->dispatch('curl.before_send', array(&$this->handle));
     136
     137                if ($options['filename'] !== false) {
     138                        $this->stream_handle = fopen($options['filename'], 'wb');
     139                }
     140
     141                $this->response_data = '';
     142                $this->response_bytes = 0;
     143                $this->response_byte_limit = false;
     144                if ($options['max_bytes'] !== false) {
     145                        $this->response_byte_limit = $options['max_bytes'];
     146                }
     147
     148                if (isset($options['verify'])) {
     149                        if ($options['verify'] === false) {
     150                                curl_setopt($this->handle, CURLOPT_SSL_VERIFYHOST, 0);
     151                                curl_setopt($this->handle, CURLOPT_SSL_VERIFYPEER, 0);
     152                        }
     153                        elseif (is_string($options['verify'])) {
     154                                curl_setopt($this->handle, CURLOPT_CAINFO, $options['verify']);
     155                        }
     156                }
     157
     158                if (isset($options['verifyname']) && $options['verifyname'] === false) {
     159                        curl_setopt($this->handle, CURLOPT_SSL_VERIFYHOST, 0);
     160                }
     161
     162                curl_exec($this->handle);
     163                $response = $this->response_data;
     164
     165                $options['hooks']->dispatch('curl.after_send', array());
     166
     167                if (curl_errno($this->handle) === 23 || curl_errno($this->handle) === 61) {
     168                        // Reset encoding and try again
     169                        curl_setopt($this->handle, CURLOPT_ENCODING, 'none');
     170
     171                        $this->response_data = '';
     172                        $this->response_bytes = 0;
     173                        curl_exec($this->handle);
     174                        $response = $this->response_data;
     175                }
     176
     177                $this->process_response($response, $options);
     178
     179                return $this->headers;
     180        }
     181
     182        /**
     183         * Send multiple requests simultaneously
     184         *
     185         * @param array $requests Request data
     186         * @param array $options Global options
     187         * @return array Array of Requests_Response objects (may contain Requests_Exception or string responses as well)
     188         */
     189        public function request_multiple($requests, $options) {
     190                // If you're not requesting, we can't get any responses ¯\_(ツ)_/¯
     191                if (empty($requests)) {
     192                        return array();
     193                }
     194
     195                $multihandle = curl_multi_init();
     196                $subrequests = array();
     197                $subhandles = array();
     198
     199                $class = get_class($this);
     200                foreach ($requests as $id => $request) {
     201                        $subrequests[$id] = new $class();
     202                        $subhandles[$id] = $subrequests[$id]->get_subrequest_handle($request['url'], $request['headers'], $request['data'], $request['options']);
     203                        $request['options']['hooks']->dispatch('curl.before_multi_add', array(&$subhandles[$id]));
     204                        curl_multi_add_handle($multihandle, $subhandles[$id]);
     205                }
     206
     207                $completed = 0;
     208                $responses = array();
     209
     210                $request['options']['hooks']->dispatch('curl.before_multi_exec', array(&$multihandle));
     211
     212                do {
     213                        $active = false;
     214
     215                        do {
     216                                $status = curl_multi_exec($multihandle, $active);
     217                        }
     218                        while ($status === CURLM_CALL_MULTI_PERFORM);
     219
     220                        $to_process = array();
     221
     222                        // Read the information as needed
     223                        while ($done = curl_multi_info_read($multihandle)) {
     224                                $key = array_search($done['handle'], $subhandles, true);
     225                                if (!isset($to_process[$key])) {
     226                                        $to_process[$key] = $done;
     227                                }
     228                        }
     229
     230                        // Parse the finished requests before we start getting the new ones
     231                        foreach ($to_process as $key => $done) {
     232                                $options = $requests[$key]['options'];
     233                                $responses[$key] = $subrequests[$key]->process_response($subrequests[$key]->response_data, $options);
     234
     235                                $options['hooks']->dispatch('transport.internal.parse_response', array(&$responses[$key], $requests[$key]));
     236
     237                                curl_multi_remove_handle($multihandle, $done['handle']);
     238                                curl_close($done['handle']);
     239
     240                                if (!is_string($responses[$key])) {
     241                                        $options['hooks']->dispatch('multiple.request.complete', array(&$responses[$key], $key));
     242                                }
     243                                $completed++;
     244                        }
     245                }
     246                while ($active || $completed < count($subrequests));
     247
     248                $request['options']['hooks']->dispatch('curl.after_multi_exec', array(&$multihandle));
     249
     250                curl_multi_close($multihandle);
     251
     252                return $responses;
     253        }
     254
     255        /**
     256         * Get the cURL handle for use in a multi-request
     257         *
     258         * @param string $url URL to request
     259         * @param array $headers Associative array of request headers
     260         * @param string|array $data Data to send either as the POST body, or as parameters in the URL for a GET/HEAD
     261         * @param array $options Request options, see {@see Requests::response()} for documentation
     262         * @return resource Subrequest's cURL handle
     263         */
     264        public function &get_subrequest_handle($url, $headers, $data, $options) {
     265                $this->setup_handle($url, $headers, $data, $options);
     266
     267                if ($options['filename'] !== false) {
     268                        $this->stream_handle = fopen($options['filename'], 'wb');
     269                }
     270
     271                $this->response_data = '';
     272                $this->response_bytes = 0;
     273                $this->response_byte_limit = false;
     274                if ($options['max_bytes'] !== false) {
     275                        $this->response_byte_limit = $options['max_bytes'];
     276                }
     277                $this->hooks = $options['hooks'];
     278
     279                return $this->handle;
     280        }
     281
     282        /**
     283         * Setup the cURL handle for the given data
     284         *
     285         * @param string $url URL to request
     286         * @param array $headers Associative array of request headers
     287         * @param string|array $data Data to send either as the POST body, or as parameters in the URL for a GET/HEAD
     288         * @param array $options Request options, see {@see Requests::response()} for documentation
     289         */
     290        protected function setup_handle($url, $headers, $data, $options) {
     291                $options['hooks']->dispatch('curl.before_request', array(&$this->handle));
     292
     293                $headers = Requests::flatten($headers);
     294
     295                if (!empty($data)) {
     296                        $data_format = $options['data_format'];
     297
     298                        if ($data_format === 'query') {
     299                                $url = self::format_get($url, $data);
     300                                $data = '';
     301                        }
     302                        elseif (!is_string($data)) {
     303                                $data = http_build_query($data, null, '&');
     304                        }
     305                }
     306
     307                switch ($options['type']) {
     308                        case Requests::POST:
     309                                curl_setopt($this->handle, CURLOPT_POST, true);
     310                                curl_setopt($this->handle, CURLOPT_POSTFIELDS, $data);
     311                                break;
     312                        case Requests::PATCH:
     313                        case Requests::PUT:
     314                        case Requests::DELETE:
     315                        case Requests::OPTIONS:
     316                                curl_setopt($this->handle, CURLOPT_CUSTOMREQUEST, $options['type']);
     317                                curl_setopt($this->handle, CURLOPT_POSTFIELDS, $data);
     318                                break;
     319                        case Requests::HEAD:
     320                                curl_setopt($this->handle, CURLOPT_CUSTOMREQUEST, $options['type']);
     321                                curl_setopt($this->handle, CURLOPT_NOBODY, true);
     322                                break;
     323                        case Requests::TRACE:
     324                                curl_setopt($this->handle, CURLOPT_CUSTOMREQUEST, $options['type']);
     325                                break;
     326                }
     327
     328                if (is_int($options['timeout']) || $this->version < self::CURL_7_16_2) {
     329                        curl_setopt($this->handle, CURLOPT_TIMEOUT, ceil($options['timeout']));
     330                }
     331                else {
     332                        curl_setopt($this->handle, CURLOPT_TIMEOUT_MS, round($options['timeout'] * 1000));
     333                }
     334
     335                if (is_int($options['connect_timeout']) || $this->version < self::CURL_7_16_2) {
     336                        curl_setopt($this->handle, CURLOPT_CONNECTTIMEOUT, ceil($options['connect_timeout']));
     337                }
     338                else {
     339                        curl_setopt($this->handle, CURLOPT_CONNECTTIMEOUT_MS, round($options['connect_timeout'] * 1000));
     340                }
     341                curl_setopt($this->handle, CURLOPT_URL, $url);
     342                curl_setopt($this->handle, CURLOPT_REFERER, $url);
     343                curl_setopt($this->handle, CURLOPT_USERAGENT, $options['useragent']);
     344                curl_setopt($this->handle, CURLOPT_HTTPHEADER, $headers);
     345
     346                if ($options['protocol_version'] === 1.1) {
     347                        curl_setopt($this->handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
     348                }
     349                else {
     350                        curl_setopt($this->handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
     351                }
     352
     353                if (true === $options['blocking']) {
     354                        curl_setopt($this->handle, CURLOPT_HEADERFUNCTION, array(&$this, 'stream_headers'));
     355                        curl_setopt($this->handle, CURLOPT_WRITEFUNCTION, array(&$this, 'stream_body'));
     356                        curl_setopt($this->handle, CURLOPT_BUFFERSIZE, Requests::BUFFER_SIZE);
     357                }
     358        }
     359
     360        /**
     361         * Process a response
     362         *
     363         * @param string $response Response data from the body
     364         * @param array $options Request options
     365         * @return string HTTP response data including headers
     366         */
     367        public function process_response($response, $options) {
     368                if ($options['blocking'] === false) {
     369                        $fake_headers = '';
     370                        $options['hooks']->dispatch('curl.after_request', array(&$fake_headers));
     371                        return false;
     372                }
     373                if ($options['filename'] !== false) {
     374                        fclose($this->stream_handle);
     375                        $this->headers = trim($this->headers);
     376                }
     377                else {
     378                        $this->headers .= $response;
     379                }
     380
     381                if (curl_errno($this->handle)) {
     382                        $error = sprintf(
     383                                'cURL error %s: %s',
     384                                curl_errno($this->handle),
     385                                curl_error($this->handle)
     386                        );
     387                        throw new Requests_Exception($error, 'curlerror', $this->handle);
     388                }
     389                $this->info = curl_getinfo($this->handle);
     390
     391                $options['hooks']->dispatch('curl.after_request', array(&$this->headers));
     392                return $this->headers;
     393        }
     394
     395        /**
     396         * Collect the headers as they are received
     397         *
     398         * @param resource $handle cURL resource
     399         * @param string $headers Header string
     400         * @return integer Length of provided header
     401         */
     402        public function stream_headers($handle, $headers) {
     403                // Why do we do this? cURL will send both the final response and any
     404                // interim responses, such as a 100 Continue. We don't need that.
     405                // (We may want to keep this somewhere just in case)
     406                if ($this->done_headers) {
     407                        $this->headers = '';
     408                        $this->done_headers = false;
     409                }
     410                $this->headers .= $headers;
     411
     412                if ($headers === "\r\n") {
     413                        $this->done_headers = true;
     414                }
     415                return strlen($headers);
     416        }
     417
     418        /**
     419         * Collect data as it's received
     420         *
     421         * @since 1.6.1
     422         *
     423         * @param resource $handle cURL resource
     424         * @param string $data Body data
     425         * @return integer Length of provided data
     426         */
     427        protected function stream_body($handle, $data) {
     428                $this->hooks->dispatch('request.progress', array($data, $this->response_bytes, $this->response_byte_limit));
     429                $data_length = strlen($data);
     430
     431                // Are we limiting the response size?
     432                if ($this->response_byte_limit) {
     433                        if ($this->response_bytes === $this->response_byte_limit) {
     434                                // Already at maximum, move on
     435                                return $data_length;
     436                        }
     437
     438                        if (($this->response_bytes + $data_length) > $this->response_byte_limit) {
     439                                // Limit the length
     440                                $limited_length = ($this->response_byte_limit - $this->response_bytes);
     441                                $data = substr($data, 0, $limited_length);
     442                        }
     443                }
     444
     445                if ($this->stream_handle) {
     446                        fwrite($this->stream_handle, $data);
     447                }
     448                else {
     449                        $this->response_data .= $data;
     450                }
     451
     452                $this->response_bytes += strlen($data);
     453                return $data_length;
     454        }
     455
     456        /**
     457         * Format a URL given GET data
     458         *
     459         * @param string $url
     460         * @param array|object $data Data to build query using, see {@see http://php.net/http_build_query}
     461         * @return string URL with data
     462         */
     463        protected static function format_get($url, $data) {
     464                if (!empty($data)) {
     465                        $url_parts = parse_url($url);
     466                        if (empty($url_parts['query'])) {
     467                                $query = $url_parts['query'] = '';
     468                        }
     469                        else {
     470                                $query = $url_parts['query'];
     471                        }
     472
     473                        $query .= '&' . http_build_query($data, null, '&');
     474                        $query = trim($query, '&');
     475
     476                        if (empty($url_parts['query'])) {
     477                                $url .= '?' . $query;
     478                        }
     479                        else {
     480                                $url = str_replace($url_parts['query'], $query, $url);
     481                        }
     482                }
     483                return $url;
     484        }
     485
     486        /**
     487         * Whether this transport is valid
     488         *
     489         * @codeCoverageIgnore
     490         * @return boolean True if the transport is valid, false otherwise.
     491         */
     492        public static function test($capabilities = array()) {
     493                if (!function_exists('curl_init') && !function_exists('curl_exec')) {
     494                        return false;
     495                }
     496
     497                // If needed, check that our installed curl version supports SSL
     498                if (isset($capabilities['ssl']) && $capabilities['ssl']) {
     499                        $curl_version = curl_version();
     500                        if (!(CURL_VERSION_SSL & $curl_version['features'])) {
     501                                return false;
     502                        }
     503                }
     504
     505                return true;
     506        }
     507}
  • src/wp-includes/Requests/Transport/cacert.pem

     
     1##
     2## ca-bundle.crt -- Bundle of CA Root Certificates
     3##
     4## Certificate data from Mozilla as of: Sat Dec 29 20:03:40 2012
     5##
     6## This is a bundle of X.509 certificates of public Certificate Authorities
     7## (CA). These were automatically extracted from Mozilla's root certificates
     8## file (certdata.txt).  This file can be found in the mozilla source tree:
     9## http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1
     10##
     11## It contains the certificates in PEM format and therefore
     12## can be directly used with curl / libcurl / php_curl, or with
     13## an Apache+mod_ssl webserver for SSL client authentication.
     14## Just configure this file as the SSLCACertificateFile.
     15##
     16
     17# @(#) $RCSfile: certdata.txt,v $ $Revision: 1.87 $ $Date: 2012/12/29 16:32:45 $
     18
     19EE Certification Centre Root CA
     20===============================
     21-----BEGIN CERTIFICATE-----
     22MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG
     23EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy
     24dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw
     25MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB
     26UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy
     27ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB
     28DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM
     29TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2
     30rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw
     3193X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN
     32P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T
     33AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ
     34MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF
     35BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj
     36xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM
     37lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u
     38uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU
     393j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM
     40dcGWxZ0=
     41-----END CERTIFICATE-----
     42
     43GTE CyberTrust Global Root
     44==========================
     45-----BEGIN CERTIFICATE-----
     46MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUg
     47Q29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLjEjMCEG
     48A1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEz
     49MjM1OTAwWjB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQL
     50Ex5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0
     51IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4u
     52sJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcql
     53HHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8FLztimQID
     54AQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMW
     55M4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OF
     56NMQkpw0PlZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/
     57-----END CERTIFICATE-----
     58
     59Thawte Server CA
     60================
     61-----BEGIN CERTIFICATE-----
     62MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT
     63DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs
     64dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UE
     65AxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5j
     66b20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNV
     67BAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29u
     68c3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcG
     69A1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0
     70ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl
     71/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg7
     721CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzAR
     73MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWDTSEwjsrZqG9J
     74GubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6eQNuozDJ0uW8NxuOzRAvZim+aKZuZ
     75GCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc=
     76-----END CERTIFICATE-----
     77
     78Thawte Premium Server CA
     79========================
     80-----BEGIN CERTIFICATE-----
     81MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkExFTATBgNVBAgT
     82DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs
     83dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UE
     84AxMYVGhhd3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZl
     85ckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYT
     86AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU
     87VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2
     88aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZ
     89cHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2
     90aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIh
     91Udib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/
     92qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAm
     93SCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUIhfzJATj/Tb7yFkJD57taRvvBxhEf
     948UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7t
     95UCemDaYj+bvLpgcUQg==
     96-----END CERTIFICATE-----
     97
     98Equifax Secure CA
     99=================
     100-----BEGIN CERTIFICATE-----
     101MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE
     102ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5
     103MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT
     104B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB
     105nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR
     106fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW
     1078Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG
     108A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE
     109CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG
     110A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS
     111spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB
     112Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961
     113zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB
     114BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95
     11570+sB3c4
     116-----END CERTIFICATE-----
     117
     118Digital Signature Trust Co. Global CA 1
     119=======================================
     120-----BEGIN CERTIFICATE-----
     121MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE
     122ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMTAeFw05ODEy
     123MTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs
     124IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUA
     125A4GLADCBhwKBgQCgbIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJE
     126NySZj9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlVSn5JTe2i
     127o74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo
     128BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0
     129dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw
     130IoAPMTk5ODEyMTAxODEwMjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQY
     131MBaAFGp5fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i+DAM
     132BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB
     133ACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lNQseSJqBcNJo4cvj9axY+IO6CizEq
     134kzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4
     135RbyhkwS7hp86W0N6w4pl
     136-----END CERTIFICATE-----
     137
     138Digital Signature Trust Co. Global CA 3
     139=======================================
     140-----BEGIN CERTIFICATE-----
     141MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE
     142ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMjAeFw05ODEy
     143MDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs
     144IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUA
     145A4GLADCBhwKBgQC/k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGOD
     146VvsoLeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3oTQPMx7JS
     147xhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo
     148BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0
     149dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw
     150IoAPMTk5ODEyMDkxOTE3MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQY
     151MBaAFB6CTShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5WzAM
     152BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB
     153AEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHRxdf0CiUPPXiBng+xZ8SQTGPdXqfi
     154up/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVLB3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1
     155mPnHfxsb1gYgAlihw6ID
     156-----END CERTIFICATE-----
     157
     158Verisign Class 3 Public Primary Certification Authority
     159=======================================================
     160-----BEGIN CERTIFICATE-----
     161MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx
     162FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5
     163IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow
     164XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz
     165IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
     166A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94
     167f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol
     168hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA
     169TxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah
     170WM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf
     171Tqj/ZA1k
     172-----END CERTIFICATE-----
     173
     174Verisign Class 3 Public Primary Certification Authority - G2
     175============================================================
     176-----BEGIN CERTIFICATE-----
     177MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT
     178MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy
     179eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
     180biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
     181dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT
     182MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy
     183eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
     184biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
     185dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO
     186FoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71
     187lSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB
     188MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT
     1891+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD
     190Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9
     191-----END CERTIFICATE-----
     192
     193GlobalSign Root CA
     194==================
     195-----BEGIN CERTIFICATE-----
     196MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx
     197GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds
     198b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV
     199BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD
     200VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa
     201DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc
     202THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb
     203Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP
     204c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX
     205gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
     206HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF
     207AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj
     208Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG
     209j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH
     210hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC
     211X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
     212-----END CERTIFICATE-----
     213
     214GlobalSign Root CA - R2
     215=======================
     216-----BEGIN CERTIFICATE-----
     217MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv
     218YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
     219bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
     220aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
     221bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6
     222ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp
     223s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN
     224S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL
     225TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C
     226ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E
     227FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i
     228YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN
     229BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp
     2309Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu
     23101yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7
     2329G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
     233TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
     234-----END CERTIFICATE-----
     235
     236ValiCert Class 1 VA
     237===================
     238-----BEGIN CERTIFICATE-----
     239MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp
     240b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
     241YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh
     242bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIy
     243MjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0
     244d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEg
     245UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0
     246LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA
     247A4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIi
     248GQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCm
     249DuJWBQ8YTfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwG
     250lN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8sogTLDAHkY7FkX
     251icnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPwnXS3qT6gpf+2SQMT2iLM7XGCK5nP
     252Orf1LXLI
     253-----END CERTIFICATE-----
     254
     255ValiCert Class 2 VA
     256===================
     257-----BEGIN CERTIFICATE-----
     258MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp
     259b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
     260YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh
     261bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw
     262MTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0
     263d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIg
     264UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0
     265LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA
     266A4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVC
     267CSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7Rf
     268ZHM047QSv4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZ
     269SWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZoDJJKPTEjlbV
     270UjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwCW/POuZ6lcg5Ktz885hZo+L7tdEy8
     271W9ViH0Pd
     272-----END CERTIFICATE-----
     273
     274RSA Root Certificate 1
     275======================
     276-----BEGIN CERTIFICATE-----
     277MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp
     278b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
     279YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh
     280bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw
     281MjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0
     282d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMg
     283UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0
     284LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA
     285A4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td
     2863zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89H
     287BFx1cQqYJJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs
     2883x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0WuPIqpsHEzXcjF
     289V9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/APhmcGcwTTYJBtYze4D1gCCAPRX5r
     290on+jjBXu
     291-----END CERTIFICATE-----
     292
     293Verisign Class 3 Public Primary Certification Authority - G3
     294============================================================
     295-----BEGIN CERTIFICATE-----
     296MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
     297UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
     298cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
     299IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
     300dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
     301CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
     302dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
     303cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg
     304Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
     305ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1
     306EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc
     307cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw
     308EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj
     309055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
     310ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f
     311j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
     312/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0
     313xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa
     314t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
     315-----END CERTIFICATE-----
     316
     317Verisign Class 4 Public Primary Certification Authority - G3
     318============================================================
     319-----BEGIN CERTIFICATE-----
     320MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
     321UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
     322cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
     323IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
     324dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
     325CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
     326dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
     327cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg
     328Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
     329ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS
     330tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM
     3318BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW
     332Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX
     333Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
     334j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt
     335mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm
     336fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd
     337RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG
     338UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg==
     339-----END CERTIFICATE-----
     340
     341Entrust.net Secure Server CA
     342============================
     343-----BEGIN CERTIFICATE-----
     344MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMCVVMxFDASBgNV
     345BAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkg
     346cmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRl
     347ZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhv
     348cml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIG
     349A1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBi
     350eSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1p
     351dGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0
     352aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQ
     353aO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5
     354gXpa0zf3wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcw
     355ggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHYpIHVMIHSMQsw
     356CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5l
     357dC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF
     358bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl
     359cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu
     360dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkw
     361NTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0Bow
     362HQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA
     363BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyN
     364Ewr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9
     365n9cd2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=
     366-----END CERTIFICATE-----
     367
     368Entrust.net Premium 2048 Secure Server CA
     369=========================================
     370-----BEGIN CERTIFICATE-----
     371MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u
     372ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp
     373bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV
     374BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx
     375NzUwNTFaFw0xOTEyMjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3
     376d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl
     377MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u
     378ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
     379MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL
     380Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr
     381hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW
     382nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi
     383VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo3QwcjARBglghkgBhvhC
     384AQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGAvtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdER
     385gL7YibkIozH5oSQJFrlwMB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0B
     386AQUFAAOCAQEAWUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo
     387oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQh7A6tcOdBTcS
     388o8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18f3v/rxzP5tsHrV7bhZ3QKw0z
     3892wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfNB/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjX
     390OP/swNlQ8C5LWK5Gb9Auw2DaclVyvUxFnmG6v4SBkgPR0ml8xQ==
     391-----END CERTIFICATE-----
     392
     393Baltimore CyberTrust Root
     394=========================
     395-----BEGIN CERTIFICATE-----
     396MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE
     397ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li
     398ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC
     399SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs
     400dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME
     401uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB
     402UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C
     403G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9
     404XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr
     405l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI
     406VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB
     407BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh
     408cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5
     409hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa
     410Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H
     411RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
     412-----END CERTIFICATE-----
     413
     414Equifax Secure Global eBusiness CA
     415==================================
     416-----BEGIN CERTIFICATE-----
     417MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
     418RXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNp
     419bmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMx
     420HDAaBgNVBAoTE0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEds
     421b2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRV
     422PEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzN
     423qfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxn
     424hcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j
     425BBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hs
     426MA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okEN
     427I7SS+RkAZ70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIY
     428NMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV
     429-----END CERTIFICATE-----
     430
     431Equifax Secure eBusiness CA 1
     432=============================
     433-----BEGIN CERTIFICATE-----
     434MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
     435RXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENB
     436LTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UE
     437ChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNz
     438IENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ
     4391MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4a
     440IZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBk
     441MBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4MlIR21kW
     442Nl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQF
     443AAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5
     444lSE/9dR+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+
     445KpYrtWKmpj29f5JZzVoqgrI3eQ==
     446-----END CERTIFICATE-----
     447
     448Equifax Secure eBusiness CA 2
     449=============================
     450-----BEGIN CERTIFICATE-----
     451MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEXMBUGA1UE
     452ChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0y
     453MB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoT
     454DkVxdWlmYXggU2VjdXJlMSYwJAYDVQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCB
     455nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn
     4562Z0GvxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/BPO3QSQ5
     457BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0CAwEAAaOCAQkwggEFMHAG
     458A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUx
     459JjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoG
     460A1UdEAQTMBGBDzIwMTkwNjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9e
     461uSBIplBqy/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQFMAMB
     462Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAAyGgq3oThr1
     463jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia
     46478O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUm
     465V+GRMOrN
     466-----END CERTIFICATE-----
     467
     468AddTrust Low-Value Services Root
     469================================
     470-----BEGIN CERTIFICATE-----
     471MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
     472QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU
     473cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw
     474CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO
     475ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB
     476AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6
     47754eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr
     478oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1
     479Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui
     480GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w
     481HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD
     482AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT
     483RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw
     484HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt
     485ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph
     486iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY
     487eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr
     488mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj
     489ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk=
     490-----END CERTIFICATE-----
     491
     492AddTrust External Root
     493======================
     494-----BEGIN CERTIFICATE-----
     495MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
     496QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD
     497VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw
     498NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU
     499cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg
     500Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821
     501+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw
     502Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo
     503aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy
     5042xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7
     5057+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P
     506BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL
     507VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk
     508VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB
     509IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl
     510j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
     5116wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355
     512e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u
     513G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
     514-----END CERTIFICATE-----
     515
     516AddTrust Public Services Root
     517=============================
     518-----BEGIN CERTIFICATE-----
     519MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
     520QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU
     521cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ
     522BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l
     523dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF
     524AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu
     525nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i
     526d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG
     527Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw
     528HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G
     529A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
     530/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux
     531FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G
     532A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4
     533JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL
     534+YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao
     535GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9
     536Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H
     537EufOX1362KqxMy3ZdvJOOjMMK7MtkAY=
     538-----END CERTIFICATE-----
     539
     540AddTrust Qualified Certificates Root
     541====================================
     542-----BEGIN CERTIFICATE-----
     543MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
     544QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU
     545cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx
     546CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ
     547IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG
     5489w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx
     54964r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3
     550KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o
     551L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR
     552wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU
     553MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/
     554BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE
     555BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y
     556azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD
     557ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG
     558GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X
     559dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze
     560RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB
     561iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE=
     562-----END CERTIFICATE-----
     563
     564Entrust Root Certification Authority
     565====================================
     566-----BEGIN CERTIFICATE-----
     567MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV
     568BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw
     569b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG
     570A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0
     571MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu
     572MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu
     573Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v
     574dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
     575ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz
     576A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww
     577Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68
     578j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN
     579rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw
     580DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1
     581MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH
     582hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
     583A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM
     584Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa
     585v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS
     586W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0
     587tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8
     588-----END CERTIFICATE-----
     589
     590RSA Security 2048 v3
     591====================
     592-----BEGIN CERTIFICATE-----
     593MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK
     594ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy
     595MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb
     596BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
     597AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7
     598Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb
     599WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH
     600KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP
     601+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/
     602MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E
     603FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY
     604v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj
     6050aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj
     606VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395
     607nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA
     608pKnXwiJPZ9d37CAFYd4=
     609-----END CERTIFICATE-----
     610
     611GeoTrust Global CA
     612==================
     613-----BEGIN CERTIFICATE-----
     614MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK
     615Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw
     616MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
     617LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
     618CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo
     619BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet
     6208u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc
     621T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU
     622vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD
     623AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk
     624DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q
     625zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4
     626d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2
     627mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p
     628XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm
     629Mw==
     630-----END CERTIFICATE-----
     631
     632GeoTrust Global CA 2
     633====================
     634-----BEGIN CERTIFICATE-----
     635MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
     636R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw
     637MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
     638LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
     639ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/
     640NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k
     641LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA
     642Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b
     643HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF
     644MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH
     645K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7
     646srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh
     647ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL
     648OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC
     649x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF
     650H4z1Ir+rzoPz4iIprn2DQKi6bA==
     651-----END CERTIFICATE-----
     652
     653GeoTrust Universal CA
     654=====================
     655-----BEGIN CERTIFICATE-----
     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
     680P/rmMuGNG2+k5o7Y+SlIis5z/iw=
     681-----END CERTIFICATE-----
     682
     683GeoTrust Universal CA 2
     684=======================
     685-----BEGIN CERTIFICATE-----
     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
     710X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS
     711-----END CERTIFICATE-----
     712
     713America Online Root Certification Authority 1
     714=============================================
     715-----BEGIN CERTIFICATE-----
     716MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
     717QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp
     718Y2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkG
     719A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg
     720T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQAD
     721ggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CG
     722v2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44z
     723DyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145LcxVR5lu9Rh
     724sCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP
     7258c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0T
     726AQH/BAUwAwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Z
     727o/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQB8itEf
     728GDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkFZu90821fnZmv9ov761KyBZiibyrF
     729VL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft
     7303OJvx8Fi8eNy1gTIdGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g
     731Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds
     732sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7
     733-----END CERTIFICATE-----
     734
     735America Online Root Certification Authority 2
     736=============================================
     737-----BEGIN CERTIFICATE-----
     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
     763cX/9XhmgD0uRuMRUvAawRY8mkaKO/qk=
     764-----END CERTIFICATE-----
     765
     766Visa eCommerce Root
     767===================
     768-----BEGIN CERTIFICATE-----
     769MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG
     770EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug
     771QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2
     772WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm
     773VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv
     774bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL
     775F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b
     776RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0
     777TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI
     778/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs
     779GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG
     780MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc
     781CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW
     782YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz
     783zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu
     784YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt
     785398znM/jra6O1I7mT1GvFpLgXPYHDw==
     786-----END CERTIFICATE-----
     787
     788Certum Root CA
     789==============
     790-----BEGIN CERTIFICATE-----
     791MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK
     792ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla
     793Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u
     794by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x
     795wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL
     796kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ
     79789eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K
     798Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P
     799NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq
     800hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+
     801GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg
     802GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/
     8030YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS
     804qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw==
     805-----END CERTIFICATE-----
     806
     807Comodo AAA Services root
     808========================
     809-----BEGIN CERTIFICATE-----
     810MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
     811R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
     812TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw
     813MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl
     814c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV
     815BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
     816ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG
     817C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs
     818i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW
     819Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH
     820Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK
     821Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f
     822BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl
     823cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz
     824LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm
     8257l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
     826Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z
     8278VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C
     82812yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
     829-----END CERTIFICATE-----
     830
     831Comodo Secure Services root
     832===========================
     833-----BEGIN CERTIFICATE-----
     834MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
     835R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
     836TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw
     837MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu
     838Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi
     839BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP
     840ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP
     8419nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc
     842rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC
     843oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V
     844p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E
     845FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w
     846gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj
     847YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm
     848aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm
     8494J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj
     850Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL
     851DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw
     852pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H
     853RR3B7Hzs/Sk=
     854-----END CERTIFICATE-----
     855
     856Comodo Trusted Services root
     857============================
     858-----BEGIN CERTIFICATE-----
     859MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
     860R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
     861TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw
     862MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h
     863bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw
     864IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC
     865AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7
     8663TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y
     867/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6
     868juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS
     869ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud
     870DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
     871/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp
     872ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl
     873cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw
     874uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32
     875pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA
     876BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l
     877R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O
     8789y5Xt5hwXsjEeLBi
     879-----END CERTIFICATE-----
     880
     881QuoVadis Root CA
     882================
     883-----BEGIN CERTIFICATE-----
     884MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE
     885ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
     886eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz
     887MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp
     888cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD
     889EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF
     890AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk
     891J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL
     892F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL
     893YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen
     894AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w
     895PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y
     896ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7
     897MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj
     898YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs
     899ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh
     900Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW
     901Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu
     902BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw
     903FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0
     904aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6
     905tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo
     906fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul
     907LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x
     908gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi
     9095upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi
     9105nrQNiOKSnQ2+Q==
     911-----END CERTIFICATE-----
     912
     913QuoVadis Root CA 2
     914==================
     915-----BEGIN CERTIFICATE-----
     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
     942-----END CERTIFICATE-----
     943
     944QuoVadis Root CA 3
     945==================
     946-----BEGIN CERTIFICATE-----
     947MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
     948EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx
     949OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
     950aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
     951DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg
     952DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij
     953KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K
     954DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv
     955BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp
     956p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8
     957nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX
     958MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM
     959Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz
     960uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT
     961BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj
     962YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0
     963aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB
     964BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD
     965VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4
     966ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE
     967AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV
     968qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s
     969hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z
     970POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2
     971Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp
     9728kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC
     973bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu
     974g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p
     975vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr
     976qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto=
     977-----END CERTIFICATE-----
     978
     979Security Communication Root CA
     980==============================
     981-----BEGIN CERTIFICATE-----
     982MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
     983U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
     984HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
     985U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
     986ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw
     9878yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM
     988DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX
     9895HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd
     990DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2
     991JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw
     992DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g
     9930dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a
     994mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ
     995s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ
     9966rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi
     997FL39vmwLAw==
     998-----END CERTIFICATE-----
     999
     1000Sonera Class 2 Root CA
     1001======================
     1002-----BEGIN CERTIFICATE-----
     1003MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG
     1004U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw
     1005NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh
     1006IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3
     1007/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT
     1008dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG
     1009f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P
     1010tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH
     1011nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT
     1012XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt
     10130jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI
     1014cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph
     1015Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx
     1016EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH
     1017llpwrN9M
     1018-----END CERTIFICATE-----
     1019
     1020Staat der Nederlanden Root CA
     1021=============================
     1022-----BEGIN CERTIFICATE-----
     1023MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE
     1024ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g
     1025Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w
     1026HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh
     1027bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt
     1028vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P
     1029jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca
     1030C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth
     1031vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6
     103222r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV
     1033HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v
     1034dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN
     1035BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR
     1036EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw
     1037MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y
     1038nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR
     1039iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw==
     1040-----END CERTIFICATE-----
     1041
     1042TDC Internet Root CA
     1043====================
     1044-----BEGIN CERTIFICATE-----
     1045MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJESzEVMBMGA1UE
     1046ChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTAeFw0wMTA0MDUx
     1047NjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNVBAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJu
     1048ZXQxHTAbBgNVBAsTFFREQyBJbnRlcm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
     1049MIIBCgKCAQEAxLhAvJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20j
     1050xsNuZp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a0vnRrEvL
     1051znWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc14izbSysseLlJ28TQx5yc
     10525IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGNeGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6
     1053otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcDR0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZI
     1054AYb4QgEBBAQDAgAHMGUGA1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMM
     1055VERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxMEQ1JM
     1056MTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3WjALBgNVHQ8EBAMC
     1057AQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAwHQYDVR0OBBYEFGxkAcf9hW2syNqe
     1058UAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJKoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0G
     1059CSqGSIb3DQEBBQUAA4IBAQBOQ8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540m
     1060gwV5dOy0uaOXwTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+
     10612ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm899qNLPg7kbWzb
     1062O0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0jUNAE4z9mQNUecYu6oah9jrU
     1063Cbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38aQNiuJkFBT1reBK9sG9l
     1064-----END CERTIFICATE-----
     1065
     1066UTN DATACorp SGC Root CA
     1067========================
     1068-----BEGIN CERTIFICATE-----
     1069MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UE
     1070BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
     1071IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZ
     1072BgNVBAMTElVUTiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBa
     1073MIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w
     1074HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy
     1075dXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOC
     1076AQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ys
     1077raP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlo
     1078wHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA
     10799P4yPykqlXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv
     108033i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4GrMIGoMAsGA1Ud
     1081DwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRTMtGzz3/64PGgXYVOktKeRR20TzA9
     1082BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dD
     1083LmNybDAqBgNVHSUEIzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3
     1084DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft
     1085Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0
     1086I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXx
     1087EZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwP
     1088DPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI
     1089-----END CERTIFICATE-----
     1090
     1091UTN USERFirst Hardware Root CA
     1092==============================
     1093-----BEGIN CERTIFICATE-----
     1094MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE
     1095BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
     1096IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd
     1097BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx
     1098OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0
     1099eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz
     1100ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3
     1101DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI
     1102wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd
     1103tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8
     1104i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf
     1105Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw
     1106gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF
     1107lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF
     1108UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF
     1109BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM
     1110//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW
     1111XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2
     1112lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn
     1113iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67
     1114nfhmqA==
     1115-----END CERTIFICATE-----
     1116
     1117Camerfirma Chambers of Commerce Root
     1118====================================
     1119-----BEGIN CERTIFICATE-----
     1120MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe
     1121QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i
     1122ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx
     1123NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp
     1124cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn
     1125MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC
     1126AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU
     1127xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH
     1128NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW
     1129DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV
     1130d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud
     1131EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v
     1132cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P
     1133AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh
     1134bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD
     1135VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz
     1136aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi
     1137fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD
     1138L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN
     1139UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n
     1140ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1
     1141erfutGWaIZDgqtCYvDi1czyL+Nw=
     1142-----END CERTIFICATE-----
     1143
     1144Camerfirma Global Chambersign Root
     1145==================================
     1146-----BEGIN CERTIFICATE-----
     1147MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe
     1148QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i
     1149ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx
     1150NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt
     1151YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg
     1152MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw
     1153ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J
     11541tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O
     1155by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl
     11566DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c
     11578lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/
     1158BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j
     1159aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B
     1160Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj
     1161aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y
     1162ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh
     1163bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA
     1164PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y
     1165gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ
     1166PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4
     1167IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes
     1168t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A==
     1169-----END CERTIFICATE-----
     1170
     1171NetLock Notary (Class A) Root
     1172=============================
     1173-----BEGIN CERTIFICATE-----
     1174MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI
     1175EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6
     1176dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j
     1177ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX
     1178DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH
     1179EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD
     1180VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz
     1181cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM
     1182D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ
     1183z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC
     1184/tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7
     1185tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6
     11864sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG
     1187A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC
     1188Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv
     1189bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu
     1190IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn
     1191LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0
     1192ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz
     1193IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh
     1194IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu
     1195b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh
     1196bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg
     1197Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp
     1198bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5
     1199ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP
     1200ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB
     1201CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr
     1202KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM
     12038CgHrTwXZoi1/baI
     1204-----END CERTIFICATE-----
     1205
     1206NetLock Business (Class B) Root
     1207===============================
     1208-----BEGIN CERTIFICATE-----
     1209MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUxETAPBgNVBAcT
     1210CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV
     1211BAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQDEylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikg
     1212VGFudXNpdHZhbnlraWFkbzAeFw05OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYD
     1213VQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRv
     1214bnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5ldExvY2sg
     1215VXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB
     1216iQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xKgZjupNTKihe5In+DCnVMm8Bp2GQ5o+2S
     1217o/1bXHQawEfKOml2mrriRBf8TKPV/riXiK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr
     12181nGTLbO/CVRY7QbrqHvcQ7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV
     1219HQ8BAf8EBAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZ
     1220RUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRh
     1221dGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQuIEEgaGl0
     1222ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRv
     1223c2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUg
     1224YXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh
     1225c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBz
     1226Oi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6ZXNA
     1227bmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhl
     1228IHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2
     1229YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBj
     1230cHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06sPgzTEdM
     123143WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXan3BukxowOR0w2y7jfLKR
     1232stE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKSNitjrFgBazMpUIaD8QFI
     1233-----END CERTIFICATE-----
     1234
     1235NetLock Express (Class C) Root
     1236==============================
     1237-----BEGIN CERTIFICATE-----
     1238MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUxETAPBgNVBAcT
     1239CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV
     1240BAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQDEytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBD
     1241KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJ
     1242BgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6
     1243dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMrTmV0TG9j
     1244ayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzANBgkqhkiG9w0BAQEFAAOB
     1245jQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNAOoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3Z
     1246W3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63
     1247euyucYT2BDMIJTLrdKwWRMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQw
     1248DgYDVR0PAQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEWggJN
     1249RklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0YWxhbm9zIFN6b2xn
     1250YWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBB
     1251IGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBOZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1i
     1252aXp0b3NpdGFzYSB2ZWRpLiBBIGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0
     1253ZWxlIGF6IGVsb2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs
     1254ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25sYXBqYW4gYSBo
     1255dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kga2VyaGV0byBheiBlbGxlbm9y
     1256emVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4gSU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5k
     1257IHRoZSB1c2Ugb2YgdGhpcyBjZXJ0aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQ
     1258UyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwg
     1259YXQgY3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmYta3UzbM2
     1260xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2gpO0u9f38vf5NNwgMvOOW
     1261gyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4Fp1hBWeAyNDYpQcCNJgEjTME1A==
     1262-----END CERTIFICATE-----
     1263
     1264XRamp Global CA Root
     1265====================
     1266-----BEGIN CERTIFICATE-----
     1267MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE
     1268BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj
     1269dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB
     1270dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx
     1271HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg
     1272U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
     1273dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu
     1274IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx
     1275foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE
     1276zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs
     1277AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry
     1278xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
     1279EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap
     1280oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC
     1281AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc
     1282/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt
     1283qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n
     1284nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz
     12858LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw=
     1286-----END CERTIFICATE-----
     1287
     1288Go Daddy Class 2 CA
     1289===================
     1290-----BEGIN CERTIFICATE-----
     1291MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY
     1292VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp
     1293ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG
     1294A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g
     1295RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD
     1296ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv
     12972vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32
     1298qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j
     1299YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY
     1300vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O
     1301BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o
     1302atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu
     1303MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG
     1304A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim
     1305PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt
     1306I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
     1307HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI
     1308Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b
     1309vZ8=
     1310-----END CERTIFICATE-----
     1311
     1312Starfield Class 2 CA
     1313====================
     1314-----BEGIN CERTIFICATE-----
     1315MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc
     1316U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg
     1317Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo
     1318MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG
     1319A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG
     1320SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY
     1321bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ
     1322JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm
     1323epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN
     1324F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF
     1325MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f
     1326hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo
     1327bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g
     1328QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs
     1329afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM
     1330PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl
     1331xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD
     1332KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3
     1333QBFGmh95DmK/D5fs4C8fF5Q=
     1334-----END CERTIFICATE-----
     1335
     1336StartCom Certification Authority
     1337================================
     1338-----BEGIN CERTIFICATE-----
     1339MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
     1340U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu
     1341ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0
     1342NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk
     1343LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg
     1344U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
     1345ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y
     1346o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/
     1347Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d
     1348eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt
     13492PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z
     13506+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ
     1351osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/
     1352untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc
     1353UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT
     135437uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE
     1355FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0
     1356Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj
     1357YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH
     1358AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw
     1359Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg
     1360U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5
     1361LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl
     1362cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh
     1363cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT
     1364dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC
     1365AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh
     13663TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm
     1367vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk
     1368fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3
     1369fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ
     1370EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq
     1371yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl
     13721njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/
     1373lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro
     1374g14=
     1375-----END CERTIFICATE-----
     1376
     1377Taiwan GRCA
     1378===========
     1379-----BEGIN CERTIFICATE-----
     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
     1405-----END CERTIFICATE-----
     1406
     1407Firmaprofesional Root CA
     1408========================
     1409-----BEGIN CERTIFICATE-----
     1410MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMxIjAgBgNVBAcT
     1411GUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1dG9yaWRhZCBkZSBDZXJ0aWZp
     1412Y2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FA
     1413ZmlybWFwcm9mZXNpb25hbC5jb20wHhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTEL
     1414MAkGA1UEBhMCRVMxIjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMT
     1415OUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2
     1416ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20wggEiMA0GCSqGSIb3DQEB
     1417AQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5uCp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5V
     1418j1H5WuretXDE7aTt/6MNbg9kUDGvASdYrv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJH
     1419lShbz++AbOCQl4oBPB3zhxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf
     14203H5idPayBQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcLiam8
     1421NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcbAgMBAAGjgZ8wgZww
     1422KgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lvbmFsLmNvbTASBgNVHRMBAf8ECDAG
     1423AQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1Ud
     1424DwEB/wQEAwIBBjAdBgNVHQ4EFgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQAD
     1425ggEBAEdz/o0nVPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq
     1426u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36mhoEyIwOdyPdf
     1427wUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzflZKG+TQyTmAyX9odtsz/ny4Cm
     14287YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBpQWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YG
     1429VM+h4k0460tQtcsm9MracEpqoeJ5quGnM/b9Sh/22WA=
     1430-----END CERTIFICATE-----
     1431
     1432Wells Fargo Root CA
     1433===================
     1434-----BEGIN CERTIFICATE-----
     1435MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMCVVMxFDASBgNV
     1436BAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhv
     1437cml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN
     1438MDAxMDExMTY0MTI4WhcNMjEwMTE0MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dl
     1439bGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEv
     1440MC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG
     1441SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n135zHCLielTWi5MbqNQ1mX
     1442x3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHESxP9cMIlrCL1dQu3U+SlK93OvRw6esP3
     1443E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4OJgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5
     1444OEL8pahbSCOz6+MlsoCultQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4j
     1445sNtlAHCEAQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMBAAGj
     1446YTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcBCzAyMDAGCCsGAQUF
     1447BwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRwb2xpY3kwDQYJKoZIhvcNAQEFBQAD
     1448ggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrv
     1449m+0fazbuSCUlFLZWohDo7qd/0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0R
     1450OhPs7fpvcmR7nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx
     1451x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ33ZwmVxwQ023
     1452tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s=
     1453-----END CERTIFICATE-----
     1454
     1455Swisscom Root CA 1
     1456==================
     1457-----BEGIN CERTIFICATE-----
     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
     1484NY6E0F/6MBr1mmz0DlP5OlvRHA==
     1485-----END CERTIFICATE-----
     1486
     1487DigiCert Assured ID Root CA
     1488===========================
     1489-----BEGIN CERTIFICATE-----
     1490MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG
     1491EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw
     1492IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx
     1493MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
     1494ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew
     1495ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO
     14969SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy
     1497UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW
     1498/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy
     1499oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf
     1500GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF
     150166Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq
     1502hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc
     1503EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn
     1504SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i
     15058b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
     1506+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
     1507-----END CERTIFICATE-----
     1508
     1509DigiCert Global Root CA
     1510=======================
     1511-----BEGIN CERTIFICATE-----
     1512MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG
     1513EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw
     1514HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw
     1515MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
     1516dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq
     1517hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn
     1518TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5
     1519BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H
     15204idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y
     15217vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB
     1522o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm
     15238KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF
     1524BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr
     1525EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt
     1526tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886
     1527UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
     1528CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
     1529-----END CERTIFICATE-----
     1530
     1531DigiCert High Assurance EV Root CA
     1532==================================
     1533-----BEGIN CERTIFICATE-----
     1534MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG
     1535EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw
     1536KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw
     1537MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ
     1538MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu
     1539Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t
     1540Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS
     1541OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3
     1542MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ
     1543NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe
     1544h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB
     1545Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY
     1546JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ
     1547V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp
     1548myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK
     1549mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
     1550vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K
     1551-----END CERTIFICATE-----
     1552
     1553Certplus Class 2 Primary CA
     1554===========================
     1555-----BEGIN CERTIFICATE-----
     1556MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE
     1557BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN
     1558OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy
     1559dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP
     1560ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR
     15615aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ
     1562Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO
     1563YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e
     1564e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME
     1565CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ
     1566YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t
     1567L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD
     1568P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R
     1569TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+
     15707UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW
     1571//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7
     1572l7+ijrRU
     1573-----END CERTIFICATE-----
     1574
     1575DST Root CA X3
     1576==============
     1577-----BEGIN CERTIFICATE-----
     1578MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK
     1579ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X
     1580DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1
     1581cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD
     1582ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT
     1583rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9
     1584UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy
     1585xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d
     1586utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T
     1587AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ
     1588MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug
     1589dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE
     1590GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw
     1591RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS
     1592fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
     1593-----END CERTIFICATE-----
     1594
     1595DST ACES CA X6
     1596==============
     1597-----BEGIN CERTIFICATE-----
     1598MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG
     1599EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT
     1600MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha
     1601MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE
     1602CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC
     1603AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI
     1604DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa
     1605pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow
     1606GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy
     1607MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud
     1608EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu
     1609Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy
     1610dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU
     1611CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2
     16125FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t
     1613Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq
     1614nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs
     1615vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3
     1616oKfN5XozNmr6mis=
     1617-----END CERTIFICATE-----
     1618
     1619TURKTRUST Certificate Services Provider Root 1
     1620==============================================
     1621-----BEGIN CERTIFICATE-----
     1622MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOcUktUUlVTVCBF
     1623bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGDAJUUjEP
     1624MA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykgMjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0
     1625acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMx
     1626MDI3MTdaFw0xNTAzMjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsg
     1627U2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYDVQQHDAZB
     1628TktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBC
     1629aWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOC
     1630AQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GX
     1631yGl8hMW0kWxsE2qkVa2kheiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8i
     1632Si9BB35JYbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5CurKZ
     16338y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1JuTm5Rh8i27fbMx4
     1634W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51b0dewQIDAQABoxAwDjAMBgNVHRME
     1635BTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46
     1636sWrv7/hg0Uw2ZkUd82YCdAR7kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxE
     1637q8Sn5RTOPEFhfEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy
     1638B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdAaLX/7KfS0zgY
     1639nNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKSRGQDJereW26fyfJOrN3H
     1640-----END CERTIFICATE-----
     1641
     1642TURKTRUST Certificate Services Provider Root 2
     1643==============================================
     1644-----BEGIN CERTIFICATE-----
     1645MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBF
     1646bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP
     1647MA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg
     1648QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcN
     1649MDUxMTA3MTAwNzU3WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVr
     1650dHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0G
     1651A1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls
     1652acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwggEiMA0G
     1653CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqe
     1654LCDe2JAOCtFp0if7qnefJ1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKI
     1655x+XlZEdhR3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJQv2g
     1656QrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGXJHpsmxcPbe9TmJEr
     16575A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1pzpwACPI2/z7woQ8arBT9pmAPAgMB
     1658AAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58SFq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8G
     1659A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/ntt
     1660Rbj2hWyfIvwqECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4
     1661Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFzgw2lGh1uEpJ+
     1662hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotHuFEJjOp9zYhys2AzsfAKRO8P
     16639Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LSy3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5
     1664UrbnBEI=
     1665-----END CERTIFICATE-----
     1666
     1667SwissSign Gold CA - G2
     1668======================
     1669-----BEGIN CERTIFICATE-----
     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
     1696-----END CERTIFICATE-----
     1697
     1698SwissSign Silver CA - G2
     1699========================
     1700-----BEGIN CERTIFICATE-----
     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
     1727-----END CERTIFICATE-----
     1728
     1729GeoTrust Primary Certification Authority
     1730========================================
     1731-----BEGIN CERTIFICATE-----
     1732MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG
     1733EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD
     1734ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx
     1735CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ
     1736cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
     1737CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN
     1738b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9
     1739nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge
     1740RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt
     1741tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
     1742AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI
     1743hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K
     1744Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN
     1745NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa
     1746Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG
     17471riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=
     1748-----END CERTIFICATE-----
     1749
     1750thawte Primary Root CA
     1751======================
     1752-----BEGIN CERTIFICATE-----
     1753MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE
     1754BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
     1755aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
     1756cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3
     1757MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg
     1758SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv
     1759KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT
     1760FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs
     1761oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ
     17621CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc
     1763q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K
     1764aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p
     1765afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD
     1766VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF
     1767AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE
     1768uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
     1769xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89
     1770jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH
     1771z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA==
     1772-----END CERTIFICATE-----
     1773
     1774VeriSign Class 3 Public Primary Certification Authority - G5
     1775============================================================
     1776-----BEGIN CERTIFICATE-----
     1777MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
     1778BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
     1779ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
     1780IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp
     1781ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB
     1782yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln
     1783biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh
     1784dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt
     1785YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
     1786ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz
     1787j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD
     1788Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/
     1789Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r
     1790fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/
     1791BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv
     1792Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
     1793aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG
     1794SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+
     1795X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE
     1796KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC
     1797Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE
     1798ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
     1799-----END CERTIFICATE-----
     1800
     1801SecureTrust CA
     1802==============
     1803-----BEGIN CERTIFICATE-----
     1804MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG
     1805EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy
     1806dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe
     1807BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC
     1808ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX
     1809OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t
     1810DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH
     1811GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b
     181201k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH
     1813ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/
     1814BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj
     1815aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
     1816KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu
     1817SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf
     1818mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ
     1819nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR
     18203ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=
     1821-----END CERTIFICATE-----
     1822
     1823Secure Global CA
     1824================
     1825-----BEGIN CERTIFICATE-----
     1826MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG
     1827EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH
     1828bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg
     1829MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg
     1830Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx
     1831YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ
     1832bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g
     18338NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV
     1834HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi
     18350XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
     1836EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn
     1837oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA
     1838MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+
     1839OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn
     1840CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5
     18413CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc
     1842f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW
     1843-----END CERTIFICATE-----
     1844
     1845COMODO Certification Authority
     1846==============================
     1847-----BEGIN CERTIFICATE-----
     1848MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE
     1849BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG
     1850A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1
     1851dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb
     1852MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD
     1853T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
     1854MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH
     1855+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww
     1856xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV
     18574EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA
     18581KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI
     1859rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E
     1860BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k
     1861b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC
     1862AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP
     1863OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
     1864RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc
     1865IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN
     1866+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ==
     1867-----END CERTIFICATE-----
     1868
     1869Network Solutions Certificate Authority
     1870=======================================
     1871-----BEGIN CERTIFICATE-----
     1872MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG
     1873EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr
     1874IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx
     1875MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
     1876MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
     1877CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx
     1878jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT
     1879aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT
     1880crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc
     1881/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB
     1882AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP
     1883BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv
     1884bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA
     1885A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q
     18864LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/
     1887GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv
     1888wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD
     1889ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
     1890-----END CERTIFICATE-----
     1891
     1892WellsSecure Public Root Certificate Authority
     1893=============================================
     1894-----BEGIN CERTIFICATE-----
     1895MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM
     1896F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw
     1897NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN
     1898MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl
     1899bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD
     1900VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
     1901CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1
     1902iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13
     1903i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8
     1904bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB
     1905K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB
     1906AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu
     1907cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm
     1908lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB
     1909i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww
     1910GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg
     1911Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI
     1912K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0
     1913bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj
     1914qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es
     1915E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ
     1916tylv2G0xffX8oRAHh84vWdw+WNs=
     1917-----END CERTIFICATE-----
     1918
     1919COMODO ECC Certification Authority
     1920==================================
     1921-----BEGIN CERTIFICATE-----
     1922MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC
     1923R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE
     1924ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB
     1925dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix
     1926GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR
     1927Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo
     1928b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X
     19294QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni
     1930wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E
     1931BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG
     1932FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA
     1933U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
     1934-----END CERTIFICATE-----
     1935
     1936IGC/A
     1937=====
     1938-----BEGIN CERTIFICATE-----
     1939MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD
     1940VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE
     1941Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy
     1942MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI
     1943EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT
     1944STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB
     1945IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2
     1946TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW
     1947So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy
     1948HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd
     1949frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ
     1950tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB
     1951egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC
     1952iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK
     1953q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q
     1954MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg
     1955Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI
     1956lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF
     19570mBWWg==
     1958-----END CERTIFICATE-----
     1959
     1960Security Communication EV RootCA1
     1961=================================
     1962-----BEGIN CERTIFICATE-----
     1963MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
     1964U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh
     1965dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE
     1966BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl
     1967Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
     1968AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO
     1969/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX
     1970WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z
     1971ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4
     1972bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK
     19739U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG
     1974SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm
     1975iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG
     1976Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW
     1977mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW
     1978T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490
     1979-----END CERTIFICATE-----
     1980
     1981OISTE WISeKey Global Root GA CA
     1982===============================
     1983-----BEGIN CERTIFICATE-----
     1984MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE
     1985BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG
     1986A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH
     1987bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD
     1988VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw
     1989IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5
     1990IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9
     1991Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg
     1992Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD
     1993d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ
     1994/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R
     1995LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw
     1996AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
     1997KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm
     1998MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4
     1999+vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa
     2000hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY
     2001okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0=
     2002-----END CERTIFICATE-----
     2003
     2004Microsec e-Szigno Root CA
     2005=========================
     2006-----BEGIN CERTIFICATE-----
     2007MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE
     2008BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL
     2009EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0
     2010MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz
     2011dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT
     2012GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
     2013AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG
     2014d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N
     2015oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc
     2016QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ
     2017PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb
     2018MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG
     2019IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD
     2020VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3
     2021LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A
     2022dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn
     2023AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA
     20244QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg
     2025AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA
     2026egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6
     2027Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO
     2028PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv
     2029c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h
     2030cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw
     2031IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT
     2032WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV
     2033MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER
     2034MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp
     2035Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal
     2036HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT
     2037nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE
     2038aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a
     203986g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK
     2040yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB
     2041S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU=
     2042-----END CERTIFICATE-----
     2043
     2044Certigna
     2045========
     2046-----BEGIN CERTIFICATE-----
     2047MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw
     2048EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3
     2049MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI
     2050Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q
     2051XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH
     2052GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p
     2053ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg
     2054DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf
     2055Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ
     2056tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ
     2057BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J
     2058SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA
     2059hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+
     2060ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu
     2061PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY
     20621gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw
     2063WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==
     2064-----END CERTIFICATE-----
     2065
     2066AC Ra\xC3\xADz Certic\xC3\xA1mara S.A.
     2067======================================
     2068-----BEGIN CERTIFICATE-----
     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
     2098-----END CERTIFICATE-----
     2099
     2100TC TrustCenter Class 2 CA II
     2101============================
     2102-----BEGIN CERTIFICATE-----
     2103MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC
     2104REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy
     2105IENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYw
     2106MTEyMTQzODQzWhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1
     2107c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UE
     2108AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
     2109AQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jftMjWQ+nEdVl//OEd+DFw
     2110IxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKguNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2
     2111xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2JXjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQ
     2112Xa7pIXSSTYtZgo+U4+lK8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7u
     2113SNQZu+995OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1UdEwEB
     2114/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3kUrL84J6E1wIqzCB
     21157QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90
     2116Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU
     2117cnVzdENlbnRlciUyMENsYXNzJTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i
     2118SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u
     2119TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iSGNn3Bzn1LL4G
     2120dXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprtZjluS5TmVfwLG4t3wVMTZonZ
     2121KNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8au0WOB9/WIFaGusyiC2y8zl3gK9etmF1Kdsj
     2122TYjKUCjLhdLTEKJZbtOTVAB6okaVhgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kP
     2123JOzHdiEoZa5X6AeIdUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfk
     2124vQ==
     2125-----END CERTIFICATE-----
     2126
     2127TC TrustCenter Class 3 CA II
     2128============================
     2129-----BEGIN CERTIFICATE-----
     2130MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC
     2131REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy
     2132IENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYw
     2133MTEyMTQ0MTU3WhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1
     2134c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UE
     2135AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
     2136AQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJWHt4bNwcwIi9v8Qbxq63W
     2137yKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+QVl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo
     21386SI7dYnWRBpl8huXJh0obazovVkdKyT21oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZ
     2139uV3bOx4a+9P/FRQI2AlqukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk
     21402ZyqBwi1Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1UdEwEB
     2141/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NXXAek0CSnwPIA1DCB
     21427QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90
     2143Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU
     2144cnVzdENlbnRlciUyMENsYXNzJTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i
     2145SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u
     2146TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlNirTzwppVMXzE
     2147O2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8TtXqluJucsG7Kv5sbviRmEb8
     2148yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9
     2149IJqDnxrcOfHFcqMRA/07QlIp2+gB95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal
     2150092Y+tTmBvTwtiBjS+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc
     21515A==
     2152-----END CERTIFICATE-----
     2153
     2154TC TrustCenter Universal CA I
     2155=============================
     2156-----BEGIN CERTIFICATE-----
     2157MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTELMAkGA1UEBhMC
     2158REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy
     2159IFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcN
     2160MDYwMzIyMTU1NDI4WhcNMjUxMjMxMjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMg
     2161VHJ1c3RDZW50ZXIgR21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYw
     2162JAYDVQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcNAQEBBQAD
     2163ggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSRJJZ4Hgmgm5qVSkr1YnwC
     2164qMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3TfCZdzHd55yx4Oagmcw6iXSVphU9VDprv
     2165xrlE4Vc93x9UIuVvZaozhDrzznq+VZeujRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtw
     2166ag+1m7Z3W0hZneTvWq3zwZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9O
     2167gdwZu5GQfezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYDVR0j
     2168BBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
     2169AYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0GCSqGSIb3DQEBBQUAA4IBAQAo0uCG
     21701eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X17caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/Cy
     2171vwbZ71q+s2IhtNerNXxTPqYn8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3
     2172ghUJGooWMNjsydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT
     2173ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/2TYcuiUaUj0a
     21747CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY
     2175-----END CERTIFICATE-----
     2176
     2177Deutsche Telekom Root CA 2
     2178==========================
     2179-----BEGIN CERTIFICATE-----
     2180MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT
     2181RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG
     2182A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5
     2183MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G
     2184A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS
     2185b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5
     2186bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI
     2187KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY
     2188AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK
     2189Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV
     2190jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV
     2191HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr
     2192E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy
     2193zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8
     2194rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G
     2195dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU
     2196Cm26OWMohpLzGITY+9HPBVZkVw==
     2197-----END CERTIFICATE-----
     2198
     2199ComSign Secured CA
     2200==================
     2201-----BEGIN CERTIFICATE-----
     2202MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAwPDEbMBkGA1UE
     2203AxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0w
     2204NDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwxGzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBD
     2205QTEQMA4GA1UEChMHQ29tU2lnbjELMAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
     2206ggEKAoIBAQDGtWhfHZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs
     220749ohgHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sWv+bznkqH
     22087Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ueMv5WJDmyVIRD9YTC2LxB
     2209kMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d1
     22109guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUw
     2211AwEB/zBEBgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29t
     2212U2lnblNlY3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58ADsA
     2213j8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkqhkiG9w0BAQUFAAOC
     2214AQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7piL1DRYHjZiM/EoZNGeQFsOY3wo3a
     2215BijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtCdsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtp
     2216FhpFfTMDZflScZAmlaxMDPWLkz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP
     221751qJThRv4zdLhfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz
     2218OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw==
     2219-----END CERTIFICATE-----
     2220
     2221Cybertrust Global Root
     2222======================
     2223-----BEGIN CERTIFICATE-----
     2224MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li
     2225ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4
     2226MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD
     2227ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
     2228+Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW
     22290ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL
     2230AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin
     223189cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT
     22328M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP
     2233BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2
     2234MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G
     2235A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO
     2236lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi
     22375MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2
     2238hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T
     2239X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW
     2240WL1WMRJOEcgh4LMRkWXbtKaIOM5V
     2241-----END CERTIFICATE-----
     2242
     2243ePKI Root Certification Authority
     2244=================================
     2245-----BEGIN CERTIFICATE-----
     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
     2272-----END CERTIFICATE-----
     2273
     2274T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3
     2275=============================================================================================================================
     2276-----BEGIN CERTIFICATE-----
     2277MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH
     2278DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q
     2279aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry
     2280b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV
     2281BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg
     2282S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4
     2283MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl
     2284IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF
     2285n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl
     2286IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft
     2287dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl
     2288cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B
     2289AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO
     2290Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1
     2291xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR
     22926Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL
     2293hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd
     2294BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
     2295MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4
     2296N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT
     2297y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh
     2298LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M
     2299dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI=
     2300-----END CERTIFICATE-----
     2301
     2302Buypass Class 2 CA 1
     2303====================
     2304-----BEGIN CERTIFICATE-----
     2305MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
     2306QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2
     2307MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh
     2308c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI
     2309hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M
     2310cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83
     23110r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4
     23120Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R
     2313uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC
     2314MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P
     2315AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV
     23161Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt
     23177h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2
     2318fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w
     2319wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho
     2320-----END CERTIFICATE-----
     2321
     2322Buypass Class 3 CA 1
     2323====================
     2324-----BEGIN CERTIFICATE-----
     2325MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
     2326QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMyBDQSAxMB4XDTA1
     2327MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh
     2328c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZI
     2329hvcNAQEBBQADggEPADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKx
     2330ifZgisRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//zNIqeKNc0
     2331n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI+MkcVyzwPX6UvCWThOia
     2332AJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2RhzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c
     23331jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNC
     2334MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0P
     2335AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFPBdy7
     2336pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27sEzNxZy5p+qksP2bA
     2337EllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2mSlf56oBzKwzqBwKu5HEA6BvtjT5
     2338htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yCe/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQj
     2339el/wroQk5PMr+4okoyeYZdowdXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915
     2340-----END CERTIFICATE-----
     2341
     2342EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1
     2343==========================================================================
     2344-----BEGIN CERTIFICATE-----
     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
     2372-----END CERTIFICATE-----
     2373
     2374certSIGN ROOT CA
     2375================
     2376-----BEGIN CERTIFICATE-----
     2377MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD
     2378VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa
     2379Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE
     2380CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I
     2381JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH
     2382rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2
     2383ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD
     23840IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943
     2385AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B
     2386Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB
     2387AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8
     2388SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0
     2389x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt
     2390vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz
     2391TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD
     2392-----END CERTIFICATE-----
     2393
     2394CNNIC ROOT
     2395==========
     2396-----BEGIN CERTIFICATE-----
     2397MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE
     2398ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw
     2399OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw
     2400ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD
     2401o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz
     2402VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT
     2403VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or
     2404czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK
     2405y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC
     2406wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S
     2407lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5
     2408Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM
     2409O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8
     2410BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2
     2411G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m
     2412mxE=
     2413-----END CERTIFICATE-----
     2414
     2415ApplicationCA - Japanese Government
     2416===================================
     2417-----BEGIN CERTIFICATE-----
     2418MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT
     2419SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw
     2420MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl
     2421cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
     2422CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4
     2423fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN
     2424wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE
     2425jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu
     2426nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU
     2427WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV
     2428BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD
     2429vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs
     2430o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g
     2431/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD
     2432io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW
     2433dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL
     2434rosot4LKGAfmt1t06SAZf7IbiVQ=
     2435-----END CERTIFICATE-----
     2436
     2437GeoTrust Primary Certification Authority - G3
     2438=============================================
     2439-----BEGIN CERTIFICATE-----
     2440MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE
     2441BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0
     2442IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy
     2443eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz
     2444NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo
     2445YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT
     2446LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI
     2447hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j
     2448K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE
     2449c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C
     2450IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu
     2451dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC
     2452MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr
     24532zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9
     2454cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE
     2455Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD
     2456AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s
     2457t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt
     2458-----END CERTIFICATE-----
     2459
     2460thawte Primary Root CA - G2
     2461===========================
     2462-----BEGIN CERTIFICATE-----
     2463MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC
     2464VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu
     2465IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg
     2466Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV
     2467MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG
     2468b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt
     2469IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS
     2470LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5
     24718/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU
     2472mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN
     2473G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K
     2474rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==
     2475-----END CERTIFICATE-----
     2476
     2477thawte Primary Root CA - G3
     2478===========================
     2479-----BEGIN CERTIFICATE-----
     2480MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE
     2481BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
     2482aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
     2483cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w
     2484ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh
     2485d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD
     2486VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG
     2487A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
     2488MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At
     2489P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC
     2490+BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY
     24917CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW
     2492vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E
     2493BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ
     2494KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK
     2495A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu
     2496t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC
     24978rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm
     2498er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A=
     2499-----END CERTIFICATE-----
     2500
     2501GeoTrust Primary Certification Authority - G2
     2502=============================================
     2503-----BEGIN CERTIFICATE-----
     2504MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC
     2505VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu
     2506Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD
     2507ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1
     2508OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg
     2509MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl
     2510b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG
     2511BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc
     2512KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD
     2513VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+
     2514EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m
     2515ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2
     2516npaqBA+K
     2517-----END CERTIFICATE-----
     2518
     2519VeriSign Universal Root Certification Authority
     2520===============================================
     2521-----BEGIN CERTIFICATE-----
     2522MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE
     2523BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
     2524ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
     2525IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u
     2526IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV
     2527UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
     2528cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
     2529IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0
     2530aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj
     25311mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP
     2532MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72
     25339fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I
     2534AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR
     2535tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G
     2536CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O
     2537a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud
     2538DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3
     2539Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx
     2540Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx
     2541P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P
     2542wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4
     2543mJO37M2CYfE45k+XmCpajQ==
     2544-----END CERTIFICATE-----
     2545
     2546VeriSign Class 3 Public Primary Certification Authority - G4
     2547============================================================
     2548-----BEGIN CERTIFICATE-----
     2549MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC
     2550VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3
     2551b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz
     2552ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj
     2553YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL
     2554MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU
     2555cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo
     2556b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5
     2557IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8
     2558Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz
     2559rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB
     2560/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw
     2561HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u
     2562Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD
     2563A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx
     2564AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==
     2565-----END CERTIFICATE-----
     2566
     2567NetLock Arany (Class Gold) FÅ‘tanúsítvány
     2568============================================
     2569-----BEGIN CERTIFICATE-----
     2570MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G
     2571A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610
     2572dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB
     2573cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx
     2574MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO
     2575ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv
     2576biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6
     2577c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu
     25780jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw
     2579/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk
     2580H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw
     2581fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1
     2582neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB
     2583BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW
     2584qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta
     2585YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC
     2586bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna
     2587NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu
     2588dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=
     2589-----END CERTIFICATE-----
     2590
     2591Staat der Nederlanden Root CA - G2
     2592==================================
     2593-----BEGIN CERTIFICATE-----
     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
     262066+KAQ==
     2621-----END CERTIFICATE-----
     2622
     2623CA Disig
     2624========
     2625-----BEGIN CERTIFICATE-----
     2626MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK
     2627QnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw
     2628MzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz
     2629bGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3
     2630DQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm
     2631GErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD
     2632Pw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo
     2633hwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt
     2634ymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w
     2635gfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P
     2636AQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz
     2637aWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff
     2638ZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa
     2639BgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t
     2640WDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3
     2641mkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/
     2642CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K
     2643ezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA
     26444Z7CRneC9VkGjCFMhwnN5ag=
     2645-----END CERTIFICATE-----
     2646
     2647Juur-SK
     2648=======
     2649-----BEGIN CERTIFICATE-----
     2650MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA
     2651c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw
     2652DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG
     2653SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy
     2654aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
     2655ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf
     2656TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC
     2657+Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw
     2658UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa
     2659Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF
     2660MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD
     2661HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh
     2662AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA
     2663cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr
     2664AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw
     2665cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE
     2666FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G
     2667A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo
     2668ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL
     2669abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678
     2670IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh
     2671Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2
     2672yyqcjg==
     2673-----END CERTIFICATE-----
     2674
     2675Hongkong Post Root CA 1
     2676=======================
     2677-----BEGIN CERTIFICATE-----
     2678MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT
     2679DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx
     2680NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n
     2681IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF
     2682AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1
     2683ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr
     2684auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh
     2685qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY
     2686V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV
     2687HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i
     2688h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio
     2689l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei
     2690IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps
     2691T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT
     2692c4afU9hDDl3WY4JxHYB0yvbiAmvZWg==
     2693-----END CERTIFICATE-----
     2694
     2695SecureSign RootCA11
     2696===================
     2697-----BEGIN CERTIFICATE-----
     2698MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi
     2699SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS
     2700b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw
     2701KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1
     2702cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL
     2703TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO
     2704wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq
     2705g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP
     2706O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA
     2707bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX
     2708t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh
     2709OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r
     2710bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ
     2711Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01
     2712y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061
     2713lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I=
     2714-----END CERTIFICATE-----
     2715
     2716ACEDICOM Root
     2717=============
     2718-----BEGIN CERTIFICATE-----
     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
     2745-----END CERTIFICATE-----
     2746
     2747Verisign Class 3 Public Primary Certification Authority
     2748=======================================================
     2749-----BEGIN CERTIFICATE-----
     2750MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx
     2751FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5
     2752IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow
     2753XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz
     2754IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
     2755A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94
     2756f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol
     2757hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBABByUqkFFBky
     2758CEHwxWsKzH4PIRnN5GfcX6kb5sroc50i2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWX
     2759bj9T/UWZYB2oK0z5XqcJ2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/
     2760D/xwzoiQ
     2761-----END CERTIFICATE-----
     2762
     2763Microsec e-Szigno Root CA 2009
     2764==============================
     2765-----BEGIN CERTIFICATE-----
     2766MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER
     2767MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv
     2768c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o
     2769dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE
     2770BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt
     2771U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw
     2772DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA
     2773fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG
     27740IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA
     2775pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm
     27761HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC
     2777AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf
     2778QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE
     2779FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o
     2780lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX
     2781I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775
     2782tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02
     2783yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi
     2784LXpUq3DDfSJlgnCW
     2785-----END CERTIFICATE-----
     2786
     2787E-Guven Kok Elektronik Sertifika Hizmet Saglayicisi
     2788===================================================
     2789-----BEGIN CERTIFICATE-----
     2790MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG
     2791EwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxpZ2kgQS5TLjE8MDoGA1UEAxMz
     2792ZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3
     2793MDEwNDExMzI0OFoXDTE3MDEwNDExMzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0
     2794cm9uaWsgQmlsZ2kgR3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9u
     2795aWsgU2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
     2796AQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdUMZTe1RK6UxYC6lhj71vY
     27978+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlTL/jDj/6z/P2douNffb7tC+Bg62nsM+3Y
     2798jfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAI
     2799JjjcJRFHLfO6IxClv7wC90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk
     28009Ok0oSy1c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/BAQD
     2801AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoEVtstxNulMA0GCSqG
     2802SIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLPqk/CaOv/gKlR6D1id4k9CnU58W5d
     2803F4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwq
     2804D2fK/A+JYZ1lpTzlvBNbCNvj/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4
     2805Vwpm+Vganf2XKWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq
     2806fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX
     2807-----END CERTIFICATE-----
     2808
     2809GlobalSign Root CA - R3
     2810=======================
     2811-----BEGIN CERTIFICATE-----
     2812MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv
     2813YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
     2814bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
     2815aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
     2816bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt
     2817iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ
     28180mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3
     2819rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl
     2820OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2
     2821xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
     2822FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7
     2823lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8
     2824EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E
     2825bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18
     2826YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r
     2827kpeDMdmztcpHWD9f
     2828-----END CERTIFICATE-----
     2829
     2830TC TrustCenter Universal CA III
     2831===============================
     2832-----BEGIN CERTIFICATE-----
     2833MIID4TCCAsmgAwIBAgIOYyUAAQACFI0zFQLkbPQwDQYJKoZIhvcNAQEFBQAwezELMAkGA1UEBhMC
     2834REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy
     2835IFVuaXZlcnNhbCBDQTEoMCYGA1UEAxMfVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJSTAe
     2836Fw0wOTA5MDkwODE1MjdaFw0yOTEyMzEyMzU5NTlaMHsxCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNU
     2837QyBUcnVzdENlbnRlciBHbWJIMSQwIgYDVQQLExtUQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0Ex
     2838KDAmBgNVBAMTH1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQSBJSUkwggEiMA0GCSqGSIb3DQEB
     2839AQUAA4IBDwAwggEKAoIBAQDC2pxisLlxErALyBpXsq6DFJmzNEubkKLF5+cvAqBNLaT6hdqbJYUt
     2840QCggbergvbFIgyIpRJ9Og+41URNzdNW88jBmlFPAQDYvDIRlzg9uwliT6CwLOunBjvvya8o84pxO
     2841juT5fdMnnxvVZ3iHLX8LR7PH6MlIfK8vzArZQe+f/prhsq75U7Xl6UafYOPfjdN/+5Z+s7Vy+Eut
     2842CHnNaYlAJ/Uqwa1D7KRTyGG299J5KmcYdkhtWyUB0SbFt1dpIxVbYYqt8Bst2a9c8SaQaanVDED1
     2843M4BDj5yjdipFtK+/fz6HP3bFzSreIMUWWMv5G/UPyw0RUmS40nZid4PxWJ//AgMBAAGjYzBhMB8G
     2844A1UdIwQYMBaAFFbn4VslQ4Dg9ozhcbyO5YAvxEjiMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/
     2845BAQDAgEGMB0GA1UdDgQWBBRW5+FbJUOA4PaM4XG8juWAL8RI4jANBgkqhkiG9w0BAQUFAAOCAQEA
     2846g8ev6n9NCjw5sWi+e22JLumzCecYV42FmhfzdkJQEw/HkG8zrcVJYCtsSVgZ1OK+t7+rSbyUyKu+
     2847KGwWaODIl0YgoGhnYIg5IFHYaAERzqf2EQf27OysGh+yZm5WZ2B6dF7AbZc2rrUNXWZzwCUyRdhK
     2848BgePxLcHsU0GDeGl6/R1yrqc0L2z0zIkTO5+4nYES0lT2PLpVDP85XEfPRRclkvxOvIAu2y0+pZV
     2849CIgJwcyRGSmwIC3/yzikQOEXvnlhgP8HA4ZMTnsGnxGGjYnuJ8Tb4rwZjgvDwxPHLQNjO9Po5KIq
     2850woIIlBZU8O8fJ5AluA0OKBtHd0e9HKgl8ZS0Zg==
     2851-----END CERTIFICATE-----
     2852
     2853Autoridad de Certificacion Firmaprofesional CIF A62634068
     2854=========================================================
     2855-----BEGIN CERTIFICATE-----
     2856MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA
     2857BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2
     2858MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw
     2859QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB
     2860NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD
     2861Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P
     2862B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY
     28637Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH
     2864ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI
     2865plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX
     2866MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX
     2867LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK
     2868bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU
     2869vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud
     2870EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH
     2871DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp
     2872cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA
     2873bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx
     2874ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx
     287551tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk
     2876R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP
     2877T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f
     2878Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl
     2879osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR
     2880crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR
     2881saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD
     2882KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi
     28836Et8Vcad+qMUu2WFbm5PEn4KPJ2V
     2884-----END CERTIFICATE-----
     2885
     2886Izenpe.com
     2887==========
     2888-----BEGIN CERTIFICATE-----
     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
     2916-----END CERTIFICATE-----
     2917
     2918Chambers of Commerce Root - 2008
     2919================================
     2920-----BEGIN CERTIFICATE-----
     2921MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD
     2922MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
     2923bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
     2924QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy
     2925Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl
     2926ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF
     2927EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl
     2928cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
     2929AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA
     2930XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj
     2931h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/
     2932ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk
     2933NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g
     2934D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331
     2935lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ
     29360wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj
     2937ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2
     2938EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI
     2939G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ
     2940BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh
     2941bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh
     2942bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC
     2943CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH
     2944AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1
     2945wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH
     29463qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU
     2947RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6
     2948M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1
     2949YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF
     29509dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK
     2951zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG
     2952nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg
     2953OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ
     2954-----END CERTIFICATE-----
     2955
     2956Global Chambersign Root - 2008
     2957==============================
     2958-----BEGIN CERTIFICATE-----
     2959MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD
     2960MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
     2961bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
     2962QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx
     2963NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg
     2964Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ
     2965QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD
     2966aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf
     2967VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf
     2968XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0
     2969ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB
     2970/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA
     2971TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M
     2972H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe
     2973Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF
     2974HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh
     2975wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB
     2976AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT
     2977BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE
     2978BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm
     2979aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm
     2980aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp
     29811X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0
     2982dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG
     2983/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6
     2984ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s
     2985dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg
     29869jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH
     2987foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du
     2988qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr
     2989P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq
     2990c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z
     299109gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B
     2992-----END CERTIFICATE-----
     2993
     2994Go Daddy Root Certificate Authority - G2
     2995========================================
     2996-----BEGIN CERTIFICATE-----
     2997MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
     2998B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu
     2999MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5
     3000MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6
     3001b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G
     3002A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI
     3003hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq
     30049oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD
     3005+qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd
     3006fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl
     3007NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC
     3008MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9
     3009BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac
     3010vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r
     30115N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV
     3012N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO
     3013LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1
     3014-----END CERTIFICATE-----
     3015
     3016Starfield Root Certificate Authority - G2
     3017=========================================
     3018-----BEGIN CERTIFICATE-----
     3019MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
     3020B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
     3021b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0
     3022eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw
     3023DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg
     3024VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB
     3025dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv
     3026W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs
     3027bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk
     3028N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf
     3029ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU
     3030JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
     3031AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol
     3032TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx
     30334mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw
     3034F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K
     3035pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ
     3036c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0
     3037-----END CERTIFICATE-----
     3038
     3039Starfield Services Root Certificate Authority - G2
     3040==================================================
     3041-----BEGIN CERTIFICATE-----
     3042MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
     3043B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
     3044b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl
     3045IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV
     3046BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT
     3047dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg
     3048Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
     3049AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2
     3050h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa
     3051hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP
     3052LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB
     3053rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw
     3054AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG
     3055SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP
     3056E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy
     3057xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd
     3058iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza
     3059YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6
     3060-----END CERTIFICATE-----
     3061
     3062AffirmTrust Commercial
     3063======================
     3064-----BEGIN CERTIFICATE-----
     3065MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS
     3066BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw
     3067MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
     3068bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF
     3069AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb
     3070DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV
     3071C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6
     3072BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww
     3073MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV
     3074HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
     3075AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG
     3076hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi
     3077qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv
     30780wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh
     3079sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=
     3080-----END CERTIFICATE-----
     3081
     3082AffirmTrust Networking
     3083======================
     3084-----BEGIN CERTIFICATE-----
     3085MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS
     3086BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw
     3087MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
     3088bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF
     3089AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE
     3090Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI
     3091dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24
     3092/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb
     3093h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV
     3094HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
     3095AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu
     3096UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6
     309712S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23
     3098WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9
     3099/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=
     3100-----END CERTIFICATE-----
     3101
     3102AffirmTrust Premium
     3103===================
     3104-----BEGIN CERTIFICATE-----
     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
     3129-----END CERTIFICATE-----
     3130
     3131AffirmTrust Premium ECC
     3132=======================
     3133-----BEGIN CERTIFICATE-----
     3134MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV
     3135BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx
     3136MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U
     3137cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA
     3138IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ
     3139N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW
     3140BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK
     3141BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X
     314257hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM
     3143eQ==
     3144-----END CERTIFICATE-----
     3145
     3146Certum Trusted Network CA
     3147=========================
     3148-----BEGIN CERTIFICATE-----
     3149MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK
     3150ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv
     3151biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy
     3152MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU
     3153ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
     3154MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC
     3155AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC
     3156l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J
     3157J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4
     3158fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0
     3159cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB
     3160Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw
     3161DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj
     3162jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1
     3163mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj
     3164Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI
     316503YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=
     3166-----END CERTIFICATE-----
     3167
     3168Certinomis - Autorité Racine
     3169=============================
     3170-----BEGIN CERTIFICATE-----
     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
     3196vgt2Fl43N+bYdJeimUV5
     3197-----END CERTIFICATE-----
     3198
     3199Root CA Generalitat Valenciana
     3200==============================
     3201-----BEGIN CERTIFICATE-----
     3202MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE
     3203ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290
     3204IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3
     3205WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE
     3206CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G
     3207CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2
     3208F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B
     3209ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ
     3210D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte
     3211JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB
     3212AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n
     3213dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB
     3214ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl
     3215AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA
     3216YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy
     3217AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA
     3218aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt
     3219AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA
     3220YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu
     3221AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA
     3222OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0
     3223dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV
     3224BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G
     3225A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S
     3226b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh
     3227TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz
     3228Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63
     3229NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH
     3230iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt
     3231+GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM=
     3232-----END CERTIFICATE-----
     3233
     3234A-Trust-nQual-03
     3235================
     3236-----BEGIN CERTIFICATE-----
     3237MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJBVDFIMEYGA1UE
     3238Cgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBpbSBlbGVrdHIuIERhdGVudmVy
     3239a2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5RdWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5R
     3240dWFsLTAzMB4XDTA1MDgxNzIyMDAwMFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgw
     3241RgYDVQQKDD9BLVRydXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0
     3242ZW52ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMMEEEtVHJ1
     3243c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtPWFuA/OQO8BBC4SA
     3244zewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUjlUC5B3ilJfYKvUWG6Nm9wASOhURh73+n
     3245yfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZznF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPE
     3246SU7l0+m0iKsMrmKS1GWH2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4
     3247iHQF63n1k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs2e3V
     3248cuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECERqlWdV
     3249eRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAVdRU0VlIXLOThaq/Yy/kgM40
     3250ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fGKOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmr
     3251sQd7TZjTXLDR8KdCoLXEjq/+8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZd
     3252JXDRZslo+S4RFGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS
     3253mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmEDNuxUCAKGkq6
     3254ahq97BvIxYSazQ==
     3255-----END CERTIFICATE-----
     3256
     3257TWCA Root Certification Authority
     3258=================================
     3259-----BEGIN CERTIFICATE-----
     3260MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ
     3261VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh
     3262dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG
     3263EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB
     3264IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
     3265AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx
     3266QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC
     3267oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP
     32684HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r
     3269y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB
     3270BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG
     32719w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC
     3272mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW
     3273QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY
     3274T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny
     3275Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==
     3276-----END CERTIFICATE-----
     3277
     3278Security Communication RootCA2
     3279==============================
     3280-----BEGIN CERTIFICATE-----
     3281MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
     3282U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh
     3283dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC
     3284SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy
     3285aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
     3286ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++
     3287+T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R
     32883n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV
     3289spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K
     3290EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8
     3291QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB
     3292CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj
     3293u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk
     32943fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q
     3295tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29
     3296mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03
     3297-----END CERTIFICATE-----
     3298
     3299EC-ACC
     3300======
     3301-----BEGIN CERTIFICATE-----
     3302MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE
     3303BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w
     3304ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD
     3305VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE
     3306CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT
     3307BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7
     3308MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt
     3309SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl
     3310Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh
     3311cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND
     3312MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK
     3313w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT
     3314ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4
     3315HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a
     3316E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw
     33170JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E
     3318BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD
     3319VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0
     3320Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l
     3321dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ
     3322lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa
     3323Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe
     3324l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2
     3325E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D
     33265EI=
     3327-----END CERTIFICATE-----
     3328
     3329Hellenic Academic and Research Institutions RootCA 2011
     3330=======================================================
     3331-----BEGIN CERTIFICATE-----
     3332MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT
     3333O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y
     3334aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
     3335IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT
     3336AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
     3337IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo
     3338IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
     3339AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI
     33401Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa
     334171HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u
     33428yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH
     33433N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/
     3344MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8
     3345MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu
     3346b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt
     3347XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8
     3348TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD
     3349/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N
     33507yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4
     3351-----END CERTIFICATE-----
     3352
     3353Actalis Authentication Root CA
     3354==============================
     3355-----BEGIN CERTIFICATE-----
     3356MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM
     3357BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE
     3358AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky
     3359MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz
     3360IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290
     3361IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ
     3362wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa
     3363by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6
     3364zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f
     3365YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2
     3366oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l
     3367EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7
     3368hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8
     3369EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5
     3370jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY
     3371iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt
     3372ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI
     3373WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0
     3374JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx
     3375K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+
     3376Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC
     33774yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo
     33782qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz
     3379lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem
     3380OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9
     3381vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg==
     3382-----END CERTIFICATE-----
     3383
     3384Trustis FPS Root CA
     3385===================
     3386-----BEGIN CERTIFICATE-----
     3387MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG
     3388EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290
     3389IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV
     3390BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ
     3391KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ
     3392RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk
     3393H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa
     3394cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt
     3395o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA
     3396AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd
     3397BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c
     3398GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC
     3399yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P
     34008Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV
     3401l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl
     3402iB6XzCGcKQENZetX2fNXlrtIzYE=
     3403-----END CERTIFICATE-----
     3404
     3405StartCom Certification Authority
     3406================================
     3407-----BEGIN CERTIFICATE-----
     3408MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
     3409U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu
     3410ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0
     3411NjM3WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk
     3412LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg
     3413U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
     3414ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y
     3415o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/
     3416Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d
     3417eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt
     34182PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z
     34196+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ
     3420osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/
     3421untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc
     3422UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT
     342337uMdBNSSwIDAQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD
     3424VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFulF2mHMMo0aEPQ
     3425Qa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCCATgwLgYIKwYBBQUHAgEWImh0
     3426dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cu
     3427c3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENv
     3428bW1lcmNpYWwgKFN0YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0
     3429aGUgc2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0aWZpY2F0
     3430aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t
     3431L3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBG
     3432cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5
     3433fPGFf59Jb2vKXfuM/gTFwWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWm
     3434N3PH/UvSTa0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst0OcN
     3435Org+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNcpRJvkrKTlMeIFw6T
     3436tn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKlCcWw0bdT82AUuoVpaiF8H3VhFyAX
     3437e2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVFP0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA
     34382MFrLH9ZXF2RsXAiV+uKa0hK1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBs
     3439HvUwyKMQ5bLmKhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE
     3440JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ8dCAWZvLMdib
     3441D4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnmfyWl8kgAwKQB2j8=
     3442-----END CERTIFICATE-----
     3443
     3444StartCom Certification Authority G2
     3445===================================
     3446-----BEGIN CERTIFICATE-----
     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
     3471obp573PYtlNXLfbQ4ddI
     3472-----END CERTIFICATE-----
     3473
     3474Buypass Class 2 Root CA
     3475=======================
     3476-----BEGIN CERTIFICATE-----
     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
     3501rJgWVqA=
     3502-----END CERTIFICATE-----
     3503
     3504Buypass Class 3 Root CA
     3505=======================
     3506-----BEGIN CERTIFICATE-----
     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
     3531Cp/HuZc=
     3532-----END CERTIFICATE-----
     3533
     3534T-TeleSec GlobalRoot Class 3
     3535============================
     3536-----BEGIN CERTIFICATE-----
     3537MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM
     3538IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU
     3539cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx
     3540MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz
     3541dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD
     3542ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3
     3543DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK
     35449tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU
     3545NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF
     3546iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W
     35470eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA
     3548MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr
     3549AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb
     3550fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT
     3551ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h
     3552P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml
     3553e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw==
     3554-----END CERTIFICATE-----
  • src/wp-includes/Requests/Transport/fsockopen.php

     
     1<?php
     2/**
     3 * fsockopen HTTP transport
     4 *
     5 * @package Requests
     6 * @subpackage Transport
     7 */
     8
     9/**
     10 * fsockopen HTTP transport
     11 *
     12 * @package Requests
     13 * @subpackage Transport
     14 */
     15class Requests_Transport_fsockopen implements Requests_Transport {
     16        /**
     17         * Second to microsecond conversion
     18         *
     19         * @var integer
     20         */
     21        const SECOND_IN_MICROSECONDS = 1000000;
     22
     23        /**
     24         * Raw HTTP data
     25         *
     26         * @var string
     27         */
     28        public $headers = '';
     29
     30        /**
     31         * Stream metadata
     32         *
     33         * @var array Associative array of properties, see {@see http://php.net/stream_get_meta_data}
     34         */
     35        public $info;
     36
     37        /**
     38         * What's the maximum number of bytes we should keep?
     39         *
     40         * @var int|bool Byte count, or false if no limit.
     41         */
     42        protected $max_bytes = false;
     43
     44        protected $connect_error = '';
     45
     46        /**
     47         * Perform a request
     48         *
     49         * @throws Requests_Exception On failure to connect to socket (`fsockopenerror`)
     50         * @throws Requests_Exception On socket timeout (`timeout`)
     51         *
     52         * @param string $url URL to request
     53         * @param array $headers Associative array of request headers
     54         * @param string|array $data Data to send either as the POST body, or as parameters in the URL for a GET/HEAD
     55         * @param array $options Request options, see {@see Requests::response()} for documentation
     56         * @return string Raw HTTP result
     57         */
     58        public function request($url, $headers = array(), $data = array(), $options = array()) {
     59                $options['hooks']->dispatch('fsockopen.before_request');
     60
     61                $url_parts = parse_url($url);
     62                if (empty($url_parts)) {
     63                        throw new Requests_Exception('Invalid URL.', 'invalidurl', $url);
     64                }
     65                $host = $url_parts['host'];
     66                $context = stream_context_create();
     67                $verifyname = false;
     68                $case_insensitive_headers = new Requests_Utility_CaseInsensitiveDictionary($headers);
     69
     70                // HTTPS support
     71                if (isset($url_parts['scheme']) && strtolower($url_parts['scheme']) === 'https') {
     72                        $remote_socket = 'ssl://' . $host;
     73                        $url_parts['port'] = 443;
     74
     75                        $context_options = array(
     76                                'verify_peer' => true,
     77                                // 'CN_match' => $host,
     78                                'capture_peer_cert' => true
     79                        );
     80                        $verifyname = true;
     81
     82                        // SNI, if enabled (OpenSSL >=0.9.8j)
     83                        if (defined('OPENSSL_TLSEXT_SERVER_NAME') && OPENSSL_TLSEXT_SERVER_NAME) {
     84                                $context_options['SNI_enabled'] = true;
     85                                if (isset($options['verifyname']) && $options['verifyname'] === false) {
     86                                        $context_options['SNI_enabled'] = false;
     87                                }
     88                        }
     89
     90                        if (isset($options['verify'])) {
     91                                if ($options['verify'] === false) {
     92                                        $context_options['verify_peer'] = false;
     93                                }
     94                                elseif (is_string($options['verify'])) {
     95                                        $context_options['cafile'] = $options['verify'];
     96                                }
     97                        }
     98
     99                        if (isset($options['verifyname']) && $options['verifyname'] === false) {
     100                                $verifyname = false;
     101                        }
     102
     103                        stream_context_set_option($context, array('ssl' => $context_options));
     104                }
     105                else {
     106                        $remote_socket = 'tcp://' . $host;
     107                }
     108
     109                $this->max_bytes = $options['max_bytes'];
     110
     111                if (!isset($url_parts['port'])) {
     112                        $url_parts['port'] = 80;
     113                }
     114                $remote_socket .= ':' . $url_parts['port'];
     115
     116                set_error_handler(array($this, 'connect_error_handler'), E_WARNING | E_NOTICE);
     117
     118                $options['hooks']->dispatch('fsockopen.remote_socket', array(&$remote_socket));
     119
     120                $socket = stream_socket_client($remote_socket, $errno, $errstr, ceil($options['connect_timeout']), STREAM_CLIENT_CONNECT, $context);
     121
     122                restore_error_handler();
     123
     124                if ($verifyname && !$this->verify_certificate_from_context($host, $context)) {
     125                        throw new Requests_Exception('SSL certificate did not match the requested domain name', 'ssl.no_match');
     126                }
     127
     128                if (!$socket) {
     129                        if ($errno === 0) {
     130                                // Connection issue
     131                                throw new Requests_Exception(rtrim($this->connect_error), 'fsockopen.connect_error');
     132                        }
     133
     134                        throw new Requests_Exception($errstr, 'fsockopenerror', null, $errno);
     135                }
     136
     137                $data_format = $options['data_format'];
     138
     139                if ($data_format === 'query') {
     140                        $path = self::format_get($url_parts, $data);
     141                        $data = '';
     142                }
     143                else {
     144                        $path = self::format_get($url_parts, array());
     145                }
     146
     147                $options['hooks']->dispatch('fsockopen.remote_host_path', array(&$path, $url));
     148
     149                $request_body = '';
     150                $out = sprintf("%s %s HTTP/%.1f\r\n", $options['type'], $path, $options['protocol_version']);
     151
     152                if ($options['type'] !== Requests::TRACE) {
     153                        if (is_array($data)) {
     154                                $request_body = http_build_query($data, null, '&');
     155                        }
     156                        else {
     157                                $request_body = $data;
     158                        }
     159
     160                        if (!empty($data)) {
     161                                if (!isset($case_insensitive_headers['Content-Length'])) {
     162                                        $headers['Content-Length'] = strlen($request_body);
     163                                }
     164
     165                                if (!isset($case_insensitive_headers['Content-Type'])) {
     166                                        $headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8';
     167                                }
     168                        }
     169                }
     170
     171                if (!isset($case_insensitive_headers['Host'])) {
     172                        $out .= sprintf('Host: %s', $url_parts['host']);
     173
     174                        if ($url_parts['port'] !== 80) {
     175                                $out .= ':' . $url_parts['port'];
     176                        }
     177                        $out .= "\r\n";
     178                }
     179
     180                if (!isset($case_insensitive_headers['User-Agent'])) {
     181                        $out .= sprintf("User-Agent: %s\r\n", $options['useragent']);
     182                }
     183
     184                $accept_encoding = $this->accept_encoding();
     185                if (!isset($case_insensitive_headers['Accept-Encoding']) && !empty($accept_encoding)) {
     186                        $out .= sprintf("Accept-Encoding: %s\r\n", $accept_encoding);
     187                }
     188
     189                $headers = Requests::flatten($headers);
     190
     191                if (!empty($headers)) {
     192                        $out .= implode($headers, "\r\n") . "\r\n";
     193                }
     194
     195                $options['hooks']->dispatch('fsockopen.after_headers', array(&$out));
     196
     197                if (substr($out, -2) !== "\r\n") {
     198                        $out .= "\r\n";
     199                }
     200
     201                if (!isset($case_insensitive_headers['Connection'])) {
     202                        $out .= "Connection: Close\r\n";
     203                }
     204
     205                $out .= "\r\n" . $request_body;
     206
     207                $options['hooks']->dispatch('fsockopen.before_send', array(&$out));
     208
     209                fwrite($socket, $out);
     210                $options['hooks']->dispatch('fsockopen.after_send', array($out));
     211
     212                if (!$options['blocking']) {
     213                        fclose($socket);
     214                        $fake_headers = '';
     215                        $options['hooks']->dispatch('fsockopen.after_request', array(&$fake_headers));
     216                        return '';
     217                }
     218
     219                $timeout_sec = (int) floor($options['timeout']);
     220                if ($timeout_sec == $options['timeout']) {
     221                        $timeout_msec = 0;
     222                }
     223                else {
     224                        $timeout_msec = self::SECOND_IN_MICROSECONDS * $options['timeout'] % self::SECOND_IN_MICROSECONDS;
     225                }
     226                stream_set_timeout($socket, $timeout_sec, $timeout_msec);
     227
     228                $response = $body = $headers = '';
     229                $this->info = stream_get_meta_data($socket);
     230                $size = 0;
     231                $doingbody = false;
     232                $download = false;
     233                if ($options['filename']) {
     234                        $download = fopen($options['filename'], 'wb');
     235                }
     236
     237                while (!feof($socket)) {
     238                        $this->info = stream_get_meta_data($socket);
     239                        if ($this->info['timed_out']) {
     240                                throw new Requests_Exception('fsocket timed out', 'timeout');
     241                        }
     242
     243                        $block = fread($socket, Requests::BUFFER_SIZE);
     244                        if (!$doingbody) {
     245                                $response .= $block;
     246                                if (strpos($response, "\r\n\r\n")) {
     247                                        list($headers, $block) = explode("\r\n\r\n", $response, 2);
     248                                        $doingbody = true;
     249                                }
     250                        }
     251
     252                        // Are we in body mode now?
     253                        if ($doingbody) {
     254                                $options['hooks']->dispatch('request.progress', array($block, $size, $this->max_bytes));
     255                                $data_length = strlen($block);
     256                                if ($this->max_bytes) {
     257                                        // Have we already hit a limit?
     258                                        if ($size === $this->max_bytes) {
     259                                                continue;
     260                                        }
     261                                        if (($size + $data_length) > $this->max_bytes) {
     262                                                // Limit the length
     263                                                $limited_length = ($this->max_bytes - $size);
     264                                                $block = substr($block, 0, $limited_length);
     265                                        }
     266                                }
     267
     268                                $size += strlen($block);
     269                                if ($download) {
     270                                        fwrite($download, $block);
     271                                }
     272                                else {
     273                                        $body .= $block;
     274                                }
     275                        }
     276                }
     277                $this->headers = $headers;
     278
     279                if ($download) {
     280                        fclose($download);
     281                }
     282                else {
     283                        $this->headers .= "\r\n\r\n" . $body;
     284                }
     285                fclose($socket);
     286
     287                $options['hooks']->dispatch('fsockopen.after_request', array(&$this->headers));
     288                return $this->headers;
     289        }
     290
     291        /**
     292         * Send multiple requests simultaneously
     293         *
     294         * @param array $requests Request data (array of 'url', 'headers', 'data', 'options') as per {@see Requests_Transport::request}
     295         * @param array $options Global options, see {@see Requests::response()} for documentation
     296         * @return array Array of Requests_Response objects (may contain Requests_Exception or string responses as well)
     297         */
     298        public function request_multiple($requests, $options) {
     299                $responses = array();
     300                $class = get_class($this);
     301                foreach ($requests as $id => $request) {
     302                        try {
     303                                $handler = new $class();
     304                                $responses[$id] = $handler->request($request['url'], $request['headers'], $request['data'], $request['options']);
     305
     306                                $request['options']['hooks']->dispatch('transport.internal.parse_response', array(&$responses[$id], $request));
     307                        }
     308                        catch (Requests_Exception $e) {
     309                                $responses[$id] = $e;
     310                        }
     311
     312                        if (!is_string($responses[$id])) {
     313                                $request['options']['hooks']->dispatch('multiple.request.complete', array(&$responses[$id], $id));
     314                        }
     315                }
     316
     317                return $responses;
     318        }
     319
     320        /**
     321         * Retrieve the encodings we can accept
     322         *
     323         * @return string Accept-Encoding header value
     324         */
     325        protected static function accept_encoding() {
     326                $type = array();
     327                if (function_exists('gzinflate')) {
     328                        $type[] = 'deflate;q=1.0';
     329                }
     330
     331                if (function_exists('gzuncompress')) {
     332                        $type[] = 'compress;q=0.5';
     333                }
     334
     335                $type[] = 'gzip;q=0.5';
     336
     337                return implode(', ', $type);
     338        }
     339
     340        /**
     341         * Format a URL given GET data
     342         *
     343         * @param array $url_parts
     344         * @param array|object $data Data to build query using, see {@see http://php.net/http_build_query}
     345         * @return string URL with data
     346         */
     347        protected static function format_get($url_parts, $data) {
     348                if (!empty($data)) {
     349                        if (empty($url_parts['query'])) {
     350                                $url_parts['query'] = '';
     351                        }
     352
     353                        $url_parts['query'] .= '&' . http_build_query($data, null, '&');
     354                        $url_parts['query'] = trim($url_parts['query'], '&');
     355                }
     356                if (isset($url_parts['path'])) {
     357                        if (isset($url_parts['query'])) {
     358                                $get = $url_parts['path'] . '?' . $url_parts['query'];
     359                        }
     360                        else {
     361                                $get = $url_parts['path'];
     362                        }
     363                }
     364                else {
     365                        $get = '/';
     366                }
     367                return $get;
     368        }
     369
     370        /**
     371         * Error handler for stream_socket_client()
     372         *
     373         * @param int $errno Error number (e.g. E_WARNING)
     374         * @param string $errstr Error message
     375         */
     376        public function connect_error_handler($errno, $errstr) {
     377                // Double-check we can handle it
     378                if (($errno & E_WARNING) === 0 && ($errno & E_NOTICE) === 0) {
     379                        // Return false to indicate the default error handler should engage
     380                        return false;
     381                }
     382
     383                $this->connect_error .= $errstr . "\n";
     384                return true;
     385        }
     386
     387        /**
     388         * Verify the certificate against common name and subject alternative names
     389         *
     390         * Unfortunately, PHP doesn't check the certificate against the alternative
     391         * names, leading things like 'https://www.github.com/' to be invalid.
     392         * Instead
     393         *
     394         * @see http://tools.ietf.org/html/rfc2818#section-3.1 RFC2818, Section 3.1
     395         *
     396         * @throws Requests_Exception On failure to connect via TLS (`fsockopen.ssl.connect_error`)
     397         * @throws Requests_Exception On not obtaining a match for the host (`fsockopen.ssl.no_match`)
     398         * @param string $host Host name to verify against
     399         * @param resource $context Stream context
     400         * @return bool
     401         */
     402        public function verify_certificate_from_context($host, $context) {
     403                $meta = stream_context_get_options($context);
     404
     405                // If we don't have SSL options, then we couldn't make the connection at
     406                // all
     407                if (empty($meta) || empty($meta['ssl']) || empty($meta['ssl']['peer_certificate'])) {
     408                        throw new Requests_Exception(rtrim($this->connect_error), 'ssl.connect_error');
     409                }
     410
     411                $cert = openssl_x509_parse($meta['ssl']['peer_certificate']);
     412
     413                return Requests_SSL::verify_certificate($host, $cert);
     414        }
     415
     416        /**
     417         * Whether this transport is valid
     418         *
     419         * @codeCoverageIgnore
     420         * @return boolean True if the transport is valid, false otherwise.
     421         */
     422        public static function test($capabilities = array()) {
     423                if (!function_exists('fsockopen')) {
     424                        return false;
     425                }
     426
     427                // If needed, check that streams support SSL
     428                if (isset($capabilities['ssl']) && $capabilities['ssl']) {
     429                        if (!extension_loaded('openssl') || !function_exists('openssl_x509_parse')) {
     430                                return false;
     431                        }
     432
     433                        // Currently broken, thanks to https://github.com/facebook/hhvm/issues/2156
     434                        if (defined('HHVM_VERSION')) {
     435                                return false;
     436                        }
     437                }
     438
     439                return true;
     440        }
     441}
  • src/wp-includes/Requests/Transport.php

     
     1<?php
     2/**
     3 * Base HTTP transport
     4 *
     5 * @package Requests
     6 * @subpackage Transport
     7 */
     8
     9/**
     10 * Base HTTP transport
     11 *
     12 * @package Requests
     13 * @subpackage Transport
     14 */
     15interface Requests_Transport {
     16        /**
     17         * Perform a request
     18         *
     19         * @param string $url URL to request
     20         * @param array $headers Associative array of request headers
     21         * @param string|array $data Data to send either as the POST body, or as parameters in the URL for a GET/HEAD
     22         * @param array $options Request options, see {@see Requests::response()} for documentation
     23         * @return string Raw HTTP result
     24         */
     25        public function request($url, $headers = array(), $data = array(), $options = array());
     26
     27        /**
     28         * Send multiple requests simultaneously
     29         *
     30         * @param array $requests Request data (array of 'url', 'headers', 'data', 'options') as per {@see Requests_Transport::request}
     31         * @param array $options Global options, see {@see Requests::response()} for documentation
     32         * @return array Array of Requests_Response objects (may contain Requests_Exception or string responses as well)
     33         */
     34        public function request_multiple($requests, $options);
     35
     36        /**
     37         * Self-test whether the transport can be used
     38         * @return bool
     39         */
     40        public static function test();
     41}
     42 No newline at end of file
  • src/wp-includes/Requests/Utility/CaseInsensitiveDictionary.php

     
     1<?php
     2/**
     3 * Case-insensitive dictionary, suitable for HTTP headers
     4 *
     5 * @package Requests
     6 * @subpackage Utilities
     7 */
     8
     9/**
     10 * Case-insensitive dictionary, suitable for HTTP headers
     11 *
     12 * @package Requests
     13 * @subpackage Utilities
     14 */
     15class Requests_Utility_CaseInsensitiveDictionary implements ArrayAccess, IteratorAggregate {
     16        /**
     17         * Actual item data
     18         *
     19         * @var array
     20         */
     21        protected $data = array();
     22
     23        /**
     24         * Creates a case insensitive dictionary.
     25         *
     26         * @param array $data Dictionary/map to convert to case-insensitive
     27         */
     28        public function __construct(array $data = array()) {
     29                foreach ($data as $key => $value) {
     30                        $this->offsetSet($key, $value);
     31                }
     32        }
     33
     34        /**
     35         * Check if the given item exists
     36         *
     37         * @param string $key Item key
     38         * @return boolean Does the item exist?
     39         */
     40        public function offsetExists($key) {
     41                $key = strtolower($key);
     42                return isset($this->data[$key]);
     43        }
     44
     45        /**
     46         * Get the value for the item
     47         *
     48         * @param string $key Item key
     49         * @return string Item value
     50         */
     51        public function offsetGet($key) {
     52                $key = strtolower($key);
     53                if (!isset($this->data[$key])) {
     54                        return null;
     55                }
     56
     57                return $this->data[$key];
     58        }
     59
     60        /**
     61         * Set the given item
     62         *
     63         * @throws Requests_Exception On attempting to use dictionary as list (`invalidset`)
     64         *
     65         * @param string $key Item name
     66         * @param string $value Item value
     67         */
     68        public function offsetSet($key, $value) {
     69                if ($key === null) {
     70                        throw new Requests_Exception('Object is a dictionary, not a list', 'invalidset');
     71                }
     72
     73                $key = strtolower($key);
     74                $this->data[$key] = $value;
     75        }
     76
     77        /**
     78         * Unset the given header
     79         *
     80         * @param string $key
     81         */
     82        public function offsetUnset($key) {
     83                unset($this->data[strtolower($key)]);
     84        }
     85
     86        /**
     87         * Get an iterator for the data
     88         *
     89         * @return ArrayIterator
     90         */
     91        public function getIterator() {
     92                return new ArrayIterator($this->data);
     93        }
     94
     95        /**
     96         * Get the headers as an array
     97         *
     98         * @return array Header data
     99         */
     100        public function getAll() {
     101                return $this->data;
     102        }
     103}
  • src/wp-includes/Requests/Utility/FilteredIterator.php

     
     1<?php
     2/**
     3 * Iterator for arrays requiring filtered values
     4 *
     5 * @package Requests
     6 * @subpackage Utilities
     7 */
     8
     9/**
     10 * Iterator for arrays requiring filtered values
     11 *
     12 * @package Requests
     13 * @subpackage Utilities
     14 */
     15class Requests_Utility_FilteredIterator extends ArrayIterator {
     16        /**
     17         * Callback to run as a filter
     18         *
     19         * @var callable
     20         */
     21        protected $callback;
     22
     23        /**
     24         * Create a new iterator
     25         *
     26         * @param array $data
     27         * @param callable $callback Callback to be called on each value
     28         */
     29        public function __construct($data, $callback) {
     30                parent::__construct($data);
     31
     32                $this->callback = $callback;
     33        }
     34
     35        /**
     36         * Get the current item's value after filtering
     37         *
     38         * @return string
     39         */
     40        public function current() {
     41                $value = parent::current();
     42                $value = call_user_func($this->callback, $value);
     43                return $value;
     44        }
     45}
  • src/wp-includes/class-http.php

     
    77 * @since 2.7.0
    88 */
    99
     10if ( ! class_exists( 'Requests' ) ) {
     11        require( ABSPATH . WPINC . '/class-requests.php' );
     12        Requests::register_autoloader();
     13
     14        require( ABSPATH . WPINC . '/class-wp-requests-hooks.php' );
     15}
     16
    1017/**
    1118 * Core class used for managing HTTP transports and making HTTP requests.
    1219 *
     
    8693        const NETWORK_AUTHENTICATION_REQUIRED = 511;
    8794
    8895        /**
     96         * Adapter to change Requests hooks to WP actions.
     97         *
     98         * @var WP_Requests_Hooks
     99         */
     100        protected $hook_adapter;
     101
     102        /**
     103         * Constructor.
     104         */
     105        public function __construct() {
     106                $this->hook_adapter = new WP_Requests_Hooks();
     107        }
     108
     109        /**
    89110         * Send an HTTP request to a URI.
    90111         *
    91112         * Please note: The only URI that are supported in the HTTP Transport implementation
     
    247268                        return $pre;
    248269
    249270                if ( function_exists( 'wp_kses_bad_protocol' ) ) {
    250                         if ( $r['reject_unsafe_urls'] )
     271                        if ( $r['reject_unsafe_urls'] ) {
    251272                                $url = wp_http_validate_url( $url );
     273                        }
    252274                        if ( $url ) {
    253275                                $url = wp_kses_bad_protocol( $url, array( 'http', 'https', 'ssl' ) );
    254276                        }
     
    256278
    257279                $arrURL = @parse_url( $url );
    258280
    259                 if ( empty( $url ) || empty( $arrURL['scheme'] ) )
     281                if ( empty( $url ) || empty( $arrURL['scheme'] ) ) {
    260282                        return new WP_Error('http_request_failed', __('A valid URL was not provided.'));
     283                }
    261284
    262                 if ( $this->block_request( $url ) )
     285                if ( $this->block_request( $url ) ) {
    263286                        return new WP_Error( 'http_request_failed', __( 'User has blocked requests through HTTP.' ) );
    264 
    265                 /*
    266                  * Determine if this is a https call and pass that on to the transport functions
    267                  * so that we can blacklist the transports that do not support ssl verification
    268                  */
    269                 $r['ssl'] = $arrURL['scheme'] == 'https' || $arrURL['scheme'] == 'ssl';
    270 
    271                 // Determine if this request is to OUR install of WordPress.
    272                 $homeURL = parse_url( get_bloginfo( 'url' ) );
    273                 $r['local'] = 'localhost' == $arrURL['host'] || ( isset( $homeURL['host'] ) && $homeURL['host'] == $arrURL['host'] );
    274                 unset( $homeURL );
    275 
    276                 /*
    277                  * If we are streaming to a file but no filename was given drop it in the WP temp dir
    278                  * and pick its name using the basename of the $url.
    279                  */
    280                 if ( $r['stream']  && empty( $r['filename'] ) ) {
    281                         $r['filename'] = get_temp_dir() . wp_unique_filename( get_temp_dir(), basename( $url ) );
    282287                }
    283288
    284                 /*
    285                  * Force some settings if we are streaming to a file and check for existence and perms
    286                  * of destination directory.
    287                  */
     289                // If we are streaming to a file but no filename was given drop it in the WP temp dir
     290                // and pick its name using the basename of the $url
    288291                if ( $r['stream'] ) {
     292                        if ( empty( $r['filename'] ) ) {
     293                                $r['filename'] = get_temp_dir() . basename( $url );
     294                        }
     295
     296                        // Force some settings if we are streaming to a file and check for existence and perms of destination directory
    289297                        $r['blocking'] = true;
    290                         if ( ! wp_is_writable( dirname( $r['filename'] ) ) )
     298                        if ( ! wp_is_writable( dirname( $r['filename'] ) ) ) {
    291299                                return new WP_Error( 'http_request_failed', __( 'Destination directory for file streaming does not exist or is not writable.' ) );
     300                        }
    292301                }
    293302
    294                 if ( is_null( $r['headers'] ) )
     303                if ( is_null( $r['headers'] ) ) {
    295304                        $r['headers'] = array();
     305                }
    296306
     307                // WP allows passing in headers as a string, weirdly.
    297308                if ( ! is_array( $r['headers'] ) ) {
    298                         $processedHeaders = self::processHeaders( $r['headers'], $url );
     309                        $processedHeaders = WP_Http::processHeaders( $r['headers'] );
    299310                        $r['headers'] = $processedHeaders['headers'];
    300311                }
    301312
    302                 if ( isset( $r['headers']['User-Agent'] ) ) {
    303                         $r['user-agent'] = $r['headers']['User-Agent'];
    304                         unset( $r['headers']['User-Agent'] );
     313                // Setup arguments
     314                $headers = $r['headers'];
     315                $data = $r['body'];
     316                $type = $r['method'];
     317                $options = array(
     318                        'timeout' => $r['timeout'],
     319                        'useragent' => $r['user-agent'],
     320                        'blocking' => $r['blocking'],
     321                        'hooks' => $this->hook_adapter,
     322                );
     323
     324                if ( $r['stream'] ) {
     325                        $options['filename'] = $r['filename'];
    305326                }
     327                if ( empty( $r['redirection'] ) ) {
     328                        $options['follow_redirects'] = false;
     329                }
     330                else {
     331                        $options['redirects'] = $r['redirection'];
     332                }
    306333
    307                 if ( isset( $r['headers']['user-agent'] ) ) {
    308                         $r['user-agent'] = $r['headers']['user-agent'];
    309                         unset( $r['headers']['user-agent'] );
     334                // Use byte limit, if we can
     335                if ( isset( $r['limit_response_size'] ) ) {
     336                        $options['max_bytes'] = $r['limit_response_size'];
    310337                }
    311338
    312                 if ( '1.1' == $r['httpversion'] && !isset( $r['headers']['connection'] ) ) {
    313                         $r['headers']['connection'] = 'close';
     339                // If we've got cookies, use them
     340                if ( ! empty( $r['cookies'] ) ) {
     341                        $options['cookies'] = $r['cookies'];
    314342                }
    315343
    316                 // Construct Cookie: header if any cookies are set.
    317                 self::buildCookieHeader( $r );
     344                // SSL certificate handling
     345                if ( ! $r['sslverify'] ) {
     346                        $options['verify'] = false;
     347                }
     348                else {
     349                        $options['verify'] = $r['sslcertificates'];
     350                }
    318351
    319                 // Avoid issues where mbstring.func_overload is enabled.
    320                 mbstring_binary_safe_encoding();
     352                /**
     353                 * Filter whether SSL should be verified for non-local requests.
     354                 *
     355                 * @since 2.8.0
     356                 *
     357                 * @param bool $ssl_verify Whether to verify the SSL connection. Default true.
     358                 */
     359                $options['verify'] = apply_filters( 'https_ssl_verify', $options['verify'] );
    321360
    322                 if ( ! isset( $r['headers']['Accept-Encoding'] ) ) {
    323                         if ( $encoding = WP_Http_Encoding::accept_encoding( $url, $r ) )
    324                                 $r['headers']['Accept-Encoding'] = $encoding;
     361                try {
     362                        $response = Requests::request( $url, $headers, $data, $type, $options );
    325363                }
     364                catch ( Requests_Exception $e ) {
     365                        $response = new WP_Error( 'http_request_failed', $e->getMessage() );
     366                }
    326367
    327                 if ( ( ! is_null( $r['body'] ) && '' != $r['body'] ) || 'POST' == $r['method'] || 'PUT' == $r['method'] ) {
    328                         if ( is_array( $r['body'] ) || is_object( $r['body'] ) ) {
    329                                 $r['body'] = http_build_query( $r['body'], null, '&' );
     368                /**
     369                 * Fires after an HTTP API response is received and before the response is returned.
     370                 *
     371                 * @since 2.8.0
     372                 *
     373                 * @param array|WP_Error $response HTTP response or WP_Error object.
     374                 * @param string         $context  Context under which the hook is fired.
     375                 * @param string         $class    HTTP transport used.
     376                 * @param array          $args     HTTP request arguments.
     377                 * @param string         $url      The request URL.
     378                 */
     379                do_action( 'http_api_debug', $response, 'response', 'Requests', $r, $url );
     380                if ( is_wp_error( $response ) ) {
     381                        return $response;
     382                }
    330383
    331                                 if ( ! isset( $r['headers']['Content-Type'] ) )
    332                                         $r['headers']['Content-Type'] = 'application/x-www-form-urlencoded; charset=' . get_option( 'blog_charset' );
    333                         }
    334 
    335                         if ( '' === $r['body'] )
    336                                 $r['body'] = null;
    337 
    338                         if ( ! isset( $r['headers']['Content-Length'] ) && ! isset( $r['headers']['content-length'] ) )
    339                                 $r['headers']['Content-Length'] = strlen( $r['body'] );
     384                if ( ! $r['blocking'] ) {
     385                        return array(
     386                                'headers' => array(),
     387                                'body' => '',
     388                                'response' => array(
     389                                        'code' => false,
     390                                        'message' => false,
     391                                ),
     392                                'cookies' => array(),
     393                        );
    340394                }
    341395
    342                 $response = $this->_dispatch_request( $url, $r );
     396                // Convert the response into an array
     397                $data = new WP_HTTP_Requests_Response( $response, $r['filename'] );
    343398
    344                 reset_mbstring_encoding();
     399                /**
     400                 * Filter the HTTP API response immediately before the response is returned.
     401                 *
     402                 * @since 2.9.0
     403                 *
     404                 * @param array  $data HTTP response.
     405                 * @param array  $r    HTTP request arguments.
     406                 * @param string $url  The request URL.
     407                 */
     408                return apply_filters( 'http_response', $data, $r, $url );
     409        }
    345410
    346                 if ( is_wp_error( $response ) )
    347                         return $response;
    348 
    349                 // Append cookies that were used in this request to the response
    350                 if ( ! empty( $r['cookies'] ) ) {
    351                         $cookies_set = wp_list_pluck( $response['cookies'], 'name' );
    352                         foreach ( $r['cookies'] as $cookie ) {
    353                                 if ( ! in_array( $cookie->name, $cookies_set ) && $cookie->test( $url ) ) {
    354                                         $response['cookies'][] = $cookie;
    355                                 }
    356                         }
     411        /**
     412         * Match redirect behaviour to browser handling.
     413         *
     414         * Changes 302 redirects from POST to GET to match browser handling. Per
     415         * RFC 7231, user agents can deviate from the strict reading of the
     416         * specification for compatibility purposes.
     417         *
     418         * @param string $location URL to redirect to.
     419         * @param array $headers Headers for the redirect.
     420         * @param array $options Redirect request options.
     421         * @param Requests_Response $original Response object.
     422         */
     423        public static function browser_redirect_compatibility( $location, $headers, $data, &$options, $original ) {
     424                // Browser compat
     425                if ( $original->status_code === 302 ) {
     426                        $options['type'] = Requests::GET;
    357427                }
    358 
    359                 return $response;
    360428        }
    361429
    362430        /**
  • src/wp-includes/class-requests.php

     
     1<?php
     2/**
     3 * Requests for PHP
     4 *
     5 * Inspired by Requests for Python.
     6 *
     7 * Based on concepts from SimplePie_File, RequestCore and WP_Http.
     8 *
     9 * @package Requests
     10 */
     11
     12/**
     13 * Requests for PHP
     14 *
     15 * Inspired by Requests for Python.
     16 *
     17 * Based on concepts from SimplePie_File, RequestCore and WP_Http.
     18 *
     19 * @package Requests
     20 */
     21class Requests {
     22        /**
     23         * POST method
     24         *
     25         * @var string
     26         */
     27        const POST = 'POST';
     28
     29        /**
     30         * PUT method
     31         *
     32         * @var string
     33         */
     34        const PUT = 'PUT';
     35
     36        /**
     37         * GET method
     38         *
     39         * @var string
     40         */
     41        const GET = 'GET';
     42
     43        /**
     44         * HEAD method
     45         *
     46         * @var string
     47         */
     48        const HEAD = 'HEAD';
     49
     50        /**
     51         * DELETE method
     52         *
     53         * @var string
     54         */
     55        const DELETE = 'DELETE';
     56
     57        /**
     58         * OPTIONS method
     59         *
     60         * @var string
     61         */
     62        const OPTIONS = 'OPTIONS';
     63
     64        /**
     65         * TRACE method
     66         *
     67         * @var string
     68         */
     69        const TRACE = 'TRACE';
     70
     71        /**
     72         * PATCH method
     73         *
     74         * @link http://tools.ietf.org/html/rfc5789
     75         * @var string
     76         */
     77        const PATCH = 'PATCH';
     78
     79        /**
     80         * Default size of buffer size to read streams
     81         *
     82         * @var integer
     83         */
     84        const BUFFER_SIZE = 1160;
     85
     86        /**
     87         * Current version of Requests
     88         *
     89         * @var string
     90         */
     91        const VERSION = '1.6';
     92
     93        /**
     94         * Registered transport classes
     95         *
     96         * @var array
     97         */
     98        protected static $transports = array();
     99
     100        /**
     101         * Selected transport name
     102         *
     103         * Use {@see get_transport()} instead
     104         *
     105         * @var array
     106         */
     107        public static $transport = array();
     108
     109        /**
     110         * This is a static class, do not instantiate it
     111         *
     112         * @codeCoverageIgnore
     113         */
     114        private function __construct() {}
     115
     116        /**
     117         * Autoloader for Requests
     118         *
     119         * Register this with {@see register_autoloader()} if you'd like to avoid
     120         * having to create your own.
     121         *
     122         * (You can also use `spl_autoload_register` directly if you'd prefer.)
     123         *
     124         * @codeCoverageIgnore
     125         *
     126         * @param string $class Class name to load
     127         */
     128        public static function autoloader($class) {
     129                // Check that the class starts with "Requests"
     130                if (strpos($class, 'Requests') !== 0) {
     131                        return;
     132                }
     133
     134                $file = str_replace('_', '/', $class);
     135                if (file_exists(dirname(__FILE__) . '/' . $file . '.php')) {
     136                        require_once(dirname(__FILE__) . '/' . $file . '.php');
     137                }
     138        }
     139
     140        /**
     141         * Register the built-in autoloader
     142         *
     143         * @codeCoverageIgnore
     144         */
     145        public static function register_autoloader() {
     146                spl_autoload_register(array('Requests', 'autoloader'));
     147        }
     148
     149        /**
     150         * Register a transport
     151         *
     152         * @param string $transport Transport class to add, must support the Requests_Transport interface
     153         */
     154        public static function add_transport($transport) {
     155                if (empty(self::$transports)) {
     156                        self::$transports = array(
     157                                'Requests_Transport_cURL',
     158                                'Requests_Transport_fsockopen',
     159                        );
     160                }
     161
     162                self::$transports = array_merge(self::$transports, array($transport));
     163        }
     164
     165        /**
     166         * Get a working transport
     167         *
     168         * @throws Requests_Exception If no valid transport is found (`notransport`)
     169         * @return Requests_Transport
     170         */
     171        protected static function get_transport($capabilities = array()) {
     172                // Caching code, don't bother testing coverage
     173                // @codeCoverageIgnoreStart
     174                // array of capabilities as a string to be used as an array key
     175                ksort($capabilities);
     176                $cap_string = serialize($capabilities);
     177
     178                // Don't search for a transport if it's already been done for these $capabilities
     179                if (isset(self::$transport[$cap_string]) && self::$transport[$cap_string] !== null) {
     180                        return new self::$transport[$cap_string]();
     181                }
     182                // @codeCoverageIgnoreEnd
     183
     184                if (empty(self::$transports)) {
     185                        self::$transports = array(
     186                                'Requests_Transport_cURL',
     187                                'Requests_Transport_fsockopen',
     188                        );
     189                }
     190
     191                // Find us a working transport
     192                foreach (self::$transports as $class) {
     193                        if (!class_exists($class)) {
     194                                continue;
     195                        }
     196
     197                        $result = call_user_func(array($class, 'test'), $capabilities);
     198                        if ($result) {
     199                                self::$transport[$cap_string] = $class;
     200                                break;
     201                        }
     202                }
     203                if (self::$transport[$cap_string] === null) {
     204                        throw new Requests_Exception('No working transports found', 'notransport', self::$transports);
     205                }
     206
     207                return new self::$transport[$cap_string]();
     208        }
     209
     210        /**#@+
     211         * @see request()
     212         * @param string $url
     213         * @param array $headers
     214         * @param array $options
     215         * @return Requests_Response
     216         */
     217        /**
     218         * Send a GET request
     219         */
     220        public static function get($url, $headers = array(), $options = array()) {
     221                return self::request($url, $headers, null, self::GET, $options);
     222        }
     223
     224        /**
     225         * Send a HEAD request
     226         */
     227        public static function head($url, $headers = array(), $options = array()) {
     228                return self::request($url, $headers, null, self::HEAD, $options);
     229        }
     230
     231        /**
     232         * Send a DELETE request
     233         */
     234        public static function delete($url, $headers = array(), $options = array()) {
     235                return self::request($url, $headers, null, self::DELETE, $options);
     236        }
     237
     238        /**
     239         * Send a TRACE request
     240         */
     241        public static function trace($url, $headers = array(), $options = array()) {
     242                return self::request($url, $headers, null, self::TRACE, $options);
     243        }
     244        /**#@-*/
     245
     246        /**#@+
     247         * @see request()
     248         * @param string $url
     249         * @param array $headers
     250         * @param array $data
     251         * @param array $options
     252         * @return Requests_Response
     253         */
     254        /**
     255         * Send a POST request
     256         */
     257        public static function post($url, $headers = array(), $data = array(), $options = array()) {
     258                return self::request($url, $headers, $data, self::POST, $options);
     259        }
     260        /**
     261         * Send a PUT request
     262         */
     263        public static function put($url, $headers = array(), $data = array(), $options = array()) {
     264                return self::request($url, $headers, $data, self::PUT, $options);
     265        }
     266
     267        /**
     268         * Send an OPTIONS request
     269         */
     270        public static function options($url, $headers = array(), $data = array(), $options = array()) {
     271                return self::request($url, $headers, $data, self::OPTIONS, $options);
     272        }
     273
     274        /**
     275         * Send a PATCH request
     276         *
     277         * Note: Unlike {@see post} and {@see put}, `$headers` is required, as the
     278         * specification recommends that should send an ETag
     279         *
     280         * @link http://tools.ietf.org/html/rfc5789
     281         */
     282        public static function patch($url, $headers, $data = array(), $options = array()) {
     283                return self::request($url, $headers, $data, self::PATCH, $options);
     284        }
     285        /**#@-*/
     286
     287        /**
     288         * Main interface for HTTP requests
     289         *
     290         * This method initiates a request and sends it via a transport before
     291         * parsing.
     292         *
     293         * The `$options` parameter takes an associative array with the following
     294         * options:
     295         *
     296         * - `timeout`: How long should we wait for a response?
     297         *    (float, seconds with a millisecond precision, default: 10, example: 0.01)
     298         * - `connect_timeout`: How long should we wait while trying to connect?
     299         *    (float, seconds with a millisecond precision, default: 10, example: 0.01)
     300         * - `useragent`: Useragent to send to the server
     301         *    (string, default: php-requests/$version)
     302         * - `follow_redirects`: Should we follow 3xx redirects?
     303         *    (boolean, default: true)
     304         * - `redirects`: How many times should we redirect before erroring?
     305         *    (integer, default: 10)
     306         * - `blocking`: Should we block processing on this request?
     307         *    (boolean, default: true)
     308         * - `filename`: File to stream the body to instead.
     309         *    (string|boolean, default: false)
     310         * - `auth`: Authentication handler or array of user/password details to use
     311         *    for Basic authentication
     312         *    (Requests_Auth|array|boolean, default: false)
     313         * - `proxy`: Proxy details to use for proxy by-passing and authentication
     314         *    (Requests_Proxy|array|boolean, default: false)
     315         * - `max_bytes`: Limit for the response body size.
     316         *    (integer|boolean, default: false)
     317         * - `idn`: Enable IDN parsing
     318         *    (boolean, default: true)
     319         * - `transport`: Custom transport. Either a class name, or a
     320         *    transport object. Defaults to the first working transport from
     321         *    {@see getTransport()}
     322         *    (string|Requests_Transport, default: {@see getTransport()})
     323         * - `hooks`: Hooks handler.
     324         *    (Requests_Hooker, default: new Requests_Hooks())
     325         * - `verify`: Should we verify SSL certificates? Allows passing in a custom
     326         *    certificate file as a string. (Using true uses the system-wide root
     327         *    certificate store instead, but this may have different behaviour
     328         *    across transports.)
     329         *    (string|boolean, default: library/Requests/Transport/cacert.pem)
     330         * - `verifyname`: Should we verify the common name in the SSL certificate?
     331         *    (boolean: default, true)
     332         * - `data_format`: How should we send the `$data` parameter?
     333         *    (string, one of 'query' or 'body', default: 'query' for
     334         *    HEAD/GET/DELETE, 'body' for POST/PUT/OPTIONS/PATCH)
     335         *
     336         * @throws Requests_Exception On invalid URLs (`nonhttp`)
     337         *
     338         * @param string $url URL to request
     339         * @param array $headers Extra headers to send with the request
     340         * @param array|null $data Data to send either as a query string for GET/HEAD requests, or in the body for POST requests
     341         * @param string $type HTTP request type (use Requests constants)
     342         * @param array $options Options for the request (see description for more information)
     343         * @return Requests_Response
     344         */
     345        public static function request($url, $headers = array(), $data = array(), $type = self::GET, $options = array()) {
     346                if (empty($options['type'])) {
     347                        $options['type'] = $type;
     348                }
     349                $options = array_merge(self::get_default_options(), $options);
     350
     351                self::set_defaults($url, $headers, $data, $type, $options);
     352
     353                $options['hooks']->dispatch('requests.before_request', array(&$url, &$headers, &$data, &$type, &$options));
     354
     355                if (!empty($options['transport'])) {
     356                        $transport = $options['transport'];
     357
     358                        if (is_string($options['transport'])) {
     359                                $transport = new $transport();
     360                        }
     361                }
     362                else {
     363                        $need_ssl = (0 === stripos($url, 'https://'));
     364                        $capabilities = array('ssl' => $need_ssl);
     365                        $transport = self::get_transport($capabilities);
     366                }
     367                $response = $transport->request($url, $headers, $data, $options);
     368
     369                $options['hooks']->dispatch('requests.before_parse', array(&$response, $url, $headers, $data, $type, $options));
     370
     371                return self::parse_response($response, $url, $headers, $data, $options);
     372        }
     373
     374        /**
     375         * Send multiple HTTP requests simultaneously
     376         *
     377         * The `$requests` parameter takes an associative or indexed array of
     378         * request fields. The key of each request can be used to match up the
     379         * request with the returned data, or with the request passed into your
     380         * `multiple.request.complete` callback.
     381         *
     382         * The request fields value is an associative array with the following keys:
     383         *
     384         * - `url`: Request URL Same as the `$url` parameter to
     385         *    {@see Requests::request}
     386         *    (string, required)
     387         * - `headers`: Associative array of header fields. Same as the `$headers`
     388         *    parameter to {@see Requests::request}
     389         *    (array, default: `array()`)
     390         * - `data`: Associative array of data fields or a string. Same as the
     391         *    `$data` parameter to {@see Requests::request}
     392         *    (array|string, default: `array()`)
     393         * - `type`: HTTP request type (use Requests constants). Same as the `$type`
     394         *    parameter to {@see Requests::request}
     395         *    (string, default: `Requests::GET`)
     396         * - `cookies`: Associative array of cookie name to value, or cookie jar.
     397         *    (array|Requests_Cookie_Jar)
     398         *
     399         * If the `$options` parameter is specified, individual requests will
     400         * inherit options from it. This can be used to use a single hooking system,
     401         * or set all the types to `Requests::POST`, for example.
     402         *
     403         * In addition, the `$options` parameter takes the following global options:
     404         *
     405         * - `complete`: A callback for when a request is complete. Takes two
     406         *    parameters, a Requests_Response/Requests_Exception reference, and the
     407         *    ID from the request array (Note: this can also be overridden on a
     408         *    per-request basis, although that's a little silly)
     409         *    (callback)
     410         *
     411         * @param array $requests Requests data (see description for more information)
     412         * @param array $options Global and default options (see {@see Requests::request})
     413         * @return array Responses (either Requests_Response or a Requests_Exception object)
     414         */
     415        public static function request_multiple($requests, $options = array()) {
     416                $options = array_merge(self::get_default_options(true), $options);
     417
     418                if (!empty($options['hooks'])) {
     419                        $options['hooks']->register('transport.internal.parse_response', array('Requests', 'parse_multiple'));
     420                        if (!empty($options['complete'])) {
     421                                $options['hooks']->register('multiple.request.complete', $options['complete']);
     422                        }
     423                }
     424
     425                foreach ($requests as $id => &$request) {
     426                        if (!isset($request['headers'])) {
     427                                $request['headers'] = array();
     428                        }
     429                        if (!isset($request['data'])) {
     430                                $request['data'] = array();
     431                        }
     432                        if (!isset($request['type'])) {
     433                                $request['type'] = self::GET;
     434                        }
     435                        if (!isset($request['options'])) {
     436                                $request['options'] = $options;
     437                                $request['options']['type'] = $request['type'];
     438                        }
     439                        else {
     440                                if (empty($request['options']['type'])) {
     441                                        $request['options']['type'] = $request['type'];
     442                                }
     443                                $request['options'] = array_merge($options, $request['options']);
     444                        }
     445
     446                        self::set_defaults($request['url'], $request['headers'], $request['data'], $request['type'], $request['options']);
     447
     448                        // Ensure we only hook in once
     449                        if ($request['options']['hooks'] !== $options['hooks']) {
     450                                $request['options']['hooks']->register('transport.internal.parse_response', array('Requests', 'parse_multiple'));
     451                                if (!empty($request['options']['complete'])) {
     452                                        $request['options']['hooks']->register('multiple.request.complete', $request['options']['complete']);
     453                                }
     454                        }
     455                }
     456                unset($request);
     457
     458                if (!empty($options['transport'])) {
     459                        $transport = $options['transport'];
     460
     461                        if (is_string($options['transport'])) {
     462                                $transport = new $transport();
     463                        }
     464                }
     465                else {
     466                        $transport = self::get_transport();
     467                }
     468                $responses = $transport->request_multiple($requests, $options);
     469
     470                foreach ($responses as $id => &$response) {
     471                        // If our hook got messed with somehow, ensure we end up with the
     472                        // correct response
     473                        if (is_string($response)) {
     474                                $request = $requests[$id];
     475                                self::parse_multiple($response, $request);
     476                                $request['options']['hooks']->dispatch('multiple.request.complete', array(&$response, $id));
     477                        }
     478                }
     479
     480                return $responses;
     481        }
     482
     483        /**
     484         * Get the default options
     485         *
     486         * @see Requests::request() for values returned by this method
     487         * @param boolean $multirequest Is this a multirequest?
     488         * @return array Default option values
     489         */
     490        protected static function get_default_options($multirequest = false) {
     491                $defaults = array(
     492                        'timeout' => 10,
     493                        'connect_timeout' => 10,
     494                        'useragent' => 'php-requests/' . self::VERSION,
     495                        'protocol_version' => 1.1,
     496                        'redirected' => 0,
     497                        'redirects' => 10,
     498                        'follow_redirects' => true,
     499                        'blocking' => true,
     500                        'type' => self::GET,
     501                        'filename' => false,
     502                        'auth' => false,
     503                        'proxy' => false,
     504                        'cookies' => false,
     505                        'max_bytes' => false,
     506                        'idn' => true,
     507                        'hooks' => null,
     508                        'transport' => null,
     509                        'verify' => dirname(__FILE__) . '/Requests/Transport/cacert.pem',
     510                        'verifyname' => true,
     511                );
     512                if ($multirequest !== false) {
     513                        $defaults['complete'] = null;
     514                }
     515                return $defaults;
     516        }
     517
     518        /**
     519         * Set the default values
     520         *
     521         * @param string $url URL to request
     522         * @param array $headers Extra headers to send with the request
     523         * @param array|null $data Data to send either as a query string for GET/HEAD requests, or in the body for POST requests
     524         * @param string $type HTTP request type
     525         * @param array $options Options for the request
     526         * @return array $options
     527         */
     528        protected static function set_defaults(&$url, &$headers, &$data, &$type, &$options) {
     529                if (!preg_match('/^http(s)?:\/\//i', $url, $matches)) {
     530                        throw new Requests_Exception('Only HTTP(S) requests are handled.', 'nonhttp', $url);
     531                }
     532
     533                if (empty($options['hooks'])) {
     534                        $options['hooks'] = new Requests_Hooks();
     535                }
     536
     537                if (is_array($options['auth'])) {
     538                        $options['auth'] = new Requests_Auth_Basic($options['auth']);
     539                }
     540                if ($options['auth'] !== false) {
     541                        $options['auth']->register($options['hooks']);
     542                }
     543
     544                if (!empty($options['proxy'])) {
     545                        $options['proxy'] = new Requests_Proxy_HTTP($options['proxy']);
     546                }
     547                if ($options['proxy'] !== false) {
     548                        $options['proxy']->register($options['hooks']);
     549                }
     550
     551                if (is_array($options['cookies'])) {
     552                        $options['cookies'] = new Requests_Cookie_Jar($options['cookies']);
     553                }
     554                elseif (empty($options['cookies'])) {
     555                        $options['cookies'] = new Requests_Cookie_Jar();
     556                }
     557                if ($options['cookies'] !== false) {
     558                        $options['cookies']->register($options['hooks']);
     559                }
     560
     561                if ($options['idn'] !== false) {
     562                        $iri = new Requests_IRI($url);
     563                        $iri->host = Requests_IDNAEncoder::encode($iri->ihost);
     564                        $url = $iri->uri;
     565                }
     566
     567                if (!isset($options['data_format'])) {
     568                        if (in_array($type, array(self::HEAD, self::GET, self::DELETE))) {
     569                                $options['data_format'] = 'query';
     570                        }
     571                        else {
     572                                $options['data_format'] = 'body';
     573                        }
     574                }
     575        }
     576
     577        /**
     578         * HTTP response parser
     579         *
     580         * @throws Requests_Exception On missing head/body separator (`requests.no_crlf_separator`)
     581         * @throws Requests_Exception On missing head/body separator (`noversion`)
     582         * @throws Requests_Exception On missing head/body separator (`toomanyredirects`)
     583         *
     584         * @param string $headers Full response text including headers and body
     585         * @param string $url Original request URL
     586         * @param array $req_headers Original $headers array passed to {@link request()}, in case we need to follow redirects
     587         * @param array $req_data Original $data array passed to {@link request()}, in case we need to follow redirects
     588         * @param array $options Original $options array passed to {@link request()}, in case we need to follow redirects
     589         * @return Requests_Response
     590         */
     591        protected static function parse_response($headers, $url, $req_headers, $req_data, $options) {
     592                $return = new Requests_Response();
     593                if (!$options['blocking']) {
     594                        return $return;
     595                }
     596
     597                $return->raw = $headers;
     598                $return->url = $url;
     599
     600                if (!$options['filename']) {
     601                        if (($pos = strpos($headers, "\r\n\r\n")) === false) {
     602                                // Crap!
     603                                throw new Requests_Exception('Missing header/body separator', 'requests.no_crlf_separator');
     604                        }
     605
     606                        $headers = substr($return->raw, 0, $pos);
     607                        $return->body = substr($return->raw, $pos + strlen("\n\r\n\r"));
     608                }
     609                else {
     610                        $return->body = '';
     611                }
     612                // Pretend CRLF = LF for compatibility (RFC 2616, section 19.3)
     613                $headers = str_replace("\r\n", "\n", $headers);
     614                // Unfold headers (replace [CRLF] 1*( SP | HT ) with SP) as per RFC 2616 (section 2.2)
     615                $headers = preg_replace('/\n[ \t]/', ' ', $headers);
     616                $headers = explode("\n", $headers);
     617                preg_match('#^HTTP/(1\.\d)[ \t]+(\d+)#i', array_shift($headers), $matches);
     618                if (empty($matches)) {
     619                        throw new Requests_Exception('Response could not be parsed', 'noversion', $headers);
     620                }
     621                $return->protocol_version = (float) $matches[1];
     622                $return->status_code = (int) $matches[2];
     623                if ($return->status_code >= 200 && $return->status_code < 300) {
     624                        $return->success = true;
     625                }
     626
     627                foreach ($headers as $header) {
     628                        list($key, $value) = explode(':', $header, 2);
     629                        $value = trim($value);
     630                        preg_replace('#(\s+)#i', ' ', $value);
     631                        $return->headers[$key] = $value;
     632                }
     633                if (isset($return->headers['transfer-encoding'])) {
     634                        $return->body = self::decode_chunked($return->body);
     635                        unset($return->headers['transfer-encoding']);
     636                }
     637                if (isset($return->headers['content-encoding'])) {
     638                        $return->body = self::decompress($return->body);
     639                }
     640
     641                //fsockopen and cURL compatibility
     642                if (isset($return->headers['connection'])) {
     643                        unset($return->headers['connection']);
     644                }
     645
     646                $options['hooks']->dispatch('requests.before_redirect_check', array(&$return, $req_headers, $req_data, $options));
     647
     648                if ($return->is_redirect() && $options['follow_redirects'] === true) {
     649                        if (isset($return->headers['location']) && $options['redirected'] < $options['redirects']) {
     650                                if ($return->status_code === 303) {
     651                                        $options['type'] = self::GET;
     652                                }
     653                                $options['redirected']++;
     654                                $location = $return->headers['location'];
     655                                if (strpos($location, 'http://') !== 0 && strpos($location, 'https://') !== 0) {
     656                                        // relative redirect, for compatibility make it absolute
     657                                        $location = Requests_IRI::absolutize($url, $location);
     658                                        $location = $location->uri;
     659                                }
     660
     661                                $hook_args = array(
     662                                        &$location,
     663                                        &$req_headers,
     664                                        &$req_data,
     665                                        &$options,
     666                                        $return
     667                                );
     668                                $options['hooks']->dispatch('requests.before_redirect', $hook_args);
     669                                $redirected = self::request($location, $req_headers, $req_data, $options['type'], $options);
     670                                $redirected->history[] = $return;
     671                                return $redirected;
     672                        }
     673                        elseif ($options['redirected'] >= $options['redirects']) {
     674                                throw new Requests_Exception('Too many redirects', 'toomanyredirects', $return);
     675                        }
     676                }
     677
     678                $return->redirects = $options['redirected'];
     679
     680                $options['hooks']->dispatch('requests.after_request', array(&$return, $req_headers, $req_data, $options));
     681                return $return;
     682        }
     683
     684        /**
     685         * Callback for `transport.internal.parse_response`
     686         *
     687         * Internal use only. Converts a raw HTTP response to a Requests_Response
     688         * while still executing a multiple request.
     689         *
     690         * @param string $response Full response text including headers and body (will be overwritten with Response instance)
     691         * @param array $request Request data as passed into {@see Requests::request_multiple()}
     692         * @return null `$response` is either set to a Requests_Response instance, or a Requests_Exception object
     693         */
     694        public static function parse_multiple(&$response, $request) {
     695                try {
     696                        $url = $request['url'];
     697                        $headers = $request['headers'];
     698                        $data = $request['data'];
     699                        $options = $request['options'];
     700                        $response = self::parse_response($response, $url, $headers, $data, $options);
     701                }
     702                catch (Requests_Exception $e) {
     703                        $response = $e;
     704                }
     705        }
     706
     707        /**
     708         * Decoded a chunked body as per RFC 2616
     709         *
     710         * @see http://tools.ietf.org/html/rfc2616#section-3.6.1
     711         * @param string $data Chunked body
     712         * @return string Decoded body
     713         */
     714        protected static function decode_chunked($data) {
     715                if (!preg_match('/^([0-9a-f]+)[^\r\n]*\r\n/i', trim($data))) {
     716                        return $data;
     717                }
     718
     719                $decoded = '';
     720                $encoded = $data;
     721
     722                while (true) {
     723                        $is_chunked = (bool) preg_match('/^([0-9a-f]+)[^\r\n]*\r\n/i', $encoded, $matches);
     724                        if (!$is_chunked) {
     725                                // Looks like it's not chunked after all
     726                                return $data;
     727                        }
     728
     729                        $length = hexdec(trim($matches[1]));
     730                        if ($length === 0) {
     731                                // Ignore trailer headers
     732                                return $decoded;
     733                        }
     734
     735                        $chunk_length = strlen($matches[0]);
     736                        $decoded .= substr($encoded, $chunk_length, $length);
     737                        $encoded = substr($encoded, $chunk_length + $length + 2);
     738
     739                        if (trim($encoded) === '0' || empty($encoded)) {
     740                                return $decoded;
     741                        }
     742                }
     743
     744                // We'll never actually get down here
     745                // @codeCoverageIgnoreStart
     746        }
     747        // @codeCoverageIgnoreEnd
     748
     749        /**
     750         * Convert a key => value array to a 'key: value' array for headers
     751         *
     752         * @param array $array Dictionary of header values
     753         * @return array List of headers
     754         */
     755        public static function flatten($array) {
     756                $return = array();
     757                foreach ($array as $key => $value) {
     758                        $return[] = sprintf('%s: %s', $key, $value);
     759                }
     760                return $return;
     761        }
     762
     763        /**
     764         * Convert a key => value array to a 'key: value' array for headers
     765         *
     766         * @deprecated Misspelling of {@see Requests::flatten}
     767         * @param array $array Dictionary of header values
     768         * @return array List of headers
     769         */
     770        public static function flattern($array) {
     771                return self::flatten($array);
     772        }
     773
     774        /**
     775         * Decompress an encoded body
     776         *
     777         * Implements gzip, compress and deflate. Guesses which it is by attempting
     778         * to decode.
     779         *
     780         * @param string $data Compressed data in one of the above formats
     781         * @return string Decompressed string
     782         */
     783        public static function decompress($data) {
     784                if (substr($data, 0, 2) !== "\x1f\x8b" && substr($data, 0, 2) !== "\x78\x9c") {
     785                        // Not actually compressed. Probably cURL ruining this for us.
     786                        return $data;
     787                }
     788
     789                if (function_exists('gzdecode') && ($decoded = @gzdecode($data)) !== false) {
     790                        return $decoded;
     791                }
     792                elseif (function_exists('gzinflate') && ($decoded = @gzinflate($data)) !== false) {
     793                        return $decoded;
     794                }
     795                elseif (($decoded = self::compatible_gzinflate($data)) !== false) {
     796                        return $decoded;
     797                }
     798                elseif (function_exists('gzuncompress') && ($decoded = @gzuncompress($data)) !== false) {
     799                        return $decoded;
     800                }
     801
     802                return $data;
     803        }
     804
     805        /**
     806         * Decompression of deflated string while staying compatible with the majority of servers.
     807         *
     808         * Certain Servers will return deflated data with headers which PHP's gzinflate()
     809         * function cannot handle out of the box. The following function has been created from
     810         * various snippets on the gzinflate() PHP documentation.
     811         *
     812         * Warning: Magic numbers within. Due to the potential different formats that the compressed
     813         * data may be returned in, some "magic offsets" are needed to ensure proper decompression
     814         * takes place. For a simple progmatic way to determine the magic offset in use, see:
     815         * http://core.trac.wordpress.org/ticket/18273
     816         *
     817         * @since 2.8.1
     818         * @link http://core.trac.wordpress.org/ticket/18273
     819         * @link http://au2.php.net/manual/en/function.gzinflate.php#70875
     820         * @link http://au2.php.net/manual/en/function.gzinflate.php#77336
     821         *
     822         * @param string $gzData String to decompress.
     823         * @return string|bool False on failure.
     824         */
     825        public static function compatible_gzinflate($gzData) {
     826                // Compressed data might contain a full zlib header, if so strip it for
     827                // gzinflate()
     828                if (substr($gzData, 0, 3) == "\x1f\x8b\x08") {
     829                        $i = 10;
     830                        $flg = ord(substr($gzData, 3, 1));
     831                        if ($flg > 0) {
     832                                if ($flg & 4) {
     833                                        list($xlen) = unpack('v', substr($gzData, $i, 2));
     834                                        $i = $i + 2 + $xlen;
     835                                }
     836                                if ($flg & 8) {
     837                                        $i = strpos($gzData, "\0", $i) + 1;
     838                                }
     839                                if ($flg & 16) {
     840                                        $i = strpos($gzData, "\0", $i) + 1;
     841                                }
     842                                if ($flg & 2) {
     843                                        $i = $i + 2;
     844                                }
     845                        }
     846                        $decompressed = self::compatible_gzinflate(substr($gzData, $i));
     847                        if (false !== $decompressed) {
     848                                return $decompressed;
     849                        }
     850                }
     851
     852                // If the data is Huffman Encoded, we must first strip the leading 2
     853                // byte Huffman marker for gzinflate()
     854                // The response is Huffman coded by many compressors such as
     855                // java.util.zip.Deflater, Ruby’s Zlib::Deflate, and .NET's
     856                // System.IO.Compression.DeflateStream.
     857                //
     858                // See http://decompres.blogspot.com/ for a quick explanation of this
     859                // data type
     860                $huffman_encoded = false;
     861
     862                // low nibble of first byte should be 0x08
     863                list(, $first_nibble)    = unpack('h', $gzData);
     864
     865                // First 2 bytes should be divisible by 0x1F
     866                list(, $first_two_bytes) = unpack('n', $gzData);
     867
     868                if (0x08 == $first_nibble && 0 == ($first_two_bytes % 0x1F)) {
     869                        $huffman_encoded = true;
     870                }
     871
     872                if ($huffman_encoded) {
     873                        if (false !== ($decompressed = @gzinflate(substr($gzData, 2)))) {
     874                                return $decompressed;
     875                        }
     876                }
     877
     878                if ("\x50\x4b\x03\x04" == substr($gzData, 0, 4)) {
     879                        // ZIP file format header
     880                        // Offset 6: 2 bytes, General-purpose field
     881                        // Offset 26: 2 bytes, filename length
     882                        // Offset 28: 2 bytes, optional field length
     883                        // Offset 30: Filename field, followed by optional field, followed
     884                        // immediately by data
     885                        list(, $general_purpose_flag) = unpack('v', substr($gzData, 6, 2));
     886
     887                        // If the file has been compressed on the fly, 0x08 bit is set of
     888                        // the general purpose field. We can use this to differentiate
     889                        // between a compressed document, and a ZIP file
     890                        $zip_compressed_on_the_fly = (0x08 == (0x08 & $general_purpose_flag));
     891
     892                        if (!$zip_compressed_on_the_fly) {
     893                                // Don't attempt to decode a compressed zip file
     894                                return $gzData;
     895                        }
     896
     897                        // Determine the first byte of data, based on the above ZIP header
     898                        // offsets:
     899                        $first_file_start = array_sum(unpack('v2', substr($gzData, 26, 4)));
     900                        if (false !== ($decompressed = @gzinflate(substr($gzData, 30 + $first_file_start)))) {
     901                                return $decompressed;
     902                        }
     903                        return false;
     904                }
     905
     906                // Finally fall back to straight gzinflate
     907                if (false !== ($decompressed = @gzinflate($gzData))) {
     908                        return $decompressed;
     909                }
     910
     911                // Fallback for all above failing, not expected, but included for
     912                // debugging and preventing regressions and to track stats
     913                if (false !== ($decompressed = @gzinflate(substr($gzData, 2)))) {
     914                        return $decompressed;
     915                }
     916
     917                return false;
     918        }
     919
     920        public static function match_domain($host, $reference) {
     921                // Check for a direct match
     922                if ($host === $reference) {
     923                        return true;
     924                }
     925
     926                // Calculate the valid wildcard match if the host is not an IP address
     927                // Also validates that the host has 3 parts or more, as per Firefox's
     928                // ruleset.
     929                $parts = explode('.', $host);
     930                if (ip2long($host) === false && count($parts) >= 3) {
     931                        $parts[0] = '*';
     932                        $wildcard = implode('.', $parts);
     933                        if ($wildcard === $reference) {
     934                                return true;
     935                        }
     936                }
     937
     938                return false;
     939        }
     940}
  • src/wp-includes/class-wp-http-requests-response.php

     
     1<?php
     2
     3/**
     4 * Wrapper object for a Requests_Response for compatibility.
     5 *
     6 * @package WordPress
     7 * @subpackage HTTP
     8 * @since 4.6.0
     9 */
     10class WP_HTTP_Requests_Response extends WP_HTTP_Response implements ArrayAccess {
     11        /**
     12         * Requests Response object.
     13         *
     14         * @var Requests_Response
     15         */
     16        protected $response;
     17
     18        /**
     19         * Filename the response was saved to.
     20         *
     21         * @var string|null
     22         */
     23        protected $filename;
     24
     25        /**
     26         * Constructor.
     27         */
     28        public function __construct( Requests_Response $response, $filename = '' ) {
     29                $this->response = $response;
     30                $this->filename = $filename;
     31        }
     32
     33        /**
     34         * Get the response object for the request.
     35         *
     36         * @return Requests_Response
     37         */
     38        public function get_response_object() {
     39                return $this->response;
     40        }
     41
     42        /**
     43         * Retrieves headers associated with the response.
     44         *
     45         * @return array Map of header name to header value.
     46         */
     47        public function get_headers() {
     48                // Ensure headers remain case-insensitive
     49                $converted = new Requests_Utility_CaseInsensitiveDictionary();
     50
     51                foreach ( $this->response->headers->getAll() as $key => $value ) {
     52                        if ( count( $value ) === 1 ) {
     53                                $converted[ $key ] = $value[0];
     54                        }
     55                        else {
     56                                $converted[ $key ] = $value;
     57                        }
     58                }
     59
     60                return $converted;
     61        }
     62
     63        /**
     64         * Sets all header values.
     65         *
     66         * @param array $headers Map of header name to header value.
     67         */
     68        public function set_headers( $headers ) {
     69                $this->response->headers = new Requests_Response_Headers( $headers );
     70        }
     71
     72        /**
     73         * Sets a single HTTP header.
     74         *
     75         * @param string $key     Header name.
     76         * @param string $value   Header value.
     77         * @param bool   $replace Optional. Whether to replace an existing header of the same name.
     78         *                        Default true.
     79         */
     80        public function header( $key, $value, $replace = true ) {
     81                if ( $replace ) {
     82                        unset( $this->response->headers[ $key ] );
     83                }
     84
     85                $this->response->headers[ $key ] = $value;
     86        }
     87
     88        /**
     89         * Retrieves the HTTP return code for the response.
     90         *
     91         * @return int The 3-digit HTTP status code.
     92         */
     93        public function get_status() {
     94                return $this->response->status_code;
     95        }
     96
     97        /**
     98         * Sets the 3-digit HTTP status code.
     99         *
     100         * @param int $code HTTP status.
     101         */
     102        public function set_status( $code ) {
     103                $this->response->status_code = absint( $code );
     104        }
     105
     106        /**
     107         * Retrieves the response data.
     108         *
     109         * @return mixed Response data.
     110         */
     111        public function get_data() {
     112                return $this->response->body;
     113        }
     114
     115        /**
     116         * Sets the response data.
     117         *
     118         * @param mixed $data Response data.
     119         */
     120        public function set_data( $data ) {
     121                $this->response->body = $data;
     122        }
     123
     124        /**
     125         * Get cookies from the response.
     126         *
     127         * @return WP_HTTP_Cookie[] List of cookie objects.
     128         */
     129        public function get_cookies() {
     130                $cookies = array();
     131                foreach ( $this->response->cookies as $cookie ) {
     132                        $cookies[] = new WP_Http_Cookie( array(
     133                                'name'    => $cookie->name,
     134                                'value'   => urldecode( $cookie->value ),
     135                                'expires' => $cookie->attributes['expires'],
     136                                'path'    => $cookie->attributes['path'],
     137                                'domain'  => $cookie->attributes['domain'],
     138                        ));
     139                }
     140
     141                return $cookies;
     142        }
     143
     144        /**
     145         * Check if an ArrayAccess offset exists.
     146         *
     147         * This is for backwards compatibility for array access.
     148         *
     149         * @param string|int $key Array offset.
     150         * @return bool True if the offset exists, false otherwise.
     151         */
     152        public function offsetExists( $key ) {
     153                $allowed = array( 'headers', 'body', 'response', 'cookies', 'filename' );
     154                return in_array( $key, $allowed );
     155        }
     156
     157        /**
     158         * Get an ArrayAccess value.
     159         *
     160         * This is for backwards compatibility for array access.
     161         *
     162         * @param string|int $key Array offset to get.
     163         * @return mixed Value if the key is a valid offset, null if invalid.
     164         */
     165        public function offsetGet( $key ) {
     166                switch ( $key ) {
     167                        case 'headers':
     168                                return $this->get_headers();
     169
     170                        case 'body':
     171                                return $this->get_data();
     172
     173                        case 'response':
     174                                return array(
     175                                        'code'    => $this->get_status(),
     176                                        'message' => get_status_header_desc( $this->get_status() ),
     177                                );
     178
     179                        case 'cookies':
     180                                return $this->get_cookies();
     181
     182                        case 'filename':
     183                                return $this->filename;
     184                }
     185
     186                return null;
     187        }
     188
     189        /**
     190         * Set an ArrayAccess value.
     191         *
     192         * This is for backwards compatibility for array access.
     193         *
     194         * @param string|int $key Array offset to set.
     195         * @param mixed $value Value to set.
     196         */
     197        public function offsetSet( $key, $value ) {
     198                switch ( $key ) {
     199                        case 'headers':
     200                                $this->set_headers( $value );
     201                                break;
     202
     203                        case 'body':
     204                                $this->set_data( $value );
     205                                break;
     206
     207                        case 'response':
     208                                if ( isset( $value['code'] ) ) {
     209                                        $this->set_status( $value['code'] );
     210                                }
     211                                break;
     212
     213                        case 'filename':
     214                                $this->filename = $value;
     215                                break;
     216                }
     217        }
     218
     219        /**
     220         * Unset an ArrayAccess value.
     221         *
     222         * This is for backwards compatibility for array access.
     223         *
     224         * @param string|int $key Array offset to remove.
     225         */
     226        public function offsetUnset( $key ) {
     227                $this->offsetSet( $key, null );
     228        }
     229}
  • src/wp-includes/class-wp-requests-hooks.php

     
     1<?php
     2/**
     3 * HTTP API: Requests hook bridge class
     4 *
     5 * @package WordPress
     6 * @subpackage HTTP
     7 * @since 4.6.0
     8 */
     9
     10/**
     11 * Bridge to connect Requests internal hooks to WordPress filters.
     12 *
     13 * @package WordPress
     14 * @subpackage HTTP
     15 * @since 4.6.0
     16 */
     17class WP_Requests_Hooks implements Requests_Hooker {
     18        /**
     19         * Register a callback for a hook
     20         *
     21         * Defers to the WP hooking system, but adds 10 to the priority since WP's
     22         * default is 10 rather than 0. Also sets the parameter count as high as
     23         * possible.
     24         *
     25         * @param string $hook Hook name
     26         * @param callback $callback Function/method to call on event
     27         * @param int $priority Priority number. <0 is executed earlier, >0 is executed later
     28         */
     29        public function register( $hook, $callback, $priority = 0 ) {
     30                add_filter( 'requests-' . $hook, $callback, $priority + 10, 9999 );
     31        }
     32
     33        /**
     34         * Dispatch a message
     35         *
     36         * @param string $hook Hook name
     37         * @param array $parameters Parameters to pass to callbacks
     38         * @return boolean Successfulness
     39         */
     40        public function dispatch( $hook, $parameters = array() ) {
     41                do_action_ref_array( 'requests-' . $hook, $parameters );
     42                return true;
     43        }
     44}
  • src/wp-includes/default-filters.php

     
    206206add_filter( 'xmlrpc_pingback_error',    'xmlrpc_pingback_error'               );
    207207add_filter( 'title_save_pre',           'trim'                                );
    208208
    209 add_filter( 'http_request_host_is_external', 'allowed_http_request_hosts', 10, 2 );
     209add_filter( 'http_request_host_is_external',    'allowed_http_request_hosts',                          10, 2 );
     210add_action( 'requests-requests.before_redirect', array( 'WP_Http', 'browser_redirect_compatibility' ), 10, 5 );
    210211
    211212// REST API filters.
    212213add_action( 'xmlrpc_rsd_apis',            'rest_output_rsd' );
  • src/wp-includes/http.php

     
    213213 * @return array The headers of the response. Empty array if incorrect parameter given.
    214214 */
    215215function wp_remote_retrieve_headers( $response ) {
    216         if ( is_wp_error($response) || ! isset($response['headers']) || ! is_array($response['headers']))
     216        if ( is_wp_error( $response ) || ! isset( $response['headers'] ) ) {
    217217                return array();
     218        }
    218219
    219220        return $response['headers'];
    220221}
     
    229230 * @return string The header value. Empty string on if incorrect parameter given, or if the header doesn't exist.
    230231 */
    231232function wp_remote_retrieve_header( $response, $header ) {
    232         if ( is_wp_error($response) || ! isset($response['headers']) || ! is_array($response['headers']))
     233        if ( is_wp_error( $response ) || ! isset( $response['headers'] ) ) {
    233234                return '';
     235        }
    234236
    235         if ( array_key_exists($header, $response['headers']) )
     237        if ( isset( $response['headers'][ $header ] ) ) {
    236238                return $response['headers'][$header];
     239        }
    237240
    238241        return '';
    239242}
  • src/wp-settings.php

     
    183183require( ABSPATH . WPINC . '/class-wp-http-cookie.php' );
    184184require( ABSPATH . WPINC . '/class-wp-http-encoding.php' );
    185185require( ABSPATH . WPINC . '/class-wp-http-response.php' );
     186require( ABSPATH . WPINC . '/class-wp-http-requests-response.php' );
    186187require( ABSPATH . WPINC . '/widgets.php' );
    187188require( ABSPATH . WPINC . '/class-wp-widget.php' );
    188189require( ABSPATH . WPINC . '/class-wp-widget-factory.php' );
  • tests/phpunit/tests/http/base.php

     
    289289                // Test 303 - POST to GET
    290290                $res = wp_remote_post( add_query_arg( 'response_code', 303, $url ), array( 'timeout' => 30 ) );
    291291                $this->assertEquals( 'GET', wp_remote_retrieve_body( $res ) );
    292 
    293                 // Test 304 - POST to POST
    294                 $res = wp_remote_post( add_query_arg( 'response_code', 304, $url ), array( 'timeout' => 30 ) );
    295                 $this->assertEquals( 'POST', wp_remote_retrieve_body( $res ) );
    296292        }
    297293
    298294        /**
  • tests/phpunit/tests/http/functions.php

     
    1919                $response = wp_remote_head( $url );
    2020                $headers = wp_remote_retrieve_headers( $response );
    2121
    22                 $this->assertInternalType( 'array', $headers, "Reply wasn't array." );
    2322                $this->assertEquals( 'image/jpeg', $headers['content-type'] );
    2423                $this->assertEquals( '40148', $headers['content-length'] );
    2524                $this->assertEquals( '200', wp_remote_retrieve_response_code( $response ) );
     
    3635                $url = 'https://asdftestblog1.files.wordpress.com/2007/09/awefasdfawef.jpg';
    3736                $headers = wp_remote_head( $url );
    3837
    39                 $this->assertInternalType( 'array', $headers, "Reply wasn't array." );
    4038                $this->assertEquals( '404', wp_remote_retrieve_response_code( $headers ) );
    4139        }
    4240
     
    4745                $headers = wp_remote_retrieve_headers( $response );
    4846
    4947                // should return the same headers as a head request
    50                 $this->assertInternalType( 'array', $headers, "Reply wasn't array." );
    5148                $this->assertEquals( 'image/jpeg', $headers['content-type'] );
    5249                $this->assertEquals( '40148', $headers['content-length'] );
    5350                $this->assertEquals( '200', wp_remote_retrieve_response_code( $response ) );
     
    6158                $headers = wp_remote_retrieve_headers( $response );
    6259
    6360                // should return the same headers as a head request
    64                 $this->assertInternalType( 'array', $headers, "Reply wasn't array." );
    6561                $this->assertEquals( 'image/jpeg', $headers['content-type'] );
    6662                $this->assertEquals( '40148', $headers['content-length'] );
    6763                $this->assertEquals( '200', wp_remote_retrieve_response_code( $response ) );
     
    8581                $response = wp_remote_head( $url );
    8682                $cookies  = wp_remote_retrieve_cookies( $response );
    8783
    88                 $this->assertInternalType( 'array', $cookies );
    8984                $this->assertNotEmpty( $cookies );
    9085
    9186                $cookie = wp_remote_retrieve_cookie( $response, 'wordpress_test_cookie' );