Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/lookup-server.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBjörn Schießle <bjoern@schiessle.org>2017-05-02 12:14:05 +0300
committerGitHub <noreply@github.com>2017-05-02 12:14:05 +0300
commitf96d578869b5ec08a56d45b4cc2912ffa1ec4f2d (patch)
treea3ba5b85cb87dc1d9039b82904b9c413ca88ae2b
parentb0b1651daa17e5ba67b5c091ac933c51c1d30057 (diff)
parent42465bafabd5d63dedde736620270f4020a92e69 (diff)
Merge pull request #11 from nextcloud/verify-webpage-twitter
Verify webpage twitter
-rwxr-xr-xmysql.dmp12
-rw-r--r--server/composer.json3
-rw-r--r--server/composer.lock196
-rwxr-xr-xserver/config/config.sample.php8
-rw-r--r--server/lib/SignatureHandler.php88
-rw-r--r--server/lib/UserManager.php375
-rw-r--r--server/lib/Validator/Twitter.php161
-rw-r--r--server/lib/Validator/Website.php91
-rwxr-xr-xserver/replicationcron.php (renamed from server/cronjob.php)1
-rw-r--r--server/src/config.php6
-rw-r--r--server/src/dependencies.php21
-rw-r--r--server/vendor/abraham/twitteroauth/.gitignore4
-rw-r--r--server/vendor/abraham/twitteroauth/.travis.yml11
-rw-r--r--server/vendor/abraham/twitteroauth/LICENSE.md22
-rw-r--r--server/vendor/abraham/twitteroauth/README.md10
-rw-r--r--server/vendor/abraham/twitteroauth/autoload.php36
-rw-r--r--server/vendor/abraham/twitteroauth/composer.json34
-rw-r--r--server/vendor/abraham/twitteroauth/phpmd.xml15
-rw-r--r--server/vendor/abraham/twitteroauth/phpunit.xml11
-rw-r--r--server/vendor/abraham/twitteroauth/src/Config.php77
-rw-r--r--server/vendor/abraham/twitteroauth/src/Consumer.php36
-rw-r--r--server/vendor/abraham/twitteroauth/src/HmacSha1.php39
-rw-r--r--server/vendor/abraham/twitteroauth/src/Request.php254
-rw-r--r--server/vendor/abraham/twitteroauth/src/Response.php107
-rw-r--r--server/vendor/abraham/twitteroauth/src/SignatureMethod.php66
-rw-r--r--server/vendor/abraham/twitteroauth/src/Token.php38
-rw-r--r--server/vendor/abraham/twitteroauth/src/TwitterOAuth.php465
-rw-r--r--server/vendor/abraham/twitteroauth/src/TwitterOAuthException.php10
-rw-r--r--server/vendor/abraham/twitteroauth/src/Util.php115
-rw-r--r--server/vendor/abraham/twitteroauth/src/Util/JsonDecoder.php26
-rw-r--r--server/vendor/abraham/twitteroauth/src/cacert.pem4066
-rw-r--r--server/vendor/abraham/twitteroauth/tests/AbstractSignatureMethodTest.php51
-rw-r--r--server/vendor/abraham/twitteroauth/tests/ConsumerTest.php16
-rw-r--r--server/vendor/abraham/twitteroauth/tests/HmacSha1Test.php35
-rw-r--r--server/vendor/abraham/twitteroauth/tests/TokenTest.php26
-rw-r--r--server/vendor/abraham/twitteroauth/tests/TwitterOAuthTest.php256
-rw-r--r--server/vendor/abraham/twitteroauth/tests/Util/JsonDecoderTest.php50
-rw-r--r--server/vendor/abraham/twitteroauth/tests/bootstrap.php12
-rw-r--r--server/vendor/abraham/twitteroauth/tests/kitten.jpgbin0 -> 215694 bytes
-rw-r--r--server/vendor/abraham/twitteroauth/tests/sample_env13
-rw-r--r--server/vendor/abraham/twitteroauth/tests/video.mp4bin0 -> 383631 bytes
-rw-r--r--server/vendor/composer/ClassLoader.php10
-rw-r--r--server/vendor/composer/LICENSE2
-rw-r--r--server/vendor/composer/autoload_classmap.php22
-rw-r--r--server/vendor/composer/autoload_psr4.php2
-rw-r--r--server/vendor/composer/autoload_static.php35
-rw-r--r--server/vendor/composer/installed.json321
-rw-r--r--server/vendor/container-interop/container-interop/README.md83
-rw-r--r--server/vendor/container-interop/container-interop/composer.json4
-rw-r--r--server/vendor/container-interop/container-interop/docs/ContainerInterface-meta.md2
-rw-r--r--server/vendor/container-interop/container-interop/docs/ContainerInterface.md33
-rw-r--r--server/vendor/container-interop/container-interop/docs/Delegate-lookup-meta.md14
-rw-r--r--server/vendor/container-interop/container-interop/docs/Delegate-lookup.md14
-rw-r--r--server/vendor/container-interop/container-interop/docs/images/interoperating_containers.pngbin35971 -> 25738 bytes
-rw-r--r--server/vendor/container-interop/container-interop/docs/images/priority.pngbin22949 -> 16252 bytes
-rw-r--r--server/vendor/container-interop/container-interop/docs/images/side_by_side_containers.pngbin22519 -> 16265 bytes
-rw-r--r--server/vendor/container-interop/container-interop/src/Interop/Container/ContainerInterface.php26
-rw-r--r--server/vendor/container-interop/container-interop/src/Interop/Container/Exception/ContainerException.php4
-rw-r--r--server/vendor/container-interop/container-interop/src/Interop/Container/Exception/NotFoundException.php4
-rw-r--r--server/vendor/guzzlehttp/guzzle/CHANGELOG.md4
-rw-r--r--server/vendor/guzzlehttp/guzzle/composer.json2
-rw-r--r--server/vendor/guzzlehttp/guzzle/src/Client.php2
-rw-r--r--server/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php4
-rw-r--r--server/vendor/guzzlehttp/guzzle/src/RequestOptions.php4
-rw-r--r--server/vendor/guzzlehttp/promises/.gitignore11
-rw-r--r--server/vendor/guzzlehttp/promises/.travis.yml19
-rw-r--r--server/vendor/guzzlehttp/promises/CHANGELOG.md48
-rw-r--r--server/vendor/guzzlehttp/promises/LICENSE2
-rw-r--r--server/vendor/guzzlehttp/promises/README.md9
-rw-r--r--server/vendor/guzzlehttp/promises/composer.json9
-rw-r--r--server/vendor/guzzlehttp/promises/phpunit.xml.dist17
-rw-r--r--server/vendor/guzzlehttp/promises/src/Coroutine.php151
-rw-r--r--server/vendor/guzzlehttp/promises/src/Promise.php13
-rw-r--r--server/vendor/guzzlehttp/promises/src/TaskQueue.php16
-rw-r--r--server/vendor/guzzlehttp/promises/src/TaskQueueInterface.php25
-rw-r--r--server/vendor/guzzlehttp/promises/src/functions.php77
-rw-r--r--server/vendor/guzzlehttp/promises/tests/AggregateExceptionTest.php14
-rw-r--r--server/vendor/guzzlehttp/promises/tests/EachPromiseTest.php336
-rw-r--r--server/vendor/guzzlehttp/promises/tests/FulfilledPromiseTest.php108
-rw-r--r--server/vendor/guzzlehttp/promises/tests/NotPromiseInstance.php50
-rw-r--r--server/vendor/guzzlehttp/promises/tests/PromiseTest.php591
-rw-r--r--server/vendor/guzzlehttp/promises/tests/RejectedPromiseTest.php143
-rw-r--r--server/vendor/guzzlehttp/promises/tests/RejectionExceptionTest.php47
-rw-r--r--server/vendor/guzzlehttp/promises/tests/TaskQueueTest.php31
-rw-r--r--server/vendor/guzzlehttp/promises/tests/Thennable.php24
-rw-r--r--server/vendor/guzzlehttp/promises/tests/bootstrap.php4
-rw-r--r--server/vendor/guzzlehttp/promises/tests/functionsTest.php694
-rw-r--r--server/vendor/guzzlehttp/psr7/.gitignore11
-rw-r--r--server/vendor/guzzlehttp/psr7/.travis.yml20
-rw-r--r--server/vendor/guzzlehttp/psr7/CHANGELOG.md40
-rw-r--r--server/vendor/guzzlehttp/psr7/Makefile29
-rw-r--r--server/vendor/guzzlehttp/psr7/README.md214
-rw-r--r--server/vendor/guzzlehttp/psr7/composer.json8
-rw-r--r--server/vendor/guzzlehttp/psr7/phpunit.xml.dist17
-rw-r--r--server/vendor/guzzlehttp/psr7/src/LimitStream.php2
-rw-r--r--server/vendor/guzzlehttp/psr7/src/MultipartStream.php4
-rw-r--r--server/vendor/guzzlehttp/psr7/src/Request.php2
-rw-r--r--server/vendor/guzzlehttp/psr7/src/Response.php3
-rw-r--r--server/vendor/guzzlehttp/psr7/src/ServerRequest.php26
-rw-r--r--server/vendor/guzzlehttp/psr7/src/Stream.php14
-rw-r--r--server/vendor/guzzlehttp/psr7/src/Uri.php398
-rw-r--r--server/vendor/guzzlehttp/psr7/src/UriNormalizer.php216
-rw-r--r--server/vendor/guzzlehttp/psr7/src/UriResolver.php219
-rw-r--r--server/vendor/guzzlehttp/psr7/src/functions.php32
-rw-r--r--server/vendor/guzzlehttp/psr7/tests/AppendStreamTest.php186
-rw-r--r--server/vendor/guzzlehttp/psr7/tests/BufferStreamTest.php63
-rw-r--r--server/vendor/guzzlehttp/psr7/tests/CachingStreamTest.php193
-rw-r--r--server/vendor/guzzlehttp/psr7/tests/DroppingStreamTest.php26
-rw-r--r--server/vendor/guzzlehttp/psr7/tests/FnStreamTest.php90
-rw-r--r--server/vendor/guzzlehttp/psr7/tests/FunctionsTest.php619
-rw-r--r--server/vendor/guzzlehttp/psr7/tests/InflateStreamTest.php39
-rw-r--r--server/vendor/guzzlehttp/psr7/tests/LazyOpenStreamTest.php64
-rw-r--r--server/vendor/guzzlehttp/psr7/tests/LimitStreamTest.php166
-rw-r--r--server/vendor/guzzlehttp/psr7/tests/MultipartStreamTest.php242
-rw-r--r--server/vendor/guzzlehttp/psr7/tests/NoSeekStreamTest.php40
-rw-r--r--server/vendor/guzzlehttp/psr7/tests/PumpStreamTest.php72
-rw-r--r--server/vendor/guzzlehttp/psr7/tests/RequestTest.php195
-rw-r--r--server/vendor/guzzlehttp/psr7/tests/ResponseTest.php252
-rw-r--r--server/vendor/guzzlehttp/psr7/tests/ServerRequestTest.php532
-rw-r--r--server/vendor/guzzlehttp/psr7/tests/StreamDecoratorTraitTest.php137
-rw-r--r--server/vendor/guzzlehttp/psr7/tests/StreamTest.php161
-rw-r--r--server/vendor/guzzlehttp/psr7/tests/StreamWrapperTest.php102
-rw-r--r--server/vendor/guzzlehttp/psr7/tests/UploadedFileTest.php280
-rw-r--r--server/vendor/guzzlehttp/psr7/tests/UriTest.php573
-rw-r--r--server/vendor/guzzlehttp/psr7/tests/bootstrap.php11
-rw-r--r--server/vendor/nikic/fast-route/.gitignore5
-rw-r--r--server/vendor/nikic/fast-route/README.md40
-rw-r--r--server/vendor/nikic/fast-route/src/RouteCollector.php94
-rw-r--r--server/vendor/nikic/fast-route/src/functions.php10
-rw-r--r--server/vendor/nikic/fast-route/test/RouteCollectorTest.php97
-rw-r--r--server/vendor/psr/container/.gitignore3
-rw-r--r--server/vendor/psr/container/LICENSE21
-rw-r--r--server/vendor/psr/container/README.md5
-rw-r--r--server/vendor/psr/container/composer.json27
-rw-r--r--server/vendor/psr/container/src/ContainerExceptionInterface.php13
-rw-r--r--server/vendor/psr/container/src/ContainerInterface.php37
-rw-r--r--server/vendor/psr/container/src/NotFoundExceptionInterface.php13
-rw-r--r--server/vendor/slim/slim/CONTRIBUTING.md20
-rw-r--r--server/vendor/slim/slim/LICENSE.md2
-rw-r--r--server/vendor/slim/slim/README.md84
-rw-r--r--server/vendor/slim/slim/Slim/App.php61
-rw-r--r--server/vendor/slim/slim/Slim/CallableResolver.php90
-rw-r--r--server/vendor/slim/slim/Slim/CallableResolverAwareTrait.php6
-rw-r--r--server/vendor/slim/slim/Slim/Collection.php4
-rw-r--r--server/vendor/slim/slim/Slim/Container.php6
-rw-r--r--server/vendor/slim/slim/Slim/DefaultServicesProvider.php14
-rw-r--r--server/vendor/slim/slim/Slim/DeferredCallable.php6
-rw-r--r--server/vendor/slim/slim/Slim/Exception/ContainerException.php8
-rw-r--r--server/vendor/slim/slim/Slim/Exception/ContainerValueNotFoundException.php8
-rw-r--r--server/vendor/slim/slim/Slim/Exception/InvalidMethodException.php21
-rw-r--r--server/vendor/slim/slim/Slim/Exception/MethodNotAllowedException.php8
-rw-r--r--server/vendor/slim/slim/Slim/Exception/NotFoundException.php8
-rw-r--r--server/vendor/slim/slim/Slim/Exception/SlimException.php4
-rw-r--r--server/vendor/slim/slim/Slim/Handlers/AbstractError.php4
-rw-r--r--server/vendor/slim/slim/Slim/Handlers/AbstractHandler.php4
-rw-r--r--server/vendor/slim/slim/Slim/Handlers/Error.php26
-rw-r--r--server/vendor/slim/slim/Slim/Handlers/NotAllowed.php4
-rw-r--r--server/vendor/slim/slim/Slim/Handlers/NotFound.php6
-rw-r--r--server/vendor/slim/slim/Slim/Handlers/PhpError.php4
-rw-r--r--server/vendor/slim/slim/Slim/Handlers/Strategies/RequestResponse.php4
-rw-r--r--server/vendor/slim/slim/Slim/Handlers/Strategies/RequestResponseArgs.php4
-rw-r--r--server/vendor/slim/slim/Slim/Http/Body.php4
-rw-r--r--server/vendor/slim/slim/Slim/Http/Cookies.php8
-rw-r--r--server/vendor/slim/slim/Slim/Http/Environment.php4
-rw-r--r--server/vendor/slim/slim/Slim/Http/Headers.php4
-rw-r--r--server/vendor/slim/slim/Slim/Http/Message.php4
-rw-r--r--server/vendor/slim/slim/Slim/Http/Request.php109
-rw-r--r--server/vendor/slim/slim/Slim/Http/RequestBody.php4
-rw-r--r--server/vendor/slim/slim/Slim/Http/Response.php36
-rw-r--r--server/vendor/slim/slim/Slim/Http/Stream.php4
-rw-r--r--server/vendor/slim/slim/Slim/Http/UploadedFile.php4
-rw-r--r--server/vendor/slim/slim/Slim/Http/Uri.php4
-rw-r--r--server/vendor/slim/slim/Slim/Interfaces/CallableResolverInterface.php4
-rw-r--r--server/vendor/slim/slim/Slim/Interfaces/CollectionInterface.php4
-rw-r--r--server/vendor/slim/slim/Slim/Interfaces/Http/CookiesInterface.php4
-rw-r--r--server/vendor/slim/slim/Slim/Interfaces/Http/EnvironmentInterface.php4
-rw-r--r--server/vendor/slim/slim/Slim/Interfaces/Http/HeadersInterface.php4
-rw-r--r--server/vendor/slim/slim/Slim/Interfaces/InvocationStrategyInterface.php4
-rw-r--r--server/vendor/slim/slim/Slim/Interfaces/RouteGroupInterface.php4
-rw-r--r--server/vendor/slim/slim/Slim/Interfaces/RouteInterface.php16
-rw-r--r--server/vendor/slim/slim/Slim/Interfaces/RouterInterface.php8
-rw-r--r--server/vendor/slim/slim/Slim/MiddlewareAwareTrait.php24
-rw-r--r--server/vendor/slim/slim/Slim/Routable.php12
-rw-r--r--server/vendor/slim/slim/Slim/Route.php30
-rw-r--r--server/vendor/slim/slim/Slim/RouteGroup.php4
-rw-r--r--server/vendor/slim/slim/Slim/Router.php31
-rw-r--r--server/vendor/slim/slim/composer.json5
-rw-r--r--server/vendor/slim/slim/example/.htaccess12
-rw-r--r--server/vendor/slim/slim/example/README.md19
-rw-r--r--server/vendor/slim/slim/example/index.php45
-rw-r--r--server/verifycron.php38
191 files changed, 9143 insertions, 7277 deletions
diff --git a/mysql.dmp b/mysql.dmp
index ab3c5cf..9cbc39e 100755
--- a/mysql.dmp
+++ b/mysql.dmp
@@ -41,6 +41,18 @@ CREATE TABLE IF NOT EXISTS `users` (
KEY `federationId` (`federationId`(191))
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+DROP TABLE IF EXISTS `toVerify`;
+CREATE TABLE IF NOT EXISTS `toVerify` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `userId` int(11) NOT NULL,
+ `storeId` int(11) NOT NULL,
+ `property` varchar(512) COLLATE utf8mb4_unicode_ci NOT NULL,
+ `location` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
+ `tries` int(11) NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
diff --git a/server/composer.json b/server/composer.json
index 54a5b10..6af51d2 100644
--- a/server/composer.json
+++ b/server/composer.json
@@ -11,6 +11,7 @@
},
"require": {
"slim/slim": "^3.5",
- "guzzlehttp/guzzle": "^6.2"
+ "guzzlehttp/guzzle": "^6.2",
+ "abraham/twitteroauth": "^0.7.2"
}
}
diff --git a/server/composer.lock b/server/composer.lock
index 9d9d6f3..bc21580 100644
--- a/server/composer.lock
+++ b/server/composer.lock
@@ -4,23 +4,79 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
"This file is @generated automatically"
],
- "hash": "ab26a47fd95d126d6aec35e981ec124b",
- "content-hash": "967f7f7a177574f358a67cad6fdbc89f",
+ "content-hash": "33c01d94e1598618dda59daf7269ece1",
"packages": [
{
+ "name": "abraham/twitteroauth",
+ "version": "0.7.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/abraham/twitteroauth.git",
+ "reference": "119d5a83478a2d21c09cd27980ab67eba11c8fe1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/abraham/twitteroauth/zipball/119d5a83478a2d21c09cd27980ab67eba11c8fe1",
+ "reference": "119d5a83478a2d21c09cd27980ab67eba11c8fe1",
+ "shasum": ""
+ },
+ "require": {
+ "ext-curl": "*",
+ "php": "^5.6 || ^7.0"
+ },
+ "require-dev": {
+ "phpmd/phpmd": "~2.4",
+ "phpunit/phpunit": "~5.6",
+ "squizlabs/php_codesniffer": "~2.7"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Abraham\\TwitterOAuth\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Abraham Williams",
+ "email": "abraham@abrah.am",
+ "homepage": "https://abrah.am",
+ "role": "Developer"
+ }
+ ],
+ "description": "The most popular PHP library for use with the Twitter OAuth REST API.",
+ "homepage": "https://twitteroauth.com",
+ "keywords": [
+ "Twitter API",
+ "Twitter oAuth",
+ "api",
+ "oauth",
+ "rest",
+ "social",
+ "twitter"
+ ],
+ "time": "2016-12-12T17:42:13+00:00"
+ },
+ {
"name": "container-interop/container-interop",
- "version": "1.1.0",
+ "version": "1.2.0",
"source": {
"type": "git",
"url": "https://github.com/container-interop/container-interop.git",
- "reference": "fc08354828f8fd3245f77a66b9e23a6bca48297e"
+ "reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/container-interop/container-interop/zipball/fc08354828f8fd3245f77a66b9e23a6bca48297e",
- "reference": "fc08354828f8fd3245f77a66b9e23a6bca48297e",
+ "url": "https://api.github.com/repos/container-interop/container-interop/zipball/79cbf1341c22ec75643d841642dd5d6acd83bdb8",
+ "reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8",
"shasum": ""
},
+ "require": {
+ "psr/container": "^1.0"
+ },
"type": "library",
"autoload": {
"psr-4": {
@@ -32,25 +88,26 @@
"MIT"
],
"description": "Promoting the interoperability of container objects (DIC, SL, etc.)",
- "time": "2014-12-30 15:22:37"
+ "homepage": "https://github.com/container-interop/container-interop",
+ "time": "2017-02-14T19:40:03+00:00"
},
{
"name": "guzzlehttp/guzzle",
- "version": "6.2.2",
+ "version": "6.2.3",
"source": {
"type": "git",
"url": "https://github.com/guzzle/guzzle.git",
- "reference": "ebf29dee597f02f09f4d5bbecc68230ea9b08f60"
+ "reference": "8d6c6cc55186db87b7dc5009827429ba4e9dc006"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/guzzle/guzzle/zipball/ebf29dee597f02f09f4d5bbecc68230ea9b08f60",
- "reference": "ebf29dee597f02f09f4d5bbecc68230ea9b08f60",
+ "url": "https://api.github.com/repos/guzzle/guzzle/zipball/8d6c6cc55186db87b7dc5009827429ba4e9dc006",
+ "reference": "8d6c6cc55186db87b7dc5009827429ba4e9dc006",
"shasum": ""
},
"require": {
"guzzlehttp/promises": "^1.0",
- "guzzlehttp/psr7": "^1.3.1",
+ "guzzlehttp/psr7": "^1.4",
"php": ">=5.5"
},
"require-dev": {
@@ -94,32 +151,32 @@
"rest",
"web service"
],
- "time": "2016-10-08 15:01:37"
+ "time": "2017-02-28T22:50:30+00:00"
},
{
"name": "guzzlehttp/promises",
- "version": "1.2.0",
+ "version": "v1.3.1",
"source": {
"type": "git",
"url": "https://github.com/guzzle/promises.git",
- "reference": "c10d860e2a9595f8883527fa0021c7da9e65f579"
+ "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/guzzle/promises/zipball/c10d860e2a9595f8883527fa0021c7da9e65f579",
- "reference": "c10d860e2a9595f8883527fa0021c7da9e65f579",
+ "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646",
+ "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646",
"shasum": ""
},
"require": {
"php": ">=5.5.0"
},
"require-dev": {
- "phpunit/phpunit": "~4.0"
+ "phpunit/phpunit": "^4.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.0-dev"
+ "dev-master": "1.4-dev"
}
},
"autoload": {
@@ -145,20 +202,20 @@
"keywords": [
"promise"
],
- "time": "2016-05-18 16:56:05"
+ "time": "2016-12-20T10:07:11+00:00"
},
{
"name": "guzzlehttp/psr7",
- "version": "1.3.1",
+ "version": "1.4.2",
"source": {
"type": "git",
"url": "https://github.com/guzzle/psr7.git",
- "reference": "5c6447c9df362e8f8093bda8f5d8873fe5c7f65b"
+ "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/guzzle/psr7/zipball/5c6447c9df362e8f8093bda8f5d8873fe5c7f65b",
- "reference": "5c6447c9df362e8f8093bda8f5d8873fe5c7f65b",
+ "url": "https://api.github.com/repos/guzzle/psr7/zipball/f5b8a8512e2b58b0071a7280e39f14f72e05d87c",
+ "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c",
"shasum": ""
},
"require": {
@@ -194,29 +251,36 @@
"name": "Michael Dowling",
"email": "mtdowling@gmail.com",
"homepage": "https://github.com/mtdowling"
+ },
+ {
+ "name": "Tobias Schultze",
+ "homepage": "https://github.com/Tobion"
}
],
- "description": "PSR-7 message implementation",
+ "description": "PSR-7 message implementation that also provides common utility methods",
"keywords": [
"http",
"message",
+ "request",
+ "response",
"stream",
- "uri"
+ "uri",
+ "url"
],
- "time": "2016-06-24 23:00:38"
+ "time": "2017-03-20T17:10:46+00:00"
},
{
"name": "nikic/fast-route",
- "version": "v1.0.1",
+ "version": "v1.2.0",
"source": {
"type": "git",
"url": "https://github.com/nikic/FastRoute.git",
- "reference": "8ea928195fa9b907f0d6e48312d323c1a13cc2af"
+ "reference": "b5f95749071c82a8e0f58586987627054400cdf6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nikic/FastRoute/zipball/8ea928195fa9b907f0d6e48312d323c1a13cc2af",
- "reference": "8ea928195fa9b907f0d6e48312d323c1a13cc2af",
+ "url": "https://api.github.com/repos/nikic/FastRoute/zipball/b5f95749071c82a8e0f58586987627054400cdf6",
+ "reference": "b5f95749071c82a8e0f58586987627054400cdf6",
"shasum": ""
},
"require": {
@@ -246,7 +310,7 @@
"router",
"routing"
],
- "time": "2016-06-12 19:08:51"
+ "time": "2017-01-19T11:35:12+00:00"
},
{
"name": "pimple/pimple",
@@ -292,7 +356,56 @@
"container",
"dependency injection"
],
- "time": "2015-09-11 15:10:35"
+ "time": "2015-09-11T15:10:35+00:00"
+ },
+ {
+ "name": "psr/container",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/container.git",
+ "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
+ "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Container\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common Container Interface (PHP FIG PSR-11)",
+ "homepage": "https://github.com/php-fig/container",
+ "keywords": [
+ "PSR-11",
+ "container",
+ "container-interface",
+ "container-interop",
+ "psr"
+ ],
+ "time": "2017-02-14T16:28:37+00:00"
},
{
"name": "psr/http-message",
@@ -342,27 +455,28 @@
"request",
"response"
],
- "time": "2016-08-06 14:39:51"
+ "time": "2016-08-06T14:39:51+00:00"
},
{
"name": "slim/slim",
- "version": "3.5.0",
+ "version": "3.8.1",
"source": {
"type": "git",
"url": "https://github.com/slimphp/Slim.git",
- "reference": "184352bc1913d7ba552ab4131d62f4730ddb0893"
+ "reference": "5385302707530b2bccee1769613ad769859b826d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/slimphp/Slim/zipball/184352bc1913d7ba552ab4131d62f4730ddb0893",
- "reference": "184352bc1913d7ba552ab4131d62f4730ddb0893",
+ "url": "https://api.github.com/repos/slimphp/Slim/zipball/5385302707530b2bccee1769613ad769859b826d",
+ "reference": "5385302707530b2bccee1769613ad769859b826d",
"shasum": ""
},
"require": {
- "container-interop/container-interop": "^1.1",
+ "container-interop/container-interop": "^1.2",
"nikic/fast-route": "^1.0",
"php": ">=5.5.0",
"pimple/pimple": "^3.0",
+ "psr/container": "^1.0",
"psr/http-message": "^1.0"
},
"provide": {
@@ -405,14 +519,14 @@
}
],
"description": "Slim is a PHP micro framework that helps you quickly write simple yet powerful web applications and APIs",
- "homepage": "http://slimframework.com",
+ "homepage": "https://slimframework.com",
"keywords": [
"api",
"framework",
"micro",
"router"
],
- "time": "2016-07-26 15:12:13"
+ "time": "2017-03-19T17:55:20+00:00"
}
],
"packages-dev": [],
diff --git a/server/config/config.sample.php b/server/config/config.sample.php
index 5cc6adb..aa761cf 100755
--- a/server/config/config.sample.php
+++ b/server/config/config.sample.php
@@ -52,5 +52,13 @@ $CONFIG = [
// Public Server Url
'PUBLIC_URL' => 'http://dev/nextcloud/lookup-server',
+
+ // twitter oauth credentials, needed to perform twitter verification
+ 'TWITTER' => [
+ 'CONSUMER_KEY' => '',
+ 'CONSUMER_SECRET' => '',
+ 'ACCESS_TOKEN' => '',
+ 'ACCESS_TOKEN_SECRET' => '',
+ ]
];
diff --git a/server/lib/SignatureHandler.php b/server/lib/SignatureHandler.php
new file mode 100644
index 0000000..bf308d4
--- /dev/null
+++ b/server/lib/SignatureHandler.php
@@ -0,0 +1,88 @@
+<?php
+/**
+ * @copyright Copyright (c) 2017 Bjoern Schiessle <bjoern@schiessle.org>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace LookupServer;
+
+use GuzzleHttp\Client;
+
+class SignatureHandler {
+
+ /**
+ * check signature of incoming request
+ *
+ * @param string $cloudId
+ * @param string $message
+ * @param string $signature
+ * @return bool
+ * @throws \Exception
+ */
+ public function verify($cloudId, $message, $signature) {
+ // Get fed id
+ list($user, $host) = $this->splitCloudId($cloudId);
+
+ // Retrieve public key && store
+ $ocsreq = new \GuzzleHttp\Psr7\Request(
+ 'GET',
+ 'http://'.$host . '/ocs/v2.php/identityproof/key/' . $user,
+ [
+ 'OCS-APIREQUEST' => 'true',
+ 'Accept' => 'application/json',
+ ]);
+
+ $client = new Client();
+ $ocsresponse = $client->send($ocsreq, ['timeout' => 10]);
+
+ $ocsresponse = json_decode($ocsresponse->getBody(), true);
+
+ if ($ocsresponse === null || !isset($ocsresponse['ocs']) ||
+ !isset($ocsresponse['ocs']['data']) || !isset($ocsresponse['ocs']['data']['public'])) {
+ throw new \BadMethodCallException();
+ }
+
+ $key = $ocsresponse['ocs']['data']['public'];
+
+ // verify message
+ $message = json_encode($message);
+ $signature= base64_decode($signature);
+
+ $res = openssl_verify($message, $signature, $key, OPENSSL_ALGO_SHA512);
+
+ return $res === 1;
+
+ }
+
+ /**
+ * Split a cloud id in a user and host post
+ *
+ * @param $cloudId
+ * @return string[]
+ */
+ private function splitCloudId($cloudId) {
+ $loc = strrpos($cloudId, '@');
+
+ $user = substr($cloudId, 0, $loc);
+ $host = substr($cloudId, $loc+1);
+ return [$user, $host];
+ }
+
+
+}
diff --git a/server/lib/UserManager.php b/server/lib/UserManager.php
index 6727199..d1d0486 100644
--- a/server/lib/UserManager.php
+++ b/server/lib/UserManager.php
@@ -2,8 +2,9 @@
namespace LookupServer;
-use GuzzleHttp\Client;
use LookupServer\Validator\Email;
+use LookupServer\Validator\Twitter;
+use LookupServer\Validator\Website;
use \Psr\Http\Message\ServerRequestInterface as Request;
use \Psr\Http\Message\ResponseInterface as Response;
@@ -15,9 +16,37 @@ class UserManager {
/** @var Email */
private $emailValidator;
- public function __construct(\PDO $db, Email $emailValidator) {
+ /** @var Website */
+ private $websiteValidator;
+
+ /** @var Twitter */
+ private $twitterValidator;
+
+ /** @var SignatureHandler */
+ private $signatureHandler;
+
+ /** @var int try max. 10 times to verify a account */
+ private $maxVerifyTries = 10;
+
+ /**
+ * UserManager constructor.
+ *
+ * @param \PDO $db
+ * @param Email $emailValidator
+ * @param Website $websiteValidator
+ * @param Twitter $twitterValidator
+ * @param SignatureHandler $signatureHandler
+ */
+ public function __construct(\PDO $db,
+ Email $emailValidator,
+ Website $websiteValidator,
+ Twitter $twitterValidator,
+ SignatureHandler $signatureHandler) {
$this->db = $db;
$this->emailValidator = $emailValidator;
+ $this->websiteValidator = $websiteValidator;
+ $this->twitterValidator = $twitterValidator;
+ $this->signatureHandler = $signatureHandler;
}
public function search(Request $request, Response $response) {
@@ -70,18 +99,18 @@ LIMIT 50');
}
private function getExactCloudId($cloudId) {
- $stmt = $this->db->prepare('SELECT id FROM users WHERE federationId = :id');
- $stmt->bindParam(':id', $cloudId);
- $stmt->execute();
- $data = $stmt->fetch();
+ $stmt = $this->db->prepare('SELECT id FROM users WHERE federationId = :id');
+ $stmt->bindParam(':id', $cloudId);
+ $stmt->execute();
+ $data = $stmt->fetch();
- if (!$data) {
- return [];
- }
+ if (!$data) {
+ return [];
+ }
- return $this->getForUserId((int)$data['id']);
+ return $this->getForUserId((int)$data['id']);
- }
+ }
private function getForUserId($userId) {
$stmt = $this->db->prepare('SELECT * FROM users WHERE id = :id');
@@ -114,20 +143,6 @@ LIMIT 50');
}
/**
- * Split a cloud id in a user and host post
- *
- * @param $cloudId
- * @return string[]
- */
- private function splitCloudId($cloudId) {
- $loc = strrpos($cloudId, '@');
-
- $user = substr($cloudId, 0, $loc);
- $host = substr($cloudId, $loc+1);
- return [$user, $host];
- }
-
- /**
* @param string $cloudId
* @param string[] $data
* @param int $timestamp
@@ -140,7 +155,7 @@ LIMIT 50');
$id = $this->db->lastInsertId();
$stmt->closeCursor();
- $fields = ['name', 'email', 'address', 'website', 'twitter', 'phone'];
+ $fields = ['name', 'email', 'address', 'website', 'twitter', 'phone', 'twitter_signature', 'website_signature'];
foreach ($fields as $field) {
if (!isset($data[$field]) || $data[$field] === '') {
@@ -172,15 +187,13 @@ LIMIT 50');
$stmt->bindParam(':timestamp', $timestamp, \PDO::PARAM_INT);
$stmt->execute();
$stmt->closeCursor();
-
- $fields = ['name', 'email', 'address', 'website', 'twitter', 'phone'];
+ $fields = ['name', 'email', 'address', 'website', 'twitter', 'phone', 'twitter_signature', 'website_signature'];
$stmt = $this->db->prepare('SELECT * FROM store WHERE userId = :userId');
$stmt->bindParam(':userId', $id, \PDO::PARAM_INT);
$stmt->execute();
$rows = $stmt->fetchAll();
$stmt->closeCursor();
-
foreach ($rows as $row) {
$key = $row['k'];
$value = $row['v'];
@@ -194,9 +207,12 @@ LIMIT 50');
$stmt->bindParam(':id', $row['id']);
$stmt->execute();
$stmt->closeCursor();
+ // remove verification request if correspondig data was deleted
+ $this->removeOpenVerificationRequestByStoreId($row['id']);
} else {
// Key present check if we need to update
if ($data[$key] === $value) {
+ $this->needToVerify($id, $row['id'], $data, $key);
continue;
}
$stmt = $this->db->prepare('UPDATE store SET v = :v, valid = 0 WHERE id = :id');
@@ -204,10 +220,11 @@ LIMIT 50');
$stmt->bindParam(':v', $data[$key]);
$stmt->execute();
$stmt->closeCursor();
-
if ($key === 'email') {
$this->emailValidator->emailUpdated($data[$key], $row['id']);
}
+ // remove verification request from old data
+ $this->removeOpenVerificationRequestByStoreId($row['id']);
}
}
@@ -227,7 +244,28 @@ LIMIT 50');
$storeId = $this->db->lastInsertId();
$stmt->closeCursor();
- $this->emailValidator->emailUpdated($data[$field], $storeId);
+ if ($field === 'email') {
+ $this->emailValidator->emailUpdated($data[$field], $storeId);
+ }
+ }
+ }
+
+ private function needToVerify($userId, $storeId, $data, $key) {
+ $stmt = $this->db->prepare('SELECT * FROM toVerify WHERE storeId = :storeId');
+ $stmt->bindParam(':storeId', $storeId, \PDO::PARAM_INT);
+ $stmt->execute();
+ $alreadyExists = $stmt->fetch();
+
+ if ($alreadyExists === false && isset($data['verificationStatus'][$key]) && $data['verificationStatus'][$key] === '1') {
+ $tries = 0;
+ $stmt = $this->db->prepare('INSERT INTO toVerify (userId, storeId, property, location, tries) VALUES (:userId, :storeId, :property, :location, :tries)');
+ $stmt->bindParam(':userId', $userId, \PDO::PARAM_INT);
+ $stmt->bindParam(':storeId', $storeId, \PDO::PARAM_INT);
+ $stmt->bindParam(':property', $key);
+ $stmt->bindParam(':location', $data[$key]);
+ $stmt->bindParam(':tries', $tries, \PDO::PARAM_INT);
+ $stmt->execute();
+ $stmt->closeCursor();
}
}
@@ -244,11 +282,11 @@ LIMIT 50');
$cloudId = $body['message']['data']['federationId'];
try {
- $verified = $this->verifyRequest($cloudId, $body['message'], $body['signature']);
- } catch(\Exception $e) {
- $response->withStatus(400);
- return $response;
- }
+ $verified = $this->signatureHandler->verify($cloudId, $body['message'], $body['signature']);
+ } catch(\Exception $e) {
+ $response->withStatus(400);
+ return $response;
+ }
if ($verified) {
$result = $this->insertOrUpdate($cloudId, $body['message']['data'], $body['message']['timestamp']);
@@ -263,92 +301,141 @@ LIMIT 50');
return $response;
}
- public function delete(Request $request, Response $response) {
- $body = json_decode($request->getBody(), true);
-
- if ($body === null || !isset($body['message']) || !isset($body['message']['data']) ||
- !isset($body['message']['data']['federationId']) || !isset($body['signature']) ||
- !isset($body['message']['timestamp'])) {
- $response->withStatus(400);
- return $response;
- }
-
- $cloudId = $body['message']['data']['federationId'];
-
- try {
- $verified = $this->verifyRequest($cloudId, $body['message'], $body['signature']);
- } catch(\Exception $e) {
- $response->withStatus(400);
- return $response;
- }
-
-
- if ($verified) {
- $result = $this->deleteDBRecord($cloudId);
- if ($result === false) {
- $response->withStatus(404);
- }
- } else {
- // ERROR OUT
- $response->withStatus(403);
- }
-
- return $response;
- }
-
- /**
- * check signature of incoming request
- *
- * @param string $cloudId
- * @param string $message
- * @param string $signature
- * @return bool
- * @throws \Exception
- */
- protected function verifyRequest($cloudId, $message, $signature) {
- // Get fed id
- list($user, $host) = $this->splitCloudId($cloudId);
-
- // Retrieve public key && store
- $ocsreq = new \GuzzleHttp\Psr7\Request(
- 'GET',
- 'http://'.$host . '/ocs/v2.php/identityproof/key/' . $user,
- [
- 'OCS-APIREQUEST' => 'true',
- 'Accept' => 'application/json',
- ]);
-
- $client = new Client();
- $ocsresponse = $client->send($ocsreq, ['timeout' => 10]);
-
- $ocsresponse = json_decode($ocsresponse->getBody(), true);
-
- if ($ocsresponse === null || !isset($ocsresponse['ocs']) ||
- !isset($ocsresponse['ocs']['data']) || !isset($ocsresponse['ocs']['data']['public'])) {
- throw new \BadMethodCallException();
- }
-
- $key = $ocsresponse['ocs']['data']['public'];
-
- // verify message
- $message = json_encode($message);
- $signature= base64_decode($signature);
-
- $res = openssl_verify($message, $signature, $key, OPENSSL_ALGO_SHA512);
-
- return $res === 1;
-
- }
-
-
- /**
+ public function delete(Request $request, Response $response) {
+ $body = json_decode($request->getBody(), true);
+
+ if ($body === null || !isset($body['message']) || !isset($body['message']['data']) ||
+ !isset($body['message']['data']['federationId']) || !isset($body['signature']) ||
+ !isset($body['message']['timestamp'])) {
+ $response->withStatus(400);
+ return $response;
+ }
+
+ $cloudId = $body['message']['data']['federationId'];
+
+ try {
+ $verified = $this->signatureHandler->verify($cloudId, $body['message'], $body['signature']);
+ } catch(\Exception $e) {
+ $response->withStatus(400);
+ return $response;
+ }
+
+
+ if ($verified) {
+ $result = $this->deleteDBRecord($cloudId);
+ if ($result === false) {
+ $response->withStatus(404);
+ }
+ } else {
+ // ERROR OUT
+ $response->withStatus(403);
+ }
+
+ return $response;
+ }
+
+ public function verify(Request $request, Response $response) {
+ $verificationRequests = $this->getOpenVerificationRequests();
+ foreach ($verificationRequests as $verificationData) {
+ $success = false;
+ switch ($verificationData['property']) {
+ case 'twitter':
+ $userData = $this->getForUserId($verificationData['userId']);
+ $success = $this->twitterValidator->verify($verificationData, $userData);
+ break;
+ case 'website':
+ $userData = $this->getForUserId($verificationData['userId']);
+ $success = $this->websiteValidator->verify($verificationData, $userData);
+ break;
+ }
+ if ($success) {
+ $this->updateVerificationStatus($verificationData['storeId']);
+ $this->removeOpenVerificationRequest($verificationData['id']);
+ } else {
+ $this->incMaxTries($verificationData);
+ }
+ }
+ }
+
+ /**
+ * increase number of max tries to verify account data
+ *
+ * @param $verificationData
+ */
+ private function incMaxTries($verificationData) {
+ $tries = (int)$verificationData['tries'];
+ $tries++;
+
+ // max number of tries reached, remove verification request and return
+ if ($tries > $this->maxVerifyTries) {
+ $this->removeOpenVerificationRequest($verificationData['id']);
+ return;
+ }
+
+ $stmt = $this->db->prepare('UPDATE toVerify SET tries = :tries WHERE id = :id');
+ $stmt->bindParam('id', $verificationData['id']);
+ $stmt->bindParam('tries', $tries);
+ $stmt->execute();
+ $stmt->closeCursor();
+ }
+
+ /**
+ * if data could be verified successfully we update the information in the store table
+ *
+ * @param $storeId
+ */
+ private function updateVerificationStatus($storeId) {
+ $stmt = $this->db->prepare('UPDATE store SET valid = 1 WHERE id = :storeId');
+ $stmt->bindParam('storeId', $storeId);
+ $stmt->execute();
+ $stmt->closeCursor();
+ }
+
+ /**
+ * remove data from to verify table if verification was successful or max. number of tries reached.
+ *
+ * @param $id
+ */
+ private function removeOpenVerificationRequest($id) {
+ $stmt = $this->db->prepare('DELETE FROM toVerify WHERE id = :id');
+ $stmt->bindParam(':id', $id);
+ $stmt->execute();
+ $stmt->closeCursor();
+ }
+
+ /**
+ * remove data from to verify table if the user data was removed or changed
+ *
+ * @param $storeId
+ */
+ private function removeOpenVerificationRequestByStoreId($storeId) {
+ $stmt = $this->db->prepare('DELETE FROM toVerify WHERE storeId = :storeId');
+ $stmt->bindParam(':storeId', $storeId);
+ $stmt->execute();
+ $stmt->closeCursor();
+ }
+
+
+ /**
+ * get open verification Requests
+ *
+ * @return array
+ */
+ private function getOpenVerificationRequests() {
+ $stmt = $this->db->prepare('SELECT * FROM toVerify LIMIT 10');
+ $stmt->execute();
+ $result = $stmt->fetchAll();
+ $stmt->closeCursor();
+ return $result;
+ }
+
+ /**
* @param string $cloudId
* @param string[] $data
* @param int $timestamp
* @return bool
*/
private function insertOrUpdate($cloudId, $data, $timestamp) {
-
$stmt = $this->db->prepare('SELECT * FROM users WHERE federationId = :federationId');
$stmt->bindParam(':federationId', $cloudId);
$stmt->execute();
@@ -372,32 +459,32 @@ LIMIT 50');
return true;
}
- /**
- * Delete all personal data. We keep the basic user entry with the
- * federated cloud ID in order to propagate the changes
- *
- * @param string $cloudId
- * @return bool
- */
- private function deleteDBRecord($cloudId) {
-
- $stmt = $this->db->prepare('SELECT * FROM users WHERE federationId = :federationId');
- $stmt->bindParam(':federationId', $cloudId);
- $stmt->execute();
- $row = $stmt->fetch();
- $stmt->closeCursor();
-
- // If we can't find the user
- if ($row === false) {
- return false;
- }
-
- // delete user data
- $stmt = $this->db->prepare('DELETE FROM store WHERE userId = :userId');
- $stmt->bindParam(':userId', $row['id']);
- $stmt->execute();
- $stmt->closeCursor();
-
- return true;
- }
+ /**
+ * Delete all personal data. We keep the basic user entry with the
+ * federated cloud ID in order to propagate the changes
+ *
+ * @param string $cloudId
+ * @return bool
+ */
+ private function deleteDBRecord($cloudId) {
+
+ $stmt = $this->db->prepare('SELECT * FROM users WHERE federationId = :federationId');
+ $stmt->bindParam(':federationId', $cloudId);
+ $stmt->execute();
+ $row = $stmt->fetch();
+ $stmt->closeCursor();
+
+ // If we can't find the user
+ if ($row === false) {
+ return false;
+ }
+
+ // delete user data
+ $stmt = $this->db->prepare('DELETE FROM store WHERE userId = :userId');
+ $stmt->bindParam(':userId', $row['id']);
+ $stmt->execute();
+ $stmt->closeCursor();
+
+ return true;
+ }
}
diff --git a/server/lib/Validator/Twitter.php b/server/lib/Validator/Twitter.php
new file mode 100644
index 0000000..7cd3724
--- /dev/null
+++ b/server/lib/Validator/Twitter.php
@@ -0,0 +1,161 @@
+<?php
+/**
+ * @copyright Copyright (c) 2017 Bjoern Schiessle <bjoern@schiessle.org>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace LookupServer\Validator;
+
+
+use Abraham\TwitterOAuth\TwitterOAuth;
+use LookupServer\SignatureHandler;
+
+class Twitter {
+
+ /** @var TwitterOAuth */
+ private $twitterOAuth;
+
+ /** @var SignatureHandler */
+ private $signatureHandler;
+
+ /** @var \PDO */
+ private $db;
+
+ /**
+ * Twitter constructor.
+ *
+ * @param TwitterOAuth $twitterOAuth
+ * @param SignatureHandler $signatureHandler
+ * @param \PDO $db
+ */
+ public function __construct(TwitterOAuth $twitterOAuth, SignatureHandler $signatureHandler, \PDO $db) {
+ $this->twitterOAuth = $twitterOAuth;
+ $this->signatureHandler = $signatureHandler;
+ $this->db = $db;
+ }
+
+ /**
+ * verify Twitter proof
+ *
+ * @param array $verificationData from toVerify table
+ * @param array $userData stored user data
+ * @return bool
+ */
+ public function verify(array $verificationData, array $userData) {
+ $twitterHandle = $verificationData['location'];
+ $isValid = $this->isValidTwitterHandle($twitterHandle);
+ $result = false;
+
+ if ($isValid === false) {
+ return $result;
+ }
+
+ try {
+ $userName = substr($twitterHandle, 1);
+ list($tweetId, $text) = $this->getTweet($userName);
+ if ($text !== null) {
+ $cloudId = $userData['federationId'];
+ list($message, $md5signature) = $this->splitMessageSignature($text);
+ $signature = $userData['twitter_signature']['value'];
+ $result = $this->signatureHandler->verify($cloudId, $message, $signature);
+ $result = $result && md5($signature) === $md5signature;
+ }
+ } catch (\Exception $e) {
+ // do nothing, just return false;
+ }
+
+ if ($result === true) {
+ $this->storeReference((int)$verificationData['userId'], $tweetId);
+ }
+
+ return $result;
+ }
+
+ /**
+ * get tweet text and id
+ *
+ * @param string $userName user name without the '@'
+ * @return array
+ */
+ private function getTweet($userName) {
+
+ try {
+ $search = 'from:' . $userName . ' Use my Federated Cloud ID to share with me';
+ $statuses = $this->twitterOAuth->get('search/tweets', ['q' => $search]);
+
+ $id = $statuses->statuses[0]->id;
+ $text = $statuses->statuses[0]->text;
+ } catch (\Exception $e) {
+ return [null, null];
+ }
+
+ return [$id, $text];
+ }
+
+ /**
+ * check if we have a correct twitter Handle
+ *
+ * @param $twitterHandle
+ * @return bool
+ */
+ private function isValidTwitterHandle($twitterHandle) {
+ $result = preg_match('/^@[A-Za-z0-9_]+$/', $twitterHandle);
+ return $result === 1;
+ }
+
+ /**
+ * split message and signature
+ *
+ * @param string $proof
+ * @return array
+ */
+ private function splitMessageSignature($proof) {
+ $signature = substr($proof, -32);
+ $message = substr($proof, 0, -32);
+
+ return [trim($message), trim($signature)];
+ }
+
+ /**
+ * store reference to tweet
+ *
+ * @param $userId
+ * @param $tweetId
+ */
+ private function storeReference($userId, $tweetId) {
+
+ $key = 'tweet_id';
+
+ // delete old value, if exists
+ $stmt = $this->db->prepare('DELETE FROM store WHERE userId = :userId AND k = :k');
+ $stmt->bindParam(':userId', $userId, \PDO::PARAM_INT);
+ $stmt->bindParam(':k', $key, \PDO::PARAM_STR);
+ $stmt->execute();
+ $stmt->closeCursor();
+
+ // add new value
+ $stmt = $this->db->prepare('INSERT INTO store (userId, k, v) VALUES (:userId, :k, :v)');
+ $stmt->bindParam(':userId', $userId, \PDO::PARAM_INT);
+ $stmt->bindParam(':k', $key, \PDO::PARAM_STR);
+ $stmt->bindParam(':v', $tweetId, \PDO::PARAM_STR);
+ $stmt->execute();
+ $stmt->closeCursor();
+ }
+
+}
diff --git a/server/lib/Validator/Website.php b/server/lib/Validator/Website.php
new file mode 100644
index 0000000..e43bfb0
--- /dev/null
+++ b/server/lib/Validator/Website.php
@@ -0,0 +1,91 @@
+<?php
+/**
+ * @copyright Copyright (c) 2017 Bjoern Schiessle <bjoern@schiessle.org>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace LookupServer\Validator;
+
+
+use LookupServer\SignatureHandler;
+
+class Website {
+
+ /** @var SignatureHandler */
+ private $signatureHandler;
+
+ public function __construct(SignatureHandler $signatureHandler) {
+ $this->signatureHandler = $signatureHandler;
+ }
+
+ /**
+ * verify website proof
+ *
+ * @param array $verificationData from toVerify table
+ * @param array $userData stored user data
+ * @return bool
+ */
+ public function verify($verificationData, $userData) {
+ $url = $this->getValidUrl($verificationData['location']);
+ $proof = @file_get_contents($url);
+ $result = false;
+ try {
+ if ($proof) {
+ $cloudId = $userData['federationId'];
+ $proofSanitized = trim(preg_replace('/\s\s+/', ' ', $proof));
+ list($message, $signature) = $this->splitMessageSignature($proofSanitized);
+ $result = $this->signatureHandler->verify($cloudId, $message, $signature);
+ }
+ } catch (\Exception $e) {
+ // do nothing, just return false
+ }
+
+ return $result;
+ }
+
+ /**
+ * construct valid URL to proof
+ *
+ * @param string $url
+ * @return string
+ */
+ private function getValidUrl($url) {
+ $url = trim($url);
+ $url = rtrim($url, '/');
+ if (strpos($url, 'http://') !== 0 && strpos($url, 'https://') !== 0) {
+ $url = 'http://' . $url;
+ }
+
+ return $url . '/.well-known/CloudIdVerificationCode.txt';
+ }
+
+ /**
+ * split message and signature
+ *
+ * @param string $proof
+ * @return array
+ */
+ private function splitMessageSignature($proof) {
+ $signature = substr($proof, -344);
+ $message = substr($proof, 0, -344);
+
+ return [trim($message), trim($signature)];
+ }
+
+}
diff --git a/server/cronjob.php b/server/replicationcron.php
index 626034d..5b1555c 100755
--- a/server/cronjob.php
+++ b/server/replicationcron.php
@@ -17,4 +17,3 @@ $app = new \Slim\App($container);
$app->map(['GET'], '/import', 'Replication:import');
$app->run();
-
diff --git a/server/src/config.php b/server/src/config.php
index dc53e67..a702141 100644
--- a/server/src/config.php
+++ b/server/src/config.php
@@ -16,5 +16,11 @@ return [
'emailfrom' => $CONFIG['EMAIL_SENDER'],
'replication_auth' => $CONFIG['REPLICATION_AUTH'],
'replication_hosts' => $CONFIG['REPLICATION_HOSTS'],
+ 'twitter' => [
+ 'consumer_key' => $CONFIG['TWITTER']['CONSUMER_KEY'],
+ 'consumer_secret' => $CONFIG['TWITTER']['CONSUMER_SECRET'],
+ 'access_token' => $CONFIG['TWITTER']['ACCESS_TOKEN'],
+ 'access_token_secret' => $CONFIG['TWITTER']['ACCESS_TOKEN_SECRET'],
+ ],
]
];
diff --git a/server/src/dependencies.php b/server/src/dependencies.php
index 0e95274..32cedf3 100644
--- a/server/src/dependencies.php
+++ b/server/src/dependencies.php
@@ -9,8 +9,21 @@ $container['db'] = function($c) {
return $pdo;
};
$container['UserManager'] = function($c) {
- return new \LookupServer\UserManager($c->db, $c->EmailValidator);
+ return new \LookupServer\UserManager($c->db, $c->EmailValidator, $c->WebsiteValidator, $c->TwitterValidator, $c->SignatureHandler);
};
+$container['SignatureHandler'] = function($c) {
+ return new \LookupServer\SignatureHandler();
+};
+$container['TwitterOAuth'] = function($c) {
+ $twitterConf = $c['settings']['twitter'];
+ return new \Abraham\TwitterOAuth\TwitterOAuth(
+ $twitterConf['consumer_key'],
+ $twitterConf['consumer_secret'],
+ $twitterConf['access_token'],
+ $twitterConf['access_token_secret']
+ );
+};
+
$container['EmailValidator'] = function($c) {
return new \LookupServer\Validator\Email(
$c->db,
@@ -19,6 +32,12 @@ $container['EmailValidator'] = function($c) {
$c->settings['emailfrom']
);
};
+$container['WebsiteValidator'] = function($c) {
+ return new \LookupServer\Validator\Website($c->SignatureHandler);
+};
+$container['TwitterValidator'] = function($c) {
+ return new \LookupServer\Validator\Twitter($c->TwitterOAuth, $c->SignatureHandler, $c->db);
+};
$container['Status'] = function($c) {
return new \LookupServer\Status();
};
diff --git a/server/vendor/abraham/twitteroauth/.gitignore b/server/vendor/abraham/twitteroauth/.gitignore
new file mode 100644
index 0000000..8213dad
--- /dev/null
+++ b/server/vendor/abraham/twitteroauth/.gitignore
@@ -0,0 +1,4 @@
+.DS_Store
+composer.lock
+vendor
+env
diff --git a/server/vendor/abraham/twitteroauth/.travis.yml b/server/vendor/abraham/twitteroauth/.travis.yml
new file mode 100644
index 0000000..196b6e3
--- /dev/null
+++ b/server/vendor/abraham/twitteroauth/.travis.yml
@@ -0,0 +1,11 @@
+language: php
+php:
+ - '5.6'
+ - '7.0'
+ - '7.1'
+ - hhvm
+sudo: false
+before_script:
+ - composer self-update
+ - composer install --prefer-source --no-interaction
+script: phpunit
diff --git a/server/vendor/abraham/twitteroauth/LICENSE.md b/server/vendor/abraham/twitteroauth/LICENSE.md
new file mode 100644
index 0000000..64e83a1
--- /dev/null
+++ b/server/vendor/abraham/twitteroauth/LICENSE.md
@@ -0,0 +1,22 @@
+Copyright (c) 2009 Abraham Williams - http://abrah.am - abraham@abrah.am
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
diff --git a/server/vendor/abraham/twitteroauth/README.md b/server/vendor/abraham/twitteroauth/README.md
new file mode 100644
index 0000000..cc40341
--- /dev/null
+++ b/server/vendor/abraham/twitteroauth/README.md
@@ -0,0 +1,10 @@
+<span itemprop="name">TwitterOAuth</span> [![Build Status](https://img.shields.io/travis/abraham/twitteroauth.svg)](https://travis-ci.org/abraham/twitteroauth) [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/abraham/twitteroauth/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/abraham/twitteroauth/?branch=master) [![Issues Count](https://img.shields.io/github/issues/abraham/twitteroauth.svg)](https://github.com/abraham/twitteroauth/issues) [![Latest Version](https://img.shields.io/packagist/v/abraham/twitteroauth.svg)](https://packagist.org/packages/abraham/twitteroauth)
+------------
+
+<p itemprop="description">The most popular PHP library for Twitter's OAuth REST API.</p>
+
+See documentation at https://twitteroauth.com.
+
+PHP versions [listed](https://secure.php.net/supported-versions.php) as "active support" or "security fixes only" are supported.
+
+<img src="https://raw.githubusercontent.com/abraham/twitteroauth-demo/master/images/twitter-logo-blue.png" itemprop="image" alt="Twitter bird" width="200px">
diff --git a/server/vendor/abraham/twitteroauth/autoload.php b/server/vendor/abraham/twitteroauth/autoload.php
new file mode 100644
index 0000000..cff03e8
--- /dev/null
+++ b/server/vendor/abraham/twitteroauth/autoload.php
@@ -0,0 +1,36 @@
+<?php
+
+/**
+ * Use to autoload needed classes without Composer.
+ *
+ * @param string $class The fully-qualified class name.
+ * @return void
+ */
+spl_autoload_register(function ($class) {
+
+ // project-specific namespace prefix
+ $prefix = 'Abraham\\TwitterOAuth\\';
+
+ // base directory for the namespace prefix
+ $base_dir = __DIR__ . '/src/';
+
+ // does the class use the namespace prefix?
+ $len = strlen($prefix);
+ if (strncmp($prefix, $class, $len) !== 0) {
+ // no, move to the next registered autoloader
+ return;
+ }
+
+ // get the relative class name
+ $relative_class = substr($class, $len);
+
+ // replace the namespace prefix with the base directory, replace namespace
+ // separators with directory separators in the relative class name, append
+ // with .php
+ $file = $base_dir . str_replace('\\', '/', $relative_class) . '.php';
+
+ // if the file exists, require it
+ if (file_exists($file)) {
+ require $file;
+ }
+});
diff --git a/server/vendor/abraham/twitteroauth/composer.json b/server/vendor/abraham/twitteroauth/composer.json
new file mode 100644
index 0000000..7a6600f
--- /dev/null
+++ b/server/vendor/abraham/twitteroauth/composer.json
@@ -0,0 +1,34 @@
+{
+ "name": "abraham/twitteroauth",
+ "type": "library",
+ "description": "The most popular PHP library for use with the Twitter OAuth REST API.",
+ "keywords": ["twitter", "api", "oauth", "rest", "social", "twitter api", "twitter oauth"],
+ "license": "MIT",
+ "homepage": "https://twitteroauth.com",
+ "authors": [
+ {
+ "name": "Abraham Williams",
+ "email": "abraham@abrah.am",
+ "homepage": "https://abrah.am",
+ "role": "Developer"
+ }
+ ],
+ "support": {
+ "source": "https://github.com/abraham/twitteroauth",
+ "issues": "https://github.com/abraham/twitteroauth/issues"
+ },
+ "require": {
+ "php": "^5.6 || ^7.0",
+ "ext-curl": "*"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~5.6",
+ "squizlabs/php_codesniffer": "~2.7",
+ "phpmd/phpmd": "~2.4"
+ },
+ "autoload": {
+ "psr-4": {
+ "Abraham\\TwitterOAuth\\": "src"
+ }
+ }
+}
diff --git a/server/vendor/abraham/twitteroauth/phpmd.xml b/server/vendor/abraham/twitteroauth/phpmd.xml
new file mode 100644
index 0000000..ef45e75
--- /dev/null
+++ b/server/vendor/abraham/twitteroauth/phpmd.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<ruleset name="My first PHPMD rule set"
+ xmlns="http://pmd.sf.net/ruleset/1.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd"
+ xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd">
+ <description>Keep TwitterOAuth source code clean.</description>
+
+ <!-- <rule ref="rulesets/cleancode.xml" /> -->
+ <rule ref="rulesets/codesize.xml" />
+ <rule ref="rulesets/controversial.xml" />
+ <rule ref="rulesets/design.xml" />
+ <rule ref="rulesets/naming.xml" />
+ <rule ref="rulesets/unusedcode.xml" />
+</ruleset>
diff --git a/server/vendor/abraham/twitteroauth/phpunit.xml b/server/vendor/abraham/twitteroauth/phpunit.xml
new file mode 100644
index 0000000..71cc3e1
--- /dev/null
+++ b/server/vendor/abraham/twitteroauth/phpunit.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<phpunit
+ colors="true"
+ bootstrap="tests/bootstrap.php">
+
+ <testsuites>
+ <testsuite name="TwitterOAuth Test Suite">
+ <directory>./tests/</directory>
+ </testsuite>
+ </testsuites>
+</phpunit>
diff --git a/server/vendor/abraham/twitteroauth/src/Config.php b/server/vendor/abraham/twitteroauth/src/Config.php
new file mode 100644
index 0000000..ac0657f
--- /dev/null
+++ b/server/vendor/abraham/twitteroauth/src/Config.php
@@ -0,0 +1,77 @@
+<?php
+
+namespace Abraham\TwitterOAuth;
+
+/**
+ * Handle setting and storing config for TwitterOAuth.
+ *
+ * @author Abraham Williams <abraham@abrah.am>
+ */
+class Config
+{
+ /** @var int How long to wait for a response from the API */
+ protected $timeout = 5;
+ /** @var int how long to wait while connecting to the API */
+ protected $connectionTimeout = 5;
+ /**
+ * Decode JSON Response as associative Array
+ *
+ * @see http://php.net/manual/en/function.json-decode.php
+ *
+ * @var bool
+ */
+ protected $decodeJsonAsArray = false;
+ /** @var string User-Agent header */
+ protected $userAgent = 'TwitterOAuth (+https://twitteroauth.com)';
+ /** @var array Store proxy connection details */
+ protected $proxy = [];
+
+ /** @var bool Whether to encode the curl requests with gzip or not */
+ protected $gzipEncoding = true;
+
+ /**
+ * Set the connection and response timeouts.
+ *
+ * @param int $connectionTimeout
+ * @param int $timeout
+ */
+ public function setTimeouts($connectionTimeout, $timeout)
+ {
+ $this->connectionTimeout = (int)$connectionTimeout;
+ $this->timeout = (int)$timeout;
+ }
+
+ /**
+ * @param bool $value
+ */
+ public function setDecodeJsonAsArray($value)
+ {
+ $this->decodeJsonAsArray = (bool)$value;
+ }
+
+ /**
+ * @param string $userAgent
+ */
+ public function setUserAgent($userAgent)
+ {
+ $this->userAgent = (string)$userAgent;
+ }
+
+ /**
+ * @param array $proxy
+ */
+ public function setProxy(array $proxy)
+ {
+ $this->proxy = $proxy;
+ }
+
+ /**
+ * Whether to encode the curl requests with gzip or not.
+ *
+ * @param boolean $gzipEncoding
+ */
+ public function setGzipEncoding($gzipEncoding)
+ {
+ $this->gzipEncoding = (bool)$gzipEncoding;
+ }
+}
diff --git a/server/vendor/abraham/twitteroauth/src/Consumer.php b/server/vendor/abraham/twitteroauth/src/Consumer.php
new file mode 100644
index 0000000..ceaf1ef
--- /dev/null
+++ b/server/vendor/abraham/twitteroauth/src/Consumer.php
@@ -0,0 +1,36 @@
+<?php
+/**
+ * The MIT License
+ * Copyright (c) 2007 Andy Smith
+ */
+namespace Abraham\TwitterOAuth;
+
+class Consumer
+{
+ /** @var string */
+ public $key;
+ /** @var string */
+ public $secret;
+ /** @var string|null */
+ public $callbackUrl;
+
+ /**
+ * @param string $key
+ * @param string $secret
+ * @param null $callbackUrl
+ */
+ public function __construct($key, $secret, $callbackUrl = null)
+ {
+ $this->key = $key;
+ $this->secret = $secret;
+ $this->callbackUrl = $callbackUrl;
+ }
+
+ /**
+ * @return string
+ */
+ public function __toString()
+ {
+ return "Consumer[key=$this->key,secret=$this->secret]";
+ }
+}
diff --git a/server/vendor/abraham/twitteroauth/src/HmacSha1.php b/server/vendor/abraham/twitteroauth/src/HmacSha1.php
new file mode 100644
index 0000000..d8cdab8
--- /dev/null
+++ b/server/vendor/abraham/twitteroauth/src/HmacSha1.php
@@ -0,0 +1,39 @@
+<?php
+/**
+ * The MIT License
+ * Copyright (c) 2007 Andy Smith
+ */
+namespace Abraham\TwitterOAuth;
+
+/**
+ * The HMAC-SHA1 signature method uses the HMAC-SHA1 signature algorithm as defined in [RFC2104]
+ * where the Signature Base String is the text and the key is the concatenated values (each first
+ * encoded per Parameter Encoding) of the Consumer Secret and Token Secret, separated by an '&'
+ * character (ASCII code 38) even if empty.
+ * - Chapter 9.2 ("HMAC-SHA1")
+ */
+class HmacSha1 extends SignatureMethod
+{
+ /**
+ * {@inheritDoc}
+ */
+ public function getName()
+ {
+ return "HMAC-SHA1";
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function buildSignature(Request $request, Consumer $consumer, Token $token = null)
+ {
+ $signatureBase = $request->getSignatureBaseString();
+
+ $parts = [$consumer->secret, null !== $token ? $token->secret : ""];
+
+ $parts = Util::urlencodeRfc3986($parts);
+ $key = implode('&', $parts);
+
+ return base64_encode(hash_hmac('sha1', $signatureBase, $key, true));
+ }
+}
diff --git a/server/vendor/abraham/twitteroauth/src/Request.php b/server/vendor/abraham/twitteroauth/src/Request.php
new file mode 100644
index 0000000..a60c23d
--- /dev/null
+++ b/server/vendor/abraham/twitteroauth/src/Request.php
@@ -0,0 +1,254 @@
+<?php
+/**
+ * The MIT License
+ * Copyright (c) 2007 Andy Smith
+ */
+namespace Abraham\TwitterOAuth;
+
+class Request
+{
+ protected $parameters;
+ protected $httpMethod;
+ protected $httpUrl;
+ public static $version = '1.0';
+
+ /**
+ * Constructor
+ *
+ * @param string $httpMethod
+ * @param string $httpUrl
+ * @param array|null $parameters
+ */
+ public function __construct($httpMethod, $httpUrl, array $parameters = [])
+ {
+ $parameters = array_merge(Util::parseParameters(parse_url($httpUrl, PHP_URL_QUERY)), $parameters);
+ $this->parameters = $parameters;
+ $this->httpMethod = $httpMethod;
+ $this->httpUrl = $httpUrl;
+ }
+
+ /**
+ * pretty much a helper function to set up the request
+ *
+ * @param Consumer $consumer
+ * @param Token $token
+ * @param string $httpMethod
+ * @param string $httpUrl
+ * @param array $parameters
+ *
+ * @return Request
+ */
+ public static function fromConsumerAndToken(
+ Consumer $consumer,
+ Token $token = null,
+ $httpMethod,
+ $httpUrl,
+ array $parameters = []
+ ) {
+ $defaults = [
+ "oauth_version" => Request::$version,
+ "oauth_nonce" => Request::generateNonce(),
+ "oauth_timestamp" => time(),
+ "oauth_consumer_key" => $consumer->key
+ ];
+ if (null !== $token) {
+ $defaults['oauth_token'] = $token->key;
+ }
+
+ $parameters = array_merge($defaults, $parameters);
+
+ return new Request($httpMethod, $httpUrl, $parameters);
+ }
+
+ /**
+ * @param string $name
+ * @param string $value
+ */
+ public function setParameter($name, $value)
+ {
+ $this->parameters[$name] = $value;
+ }
+
+ /**
+ * @param $name
+ *
+ * @return string|null
+ */
+ public function getParameter($name)
+ {
+ return isset($this->parameters[$name]) ? $this->parameters[$name] : null;
+ }
+
+ /**
+ * @return array
+ */
+ public function getParameters()
+ {
+ return $this->parameters;
+ }
+
+ /**
+ * @param $name
+ */
+ public function removeParameter($name)
+ {
+ unset($this->parameters[$name]);
+ }
+
+ /**
+ * The request parameters, sorted and concatenated into a normalized string.
+ *
+ * @return string
+ */
+ public function getSignableParameters()
+ {
+ // Grab all parameters
+ $params = $this->parameters;
+
+ // Remove oauth_signature if present
+ // Ref: Spec: 9.1.1 ("The oauth_signature parameter MUST be excluded.")
+ if (isset($params['oauth_signature'])) {
+ unset($params['oauth_signature']);
+ }
+
+ return Util::buildHttpQuery($params);
+ }
+
+ /**
+ * Returns the base string of this request
+ *
+ * The base string defined as the method, the url
+ * and the parameters (normalized), each urlencoded
+ * and the concated with &.
+ *
+ * @return string
+ */
+ public function getSignatureBaseString()
+ {
+ $parts = [
+ $this->getNormalizedHttpMethod(),
+ $this->getNormalizedHttpUrl(),
+ $this->getSignableParameters()
+ ];
+
+ $parts = Util::urlencodeRfc3986($parts);
+
+ return implode('&', $parts);
+ }
+
+ /**
+ * Returns the HTTP Method in uppercase
+ *
+ * @return string
+ */
+ public function getNormalizedHttpMethod()
+ {
+ return strtoupper($this->httpMethod);
+ }
+
+ /**
+ * parses the url and rebuilds it to be
+ * scheme://host/path
+ *
+ * @return string
+ */
+ public function getNormalizedHttpUrl()
+ {
+ $parts = parse_url($this->httpUrl);
+
+ $scheme = $parts['scheme'];
+ $host = strtolower($parts['host']);
+ $path = $parts['path'];
+
+ return "$scheme://$host$path";
+ }
+
+ /**
+ * Builds a url usable for a GET request
+ *
+ * @return string
+ */
+ public function toUrl()
+ {
+ $postData = $this->toPostdata();
+ $out = $this->getNormalizedHttpUrl();
+ if ($postData) {
+ $out .= '?' . $postData;
+ }
+ return $out;
+ }
+
+ /**
+ * Builds the data one would send in a POST request
+ *
+ * @return string
+ */
+ public function toPostdata()
+ {
+ return Util::buildHttpQuery($this->parameters);
+ }
+
+ /**
+ * Builds the Authorization: header
+ *
+ * @return string
+ * @throws TwitterOAuthException
+ */
+ public function toHeader()
+ {
+ $first = true;
+ $out = 'Authorization: OAuth';
+ foreach ($this->parameters as $k => $v) {
+ if (substr($k, 0, 5) != "oauth") {
+ continue;
+ }
+ if (is_array($v)) {
+ throw new TwitterOAuthException('Arrays not supported in headers');
+ }
+ $out .= ($first) ? ' ' : ', ';
+ $out .= Util::urlencodeRfc3986($k) . '="' . Util::urlencodeRfc3986($v) . '"';
+ $first = false;
+ }
+ return $out;
+ }
+
+ /**
+ * @return string
+ */
+ public function __toString()
+ {
+ return $this->toUrl();
+ }
+
+ /**
+ * @param SignatureMethod $signatureMethod
+ * @param Consumer $consumer
+ * @param Token $token
+ */
+ public function signRequest(SignatureMethod $signatureMethod, Consumer $consumer, Token $token = null)
+ {
+ $this->setParameter("oauth_signature_method", $signatureMethod->getName());
+ $signature = $this->buildSignature($signatureMethod, $consumer, $token);
+ $this->setParameter("oauth_signature", $signature);
+ }
+
+ /**
+ * @param SignatureMethod $signatureMethod
+ * @param Consumer $consumer
+ * @param Token $token
+ *
+ * @return string
+ */
+ public function buildSignature(SignatureMethod $signatureMethod, Consumer $consumer, Token $token = null)
+ {
+ return $signatureMethod->buildSignature($this, $consumer, $token);
+ }
+
+ /**
+ * @return string
+ */
+ public static function generateNonce()
+ {
+ return md5(microtime() . mt_rand());
+ }
+}
diff --git a/server/vendor/abraham/twitteroauth/src/Response.php b/server/vendor/abraham/twitteroauth/src/Response.php
new file mode 100644
index 0000000..982b6ae
--- /dev/null
+++ b/server/vendor/abraham/twitteroauth/src/Response.php
@@ -0,0 +1,107 @@
+<?php
+
+namespace Abraham\TwitterOAuth;
+
+/**
+ * The result of the most recent API request.
+ *
+ * @author Abraham Williams <abraham@abrah.am>
+ */
+class Response
+{
+ /** @var string|null API path from the most recent request */
+ private $apiPath;
+ /** @var int HTTP status code from the most recent request */
+ private $httpCode = 0;
+ /** @var array HTTP headers from the most recent request */
+ private $headers = [];
+ /** @var array|object Response body from the most recent request */
+ private $body = [];
+ /** @var array HTTP headers from the most recent request that start with X */
+ private $xHeaders = [];
+
+ /**
+ * @param string $apiPath
+ */
+ public function setApiPath($apiPath)
+ {
+ $this->apiPath = $apiPath;
+ }
+
+ /**
+ * @return string|null
+ */
+ public function getApiPath()
+ {
+ return $this->apiPath;
+ }
+
+ /**
+ * @param array|object $body
+ */
+ public function setBody($body)
+ {
+ $this->body = $body;
+ }
+
+ /**
+ * @return array|object|string
+ */
+ public function getBody()
+ {
+ return $this->body;
+ }
+
+ /**
+ * @param int $httpCode
+ */
+ public function setHttpCode($httpCode)
+ {
+ $this->httpCode = $httpCode;
+ }
+
+ /**
+ * @return int
+ */
+ public function getHttpCode()
+ {
+ return $this->httpCode;
+ }
+
+ /**
+ * @param array $headers
+ */
+ public function setHeaders(array $headers)
+ {
+ foreach ($headers as $key => $value) {
+ if (substr($key, 0, 1) == 'x') {
+ $this->xHeaders[$key] = $value;
+ }
+ }
+ $this->headers = $headers;
+ }
+
+ /**
+ * @return array
+ */
+ public function getsHeaders()
+ {
+ return $this->headers;
+ }
+
+ /**
+ * @param array $xHeaders
+ */
+ public function setXHeaders(array $xHeaders = [])
+ {
+ $this->xHeaders = $xHeaders;
+ }
+
+ /**
+ * @return array
+ */
+ public function getXHeaders()
+ {
+ return $this->xHeaders;
+ }
+}
diff --git a/server/vendor/abraham/twitteroauth/src/SignatureMethod.php b/server/vendor/abraham/twitteroauth/src/SignatureMethod.php
new file mode 100644
index 0000000..40fd51e
--- /dev/null
+++ b/server/vendor/abraham/twitteroauth/src/SignatureMethod.php
@@ -0,0 +1,66 @@
+<?php
+/**
+ * The MIT License
+ * Copyright (c) 2007 Andy Smith
+ */
+namespace Abraham\TwitterOAuth;
+
+/**
+ * A class for implementing a Signature Method
+ * See section 9 ("Signing Requests") in the spec
+ */
+abstract class SignatureMethod
+{
+ /**
+ * Needs to return the name of the Signature Method (ie HMAC-SHA1)
+ *
+ * @return string
+ */
+ abstract public function getName();
+
+ /**
+ * Build up the signature
+ * NOTE: The output of this function MUST NOT be urlencoded.
+ * the encoding is handled in OAuthRequest when the final
+ * request is serialized
+ *
+ * @param Request $request
+ * @param Consumer $consumer
+ * @param Token $token
+ *
+ * @return string
+ */
+ abstract public function buildSignature(Request $request, Consumer $consumer, Token $token = null);
+
+ /**
+ * Verifies that a given signature is correct
+ *
+ * @param Request $request
+ * @param Consumer $consumer
+ * @param Token $token
+ * @param string $signature
+ *
+ * @return bool
+ */
+ public function checkSignature(Request $request, Consumer $consumer, Token $token, $signature)
+ {
+ $built = $this->buildSignature($request, $consumer, $token);
+
+ // Check for zero length, although unlikely here
+ if (strlen($built) == 0 || strlen($signature) == 0) {
+ return false;
+ }
+
+ if (strlen($built) != strlen($signature)) {
+ return false;
+ }
+
+ // Avoid a timing leak with a (hopefully) time insensitive compare
+ $result = 0;
+ for ($i = 0; $i < strlen($signature); $i++) {
+ $result |= ord($built{$i}) ^ ord($signature{$i});
+ }
+
+ return $result == 0;
+ }
+}
diff --git a/server/vendor/abraham/twitteroauth/src/Token.php b/server/vendor/abraham/twitteroauth/src/Token.php
new file mode 100644
index 0000000..140c1ec
--- /dev/null
+++ b/server/vendor/abraham/twitteroauth/src/Token.php
@@ -0,0 +1,38 @@
+<?php
+/**
+ * The MIT License
+ * Copyright (c) 2007 Andy Smith
+ */
+namespace Abraham\TwitterOAuth;
+
+class Token
+{
+ /** @var string */
+ public $key;
+ /** @var string */
+ public $secret;
+
+ /**
+ * @param string $key The OAuth Token
+ * @param string $secret The OAuth Token Secret
+ */
+ public function __construct($key, $secret)
+ {
+ $this->key = $key;
+ $this->secret = $secret;
+ }
+
+ /**
+ * Generates the basic string serialization of a token that a server
+ * would respond to request_token and access_token calls with
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return sprintf("oauth_token=%s&oauth_token_secret=%s",
+ Util::urlencodeRfc3986($this->key),
+ Util::urlencodeRfc3986($this->secret)
+ );
+ }
+}
diff --git a/server/vendor/abraham/twitteroauth/src/TwitterOAuth.php b/server/vendor/abraham/twitteroauth/src/TwitterOAuth.php
new file mode 100644
index 0000000..b4e961f
--- /dev/null
+++ b/server/vendor/abraham/twitteroauth/src/TwitterOAuth.php
@@ -0,0 +1,465 @@
+<?php
+/**
+ * The most popular PHP library for use with the Twitter OAuth REST API.
+ *
+ * @license MIT
+ */
+namespace Abraham\TwitterOAuth;
+
+use Abraham\TwitterOAuth\Util\JsonDecoder;
+
+/**
+ * TwitterOAuth class for interacting with the Twitter API.
+ *
+ * @author Abraham Williams <abraham@abrah.am>
+ */
+class TwitterOAuth extends Config
+{
+ const API_VERSION = '1.1';
+ const API_HOST = 'https://api.twitter.com';
+ const UPLOAD_HOST = 'https://upload.twitter.com';
+ const UPLOAD_CHUNK = 40960; // 1024 * 40
+
+ /** @var Response details about the result of the last request */
+ private $response;
+ /** @var string|null Application bearer token */
+ private $bearer;
+ /** @var Consumer Twitter application details */
+ private $consumer;
+ /** @var Token|null User access token details */
+ private $token;
+ /** @var HmacSha1 OAuth 1 signature type used by Twitter */
+ private $signatureMethod;
+
+ /**
+ * Constructor
+ *
+ * @param string $consumerKey The Application Consumer Key
+ * @param string $consumerSecret The Application Consumer Secret
+ * @param string|null $oauthToken The Client Token (optional)
+ * @param string|null $oauthTokenSecret The Client Token Secret (optional)
+ */
+ public function __construct($consumerKey, $consumerSecret, $oauthToken = null, $oauthTokenSecret = null)
+ {
+ $this->resetLastResponse();
+ $this->signatureMethod = new HmacSha1();
+ $this->consumer = new Consumer($consumerKey, $consumerSecret);
+ if (!empty($oauthToken) && !empty($oauthTokenSecret)) {
+ $this->token = new Token($oauthToken, $oauthTokenSecret);
+ }
+ if (empty($oauthToken) && !empty($oauthTokenSecret)) {
+ $this->bearer = $oauthTokenSecret;
+ }
+ }
+
+ /**
+ * @param string $oauthToken
+ * @param string $oauthTokenSecret
+ */
+ public function setOauthToken($oauthToken, $oauthTokenSecret)
+ {
+ $this->token = new Token($oauthToken, $oauthTokenSecret);
+ }
+
+ /**
+ * @return string|null
+ */
+ public function getLastApiPath()
+ {
+ return $this->response->getApiPath();
+ }
+
+ /**
+ * @return int
+ */
+ public function getLastHttpCode()
+ {
+ return $this->response->getHttpCode();
+ }
+
+ /**
+ * @return array
+ */
+ public function getLastXHeaders()
+ {
+ return $this->response->getXHeaders();
+ }
+
+ /**
+ * @return array|object|null
+ */
+ public function getLastBody()
+ {
+ return $this->response->getBody();
+ }
+
+ /**
+ * Resets the last response cache.
+ */
+ public function resetLastResponse()
+ {
+ $this->response = new Response();
+ }
+
+ /**
+ * Make URLs for user browser navigation.
+ *
+ * @param string $path
+ * @param array $parameters
+ *
+ * @return string
+ */
+ public function url($path, array $parameters)
+ {
+ $this->resetLastResponse();
+ $this->response->setApiPath($path);
+ $query = http_build_query($parameters);
+ return sprintf('%s/%s?%s', self::API_HOST, $path, $query);
+ }
+
+ /**
+ * Make /oauth/* requests to the API.
+ *
+ * @param string $path
+ * @param array $parameters
+ *
+ * @return array
+ * @throws TwitterOAuthException
+ */
+ public function oauth($path, array $parameters = [])
+ {
+ $response = [];
+ $this->resetLastResponse();
+ $this->response->setApiPath($path);
+ $url = sprintf('%s/%s', self::API_HOST, $path);
+ $result = $this->oAuthRequest($url, 'POST', $parameters);
+
+ if ($this->getLastHttpCode() != 200) {
+ throw new TwitterOAuthException($result);
+ }
+
+ parse_str($result, $response);
+ $this->response->setBody($response);
+
+ return $response;
+ }
+
+ /**
+ * Make /oauth2/* requests to the API.
+ *
+ * @param string $path
+ * @param array $parameters
+ *
+ * @return array|object
+ */
+ public function oauth2($path, array $parameters = [])
+ {
+ $method = 'POST';
+ $this->resetLastResponse();
+ $this->response->setApiPath($path);
+ $url = sprintf('%s/%s', self::API_HOST, $path);
+ $request = Request::fromConsumerAndToken($this->consumer, $this->token, $method, $url, $parameters);
+ $authorization = 'Authorization: Basic ' . $this->encodeAppAuthorization($this->consumer);
+ $result = $this->request($request->getNormalizedHttpUrl(), $method, $authorization, $parameters);
+ $response = JsonDecoder::decode($result, $this->decodeJsonAsArray);
+ $this->response->setBody($response);
+ return $response;
+ }
+
+ /**
+ * Make GET requests to the API.
+ *
+ * @param string $path
+ * @param array $parameters
+ *
+ * @return array|object
+ */
+ public function get($path, array $parameters = [])
+ {
+ return $this->http('GET', self::API_HOST, $path, $parameters);
+ }
+
+ /**
+ * Make POST requests to the API.
+ *
+ * @param string $path
+ * @param array $parameters
+ *
+ * @return array|object
+ */
+ public function post($path, array $parameters = [])
+ {
+ return $this->http('POST', self::API_HOST, $path, $parameters);
+ }
+
+ /**
+ * Make DELETE requests to the API.
+ *
+ * @param string $path
+ * @param array $parameters
+ *
+ * @return array|object
+ */
+ public function delete($path, array $parameters = [])
+ {
+ return $this->http('DELETE', self::API_HOST, $path, $parameters);
+ }
+
+ /**
+ * Make PUT requests to the API.
+ *
+ * @param string $path
+ * @param array $parameters
+ *
+ * @return array|object
+ */
+ public function put($path, array $parameters = [])
+ {
+ return $this->http('PUT', self::API_HOST, $path, $parameters);
+ }
+
+ /**
+ * Upload media to upload.twitter.com.
+ *
+ * @param string $path
+ * @param array $parameters
+ * @param boolean $chunked
+ *
+ * @return array|object
+ */
+ public function upload($path, array $parameters = [], $chunked = false)
+ {
+ if ($chunked) {
+ return $this->uploadMediaChunked($path, $parameters);
+ } else {
+ return $this->uploadMediaNotChunked($path, $parameters);
+ }
+ }
+
+ /**
+ * Private method to upload media (not chunked) to upload.twitter.com.
+ *
+ * @param string $path
+ * @param array $parameters
+ *
+ * @return array|object
+ */
+ private function uploadMediaNotChunked($path, array $parameters)
+ {
+ $file = file_get_contents($parameters['media']);
+ $base = base64_encode($file);
+ $parameters['media'] = $base;
+ return $this->http('POST', self::UPLOAD_HOST, $path, $parameters);
+ }
+
+ /**
+ * Private method to upload media (chunked) to upload.twitter.com.
+ *
+ * @param string $path
+ * @param array $parameters
+ *
+ * @return array|object
+ */
+ private function uploadMediaChunked($path, array $parameters)
+ {
+ // Init
+ $init = $this->http('POST', self::UPLOAD_HOST, $path, [
+ 'command' => 'INIT',
+ 'media_type' => $parameters['media_type'],
+ 'total_bytes' => filesize($parameters['media'])
+ ]);
+ // Append
+ $segment_index = 0;
+ $media = fopen($parameters['media'], 'rb');
+ while (!feof($media))
+ {
+ $this->http('POST', self::UPLOAD_HOST, 'media/upload', [
+ 'command' => 'APPEND',
+ 'media_id' => $init->media_id_string,
+ 'segment_index' => $segment_index++,
+ 'media_data' => base64_encode(fread($media, self::UPLOAD_CHUNK))
+ ]);
+ }
+ fclose($media);
+ // Finalize
+ $finalize = $this->http('POST', self::UPLOAD_HOST, 'media/upload', [
+ 'command' => 'FINALIZE',
+ 'media_id' => $init->media_id_string
+ ]);
+ return $finalize;
+ }
+
+ /**
+ * @param string $method
+ * @param string $host
+ * @param string $path
+ * @param array $parameters
+ *
+ * @return array|object
+ */
+ private function http($method, $host, $path, array $parameters)
+ {
+ $this->resetLastResponse();
+ $url = sprintf('%s/%s/%s.json', $host, self::API_VERSION, $path);
+ $this->response->setApiPath($path);
+ $result = $this->oAuthRequest($url, $method, $parameters);
+ $response = JsonDecoder::decode($result, $this->decodeJsonAsArray);
+ $this->response->setBody($response);
+ return $response;
+ }
+
+ /**
+ * Format and sign an OAuth / API request
+ *
+ * @param string $url
+ * @param string $method
+ * @param array $parameters
+ *
+ * @return string
+ * @throws TwitterOAuthException
+ */
+ private function oAuthRequest($url, $method, array $parameters)
+ {
+ $request = Request::fromConsumerAndToken($this->consumer, $this->token, $method, $url, $parameters);
+ if (array_key_exists('oauth_callback', $parameters)) {
+ // Twitter doesn't like oauth_callback as a parameter.
+ unset($parameters['oauth_callback']);
+ }
+ if ($this->bearer === null) {
+ $request->signRequest($this->signatureMethod, $this->consumer, $this->token);
+ $authorization = $request->toHeader();
+ } else {
+ $authorization = 'Authorization: Bearer ' . $this->bearer;
+ }
+ return $this->request($request->getNormalizedHttpUrl(), $method, $authorization, $parameters);
+ }
+
+ /**
+ * Make an HTTP request
+ *
+ * @param string $url
+ * @param string $method
+ * @param string $authorization
+ * @param array $postfields
+ *
+ * @return string
+ * @throws TwitterOAuthException
+ */
+ private function request($url, $method, $authorization, array $postfields)
+ {
+ /* Curl settings */
+ $options = [
+ // CURLOPT_VERBOSE => true,
+ CURLOPT_CAINFO => __DIR__ . DIRECTORY_SEPARATOR . 'cacert.pem',
+ CURLOPT_CONNECTTIMEOUT => $this->connectionTimeout,
+ CURLOPT_HEADER => true,
+ CURLOPT_HTTPHEADER => ['Accept: application/json', $authorization, 'Expect:'],
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_SSL_VERIFYHOST => 2,
+ CURLOPT_SSL_VERIFYPEER => true,
+ CURLOPT_TIMEOUT => $this->timeout,
+ CURLOPT_URL => $url,
+ CURLOPT_USERAGENT => $this->userAgent,
+ ];
+
+ /* Remove CACert file when in a PHAR file. */
+ if ($this->pharRunning()) {
+ unset($options[CURLOPT_CAINFO]);
+ }
+
+ if($this->gzipEncoding) {
+ $options[CURLOPT_ENCODING] = 'gzip';
+ }
+
+ if (!empty($this->proxy)) {
+ $options[CURLOPT_PROXY] = $this->proxy['CURLOPT_PROXY'];
+ $options[CURLOPT_PROXYUSERPWD] = $this->proxy['CURLOPT_PROXYUSERPWD'];
+ $options[CURLOPT_PROXYPORT] = $this->proxy['CURLOPT_PROXYPORT'];
+ $options[CURLOPT_PROXYAUTH] = CURLAUTH_BASIC;
+ $options[CURLOPT_PROXYTYPE] = CURLPROXY_HTTP;
+ }
+
+ switch ($method) {
+ case 'GET':
+ break;
+ case 'POST':
+ $options[CURLOPT_POST] = true;
+ $options[CURLOPT_POSTFIELDS] = Util::buildHttpQuery($postfields);
+ break;
+ case 'DELETE':
+ $options[CURLOPT_CUSTOMREQUEST] = 'DELETE';
+ break;
+ case 'PUT':
+ $options[CURLOPT_CUSTOMREQUEST] = 'PUT';
+ break;
+ }
+
+ if (in_array($method, ['GET', 'PUT', 'DELETE']) && !empty($postfields)) {
+ $options[CURLOPT_URL] .= '?' . Util::buildHttpQuery($postfields);
+ }
+
+
+ $curlHandle = curl_init();
+ curl_setopt_array($curlHandle, $options);
+ $response = curl_exec($curlHandle);
+
+ // Throw exceptions on cURL errors.
+ if (curl_errno($curlHandle) > 0) {
+ throw new TwitterOAuthException(curl_error($curlHandle), curl_errno($curlHandle));
+ }
+
+ $this->response->setHttpCode(curl_getinfo($curlHandle, CURLINFO_HTTP_CODE));
+ $parts = explode("\r\n\r\n", $response);
+ $responseBody = array_pop($parts);
+ $responseHeader = array_pop($parts);
+ $this->response->setHeaders($this->parseHeaders($responseHeader));
+
+ curl_close($curlHandle);
+
+ return $responseBody;
+ }
+
+ /**
+ * Get the header info to store.
+ *
+ * @param string $header
+ *
+ * @return array
+ */
+ private function parseHeaders($header)
+ {
+ $headers = [];
+ foreach (explode("\r\n", $header) as $line) {
+ if (strpos($line, ':') !== false) {
+ list ($key, $value) = explode(': ', $line);
+ $key = str_replace('-', '_', strtolower($key));
+ $headers[$key] = trim($value);
+ }
+ }
+ return $headers;
+ }
+
+ /**
+ * Encode application authorization header with base64.
+ *
+ * @param Consumer $consumer
+ *
+ * @return string
+ */
+ private function encodeAppAuthorization(Consumer $consumer)
+ {
+ $key = rawurlencode($consumer->key);
+ $secret = rawurlencode($consumer->secret);
+ return base64_encode($key . ':' . $secret);
+ }
+
+ /**
+ * Is the code running from a Phar module.
+ *
+ * @return boolean
+ */
+ private function pharRunning()
+ {
+ return class_exists('Phar') && !empty(\Phar::running(false));
+ }
+}
diff --git a/server/vendor/abraham/twitteroauth/src/TwitterOAuthException.php b/server/vendor/abraham/twitteroauth/src/TwitterOAuthException.php
new file mode 100644
index 0000000..79903ec
--- /dev/null
+++ b/server/vendor/abraham/twitteroauth/src/TwitterOAuthException.php
@@ -0,0 +1,10 @@
+<?php
+
+namespace Abraham\TwitterOAuth;
+
+/**
+ * @author Abraham Williams <abraham@abrah.am>
+ */
+class TwitterOAuthException extends \Exception
+{
+}
diff --git a/server/vendor/abraham/twitteroauth/src/Util.php b/server/vendor/abraham/twitteroauth/src/Util.php
new file mode 100644
index 0000000..372af95
--- /dev/null
+++ b/server/vendor/abraham/twitteroauth/src/Util.php
@@ -0,0 +1,115 @@
+<?php
+/**
+ * The MIT License
+ * Copyright (c) 2007 Andy Smith
+ */
+namespace Abraham\TwitterOAuth;
+
+class Util
+{
+ /**
+ * @param $input
+ *
+ * @return array|mixed|string
+ */
+ public static function urlencodeRfc3986($input)
+ {
+ $output = '';
+ if (is_array($input)) {
+ $output = array_map([__NAMESPACE__ . '\Util', 'urlencodeRfc3986'], $input);
+ } elseif (is_scalar($input)) {
+ $output = rawurlencode($input);
+ }
+ return $output;
+ }
+
+ /**
+ * @param string $string
+ *
+ * @return string
+ */
+ public static function urldecodeRfc3986($string)
+ {
+ return urldecode($string);
+ }
+
+ /**
+ * This function takes a input like a=b&a=c&d=e and returns the parsed
+ * parameters like this
+ * array('a' => array('b','c'), 'd' => 'e')
+ *
+ * @param string $input
+ *
+ * @return array
+ */
+ public static function parseParameters($input)
+ {
+ if (!is_string($input)) {
+ return [];
+ }
+
+ $pairs = explode('&', $input);
+
+ $parameters = [];
+ foreach ($pairs as $pair) {
+ $split = explode('=', $pair, 2);
+ $parameter = Util::urldecodeRfc3986($split[0]);
+ $value = isset($split[1]) ? Util::urldecodeRfc3986($split[1]) : '';
+
+ if (isset($parameters[$parameter])) {
+ // We have already recieved parameter(s) with this name, so add to the list
+ // of parameters with this name
+
+ if (is_scalar($parameters[$parameter])) {
+ // This is the first duplicate, so transform scalar (string) into an array
+ // so we can add the duplicates
+ $parameters[$parameter] = [$parameters[$parameter]];
+ }
+
+ $parameters[$parameter][] = $value;
+ } else {
+ $parameters[$parameter] = $value;
+ }
+ }
+ return $parameters;
+ }
+
+ /**
+ * @param array $params
+ *
+ * @return string
+ */
+ public static function buildHttpQuery(array $params)
+ {
+ if (empty($params)) {
+ return '';
+ }
+
+ // Urlencode both keys and values
+ $keys = Util::urlencodeRfc3986(array_keys($params));
+ $values = Util::urlencodeRfc3986(array_values($params));
+ $params = array_combine($keys, $values);
+
+ // Parameters are sorted by name, using lexicographical byte value ordering.
+ // Ref: Spec: 9.1.1 (1)
+ uksort($params, 'strcmp');
+
+ $pairs = [];
+ foreach ($params as $parameter => $value) {
+ if (is_array($value)) {
+ // If two or more parameters share the same name, they are sorted by their value
+ // Ref: Spec: 9.1.1 (1)
+ // June 12th, 2010 - changed to sort because of issue 164 by hidetaka
+ sort($value, SORT_STRING);
+ foreach ($value as $duplicateValue) {
+ $pairs[] = $parameter . '=' . $duplicateValue;
+ }
+ } else {
+ $pairs[] = $parameter . '=' . $value;
+ }
+ }
+ // For each parameter, the name is separated from the corresponding value by an '=' character (ASCII code 61)
+ // Each name-value pair is separated by an '&' character (ASCII code 38)
+ return implode('&', $pairs);
+ }
+}
diff --git a/server/vendor/abraham/twitteroauth/src/Util/JsonDecoder.php b/server/vendor/abraham/twitteroauth/src/Util/JsonDecoder.php
new file mode 100644
index 0000000..c8589c5
--- /dev/null
+++ b/server/vendor/abraham/twitteroauth/src/Util/JsonDecoder.php
@@ -0,0 +1,26 @@
+<?php
+
+namespace Abraham\TwitterOAuth\Util;
+
+/**
+ * @author louis <louis@systemli.org>
+ */
+class JsonDecoder
+{
+ /**
+ * Decodes a JSON string to stdObject or associative array
+ *
+ * @param string $string
+ * @param bool $asArray
+ *
+ * @return array|object
+ */
+ public static function decode($string, $asArray)
+ {
+ if (version_compare(PHP_VERSION, '5.4.0', '>=') && !(defined('JSON_C_VERSION') && PHP_INT_SIZE > 4)) {
+ return json_decode($string, $asArray, 512, JSON_BIGINT_AS_STRING);
+ }
+
+ return json_decode($string, $asArray);
+ }
+}
diff --git a/server/vendor/abraham/twitteroauth/src/cacert.pem b/server/vendor/abraham/twitteroauth/src/cacert.pem
new file mode 100644
index 0000000..cce0e58
--- /dev/null
+++ b/server/vendor/abraham/twitteroauth/src/cacert.pem
@@ -0,0 +1,4066 @@
+##
+## Bundle of CA Root Certificates
+##
+## Certificate data from Mozilla as of: Wed Nov 2 04:12:05 2016 GMT
+##
+## This is a bundle of X.509 certificates of public Certificate Authorities
+## (CA). These were automatically extracted from Mozilla's root certificates
+## file (certdata.txt). This file can be found in the mozilla source tree:
+## https://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt
+##
+## It contains the certificates in PEM format and therefore
+## can be directly used with curl / libcurl / php_curl, or with
+## an Apache+mod_ssl webserver for SSL client authentication.
+## Just configure this file as the SSLCACertificateFile.
+##
+## Conversion done with mk-ca-bundle.pl version 1.27.
+## SHA256: 17e2a90c8a5cfd6a675b3475d3d467e1ab1fe0d5397e907b08206182389caa08
+##
+
+
+GlobalSign Root CA
+==================
+-----BEGIN CERTIFICATE-----
+MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx
+GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds
+b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV
+BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD
+VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa
+DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc
+THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb
+Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP
+c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX
+gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF
+AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj
+Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG
+j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH
+hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC
+X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
+-----END CERTIFICATE-----
+
+GlobalSign Root CA - R2
+=======================
+-----BEGIN CERTIFICATE-----
+MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv
+YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
+bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
+aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
+bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6
+ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp
+s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN
+S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL
+TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C
+ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E
+FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i
+YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN
+BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp
+9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu
+01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7
+9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
+TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
+-----END CERTIFICATE-----
+
+Verisign Class 3 Public Primary Certification Authority - G3
+============================================================
+-----BEGIN CERTIFICATE-----
+MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
+UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
+cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
+IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
+CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
+dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
+cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg
+Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1
+EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc
+cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw
+EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj
+055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
+ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f
+j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
+/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0
+xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa
+t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
+-----END CERTIFICATE-----
+
+Entrust.net Premium 2048 Secure Server CA
+=========================================
+-----BEGIN CERTIFICATE-----
+MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u
+ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp
+bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV
+BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx
+NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3
+d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl
+MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u
+ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL
+Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr
+hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW
+nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi
+VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E
+BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ
+KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy
+T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf
+zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT
+J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e
+nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE=
+-----END CERTIFICATE-----
+
+Baltimore CyberTrust Root
+=========================
+-----BEGIN CERTIFICATE-----
+MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE
+ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li
+ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC
+SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs
+dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME
+uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB
+UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C
+G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9
+XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr
+l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI
+VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB
+BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh
+cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5
+hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa
+Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H
+RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
+-----END CERTIFICATE-----
+
+AddTrust Low-Value Services Root
+================================
+-----BEGIN CERTIFICATE-----
+MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
+QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU
+cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw
+CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO
+ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB
+AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6
+54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr
+oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1
+Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui
+GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w
+HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD
+AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT
+RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw
+HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt
+ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph
+iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY
+eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr
+mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj
+ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk=
+-----END CERTIFICATE-----
+
+AddTrust External Root
+======================
+-----BEGIN CERTIFICATE-----
+MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
+QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD
+VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw
+NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU
+cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg
+Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821
++iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw
+Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo
+aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy
+2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7
+7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P
+BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL
+VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk
+VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB
+IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl
+j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
+6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355
+e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u
+G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
+-----END CERTIFICATE-----
+
+AddTrust Public Services Root
+=============================
+-----BEGIN CERTIFICATE-----
+MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
+QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU
+cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ
+BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l
+dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu
+nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i
+d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG
+Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw
+HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G
+A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
+/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux
+FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G
+A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4
+JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL
++YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao
+GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9
+Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H
+EufOX1362KqxMy3ZdvJOOjMMK7MtkAY=
+-----END CERTIFICATE-----
+
+AddTrust Qualified Certificates Root
+====================================
+-----BEGIN CERTIFICATE-----
+MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
+QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU
+cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx
+CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ
+IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG
+9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx
+64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3
+KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o
+L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR
+wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU
+MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/
+BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE
+BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y
+azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD
+ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG
+GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X
+dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze
+RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB
+iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE=
+-----END CERTIFICATE-----
+
+Entrust Root Certification Authority
+====================================
+-----BEGIN CERTIFICATE-----
+MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV
+BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw
+b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG
+A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0
+MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu
+MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu
+Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v
+dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz
+A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww
+Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68
+j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN
+rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw
+DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1
+MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH
+hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
+A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM
+Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa
+v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS
+W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0
+tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8
+-----END CERTIFICATE-----
+
+RSA Security 2048 v3
+====================
+-----BEGIN CERTIFICATE-----
+MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK
+ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy
+MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb
+BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
+AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7
+Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb
+WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH
+KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP
++Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/
+MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E
+FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY
+v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj
+0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj
+VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395
+nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA
+pKnXwiJPZ9d37CAFYd4=
+-----END CERTIFICATE-----
+
+GeoTrust Global CA
+==================
+-----BEGIN CERTIFICATE-----
+MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK
+Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw
+MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
+LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo
+BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet
+8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc
+T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU
+vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD
+AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk
+DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q
+zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4
+d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2
+mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p
+XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm
+Mw==
+-----END CERTIFICATE-----
+
+GeoTrust Global CA 2
+====================
+-----BEGIN CERTIFICATE-----
+MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
+R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw
+MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
+LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
+ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/
+NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k
+LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA
+Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b
+HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF
+MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH
+K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7
+srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh
+ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL
+OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC
+x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF
+H4z1Ir+rzoPz4iIprn2DQKi6bA==
+-----END CERTIFICATE-----
+
+GeoTrust Universal CA
+=====================
+-----BEGIN CERTIFICATE-----
+MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
+R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1
+MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu
+Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP
+ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t
+JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e
+RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs
+7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d
+8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V
+qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga
+Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB
+Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu
+KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08
+ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0
+XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB
+hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc
+aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2
+qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL
+oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK
+xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF
+KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2
+DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK
+xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU
+p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI
+P/rmMuGNG2+k5o7Y+SlIis5z/iw=
+-----END CERTIFICATE-----
+
+GeoTrust Universal CA 2
+=======================
+-----BEGIN CERTIFICATE-----
+MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
+R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0
+MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg
+SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA
+A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0
+DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17
+j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q
+JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a
+QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2
+WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP
+20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn
+ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC
+SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG
+8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2
++/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E
+BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z
+dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ
+4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+
+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq
+A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg
+Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP
+pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d
+FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp
+gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm
+X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS
+-----END CERTIFICATE-----
+
+Visa eCommerce Root
+===================
+-----BEGIN CERTIFICATE-----
+MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG
+EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug
+QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2
+WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm
+VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv
+bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL
+F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b
+RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0
+TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI
+/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs
+GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG
+MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc
+CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW
+YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz
+zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu
+YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt
+398znM/jra6O1I7mT1GvFpLgXPYHDw==
+-----END CERTIFICATE-----
+
+Certum Root CA
+==============
+-----BEGIN CERTIFICATE-----
+MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK
+ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla
+Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u
+by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x
+wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL
+kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ
+89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K
+Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P
+NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq
+hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+
+GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg
+GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/
+0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS
+qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw==
+-----END CERTIFICATE-----
+
+Comodo AAA Services root
+========================
+-----BEGIN CERTIFICATE-----
+MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
+R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
+TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw
+MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl
+c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV
+BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG
+C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs
+i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW
+Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH
+Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK
+Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f
+BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl
+cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz
+LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm
+7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
+Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z
+8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C
+12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
+-----END CERTIFICATE-----
+
+Comodo Secure Services root
+===========================
+-----BEGIN CERTIFICATE-----
+MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
+R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
+TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw
+MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu
+Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi
+BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP
+9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc
+rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC
+oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V
+p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E
+FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w
+gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj
+YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm
+aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm
+4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj
+Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL
+DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw
+pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H
+RR3B7Hzs/Sk=
+-----END CERTIFICATE-----
+
+Comodo Trusted Services root
+============================
+-----BEGIN CERTIFICATE-----
+MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
+R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
+TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw
+MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h
+bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw
+IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7
+3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y
+/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6
+juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS
+ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud
+DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
+/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp
+ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl
+cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw
+uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32
+pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA
+BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l
+R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O
+9y5Xt5hwXsjEeLBi
+-----END CERTIFICATE-----
+
+QuoVadis Root CA
+================
+-----BEGIN CERTIFICATE-----
+MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE
+ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
+eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz
+MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp
+cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD
+EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk
+J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL
+F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL
+YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen
+AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w
+PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y
+ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7
+MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj
+YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs
+ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh
+Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW
+Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu
+BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw
+FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0
+aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6
+tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo
+fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul
+LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x
+gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi
+5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi
+5nrQNiOKSnQ2+Q==
+-----END CERTIFICATE-----
+
+QuoVadis Root CA 2
+==================
+-----BEGIN CERTIFICATE-----
+MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
+EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx
+ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
+aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC
+DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6
+XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk
+lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB
+lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy
+lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt
+66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn
+wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh
+D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy
+BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie
+J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud
+DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU
+a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT
+ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv
+Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3
+UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm
+VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK
++JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW
+IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1
+WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X
+f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II
+4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8
+VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u
+-----END CERTIFICATE-----
+
+QuoVadis Root CA 3
+==================
+-----BEGIN CERTIFICATE-----
+MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
+EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx
+OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
+aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
+DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg
+DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij
+KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K
+DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv
+BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp
+p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8
+nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX
+MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM
+Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz
+uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT
+BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj
+YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0
+aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB
+BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD
+VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4
+ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE
+AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV
+qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s
+hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z
+POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2
+Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp
+8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC
+bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu
+g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p
+vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr
+qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto=
+-----END CERTIFICATE-----
+
+Security Communication Root CA
+==============================
+-----BEGIN CERTIFICATE-----
+MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
+U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
+HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
+U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw
+8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM
+DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX
+5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd
+DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2
+JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw
+DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g
+0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a
+mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ
+s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ
+6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi
+FL39vmwLAw==
+-----END CERTIFICATE-----
+
+Sonera Class 2 Root CA
+======================
+-----BEGIN CERTIFICATE-----
+MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG
+U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw
+NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh
+IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3
+/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT
+dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG
+f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P
+tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH
+nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT
+XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt
+0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI
+cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph
+Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx
+EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH
+llpwrN9M
+-----END CERTIFICATE-----
+
+UTN USERFirst Hardware Root CA
+==============================
+-----BEGIN CERTIFICATE-----
+MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE
+BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
+IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd
+BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx
+OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0
+eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz
+ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI
+wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd
+tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8
+i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf
+Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw
+gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF
+lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF
+UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF
+BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM
+//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW
+XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2
+lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn
+iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67
+nfhmqA==
+-----END CERTIFICATE-----
+
+Camerfirma Chambers of Commerce Root
+====================================
+-----BEGIN CERTIFICATE-----
+MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe
+QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i
+ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx
+NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp
+cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn
+MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC
+AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU
+xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH
+NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW
+DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV
+d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud
+EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v
+cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P
+AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh
+bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD
+VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz
+aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi
+fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD
+L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN
+UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n
+ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1
+erfutGWaIZDgqtCYvDi1czyL+Nw=
+-----END CERTIFICATE-----
+
+Camerfirma Global Chambersign Root
+==================================
+-----BEGIN CERTIFICATE-----
+MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe
+QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i
+ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx
+NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt
+YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg
+MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw
+ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J
+1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O
+by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl
+6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c
+8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/
+BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j
+aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B
+Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj
+aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y
+ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh
+bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA
+PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y
+gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ
+PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4
+IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes
+t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A==
+-----END CERTIFICATE-----
+
+XRamp Global CA Root
+====================
+-----BEGIN CERTIFICATE-----
+MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE
+BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj
+dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB
+dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx
+HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg
+U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
+dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu
+IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx
+foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE
+zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs
+AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry
+xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
+EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap
+oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC
+AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc
+/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt
+qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n
+nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz
+8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw=
+-----END CERTIFICATE-----
+
+Go Daddy Class 2 CA
+===================
+-----BEGIN CERTIFICATE-----
+MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY
+VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG
+A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g
+RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD
+ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv
+2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32
+qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j
+YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY
+vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O
+BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o
+atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu
+MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG
+A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim
+PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt
+I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
+HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI
+Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b
+vZ8=
+-----END CERTIFICATE-----
+
+Starfield Class 2 CA
+====================
+-----BEGIN CERTIFICATE-----
+MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc
+U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg
+Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo
+MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG
+A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG
+SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY
+bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ
+JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm
+epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN
+F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF
+MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f
+hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo
+bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g
+QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs
+afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM
+PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl
+xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD
+KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3
+QBFGmh95DmK/D5fs4C8fF5Q=
+-----END CERTIFICATE-----
+
+StartCom Certification Authority
+================================
+-----BEGIN CERTIFICATE-----
+MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
+U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu
+ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0
+NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk
+LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg
+U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
+ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y
+o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/
+Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d
+eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt
+2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z
+6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ
+osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/
+untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc
+UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT
+37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE
+FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0
+Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj
+YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH
+AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw
+Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg
+U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5
+LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl
+cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh
+cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT
+dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC
+AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh
+3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm
+vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk
+fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3
+fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ
+EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq
+yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl
+1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/
+lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro
+g14=
+-----END CERTIFICATE-----
+
+Taiwan GRCA
+===========
+-----BEGIN CERTIFICATE-----
+MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG
+EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X
+DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv
+dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD
+ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN
+w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5
+BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O
+1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO
+htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov
+J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7
+Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t
+B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB
+O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8
+lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV
+HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2
+09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ
+TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj
+Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2
+Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU
+D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz
+DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk
+Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk
+7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ
+CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy
++fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS
+-----END CERTIFICATE-----
+
+Swisscom Root CA 1
+==================
+-----BEGIN CERTIFICATE-----
+MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQG
+EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy
+dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4
+MTgyMjA2MjBaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln
+aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIIC
+IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9m2BtRsiM
+MW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdihFvkcxC7mlSpnzNApbjyF
+NDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/TilftKaNXXsLmREDA/7n29uj/x2lzZAe
+AR81sH8A25Bvxn570e56eqeqDFdvpG3FEzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkC
+b6dJtDZd0KTeByy2dbcokdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn
+7uHbHaBuHYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNFvJbN
+cA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo19AOeCMgkckkKmUp
+WyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjCL3UcPX7ape8eYIVpQtPM+GP+HkM5
+haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJWbjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNY
+MUJDLXT5xp6mig/p/r+D5kNXJLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw
+HQYDVR0hBBYwFDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j
+BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzcK6FptWfUjNP9
+MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzfky9NfEBWMXrrpA9gzXrzvsMn
+jgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7IkVh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQ
+MbFamIp1TpBcahQq4FJHgmDmHtqBsfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4H
+VtA4oJVwIHaM190e3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtl
+vrsRls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ipmXeascCl
+OS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HHb6D0jqTsNFFbjCYDcKF3
+1QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksfrK/7DZBaZmBwXarNeNQk7shBoJMBkpxq
+nvy5JMWzFYJ+vq6VK+uxwNrjAWALXmmshFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCy
+x/yP2FS1k2Kdzs9Z+z0YzirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMW
+NY6E0F/6MBr1mmz0DlP5OlvRHA==
+-----END CERTIFICATE-----
+
+DigiCert Assured ID Root CA
+===========================
+-----BEGIN CERTIFICATE-----
+MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw
+IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx
+MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
+ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO
+9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy
+UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW
+/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy
+oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf
+GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF
+66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq
+hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc
+EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn
+SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i
+8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
+-----END CERTIFICATE-----
+
+DigiCert Global Root CA
+=======================
+-----BEGIN CERTIFICATE-----
+MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw
+HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw
+MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
+dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq
+hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn
+TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5
+BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H
+4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y
+7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB
+o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm
+8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF
+BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr
+EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt
+tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886
+UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
+CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
+-----END CERTIFICATE-----
+
+DigiCert High Assurance EV Root CA
+==================================
+-----BEGIN CERTIFICATE-----
+MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw
+KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw
+MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ
+MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu
+Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t
+Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS
+OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3
+MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ
+NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe
+h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB
+Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY
+JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ
+V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp
+myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK
+mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
+vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K
+-----END CERTIFICATE-----
+
+Certplus Class 2 Primary CA
+===========================
+-----BEGIN CERTIFICATE-----
+MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE
+BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN
+OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy
+dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR
+5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ
+Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO
+YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e
+e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME
+CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ
+YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t
+L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD
+P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R
+TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+
+7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW
+//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7
+l7+ijrRU
+-----END CERTIFICATE-----
+
+DST Root CA X3
+==============
+-----BEGIN CERTIFICATE-----
+MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK
+ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X
+DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1
+cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD
+ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT
+rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9
+UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy
+xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d
+utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T
+AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ
+MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug
+dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE
+GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw
+RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS
+fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
+-----END CERTIFICATE-----
+
+DST ACES CA X6
+==============
+-----BEGIN CERTIFICATE-----
+MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG
+EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT
+MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha
+MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE
+CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI
+DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa
+pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow
+GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy
+MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud
+EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu
+Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy
+dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU
+CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2
+5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t
+Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq
+nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs
+vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3
+oKfN5XozNmr6mis=
+-----END CERTIFICATE-----
+
+SwissSign Gold CA - G2
+======================
+-----BEGIN CERTIFICATE-----
+MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw
+EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN
+MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp
+c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B
+AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq
+t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C
+jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg
+vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF
+ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR
+AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend
+jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO
+peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR
+7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi
+GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw
+AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64
+OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov
+L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm
+5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr
+44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf
+Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m
+Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp
+mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk
+vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf
+KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br
+NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj
+viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ
+-----END CERTIFICATE-----
+
+SwissSign Silver CA - G2
+========================
+-----BEGIN CERTIFICATE-----
+MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT
+BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X
+DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3
+aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG
+9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644
+N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm
++/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH
+6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu
+MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h
+qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5
+FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs
+ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc
+celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X
+CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/
+BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB
+tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0
+cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P
+4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F
+kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L
+3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx
+/uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa
+DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP
+e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu
+WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ
+DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub
+DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u
+-----END CERTIFICATE-----
+
+GeoTrust Primary Certification Authority
+========================================
+-----BEGIN CERTIFICATE-----
+MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG
+EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD
+ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx
+CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ
+cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN
+b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9
+nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge
+RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt
+tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
+AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI
+hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K
+Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN
+NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa
+Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG
+1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=
+-----END CERTIFICATE-----
+
+thawte Primary Root CA
+======================
+-----BEGIN CERTIFICATE-----
+MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE
+BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
+aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
+cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3
+MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg
+SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv
+KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT
+FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs
+oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ
+1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc
+q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K
+aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p
+afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD
+VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF
+AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE
+uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
+xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89
+jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH
+z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA==
+-----END CERTIFICATE-----
+
+VeriSign Class 3 Public Primary Certification Authority - G5
+============================================================
+-----BEGIN CERTIFICATE-----
+MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
+BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
+ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
+IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB
+yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln
+biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh
+dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt
+YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
+ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz
+j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD
+Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/
+Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r
+fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/
+BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv
+Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
+aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG
+SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+
+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE
+KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC
+Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE
+ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
+-----END CERTIFICATE-----
+
+SecureTrust CA
+==============
+-----BEGIN CERTIFICATE-----
+MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG
+EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy
+dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe
+BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC
+ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX
+OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t
+DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH
+GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b
+01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH
+ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/
+BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj
+aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
+KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu
+SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf
+mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ
+nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR
+3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=
+-----END CERTIFICATE-----
+
+Secure Global CA
+================
+-----BEGIN CERTIFICATE-----
+MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG
+EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH
+bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg
+MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg
+Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx
+YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ
+bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g
+8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV
+HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi
+0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
+EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn
+oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA
+MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+
+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn
+CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5
+3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc
+f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW
+-----END CERTIFICATE-----
+
+COMODO Certification Authority
+==============================
+-----BEGIN CERTIFICATE-----
+MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE
+BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG
+A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1
+dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb
+MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD
+T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH
++7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww
+xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV
+4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA
+1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI
+rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E
+BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k
+b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC
+AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP
+OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
+RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc
+IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN
++8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ==
+-----END CERTIFICATE-----
+
+Network Solutions Certificate Authority
+=======================================
+-----BEGIN CERTIFICATE-----
+MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG
+EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr
+IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx
+MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
+MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx
+jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT
+aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT
+crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc
+/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB
+AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP
+BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv
+bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA
+A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q
+4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/
+GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv
+wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD
+ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
+-----END CERTIFICATE-----
+
+WellsSecure Public Root Certificate Authority
+=============================================
+-----BEGIN CERTIFICATE-----
+MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM
+F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw
+NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN
+MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl
+bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD
+VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1
+iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13
+i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8
+bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB
+K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB
+AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu
+cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm
+lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB
+i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww
+GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg
+Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI
+K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0
+bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj
+qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es
+E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ
+tylv2G0xffX8oRAHh84vWdw+WNs=
+-----END CERTIFICATE-----
+
+COMODO ECC Certification Authority
+==================================
+-----BEGIN CERTIFICATE-----
+MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC
+R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE
+ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB
+dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix
+GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR
+Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo
+b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X
+4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni
+wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E
+BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG
+FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA
+U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
+-----END CERTIFICATE-----
+
+IGC/A
+=====
+-----BEGIN CERTIFICATE-----
+MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD
+VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE
+Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy
+MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI
+EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT
+STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB
+IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2
+TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW
+So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy
+HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd
+frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ
+tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB
+egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC
+iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK
+q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q
+MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg
+Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI
+lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF
+0mBWWg==
+-----END CERTIFICATE-----
+
+Security Communication EV RootCA1
+=================================
+-----BEGIN CERTIFICATE-----
+MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
+U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh
+dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE
+BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl
+Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO
+/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX
+WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z
+ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4
+bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK
+9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG
+SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm
+iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG
+Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW
+mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW
+T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490
+-----END CERTIFICATE-----
+
+OISTE WISeKey Global Root GA CA
+===============================
+-----BEGIN CERTIFICATE-----
+MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE
+BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG
+A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH
+bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD
+VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw
+IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5
+IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9
+Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg
+Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD
+d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ
+/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R
+LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw
+AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
+KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm
+MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4
++vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa
+hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY
+okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0=
+-----END CERTIFICATE-----
+
+Microsec e-Szigno Root CA
+=========================
+-----BEGIN CERTIFICATE-----
+MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE
+BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL
+EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0
+MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz
+dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT
+GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
+AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG
+d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N
+oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc
+QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ
+PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb
+MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG
+IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD
+VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3
+LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A
+dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn
+AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA
+4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg
+AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA
+egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6
+Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO
+PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv
+c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h
+cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw
+IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT
+WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV
+MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER
+MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp
+Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal
+HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT
+nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE
+aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a
+86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK
+yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB
+S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU=
+-----END CERTIFICATE-----
+
+Certigna
+========
+-----BEGIN CERTIFICATE-----
+MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw
+EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3
+MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI
+Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q
+XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH
+GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p
+ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg
+DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf
+Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ
+tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ
+BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J
+SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA
+hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+
+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu
+PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY
+1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw
+WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==
+-----END CERTIFICATE-----
+
+Deutsche Telekom Root CA 2
+==========================
+-----BEGIN CERTIFICATE-----
+MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT
+RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG
+A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5
+MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G
+A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS
+b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5
+bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI
+KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY
+AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK
+Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV
+jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV
+HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr
+E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy
+zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8
+rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G
+dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU
+Cm26OWMohpLzGITY+9HPBVZkVw==
+-----END CERTIFICATE-----
+
+Cybertrust Global Root
+======================
+-----BEGIN CERTIFICATE-----
+MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li
+ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4
+MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD
+ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
++Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW
+0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL
+AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin
+89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT
+8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP
+BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2
+MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G
+A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO
+lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi
+5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2
+hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T
+X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW
+WL1WMRJOEcgh4LMRkWXbtKaIOM5V
+-----END CERTIFICATE-----
+
+ePKI Root Certification Authority
+=================================
+-----BEGIN CERTIFICATE-----
+MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG
+EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg
+Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx
+MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq
+MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B
+AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs
+IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi
+lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv
+qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX
+12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O
+WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+
+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao
+lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/
+vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi
+Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi
+MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH
+ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0
+1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq
+KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV
+xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP
+NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r
+GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE
+xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx
+gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy
+sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD
+BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw=
+-----END CERTIFICATE-----
+
+T\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
+=============================================================================================================================
+-----BEGIN CERTIFICATE-----
+MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH
+DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q
+aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry
+b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV
+BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg
+S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4
+MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl
+IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF
+n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl
+IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft
+dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl
+cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B
+AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO
+Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1
+xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR
+6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL
+hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd
+BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
+MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4
+N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT
+y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh
+LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M
+dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI=
+-----END CERTIFICATE-----
+
+Buypass Class 2 CA 1
+====================
+-----BEGIN CERTIFICATE-----
+MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
+QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2
+MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh
+c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M
+cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83
+0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4
+0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R
+uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC
+MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P
+AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV
+1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt
+7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2
+fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w
+wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho
+-----END CERTIFICATE-----
+
+EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1
+==========================================================================
+-----BEGIN CERTIFICATE-----
+MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNVBAMML0VCRyBF
+bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMTcwNQYDVQQKDC5FQkcg
+QmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXptZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAe
+Fw0wNjA4MTcwMDIxMDlaFw0xNjA4MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25p
+ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2lt
+IFRla25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIiMA0GCSqG
+SIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h4fuXd7hxlugTlkaDT7by
+X3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAktiHq6yOU/im/+4mRDGSaBUorzAzu8T2b
+gmmkTPiab+ci2hC6X5L8GCcKqKpE+i4stPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfr
+eYteIAbTdgtsApWjluTLdlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZ
+TqNGFav4c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8UmTDGy
+Y5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z+kI2sSXFCjEmN1Zn
+uqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0OLna9XvNRiYuoP1Vzv9s6xiQFlpJI
+qkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMWOeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vm
+ExH8nYQKE3vwO9D8owrXieqWfo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0
+Nokb+Clsi7n2l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB
+/wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgwFoAU587GT/wW
+Z5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+8ygjdsZs93/mQJ7ANtyVDR2t
+FcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgm
+zJNSroIBk5DKd8pNSe/iWtkqvTDOTLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64k
+XPBfrAowzIpAoHMEwfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqT
+bCmYIai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJnxk1Gj7sU
+RT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4QDgZxGhBM/nV+/x5XOULK
+1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9qKd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt
+2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11thie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQ
+Y9iJSrSq3RZj9W6+YKH47ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9
+AahH3eU7QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT
+-----END CERTIFICATE-----
+
+certSIGN ROOT CA
+================
+-----BEGIN CERTIFICATE-----
+MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD
+VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa
+Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE
+CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I
+JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH
+rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2
+ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD
+0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943
+AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B
+Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB
+AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8
+SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0
+x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt
+vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz
+TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD
+-----END CERTIFICATE-----
+
+CNNIC ROOT
+==========
+-----BEGIN CERTIFICATE-----
+MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE
+ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw
+OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD
+o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz
+VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT
+VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or
+czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK
+y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC
+wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S
+lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5
+Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM
+O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8
+BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2
+G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m
+mxE=
+-----END CERTIFICATE-----
+
+ApplicationCA - Japanese Government
+===================================
+-----BEGIN CERTIFICATE-----
+MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT
+SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw
+MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl
+cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4
+fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN
+wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE
+jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu
+nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU
+WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV
+BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD
+vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs
+o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g
+/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD
+io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW
+dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL
+rosot4LKGAfmt1t06SAZf7IbiVQ=
+-----END CERTIFICATE-----
+
+GeoTrust Primary Certification Authority - G3
+=============================================
+-----BEGIN CERTIFICATE-----
+MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE
+BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0
+IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy
+eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz
+NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo
+YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT
+LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j
+K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE
+c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C
+IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu
+dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC
+MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr
+2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9
+cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE
+Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD
+AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s
+t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt
+-----END CERTIFICATE-----
+
+thawte Primary Root CA - G2
+===========================
+-----BEGIN CERTIFICATE-----
+MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC
+VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu
+IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg
+Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV
+MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG
+b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt
+IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS
+LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5
+8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU
+mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN
+G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K
+rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==
+-----END CERTIFICATE-----
+
+thawte Primary Root CA - G3
+===========================
+-----BEGIN CERTIFICATE-----
+MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE
+BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
+aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
+cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w
+ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh
+d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD
+VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG
+A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At
+P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC
++BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY
+7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW
+vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E
+BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ
+KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK
+A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu
+t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC
+8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm
+er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A=
+-----END CERTIFICATE-----
+
+GeoTrust Primary Certification Authority - G2
+=============================================
+-----BEGIN CERTIFICATE-----
+MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC
+VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu
+Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD
+ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1
+OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg
+MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl
+b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG
+BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc
+KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD
+VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+
+EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m
+ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2
+npaqBA+K
+-----END CERTIFICATE-----
+
+VeriSign Universal Root Certification Authority
+===============================================
+-----BEGIN CERTIFICATE-----
+MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE
+BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
+ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
+IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u
+IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV
+UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
+cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
+IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0
+aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj
+1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP
+MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72
+9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I
+AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR
+tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G
+CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O
+a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud
+DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3
+Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx
+Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx
+P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P
+wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4
+mJO37M2CYfE45k+XmCpajQ==
+-----END CERTIFICATE-----
+
+VeriSign Class 3 Public Primary Certification Authority - G4
+============================================================
+-----BEGIN CERTIFICATE-----
+MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC
+VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3
+b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz
+ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj
+YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL
+MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU
+cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo
+b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5
+IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8
+Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz
+rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB
+/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw
+HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u
+Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD
+A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx
+AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==
+-----END CERTIFICATE-----
+
+NetLock Arany (Class Gold) Főtanúsítvány
+========================================
+-----BEGIN CERTIFICATE-----
+MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G
+A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610
+dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB
+cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx
+MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO
+ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv
+biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6
+c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu
+0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw
+/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk
+H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw
+fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1
+neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB
+BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW
+qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta
+YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC
+bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna
+NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu
+dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=
+-----END CERTIFICATE-----
+
+Staat der Nederlanden Root CA - G2
+==================================
+-----BEGIN CERTIFICATE-----
+MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE
+CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g
+Um9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oXDTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMC
+TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l
+ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ
+5291qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8SpuOUfiUtn
+vWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPUZ5uW6M7XxgpT0GtJlvOj
+CwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvEpMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiil
+e7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCR
+OME4HYYEhLoaJXhena/MUGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpI
+CT0ugpTNGmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy5V65
+48r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv6q012iDTiIJh8BIi
+trzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEKeN5KzlW/HdXZt1bv8Hb/C3m1r737
+qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMB
+AAGjgZcwgZQwDwYDVR0TAQH/BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcC
+ARYxaHR0cDovL3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV
+HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqGSIb3DQEBCwUA
+A4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLySCZa59sCrI2AGeYwRTlHSeYAz
++51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwj
+f/ST7ZwaUb7dRUG/kSS0H4zpX897IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaN
+kqbG9AclVMwWVxJKgnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfk
+CpYL+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxLvJxxcypF
+URmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkmbEgeqmiSBeGCc1qb3Adb
+CG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvkN1trSt8sV4pAWja63XVECDdCcAz+3F4h
+oKOKwJCcaNpQ5kUQR3i2TtJlycM33+FCY7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoV
+IPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm
+66+KAQ==
+-----END CERTIFICATE-----
+
+Juur-SK
+=======
+-----BEGIN CERTIFICATE-----
+MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA
+c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw
+DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG
+SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy
+aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf
+TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC
++Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw
+UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa
+Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF
+MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD
+HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh
+AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA
+cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr
+AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw
+cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE
+FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G
+A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo
+ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL
+abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678
+IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh
+Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2
+yyqcjg==
+-----END CERTIFICATE-----
+
+Hongkong Post Root CA 1
+=======================
+-----BEGIN CERTIFICATE-----
+MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT
+DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx
+NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n
+IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1
+ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr
+auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh
+qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY
+V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV
+HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i
+h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio
+l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei
+IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps
+T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT
+c4afU9hDDl3WY4JxHYB0yvbiAmvZWg==
+-----END CERTIFICATE-----
+
+SecureSign RootCA11
+===================
+-----BEGIN CERTIFICATE-----
+MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi
+SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS
+b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw
+KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1
+cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL
+TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO
+wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq
+g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP
+O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA
+bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX
+t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh
+OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r
+bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ
+Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01
+y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061
+lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I=
+-----END CERTIFICATE-----
+
+ACEDICOM Root
+=============
+-----BEGIN CERTIFICATE-----
+MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UEAwwNQUNFRElD
+T00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMB4XDTA4
+MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEWMBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoG
+A1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEF
+AAOCAg8AMIICCgKCAgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHk
+WLn709gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7XBZXehuD
+YAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5PGrjm6gSSrj0RuVFCPYew
+MYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAKt0SdE3QrwqXrIhWYENiLxQSfHY9g5QYb
+m8+5eaA9oiM/Qj9r+hwDezCNzmzAv+YbX79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbk
+HQl/Sog4P75n/TSW9R28MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTT
+xKJxqvQUfecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI2Sf2
+3EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyHK9caUPgn6C9D4zq9
+2Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEaeZAwUswdbxcJzbPEHXEUkFDWug/Fq
+TYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz
+4SsrSbbXc6GqlPUB53NlTKxQMA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU
+9QHnc2VMrFAwRAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv
+bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWImfQwng4/F9tqg
+aHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3gvoFNTPhNahXwOf9jU8/kzJP
+eGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKeI6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1Pwk
+zQSulgUV1qzOMPPKC8W64iLgpq0i5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1
+ThCojz2GuHURwCRiipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oI
+KiMnMCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZo5NjEFIq
+nxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6zqylfDJKZ0DcMDQj3dcE
+I2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacNGHk0vFQYXlPKNFHtRQrmjseCNj6nOGOp
+MCwXEGCSn1WHElkQwg9naRHMTh5+Spqtr0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3o
+tkYNbn5XOmeUwssfnHdKZ05phkOTOPu220+DkdRgfks+KzgHVZhepA==
+-----END CERTIFICATE-----
+
+Microsec e-Szigno Root CA 2009
+==============================
+-----BEGIN CERTIFICATE-----
+MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER
+MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv
+c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o
+dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE
+BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt
+U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw
+DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA
+fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG
+0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA
+pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm
+1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC
+AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf
+QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE
+FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o
+lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX
+I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775
+tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02
+yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi
+LXpUq3DDfSJlgnCW
+-----END CERTIFICATE-----
+
+GlobalSign Root CA - R3
+=======================
+-----BEGIN CERTIFICATE-----
+MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv
+YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
+bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
+aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
+bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt
+iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ
+0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3
+rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl
+OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2
+xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
+FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7
+lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8
+EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E
+bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18
+YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r
+kpeDMdmztcpHWD9f
+-----END CERTIFICATE-----
+
+Autoridad de Certificacion Firmaprofesional CIF A62634068
+=========================================================
+-----BEGIN CERTIFICATE-----
+MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA
+BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2
+MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw
+QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB
+NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD
+Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P
+B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY
+7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH
+ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI
+plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX
+MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX
+LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK
+bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU
+vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud
+EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH
+DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp
+cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA
+bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx
+ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx
+51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk
+R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP
+T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f
+Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl
+osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR
+crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR
+saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD
+KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi
+6Et8Vcad+qMUu2WFbm5PEn4KPJ2V
+-----END CERTIFICATE-----
+
+Izenpe.com
+==========
+-----BEGIN CERTIFICATE-----
+MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG
+EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz
+MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu
+QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ
+03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK
+ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU
++zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC
+PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT
+OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK
+F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK
+0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+
+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB
+leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID
+AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+
+SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG
+NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx
+MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O
+BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l
+Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga
+kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q
+hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs
+g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5
+aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5
+nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC
+ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo
+Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z
+WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw==
+-----END CERTIFICATE-----
+
+Chambers of Commerce Root - 2008
+================================
+-----BEGIN CERTIFICATE-----
+MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD
+MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
+bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
+QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy
+Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl
+ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF
+EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl
+cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
+AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA
+XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj
+h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/
+ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk
+NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g
+D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331
+lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ
+0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj
+ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2
+EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI
+G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ
+BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh
+bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh
+bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC
+CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH
+AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1
+wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH
+3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU
+RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6
+M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1
+YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF
+9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK
+zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG
+nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg
+OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ
+-----END CERTIFICATE-----
+
+Global Chambersign Root - 2008
+==============================
+-----BEGIN CERTIFICATE-----
+MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD
+MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
+bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
+QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx
+NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg
+Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ
+QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD
+aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf
+VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf
+XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0
+ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB
+/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA
+TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M
+H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe
+Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF
+HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh
+wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB
+AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT
+BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE
+BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm
+aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm
+aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp
+1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0
+dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG
+/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6
+ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s
+dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg
+9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH
+foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du
+qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr
+P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq
+c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z
+09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B
+-----END CERTIFICATE-----
+
+Go Daddy Root Certificate Authority - G2
+========================================
+-----BEGIN CERTIFICATE-----
+MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
+B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu
+MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5
+MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6
+b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G
+A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq
+9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD
++qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd
+fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl
+NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC
+MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9
+BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac
+vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r
+5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV
+N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO
+LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1
+-----END CERTIFICATE-----
+
+Starfield Root Certificate Authority - G2
+=========================================
+-----BEGIN CERTIFICATE-----
+MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
+B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
+b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0
+eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw
+DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg
+VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB
+dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv
+W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs
+bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk
+N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf
+ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU
+JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
+AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol
+TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx
+4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw
+F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K
+pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ
+c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0
+-----END CERTIFICATE-----
+
+Starfield Services Root Certificate Authority - G2
+==================================================
+-----BEGIN CERTIFICATE-----
+MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
+B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
+b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl
+IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV
+BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT
+dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg
+Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2
+h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa
+hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP
+LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB
+rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw
+AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG
+SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP
+E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy
+xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd
+iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza
+YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6
+-----END CERTIFICATE-----
+
+AffirmTrust Commercial
+======================
+-----BEGIN CERTIFICATE-----
+MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS
+BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw
+MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
+bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb
+DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV
+C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6
+BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww
+MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV
+HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
+AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG
+hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi
+qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv
+0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh
+sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=
+-----END CERTIFICATE-----
+
+AffirmTrust Networking
+======================
+-----BEGIN CERTIFICATE-----
+MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS
+BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw
+MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
+bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE
+Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI
+dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24
+/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb
+h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV
+HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
+AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu
+UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6
+12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23
+WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9
+/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=
+-----END CERTIFICATE-----
+
+AffirmTrust Premium
+===================
+-----BEGIN CERTIFICATE-----
+MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS
+BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy
+OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy
+dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
+MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn
+BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV
+5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs
++7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd
+GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R
+p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI
+S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04
+6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5
+/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo
++Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB
+/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv
+MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg
+Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC
+6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S
+L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK
++4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV
+BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg
+IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60
+g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb
+zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw==
+-----END CERTIFICATE-----
+
+AffirmTrust Premium ECC
+=======================
+-----BEGIN CERTIFICATE-----
+MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV
+BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx
+MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U
+cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA
+IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ
+N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW
+BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK
+BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X
+57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM
+eQ==
+-----END CERTIFICATE-----
+
+Certum Trusted Network CA
+=========================
+-----BEGIN CERTIFICATE-----
+MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK
+ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv
+biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy
+MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU
+ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
+MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC
+l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J
+J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4
+fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0
+cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB
+Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw
+DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj
+jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1
+mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj
+Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI
+03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=
+-----END CERTIFICATE-----
+
+Certinomis - Autorité Racine
+============================
+-----BEGIN CERTIFICATE-----
+MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK
+Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg
+LSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG
+A1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw
+JAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD
+ggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa
+wE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly
+Lu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw
+2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N
+jMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q
+c1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC
+lrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb
+xxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g
+530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna
+4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G
+A1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ
+KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x
+WqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva
+R6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40
+nJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B
+CxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv
+JL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE
+qkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b
+WfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE
+wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/
+vgt2Fl43N+bYdJeimUV5
+-----END CERTIFICATE-----
+
+Root CA Generalitat Valenciana
+==============================
+-----BEGIN CERTIFICATE-----
+MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE
+ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290
+IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3
+WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE
+CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2
+F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B
+ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ
+D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte
+JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB
+AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n
+dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB
+ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl
+AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA
+YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy
+AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA
+aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt
+AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA
+YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu
+AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA
+OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0
+dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV
+BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G
+A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S
+b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh
+TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz
+Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63
+NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH
+iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt
++GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM=
+-----END CERTIFICATE-----
+
+TWCA Root Certification Authority
+=================================
+-----BEGIN CERTIFICATE-----
+MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ
+VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG
+EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB
+IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
+AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx
+QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC
+oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP
+4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r
+y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB
+BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG
+9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC
+mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW
+QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY
+T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny
+Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==
+-----END CERTIFICATE-----
+
+Security Communication RootCA2
+==============================
+-----BEGIN CERTIFICATE-----
+MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
+U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh
+dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC
+SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy
+aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++
++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R
+3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV
+spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K
+EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8
+QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB
+CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj
+u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk
+3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q
+tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29
+mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03
+-----END CERTIFICATE-----
+
+EC-ACC
+======
+-----BEGIN CERTIFICATE-----
+MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE
+BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w
+ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD
+VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE
+CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT
+BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7
+MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt
+SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl
+Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh
+cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK
+w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT
+ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4
+HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a
+E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw
+0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E
+BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD
+VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0
+Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l
+dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ
+lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa
+Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe
+l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2
+E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D
+5EI=
+-----END CERTIFICATE-----
+
+Hellenic Academic and Research Institutions RootCA 2011
+=======================================================
+-----BEGIN CERTIFICATE-----
+MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT
+O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y
+aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
+IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT
+AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
+IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo
+IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI
+1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa
+71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u
+8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH
+3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/
+MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8
+MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu
+b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt
+XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8
+TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD
+/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N
+7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4
+-----END CERTIFICATE-----
+
+Actalis Authentication Root CA
+==============================
+-----BEGIN CERTIFICATE-----
+MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM
+BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE
+AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky
+MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz
+IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290
+IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ
+wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa
+by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6
+zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f
+YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2
+oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l
+EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7
+hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8
+EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5
+jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY
+iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt
+ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI
+WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0
+JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx
+K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+
+Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC
+4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo
+2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz
+lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem
+OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9
+vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg==
+-----END CERTIFICATE-----
+
+Trustis FPS Root CA
+===================
+-----BEGIN CERTIFICATE-----
+MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG
+EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290
+IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV
+BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ
+KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ
+RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk
+H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa
+cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt
+o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA
+AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd
+BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c
+GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC
+yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P
+8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV
+l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl
+iB6XzCGcKQENZetX2fNXlrtIzYE=
+-----END CERTIFICATE-----
+
+StartCom Certification Authority
+================================
+-----BEGIN CERTIFICATE-----
+MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
+U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu
+ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0
+NjM3WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk
+LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg
+U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
+ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y
+o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/
+Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d
+eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt
+2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z
+6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ
+osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/
+untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc
+UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT
+37uMdBNSSwIDAQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD
+VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFulF2mHMMo0aEPQ
+Qa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCCATgwLgYIKwYBBQUHAgEWImh0
+dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cu
+c3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENv
+bW1lcmNpYWwgKFN0YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0
+aGUgc2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0aWZpY2F0
+aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t
+L3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBG
+cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5
+fPGFf59Jb2vKXfuM/gTFwWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWm
+N3PH/UvSTa0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst0OcN
+Org+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNcpRJvkrKTlMeIFw6T
+tn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKlCcWw0bdT82AUuoVpaiF8H3VhFyAX
+e2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVFP0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA
+2MFrLH9ZXF2RsXAiV+uKa0hK1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBs
+HvUwyKMQ5bLmKhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE
+JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ8dCAWZvLMdib
+D4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnmfyWl8kgAwKQB2j8=
+-----END CERTIFICATE-----
+
+StartCom Certification Authority G2
+===================================
+-----BEGIN CERTIFICATE-----
+MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
+U3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
+RzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UE
+ChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3Jp
+dHkgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8O
+o1XJJZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsDvfOpL9HG
+4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnooD/Uefyf3lLE3PbfHkffi
+Aez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/Q0kGi4xDuFby2X8hQxfqp0iVAXV16iul
+Q5XqFYSdCI0mblWbq9zSOdIxHWDirMxWRST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbs
+O+wmETRIjfaAKxojAuuKHDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8H
+vKTlXcxNnw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM0D4L
+nMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/iUUjXuG+v+E5+M5iS
+FGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9Ha90OrInwMEePnWjFqmveiJdnxMa
+z6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHgTuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8E
+BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJ
+KoZIhvcNAQELBQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K
+2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfXUfEpY9Z1zRbk
+J4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl6/2o1PXWT6RbdejF0mCy2wl+
+JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG
+/+gyRr61M3Z3qAFdlsHB1b6uJcDJHgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTc
+nIhT76IxW1hPkWLIwpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/Xld
+blhYXzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5lIxKVCCIc
+l85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoohdVddLHRDiBYmxOlsGOm
+7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulrso8uBtjRkcfGEvRM/TAXw8HaOFvjqerm
+obp573PYtlNXLfbQ4ddI
+-----END CERTIFICATE-----
+
+Buypass Class 2 Root CA
+=======================
+-----BEGIN CERTIFICATE-----
+MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
+QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X
+DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1
+eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw
+DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1
+g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn
+9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b
+/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU
+CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff
+awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI
+zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn
+Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX
+Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs
+M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD
+VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF
+AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s
+A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI
+osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S
+aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd
+DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD
+LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0
+oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC
+wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS
+CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN
+rJgWVqA=
+-----END CERTIFICATE-----
+
+Buypass Class 3 Root CA
+=======================
+-----BEGIN CERTIFICATE-----
+MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
+QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X
+DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1
+eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw
+DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH
+sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR
+5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh
+7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ
+ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH
+2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV
+/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ
+RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA
+Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq
+j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD
+VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF
+AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV
+cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G
+uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG
+Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8
+ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2
+KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz
+6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug
+UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe
+eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi
+Cp/HuZc=
+-----END CERTIFICATE-----
+
+T-TeleSec GlobalRoot Class 3
+============================
+-----BEGIN CERTIFICATE-----
+MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM
+IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU
+cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx
+MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz
+dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD
+ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK
+9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU
+NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF
+iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W
+0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA
+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr
+AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb
+fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT
+ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h
+P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml
+e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw==
+-----END CERTIFICATE-----
+
+EE Certification Centre Root CA
+===============================
+-----BEGIN CERTIFICATE-----
+MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG
+EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy
+dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw
+MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB
+UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy
+ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB
+DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM
+TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2
+rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw
+93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN
+P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T
+AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ
+MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF
+BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj
+xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM
+lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u
+uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU
+3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM
+dcGWxZ0=
+-----END CERTIFICATE-----
+
+TURKTRUST Certificate Services Provider Root 2007
+=================================================
+-----BEGIN CERTIFICATE-----
+MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOcUktUUlVTVCBF
+bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP
+MA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg
+QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4X
+DTA3MTIyNTE4MzcxOVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxl
+a3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMCVFIxDzAN
+BgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp
+bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4gKGMpIEFyYWzEsWsgMjAwNzCCASIw
+DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9N
+YvDdE3ePYakqtdTyuTFYKTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQv
+KUmi8wUG+7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveGHtya
+KhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6PIzdezKKqdfcYbwnT
+rqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M733WB2+Y8a+xwXrXgTW4qhe04MsC
+AwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHkYb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAP
+BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/s
+Px+EnWVUXKgWAkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I
+aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5mxRZNTZPz/OO
+Xl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsaXRik7r4EW5nVcV9VZWRi1aKb
+BFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZqxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAK
+poRq0Tl9
+-----END CERTIFICATE-----
+
+D-TRUST Root Class 3 CA 2 2009
+==============================
+-----BEGIN CERTIFICATE-----
+MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK
+DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe
+Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE
+LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw
+DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD
+ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA
+BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv
+KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z
+p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC
+AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ
+4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y
+eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw
+MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G
+PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw
+OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm
+2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0
+o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV
+dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph
+X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I=
+-----END CERTIFICATE-----
+
+D-TRUST Root Class 3 CA 2 EV 2009
+=================================
+-----BEGIN CERTIFICATE-----
+MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK
+DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw
+OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK
+DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw
+OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS
+egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh
+zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T
+7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60
+sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35
+11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv
+cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v
+ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El
+MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp
+b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh
+c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+
+PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05
+nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX
+ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA
+NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv
+w9y4AyHqnxbxLFS1
+-----END CERTIFICATE-----
+
+PSCProcert
+==========
+-----BEGIN CERTIFICATE-----
+MIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1dG9yaWRhZCBk
+ZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9sYW5vMQswCQYDVQQGEwJWRTEQ
+MA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlzdHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lz
+dGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBl
+cmludGVuZGVuY2lhIGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUw
+IwYJKoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEwMFoXDTIw
+MTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHByb2NlcnQubmV0LnZlMQ8w
+DQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGExKjAoBgNVBAsTIVByb3ZlZWRvciBkZSBD
+ZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZp
+Y2FjaW9uIEVsZWN0cm9uaWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIw
+DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo97BVC
+wfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74BCXfgI8Qhd19L3uA
+3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38GieU89RLAu9MLmV+QfI4tL3czkkoh
+RqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmO
+EO8GqQKJ/+MMbpfg353bIdD0PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG2
+0qCZyFSTXai20b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH
+0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/6mnbVSKVUyqU
+td+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1mv6JpIzi4mWCZDlZTOpx+FIyw
+Bm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvp
+r2uKGcfLFFb14dq12fy/czja+eevbqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/
+AgEBMDcGA1UdEgQwMC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAz
+Ni0wMB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFDgBStuyId
+xuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0b3JpZGFkIGRlIENlcnRp
+ZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xhbm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQH
+EwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5h
+Y2lvbmFsIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5k
+ZW5jaWEgZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkqhkiG
+9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQDAgEGME0GA1UdEQRG
+MESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0wMDAwMDKgGwYFYIZeAgKgEgwQUklG
+LUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEagRKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52
+ZS9sY3IvQ0VSVElGSUNBRE8tUkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNy
+YWl6LnN1c2NlcnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v
+Y3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsGAQUFBwIBFh5o
+dHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcNAQELBQADggIBACtZ6yKZu4Sq
+T96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmN
+g7+mvTV+LFwxNG9s2/NkAZiqlCxB3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4q
+uxtxj7mkoP3YldmvWb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1
+n8GhHVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHmpHmJWhSn
+FFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXzsOfIt+FTvZLm8wyWuevo
+5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bEqCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq
+3TNWOByyrYDT13K9mmyZY+gAu0F2BbdbmRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5
+poLWccret9W6aAjtmcz9opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3Y
+eMLEYC/HYvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km
+-----END CERTIFICATE-----
+
+China Internet Network Information Center EV Certificates Root
+==============================================================
+-----BEGIN CERTIFICATE-----
+MIID9zCCAt+gAwIBAgIESJ8AATANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCQ04xMjAwBgNV
+BAoMKUNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyMUcwRQYDVQQDDD5D
+aGluYSBJbnRlcm5ldCBOZXR3b3JrIEluZm9ybWF0aW9uIENlbnRlciBFViBDZXJ0aWZpY2F0ZXMg
+Um9vdDAeFw0xMDA4MzEwNzExMjVaFw0zMDA4MzEwNzExMjVaMIGKMQswCQYDVQQGEwJDTjEyMDAG
+A1UECgwpQ2hpbmEgSW50ZXJuZXQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIxRzBFBgNVBAMM
+PkNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyIEVWIENlcnRpZmljYXRl
+cyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm35z7r07eKpkQ0H1UN+U8i6y
+jUqORlTSIRLIOTJCBumD1Z9S7eVnAztUwYyZmczpwA//DdmEEbK40ctb3B75aDFk4Zv6dOtouSCV
+98YPjUesWgbdYavi7NifFy2cyjw1l1VxzUOFsUcW9SxTgHbP0wBkvUCZ3czY28Sf1hNfQYOL+Q2H
+klY0bBoQCxfVWhyXWIQ8hBouXJE0bhlffxdpxWXvayHG1VA6v2G5BY3vbzQ6sm8UY78WO5upKv23
+KzhmBsUs4qpnHkWnjQRmQvaPK++IIGmPMowUc9orhpFjIpryp9vOiYurXccUwVswah+xt54ugQEC
+7c+WXmPbqOY4twIDAQABo2MwYTAfBgNVHSMEGDAWgBR8cks5x8DbYqVPm6oYNJKiyoOCWTAPBgNV
+HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUfHJLOcfA22KlT5uqGDSSosqD
+glkwDQYJKoZIhvcNAQEFBQADggEBACrDx0M3j92tpLIM7twUbY8opJhJywyA6vPtI2Z1fcXTIWd5
+0XPFtQO3WKwMVC/GVhMPMdoG52U7HW8228gd+f2ABsqjPWYWqJ1MFn3AlUa1UeTiH9fqBk1jjZaM
+7+czV0I664zBechNdn3e9rG3geCg+aF4RhcaVpjwTj2rHO3sOdwHSPdj/gauwqRcalsyiMXHM4Ws
+ZkJHwlgkmeHlPuV1LI5D1l08eB6olYIpUNHRFrrvwb562bTYzB5MRuF3sTGrvSrIzo9uoV1/A3U0
+5K2JRVRevq4opbs/eHnrc7MKDf2+yfdWrPa37S+bISnHOLaVxATywy39FCqQmbkHzJ8=
+-----END CERTIFICATE-----
+
+Swisscom Root CA 2
+==================
+-----BEGIN CERTIFICATE-----
+MIIF2TCCA8GgAwIBAgIQHp4o6Ejy5e/DfEoeWhhntjANBgkqhkiG9w0BAQsFADBkMQswCQYDVQQG
+EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy
+dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMjAeFw0xMTA2MjQwODM4MTRaFw0zMTA2
+MjUwNzM4MTRaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln
+aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAyMIIC
+IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlUJOhJ1R5tMJ6HJaI2nbeHCOFvErjw0DzpPM
+LgAIe6szjPTpQOYXTKueuEcUMncy3SgM3hhLX3af+Dk7/E6J2HzFZ++r0rk0X2s682Q2zsKwzxNo
+ysjL67XiPS4h3+os1OD5cJZM/2pYmLcX5BtS5X4HAB1f2uY+lQS3aYg5oUFgJWFLlTloYhyxCwWJ
+wDaCFCE/rtuh/bxvHGCGtlOUSbkrRsVPACu/obvLP+DHVxxX6NZp+MEkUp2IVd3Chy50I9AU/SpH
+Wrumnf2U5NGKpV+GY3aFy6//SSj8gO1MedK75MDvAe5QQQg1I3ArqRa0jG6F6bYRzzHdUyYb3y1a
+SgJA/MTAtukxGggo5WDDH8SQjhBiYEQN7Aq+VRhxLKX0srwVYv8c474d2h5Xszx+zYIdkeNL6yxS
+NLCK/RJOlrDrcH+eOfdmQrGrrFLadkBXeyq96G4DsguAhYidDMfCd7Camlf0uPoTXGiTOmekl9Ab
+mbeGMktg2M7v0Ax/lZ9vh0+Hio5fCHyqW/xavqGRn1V9TrALacywlKinh/LTSlDcX3KwFnUey7QY
+Ypqwpzmqm59m2I2mbJYV4+by+PGDYmy7Velhk6M99bFXi08jsJvllGov34zflVEpYKELKeRcVVi3
+qPyZ7iVNTA6z00yPhOgpD/0QVAKFyPnlw4vP5w8CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw
+HQYDVR0hBBYwFDASBgdghXQBUwIBBgdghXQBUwIBMBIGA1UdEwEB/wQIMAYBAf8CAQcwHQYDVR0O
+BBYEFE0mICKJS9PVpAqhb97iEoHF8TwuMB8GA1UdIwQYMBaAFE0mICKJS9PVpAqhb97iEoHF8Twu
+MA0GCSqGSIb3DQEBCwUAA4ICAQAyCrKkG8t9voJXiblqf/P0wS4RfbgZPnm3qKhyN2abGu2sEzsO
+v2LwnN+ee6FTSA5BesogpxcbtnjsQJHzQq0Qw1zv/2BZf82Fo4s9SBwlAjxnffUy6S8w5X2lejjQ
+82YqZh6NM4OKb3xuqFp1mrjX2lhIREeoTPpMSQpKwhI3qEAMw8jh0FcNlzKVxzqfl9NX+Ave5XLz
+o9v/tdhZsnPdTSpxsrpJ9csc1fV5yJmz/MFMdOO0vSk3FQQoHt5FRnDsr7p4DooqzgB53MBfGWcs
+a0vvaGgLQ+OswWIJ76bdZWGgr4RVSJFSHMYlkSrQwSIjYVmvRRGFHQEkNI/Ps/8XciATwoCqISxx
+OQ7Qj1zB09GOInJGTB2Wrk9xseEFKZZZ9LuedT3PDTcNYtsmjGOpI99nBjx8Oto0QuFmtEYE3saW
+mA9LSHokMnWRn6z3aOkquVVlzl1h0ydw2Df+n7mvoC5Wt6NlUe07qxS/TFED6F+KBZvuim6c779o
++sjaC+NCydAXFJy3SuCvkychVSa1ZC+N8f+mQAWFBVzKBxlcCxMoTFh/wqXvRdpg065lYZ1Tg3TC
+rvJcwhbtkj6EPnNgiLx29CzP0H1907he0ZESEOnN3col49XtmS++dYFLJPlFRpTJKSFTnCZFqhMX
+5OfNeOI5wSsSnqaeG8XmDtkx2Q==
+-----END CERTIFICATE-----
+
+Swisscom Root EV CA 2
+=====================
+-----BEGIN CERTIFICATE-----
+MIIF4DCCA8igAwIBAgIRAPL6ZOJ0Y9ON/RAdBB92ylgwDQYJKoZIhvcNAQELBQAwZzELMAkGA1UE
+BhMCY2gxETAPBgNVBAoTCFN3aXNzY29tMSUwIwYDVQQLExxEaWdpdGFsIENlcnRpZmljYXRlIFNl
+cnZpY2VzMR4wHAYDVQQDExVTd2lzc2NvbSBSb290IEVWIENBIDIwHhcNMTEwNjI0MDk0NTA4WhcN
+MzEwNjI1MDg0NTA4WjBnMQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsT
+HERpZ2l0YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxHjAcBgNVBAMTFVN3aXNzY29tIFJvb3QgRVYg
+Q0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMT3HS9X6lds93BdY7BxUglgRCgz
+o3pOCvrY6myLURYaVa5UJsTMRQdBTxB5f3HSek4/OE6zAMaVylvNwSqD1ycfMQ4jFrclyxy0uYAy
+Xhqdk/HoPGAsp15XGVhRXrwsVgu42O+LgrQ8uMIkqBPHoCE2G3pXKSinLr9xJZDzRINpUKTk4Rti
+GZQJo/PDvO/0vezbE53PnUgJUmfANykRHvvSEaeFGHR55E+FFOtSN+KxRdjMDUN/rhPSays/p8Li
+qG12W0OfvrSdsyaGOx9/5fLoZigWJdBLlzin5M8J0TbDC77aO0RYjb7xnglrPvMyxyuHxuxenPaH
+Za0zKcQvidm5y8kDnftslFGXEBuGCxobP/YCfnvUxVFkKJ3106yDgYjTdLRZncHrYTNaRdHLOdAG
+alNgHa/2+2m8atwBz735j9m9W8E6X47aD0upm50qKGsaCnw8qyIL5XctcfaCNYGu+HuB5ur+rPQa
+m3Rc6I8k9l2dRsQs0h4rIWqDJ2dVSqTjyDKXZpBy2uPUZC5f46Fq9mDU5zXNysRojddxyNMkM3Ox
+bPlq4SjbX8Y96L5V5jcb7STZDxmPX2MYWFCBUWVv8p9+agTnNCRxunZLWB4ZvRVgRaoMEkABnRDi
+xzgHcgplwLa7JSnaFp6LNYth7eVxV4O1PHGf40+/fh6Bn0GXAgMBAAGjgYYwgYMwDgYDVR0PAQH/
+BAQDAgGGMB0GA1UdIQQWMBQwEgYHYIV0AVMCAgYHYIV0AVMCAjASBgNVHRMBAf8ECDAGAQH/AgED
+MB0GA1UdDgQWBBRF2aWBbj2ITY1x0kbBbkUe88SAnTAfBgNVHSMEGDAWgBRF2aWBbj2ITY1x0kbB
+bkUe88SAnTANBgkqhkiG9w0BAQsFAAOCAgEAlDpzBp9SSzBc1P6xXCX5145v9Ydkn+0UjrgEjihL
+j6p7jjm02Vj2e6E1CqGdivdj5eu9OYLU43otb98TPLr+flaYC/NUn81ETm484T4VvwYmneTwkLbU
+wp4wLh/vx3rEUMfqe9pQy3omywC0Wqu1kx+AiYQElY2NfwmTv9SoqORjbdlk5LgpWgi/UOGED1V7
+XwgiG/W9mR4U9s70WBCCswo9GcG/W6uqmdjyMb3lOGbcWAXH7WMaLgqXfIeTK7KK4/HsGOV1timH
+59yLGn602MnTihdsfSlEvoqq9X46Lmgxk7lq2prg2+kupYTNHAq4Sgj5nPFhJpiTt3tm7JFe3VE/
+23MPrQRYCd0EApUKPtN236YQHoA96M2kZNEzx5LH4k5E4wnJTsJdhw4Snr8PyQUQ3nqjsTzyP6Wq
+J3mtMX0f/fwZacXduT98zca0wjAefm6S139hdlqP65VNvBFuIXxZN5nQBrz5Bm0yFqXZaajh3DyA
+HmBR3NdUIR7KYndP+tiPsys6DXhyyWhBWkdKwqPrGtcKqzwyVcgKEZzfdNbwQBUdyLmPtTbFr/gi
+uMod89a2GQ+fYWVq6nTIfI/DT11lgh/ZDYnadXL77/FHZxOzyNEZiCcmmpl5fx7kLD977vHeTYuW
+l8PVP3wbI+2ksx0WckNLIOFZfsLorSa/ovc=
+-----END CERTIFICATE-----
+
+CA Disig Root R1
+================
+-----BEGIN CERTIFICATE-----
+MIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNVBAYTAlNLMRMw
+EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp
+ZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQyMDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sx
+EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp
+c2lnIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy
+3QRkD2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/oOI7bm+V8
+u8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3AfQ+lekLZWnDZv6fXARz2
+m6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJeIgpFy4QxTaz+29FHuvlglzmxZcfe+5nk
+CiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8noc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTa
+YVKvJrT1cU/J19IG32PK/yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6
+vpmumwKjrckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD3AjL
+LhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE7cderVC6xkGbrPAX
+ZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkCyC2fg69naQanMVXVz0tv/wQFx1is
+XxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLdqvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNV
+HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ
+04IwDQYJKoZIhvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR
+xVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaASfX8MPWbTx9B
+LxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXoHqJPYNcHKfyyo6SdbhWSVhlM
+CrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpBemOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5Gfb
+VSUZP/3oNn6z4eGBrxEWi1CXYBmCAMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85
+YmLLW1AL14FABZyb7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKS
+ds+xDzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvkF7mGnjix
+lAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqFa3qdnom2piiZk4hA9z7N
+UaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsTQ6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJ
+a7+h89n07eLw4+1knj0vllJPgFOL
+-----END CERTIFICATE-----
+
+CA Disig Root R2
+================
+-----BEGIN CERTIFICATE-----
+MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw
+EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp
+ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx
+EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp
+c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC
+w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia
+xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7
+A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S
+GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV
+g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa
+5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE
+koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A
+Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i
+Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV
+HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u
+Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM
+tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV
+sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je
+dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8
+1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx
+mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01
+utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0
+sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg
+UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV
+7+ZtsH8tZ/3zbBt1RqPlShfppNcL
+-----END CERTIFICATE-----
+
+ACCVRAIZ1
+=========
+-----BEGIN CERTIFICATE-----
+MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB
+SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1
+MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH
+UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
+DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM
+jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0
+RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD
+aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ
+0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG
+WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7
+8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR
+5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J
+9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK
+Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw
+Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu
+Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2
+VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM
+Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA
+QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh
+AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA
+YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj
+AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA
+IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk
+aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0
+dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2
+MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI
+hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E
+R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN
+YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49
+nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ
+TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3
+sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h
+I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg
+Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd
+3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p
+EfbRD0tVNEYqi4Y7
+-----END CERTIFICATE-----
+
+TWCA Global Root CA
+===================
+-----BEGIN CERTIFICATE-----
+MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT
+CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD
+QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK
+EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg
+Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C
+nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV
+r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR
+Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV
+tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W
+KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99
+sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p
+yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn
+kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI
+zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC
+AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g
+cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn
+LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M
+8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg
+/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg
+lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP
+A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m
+i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8
+EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3
+zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0=
+-----END CERTIFICATE-----
+
+TeliaSonera Root CA v1
+======================
+-----BEGIN CERTIFICATE-----
+MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE
+CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4
+MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW
+VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+
+6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA
+3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k
+B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn
+Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH
+oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3
+F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ
+oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7
+gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc
+TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB
+AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW
+DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm
+zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx
+0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW
+pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV
+G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc
+c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT
+JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2
+qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6
+Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems
+WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY=
+-----END CERTIFICATE-----
+
+E-Tugra Certification Authority
+===============================
+-----BEGIN CERTIFICATE-----
+MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAlRSMQ8w
+DQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamls
+ZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN
+ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMw
+NTEyMDk0OFoXDTIzMDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmEx
+QDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxl
+cmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQD
+DB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
+MIICCgKCAgEA4vU/kwVRHoViVF56C/UYB4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vd
+hQd2h8y/L5VMzH2nPbxHD5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5K
+CKpbknSFQ9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEoq1+g
+ElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3Dk14opz8n8Y4e0ypQ
+BaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcHfC425lAcP9tDJMW/hkd5s3kc91r0
+E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsutdEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gz
+rt48Ue7LE3wBf4QOXVGUnhMMti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAq
+jqFGOjGY5RH8zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn
+rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUXU8u3Zg5mTPj5
+dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6Jyr+zE7S6E5UMA8GA1UdEwEB
+/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEG
+MA0GCSqGSIb3DQEBCwUAA4ICAQAFNzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAK
+kEh47U6YA5n+KGCRHTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jO
+XKqYGwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c77NCR807
+VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3+GbHeJAAFS6LrVE1Uweo
+a2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WKvJUawSg5TB9D0pH0clmKuVb8P7Sd2nCc
+dlqMQ1DujjByTd//SffGqWfZbawCEeI6FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEV
+KV0jq9BgoRJP3vQXzTLlyb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gT
+Dx4JnW2PAJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpDy4Q0
+8ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8dNL/+I5c30jn6PQ0G
+C7TbO6Orb1wdtn7os4I07QZcJA==
+-----END CERTIFICATE-----
+
+T-TeleSec GlobalRoot Class 2
+============================
+-----BEGIN CERTIFICATE-----
+MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM
+IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU
+cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx
+MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz
+dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD
+ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ
+SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F
+vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970
+2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV
+WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA
+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy
+YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4
+r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf
+vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR
+3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN
+9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg==
+-----END CERTIFICATE-----
+
+Atos TrustedRoot 2011
+=====================
+-----BEGIN CERTIFICATE-----
+MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU
+cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4
+MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG
+A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV
+hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr
+54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+
+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320
+HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR
+z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R
+l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ
+bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB
+CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h
+k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh
+TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9
+61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G
+3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed
+-----END CERTIFICATE-----
+
+QuoVadis Root CA 1 G3
+=====================
+-----BEGIN CERTIFICATE-----
+MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDELMAkG
+A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv
+b3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJN
+MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEg
+RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakE
+PBtVwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWerNrwU8lm
+PNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF34168Xfuw6cwI2H44g4hWf6
+Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoIN
+ofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXpUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/l
+g6AnhF4EwfWQvTA9xO+oabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV
+7qJZjqlc3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/GKubX
+9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1f
+iyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KOTk0k+17kBL5yG6YnLUlamXrXXAkg
+t3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOtzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
+AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZI
+hvcNAQELBQADggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC
+MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2cDMT/uFPpiN3
+GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUNqXsCHKnQO18LwIE6PWThv6ct
+Tr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP
++V04ikkwj+3x6xn0dxoxGE1nVGwvb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh
+3jRJjehZrJ3ydlo28hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fa
+wx/kNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNjZgKAvQU6
+O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhpq1467HxpvMc7hU6eFbm0
+FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFtnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOV
+hMJKzRwuJIczYOXD
+-----END CERTIFICATE-----
+
+QuoVadis Root CA 2 G3
+=====================
+-----BEGIN CERTIFICATE-----
+MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQELBQAwSDELMAkG
+A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv
+b3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJN
+MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIg
+RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFh
+ZiFfqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMWn4rjyduY
+NM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ymc5GQYaYDFCDy54ejiK2t
+oIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+o
+MiwMzAkd056OXbxMmO7FGmh77FOm6RQ1o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+l
+V0POKa2Mq1W/xPtbAd0jIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZo
+L1NesNKqIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz8eQQ
+sSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43ehvNURG3YBZwjgQQvD
+6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l7ZizlWNof/k19N+IxWA1ksB8aRxh
+lRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALGcC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
+AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZI
+hvcNAQELBQADggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66
+AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RCroijQ1h5fq7K
+pVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9
+x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgz
+dWqTHBLmYF5vHX/JHyPLhGGfHoJE+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6X
+U/IyAgkwo1jwDQHVcsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+Nw
+mNtddbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNgKCLjsZWD
+zYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeMHVOyToV7BjjHLPj4sHKN
+JeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4WSr2Rz0ZiC3oheGe7IUIarFsNMkd7Egr
+O3jtZsSOeWmD3n+M
+-----END CERTIFICATE-----
+
+QuoVadis Root CA 3 G3
+=====================
+-----BEGIN CERTIFICATE-----
+MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkG
+A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv
+b3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJN
+MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMg
+RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286
+IxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRL
+Mon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe
+6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3
+I4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3U
+VDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f7
+5li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqi
+Md5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DM
+dyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/Yt
+rQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
+AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZI
+hvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px
+KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzS
+t/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQ
+TXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9Du
+DcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGib
+Ih6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmD
+hPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX
+0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFW
+dSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2
+PpxxVJkES/1Y+Zj0
+-----END CERTIFICATE-----
+
+DigiCert Assured ID Root G2
+===========================
+-----BEGIN CERTIFICATE-----
+MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw
+IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw
+MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
+ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH
+35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq
+bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw
+VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP
+YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn
+lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO
+w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv
+0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz
+d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW
+hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M
+jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo
+IhNzbM8m9Yop5w==
+-----END CERTIFICATE-----
+
+DigiCert Assured ID Root G3
+===========================
+-----BEGIN CERTIFICATE-----
+MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV
+UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD
+VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1
+MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ
+BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb
+RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs
+KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF
+UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy
+YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy
+1vUhZscv6pZjamVFkpUBtA==
+-----END CERTIFICATE-----
+
+DigiCert Global Root G2
+=======================
+-----BEGIN CERTIFICATE-----
+MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw
+HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx
+MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
+dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq
+hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ
+kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO
+3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV
+BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM
+UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB
+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu
+5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr
+F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U
+WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH
+QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/
+iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl
+MrY=
+-----END CERTIFICATE-----
+
+DigiCert Global Root G3
+=======================
+-----BEGIN CERTIFICATE-----
+MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV
+UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD
+VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw
+MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k
+aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C
+AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O
+YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP
+BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp
+Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y
+3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34
+VOKa5Vt8sycX
+-----END CERTIFICATE-----
+
+DigiCert Trusted Root G4
+========================
+-----BEGIN CERTIFICATE-----
+MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw
+HwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1
+MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G
+CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp
+pz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o
+k3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7Fsa
+vOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY
+QJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6
+MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtm
+mnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7
+f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFH
+dL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8
+oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud
+DwEB/wQEAwIBhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD
+ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY
+ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdNOj6PWTkiU0Tr
+yF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy
+7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iah
+ixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN
+5r5N0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb
+/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP0oUA51Aa
+5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tK
+G48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP
+82Z+
+-----END CERTIFICATE-----
+
+WoSign
+======
+-----BEGIN CERTIFICATE-----
+MIIFdjCCA16gAwIBAgIQXmjWEXGUY1BWAGjzPsnFkTANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQG
+EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxKjAoBgNVBAMTIUNlcnRpZmljYXRpb24g
+QXV0aG9yaXR5IG9mIFdvU2lnbjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgwMTAwMDFaMFUxCzAJ
+BgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEqMCgGA1UEAxMhQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkgb2YgV29TaWduMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA
+vcqNrLiRFVaXe2tcesLea9mhsMMQI/qnobLMMfo+2aYpbxY94Gv4uEBf2zmoAHqLoE1UfcIiePyO
+CbiohdfMlZdLdNiefvAA5A6JrkkoRBoQmTIPJYhTpA2zDxIIFgsDcSccf+Hb0v1naMQFXQoOXXDX
+2JegvFNBmpGN9J42Znp+VsGQX+axaCA2pIwkLCxHC1l2ZjC1vt7tj/id07sBMOby8w7gLJKA84X5
+KIq0VC6a7fd2/BVoFutKbOsuEo/Uz/4Mx1wdC34FMr5esAkqQtXJTpCzWQ27en7N1QhatH/YHGkR
++ScPewavVIMYe+HdVHpRaG53/Ma/UkpmRqGyZxq7o093oL5d//xWC0Nyd5DKnvnyOfUNqfTq1+ez
+EC8wQjchzDBwyYaYD8xYTYO7feUapTeNtqwylwA6Y3EkHp43xP901DfA4v6IRmAR3Qg/UDaruHqk
+lWJqbrDKaiFaafPz+x1wOZXzp26mgYmhiMU7ccqjUu6Du/2gd/Tkb+dC221KmYo0SLwX3OSACCK2
+8jHAPwQ+658geda4BmRkAjHXqc1S+4RFaQkAKtxVi8QGRkvASh0JWzko/amrzgD5LkhLJuYwTKVY
+yrREgk/nkR4zw7CT/xH8gdLKH3Ep3XZPkiWvHYG3Dy+MwwbMLyejSuQOmbp8HkUff6oZRZb9/D0C
+AwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFOFmzw7R
+8bNLtwYgFP6HEtX2/vs+MA0GCSqGSIb3DQEBBQUAA4ICAQCoy3JAsnbBfnv8rWTjMnvMPLZdRtP1
+LOJwXcgu2AZ9mNELIaCJWSQBnfmvCX0KI4I01fx8cpm5o9dU9OpScA7F9dY74ToJMuYhOZO9sxXq
+T2r09Ys/L3yNWC7F4TmgPsc9SnOeQHrAK2GpZ8nzJLmzbVUsWh2eJXLOC62qx1ViC777Y7NhRCOj
+y+EaDveaBk3e1CNOIZZbOVtXHS9dCF4Jef98l7VNg64N1uajeeAz0JmWAjCnPv/So0M/BVoG6kQC
+2nz4SNAzqfkHx5Xh9T71XXG68pWpdIhhWeO/yloTunK0jF02h+mmxTwTv97QRCbut+wucPrXnbes
+5cVAWubXbHssw1abR80LzvobtCHXt2a49CUwi1wNuepnsvRtrtWhnk/Yn+knArAdBtaP4/tIEp9/
+EaEQPkxROpaw0RPxx9gmrjrKkcRpnd8BKWRRb2jaFOwIQZeQjdCygPLPwj2/kWjFgGcexGATVdVh
+mVd8upUPYUk6ynW8yQqTP2cOEvIo4jEbwFcW3wh8GcF+Dx+FHgo2fFt+J7x6v+Db9NpSvd4MVHAx
+kUOVyLzwPt0JfjBkUO1/AaQzZ01oT74V77D2AhGiGxMlOtzCWfHjXEa7ZywCRuoeSKbmW9m1vFGi
+kpbbqsY3Iqb+zCB0oy2pLmvLwIIRIbWTee5Ehr7XHuQe+w==
+-----END CERTIFICATE-----
+
+WoSign China
+============
+-----BEGIN CERTIFICATE-----
+MIIFWDCCA0CgAwIBAgIQUHBrzdgT/BtOOzNy0hFIjTANBgkqhkiG9w0BAQsFADBGMQswCQYDVQQG
+EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNVBAMMEkNBIOayg+mAmuagueiv
+geS5pjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgwMTAwMDFaMEYxCzAJBgNVBAYTAkNOMRowGAYD
+VQQKExFXb1NpZ24gQ0EgTGltaXRlZDEbMBkGA1UEAwwSQ0Eg5rKD6YCa5qC56K+B5LmmMIICIjAN
+BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0EkhHiX8h8EqwqzbdoYGTufQdDTc7WU1/FDWiD+k
+8H/rD195L4mx/bxjWDeTmzj4t1up+thxx7S8gJeNbEvxUNUqKaqoGXqW5pWOdO2XCld19AXbbQs5
+uQF/qvbW2mzmBeCkTVL829B0txGMe41P/4eDrv8FAxNXUDf+jJZSEExfv5RxadmWPgxDT74wwJ85
+dE8GRV2j1lY5aAfMh09Qd5Nx2UQIsYo06Yms25tO4dnkUkWMLhQfkWsZHWgpLFbE4h4TV2TwYeO5
+Ed+w4VegG63XX9Gv2ystP9Bojg/qnw+LNVgbExz03jWhCl3W6t8Sb8D7aQdGctyB9gQjF+BNdeFy
+b7Ao65vh4YOhn0pdr8yb+gIgthhid5E7o9Vlrdx8kHccREGkSovrlXLp9glk3Kgtn3R46MGiCWOc
+76DbT52VqyBPt7D3h1ymoOQ3OMdc4zUPLK2jgKLsLl3Az+2LBcLmc272idX10kaO6m1jGx6KyX2m
++Jzr5dVjhU1zZmkR/sgO9MHHZklTfuQZa/HpelmjbX7FF+Ynxu8b22/8DU0GAbQOXDBGVWCvOGU6
+yke6rCzMRh+yRpY/8+0mBe53oWprfi1tWFxK1I5nuPHa1UaKJ/kR8slC/k7e3x9cxKSGhxYzoacX
+GKUN5AXlK8IrC6KVkLn9YDxOiT7nnO4fuwECAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1Ud
+EwEB/wQFMAMBAf8wHQYDVR0OBBYEFOBNv9ybQV0T6GTwp+kVpOGBwboxMA0GCSqGSIb3DQEBCwUA
+A4ICAQBqinA4WbbaixjIvirTthnVZil6Xc1bL3McJk6jfW+rtylNpumlEYOnOXOvEESS5iVdT2H6
+yAa+Tkvv/vMx/sZ8cApBWNromUuWyXi8mHwCKe0JgOYKOoICKuLJL8hWGSbueBwj/feTZU7n85iY
+r83d2Z5AiDEoOqsuC7CsDCT6eiaY8xJhEPRdF/d+4niXVOKM6Cm6jBAyvd0zaziGfjk9DgNyp115
+j0WKWa5bIW4xRtVZjc8VX90xJc/bYNaBRHIpAlf2ltTW/+op2znFuCyKGo3Oy+dCMYYFaA6eFN0A
+kLppRQjbbpCBhqcqBT/mhDn4t/lXX0ykeVoQDF7Va/81XwVRHmyjdanPUIPTfPRm94KNPQx96N97
+qA4bLJyuQHCH2u2nFoJavjVsIE4iYdm8UXrNemHcSxH5/mc0zy4EZmFcV5cjjPOGG0jfKq+nwf/Y
+jj4Du9gqsPoUJbJRa4ZDhS4HIxaAjUz7tGM7zMN07RujHv41D198HRaG9Q7DlfEvr10lO1Hm13ZB
+ONFLAzkopR6RctR9q5czxNM+4Gm2KHmgCY0c0f9BckgG/Jou5yD5m6Leie2uPAmvylezkolwQOQv
+T8Jwg0DXJCxr5wkf09XHwQj02w47HAcLQxGEIYbpgNR12KvxAmLBsX5VYc8T1yaw15zLKYs4SgsO
+kI26oQ==
+-----END CERTIFICATE-----
+
+COMODO RSA Certification Authority
+==================================
+-----BEGIN CERTIFICATE-----
+MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCBhTELMAkGA1UE
+BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG
+A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlv
+biBBdXRob3JpdHkwHhcNMTAwMTE5MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMC
+R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE
+ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBB
+dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR6FSS0gpWsawNJN3Fz0Rn
+dJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8Xpz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZ
+FGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+
+5eNu/Nio5JIk2kNrYrhV/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pG
+x8cgoLEfZd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z+pUX
+2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7wqP/0uK3pN/u6uPQL
+OvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZahSL0896+1DSJMwBGB7FY79tOi4lu3
+sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVICu9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+C
+GCe01a60y1Dma/RMhnEw6abfFobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5
+WdYgGq/yapiqcrxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E
+FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w
+DQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvlwFTPoCWOAvn9sKIN9SCYPBMt
+rFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+
+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSg
+tZx8jb8uk2IntznaFxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwW
+sRqZCuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiKboHGhfKp
+pC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmckejkk9u+UJueBPSZI9FoJA
+zMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yLS0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHq
+ZJx64SIDqZxubw5lT2yHh17zbqD5daWbQOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk52
+7RH89elWsn2/x20Kk4yl0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7I
+LaZRfyHBNVOFBkpdn627G190
+-----END CERTIFICATE-----
+
+USERTrust RSA Certification Authority
+=====================================
+-----BEGIN CERTIFICATE-----
+MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCBiDELMAkGA1UE
+BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK
+ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UE
+BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK
+ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCAEmUXNg7D2wiz
+0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2j
+Y0K2dvKpOyuR+OJv0OwWIJAJPuLodMkYtJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFn
+RghRy4YUVD+8M/5+bJz/Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O
++T23LLb2VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT79uq
+/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6c0Plfg6lZrEpfDKE
+Y1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmTYo61Zs8liM2EuLE/pDkP2QKe6xJM
+lXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97lc6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8
+yexDJtC/QV9AqURE9JnnV4eeUB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+
+eLf8ZxXhyVeEHg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd
+BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
+MAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPFUp/L+M+ZBn8b2kMVn54CVVeW
+FPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KOVWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ
+7l8wXEskEVX/JJpuXior7gtNn3/3ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQ
+Eg9zKC7F4iRO/Fjs8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM
+8WcRiQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYzeSf7dNXGi
+FSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZXHlKYC6SQK5MNyosycdi
+yA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9c
+J2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRBVXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGw
+sAvgnEzDHNb842m1R0aBL6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gx
+Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9
+-----END CERTIFICATE-----
+
+USERTrust ECC Certification Authority
+=====================================
+-----BEGIN CERTIFICATE-----
+MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC
+VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
+aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv
+biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC
+VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
+aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv
+biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2
+0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez
+nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV
+HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB
+HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu
+9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg=
+-----END CERTIFICATE-----
+
+GlobalSign ECC Root CA - R4
+===========================
+-----BEGIN CERTIFICATE-----
+MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEkMCIGA1UECxMb
+R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
+EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb
+R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
+EwpHbG9iYWxTaWduMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprl
+OQcJFspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAwDgYDVR0P
+AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61FuOJAf/sKbvu+M8k8o4TV
+MAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGXkPoUVy0D7O48027KqGx2vKLeuwIgJ6iF
+JzWbVsaj8kfSt24bAgAXqmemFZHe+pTsewv4n4Q=
+-----END CERTIFICATE-----
+
+GlobalSign ECC Root CA - R5
+===========================
+-----BEGIN CERTIFICATE-----
+MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb
+R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
+EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb
+R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
+EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6
+SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS
+h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd
+BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx
+uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7
+yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3
+-----END CERTIFICATE-----
+
+Staat der Nederlanden Root CA - G3
+==================================
+-----BEGIN CERTIFICATE-----
+MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE
+CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g
+Um9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloXDTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMC
+TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l
+ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4y
+olQPcPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WWIkYFsO2t
+x1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqXxz8ecAgwoNzFs21v0IJy
+EavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFyKJLZWyNtZrVtB0LrpjPOktvA9mxjeM3K
+Tj215VKb8b475lRgsGYeCasH/lSJEULR9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUur
+mkVLoR9BvUhTFXFkC4az5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU5
+1nus6+N86U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7Ngzp
+07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHPbMk7ccHViLVlvMDo
+FxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXtBznaqB16nzaeErAMZRKQFWDZJkBE
+41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTtXUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMB
+AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleu
+yjWcLhL75LpdINyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD
+U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwpLiniyMMB8jPq
+KqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8Ipf3YF3qKS9Ysr1YvY2WTxB1
+v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixpgZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA
+8KCWAg8zxXHzniN9lLf9OtMJgwYh/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b
+8KKaa8MFSu1BYBQw0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0r
+mj1AfsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq4BZ+Extq
+1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR1VmiiXTTn74eS9fGbbeI
+JG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/QFH1T/U67cjF68IeHRaVesd+QnGTbksV
+tzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM94B7IWcnMFk=
+-----END CERTIFICATE-----
+
+Staat der Nederlanden EV Root CA
+================================
+-----BEGIN CERTIFICATE-----
+MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJOTDEeMBwGA1UE
+CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFhdCBkZXIgTmVkZXJsYW5kZW4g
+RVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0yMjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5M
+MR4wHAYDVQQKDBVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRl
+cmxhbmRlbiBFViBSb290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkk
+SzrSM4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nCUiY4iKTW
+O0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3dZ//BYY1jTw+bbRcwJu+r
+0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46prfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8
+Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13lpJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gV
+XJrm0w912fxBmJc+qiXbj5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr
+08C+eKxCKFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS/ZbV
+0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0XcgOPvZuM5l5Tnrmd
+74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH1vI4gnPah1vlPNOePqc7nvQDs/nx
+fRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrPpx9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNC
+MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwa
+ivsnuL8wbqg7MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI
+eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u2dfOWBfoqSmu
+c0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHSv4ilf0X8rLiltTMMgsT7B/Zq
+5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTCwPTxGfARKbalGAKb12NMcIxHowNDXLldRqAN
+b/9Zjr7dn3LDWyvfjFvO5QxGbJKyCqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tN
+f1zuacpzEPuKqf2evTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi
+5Dp6Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIaGl6I6lD4
+WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeLeG9QgkRQP2YGiqtDhFZK
+DyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGy
+eUN51q1veieQA6TqJIc/2b3Z6fJfUEkc7uzXLg==
+-----END CERTIFICATE-----
+
+IdenTrust Commercial Root CA 1
+==============================
+-----BEGIN CERTIFICATE-----
+MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG
+EwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBS
+b290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQwMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzES
+MBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENB
+IDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ld
+hNlT3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU+ehcCuz/
+mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gpS0l4PJNgiCL8mdo2yMKi
+1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1bVoE/c40yiTcdCMbXTMTEl3EASX2MN0C
+XZ/g1Ue9tOsbobtJSdifWwLziuQkkORiT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl
+3ZBWzvurpWCdxJ35UrCLvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzy
+NeVJSQjKVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZKdHzV
+WYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHTc+XvvqDtMwt0viAg
+xGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hvl7yTmvmcEpB4eoCHFddydJxVdHix
+uuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5NiGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC
+AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZI
+hvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH
+6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwtLRvM7Kqas6pg
+ghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93nAbowacYXVKV7cndJZ5t+qnt
+ozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmV
+YjzlVYA211QC//G5Xc7UI2/YRYRKW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUX
+feu+h1sXIFRRk0pTAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/ro
+kTLql1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG4iZZRHUe
+2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZmUlO+KWA2yUPHGNiiskz
+Z2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7R
+cGzM7vRX+Bi6hG6H
+-----END CERTIFICATE-----
+
+IdenTrust Public Sector Root CA 1
+=================================
+-----BEGIN CERTIFICATE-----
+MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQG
+EwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3Rv
+ciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcNMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJV
+UzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBS
+b290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTy
+P4o7ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGyRBb06tD6
+Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlSbdsHyo+1W/CD80/HLaXI
+rcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF/YTLNiCBWS2ab21ISGHKTN9T0a9SvESf
+qy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoS
+mJxZZoY+rfGwyj4GD3vwEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFn
+ol57plzy9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9VGxyh
+LrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ2fjXctscvG29ZV/v
+iDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsVWaFHVCkugyhfHMKiq3IXAAaOReyL
+4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gDW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8B
+Af8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMw
+DQYJKoZIhvcNAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj
+t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHVDRDtfULAj+7A
+mgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9TaDKQGXSc3z1i9kKlT/YPyNt
+GtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8GlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFt
+m6/n6J91eEyrRjuazr8FGF1NFTwWmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMx
+NRF4eKLg6TCMf4DfWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4
+Mhn5+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJtshquDDI
+ajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhAGaQdp/lLQzfcaFpPz+vC
+ZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ
+3Wl9af0AVqW3rLatt8o+Ae+c
+-----END CERTIFICATE-----
+
+Entrust Root Certification Authority - G2
+=========================================
+-----BEGIN CERTIFICATE-----
+MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV
+BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy
+bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug
+b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw
+HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT
+DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx
+OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s
+eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi
+MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP
+/vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz
+HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU
+s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y
+TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx
+AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6
+0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z
+iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ
+Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi
+nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+
+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO
+e4pIb4tF9g==
+-----END CERTIFICATE-----
+
+Entrust Root Certification Authority - EC1
+==========================================
+-----BEGIN CERTIFICATE-----
+MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx
+FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn
+YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl
+ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5
+IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw
+FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs
+LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg
+dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt
+IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy
+AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef
+9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
+FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h
+vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8
+kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G
+-----END CERTIFICATE-----
+
+CFCA EV ROOT
+============
+-----BEGIN CERTIFICATE-----
+MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJDTjEwMC4GA1UE
+CgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNB
+IEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkxMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEw
+MC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQD
+DAxDRkNBIEVWIFJPT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnV
+BU03sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpLTIpTUnrD
+7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5/ZOkVIBMUtRSqy5J35DN
+uF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp7hZZLDRJGqgG16iI0gNyejLi6mhNbiyW
+ZXvKWfry4t3uMCz7zEasxGPrb382KzRzEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7
+xzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9f
+py25IGvPa931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqotaK8K
+gWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNgTnYGmE69g60dWIol
+hdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfVPKPtl8MeNPo4+QgO48BdK4PRVmrJ
+tqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hvcWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAf
+BgNVHSMEGDAWgBTj/i39KNALtbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB
+/wQEAwIBBjAdBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB
+ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObTej/tUxPQ4i9q
+ecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdLjOztUmCypAbqTuv0axn96/Ua
+4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBSESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sG
+E5uPhnEFtC+NiWYzKXZUmhH4J/qyP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfX
+BDrDMlI1Dlb4pd19xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjn
+aH9dCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN5mydLIhy
+PDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX
+kbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C
+ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su
+-----END CERTIFICATE-----
+
+TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H5
+====================================================
+-----BEGIN CERTIFICATE-----
+MIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UEBhMCVFIxDzAN
+BgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp
+bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4xQjBABgNVBAMMOVTDnFJLVFJVU1Qg
+RWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSBINTAeFw0xMzA0MzAw
+ODA3MDFaFw0yMzA0MjgwODA3MDFaMIGxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMU0w
+SwYDVQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnE
+n2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBFbGVrdHJvbmlrIFNlcnRp
+ZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEApCUZ4WWe60ghUEoI5RHwWrom/4NZzkQqL/7hzmAD/I0Dpe3/a6i6zDQGn1k19uwsu537
+jVJp45wnEFPzpALFp/kRGml1bsMdi9GYjZOHp3GXDSHHmflS0yxjXVW86B8BSLlg/kJK9siArs1m
+ep5Fimh34khon6La8eHBEJ/rPCmBp+EyCNSgBbGM+42WAA4+Jd9ThiI7/PS98wl+d+yG6w8z5UNP
+9FR1bSmZLmZaQ9/LXMrI5Tjxfjs1nQ/0xVqhzPMggCTTV+wVunUlm+hkS7M0hO8EuPbJbKoCPrZV
+4jI3X/xml1/N1p7HIL9Nxqw/dV8c7TKcfGkAaZHjIxhT6QIDAQABo0IwQDAdBgNVHQ4EFgQUVpkH
+HtOsDGlktAxQR95DLL4gwPswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI
+hvcNAQELBQADggEBAJ5FdnsXSDLyOIspve6WSk6BGLFRRyDN0GSxDsnZAdkJzsiZ3GglE9Rc8qPo
+BP5yCccLqh0lVX6Wmle3usURehnmp349hQ71+S4pL+f5bFgWV1Al9j4uPqrtd3GqqpmWRgqujuwq
+URawXs3qZwQcWDD1YIq9pr1N5Za0/EKJAWv2cMhQOQwt1WbZyNKzMrcbGW3LM/nfpeYVhDfwwvJl
+lpKQd/Ct9JDpEXjXk4nAPQu6KfTomZ1yju2dL+6SfaHx/126M2CFYv4HAqGEVka+lgqaE9chTLd8
+B59OTj+RdPsnnRHM3eaxynFNExc5JsUpISuTKWqW+qtB4Uu2NQvAmxU=
+-----END CERTIFICATE-----
+
+TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H6
+====================================================
+-----BEGIN CERTIFICATE-----
+MIIEJjCCAw6gAwIBAgIGfaHyZeyKMA0GCSqGSIb3DQEBCwUAMIGxMQswCQYDVQQGEwJUUjEPMA0G
+A1UEBwwGQW5rYXJhMU0wSwYDVQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls
+acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBF
+bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg2MB4XDTEzMTIxODA5
+MDQxMFoXDTIzMTIxNjA5MDQxMFowgbExCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExTTBL
+BgNVBAoMRFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBCaWxpxZ9pbSBHw7x2ZW5sacSf
+aSBIaXptZXRsZXJpIEEuxZ4uMUIwQAYDVQQDDDlUw5xSS1RSVVNUIEVsZWt0cm9uaWsgU2VydGlm
+aWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLEgSDYwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
+AoIBAQCdsGjW6L0UlqMACprx9MfMkU1xeHe59yEmFXNRFpQJRwXiM/VomjX/3EsvMsew7eKC5W/a
+2uqsxgbPJQ1BgfbBOCK9+bGlprMBvD9QFyv26WZV1DOzXPhDIHiTVRZwGTLmiddk671IUP320EED
+wnS3/faAz1vFq6TWlRKb55cTMgPp1KtDWxbtMyJkKbbSk60vbNg9tvYdDjTu0n2pVQ8g9P0pu5Fb
+HH3GQjhtQiht1AH7zYiXSX6484P4tZgvsycLSF5W506jM7NE1qXyGJTtHB6plVxiSvgNZ1GpryHV
++DKdeboaX+UEVU0TRv/yz3THGmNtwx8XEsMeED5gCLMxAgMBAAGjQjBAMB0GA1UdDgQWBBTdVRcT
+9qzoSCHK77Wv0QAy7Z6MtTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG
+9w0BAQsFAAOCAQEAb1gNl0OqFlQ+v6nfkkU/hQu7VtMMUszIv3ZnXuaqs6fvuay0EBQNdH49ba3R
+fdCaqaXKGDsCQC4qnFAUi/5XfldcEQlLNkVS9z2sFP1E34uXI9TDwe7UU5X+LEr+DXCqu4svLcsy
+o4LyVN/Y8t3XSHLuSqMplsNEzm61kod2pLv0kmzOLBQJZo6NrRa1xxsJYTvjIKIDgI6tflEATseW
+hvtDmHd9KMeP2Cpu54Rvl0EpABZeTeIT6lnAY2c6RPuY/ATTMHKm9ocJV612ph1jmv3XZch4gyt1
+O6VbuA1df74jrlZVlFjvH4GMKrLN5ptjnhi85WsGtAuYSyher4hYyw==
+-----END CERTIFICATE-----
+
+Certinomis - Root CA
+====================
+-----BEGIN CERTIFICATE-----
+MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjETMBEGA1UEChMK
+Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAbBgNVBAMTFENlcnRpbm9taXMg
+LSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMzMTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIx
+EzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRD
+ZXJ0aW5vbWlzIC0gUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQos
+P5L2fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJflLieY6pOo
+d5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQVWZUKxkd8aRi5pwP5ynap
+z8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDFTKWrteoB4owuZH9kb/2jJZOLyKIOSY00
+8B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09x
+RLWtwHkziOC/7aOgFLScCbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE
+6OXWk6RiwsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJwx3t
+FvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SGm/lg0h9tkQPTYKbV
+PZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4F2iw4lNVYC2vPsKD2NkJK/DAZNuH
+i5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZngWVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGj
+YzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I
+6tNxIqSSaHh02TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF
+AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/0KGRHCwPT5iV
+WVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWwF6YSjNRieOpWauwK0kDDPAUw
+Pk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZSg081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAX
+lCOotQqSD7J6wWAsOMwaplv/8gzjqh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJ
+y29SWwNyhlCVCNSNh4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9
+Iff/ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8Vbtaw5Bng
+DwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwjY/M50n92Uaf0yKHxDHYi
+I0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nM
+cyrDflOR1m749fPH0FFNjkulW+YZFzvWgQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVr
+hkIGuUE=
+-----END CERTIFICATE-----
+
+OISTE WISeKey Global Root GB CA
+===============================
+-----BEGIN CERTIFICATE-----
+MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG
+EwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl
+ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw
+MzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD
+VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds
+b2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX
+scriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP
+rby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk
+9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o
+Qnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg
+GUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB
+/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI
+hvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD
+dHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0
+VQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui
+HZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic
+Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM=
+-----END CERTIFICATE-----
+
+Certification Authority of WoSign G2
+====================================
+-----BEGIN CERTIFICATE-----
+MIIDfDCCAmSgAwIBAgIQayXaioidfLwPBbOxemFFRDANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQG
+EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxLTArBgNVBAMTJENlcnRpZmljYXRpb24g
+QXV0aG9yaXR5IG9mIFdvU2lnbiBHMjAeFw0xNDExMDgwMDU4NThaFw00NDExMDgwMDU4NThaMFgx
+CzAJBgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEtMCsGA1UEAxMkQ2VydGlm
+aWNhdGlvbiBBdXRob3JpdHkgb2YgV29TaWduIEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEAvsXEoCKASU+/2YcRxlPhuw+9YH+v9oIOH9ywjj2X4FA8jzrvZjtFB5sg+OPXJYY1kBai
+XW8wGQiHC38Gsp1ij96vkqVg1CuAmlI/9ZqD6TRay9nVYlzmDuDfBpgOgHzKtB0TiGsOqCR3A9Du
+W/PKaZE1OVbFbeP3PU9ekzgkyhjpJMuSA93MHD0JcOQg5PGurLtzaaNjOg9FD6FKmsLRY6zLEPg9
+5k4ot+vElbGs/V6r+kHLXZ1L3PR8du9nfwB6jdKgGlxNIuG12t12s9R23164i5jIFFTMaxeSt+BK
+v0mUYQs4kI9dJGwlezt52eJ+na2fmKEG/HgUYFf47oB3sQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC
+AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU+mCp62XF3RYUCE4MD42b4Pdkr2cwDQYJKoZI
+hvcNAQELBQADggEBAFfDejaCnI2Y4qtAqkePx6db7XznPWZaOzG73/MWM5H8fHulwqZm46qwtyeY
+P0nXYGdnPzZPSsvxFPpahygc7Y9BMsaV+X3avXtbwrAh449G3CE4Q3RM+zD4F3LBMvzIkRfEzFg3
+TgvMWvchNSiDbGAtROtSjFA9tWwS1/oJu2yySrHFieT801LYYRf+epSEj3m2M1m6D8QL4nCgS3gu
++sif/a+RZQp4OBXllxcU3fngLDT4ONCEIgDAFFEYKwLcMFrw6AF8NTojrwjkr6qOKEJJLvD1mTS+
+7Q9LGOHSJDy7XUe3IfKN0QqZjuNuPq1w4I+5ysxugTH2e5x6eeRncRg=
+-----END CERTIFICATE-----
+
+CA WoSign ECC Root
+==================
+-----BEGIN CERTIFICATE-----
+MIICCTCCAY+gAwIBAgIQaEpYcIBr8I8C+vbe6LCQkDAKBggqhkjOPQQDAzBGMQswCQYDVQQGEwJD
+TjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNVBAMTEkNBIFdvU2lnbiBFQ0MgUm9v
+dDAeFw0xNDExMDgwMDU4NThaFw00NDExMDgwMDU4NThaMEYxCzAJBgNVBAYTAkNOMRowGAYDVQQK
+ExFXb1NpZ24gQ0EgTGltaXRlZDEbMBkGA1UEAxMSQ0EgV29TaWduIEVDQyBSb290MHYwEAYHKoZI
+zj0CAQYFK4EEACIDYgAE4f2OuEMkq5Z7hcK6C62N4DrjJLnSsb6IOsq/Srj57ywvr1FQPEd1bPiU
+t5v8KB7FVMxjnRZLU8HnIKvNrCXSf4/CwVqCXjCLelTOA7WRf6qU0NGKSMyCBSah1VES1ns2o0Iw
+QDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUqv3VWqP2h4syhf3R
+MluARZPzA7gwCgYIKoZIzj0EAwMDaAAwZQIxAOSkhLCB1T2wdKyUpOgOPQB0TKGXa/kNUTyh2Tv0
+Daupn75OcsqF1NnstTJFGG+rrQIwfcf3aWMvoeGY7xMQ0Xk/0f7qO3/eVvSQsRUR2LIiFdAvwyYu
+a/GRspBl9JrmkO5K
+-----END CERTIFICATE-----
+
+SZAFIR ROOT CA2
+===============
+-----BEGIN CERTIFICATE-----
+MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQELBQAwUTELMAkG
+A1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4xGDAWBgNV
+BAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkwNzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJ
+BgNVBAYTAlBMMSgwJgYDVQQKDB9LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYD
+VQQDDA9TWkFGSVIgUk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5Q
+qEvNQLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT3PSQ1hNK
+DJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw3gAeqDRHu5rr/gsUvTaE
+2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr63fE9biCloBK0TXC5ztdyO4mTp4CEHCdJ
+ckm1/zuVnsHMyAHs6A6KCpbns6aH5db5BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwi
+ieDhZNRnvDF5YTy7ykHNXGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P
+AQH/BAQDAgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsFAAOC
+AQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw8PRBEew/R40/cof5
+O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOGnXkZ7/e7DDWQw4rtTw/1zBLZpD67
+oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCPoky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul
+4+vJhaAlIDf7js4MNIThPIGyd05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6
++/NNIxuZMzSgLvWpCz/UXeHPhJ/iGcJfitYgHuNztw==
+-----END CERTIFICATE-----
+
+Certum Trusted Network CA 2
+===========================
+-----BEGIN CERTIFICATE-----
+MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCBgDELMAkGA1UE
+BhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1
+bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29y
+ayBDQSAyMCIYDzIwMTExMDA2MDgzOTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQ
+TDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENl
+cnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENB
+IDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWADGSdhhuWZGc/IjoedQF9
+7/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+o
+CgCXhVqqndwpyeI1B+twTUrWwbNWuKFBOJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40b
+Rr5HMNUuctHFY9rnY3lEfktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2p
+uTRZCr+ESv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1mo130
+GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02isx7QBlrd9pPPV3WZ
+9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOWOZV7bIBaTxNyxtd9KXpEulKkKtVB
+Rgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgezTv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pye
+hizKV/Ma5ciSixqClnrDvFASadgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vM
+BhBgu4M1t15n3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
+AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZI
+hvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQF/xlhMcQSZDe28cmk4gmb3DW
+Al45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTfCVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuA
+L55MYIR4PSFk1vtBHxgP58l1cb29XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMo
+clm2q8KMZiYcdywmdjWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tM
+pkT/WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jbAoJnwTnb
+w3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksqP/ujmv5zMnHCnsZy4Ypo
+J/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Kob7a6bINDd82Kkhehnlt4Fj1F4jNy3eFm
+ypnTycUm/Q1oBEauttmbjL4ZvrHG8hnjXALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLX
+is7VmFxWlgPF7ncGNf/P5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7
+zAYspsbiDrW5viSP
+-----END CERTIFICATE-----
+
+Hellenic Academic and Research Institutions RootCA 2015
+=======================================================
+-----BEGIN CERTIFICATE-----
+MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcT
+BkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0
+aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl
+YXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAx
+MTIxWjCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMg
+QWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNV
+BAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIw
+MTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDC+Kk/G4n8PDwEXT2QNrCROnk8Zlrv
+bTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+eh
+iGsxr/CL0BgzuNtFajT0AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+
+6PAQZe104S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06CojXd
+FPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV9Cz82XBST3i4vTwr
+i5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrDgfgXy5I2XdGj2HUb4Ysn6npIQf1F
+GQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2
+fu/Z8VFRfS0myGlZYeCsargqNhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9mu
+iNX6hME6wGkoLfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc
+Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
+AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVdctA4GGqd83EkVAswDQYJKoZI
+hvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0IXtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+
+D1hYc2Ryx+hFjtyp8iY/xnmMsVMIM4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrM
+d/K4kPFox/la/vot9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+y
+d+2VZ5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/eaj8GsGsVn
+82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnhX9izjFk0WaSrT2y7Hxjb
+davYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQl033DlZdwJVqwjbDG2jJ9SrcR5q+ss7F
+Jej6A7na+RZukYT1HCjI/CbM1xyQVqdfbzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVt
+J94Cj8rDtSvK6evIIVM4pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGa
+JI7ZjnHKe7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0vm9q
+p/UsQu0yrbYhnr68
+-----END CERTIFICATE-----
+
+Hellenic Academic and Research Institutions ECC RootCA 2015
+===========================================================
+-----BEGIN CERTIFICATE-----
+MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0
+aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u
+cyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj
+aCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEw
+MzcxMlowgaoxCzAJBgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmlj
+IEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUQwQgYD
+VQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290
+Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKgQehLgoRc4vgxEZmGZE4JJS+dQS8KrjVP
+dJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJajq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoK
+Vlp8aQuqgAkkbH7BRqNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O
+BBYEFLQiC4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaeplSTA
+GiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7SofTUwJCA3sS61kFyjn
+dc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR
+-----END CERTIFICATE-----
+
+Certplus Root CA G1
+===================
+-----BEGIN CERTIFICATE-----
+MIIFazCCA1OgAwIBAgISESBVg+QtPlRWhS2DN7cs3EYRMA0GCSqGSIb3DQEBDQUAMD4xCzAJBgNV
+BAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMTAe
+Fw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBaMD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhD
+ZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMTCCAiIwDQYJKoZIhvcNAQEBBQAD
+ggIPADCCAgoCggIBANpQh7bauKk+nWT6VjOaVj0W5QOVsjQcmm1iBdTYj+eJZJ+622SLZOZ5KmHN
+r49aiZFluVj8tANfkT8tEBXgfs+8/H9DZ6itXjYj2JizTfNDnjl8KvzsiNWI7nC9hRYt6kuJPKNx
+Qv4c/dMcLRC4hlTqQ7jbxofaqK6AJc96Jh2qkbBIb6613p7Y1/oA/caP0FG7Yn2ksYyy/yARujVj
+BYZHYEMzkPZHogNPlk2dT8Hq6pyi/jQu3rfKG3akt62f6ajUeD94/vI4CTYd0hYCyOwqaK/1jpTv
+LRN6HkJKHRUxrgwEV/xhc/MxVoYxgKDEEW4wduOU8F8ExKyHcomYxZ3MVwia9Az8fXoFOvpHgDm2
+z4QTd28n6v+WZxcIbekN1iNQMLAVdBM+5S//Ds3EC0pd8NgAM0lm66EYfFkuPSi5YXHLtaW6uOrc
+4nBvCGrch2c0798wct3zyT8j/zXhviEpIDCB5BmlIOklynMxdCm+4kLV87ImZsdo/Rmz5yCTmehd
+4F6H50boJZwKKSTUzViGUkAksnsPmBIgJPaQbEfIDbsYIC7Z/fyL8inqh3SV4EJQeIQEQWGw9CEj
+jy3LKCHyamz0GqbFFLQ3ZU+V/YDI+HLlJWvEYLF7bY5KinPOWftwenMGE9nTdDckQQoRb5fc5+R+
+ob0V8rqHDz1oihYHAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0G
+A1UdDgQWBBSowcCbkahDFXxdBie0KlHYlwuBsTAfBgNVHSMEGDAWgBSowcCbkahDFXxdBie0KlHY
+lwuBsTANBgkqhkiG9w0BAQ0FAAOCAgEAnFZvAX7RvUz1isbwJh/k4DgYzDLDKTudQSk0YcbX8ACh
+66Ryj5QXvBMsdbRX7gp8CXrc1cqh0DQT+Hern+X+2B50ioUHj3/MeXrKls3N/U/7/SMNkPX0XtPG
+YX2eEeAC7gkE2Qfdpoq3DIMku4NQkv5gdRE+2J2winq14J2by5BSS7CTKtQ+FjPlnsZlFT5kOwQ/
+2wyPX1wdaR+v8+khjPPvl/aatxm2hHSco1S1cE5j2FddUyGbQJJD+tZ3VTNPZNX70Cxqjm0lpu+F
+6ALEUz65noe8zDUa3qHpimOHZR4RKttjd5cUvpoUmRGywO6wT/gUITJDT5+rosuoD6o7BlXGEilX
+CNQ314cnrUlZp5GrRHpejXDbl85IULFzk/bwg2D5zfHhMf1bfHEhYxQUqq/F3pN+aLHsIqKqkHWe
+tUNy6mSjhEv9DKgma3GX7lZjZuhCVPnHHd/Qj1vfyDBviP4NxDMcU6ij/UgQ8uQKTuEVV/xuZDDC
+VRHc6qnNSlSsKWNEz0pAoNZoWRsz+e86i9sgktxChL8Bq4fA1SCC28a5g4VCXA9DO2pJNdWY9BW/
++mGBDAkgGNLQFwzLSABQ6XaCjGTXOqAHVcweMcDvOrRl++O/QmueD6i9a5jc2NvLi6Td11n0bt3+
+qsOR0C5CB8AMTVPNJLFMWx5R9N/pkvo=
+-----END CERTIFICATE-----
+
+Certplus Root CA G2
+===================
+-----BEGIN CERTIFICATE-----
+MIICHDCCAaKgAwIBAgISESDZkc6uo+jF5//pAq/Pc7xVMAoGCCqGSM49BAMDMD4xCzAJBgNVBAYT
+AkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMjAeFw0x
+NDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBaMD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0
+cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMjB2MBAGByqGSM49AgEGBSuBBAAiA2IA
+BM0PW1aC3/BFGtat93nwHcmsltaeTpwftEIRyoa/bfuFo8XlGVzX7qY/aWfYeOKmycTbLXku54uN
+Am8xIk0G42ByRZ0OQneezs/lf4WbGOT8zC5y0xaTTsqZY1yhBSpsBqNjMGEwDgYDVR0PAQH/BAQD
+AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMB8GA1Ud
+IwQYMBaAFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMAoGCCqGSM49BAMDA2gAMGUCMHD+sAvZ94OX7PNV
+HdTcswYO/jOYnYs5kGuUIe22113WTNchp+e/IQ8rzfcq3IUHnQIxAIYUFuXcsGXCwI4Un78kFmjl
+vPl5adytRSv3tjFzzAalU5ORGpOucGpnutee5WEaXw==
+-----END CERTIFICATE-----
+
+OpenTrust Root CA G1
+====================
+-----BEGIN CERTIFICATE-----
+MIIFbzCCA1egAwIBAgISESCzkFU5fX82bWTCp59rY45nMA0GCSqGSIb3DQEBCwUAMEAxCzAJBgNV
+BAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5UcnVzdCBSb290IENBIEcx
+MB4XDTE0MDUyNjA4NDU1MFoXDTM4MDExNTAwMDAwMFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoM
+CU9wZW5UcnVzdDEdMBsGA1UEAwwUT3BlblRydXN0IFJvb3QgQ0EgRzEwggIiMA0GCSqGSIb3DQEB
+AQUAA4ICDwAwggIKAoICAQD4eUbalsUwXopxAy1wpLuwxQjczeY1wICkES3d5oeuXT2R0odsN7fa
+Yp6bwiTXj/HbpqbfRm9RpnHLPhsxZ2L3EVs0J9V5ToybWL0iEA1cJwzdMOWo010hOHQX/uMftk87
+ay3bfWAfjH1MBcLrARYVmBSO0ZB3Ij/swjm4eTrwSSTilZHcYTSSjFR077F9jAHiOH3BX2pfJLKO
+YheteSCtqx234LSWSE9mQxAGFiQD4eCcjsZGT44ameGPuY4zbGneWK2gDqdkVBFpRGZPTBKnjix9
+xNRbxQA0MMHZmf4yzgeEtE7NCv82TWLxp2NX5Ntqp66/K7nJ5rInieV+mhxNaMbBGN4zK1FGSxyO
+9z0M+Yo0FMT7MzUj8czxKselu7Cizv5Ta01BG2Yospb6p64KTrk5M0ScdMGTHPjgniQlQ/GbI4Kq
+3ywgsNw2TgOzfALU5nsaqocTvz6hdLubDuHAk5/XpGbKuxs74zD0M1mKB3IDVedzagMxbm+WG+Oi
+n6+Sx+31QrclTDsTBM8clq8cIqPQqwWyTBIjUtz9GVsnnB47ev1CI9sjgBPwvFEVVJSmdz7QdFG9
+URQIOTfLHzSpMJ1ShC5VkLG631UAC9hWLbFJSXKAqWLXwPYYEQRVzXR7z2FwefR7LFxckvzluFqr
+TJOVoSfupb7PcSNCupt2LQIDAQABo2MwYTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
+/zAdBgNVHQ4EFgQUl0YhVyE12jZVx/PxN3DlCPaTKbYwHwYDVR0jBBgwFoAUl0YhVyE12jZVx/Px
+N3DlCPaTKbYwDQYJKoZIhvcNAQELBQADggIBAB3dAmB84DWn5ph76kTOZ0BP8pNuZtQ5iSas000E
+PLuHIT839HEl2ku6q5aCgZG27dmxpGWX4m9kWaSW7mDKHyP7Rbr/jyTwyqkxf3kfgLMtMrpkZ2Cv
+uVnN35pJ06iCsfmYlIrM4LvgBBuZYLFGZdwIorJGnkSI6pN+VxbSFXJfLkur1J1juONI5f6ELlgK
+n0Md/rcYkoZDSw6cMoYsYPXpSOqV7XAp8dUv/TW0V8/bhUiZucJvbI/NeJWsZCj9VrDDb8O+WVLh
+X4SPgPL0DTatdrOjteFkdjpY3H1PXlZs5VVZV6Xf8YpmMIzUUmI4d7S+KNfKNsSbBfD4Fdvb8e80
+nR14SohWZ25g/4/Ii+GOvUKpMwpZQhISKvqxnUOOBZuZ2mKtVzazHbYNeS2WuOvyDEsMpZTGMKcm
+GS3tTAZQMPH9WD25SxdfGbRqhFS0OE85og2WaMMolP3tLR9Ka0OWLpABEPs4poEL0L9109S5zvE/
+bw4cHjdx5RiHdRk/ULlepEU0rbDK5uUTdg8xFKmOLZTW1YVNcxVPS/KyPu1svf0OnWZzsD2097+o
+4BGkxK51CUpjAEggpsadCwmKtODmzj7HPiY46SvepghJAwSQiumPv+i2tCqjI40cHLI5kqiPAlxA
+OXXUc0ECd97N4EOH1uS6SsNsEn/+KuYj1oxx
+-----END CERTIFICATE-----
+
+OpenTrust Root CA G2
+====================
+-----BEGIN CERTIFICATE-----
+MIIFbzCCA1egAwIBAgISESChaRu/vbm9UpaPI+hIvyYRMA0GCSqGSIb3DQEBDQUAMEAxCzAJBgNV
+BAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5UcnVzdCBSb290IENBIEcy
+MB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAwMFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoM
+CU9wZW5UcnVzdDEdMBsGA1UEAwwUT3BlblRydXN0IFJvb3QgQ0EgRzIwggIiMA0GCSqGSIb3DQEB
+AQUAA4ICDwAwggIKAoICAQDMtlelM5QQgTJT32F+D3Y5z1zCU3UdSXqWON2ic2rxb95eolq5cSG+
+Ntmh/LzubKh8NBpxGuga2F8ORAbtp+Dz0mEL4DKiltE48MLaARf85KxP6O6JHnSrT78eCbY2albz
+4e6WiWYkBuTNQjpK3eCasMSCRbP+yatcfD7J6xcvDH1urqWPyKwlCm/61UWY0jUJ9gNDlP7ZvyCV
+eYCYitmJNbtRG6Q3ffyZO6v/v6wNj0OxmXsWEH4db0fEFY8ElggGQgT4hNYdvJGmQr5J1WqIP7wt
+UdGejeBSzFfdNTVY27SPJIjki9/ca1TSgSuyzpJLHB9G+h3Ykst2Z7UJmQnlrBcUVXDGPKBWCgOz
+3GIZ38i1MH/1PCZ1Eb3XG7OHngevZXHloM8apwkQHZOJZlvoPGIytbU6bumFAYueQ4xncyhZW+vj
+3CzMpSZyYhK05pyDRPZRpOLAeiRXyg6lPzq1O4vldu5w5pLeFlwoW5cZJ5L+epJUzpM5ChaHvGOz
+9bGTXOBut9Dq+WIyiET7vycotjCVXRIouZW+j1MY5aIYFuJWpLIsEPUdN6b4t/bQWVyJ98LVtZR0
+0dX+G7bw5tYee9I8y6jj9RjzIR9u701oBnstXW5DiabA+aC/gh7PU3+06yzbXfZqfUAkBXKJOAGT
+y3HCOV0GEfZvePg3DTmEJwIDAQABo2MwYTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
+/zAdBgNVHQ4EFgQUajn6QiL35okATV59M4PLuG53hq8wHwYDVR0jBBgwFoAUajn6QiL35okATV59
+M4PLuG53hq8wDQYJKoZIhvcNAQENBQADggIBAJjLq0A85TMCl38th6aP1F5Kr7ge57tx+4BkJamz
+Gj5oXScmp7oq4fBXgwpkTx4idBvpkF/wrM//T2h6OKQQbA2xx6R3gBi2oihEdqc0nXGEL8pZ0keI
+mUEiyTCYYW49qKgFbdEfwFFEVn8nNQLdXpgKQuswv42hm1GqO+qTRmTFAHneIWv2V6CG1wZy7HBG
+S4tz3aAhdT7cHcCP009zHIXZ/n9iyJVvttN7jLpTwm+bREx50B1ws9efAvSyB7DH5fitIw6mVskp
+EndI2S9G/Tvw/HRwkqWOOAgfZDC2t0v7NqwQjqBSM2OdAzVWxWm9xiNaJ5T2pBL4LTM8oValX9YZ
+6e18CL13zSdkzJTaTkZQh+D5wVOAHrut+0dSixv9ovneDiK3PTNZbNTe9ZUGMg1RGUFcPk8G97kr
+gCf2o6p6fAbhQ8MTOWIaNr3gKC6UAuQpLmBVrkA9sHSSXvAgZJY/X0VdiLWK2gKgW0VU3jg9CcCo
+SmVGFvyqv1ROTVu+OEO3KMqLM6oaJbolXCkvW0pujOotnCr2BXbgd5eAiN1nE28daCSLT7d0geX0
+YJ96Vdc+N9oWaz53rK4YcJUIeSkDiv7BO7M/Gg+kO14fWKGVyasvc0rQLW6aWQ9VGHgtPFGml4vm
+u7JwqkwR3v98KzfUetF3NI/n+UL3PIEMS1IK
+-----END CERTIFICATE-----
+
+OpenTrust Root CA G3
+====================
+-----BEGIN CERTIFICATE-----
+MIICITCCAaagAwIBAgISESDm+Ez8JLC+BUCs2oMbNGA/MAoGCCqGSM49BAMDMEAxCzAJBgNVBAYT
+AkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5UcnVzdCBSb290IENBIEczMB4X
+DTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAwMFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9w
+ZW5UcnVzdDEdMBsGA1UEAwwUT3BlblRydXN0IFJvb3QgQ0EgRzMwdjAQBgcqhkjOPQIBBgUrgQQA
+IgNiAARK7liuTcpm3gY6oxH84Bjwbhy6LTAMidnW7ptzg6kjFYwvWYpa3RTqnVkrQ7cG7DK2uu5B
+ta1doYXM6h0UZqNnfkbilPPntlahFVmhTzeXuSIevRHr9LIfXsMUmuXZl5mjYzBhMA4GA1UdDwEB
+/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAf
+BgNVHSMEGDAWgBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAKBggqhkjOPQQDAwNpADBmAjEAj6jcnboM
+BBf6Fek9LykBl7+BFjNAk2z8+e2AcG+qj9uEwov1NcoG3GRvaBbhj5G5AjEA2Euly8LQCGzpGPta
+3U1fJAuwACEl74+nBCZx4nxp5V2a+EEfOzmTk51V6s2N8fvB
+-----END CERTIFICATE-----
+
+ISRG Root X1
+============
+-----BEGIN CERTIFICATE-----
+MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAwTzELMAkGA1UE
+BhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQD
+EwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQG
+EwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMT
+DElTUkcgUm9vdCBYMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54r
+Vygch77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+0TM8ukj1
+3Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6UA5/TR5d8mUgjU+g4rk8K
+b4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sWT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCN
+Aymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyHB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ
+4Q7e2RCOFvu396j3x+UCB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf
+1b0SHzUvKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWnOlFu
+hjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTnjh8BCNAw1FtxNrQH
+usEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbwqHyGO0aoSCqI3Haadr8faqU9GY/r
+OPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CIrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4G
+A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY
+9umbbjANBgkqhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL
+ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ3BebYhtF8GaV
+0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KKNFtY2PwByVS5uCbMiogziUwt
+hDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJw
+TdwJx4nLCgdNbOhdjsnvzqvHu7UrTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nx
+e5AW0wdeRlN8NwdCjNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZA
+JzVcoyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq4RgqsahD
+YVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPAmRGunUHBcnWEvgJBQl9n
+JEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57demyPxgcYxn/eR44/KJ4EBs+lVDR3veyJ
+m+kXQ99b21/+jh5Xos1AnX5iItreGCc=
+-----END CERTIFICATE-----
diff --git a/server/vendor/abraham/twitteroauth/tests/AbstractSignatureMethodTest.php b/server/vendor/abraham/twitteroauth/tests/AbstractSignatureMethodTest.php
new file mode 100644
index 0000000..60a2a7f
--- /dev/null
+++ b/server/vendor/abraham/twitteroauth/tests/AbstractSignatureMethodTest.php
@@ -0,0 +1,51 @@
+<?php
+
+namespace Abraham\TwitterOAuth\Tests;
+
+use Abraham\TwitterOAuth\SignatureMethod;
+
+abstract class AbstractSignatureMethodTest extends \PHPUnit_Framework_TestCase
+{
+ protected $name;
+
+ /**
+ * @return SignatureMethod
+ */
+ abstract public function getClass();
+
+ abstract protected function signatureDataProvider();
+
+ public function testGetName()
+ {
+ $this->assertEquals($this->name, $this->getClass()->getName());
+ }
+
+ /**
+ * @dataProvider signatureDataProvider
+ */
+ public function testBuildSignature($expected, $request, $consumer, $token)
+ {
+ $this->assertEquals($expected, $this->getClass()->buildSignature($request, $consumer, $token));
+ }
+
+ protected function getRequest()
+ {
+ return $this->getMockBuilder('Abraham\TwitterOAuth\Request')
+ ->disableOriginalConstructor()
+ ->getMock();
+ }
+
+ protected function getConsumer($key = null, $secret = null, $callbackUrl = null)
+ {
+ return $this->getMockBuilder('Abraham\TwitterOAuth\Consumer')
+ ->setConstructorArgs(array($key, $secret, $callbackUrl))
+ ->getMock();
+ }
+
+ protected function getToken($key = null, $secret = null)
+ {
+ return $this->getMockBuilder('Abraham\TwitterOAuth\Token')
+ ->setConstructorArgs(array($key, $secret))
+ ->getMock();
+ }
+}
diff --git a/server/vendor/abraham/twitteroauth/tests/ConsumerTest.php b/server/vendor/abraham/twitteroauth/tests/ConsumerTest.php
new file mode 100644
index 0000000..3ec810a
--- /dev/null
+++ b/server/vendor/abraham/twitteroauth/tests/ConsumerTest.php
@@ -0,0 +1,16 @@
+<?php
+
+namespace Abraham\TwitterOAuth\Tests;
+
+use Abraham\TwitterOAuth\Consumer;
+
+class ConsumerTest extends \PHPUnit_Framework_TestCase {
+ public function testToString()
+ {
+ $key = uniqid();
+ $secret = uniqid();
+ $consumer = new Consumer($key, $secret);
+
+ $this->assertEquals("Consumer[key=$key,secret=$secret]", $consumer->__toString());
+ }
+} \ No newline at end of file
diff --git a/server/vendor/abraham/twitteroauth/tests/HmacSha1Test.php b/server/vendor/abraham/twitteroauth/tests/HmacSha1Test.php
new file mode 100644
index 0000000..c17ce26
--- /dev/null
+++ b/server/vendor/abraham/twitteroauth/tests/HmacSha1Test.php
@@ -0,0 +1,35 @@
+<?php
+
+namespace Abraham\TwitterOAuth\Tests;
+
+use Abraham\TwitterOAuth\HmacSha1;
+
+class HmacSha1Test extends AbstractSignatureMethodTest
+{
+ protected $name = 'HMAC-SHA1';
+
+ public function getClass()
+ {
+ return new HmacSha1();
+ }
+
+ public function signatureDataProvider()
+ {
+ return array(
+ array('5CoEcoq7XoKFjwYCieQvuzadeUA=', $this->getRequest(), $this->getConsumer(), $this->getToken()),
+ array(
+ 'EBw0gHngam3BTx8kfPfNNSyKem4=',
+ $this->getRequest(),
+ $this->getConsumer('key', 'secret'),
+ $this->getToken()
+ ),
+ array(
+ 'kDsHFZzws2a5M6cAQjfpdNBo+v8=',
+ $this->getRequest(),
+ $this->getConsumer('key', 'secret'),
+ $this->getToken('key', 'secret')
+ ),
+ array('EBw0gHngam3BTx8kfPfNNSyKem4=', $this->getRequest(), $this->getConsumer('key', 'secret'), null),
+ );
+ }
+} \ No newline at end of file
diff --git a/server/vendor/abraham/twitteroauth/tests/TokenTest.php b/server/vendor/abraham/twitteroauth/tests/TokenTest.php
new file mode 100644
index 0000000..c7b36a4
--- /dev/null
+++ b/server/vendor/abraham/twitteroauth/tests/TokenTest.php
@@ -0,0 +1,26 @@
+<?php
+
+namespace Abraham\TwitterOAuth\Tests;
+
+use Abraham\TwitterOAuth\Token;
+
+class TokenTest extends \PHPUnit_Framework_TestCase {
+ /**
+ * @dataProvider tokenProvider
+ */
+ public function testToString($expected, $key, $secret)
+ {
+ $token = new Token($key, $secret);
+
+ $this->assertEquals($expected, $token->__toString());
+ }
+
+ public function tokenProvider()
+ {
+ return array(
+ array('oauth_token=key&oauth_token_secret=secret', 'key', 'secret'),
+ array('oauth_token=key%2Bkey&oauth_token_secret=secret', 'key+key', 'secret'),
+ array('oauth_token=key~key&oauth_token_secret=secret', 'key~key', 'secret'),
+ );
+ }
+} \ No newline at end of file
diff --git a/server/vendor/abraham/twitteroauth/tests/TwitterOAuthTest.php b/server/vendor/abraham/twitteroauth/tests/TwitterOAuthTest.php
new file mode 100644
index 0000000..6b72995
--- /dev/null
+++ b/server/vendor/abraham/twitteroauth/tests/TwitterOAuthTest.php
@@ -0,0 +1,256 @@
+<?php
+/**
+ * WARNING: Running these tests will post and delete through the actual Twitter account.
+ */
+namespace Abraham\TwitterOAuth\Test;
+
+use Abraham\TwitterOAuth\TwitterOAuth;
+
+class TwitterOAuthTest extends \PHPUnit_Framework_TestCase
+{
+ /** @var TwitterOAuth */
+ protected $twitter;
+
+ protected function setUp()
+ {
+ $this->twitter = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET);
+ }
+
+ public function testBuildClient()
+ {
+ $this->assertObjectHasAttribute('consumer', $this->twitter);
+ $this->assertObjectHasAttribute('token', $this->twitter);
+ }
+
+ public function testSetOauthToken()
+ {
+ $twitter = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET);
+ $twitter->setOauthToken(ACCESS_TOKEN, ACCESS_TOKEN_SECRET);
+ $this->assertObjectHasAttribute('consumer', $twitter);
+ $this->assertObjectHasAttribute('token', $twitter);
+ $twitter->get('friendships/show', array('target_screen_name' => 'twitterapi'));
+ $this->assertEquals(200, $twitter->getLastHttpCode());
+ }
+
+ public function testOauth2Token()
+ {
+ $twitter = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET);
+ $result = $twitter->oauth2('oauth2/token', array('grant_type' => 'client_credentials'));
+ $this->assertEquals(200, $twitter->getLastHttpCode());
+ $this->assertObjectHasAttribute('token_type', $result);
+ $this->assertObjectHasAttribute('access_token', $result);
+ $this->assertEquals('bearer', $result->token_type);
+ return $result;
+ }
+
+ /**
+ * @depends testOauth2Token
+ */
+ public function testBearerToken($accessToken)
+ {
+ $twitter = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, null, $accessToken->access_token);
+ $result = $twitter->get('statuses/user_timeline', array('screen_name' => 'twitterapi'));
+ if ($twitter->getLastHttpCode() !== 200) {
+ $this->assertEquals('foo', substr($accessToken->access_token, 0, 75));
+ $this->assertEquals('foo', print_r($result, true));
+ }
+ $this->assertEquals(200, $twitter->getLastHttpCode());
+ return $accessToken;
+ }
+
+ // This causes issues for parallel run tests.
+ // /**
+ // * @depends testBearerToken
+ // */
+ // public function testOauth2TokenInvalidate($accessToken)
+ // {
+ // $twitter = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET);
+ // // HACK: access_token is already urlencoded but gets urlencoded again breaking the invalidate request.
+ // $result = $twitter->oauth2(
+ // 'oauth2/invalidate_token',
+ // array('access_token' => urldecode($accessToken->access_token))
+ // );
+ // $this->assertEquals(200, $twitter->getLastHttpCode());
+ // $this->assertObjectHasAttribute('access_token', $result);
+ // return $result;
+ // }
+
+ public function testOauthRequestToken()
+ {
+ $twitter = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET);
+ $result = $twitter->oauth('oauth/request_token', array('oauth_callback' => OAUTH_CALLBACK));
+ $this->assertEquals(200, $twitter->getLastHttpCode());
+ $this->assertArrayHasKey('oauth_token', $result);
+ $this->assertArrayHasKey('oauth_token_secret', $result);
+ $this->assertArrayHasKey('oauth_callback_confirmed', $result);
+ $this->assertEquals('true', $result['oauth_callback_confirmed']);
+ return $result;
+ }
+
+ /**
+ * @expectedException \Abraham\TwitterOAuth\TwitterOAuthException
+ * @expectedExceptionMessage Could not authenticate you
+ */
+ public function testOauthRequestTokenException()
+ {
+ $twitter = new TwitterOAuth('CONSUMER_KEY', 'CONSUMER_SECRET');
+ $result = $twitter->oauth('oauth/request_token', array('oauth_callback' => OAUTH_CALLBACK));
+ return $result;
+ }
+
+ /**
+ * @expectedException \Abraham\TwitterOAuth\TwitterOAuthException
+ * @expectedExceptionMessage Invalid oauth_verifier parameter
+ * @depends testOauthRequestToken
+ */
+ public function testOauthAccessTokenTokenException(array $requestToken)
+ {
+ // Can't test this without a browser logging into Twitter so check for the correct error instead.
+ $twitter = new TwitterOAuth(
+ CONSUMER_KEY,
+ CONSUMER_SECRET,
+ $requestToken['oauth_token'],
+ $requestToken['oauth_token_secret']
+ );
+ $twitter->oauth("oauth/access_token", array("oauth_verifier" => "fake_oauth_verifier"));
+ }
+
+ public function testUrl()
+ {
+ $url = $this->twitter->url('oauth/authorize', array('foo' => 'bar', 'baz' => 'qux'));
+ $this->assertEquals('https://api.twitter.com/oauth/authorize?foo=bar&baz=qux', $url);
+ }
+
+ public function testGetAccountVerifyCredentials()
+ {
+ // Include entities boolean added to test parameter value cohearsion
+ $this->twitter->get('account/verify_credentials', array("include_entities" => false));
+ $this->assertEquals(200, $this->twitter->getLastHttpCode());
+ }
+
+ // BUG: testing is too unreliable for now
+ // public function testSetProxy()
+ // {
+ // $this->twitter->setProxy(array(
+ // 'CURLOPT_PROXY' => PROXY,
+ // 'CURLOPT_PROXYUSERPWD' => PROXYUSERPWD,
+ // 'CURLOPT_PROXYPORT' => PROXYPORT,
+ // ));
+ // $this->twitter->setTimeouts(60, 60);
+ // $result = $this->twitter->get('account/verify_credentials');
+ // $this->assertEquals(200, $this->twitter->getLastHttpCode());
+ // $this->assertObjectHasAttribute('id', $result);
+ // }
+
+ public function testGetStatusesMentionsTimeline()
+ {
+ $this->twitter->get('statuses/mentions_timeline');
+ $this->assertEquals(200, $this->twitter->getLastHttpCode());
+ }
+
+ public function testGetSearchTweets()
+ {
+ $result = $this->twitter->get('search/tweets', array('q' => 'twitter'));
+ $this->assertEquals(200, $this->twitter->getLastHttpCode());
+ return $result->statuses;
+ }
+
+ /**
+ * @depends testGetSearchTweets
+ */
+ public function testGetSearchTweetsWithMaxId($statuses)
+ {
+ $maxId = array_pop($statuses)->id_str;
+ $this->twitter->get('search/tweets', array('q' => 'twitter', 'max_id' => $maxId));
+ $this->assertEquals(200, $this->twitter->getLastHttpCode());
+ }
+
+ public function testPostFavoritesCreate()
+ {
+ $result = $this->twitter->post('favorites/create', array('id' => '6242973112'));
+ if ($this->twitter->getLastHttpCode() == 403) {
+ // Status already favorited
+ $this->assertEquals(139, $result->errors[0]->code);
+ } else {
+ $this->assertEquals(200, $this->twitter->getLastHttpCode());
+ }
+ }
+
+ /**
+ * @depends testPostFavoritesCreate
+ */
+ public function testPostFavoritesDestroy()
+ {
+ $this->twitter->post('favorites/destroy', array('id' => '6242973112'));
+ $this->assertEquals(200, $this->twitter->getLastHttpCode());
+ }
+
+ public function testPostStatusesUpdateWithMedia()
+ {
+ $this->twitter->setTimeouts(60, 30);
+ // Image source https://www.flickr.com/photos/titrans/8548825587/
+ $file_path = __DIR__ . '/kitten.jpg';
+ $result = $this->twitter->upload('media/upload', array('media' => $file_path));
+ $this->assertEquals(200, $this->twitter->getLastHttpCode());
+ $this->assertObjectHasAttribute('media_id_string', $result);
+ $parameters = array('status' => 'Hello World ' . time(), 'media_ids' => $result->media_id_string);
+ $result = $this->twitter->post('statuses/update', $parameters);
+ $this->assertEquals(200, $this->twitter->getLastHttpCode());
+ if ($this->twitter->getLastHttpCode() == 200) {
+ $result = $this->twitter->post('statuses/destroy/' . $result->id_str);
+ }
+ return $result;
+ }
+
+ public function testPostStatusesUpdateWithMediaChunked()
+ {
+ $this->twitter->setTimeouts(60, 30);
+ // Video source http://www.sample-videos.com/
+ $file_path = __DIR__ . '/video.mp4';
+ $result = $this->twitter->upload('media/upload', array('media' => $file_path, 'media_type' => 'video/mp4'), true);
+ $this->assertEquals(201, $this->twitter->getLastHttpCode());
+ $this->assertObjectHasAttribute('media_id_string', $result);
+ $parameters = array('status' => 'Hello World ' . time(), 'media_ids' => $result->media_id_string);
+ $result = $this->twitter->post('statuses/update', $parameters);
+ $this->assertEquals(200, $this->twitter->getLastHttpCode());
+ if ($this->twitter->getLastHttpCode() == 200) {
+ $result = $this->twitter->post('statuses/destroy/' . $result->id_str);
+ }
+ return $result;
+ }
+
+ public function testPostStatusesUpdateUtf8()
+ {
+ $result = $this->twitter->post('statuses/update', array('status' => 'xこんにちは世界 ' . time()));
+ $this->assertEquals(200, $this->twitter->getLastHttpCode());
+ return $result;
+ }
+
+ /**
+ * @depends testPostStatusesUpdateUtf8
+ */
+ public function testPostStatusesDestroy($status)
+ {
+ $this->twitter->post('statuses/destroy/' . $status->id_str);
+ $this->assertEquals(200, $this->twitter->getLastHttpCode());
+ }
+
+ public function testLastResult()
+ {
+ $this->twitter->get('search/tweets', array('q' => 'twitter'));
+ $this->assertEquals('search/tweets', $this->twitter->getLastApiPath());
+ $this->assertEquals(200, $this->twitter->getLastHttpCode());
+ $this->assertObjectHasAttribute('statuses', $this->twitter->getLastBody());
+ }
+
+ /**
+ * @depends testLastResult
+ */
+ public function testResetLastResponse()
+ {
+ $this->twitter->resetLastResponse();
+ $this->assertEquals('', $this->twitter->getLastApiPath());
+ $this->assertEquals(0, $this->twitter->getLastHttpCode());
+ $this->assertEquals(array(), $this->twitter->getLastBody());
+ }
+}
diff --git a/server/vendor/abraham/twitteroauth/tests/Util/JsonDecoderTest.php b/server/vendor/abraham/twitteroauth/tests/Util/JsonDecoderTest.php
new file mode 100644
index 0000000..85c6a75
--- /dev/null
+++ b/server/vendor/abraham/twitteroauth/tests/Util/JsonDecoderTest.php
@@ -0,0 +1,50 @@
+<?php
+
+namespace Abraham\TwitterOAuth\Tests;
+
+use Abraham\TwitterOAuth\Util\JsonDecoder;
+
+class JsonDecoderTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @dataProvider jsonProvider
+ */
+ public function testDecode($input, $asArray, $expected)
+ {
+ $this->assertEquals($expected, JsonDecoder::decode($input, $asArray));
+ }
+
+ public function jsonProvider()
+ {
+ return array(
+ array('[]', true, array()),
+ array('[1,2,3]', true, array(1, 2, 3)),
+ array('[{"id": 556179961825226750}]', true, array(array('id' => 556179961825226750))),
+ array('[]', false, array()),
+ array('[1,2,3]', false, array(1, 2, 3)),
+ array(
+ '[{"id": 556179961825226750}]',
+ false,
+ array(
+ $this->getClass(function ($object) {
+ $object->id = 556179961825226750;
+ return $object;
+ })
+ )
+ ),
+
+ );
+ }
+
+ /**
+ * @param callable $callable
+ *
+ * @return stdClass
+ */
+ private function getClass(\Closure $callable)
+ {
+ $object = new \stdClass();
+
+ return $callable($object);
+ }
+}
diff --git a/server/vendor/abraham/twitteroauth/tests/bootstrap.php b/server/vendor/abraham/twitteroauth/tests/bootstrap.php
new file mode 100644
index 0000000..7cc9c27
--- /dev/null
+++ b/server/vendor/abraham/twitteroauth/tests/bootstrap.php
@@ -0,0 +1,12 @@
+<?php
+
+require __DIR__ . '/../vendor/autoload.php';
+
+define('CONSUMER_KEY', getenv('TEST_CONSUMER_KEY'));
+define('CONSUMER_SECRET', getenv('TEST_CONSUMER_SECRET'));
+define('ACCESS_TOKEN', getenv('TEST_ACCESS_TOKEN'));
+define('ACCESS_TOKEN_SECRET', getenv('TEST_ACCESS_TOKEN_SECRET'));
+define('OAUTH_CALLBACK', getenv('TEST_OAUTH_CALLBACK'));
+define('PROXY', getenv('TEST_CURLOPT_PROXY'));
+define('PROXYUSERPWD', getenv('TEST_CURLOPT_PROXYUSERPWD'));
+define('PROXYPORT', getenv('TEST_CURLOPT_PROXYPORT'));
diff --git a/server/vendor/abraham/twitteroauth/tests/kitten.jpg b/server/vendor/abraham/twitteroauth/tests/kitten.jpg
new file mode 100644
index 0000000..47006b4
--- /dev/null
+++ b/server/vendor/abraham/twitteroauth/tests/kitten.jpg
Binary files differ
diff --git a/server/vendor/abraham/twitteroauth/tests/sample_env b/server/vendor/abraham/twitteroauth/tests/sample_env
new file mode 100644
index 0000000..64e07fd
--- /dev/null
+++ b/server/vendor/abraham/twitteroauth/tests/sample_env
@@ -0,0 +1,13 @@
+# WARNING: Running the tests will perform live actions as the Twitter account.
+# Set all values, move to `env`, run `source tests/env` and `phpunit` to start testing.
+
+# To run the tests you must register Twitter application at https://app.twitter.com/.
+export TEST_CONSUMER_KEY=
+export TEST_CONSUMER_SECRET=
+export TEST_ACCESS_TOKEN=
+export TEST_ACCESS_TOKEN_SECRET=
+export TEST_OAUTH_CALLBACK=
+# You can find proxies for testing at http://proxylist.hidemyass.com/.
+export TEST_CURLOPT_PROXY=
+export TEST_CURLOPT_PROXYUSERPWD=
+export TEST_CURLOPT_PROXYPORT=
diff --git a/server/vendor/abraham/twitteroauth/tests/video.mp4 b/server/vendor/abraham/twitteroauth/tests/video.mp4
new file mode 100644
index 0000000..1fc4788
--- /dev/null
+++ b/server/vendor/abraham/twitteroauth/tests/video.mp4
Binary files differ
diff --git a/server/vendor/composer/ClassLoader.php b/server/vendor/composer/ClassLoader.php
index 2c72175..4626994 100644
--- a/server/vendor/composer/ClassLoader.php
+++ b/server/vendor/composer/ClassLoader.php
@@ -374,13 +374,9 @@ class ClassLoader
$first = $class[0];
if (isset($this->prefixLengthsPsr4[$first])) {
- $subPath = $class;
- while (false !== $lastPos = strrpos($subPath, '\\')) {
- $subPath = substr($subPath, 0, $lastPos);
- $search = $subPath.'\\';
- if (isset($this->prefixDirsPsr4[$search])) {
- foreach ($this->prefixDirsPsr4[$search] as $dir) {
- $length = $this->prefixLengthsPsr4[$first][$search];
+ foreach ($this->prefixLengthsPsr4[$first] as $prefix => $length) {
+ if (0 === strpos($class, $prefix)) {
+ foreach ($this->prefixDirsPsr4[$prefix] as $dir) {
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) {
return $file;
}
diff --git a/server/vendor/composer/LICENSE b/server/vendor/composer/LICENSE
index f27399a..1a28124 100644
--- a/server/vendor/composer/LICENSE
+++ b/server/vendor/composer/LICENSE
@@ -1,5 +1,5 @@
-Copyright (c) Nils Adermann, Jordi Boggiano
+Copyright (c) 2016 Nils Adermann, Jordi Boggiano
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/server/vendor/composer/autoload_classmap.php b/server/vendor/composer/autoload_classmap.php
index 8505a8b..49923d6 100644
--- a/server/vendor/composer/autoload_classmap.php
+++ b/server/vendor/composer/autoload_classmap.php
@@ -6,6 +6,17 @@ $vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
+ 'Abraham\\TwitterOAuth\\Config' => $vendorDir . '/abraham/twitteroauth/src/Config.php',
+ 'Abraham\\TwitterOAuth\\Consumer' => $vendorDir . '/abraham/twitteroauth/src/Consumer.php',
+ 'Abraham\\TwitterOAuth\\HmacSha1' => $vendorDir . '/abraham/twitteroauth/src/HmacSha1.php',
+ 'Abraham\\TwitterOAuth\\Request' => $vendorDir . '/abraham/twitteroauth/src/Request.php',
+ 'Abraham\\TwitterOAuth\\Response' => $vendorDir . '/abraham/twitteroauth/src/Response.php',
+ 'Abraham\\TwitterOAuth\\SignatureMethod' => $vendorDir . '/abraham/twitteroauth/src/SignatureMethod.php',
+ 'Abraham\\TwitterOAuth\\Token' => $vendorDir . '/abraham/twitteroauth/src/Token.php',
+ 'Abraham\\TwitterOAuth\\TwitterOAuth' => $vendorDir . '/abraham/twitteroauth/src/TwitterOAuth.php',
+ 'Abraham\\TwitterOAuth\\TwitterOAuthException' => $vendorDir . '/abraham/twitteroauth/src/TwitterOAuthException.php',
+ 'Abraham\\TwitterOAuth\\Util' => $vendorDir . '/abraham/twitteroauth/src/Util.php',
+ 'Abraham\\TwitterOAuth\\Util\\JsonDecoder' => $vendorDir . '/abraham/twitteroauth/src/Util/JsonDecoder.php',
'FastRoute\\BadRouteException' => $vendorDir . '/nikic/fast-route/src/BadRouteException.php',
'FastRoute\\DataGenerator' => $vendorDir . '/nikic/fast-route/src/DataGenerator.php',
'FastRoute\\DataGenerator\\CharCountBased' => $vendorDir . '/nikic/fast-route/src/DataGenerator/CharCountBased.php',
@@ -54,6 +65,7 @@ return array(
'GuzzleHttp\\PrepareBodyMiddleware' => $vendorDir . '/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php',
'GuzzleHttp\\Promise\\AggregateException' => $vendorDir . '/guzzlehttp/promises/src/AggregateException.php',
'GuzzleHttp\\Promise\\CancellationException' => $vendorDir . '/guzzlehttp/promises/src/CancellationException.php',
+ 'GuzzleHttp\\Promise\\Coroutine' => $vendorDir . '/guzzlehttp/promises/src/Coroutine.php',
'GuzzleHttp\\Promise\\EachPromise' => $vendorDir . '/guzzlehttp/promises/src/EachPromise.php',
'GuzzleHttp\\Promise\\FulfilledPromise' => $vendorDir . '/guzzlehttp/promises/src/FulfilledPromise.php',
'GuzzleHttp\\Promise\\Promise' => $vendorDir . '/guzzlehttp/promises/src/Promise.php',
@@ -62,6 +74,7 @@ return array(
'GuzzleHttp\\Promise\\RejectedPromise' => $vendorDir . '/guzzlehttp/promises/src/RejectedPromise.php',
'GuzzleHttp\\Promise\\RejectionException' => $vendorDir . '/guzzlehttp/promises/src/RejectionException.php',
'GuzzleHttp\\Promise\\TaskQueue' => $vendorDir . '/guzzlehttp/promises/src/TaskQueue.php',
+ 'GuzzleHttp\\Promise\\TaskQueueInterface' => $vendorDir . '/guzzlehttp/promises/src/TaskQueueInterface.php',
'GuzzleHttp\\Psr7\\AppendStream' => $vendorDir . '/guzzlehttp/psr7/src/AppendStream.php',
'GuzzleHttp\\Psr7\\BufferStream' => $vendorDir . '/guzzlehttp/psr7/src/BufferStream.php',
'GuzzleHttp\\Psr7\\CachingStream' => $vendorDir . '/guzzlehttp/psr7/src/CachingStream.php',
@@ -82,6 +95,8 @@ return array(
'GuzzleHttp\\Psr7\\StreamWrapper' => $vendorDir . '/guzzlehttp/psr7/src/StreamWrapper.php',
'GuzzleHttp\\Psr7\\UploadedFile' => $vendorDir . '/guzzlehttp/psr7/src/UploadedFile.php',
'GuzzleHttp\\Psr7\\Uri' => $vendorDir . '/guzzlehttp/psr7/src/Uri.php',
+ 'GuzzleHttp\\Psr7\\UriNormalizer' => $vendorDir . '/guzzlehttp/psr7/src/UriNormalizer.php',
+ 'GuzzleHttp\\Psr7\\UriResolver' => $vendorDir . '/guzzlehttp/psr7/src/UriResolver.php',
'GuzzleHttp\\RedirectMiddleware' => $vendorDir . '/guzzlehttp/guzzle/src/RedirectMiddleware.php',
'GuzzleHttp\\RequestOptions' => $vendorDir . '/guzzlehttp/guzzle/src/RequestOptions.php',
'GuzzleHttp\\RetryMiddleware' => $vendorDir . '/guzzlehttp/guzzle/src/RetryMiddleware.php',
@@ -92,9 +107,12 @@ return array(
'Interop\\Container\\Exception\\NotFoundException' => $vendorDir . '/container-interop/container-interop/src/Interop/Container/Exception/NotFoundException.php',
'LookupServer\\BruteForceMiddleware' => $baseDir . '/lib/BruteForceMiddleware.php',
'LookupServer\\Replication' => $baseDir . '/lib/Replication.php',
+ 'LookupServer\\SignatureHandler' => $baseDir . '/lib/SignatureHandler.php',
'LookupServer\\Status' => $baseDir . '/lib/Status.php',
'LookupServer\\UserManager' => $baseDir . '/lib/UserManager.php',
'LookupServer\\Validator\\Email' => $baseDir . '/lib/Validator/Email.php',
+ 'LookupServer\\Validator\\Twitter' => $baseDir . '/lib/Validator/Twitter.php',
+ 'LookupServer\\Validator\\Website' => $baseDir . '/lib/Validator/Website.php',
'Pimple\\Container' => $vendorDir . '/pimple/pimple/src/Pimple/Container.php',
'Pimple\\ServiceProviderInterface' => $vendorDir . '/pimple/pimple/src/Pimple/ServiceProviderInterface.php',
'Pimple\\Tests\\Fixtures\\Invokable' => $vendorDir . '/pimple/pimple/src/Pimple/Tests/Fixtures/Invokable.php',
@@ -103,6 +121,9 @@ return array(
'Pimple\\Tests\\Fixtures\\Service' => $vendorDir . '/pimple/pimple/src/Pimple/Tests/Fixtures/Service.php',
'Pimple\\Tests\\PimpleServiceProviderInterfaceTest' => $vendorDir . '/pimple/pimple/src/Pimple/Tests/PimpleServiceProviderInterfaceTest.php',
'Pimple\\Tests\\PimpleTest' => $vendorDir . '/pimple/pimple/src/Pimple/Tests/PimpleTest.php',
+ 'Psr\\Container\\ContainerExceptionInterface' => $vendorDir . '/psr/container/src/ContainerExceptionInterface.php',
+ 'Psr\\Container\\ContainerInterface' => $vendorDir . '/psr/container/src/ContainerInterface.php',
+ 'Psr\\Container\\NotFoundExceptionInterface' => $vendorDir . '/psr/container/src/NotFoundExceptionInterface.php',
'Psr\\Http\\Message\\MessageInterface' => $vendorDir . '/psr/http-message/src/MessageInterface.php',
'Psr\\Http\\Message\\RequestInterface' => $vendorDir . '/psr/http-message/src/RequestInterface.php',
'Psr\\Http\\Message\\ResponseInterface' => $vendorDir . '/psr/http-message/src/ResponseInterface.php',
@@ -119,6 +140,7 @@ return array(
'Slim\\DeferredCallable' => $vendorDir . '/slim/slim/Slim/DeferredCallable.php',
'Slim\\Exception\\ContainerException' => $vendorDir . '/slim/slim/Slim/Exception/ContainerException.php',
'Slim\\Exception\\ContainerValueNotFoundException' => $vendorDir . '/slim/slim/Slim/Exception/ContainerValueNotFoundException.php',
+ 'Slim\\Exception\\InvalidMethodException' => $vendorDir . '/slim/slim/Slim/Exception/InvalidMethodException.php',
'Slim\\Exception\\MethodNotAllowedException' => $vendorDir . '/slim/slim/Slim/Exception/MethodNotAllowedException.php',
'Slim\\Exception\\NotFoundException' => $vendorDir . '/slim/slim/Slim/Exception/NotFoundException.php',
'Slim\\Exception\\SlimException' => $vendorDir . '/slim/slim/Slim/Exception/SlimException.php',
diff --git a/server/vendor/composer/autoload_psr4.php b/server/vendor/composer/autoload_psr4.php
index 7cffeaa..eaf1447 100644
--- a/server/vendor/composer/autoload_psr4.php
+++ b/server/vendor/composer/autoload_psr4.php
@@ -8,10 +8,12 @@ $baseDir = dirname($vendorDir);
return array(
'Slim\\' => array($vendorDir . '/slim/slim/Slim'),
'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src'),
+ 'Psr\\Container\\' => array($vendorDir . '/psr/container/src'),
'LookupServer\\' => array($baseDir . '/lib'),
'Interop\\Container\\' => array($vendorDir . '/container-interop/container-interop/src/Interop/Container'),
'GuzzleHttp\\Psr7\\' => array($vendorDir . '/guzzlehttp/psr7/src'),
'GuzzleHttp\\Promise\\' => array($vendorDir . '/guzzlehttp/promises/src'),
'GuzzleHttp\\' => array($vendorDir . '/guzzlehttp/guzzle/src'),
'FastRoute\\' => array($vendorDir . '/nikic/fast-route/src'),
+ 'Abraham\\TwitterOAuth\\' => array($vendorDir . '/abraham/twitteroauth/src'),
);
diff --git a/server/vendor/composer/autoload_static.php b/server/vendor/composer/autoload_static.php
index 22ec6d1..247990e 100644
--- a/server/vendor/composer/autoload_static.php
+++ b/server/vendor/composer/autoload_static.php
@@ -21,6 +21,7 @@ class ComposerStaticInit509ee4e79733fbe3199b97373b795eca
'P' =>
array (
'Psr\\Http\\Message\\' => 17,
+ 'Psr\\Container\\' => 14,
),
'L' =>
array (
@@ -40,6 +41,10 @@ class ComposerStaticInit509ee4e79733fbe3199b97373b795eca
array (
'FastRoute\\' => 10,
),
+ 'A' =>
+ array (
+ 'Abraham\\TwitterOAuth\\' => 21,
+ ),
);
public static $prefixDirsPsr4 = array (
@@ -51,6 +56,10 @@ class ComposerStaticInit509ee4e79733fbe3199b97373b795eca
array (
0 => __DIR__ . '/..' . '/psr/http-message/src',
),
+ 'Psr\\Container\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/psr/container/src',
+ ),
'LookupServer\\' =>
array (
0 => __DIR__ . '/../..' . '/lib',
@@ -75,6 +84,10 @@ class ComposerStaticInit509ee4e79733fbe3199b97373b795eca
array (
0 => __DIR__ . '/..' . '/nikic/fast-route/src',
),
+ 'Abraham\\TwitterOAuth\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/abraham/twitteroauth/src',
+ ),
);
public static $prefixesPsr0 = array (
@@ -88,6 +101,17 @@ class ComposerStaticInit509ee4e79733fbe3199b97373b795eca
);
public static $classMap = array (
+ 'Abraham\\TwitterOAuth\\Config' => __DIR__ . '/..' . '/abraham/twitteroauth/src/Config.php',
+ 'Abraham\\TwitterOAuth\\Consumer' => __DIR__ . '/..' . '/abraham/twitteroauth/src/Consumer.php',
+ 'Abraham\\TwitterOAuth\\HmacSha1' => __DIR__ . '/..' . '/abraham/twitteroauth/src/HmacSha1.php',
+ 'Abraham\\TwitterOAuth\\Request' => __DIR__ . '/..' . '/abraham/twitteroauth/src/Request.php',
+ 'Abraham\\TwitterOAuth\\Response' => __DIR__ . '/..' . '/abraham/twitteroauth/src/Response.php',
+ 'Abraham\\TwitterOAuth\\SignatureMethod' => __DIR__ . '/..' . '/abraham/twitteroauth/src/SignatureMethod.php',
+ 'Abraham\\TwitterOAuth\\Token' => __DIR__ . '/..' . '/abraham/twitteroauth/src/Token.php',
+ 'Abraham\\TwitterOAuth\\TwitterOAuth' => __DIR__ . '/..' . '/abraham/twitteroauth/src/TwitterOAuth.php',
+ 'Abraham\\TwitterOAuth\\TwitterOAuthException' => __DIR__ . '/..' . '/abraham/twitteroauth/src/TwitterOAuthException.php',
+ 'Abraham\\TwitterOAuth\\Util' => __DIR__ . '/..' . '/abraham/twitteroauth/src/Util.php',
+ 'Abraham\\TwitterOAuth\\Util\\JsonDecoder' => __DIR__ . '/..' . '/abraham/twitteroauth/src/Util/JsonDecoder.php',
'FastRoute\\BadRouteException' => __DIR__ . '/..' . '/nikic/fast-route/src/BadRouteException.php',
'FastRoute\\DataGenerator' => __DIR__ . '/..' . '/nikic/fast-route/src/DataGenerator.php',
'FastRoute\\DataGenerator\\CharCountBased' => __DIR__ . '/..' . '/nikic/fast-route/src/DataGenerator/CharCountBased.php',
@@ -136,6 +160,7 @@ class ComposerStaticInit509ee4e79733fbe3199b97373b795eca
'GuzzleHttp\\PrepareBodyMiddleware' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php',
'GuzzleHttp\\Promise\\AggregateException' => __DIR__ . '/..' . '/guzzlehttp/promises/src/AggregateException.php',
'GuzzleHttp\\Promise\\CancellationException' => __DIR__ . '/..' . '/guzzlehttp/promises/src/CancellationException.php',
+ 'GuzzleHttp\\Promise\\Coroutine' => __DIR__ . '/..' . '/guzzlehttp/promises/src/Coroutine.php',
'GuzzleHttp\\Promise\\EachPromise' => __DIR__ . '/..' . '/guzzlehttp/promises/src/EachPromise.php',
'GuzzleHttp\\Promise\\FulfilledPromise' => __DIR__ . '/..' . '/guzzlehttp/promises/src/FulfilledPromise.php',
'GuzzleHttp\\Promise\\Promise' => __DIR__ . '/..' . '/guzzlehttp/promises/src/Promise.php',
@@ -144,6 +169,7 @@ class ComposerStaticInit509ee4e79733fbe3199b97373b795eca
'GuzzleHttp\\Promise\\RejectedPromise' => __DIR__ . '/..' . '/guzzlehttp/promises/src/RejectedPromise.php',
'GuzzleHttp\\Promise\\RejectionException' => __DIR__ . '/..' . '/guzzlehttp/promises/src/RejectionException.php',
'GuzzleHttp\\Promise\\TaskQueue' => __DIR__ . '/..' . '/guzzlehttp/promises/src/TaskQueue.php',
+ 'GuzzleHttp\\Promise\\TaskQueueInterface' => __DIR__ . '/..' . '/guzzlehttp/promises/src/TaskQueueInterface.php',
'GuzzleHttp\\Psr7\\AppendStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/AppendStream.php',
'GuzzleHttp\\Psr7\\BufferStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/BufferStream.php',
'GuzzleHttp\\Psr7\\CachingStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/CachingStream.php',
@@ -164,6 +190,8 @@ class ComposerStaticInit509ee4e79733fbe3199b97373b795eca
'GuzzleHttp\\Psr7\\StreamWrapper' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/StreamWrapper.php',
'GuzzleHttp\\Psr7\\UploadedFile' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/UploadedFile.php',
'GuzzleHttp\\Psr7\\Uri' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Uri.php',
+ 'GuzzleHttp\\Psr7\\UriNormalizer' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/UriNormalizer.php',
+ 'GuzzleHttp\\Psr7\\UriResolver' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/UriResolver.php',
'GuzzleHttp\\RedirectMiddleware' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/RedirectMiddleware.php',
'GuzzleHttp\\RequestOptions' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/RequestOptions.php',
'GuzzleHttp\\RetryMiddleware' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/RetryMiddleware.php',
@@ -174,9 +202,12 @@ class ComposerStaticInit509ee4e79733fbe3199b97373b795eca
'Interop\\Container\\Exception\\NotFoundException' => __DIR__ . '/..' . '/container-interop/container-interop/src/Interop/Container/Exception/NotFoundException.php',
'LookupServer\\BruteForceMiddleware' => __DIR__ . '/../..' . '/lib/BruteForceMiddleware.php',
'LookupServer\\Replication' => __DIR__ . '/../..' . '/lib/Replication.php',
+ 'LookupServer\\SignatureHandler' => __DIR__ . '/../..' . '/lib/SignatureHandler.php',
'LookupServer\\Status' => __DIR__ . '/../..' . '/lib/Status.php',
'LookupServer\\UserManager' => __DIR__ . '/../..' . '/lib/UserManager.php',
'LookupServer\\Validator\\Email' => __DIR__ . '/../..' . '/lib/Validator/Email.php',
+ 'LookupServer\\Validator\\Twitter' => __DIR__ . '/../..' . '/lib/Validator/Twitter.php',
+ 'LookupServer\\Validator\\Website' => __DIR__ . '/../..' . '/lib/Validator/Website.php',
'Pimple\\Container' => __DIR__ . '/..' . '/pimple/pimple/src/Pimple/Container.php',
'Pimple\\ServiceProviderInterface' => __DIR__ . '/..' . '/pimple/pimple/src/Pimple/ServiceProviderInterface.php',
'Pimple\\Tests\\Fixtures\\Invokable' => __DIR__ . '/..' . '/pimple/pimple/src/Pimple/Tests/Fixtures/Invokable.php',
@@ -185,6 +216,9 @@ class ComposerStaticInit509ee4e79733fbe3199b97373b795eca
'Pimple\\Tests\\Fixtures\\Service' => __DIR__ . '/..' . '/pimple/pimple/src/Pimple/Tests/Fixtures/Service.php',
'Pimple\\Tests\\PimpleServiceProviderInterfaceTest' => __DIR__ . '/..' . '/pimple/pimple/src/Pimple/Tests/PimpleServiceProviderInterfaceTest.php',
'Pimple\\Tests\\PimpleTest' => __DIR__ . '/..' . '/pimple/pimple/src/Pimple/Tests/PimpleTest.php',
+ 'Psr\\Container\\ContainerExceptionInterface' => __DIR__ . '/..' . '/psr/container/src/ContainerExceptionInterface.php',
+ 'Psr\\Container\\ContainerInterface' => __DIR__ . '/..' . '/psr/container/src/ContainerInterface.php',
+ 'Psr\\Container\\NotFoundExceptionInterface' => __DIR__ . '/..' . '/psr/container/src/NotFoundExceptionInterface.php',
'Psr\\Http\\Message\\MessageInterface' => __DIR__ . '/..' . '/psr/http-message/src/MessageInterface.php',
'Psr\\Http\\Message\\RequestInterface' => __DIR__ . '/..' . '/psr/http-message/src/RequestInterface.php',
'Psr\\Http\\Message\\ResponseInterface' => __DIR__ . '/..' . '/psr/http-message/src/ResponseInterface.php',
@@ -201,6 +235,7 @@ class ComposerStaticInit509ee4e79733fbe3199b97373b795eca
'Slim\\DeferredCallable' => __DIR__ . '/..' . '/slim/slim/Slim/DeferredCallable.php',
'Slim\\Exception\\ContainerException' => __DIR__ . '/..' . '/slim/slim/Slim/Exception/ContainerException.php',
'Slim\\Exception\\ContainerValueNotFoundException' => __DIR__ . '/..' . '/slim/slim/Slim/Exception/ContainerValueNotFoundException.php',
+ 'Slim\\Exception\\InvalidMethodException' => __DIR__ . '/..' . '/slim/slim/Slim/Exception/InvalidMethodException.php',
'Slim\\Exception\\MethodNotAllowedException' => __DIR__ . '/..' . '/slim/slim/Slim/Exception/MethodNotAllowedException.php',
'Slim\\Exception\\NotFoundException' => __DIR__ . '/..' . '/slim/slim/Slim/Exception/NotFoundException.php',
'Slim\\Exception\\SlimException' => __DIR__ . '/..' . '/slim/slim/Slim/Exception/SlimException.php',
diff --git a/server/vendor/composer/installed.json b/server/vendor/composer/installed.json
index e528b00..619cf9e 100644
--- a/server/vendor/composer/installed.json
+++ b/server/vendor/composer/installed.json
@@ -1,97 +1,123 @@
[
{
- "name": "container-interop/container-interop",
- "version": "1.1.0",
- "version_normalized": "1.1.0.0",
+ "name": "psr/http-message",
+ "version": "1.0.1",
+ "version_normalized": "1.0.1.0",
"source": {
"type": "git",
- "url": "https://github.com/container-interop/container-interop.git",
- "reference": "fc08354828f8fd3245f77a66b9e23a6bca48297e"
+ "url": "https://github.com/php-fig/http-message.git",
+ "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/container-interop/container-interop/zipball/fc08354828f8fd3245f77a66b9e23a6bca48297e",
- "reference": "fc08354828f8fd3245f77a66b9e23a6bca48297e",
+ "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
+ "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
"shasum": ""
},
- "time": "2014-12-30 15:22:37",
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "time": "2016-08-06T14:39:51+00:00",
"type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
"installation-source": "dist",
"autoload": {
"psr-4": {
- "Interop\\Container\\": "src/Interop/Container/"
+ "Psr\\Http\\Message\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
- "description": "Promoting the interoperability of container objects (DIC, SL, etc.)"
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for HTTP messages",
+ "homepage": "https://github.com/php-fig/http-message",
+ "keywords": [
+ "http",
+ "http-message",
+ "psr",
+ "psr-7",
+ "request",
+ "response"
+ ]
},
{
- "name": "nikic/fast-route",
- "version": "v1.0.1",
- "version_normalized": "1.0.1.0",
+ "name": "pimple/pimple",
+ "version": "v3.0.2",
+ "version_normalized": "3.0.2.0",
"source": {
"type": "git",
- "url": "https://github.com/nikic/FastRoute.git",
- "reference": "8ea928195fa9b907f0d6e48312d323c1a13cc2af"
+ "url": "https://github.com/silexphp/Pimple.git",
+ "reference": "a30f7d6e57565a2e1a316e1baf2a483f788b258a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nikic/FastRoute/zipball/8ea928195fa9b907f0d6e48312d323c1a13cc2af",
- "reference": "8ea928195fa9b907f0d6e48312d323c1a13cc2af",
+ "url": "https://api.github.com/repos/silexphp/Pimple/zipball/a30f7d6e57565a2e1a316e1baf2a483f788b258a",
+ "reference": "a30f7d6e57565a2e1a316e1baf2a483f788b258a",
"shasum": ""
},
"require": {
- "php": ">=5.4.0"
+ "php": ">=5.3.0"
},
- "time": "2016-06-12 19:08:51",
+ "time": "2015-09-11T15:10:35+00:00",
"type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0.x-dev"
+ }
+ },
"installation-source": "dist",
"autoload": {
- "psr-4": {
- "FastRoute\\": "src/"
- },
- "files": [
- "src/functions.php"
- ]
+ "psr-0": {
+ "Pimple": "src/"
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-3-Clause"
+ "MIT"
],
"authors": [
{
- "name": "Nikita Popov",
- "email": "nikic@php.net"
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
}
],
- "description": "Fast request router for PHP",
+ "description": "Pimple, a simple Dependency Injection Container",
+ "homepage": "http://pimple.sensiolabs.org",
"keywords": [
- "router",
- "routing"
+ "container",
+ "dependency injection"
]
},
{
- "name": "psr/http-message",
- "version": "1.0.1",
- "version_normalized": "1.0.1.0",
+ "name": "psr/container",
+ "version": "1.0.0",
+ "version_normalized": "1.0.0.0",
"source": {
"type": "git",
- "url": "https://github.com/php-fig/http-message.git",
- "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
+ "url": "https://github.com/php-fig/container.git",
+ "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
- "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
+ "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
+ "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
"shasum": ""
},
"require": {
"php": ">=5.3.0"
},
- "time": "2016-08-06 14:39:51",
+ "time": "2017-02-14T16:28:37+00:00",
"type": "library",
"extra": {
"branch-alias": {
@@ -101,7 +127,7 @@
"installation-source": "dist",
"autoload": {
"psr-4": {
- "Psr\\Http\\Message\\": "src/"
+ "Psr\\Container\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -114,85 +140,115 @@
"homepage": "http://www.php-fig.org/"
}
],
- "description": "Common interface for HTTP messages",
- "homepage": "https://github.com/php-fig/http-message",
+ "description": "Common Container Interface (PHP FIG PSR-11)",
+ "homepage": "https://github.com/php-fig/container",
"keywords": [
- "http",
- "http-message",
- "psr",
- "psr-7",
- "request",
- "response"
+ "PSR-11",
+ "container",
+ "container-interface",
+ "container-interop",
+ "psr"
]
},
{
- "name": "pimple/pimple",
- "version": "v3.0.2",
- "version_normalized": "3.0.2.0",
+ "name": "container-interop/container-interop",
+ "version": "1.2.0",
+ "version_normalized": "1.2.0.0",
"source": {
"type": "git",
- "url": "https://github.com/silexphp/Pimple.git",
- "reference": "a30f7d6e57565a2e1a316e1baf2a483f788b258a"
+ "url": "https://github.com/container-interop/container-interop.git",
+ "reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/silexphp/Pimple/zipball/a30f7d6e57565a2e1a316e1baf2a483f788b258a",
- "reference": "a30f7d6e57565a2e1a316e1baf2a483f788b258a",
+ "url": "https://api.github.com/repos/container-interop/container-interop/zipball/79cbf1341c22ec75643d841642dd5d6acd83bdb8",
+ "reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8",
"shasum": ""
},
"require": {
- "php": ">=5.3.0"
+ "psr/container": "^1.0"
},
- "time": "2015-09-11 15:10:35",
+ "time": "2017-02-14T19:40:03+00:00",
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "3.0.x-dev"
- }
- },
"installation-source": "dist",
"autoload": {
- "psr-0": {
- "Pimple": "src/"
+ "psr-4": {
+ "Interop\\Container\\": "src/Interop/Container/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
+ "description": "Promoting the interoperability of container objects (DIC, SL, etc.)",
+ "homepage": "https://github.com/container-interop/container-interop"
+ },
+ {
+ "name": "nikic/fast-route",
+ "version": "v1.2.0",
+ "version_normalized": "1.2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nikic/FastRoute.git",
+ "reference": "b5f95749071c82a8e0f58586987627054400cdf6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nikic/FastRoute/zipball/b5f95749071c82a8e0f58586987627054400cdf6",
+ "reference": "b5f95749071c82a8e0f58586987627054400cdf6",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4.0"
+ },
+ "time": "2017-01-19T11:35:12+00:00",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "FastRoute\\": "src/"
+ },
+ "files": [
+ "src/functions.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
"authors": [
{
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
+ "name": "Nikita Popov",
+ "email": "nikic@php.net"
}
],
- "description": "Pimple, a simple Dependency Injection Container",
- "homepage": "http://pimple.sensiolabs.org",
+ "description": "Fast request router for PHP",
"keywords": [
- "container",
- "dependency injection"
+ "router",
+ "routing"
]
},
{
"name": "slim/slim",
- "version": "3.5.0",
- "version_normalized": "3.5.0.0",
+ "version": "3.8.1",
+ "version_normalized": "3.8.1.0",
"source": {
"type": "git",
"url": "https://github.com/slimphp/Slim.git",
- "reference": "184352bc1913d7ba552ab4131d62f4730ddb0893"
+ "reference": "5385302707530b2bccee1769613ad769859b826d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/slimphp/Slim/zipball/184352bc1913d7ba552ab4131d62f4730ddb0893",
- "reference": "184352bc1913d7ba552ab4131d62f4730ddb0893",
+ "url": "https://api.github.com/repos/slimphp/Slim/zipball/5385302707530b2bccee1769613ad769859b826d",
+ "reference": "5385302707530b2bccee1769613ad769859b826d",
"shasum": ""
},
"require": {
- "container-interop/container-interop": "^1.1",
+ "container-interop/container-interop": "^1.2",
"nikic/fast-route": "^1.0",
"php": ">=5.5.0",
"pimple/pimple": "^3.0",
+ "psr/container": "^1.0",
"psr/http-message": "^1.0"
},
"provide": {
@@ -202,7 +258,7 @@
"phpunit/phpunit": "^4.0",
"squizlabs/php_codesniffer": "^2.5"
},
- "time": "2016-07-26 15:12:13",
+ "time": "2017-03-19T17:55:20+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -237,7 +293,7 @@
}
],
"description": "Slim is a PHP micro framework that helps you quickly write simple yet powerful web applications and APIs",
- "homepage": "http://slimframework.com",
+ "homepage": "https://slimframework.com",
"keywords": [
"api",
"framework",
@@ -247,30 +303,30 @@
},
{
"name": "guzzlehttp/promises",
- "version": "1.2.0",
- "version_normalized": "1.2.0.0",
+ "version": "v1.3.1",
+ "version_normalized": "1.3.1.0",
"source": {
"type": "git",
"url": "https://github.com/guzzle/promises.git",
- "reference": "c10d860e2a9595f8883527fa0021c7da9e65f579"
+ "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/guzzle/promises/zipball/c10d860e2a9595f8883527fa0021c7da9e65f579",
- "reference": "c10d860e2a9595f8883527fa0021c7da9e65f579",
+ "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646",
+ "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646",
"shasum": ""
},
"require": {
"php": ">=5.5.0"
},
"require-dev": {
- "phpunit/phpunit": "~4.0"
+ "phpunit/phpunit": "^4.0"
},
- "time": "2016-05-18 16:56:05",
+ "time": "2016-12-20T10:07:11+00:00",
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.0-dev"
+ "dev-master": "1.4-dev"
}
},
"installation-source": "dist",
@@ -300,17 +356,17 @@
},
{
"name": "guzzlehttp/psr7",
- "version": "1.3.1",
- "version_normalized": "1.3.1.0",
+ "version": "1.4.2",
+ "version_normalized": "1.4.2.0",
"source": {
"type": "git",
"url": "https://github.com/guzzle/psr7.git",
- "reference": "5c6447c9df362e8f8093bda8f5d8873fe5c7f65b"
+ "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/guzzle/psr7/zipball/5c6447c9df362e8f8093bda8f5d8873fe5c7f65b",
- "reference": "5c6447c9df362e8f8093bda8f5d8873fe5c7f65b",
+ "url": "https://api.github.com/repos/guzzle/psr7/zipball/f5b8a8512e2b58b0071a7280e39f14f72e05d87c",
+ "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c",
"shasum": ""
},
"require": {
@@ -323,7 +379,7 @@
"require-dev": {
"phpunit/phpunit": "~4.0"
},
- "time": "2016-06-24 23:00:38",
+ "time": "2017-03-20T17:10:46+00:00",
"type": "library",
"extra": {
"branch-alias": {
@@ -348,34 +404,41 @@
"name": "Michael Dowling",
"email": "mtdowling@gmail.com",
"homepage": "https://github.com/mtdowling"
+ },
+ {
+ "name": "Tobias Schultze",
+ "homepage": "https://github.com/Tobion"
}
],
- "description": "PSR-7 message implementation",
+ "description": "PSR-7 message implementation that also provides common utility methods",
"keywords": [
"http",
"message",
+ "request",
+ "response",
"stream",
- "uri"
+ "uri",
+ "url"
]
},
{
"name": "guzzlehttp/guzzle",
- "version": "6.2.2",
- "version_normalized": "6.2.2.0",
+ "version": "6.2.3",
+ "version_normalized": "6.2.3.0",
"source": {
"type": "git",
"url": "https://github.com/guzzle/guzzle.git",
- "reference": "ebf29dee597f02f09f4d5bbecc68230ea9b08f60"
+ "reference": "8d6c6cc55186db87b7dc5009827429ba4e9dc006"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/guzzle/guzzle/zipball/ebf29dee597f02f09f4d5bbecc68230ea9b08f60",
- "reference": "ebf29dee597f02f09f4d5bbecc68230ea9b08f60",
+ "url": "https://api.github.com/repos/guzzle/guzzle/zipball/8d6c6cc55186db87b7dc5009827429ba4e9dc006",
+ "reference": "8d6c6cc55186db87b7dc5009827429ba4e9dc006",
"shasum": ""
},
"require": {
"guzzlehttp/promises": "^1.0",
- "guzzlehttp/psr7": "^1.3.1",
+ "guzzlehttp/psr7": "^1.4",
"php": ">=5.5"
},
"require-dev": {
@@ -383,7 +446,7 @@
"phpunit/phpunit": "^4.0",
"psr/log": "^1.0"
},
- "time": "2016-10-08 15:01:37",
+ "time": "2017-02-28T22:50:30+00:00",
"type": "library",
"extra": {
"branch-alias": {
@@ -421,5 +484,61 @@
"rest",
"web service"
]
+ },
+ {
+ "name": "abraham/twitteroauth",
+ "version": "0.7.2",
+ "version_normalized": "0.7.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/abraham/twitteroauth.git",
+ "reference": "119d5a83478a2d21c09cd27980ab67eba11c8fe1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/abraham/twitteroauth/zipball/119d5a83478a2d21c09cd27980ab67eba11c8fe1",
+ "reference": "119d5a83478a2d21c09cd27980ab67eba11c8fe1",
+ "shasum": ""
+ },
+ "require": {
+ "ext-curl": "*",
+ "php": "^5.6 || ^7.0"
+ },
+ "require-dev": {
+ "phpmd/phpmd": "~2.4",
+ "phpunit/phpunit": "~5.6",
+ "squizlabs/php_codesniffer": "~2.7"
+ },
+ "time": "2016-12-12T17:42:13+00:00",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Abraham\\TwitterOAuth\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Abraham Williams",
+ "email": "abraham@abrah.am",
+ "homepage": "https://abrah.am",
+ "role": "Developer"
+ }
+ ],
+ "description": "The most popular PHP library for use with the Twitter OAuth REST API.",
+ "homepage": "https://twitteroauth.com",
+ "keywords": [
+ "Twitter API",
+ "Twitter oAuth",
+ "api",
+ "oauth",
+ "rest",
+ "social",
+ "twitter"
+ ]
}
]
diff --git a/server/vendor/container-interop/container-interop/README.md b/server/vendor/container-interop/container-interop/README.md
index ec434d0..cdd7a44 100644
--- a/server/vendor/container-interop/container-interop/README.md
+++ b/server/vendor/container-interop/container-interop/README.md
@@ -1,11 +1,25 @@
# Container Interoperability
[![Latest Stable Version](https://poser.pugx.org/container-interop/container-interop/v/stable.png)](https://packagist.org/packages/container-interop/container-interop)
+[![Total Downloads](https://poser.pugx.org/container-interop/container-interop/downloads.svg)](https://packagist.org/packages/container-interop/container-interop)
+
+## Deprecation warning!
+
+Starting Feb. 13th 2017, container-interop is officially deprecated in favor of [PSR-11](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-11-container.md).
+Container-interop has been the test-bed of PSR-11. From v1.2, container-interop directly extends PSR-11 interfaces.
+Therefore, all containers implementing container-interop are now *de-facto* compatible with PSR-11.
+
+- Projects implementing container-interop interfaces are encouraged to directly implement PSR-11 interfaces instead.
+- Projects consuming container-interop interfaces are very strongly encouraged to directly type-hint on PSR-11 interfaces, in order to be compatible with PSR-11 containers that are not compatible with container-interop.
+
+Regarding the delegate lookup feature, that is present in container-interop and not in PSR-11, the feature is actually a design pattern. It is therefore not deprecated. Documentation regarding this design pattern will be migrated from this repository into a separate website in the future.
+
+## About
*container-interop* tries to identify and standardize features in *container* objects (service locators,
-dependency injection containers, etc.) to achieve interopererability.
+dependency injection containers, etc.) to achieve interoperability.
-Through discussions and trials, we try to create a standard, made of common interfaces but also recommendations.
+Through discussions and trials, we try to create a standard, made of common interfaces but also recommendations.
If PHP projects that provide container implementations begin to adopt these common standards, then PHP
applications and projects that use containers can depend on the common interfaces instead of specific
@@ -22,11 +36,7 @@ this project will pave the way for one or more future PSRs.
You can install this package through Composer:
```json
-{
- "require": {
- "container-interop/container-interop": "~1.0"
- }
-}
+composer require container-interop/container-interop
```
The packages adheres to the [SemVer](http://semver.org/) specification, and there will be full backward compatibility
@@ -41,7 +51,7 @@ between minor versions.
Describes the interface of a container that exposes methods to read its entries.
- [*Delegate lookup feature*](docs/Delegate-lookup.md).
[Meta Document](docs/Delegate-lookup-meta.md).
-Describes the ability for a container to delegate the lookup of its dependencies to a third-party container. This
+Describes the ability for a container to delegate the lookup of its dependencies to a third-party container. This
feature lets several containers work together in a single application.
### Proposed
@@ -52,19 +62,72 @@ View open [request for comments](https://github.com/container-interop/container-
### Projects implementing `ContainerInterface`
-- [Acclimate](https://github.com/jeremeamia/acclimate-container)
-- [dcp-di](https://github.com/estelsmith/dcp-di)
+- [Acclimate](https://github.com/jeremeamia/acclimate-container): Adapters for
+ Aura.Di, Laravel, Nette DI, Pimple, Symfony DI, ZF2 Service manager, ZF2
+ Dependency injection and any container using `ArrayAccess`
+- [Aura.Di](https://github.com/auraphp/Aura.Di)
+- [auryn-container-interop](https://github.com/elazar/auryn-container-interop)
+- [Burlap](https://github.com/codeeverything/burlap)
+- [Chernozem](https://github.com/pyrsmk/Chernozem)
+- [Data Manager](https://github.com/chrismichaels84/data-manager)
+- [Disco](https://github.com/bitexpert/disco)
+- [InDI](https://github.com/idealogica/indi)
+- [League/Container](http://container.thephpleague.com/)
- [Mouf](http://mouf-php.com)
- [Njasm Container](https://github.com/njasm/container)
- [PHP-DI](http://php-di.org)
+- [Picotainer](https://github.com/thecodingmachine/picotainer)
- [PimpleInterop](https://github.com/moufmouf/pimple-interop)
+- [Pimple3-ContainerInterop](https://github.com/Sam-Burns/pimple3-containerinterop) (using Pimple v3)
+- [SitePoint Container](https://github.com/sitepoint/Container)
+- [Thruster Container](https://github.com/ThrusterIO/container) (PHP7 only)
+- [Ultra-Lite Container](https://github.com/ultra-lite/container)
+- [Unbox](https://github.com/mindplay-dk/unbox)
- [XStatic](https://github.com/jeremeamia/xstatic)
+- [Zend\ServiceManager](https://github.com/zendframework/zend-servicemanager)
+- [Zit](https://github.com/inxilpro/Zit)
### Projects implementing the *delegate lookup* feature
+- [Aura.Di](https://github.com/auraphp/Aura.Di)
+- [Burlap](https://github.com/codeeverything/burlap)
+- [Chernozem](https://github.com/pyrsmk/Chernozem)
+- [InDI](https://github.com/idealogica/indi)
+- [League/Container](http://container.thephpleague.com/)
- [Mouf](http://mouf-php.com)
+- [Picotainer](https://github.com/thecodingmachine/picotainer)
- [PHP-DI](http://php-di.org)
- [PimpleInterop](https://github.com/moufmouf/pimple-interop)
+- [Ultra-Lite Container](https://github.com/ultra-lite/container)
+
+### Middlewares implementing `ContainerInterface`
+
+- [Alias-Container](https://github.com/thecodingmachine/alias-container): add
+ aliases support to any container
+- [Prefixer-Container](https://github.com/thecodingmachine/prefixer-container):
+ dynamically prefix identifiers
+- [Lazy-Container](https://github.com/snapshotpl/lazy-container): lazy services
+
+### Projects using `ContainerInterface`
+
+The list below contains only a sample of all the projects consuming `ContainerInterface`. For a more complete list have a look [here](http://packanalyst.com/class?q=Interop%5CContainer%5CContainerInterface).
+
+| | Downloads |
+| --- | --- |
+| [Adroit](https://github.com/bitexpert/adroit) | ![](https://img.shields.io/packagist/dt/bitexpert/adroit.svg) |
+| [Behat](https://github.com/Behat/Behat/pull/974) | ![](https://img.shields.io/packagist/dt/behat/behat.svg) |
+| [blast-facades](https://github.com/phpthinktank/blast-facades): Minimize complexity and represent dependencies as facades. | ![](https://img.shields.io/packagist/dt/blast/facades.svg) |
+| [interop.silex.di](https://github.com/thecodingmachine/interop.silex.di): an extension to [Silex](http://silex.sensiolabs.org/) that adds support for any *container-interop* compatible container | ![](https://img.shields.io/packagist/dt/mouf/interop.silex.di.svg) |
+| [mindplay/walkway](https://github.com/mindplay-dk/walkway): a modular request router | ![](https://img.shields.io/packagist/dt/mindplay/walkway.svg) |
+| [mindplay/middleman](https://github.com/mindplay-dk/middleman): minimalist PSR-7 middleware dispatcher | ![](https://img.shields.io/packagist/dt/mindplay/middleman.svg) |
+| [PHP-DI/Invoker](https://github.com/PHP-DI/Invoker): extensible and configurable invoker/dispatcher | ![](https://img.shields.io/packagist/dt/php-di/invoker.svg) |
+| [Prophiler](https://github.com/fabfuel/prophiler) | ![](https://img.shields.io/packagist/dt/fabfuel/prophiler.svg) |
+| [Silly](https://github.com/mnapoli/silly): CLI micro-framework | ![](https://img.shields.io/packagist/dt/mnapoli/silly.svg) |
+| [Slim v3](https://github.com/slimphp/Slim) | ![](https://img.shields.io/packagist/dt/slim/slim.svg) |
+| [Splash](http://mouf-php.com/packages/mouf/mvc.splash-common/version/8.0-dev/README.md) | ![](https://img.shields.io/packagist/dt/mouf/mvc.splash-common.svg) |
+| [Woohoo Labs. Harmony](https://github.com/woohoolabs/harmony): a flexible micro-framework | ![](https://img.shields.io/packagist/dt/woohoolabs/harmony.svg) |
+| [zend-expressive](https://github.com/zendframework/zend-expressive) | ![](https://img.shields.io/packagist/dt/zendframework/zend-expressive.svg) |
+
## Workflow
diff --git a/server/vendor/container-interop/container-interop/composer.json b/server/vendor/container-interop/container-interop/composer.json
index 84f3875..855f766 100644
--- a/server/vendor/container-interop/container-interop/composer.json
+++ b/server/vendor/container-interop/container-interop/composer.json
@@ -2,10 +2,14 @@
"name": "container-interop/container-interop",
"type": "library",
"description": "Promoting the interoperability of container objects (DIC, SL, etc.)",
+ "homepage": "https://github.com/container-interop/container-interop",
"license": "MIT",
"autoload": {
"psr-4": {
"Interop\\Container\\": "src/Interop/Container/"
}
+ },
+ "require": {
+ "psr/container": "^1.0"
}
}
diff --git a/server/vendor/container-interop/container-interop/docs/ContainerInterface-meta.md b/server/vendor/container-interop/container-interop/docs/ContainerInterface-meta.md
index 90711c9..59f3d55 100644
--- a/server/vendor/container-interop/container-interop/docs/ContainerInterface-meta.md
+++ b/server/vendor/container-interop/container-interop/docs/ContainerInterface-meta.md
@@ -54,7 +54,7 @@ The summary of the analysis showed that:
- all containers offer a method to get an entry by its id
- a large majority name such method `get()`
- for all containers, the `get()` method has 1 mandatory parameter of type string
-- some containers have an optional additional argument for `get()`, but it doesn't same the same purpose between containers
+- some containers have an optional additional argument for `get()`, but it doesn't have the same purpose between containers
- a large majority of the containers offer a method to test if it can return an entry by its id
- a majority name such method `has()`
- for all containers offering `has()`, the method has exactly 1 parameter of type string
diff --git a/server/vendor/container-interop/container-interop/docs/ContainerInterface.md b/server/vendor/container-interop/container-interop/docs/ContainerInterface.md
index 9f60967..bda973d 100644
--- a/server/vendor/container-interop/container-interop/docs/ContainerInterface.md
+++ b/server/vendor/container-interop/container-interop/docs/ContainerInterface.md
@@ -11,8 +11,8 @@ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD",
interpreted as described in [RFC 2119][].
The word `implementor` in this document is to be interpreted as someone
-implementing the `ContainerInterface` in a depency injection-related library or framework.
-Users of dependency injections containers (DIC) are refered to as `user`.
+implementing the `ContainerInterface` in a dependency injection-related library or framework.
+Users of dependency injections containers (DIC) are referred to as `user`.
[RFC 2119]: http://tools.ietf.org/html/rfc2119
@@ -31,50 +31,52 @@ Users of dependency injections containers (DIC) are refered to as `user`.
`user` SHOULD NOT rely on getting the same value on 2 successive calls.
While `ContainerInterface` only defines one mandatory parameter in `get()`, implementations
MAY accept additional optional parameters.
-
+
- `has` takes one unique parameter: an entry identifier. It MUST return `true`
if an entry identifier is known to the container and `false` if it is not.
-
+ `has($id)` returning true does not mean that `get($id)` will not throw an exception.
+ It does however mean that `get($id)` will not throw a `NotFoundException`.
+
### 1.2 Exceptions
-Exceptions directly thrown by the container MUST implement the
+Exceptions directly thrown by the container MUST implement the
[`Interop\Container\Exception\ContainerException`](../src/Interop/Container/Exception/ContainerException.php).
-A call to the `get` method with a non-existing id should throw a
+A call to the `get` method with a non-existing id SHOULD throw a
[`Interop\Container\Exception\NotFoundException`](../src/Interop/Container/Exception/NotFoundException.php).
### 1.3 Additional features
-This section describes additional features that MAY be added to a container. Containers are not
+This section describes additional features that MAY be added to a container. Containers are not
required to implement these features to respect the ContainerInterface.
#### 1.3.1 Delegate lookup feature
-The goal of the *delegate lookup* feature is to allow several containers to share entries.
+The goal of the *delegate lookup* feature is to allow several containers to share entries.
Containers implementing this feature can perform dependency lookups in other containers.
-Containers implementing this feature will offer a greater lever of interoperability
+Containers implementing this feature will offer a greater lever of interoperability
with other containers. Implementation of this feature is therefore RECOMMENDED.
A container implementing this feature:
- MUST implement the `ContainerInterface`
-- MUST provide a way to register a delegate container (using a constructor parameter, or a setter,
+- MUST provide a way to register a delegate container (using a constructor parameter, or a setter,
or any possible way). The delegate container MUST implement the `ContainerInterface`.
When a container is configured to use a delegate container for dependencies:
-- Calls to the `get` method should only return an entry if the entry is part of the container.
- If the entry is not part of the container, an exception should be thrown
+- Calls to the `get` method should only return an entry if the entry is part of the container.
+ If the entry is not part of the container, an exception should be thrown
(as requested by the `ContainerInterface`).
- Calls to the `has` method should only return `true` if the entry is part of the container.
If the entry is not part of the container, `false` should be returned.
-- If the fetched entry has dependencies, **instead** of performing
+- If the fetched entry has dependencies, **instead** of performing
the dependency lookup in the container, the lookup is performed on the *delegate container*.
Important! By default, the lookup SHOULD be performed on the delegate container **only**, not on the container itself.
-It is however allowed for containers to provide exception cases for special entries, and a way to lookup
+It is however allowed for containers to provide exception cases for special entries, and a way to lookup
into the same container (or another container) instead of the delegate container.
2. Package
@@ -114,6 +116,9 @@ interface ContainerInterface
* Returns true if the container can return an entry for the given identifier.
* Returns false otherwise.
*
+ * `has($id)` returning true does not mean that `get($id)` will not throw an exception.
+ * It does however mean that `get($id)` will not throw a `NotFoundException`.
+ *
* @param string $id Identifier of the entry to look for.
*
* @return boolean
diff --git a/server/vendor/container-interop/container-interop/docs/Delegate-lookup-meta.md b/server/vendor/container-interop/container-interop/docs/Delegate-lookup-meta.md
index d21ebf9..6048b73 100644
--- a/server/vendor/container-interop/container-interop/docs/Delegate-lookup-meta.md
+++ b/server/vendor/container-interop/container-interop/docs/Delegate-lookup-meta.md
@@ -89,16 +89,16 @@ In the example above, "container 2" contains a controller "myController" and the
Without the *delegate lookup* feature, when requesting the "myController" instance to container 2, it would take
in charge the instanciation of both entries.
-However, using the *delegate lookup* feature, here is what happens when we ask the composite controller for the
+However, using the *delegate lookup* feature, here is what happens when we ask the composite container for the
"myController" instance:
-- The composite controller asks container 1 if if contains the "myController" instance. The answer is no.
-- The composite controller asks container 2 if if contains the "myController" instance. The answer is yes.
-- The composite controller performs a `get` call on container 2 for the "myController" instance.
+- The composite container asks container 1 if if contains the "myController" instance. The answer is no.
+- The composite container asks container 2 if if contains the "myController" instance. The answer is yes.
+- The composite container performs a `get` call on container 2 for the "myController" instance.
- Container 2 sees that "myController" has a dependency on "entityManager".
-- Container 2 delegates the lookup of "entityManager" to the composite controller.
-- The composite controller asks container 1 if if contains the "entityManager" instance. The answer is yes.
-- The composite controller performs a `get` call on container 1 for the "entityManager" instance.
+- Container 2 delegates the lookup of "entityManager" to the composite container.
+- The composite container asks container 1 if if contains the "entityManager" instance. The answer is yes.
+- The composite container performs a `get` call on container 1 for the "entityManager" instance.
In the end, we get a controller instanciated by container 2 that references an entityManager instanciated
by container 1.
diff --git a/server/vendor/container-interop/container-interop/docs/Delegate-lookup.md b/server/vendor/container-interop/container-interop/docs/Delegate-lookup.md
index 04eb3ae..f64a8f7 100644
--- a/server/vendor/container-interop/container-interop/docs/Delegate-lookup.md
+++ b/server/vendor/container-interop/container-interop/docs/Delegate-lookup.md
@@ -3,10 +3,10 @@ Delegate lookup feature
This document describes a standard for dependency injection containers.
-The goal set by the *delegate lookup* feature is to allow several containers to share entries.
+The goal set by the *delegate lookup* feature is to allow several containers to share entries.
Containers implementing this feature can perform dependency lookups in other containers.
-Containers implementing this feature will offer a greater lever of interoperability
+Containers implementing this feature will offer a greater lever of interoperability
with other containers. Implementation of this feature is therefore RECOMMENDED.
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD",
@@ -15,7 +15,7 @@ interpreted as described in [RFC 2119][].
The word `implementor` in this document is to be interpreted as someone
implementing the delegate lookup feature in a dependency injection-related library or framework.
-Users of dependency injections containers (DIC) are refered to as `user`.
+Users of dependency injections containers (DIC) are referred to as `user`.
[RFC 2119]: http://tools.ietf.org/html/rfc2119
@@ -36,22 +36,22 @@ fetching the dependencies from.
A container implementing the *delegate lookup* feature:
- MUST implement the [`ContainerInterface`](ContainerInterface.md)
-- MUST provide a way to register a delegate container (using a constructor parameter, or a setter,
+- MUST provide a way to register a delegate container (using a constructor parameter, or a setter,
or any possible way). The delegate container MUST implement the [`ContainerInterface`](ContainerInterface.md).
When a container is configured to use a delegate container for dependencies:
- Calls to the `get` method should only return an entry if the entry is part of the container.
- If the entry is not part of the container, an exception should be thrown
+ If the entry is not part of the container, an exception should be thrown
(as requested by the [`ContainerInterface`](ContainerInterface.md)).
- Calls to the `has` method should only return `true` if the entry is part of the container.
If the entry is not part of the container, `false` should be returned.
-- If the fetched entry has dependencies, **instead** of performing
+- If the fetched entry has dependencies, **instead** of performing
the dependency lookup in the container, the lookup is performed on the *delegate container*.
Important: By default, the dependency lookups SHOULD be performed on the delegate container **only**, not on the container itself.
-It is however allowed for containers to provide exception cases for special entries, and a way to lookup
+It is however allowed for containers to provide exception cases for special entries, and a way to lookup
into the same container (or another container) instead of the delegate container.
3. Package / Interface
diff --git a/server/vendor/container-interop/container-interop/docs/images/interoperating_containers.png b/server/vendor/container-interop/container-interop/docs/images/interoperating_containers.png
index 9c672e1..1d3fdd0 100644
--- a/server/vendor/container-interop/container-interop/docs/images/interoperating_containers.png
+++ b/server/vendor/container-interop/container-interop/docs/images/interoperating_containers.png
Binary files differ
diff --git a/server/vendor/container-interop/container-interop/docs/images/priority.png b/server/vendor/container-interop/container-interop/docs/images/priority.png
index 5760dc7..d02cb7d 100644
--- a/server/vendor/container-interop/container-interop/docs/images/priority.png
+++ b/server/vendor/container-interop/container-interop/docs/images/priority.png
Binary files differ
diff --git a/server/vendor/container-interop/container-interop/docs/images/side_by_side_containers.png b/server/vendor/container-interop/container-interop/docs/images/side_by_side_containers.png
index 24ca03c..87884bc 100644
--- a/server/vendor/container-interop/container-interop/docs/images/side_by_side_containers.png
+++ b/server/vendor/container-interop/container-interop/docs/images/side_by_side_containers.png
Binary files differ
diff --git a/server/vendor/container-interop/container-interop/src/Interop/Container/ContainerInterface.php b/server/vendor/container-interop/container-interop/src/Interop/Container/ContainerInterface.php
index dee5ffa..a75468f 100644
--- a/server/vendor/container-interop/container-interop/src/Interop/Container/ContainerInterface.php
+++ b/server/vendor/container-interop/container-interop/src/Interop/Container/ContainerInterface.php
@@ -5,33 +5,11 @@
namespace Interop\Container;
-use Interop\Container\Exception\ContainerException;
-use Interop\Container\Exception\NotFoundException;
+use Psr\Container\ContainerInterface as PsrContainerInterface;
/**
* Describes the interface of a container that exposes methods to read its entries.
*/
-interface ContainerInterface
+interface ContainerInterface extends PsrContainerInterface
{
- /**
- * Finds an entry of the container by its identifier and returns it.
- *
- * @param string $id Identifier of the entry to look for.
- *
- * @throws NotFoundException No entry was found for this identifier.
- * @throws ContainerException Error while retrieving the entry.
- *
- * @return mixed Entry.
- */
- public function get($id);
-
- /**
- * Returns true if the container can return an entry for the given identifier.
- * Returns false otherwise.
- *
- * @param string $id Identifier of the entry to look for.
- *
- * @return boolean
- */
- public function has($id);
}
diff --git a/server/vendor/container-interop/container-interop/src/Interop/Container/Exception/ContainerException.php b/server/vendor/container-interop/container-interop/src/Interop/Container/Exception/ContainerException.php
index d867434..3964061 100644
--- a/server/vendor/container-interop/container-interop/src/Interop/Container/Exception/ContainerException.php
+++ b/server/vendor/container-interop/container-interop/src/Interop/Container/Exception/ContainerException.php
@@ -5,9 +5,11 @@
namespace Interop\Container\Exception;
+use Psr\Container\ContainerExceptionInterface as PsrContainerException;
+
/**
* Base interface representing a generic exception in a container.
*/
-interface ContainerException
+interface ContainerException extends PsrContainerException
{
}
diff --git a/server/vendor/container-interop/container-interop/src/Interop/Container/Exception/NotFoundException.php b/server/vendor/container-interop/container-interop/src/Interop/Container/Exception/NotFoundException.php
index 714d7a9..031b3ab 100644
--- a/server/vendor/container-interop/container-interop/src/Interop/Container/Exception/NotFoundException.php
+++ b/server/vendor/container-interop/container-interop/src/Interop/Container/Exception/NotFoundException.php
@@ -5,9 +5,11 @@
namespace Interop\Container\Exception;
+use Psr\Container\NotFoundExceptionInterface as PsrNotFoundException;
+
/**
* No entry was found in the container.
*/
-interface NotFoundException extends ContainerException
+interface NotFoundException extends ContainerException, PsrNotFoundException
{
}
diff --git a/server/vendor/guzzlehttp/guzzle/CHANGELOG.md b/server/vendor/guzzlehttp/guzzle/CHANGELOG.md
index b2edd2e..dbce4ac 100644
--- a/server/vendor/guzzlehttp/guzzle/CHANGELOG.md
+++ b/server/vendor/guzzlehttp/guzzle/CHANGELOG.md
@@ -1,5 +1,9 @@
# CHANGELOG
+## 6.2.3 - 2017-02-28
+
+* Fix deprecations with guzzle/psr7 version 1.4
+
## 6.2.2 - 2016-10-08
* Allow to pass nullable Response to delay callable
diff --git a/server/vendor/guzzlehttp/guzzle/composer.json b/server/vendor/guzzlehttp/guzzle/composer.json
index 218c247..0f4f94a 100644
--- a/server/vendor/guzzlehttp/guzzle/composer.json
+++ b/server/vendor/guzzlehttp/guzzle/composer.json
@@ -14,7 +14,7 @@
],
"require": {
"php": ">=5.5",
- "guzzlehttp/psr7": "^1.3.1",
+ "guzzlehttp/psr7": "^1.4",
"guzzlehttp/promises": "^1.0"
},
"require-dev": {
diff --git a/server/vendor/guzzlehttp/guzzle/src/Client.php b/server/vendor/guzzlehttp/guzzle/src/Client.php
index b14574d..2e4cead 100644
--- a/server/vendor/guzzlehttp/guzzle/src/Client.php
+++ b/server/vendor/guzzlehttp/guzzle/src/Client.php
@@ -142,7 +142,7 @@ class Client implements ClientInterface
$uri = Psr7\uri_for($uri === null ? '' : $uri);
if (isset($config['base_uri'])) {
- $uri = Psr7\Uri::resolve(Psr7\uri_for($config['base_uri']), $uri);
+ $uri = Psr7\UriResolver::resolve(Psr7\uri_for($config['base_uri']), $uri);
}
return $uri->getScheme() === '' && $uri->getHost() !== '' ? $uri->withScheme('http') : $uri;
diff --git a/server/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php b/server/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php
index dbe8b87..5613f6e 100644
--- a/server/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php
+++ b/server/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php
@@ -208,9 +208,9 @@ class RedirectMiddleware
ResponseInterface $response,
array $protocols
) {
- $location = Psr7\Uri::resolve(
+ $location = Psr7\UriResolver::resolve(
$request->getUri(),
- $response->getHeaderLine('Location')
+ new Psr7\Uri($response->getHeaderLine('Location'))
);
// Ensure that the redirect URI is allowed based on the protocols.
diff --git a/server/vendor/guzzlehttp/guzzle/src/RequestOptions.php b/server/vendor/guzzlehttp/guzzle/src/RequestOptions.php
index 3af2f36..60e53f5 100644
--- a/server/vendor/guzzlehttp/guzzle/src/RequestOptions.php
+++ b/server/vendor/guzzlehttp/guzzle/src/RequestOptions.php
@@ -43,8 +43,8 @@ final class RequestOptions
const AUTH = 'auth';
/**
- * body: (string|null|callable|iterator|object) Body to send in the
- * request.
+ * body: (resource|string|null|int|float|StreamInterface|callable|\Iterator)
+ * Body to send in the request.
*/
const BODY = 'body';
diff --git a/server/vendor/guzzlehttp/promises/.gitignore b/server/vendor/guzzlehttp/promises/.gitignore
deleted file mode 100644
index 83ec41e..0000000
--- a/server/vendor/guzzlehttp/promises/.gitignore
+++ /dev/null
@@ -1,11 +0,0 @@
-phpunit.xml
-composer.phar
-composer.lock
-composer-test.lock
-vendor/
-build/artifacts/
-artifacts/
-docs/_build
-docs/*.pyc
-.idea
-.DS_STORE
diff --git a/server/vendor/guzzlehttp/promises/.travis.yml b/server/vendor/guzzlehttp/promises/.travis.yml
deleted file mode 100644
index 4f4d2b8..0000000
--- a/server/vendor/guzzlehttp/promises/.travis.yml
+++ /dev/null
@@ -1,19 +0,0 @@
-language: php
-
-php:
- - 5.5
- - 5.6
- - 7.0
- - hhvm
-
-sudo: false
-
-install:
- - travis_retry composer install --no-interaction --prefer-source
-
-script: make test
-
-matrix:
- allow_failures:
- - php: hhvm
- fast_finish: true
diff --git a/server/vendor/guzzlehttp/promises/CHANGELOG.md b/server/vendor/guzzlehttp/promises/CHANGELOG.md
index 99603e5..551929f 100644
--- a/server/vendor/guzzlehttp/promises/CHANGELOG.md
+++ b/server/vendor/guzzlehttp/promises/CHANGELOG.md
@@ -1,31 +1,65 @@
# CHANGELOG
+
+## 1.3.1 - 2016-12-20
+
+### Fixed
+
+- `wait()` foreign promise compatibility
+
+
+## 1.3.0 - 2016-11-18
+
+### Added
+
+- Adds support for custom task queues.
+
+### Fixed
+
+- Fixed coroutine promise memory leak.
+
+
## 1.2.0 - 2016-05-18
-* Update to now catch `\Throwable` on PHP 7+
+### Changed
+
+- Update to now catch `\Throwable` on PHP 7+
+
## 1.1.0 - 2016-03-07
-* Update EachPromise to prevent recurring on a iterator when advancing, as this
+### Changed
+
+- Update EachPromise to prevent recurring on a iterator when advancing, as this
could trigger fatal generator errors.
-* Update Promise to allow recursive waiting without unwrapping exceptions.
+- Update Promise to allow recursive waiting without unwrapping exceptions.
+
## 1.0.3 - 2015-10-15
-* Update EachPromise to immediately resolve when the underlying promise iterator
+### Changed
+
+- Update EachPromise to immediately resolve when the underlying promise iterator
is empty. Previously, such a promise would throw an exception when its `wait`
function was called.
+
## 1.0.2 - 2015-05-15
-* Conditionally require functions.php.
+### Changed
+
+- Conditionally require functions.php.
+
## 1.0.1 - 2015-06-24
-* Updating EachPromise to call next on the underlying promise iterator as late
+### Changed
+
+- Updating EachPromise to call next on the underlying promise iterator as late
as possible to ensure that generators that generate new requests based on
callbacks are not iterated until after callbacks are invoked.
+
## 1.0.0 - 2015-05-12
-* Initial release
+- Initial release
diff --git a/server/vendor/guzzlehttp/promises/LICENSE b/server/vendor/guzzlehttp/promises/LICENSE
index 581d95f..67f91a1 100644
--- a/server/vendor/guzzlehttp/promises/LICENSE
+++ b/server/vendor/guzzlehttp/promises/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2015 Michael Dowling, https://github.com/mtdowling <mtdowling@gmail.com>
+Copyright (c) 2015-2016 Michael Dowling, https://github.com/mtdowling <mtdowling@gmail.com>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/server/vendor/guzzlehttp/promises/README.md b/server/vendor/guzzlehttp/promises/README.md
index 0dea840..7b607e2 100644
--- a/server/vendor/guzzlehttp/promises/README.md
+++ b/server/vendor/guzzlehttp/promises/README.md
@@ -96,7 +96,7 @@ $promise->resolve('reader.');
## Promise forwarding
Promises can be chained one after the other. Each then in the chain is a new
-promise. The return value of of a promise is what's forwarded to the next
+promise. The return value of a promise is what's forwarded to the next
promise in the chain. Returning a promise in a `then` callback will cause the
subsequent promises in the chain to only be fulfilled when the returned promise
has been fulfilled. The next promise in the chain will be invoked with the
@@ -315,8 +315,11 @@ A promise has the following methods:
- `then(callable $onFulfilled, callable $onRejected) : PromiseInterface`
- Creates a new promise that is fulfilled or rejected when the promise is
- resolved.
+ Appends fulfillment and rejection handlers to the promise, and returns a new promise resolving to the return value of the called handler.
+
+- `otherwise(callable $onRejected) : PromiseInterface`
+
+ Appends a rejection handler callback to the promise, and returns a new promise resolving to the return value of the callback if it is called, or to its original fulfillment value if the promise is instead fulfilled.
- `wait($unwrap = true) : mixed`
diff --git a/server/vendor/guzzlehttp/promises/composer.json b/server/vendor/guzzlehttp/promises/composer.json
index f13844b..ec41a61 100644
--- a/server/vendor/guzzlehttp/promises/composer.json
+++ b/server/vendor/guzzlehttp/promises/composer.json
@@ -1,6 +1,5 @@
{
"name": "guzzlehttp/promises",
- "type": "library",
"description": "Guzzle promises library",
"keywords": ["promise"],
"license": "MIT",
@@ -15,7 +14,7 @@
"php": ">=5.5.0"
},
"require-dev": {
- "phpunit/phpunit": "~4.0"
+ "phpunit/phpunit": "^4.0"
},
"autoload": {
"psr-4": {
@@ -23,9 +22,13 @@
},
"files": ["src/functions_include.php"]
},
+ "scripts": {
+ "test": "vendor/bin/phpunit",
+ "test-ci": "vendor/bin/phpunit --coverage-text"
+ },
"extra": {
"branch-alias": {
- "dev-master": "1.0-dev"
+ "dev-master": "1.4-dev"
}
}
}
diff --git a/server/vendor/guzzlehttp/promises/phpunit.xml.dist b/server/vendor/guzzlehttp/promises/phpunit.xml.dist
deleted file mode 100644
index 500cd53..0000000
--- a/server/vendor/guzzlehttp/promises/phpunit.xml.dist
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<phpunit bootstrap="./tests/bootstrap.php"
- colors="true">
- <testsuites>
- <testsuite>
- <directory>tests</directory>
- </testsuite>
- </testsuites>
- <filter>
- <whitelist>
- <directory suffix=".php">src</directory>
- <exclude>
- <directory suffix="Interface.php">src/</directory>
- </exclude>
- </whitelist>
- </filter>
-</phpunit>
diff --git a/server/vendor/guzzlehttp/promises/src/Coroutine.php b/server/vendor/guzzlehttp/promises/src/Coroutine.php
new file mode 100644
index 0000000..6aa0958
--- /dev/null
+++ b/server/vendor/guzzlehttp/promises/src/Coroutine.php
@@ -0,0 +1,151 @@
+<?php
+namespace GuzzleHttp\Promise;
+
+use Exception;
+use Generator;
+use Throwable;
+
+/**
+ * Creates a promise that is resolved using a generator that yields values or
+ * promises (somewhat similar to C#'s async keyword).
+ *
+ * When called, the coroutine function will start an instance of the generator
+ * and returns a promise that is fulfilled with its final yielded value.
+ *
+ * Control is returned back to the generator when the yielded promise settles.
+ * This can lead to less verbose code when doing lots of sequential async calls
+ * with minimal processing in between.
+ *
+ * use GuzzleHttp\Promise;
+ *
+ * function createPromise($value) {
+ * return new Promise\FulfilledPromise($value);
+ * }
+ *
+ * $promise = Promise\coroutine(function () {
+ * $value = (yield createPromise('a'));
+ * try {
+ * $value = (yield createPromise($value . 'b'));
+ * } catch (\Exception $e) {
+ * // The promise was rejected.
+ * }
+ * yield $value . 'c';
+ * });
+ *
+ * // Outputs "abc"
+ * $promise->then(function ($v) { echo $v; });
+ *
+ * @param callable $generatorFn Generator function to wrap into a promise.
+ *
+ * @return Promise
+ * @link https://github.com/petkaantonov/bluebird/blob/master/API.md#generators inspiration
+ */
+final class Coroutine implements PromiseInterface
+{
+ /**
+ * @var PromiseInterface|null
+ */
+ private $currentPromise;
+
+ /**
+ * @var Generator
+ */
+ private $generator;
+
+ /**
+ * @var Promise
+ */
+ private $result;
+
+ public function __construct(callable $generatorFn)
+ {
+ $this->generator = $generatorFn();
+ $this->result = new Promise(function () {
+ while (isset($this->currentPromise)) {
+ $this->currentPromise->wait();
+ }
+ });
+ $this->nextCoroutine($this->generator->current());
+ }
+
+ public function then(
+ callable $onFulfilled = null,
+ callable $onRejected = null
+ ) {
+ return $this->result->then($onFulfilled, $onRejected);
+ }
+
+ public function otherwise(callable $onRejected)
+ {
+ return $this->result->otherwise($onRejected);
+ }
+
+ public function wait($unwrap = true)
+ {
+ return $this->result->wait($unwrap);
+ }
+
+ public function getState()
+ {
+ return $this->result->getState();
+ }
+
+ public function resolve($value)
+ {
+ $this->result->resolve($value);
+ }
+
+ public function reject($reason)
+ {
+ $this->result->reject($reason);
+ }
+
+ public function cancel()
+ {
+ $this->currentPromise->cancel();
+ $this->result->cancel();
+ }
+
+ private function nextCoroutine($yielded)
+ {
+ $this->currentPromise = promise_for($yielded)
+ ->then([$this, '_handleSuccess'], [$this, '_handleFailure']);
+ }
+
+ /**
+ * @internal
+ */
+ public function _handleSuccess($value)
+ {
+ unset($this->currentPromise);
+ try {
+ $next = $this->generator->send($value);
+ if ($this->generator->valid()) {
+ $this->nextCoroutine($next);
+ } else {
+ $this->result->resolve($value);
+ }
+ } catch (Exception $exception) {
+ $this->result->reject($exception);
+ } catch (Throwable $throwable) {
+ $this->result->reject($throwable);
+ }
+ }
+
+ /**
+ * @internal
+ */
+ public function _handleFailure($reason)
+ {
+ unset($this->currentPromise);
+ try {
+ $nextYield = $this->generator->throw(exception_for($reason));
+ // The throw was caught, so keep iterating on the coroutine
+ $this->nextCoroutine($nextYield);
+ } catch (Exception $exception) {
+ $this->result->reject($exception);
+ } catch (Throwable $throwable) {
+ $this->result->reject($throwable);
+ }
+ }
+}
diff --git a/server/vendor/guzzlehttp/promises/src/Promise.php b/server/vendor/guzzlehttp/promises/src/Promise.php
index 04f3ea0..844ada0 100644
--- a/server/vendor/guzzlehttp/promises/src/Promise.php
+++ b/server/vendor/guzzlehttp/promises/src/Promise.php
@@ -263,10 +263,17 @@ class Promise implements PromiseInterface
$this->waitList = null;
foreach ($waitList as $result) {
- $result->waitIfPending();
- while ($result->result instanceof Promise) {
- $result = $result->result;
+ while (true) {
$result->waitIfPending();
+
+ if ($result->result instanceof Promise) {
+ $result = $result->result;
+ } else {
+ if ($result->result instanceof PromiseInterface) {
+ $result->result->wait(false);
+ }
+ break;
+ }
}
}
}
diff --git a/server/vendor/guzzlehttp/promises/src/TaskQueue.php b/server/vendor/guzzlehttp/promises/src/TaskQueue.php
index 39fe5bb..6e8a2a0 100644
--- a/server/vendor/guzzlehttp/promises/src/TaskQueue.php
+++ b/server/vendor/guzzlehttp/promises/src/TaskQueue.php
@@ -10,7 +10,7 @@ namespace GuzzleHttp\Promise;
*
* GuzzleHttp\Promise\queue()->run();
*/
-class TaskQueue
+class TaskQueue implements TaskQueueInterface
{
private $enableShutdown = true;
private $queue = [];
@@ -30,30 +30,16 @@ class TaskQueue
}
}
- /**
- * Returns true if the queue is empty.
- *
- * @return bool
- */
public function isEmpty()
{
return !$this->queue;
}
- /**
- * Adds a task to the queue that will be executed the next time run is
- * called.
- *
- * @param callable $task
- */
public function add(callable $task)
{
$this->queue[] = $task;
}
- /**
- * Execute all of the pending task in the queue.
- */
public function run()
{
/** @var callable $task */
diff --git a/server/vendor/guzzlehttp/promises/src/TaskQueueInterface.php b/server/vendor/guzzlehttp/promises/src/TaskQueueInterface.php
new file mode 100644
index 0000000..ac8306e
--- /dev/null
+++ b/server/vendor/guzzlehttp/promises/src/TaskQueueInterface.php
@@ -0,0 +1,25 @@
+<?php
+namespace GuzzleHttp\Promise;
+
+interface TaskQueueInterface
+{
+ /**
+ * Returns true if the queue is empty.
+ *
+ * @return bool
+ */
+ public function isEmpty();
+
+ /**
+ * Adds a task to the queue that will be executed the next time run is
+ * called.
+ *
+ * @param callable $task
+ */
+ public function add(callable $task);
+
+ /**
+ * Execute all of the pending task in the queue.
+ */
+ public function run();
+}
diff --git a/server/vendor/guzzlehttp/promises/src/functions.php b/server/vendor/guzzlehttp/promises/src/functions.php
index 8f9008f..4e27709 100644
--- a/server/vendor/guzzlehttp/promises/src/functions.php
+++ b/server/vendor/guzzlehttp/promises/src/functions.php
@@ -14,13 +14,17 @@ namespace GuzzleHttp\Promise;
* }
* </code>
*
- * @return TaskQueue
+ * @param TaskQueueInterface $assign Optionally specify a new queue instance.
+ *
+ * @return TaskQueueInterface
*/
-function queue()
+function queue(TaskQueueInterface $assign = null)
{
static $queue;
- if (!$queue) {
+ if ($assign) {
+ $queue = $assign;
+ } elseif (!$queue) {
$queue = new TaskQueue();
}
@@ -210,7 +214,7 @@ function unwrap($promises)
*
* @param mixed $promises Promises or values.
*
- * @return Promise
+ * @return PromiseInterface
*/
function all($promises)
{
@@ -243,7 +247,7 @@ function all($promises)
* @param int $count Total number of promises.
* @param mixed $promises Promises or values.
*
- * @return Promise
+ * @return PromiseInterface
*/
function some($count, $promises)
{
@@ -299,7 +303,7 @@ function any($promises)
*
* @param mixed $promises Promises or values.
*
- * @return Promise
+ * @return PromiseInterface
* @see GuzzleHttp\Promise\inspect for the inspection state array format.
*/
function settle($promises)
@@ -337,7 +341,7 @@ function settle($promises)
* @param callable $onFulfilled
* @param callable $onRejected
*
- * @return Promise
+ * @return PromiseInterface
*/
function each(
$iterable,
@@ -363,7 +367,7 @@ function each(
* @param callable $onFulfilled
* @param callable $onRejected
*
- * @return mixed
+ * @return PromiseInterface
*/
function each_limit(
$iterable,
@@ -387,7 +391,7 @@ function each_limit(
* @param int|callable $concurrency
* @param callable $onFulfilled
*
- * @return mixed
+ * @return PromiseInterface
*/
function each_limit_all(
$iterable,
@@ -441,60 +445,13 @@ function is_settled(PromiseInterface $promise)
}
/**
- * Creates a promise that is resolved using a generator that yields values or
- * promises (somewhat similar to C#'s async keyword).
- *
- * When called, the coroutine function will start an instance of the generator
- * and returns a promise that is fulfilled with its final yielded value.
- *
- * Control is returned back to the generator when the yielded promise settles.
- * This can lead to less verbose code when doing lots of sequential async calls
- * with minimal processing in between.
- *
- * use GuzzleHttp\Promise;
+ * @see Coroutine
*
- * function createPromise($value) {
- * return new Promise\FulfilledPromise($value);
- * }
+ * @param callable $generatorFn
*
- * $promise = Promise\coroutine(function () {
- * $value = (yield createPromise('a'));
- * try {
- * $value = (yield createPromise($value . 'b'));
- * } catch (\Exception $e) {
- * // The promise was rejected.
- * }
- * yield $value . 'c';
- * });
- *
- * // Outputs "abc"
- * $promise->then(function ($v) { echo $v; });
- *
- * @param callable $generatorFn Generator function to wrap into a promise.
- *
- * @return Promise
- * @link https://github.com/petkaantonov/bluebird/blob/master/API.md#generators inspiration
+ * @return PromiseInterface
*/
function coroutine(callable $generatorFn)
{
- $generator = $generatorFn();
- return __next_coroutine($generator->current(), $generator)->then();
-}
-
-/** @internal */
-function __next_coroutine($yielded, \Generator $generator)
-{
- return promise_for($yielded)->then(
- function ($value) use ($generator) {
- $nextYield = $generator->send($value);
- return $generator->valid()
- ? __next_coroutine($nextYield, $generator)
- : $value;
- },
- function ($reason) use ($generator) {
- $nextYield = $generator->throw(exception_for($reason));
- // The throw was caught, so keep iterating on the coroutine
- return __next_coroutine($nextYield, $generator);
- }
- );
+ return new Coroutine($generatorFn);
}
diff --git a/server/vendor/guzzlehttp/promises/tests/AggregateExceptionTest.php b/server/vendor/guzzlehttp/promises/tests/AggregateExceptionTest.php
deleted file mode 100644
index eaa7703..0000000
--- a/server/vendor/guzzlehttp/promises/tests/AggregateExceptionTest.php
+++ /dev/null
@@ -1,14 +0,0 @@
-<?php
-namespace GuzzleHttp\Promise\Tests;
-
-use GuzzleHttp\Promise\AggregateException;
-
-class AggregateExceptionTest extends \PHPUnit_Framework_TestCase
-{
- public function testHasReason()
- {
- $e = new AggregateException('foo', ['baz', 'bar']);
- $this->assertContains('foo', $e->getMessage());
- $this->assertEquals(['baz', 'bar'], $e->getReason());
- }
-}
diff --git a/server/vendor/guzzlehttp/promises/tests/EachPromiseTest.php b/server/vendor/guzzlehttp/promises/tests/EachPromiseTest.php
deleted file mode 100644
index 08af2a0..0000000
--- a/server/vendor/guzzlehttp/promises/tests/EachPromiseTest.php
+++ /dev/null
@@ -1,336 +0,0 @@
-<?php
-namespace GuzzleHttp\Promise\Tests;
-
-use GuzzleHttp\Promise\RejectedPromise;
-use GuzzleHttp\Promise\FulfilledPromise;
-use GuzzleHttp\Promise\Promise;
-use GuzzleHttp\Promise\PromiseInterface;
-use GuzzleHttp\Promise\EachPromise;
-use GuzzleHttp\Promise as P;
-
-/**
- * @covers GuzzleHttp\Promise\EachPromise
- */
-class EachPromiseTest extends \PHPUnit_Framework_TestCase
-{
- public function testReturnsSameInstance()
- {
- $each = new EachPromise([], ['concurrency' => 100]);
- $this->assertSame($each->promise(), $each->promise());
- }
-
- public function testInvokesAllPromises()
- {
- $promises = [new Promise(), new Promise(), new Promise()];
- $called = [];
- $each = new EachPromise($promises, [
- 'fulfilled' => function ($value) use (&$called) {
- $called[] = $value;
- }
- ]);
- $p = $each->promise();
- $promises[0]->resolve('a');
- $promises[1]->resolve('c');
- $promises[2]->resolve('b');
- P\queue()->run();
- $this->assertEquals(['a', 'c', 'b'], $called);
- $this->assertEquals(PromiseInterface::FULFILLED, $p->getState());
- }
-
- public function testIsWaitable()
- {
- $a = $this->createSelfResolvingPromise('a');
- $b = $this->createSelfResolvingPromise('b');
- $called = [];
- $each = new EachPromise([$a, $b], [
- 'fulfilled' => function ($value) use (&$called) { $called[] = $value; }
- ]);
- $p = $each->promise();
- $this->assertNull($p->wait());
- $this->assertEquals(PromiseInterface::FULFILLED, $p->getState());
- $this->assertEquals(['a', 'b'], $called);
- }
-
- public function testCanResolveBeforeConsumingAll()
- {
- $called = 0;
- $a = $this->createSelfResolvingPromise('a');
- $b = new Promise(function () { $this->fail(); });
- $each = new EachPromise([$a, $b], [
- 'fulfilled' => function ($value, $idx, Promise $aggregate) use (&$called) {
- $this->assertSame($idx, 0);
- $this->assertEquals('a', $value);
- $aggregate->resolve(null);
- $called++;
- },
- 'rejected' => function (\Exception $reason) {
- $this->fail($reason->getMessage());
- }
- ]);
- $p = $each->promise();
- $p->wait();
- $this->assertNull($p->wait());
- $this->assertEquals(1, $called);
- $this->assertEquals(PromiseInterface::FULFILLED, $a->getState());
- $this->assertEquals(PromiseInterface::PENDING, $b->getState());
- // Resolving $b has no effect on the aggregate promise.
- $b->resolve('foo');
- $this->assertEquals(1, $called);
- }
-
- public function testLimitsPendingPromises()
- {
- $pending = [new Promise(), new Promise(), new Promise(), new Promise()];
- $promises = new \ArrayIterator($pending);
- $each = new EachPromise($promises, ['concurrency' => 2]);
- $p = $each->promise();
- $this->assertCount(2, $this->readAttribute($each, 'pending'));
- $pending[0]->resolve('a');
- $this->assertCount(2, $this->readAttribute($each, 'pending'));
- $this->assertTrue($promises->valid());
- $pending[1]->resolve('b');
- P\queue()->run();
- $this->assertCount(2, $this->readAttribute($each, 'pending'));
- $this->assertTrue($promises->valid());
- $promises[2]->resolve('c');
- P\queue()->run();
- $this->assertCount(1, $this->readAttribute($each, 'pending'));
- $this->assertEquals(PromiseInterface::PENDING, $p->getState());
- $promises[3]->resolve('d');
- P\queue()->run();
- $this->assertNull($this->readAttribute($each, 'pending'));
- $this->assertEquals(PromiseInterface::FULFILLED, $p->getState());
- $this->assertFalse($promises->valid());
- }
-
- public function testDynamicallyLimitsPendingPromises()
- {
- $calls = [];
- $pendingFn = function ($count) use (&$calls) {
- $calls[] = $count;
- return 2;
- };
- $pending = [new Promise(), new Promise(), new Promise(), new Promise()];
- $promises = new \ArrayIterator($pending);
- $each = new EachPromise($promises, ['concurrency' => $pendingFn]);
- $p = $each->promise();
- $this->assertCount(2, $this->readAttribute($each, 'pending'));
- $pending[0]->resolve('a');
- $this->assertCount(2, $this->readAttribute($each, 'pending'));
- $this->assertTrue($promises->valid());
- $pending[1]->resolve('b');
- $this->assertCount(2, $this->readAttribute($each, 'pending'));
- P\queue()->run();
- $this->assertTrue($promises->valid());
- $promises[2]->resolve('c');
- P\queue()->run();
- $this->assertCount(1, $this->readAttribute($each, 'pending'));
- $this->assertEquals(PromiseInterface::PENDING, $p->getState());
- $promises[3]->resolve('d');
- P\queue()->run();
- $this->assertNull($this->readAttribute($each, 'pending'));
- $this->assertEquals(PromiseInterface::FULFILLED, $p->getState());
- $this->assertEquals([0, 1, 1, 1], $calls);
- $this->assertFalse($promises->valid());
- }
-
- public function testClearsReferencesWhenResolved()
- {
- $called = false;
- $a = new Promise(function () use (&$a, &$called) {
- $a->resolve('a');
- $called = true;
- });
- $each = new EachPromise([$a], [
- 'concurrency' => function () { return 1; },
- 'fulfilled' => function () {},
- 'rejected' => function () {}
- ]);
- $each->promise()->wait();
- $this->assertNull($this->readAttribute($each, 'onFulfilled'));
- $this->assertNull($this->readAttribute($each, 'onRejected'));
- $this->assertNull($this->readAttribute($each, 'iterable'));
- $this->assertNull($this->readAttribute($each, 'pending'));
- $this->assertNull($this->readAttribute($each, 'concurrency'));
- $this->assertTrue($called);
- }
-
- public function testCanBeCancelled()
- {
- $this->markTestIncomplete();
- }
-
- public function testFulfillsImmediatelyWhenGivenAnEmptyIterator()
- {
- $each = new EachPromise(new \ArrayIterator([]));
- $result = $each->promise()->wait();
- }
-
- public function testDoesNotBlowStackWithFulfilledPromises()
- {
- $pending = [];
- for ($i = 0; $i < 100; $i++) {
- $pending[] = new FulfilledPromise($i);
- }
- $values = [];
- $each = new EachPromise($pending, [
- 'fulfilled' => function ($value) use (&$values) {
- $values[] = $value;
- }
- ]);
- $called = false;
- $each->promise()->then(function () use (&$called) {
- $called = true;
- });
- $this->assertFalse($called);
- P\queue()->run();
- $this->assertTrue($called);
- $this->assertEquals(range(0, 99), $values);
- }
-
- public function testDoesNotBlowStackWithRejectedPromises()
- {
- $pending = [];
- for ($i = 0; $i < 100; $i++) {
- $pending[] = new RejectedPromise($i);
- }
- $values = [];
- $each = new EachPromise($pending, [
- 'rejected' => function ($value) use (&$values) {
- $values[] = $value;
- }
- ]);
- $called = false;
- $each->promise()->then(
- function () use (&$called) { $called = true; },
- function () { $this->fail('Should not have rejected.'); }
- );
- $this->assertFalse($called);
- P\queue()->run();
- $this->assertTrue($called);
- $this->assertEquals(range(0, 99), $values);
- }
-
- public function testReturnsPromiseForWhatever()
- {
- $called = [];
- $arr = ['a', 'b'];
- $each = new EachPromise($arr, [
- 'fulfilled' => function ($v) use (&$called) { $called[] = $v; }
- ]);
- $p = $each->promise();
- $this->assertNull($p->wait());
- $this->assertEquals(['a', 'b'], $called);
- }
-
- public function testRejectsAggregateWhenNextThrows()
- {
- $iter = function () {
- yield 'a';
- throw new \Exception('Failure');
- };
- $each = new EachPromise($iter());
- $p = $each->promise();
- $e = null;
- $received = null;
- $p->then(null, function ($reason) use (&$e) { $e = $reason; });
- P\queue()->run();
- $this->assertInstanceOf('Exception', $e);
- $this->assertEquals('Failure', $e->getMessage());
- }
-
- public function testDoesNotCallNextOnIteratorUntilNeededWhenWaiting()
- {
- $results = [];
- $values = [10];
- $remaining = 9;
- $iter = function () use (&$values) {
- while ($value = array_pop($values)) {
- yield $value;
- }
- };
- $each = new EachPromise($iter(), [
- 'concurrency' => 1,
- 'fulfilled' => function ($r) use (&$results, &$values, &$remaining) {
- $results[] = $r;
- if ($remaining > 0) {
- $values[] = $remaining--;
- }
- }
- ]);
- $each->promise()->wait();
- $this->assertEquals(range(10, 1), $results);
- }
-
- public function testDoesNotCallNextOnIteratorUntilNeededWhenAsync()
- {
- $firstPromise = new Promise();
- $pending = [$firstPromise];
- $values = [$firstPromise];
- $results = [];
- $remaining = 9;
- $iter = function () use (&$values) {
- while ($value = array_pop($values)) {
- yield $value;
- }
- };
- $each = new EachPromise($iter(), [
- 'concurrency' => 1,
- 'fulfilled' => function ($r) use (&$results, &$values, &$remaining, &$pending) {
- $results[] = $r;
- if ($remaining-- > 0) {
- $pending[] = $values[] = new Promise();
- }
- }
- ]);
- $i = 0;
- $each->promise();
- while ($promise = array_pop($pending)) {
- $promise->resolve($i++);
- P\queue()->run();
- }
- $this->assertEquals(range(0, 9), $results);
- }
-
- private function createSelfResolvingPromise($value)
- {
- $p = new Promise(function () use (&$p, $value) {
- $p->resolve($value);
- });
-
- return $p;
- }
-
- public function testMutexPreventsGeneratorRecursion()
- {
- $results = $promises = [];
- for ($i = 0; $i < 20; $i++) {
- $p = $this->createSelfResolvingPromise($i);
- $pending[] = $p;
- $promises[] = $p;
- }
-
- $iter = function () use (&$promises, &$pending) {
- foreach ($promises as $promise) {
- // Resolve a promises, which will trigger the then() function,
- // which would cause the EachPromise to try to add more
- // promises to the queue. Without a lock, this would trigger
- // a "Cannot resume an already running generator" fatal error.
- if ($p = array_pop($pending)) {
- $p->wait();
- }
- yield $promise;
- }
- };
-
- $each = new EachPromise($iter(), [
- 'concurrency' => 5,
- 'fulfilled' => function ($r) use (&$results, &$pending) {
- $results[] = $r;
- }
- ]);
-
- $each->promise()->wait();
- $this->assertCount(20, $results);
- }
-}
diff --git a/server/vendor/guzzlehttp/promises/tests/FulfilledPromiseTest.php b/server/vendor/guzzlehttp/promises/tests/FulfilledPromiseTest.php
deleted file mode 100644
index 554c150..0000000
--- a/server/vendor/guzzlehttp/promises/tests/FulfilledPromiseTest.php
+++ /dev/null
@@ -1,108 +0,0 @@
-<?php
-namespace GuzzleHttp\Tests\Promise;
-
-use GuzzleHttp\Promise\Promise;
-use GuzzleHttp\Promise\FulfilledPromise;
-
-/**
- * @covers GuzzleHttp\Promise\FulfilledPromise
- */
-class FulfilledPromiseTest extends \PHPUnit_Framework_TestCase
-{
- public function testReturnsValueWhenWaitedUpon()
- {
- $p = new FulfilledPromise('foo');
- $this->assertEquals('fulfilled', $p->getState());
- $this->assertEquals('foo', $p->wait(true));
- }
-
- public function testCannotCancel()
- {
- $p = new FulfilledPromise('foo');
- $this->assertEquals('fulfilled', $p->getState());
- $p->cancel();
- $this->assertEquals('foo', $p->wait());
- }
-
- /**
- * @expectedException \LogicException
- * @exepctedExceptionMessage Cannot resolve a fulfilled promise
- */
- public function testCannotResolve()
- {
- $p = new FulfilledPromise('foo');
- $p->resolve('bar');
- }
-
- /**
- * @expectedException \LogicException
- * @exepctedExceptionMessage Cannot reject a fulfilled promise
- */
- public function testCannotReject()
- {
- $p = new FulfilledPromise('foo');
- $p->reject('bar');
- }
-
- public function testCanResolveWithSameValue()
- {
- $p = new FulfilledPromise('foo');
- $p->resolve('foo');
- }
-
- /**
- * @expectedException \InvalidArgumentException
- */
- public function testCannotResolveWithPromise()
- {
- new FulfilledPromise(new Promise());
- }
-
- public function testReturnsSelfWhenNoOnFulfilled()
- {
- $p = new FulfilledPromise('a');
- $this->assertSame($p, $p->then());
- }
-
- public function testAsynchronouslyInvokesOnFulfilled()
- {
- $p = new FulfilledPromise('a');
- $r = null;
- $f = function ($d) use (&$r) { $r = $d; };
- $p2 = $p->then($f);
- $this->assertNotSame($p, $p2);
- $this->assertNull($r);
- \GuzzleHttp\Promise\queue()->run();
- $this->assertEquals('a', $r);
- }
-
- public function testReturnsNewRejectedWhenOnFulfilledFails()
- {
- $p = new FulfilledPromise('a');
- $f = function () { throw new \Exception('b'); };
- $p2 = $p->then($f);
- $this->assertNotSame($p, $p2);
- try {
- $p2->wait();
- $this->fail();
- } catch (\Exception $e) {
- $this->assertEquals('b', $e->getMessage());
- }
- }
-
- public function testOtherwiseIsSugarForRejections()
- {
- $c = null;
- $p = new FulfilledPromise('foo');
- $p->otherwise(function ($v) use (&$c) { $c = $v; });
- $this->assertNull($c);
- }
-
- public function testDoesNotTryToFulfillTwiceDuringTrampoline()
- {
- $fp = new FulfilledPromise('a');
- $t1 = $fp->then(function ($v) { return $v . ' b'; });
- $t1->resolve('why!');
- $this->assertEquals('why!', $t1->wait());
- }
-}
diff --git a/server/vendor/guzzlehttp/promises/tests/NotPromiseInstance.php b/server/vendor/guzzlehttp/promises/tests/NotPromiseInstance.php
deleted file mode 100644
index 6288aa8..0000000
--- a/server/vendor/guzzlehttp/promises/tests/NotPromiseInstance.php
+++ /dev/null
@@ -1,50 +0,0 @@
-<?php
-namespace GuzzleHttp\Promise\Tests;
-
-use GuzzleHttp\Promise\Promise;
-use GuzzleHttp\Promise\PromiseInterface;
-
-class NotPromiseInstance extends Thennable implements PromiseInterface
-{
- private $nextPromise = null;
-
- public function __construct()
- {
- $this->nextPromise = new Promise();
- }
-
- public function then(callable $res = null, callable $rej = null)
- {
- return $this->nextPromise->then($res, $rej);
- }
-
- public function otherwise(callable $onRejected)
- {
- return $this->then($onRejected);
- }
-
- public function resolve($value)
- {
- $this->nextPromise->resolve($value);
- }
-
- public function reject($reason)
- {
- $this->nextPromise->reject($reason);
- }
-
- public function wait($unwrap = true, $defaultResolution = null)
- {
-
- }
-
- public function cancel()
- {
-
- }
-
- public function getState()
- {
- return $this->nextPromise->getState();
- }
-}
diff --git a/server/vendor/guzzlehttp/promises/tests/PromiseTest.php b/server/vendor/guzzlehttp/promises/tests/PromiseTest.php
deleted file mode 100644
index 599d8ae..0000000
--- a/server/vendor/guzzlehttp/promises/tests/PromiseTest.php
+++ /dev/null
@@ -1,591 +0,0 @@
-<?php
-namespace GuzzleHttp\Promise\Tests;
-
-use GuzzleHttp\Promise\CancellationException;
-use GuzzleHttp\Promise as P;
-use GuzzleHttp\Promise\Promise;
-use GuzzleHttp\Promise\RejectedPromise;
-use GuzzleHttp\Promise\RejectionException;
-
-/**
- * @covers GuzzleHttp\Promise\Promise
- */
-class PromiseTest extends \PHPUnit_Framework_TestCase
-{
- /**
- * @expectedException \LogicException
- * @expectedExceptionMessage The promise is already fulfilled
- */
- public function testCannotResolveNonPendingPromise()
- {
- $p = new Promise();
- $p->resolve('foo');
- $p->resolve('bar');
- $this->assertEquals('foo', $p->wait());
- }
-
- public function testCanResolveWithSameValue()
- {
- $p = new Promise();
- $p->resolve('foo');
- $p->resolve('foo');
- }
-
- /**
- * @expectedException \LogicException
- * @expectedExceptionMessage Cannot change a fulfilled promise to rejected
- */
- public function testCannotRejectNonPendingPromise()
- {
- $p = new Promise();
- $p->resolve('foo');
- $p->reject('bar');
- $this->assertEquals('foo', $p->wait());
- }
-
- public function testCanRejectWithSameValue()
- {
- $p = new Promise();
- $p->reject('foo');
- $p->reject('foo');
- }
-
- /**
- * @expectedException \LogicException
- * @expectedExceptionMessage Cannot change a fulfilled promise to rejected
- */
- public function testCannotRejectResolveWithSameValue()
- {
- $p = new Promise();
- $p->resolve('foo');
- $p->reject('foo');
- }
-
- public function testInvokesWaitFunction()
- {
- $p = new Promise(function () use (&$p) { $p->resolve('10'); });
- $this->assertEquals('10', $p->wait());
- }
-
- /**
- * @expectedException \GuzzleHttp\Promise\RejectionException
- */
- public function testRejectsAndThrowsWhenWaitFailsToResolve()
- {
- $p = new Promise(function () {});
- $p->wait();
- }
-
- /**
- * @expectedException \GuzzleHttp\Promise\RejectionException
- * @expectedExceptionMessage The promise was rejected with reason: foo
- */
- public function testThrowsWhenUnwrapIsRejectedWithNonException()
- {
- $p = new Promise(function () use (&$p) { $p->reject('foo'); });
- $p->wait();
- }
-
- /**
- * @expectedException \UnexpectedValueException
- * @expectedExceptionMessage foo
- */
- public function testThrowsWhenUnwrapIsRejectedWithException()
- {
- $e = new \UnexpectedValueException('foo');
- $p = new Promise(function () use (&$p, $e) { $p->reject($e); });
- $p->wait();
- }
-
- public function testDoesNotUnwrapExceptionsWhenDisabled()
- {
- $p = new Promise(function () use (&$p) { $p->reject('foo'); });
- $this->assertEquals('pending', $p->getState());
- $p->wait(false);
- $this->assertEquals('rejected', $p->getState());
- }
-
- public function testRejectsSelfWhenWaitThrows()
- {
- $e = new \UnexpectedValueException('foo');
- $p = new Promise(function () use ($e) { throw $e; });
- try {
- $p->wait();
- $this->fail();
- } catch (\UnexpectedValueException $e) {
- $this->assertEquals('rejected', $p->getState());
- }
- }
-
- public function testWaitsOnNestedPromises()
- {
- $p = new Promise(function () use (&$p) { $p->resolve('_'); });
- $p2 = new Promise(function () use (&$p2) { $p2->resolve('foo'); });
- $p3 = $p->then(function () use ($p2) { return $p2; });
- $this->assertSame('foo', $p3->wait());
- }
-
- /**
- * @expectedException \GuzzleHttp\Promise\RejectionException
- */
- public function testThrowsWhenWaitingOnPromiseWithNoWaitFunction()
- {
- $p = new Promise();
- $p->wait();
- }
-
- public function testThrowsWaitExceptionAfterPromiseIsResolved()
- {
- $p = new Promise(function () use (&$p) {
- $p->reject('Foo!');
- throw new \Exception('Bar?');
- });
-
- try {
- $p->wait();
- $this->fail();
- } catch (\Exception $e) {
- $this->assertEquals('Bar?', $e->getMessage());
- }
- }
-
- public function testGetsActualWaitValueFromThen()
- {
- $p = new Promise(function () use (&$p) { $p->reject('Foo!'); });
- $p2 = $p->then(null, function ($reason) {
- return new RejectedPromise([$reason]);
- });
-
- try {
- $p2->wait();
- $this->fail('Should have thrown');
- } catch (RejectionException $e) {
- $this->assertEquals(['Foo!'], $e->getReason());
- }
- }
-
- public function testWaitBehaviorIsBasedOnLastPromiseInChain()
- {
- $p3 = new Promise(function () use (&$p3) { $p3->resolve('Whoop'); });
- $p2 = new Promise(function () use (&$p2, $p3) { $p2->reject($p3); });
- $p = new Promise(function () use (&$p, $p2) { $p->reject($p2); });
- $this->assertEquals('Whoop', $p->wait());
- }
-
- public function testWaitsOnAPromiseChainEvenWhenNotUnwrapped()
- {
- $p2 = new Promise(function () use (&$p2) {
- $p2->reject('Fail');
- });
- $p = new Promise(function () use ($p2, &$p) {
- $p->resolve($p2);
- });
- $p->wait(false);
- $this->assertSame(Promise::REJECTED, $p2->getState());
- }
-
- public function testCannotCancelNonPending()
- {
- $p = new Promise();
- $p->resolve('foo');
- $p->cancel();
- $this->assertEquals('fulfilled', $p->getState());
- }
-
- /**
- * @expectedException \GuzzleHttp\Promise\CancellationException
- */
- public function testCancelsPromiseWhenNoCancelFunction()
- {
- $p = new Promise();
- $p->cancel();
- $this->assertEquals('rejected', $p->getState());
- $p->wait();
- }
-
- public function testCancelsPromiseWithCancelFunction()
- {
- $called = false;
- $p = new Promise(null, function () use (&$called) { $called = true; });
- $p->cancel();
- $this->assertEquals('rejected', $p->getState());
- $this->assertTrue($called);
- }
-
- public function testCancelsUppermostPendingPromise()
- {
- $called = false;
- $p1 = new Promise(null, function () use (&$called) { $called = true; });
- $p2 = $p1->then(function () {});
- $p3 = $p2->then(function () {});
- $p4 = $p3->then(function () {});
- $p3->cancel();
- $this->assertEquals('rejected', $p1->getState());
- $this->assertEquals('rejected', $p2->getState());
- $this->assertEquals('rejected', $p3->getState());
- $this->assertEquals('pending', $p4->getState());
- $this->assertTrue($called);
-
- try {
- $p3->wait();
- $this->fail();
- } catch (CancellationException $e) {
- $this->assertContains('cancelled', $e->getMessage());
- }
-
- try {
- $p4->wait();
- $this->fail();
- } catch (CancellationException $e) {
- $this->assertContains('cancelled', $e->getMessage());
- }
-
- $this->assertEquals('rejected', $p4->getState());
- }
-
- public function testCancelsChildPromises()
- {
- $called1 = $called2 = $called3 = false;
- $p1 = new Promise(null, function () use (&$called1) { $called1 = true; });
- $p2 = new Promise(null, function () use (&$called2) { $called2 = true; });
- $p3 = new Promise(null, function () use (&$called3) { $called3 = true; });
- $p4 = $p2->then(function () use ($p3) { return $p3; });
- $p5 = $p4->then(function () { $this->fail(); });
- $p4->cancel();
- $this->assertEquals('pending', $p1->getState());
- $this->assertEquals('rejected', $p2->getState());
- $this->assertEquals('rejected', $p4->getState());
- $this->assertEquals('pending', $p5->getState());
- $this->assertFalse($called1);
- $this->assertTrue($called2);
- $this->assertFalse($called3);
- }
-
- public function testRejectsPromiseWhenCancelFails()
- {
- $called = false;
- $p = new Promise(null, function () use (&$called) {
- $called = true;
- throw new \Exception('e');
- });
- $p->cancel();
- $this->assertEquals('rejected', $p->getState());
- $this->assertTrue($called);
- try {
- $p->wait();
- $this->fail();
- } catch (\Exception $e) {
- $this->assertEquals('e', $e->getMessage());
- }
- }
-
- public function testCreatesPromiseWhenFulfilledAfterThen()
- {
- $p = new Promise();
- $carry = null;
- $p2 = $p->then(function ($v) use (&$carry) { $carry = $v; });
- $this->assertNotSame($p, $p2);
- $p->resolve('foo');
- P\queue()->run();
-
- $this->assertEquals('foo', $carry);
- }
-
- public function testCreatesPromiseWhenFulfilledBeforeThen()
- {
- $p = new Promise();
- $p->resolve('foo');
- $carry = null;
- $p2 = $p->then(function ($v) use (&$carry) { $carry = $v; });
- $this->assertNotSame($p, $p2);
- $this->assertNull($carry);
- \GuzzleHttp\Promise\queue()->run();
- $this->assertEquals('foo', $carry);
- }
-
- public function testCreatesPromiseWhenFulfilledWithNoCallback()
- {
- $p = new Promise();
- $p->resolve('foo');
- $p2 = $p->then();
- $this->assertNotSame($p, $p2);
- $this->assertInstanceOf('GuzzleHttp\Promise\FulfilledPromise', $p2);
- }
-
- public function testCreatesPromiseWhenRejectedAfterThen()
- {
- $p = new Promise();
- $carry = null;
- $p2 = $p->then(null, function ($v) use (&$carry) { $carry = $v; });
- $this->assertNotSame($p, $p2);
- $p->reject('foo');
- P\queue()->run();
- $this->assertEquals('foo', $carry);
- }
-
- public function testCreatesPromiseWhenRejectedBeforeThen()
- {
- $p = new Promise();
- $p->reject('foo');
- $carry = null;
- $p2 = $p->then(null, function ($v) use (&$carry) { $carry = $v; });
- $this->assertNotSame($p, $p2);
- $this->assertNull($carry);
- P\queue()->run();
- $this->assertEquals('foo', $carry);
- }
-
- public function testCreatesPromiseWhenRejectedWithNoCallback()
- {
- $p = new Promise();
- $p->reject('foo');
- $p2 = $p->then();
- $this->assertNotSame($p, $p2);
- $this->assertInstanceOf('GuzzleHttp\Promise\RejectedPromise', $p2);
- }
-
- public function testInvokesWaitFnsForThens()
- {
- $p = new Promise(function () use (&$p) { $p->resolve('a'); });
- $p2 = $p
- ->then(function ($v) { return $v . '-1-'; })
- ->then(function ($v) { return $v . '2'; });
- $this->assertEquals('a-1-2', $p2->wait());
- }
-
- public function testStacksThenWaitFunctions()
- {
- $p1 = new Promise(function () use (&$p1) { $p1->resolve('a'); });
- $p2 = new Promise(function () use (&$p2) { $p2->resolve('b'); });
- $p3 = new Promise(function () use (&$p3) { $p3->resolve('c'); });
- $p4 = $p1
- ->then(function () use ($p2) { return $p2; })
- ->then(function () use ($p3) { return $p3; });
- $this->assertEquals('c', $p4->wait());
- }
-
- public function testForwardsFulfilledDownChainBetweenGaps()
- {
- $p = new Promise();
- $r = $r2 = null;
- $p->then(null, null)
- ->then(function ($v) use (&$r) { $r = $v; return $v . '2'; })
- ->then(function ($v) use (&$r2) { $r2 = $v; });
- $p->resolve('foo');
- P\queue()->run();
- $this->assertEquals('foo', $r);
- $this->assertEquals('foo2', $r2);
- }
-
- public function testForwardsRejectedPromisesDownChainBetweenGaps()
- {
- $p = new Promise();
- $r = $r2 = null;
- $p->then(null, null)
- ->then(null, function ($v) use (&$r) { $r = $v; return $v . '2'; })
- ->then(function ($v) use (&$r2) { $r2 = $v; });
- $p->reject('foo');
- P\queue()->run();
- $this->assertEquals('foo', $r);
- $this->assertEquals('foo2', $r2);
- }
-
- public function testForwardsThrownPromisesDownChainBetweenGaps()
- {
- $e = new \Exception();
- $p = new Promise();
- $r = $r2 = null;
- $p->then(null, null)
- ->then(null, function ($v) use (&$r, $e) {
- $r = $v;
- throw $e;
- })
- ->then(
- null,
- function ($v) use (&$r2) { $r2 = $v; }
- );
- $p->reject('foo');
- P\queue()->run();
- $this->assertEquals('foo', $r);
- $this->assertSame($e, $r2);
- }
-
- public function testForwardsReturnedRejectedPromisesDownChainBetweenGaps()
- {
- $p = new Promise();
- $rejected = new RejectedPromise('bar');
- $r = $r2 = null;
- $p->then(null, null)
- ->then(null, function ($v) use (&$r, $rejected) {
- $r = $v;
- return $rejected;
- })
- ->then(
- null,
- function ($v) use (&$r2) { $r2 = $v; }
- );
- $p->reject('foo');
- P\queue()->run();
- $this->assertEquals('foo', $r);
- $this->assertEquals('bar', $r2);
- try {
- $p->wait();
- } catch (RejectionException $e) {
- $this->assertEquals('foo', $e->getReason());
- }
- }
-
- public function testForwardsHandlersToNextPromise()
- {
- $p = new Promise();
- $p2 = new Promise();
- $resolved = null;
- $p
- ->then(function ($v) use ($p2) { return $p2; })
- ->then(function ($value) use (&$resolved) { $resolved = $value; });
- $p->resolve('a');
- $p2->resolve('b');
- P\queue()->run();
- $this->assertEquals('b', $resolved);
- }
-
- public function testRemovesReferenceFromChildWhenParentWaitedUpon()
- {
- $r = null;
- $p = new Promise(function () use (&$p) { $p->resolve('a'); });
- $p2 = new Promise(function () use (&$p2) { $p2->resolve('b'); });
- $pb = $p->then(
- function ($v) use ($p2, &$r) {
- $r = $v;
- return $p2;
- })
- ->then(function ($v) { return $v . '.'; });
- $this->assertEquals('a', $p->wait());
- $this->assertEquals('b', $p2->wait());
- $this->assertEquals('b.', $pb->wait());
- $this->assertEquals('a', $r);
- }
-
- public function testForwardsHandlersWhenFulfilledPromiseIsReturned()
- {
- $res = [];
- $p = new Promise();
- $p2 = new Promise();
- $p2->resolve('foo');
- $p2->then(function ($v) use (&$res) { $res[] = 'A:' . $v; });
- // $res is A:foo
- $p
- ->then(function () use ($p2, &$res) { $res[] = 'B'; return $p2; })
- ->then(function ($v) use (&$res) { $res[] = 'C:' . $v; });
- $p->resolve('a');
- $p->then(function ($v) use (&$res) { $res[] = 'D:' . $v; });
- P\queue()->run();
- $this->assertEquals(['A:foo', 'B', 'D:a', 'C:foo'], $res);
- }
-
- public function testForwardsHandlersWhenRejectedPromiseIsReturned()
- {
- $res = [];
- $p = new Promise();
- $p2 = new Promise();
- $p2->reject('foo');
- $p2->then(null, function ($v) use (&$res) { $res[] = 'A:' . $v; });
- $p->then(null, function () use ($p2, &$res) { $res[] = 'B'; return $p2; })
- ->then(null, function ($v) use (&$res) { $res[] = 'C:' . $v; });
- $p->reject('a');
- $p->then(null, function ($v) use (&$res) { $res[] = 'D:' . $v; });
- P\queue()->run();
- $this->assertEquals(['A:foo', 'B', 'D:a', 'C:foo'], $res);
- }
-
- public function testDoesNotForwardRejectedPromise()
- {
- $res = [];
- $p = new Promise();
- $p2 = new Promise();
- $p2->cancel();
- $p2->then(function ($v) use (&$res) { $res[] = "B:$v"; return $v; });
- $p->then(function ($v) use ($p2, &$res) { $res[] = "B:$v"; return $p2; })
- ->then(function ($v) use (&$res) { $res[] = 'C:' . $v; });
- $p->resolve('a');
- $p->then(function ($v) use (&$res) { $res[] = 'D:' . $v; });
- P\queue()->run();
- $this->assertEquals(['B:a', 'D:a'], $res);
- }
-
- public function testRecursivelyForwardsWhenOnlyThennable()
- {
- $res = [];
- $p = new Promise();
- $p2 = new Thennable();
- $p2->resolve('foo');
- $p2->then(function ($v) use (&$res) { $res[] = 'A:' . $v; });
- $p->then(function () use ($p2, &$res) { $res[] = 'B'; return $p2; })
- ->then(function ($v) use (&$res) { $res[] = 'C:' . $v; });
- $p->resolve('a');
- $p->then(function ($v) use (&$res) { $res[] = 'D:' . $v; });
- P\queue()->run();
- $this->assertEquals(['A:foo', 'B', 'D:a', 'C:foo'], $res);
- }
-
- public function testRecursivelyForwardsWhenNotInstanceOfPromise()
- {
- $res = [];
- $p = new Promise();
- $p2 = new NotPromiseInstance();
- $p2->then(function ($v) use (&$res) { $res[] = 'A:' . $v; });
- $p->then(function () use ($p2, &$res) { $res[] = 'B'; return $p2; })
- ->then(function ($v) use (&$res) { $res[] = 'C:' . $v; });
- $p->resolve('a');
- $p->then(function ($v) use (&$res) { $res[] = 'D:' . $v; });
- P\queue()->run();
- $this->assertEquals(['B', 'D:a'], $res);
- $p2->resolve('foo');
- P\queue()->run();
- $this->assertEquals(['B', 'D:a', 'A:foo', 'C:foo'], $res);
- }
-
- /**
- * @expectedException \LogicException
- * @expectedExceptionMessage Cannot fulfill or reject a promise with itself
- */
- public function testCannotResolveWithSelf()
- {
- $p = new Promise();
- $p->resolve($p);
- }
-
- /**
- * @expectedException \LogicException
- * @expectedExceptionMessage Cannot fulfill or reject a promise with itself
- */
- public function testCannotRejectWithSelf()
- {
- $p = new Promise();
- $p->reject($p);
- }
-
- public function testDoesNotBlowStackWhenWaitingOnNestedThens()
- {
- $inner = new Promise(function () use (&$inner) { $inner->resolve(0); });
- $prev = $inner;
- for ($i = 1; $i < 100; $i++) {
- $prev = $prev->then(function ($i) { return $i + 1; });
- }
-
- $parent = new Promise(function () use (&$parent, $prev) {
- $parent->resolve($prev);
- });
-
- $this->assertEquals(99, $parent->wait());
- }
-
- public function testOtherwiseIsSugarForRejections()
- {
- $p = new Promise();
- $p->reject('foo');
- $p->otherwise(function ($v) use (&$c) { $c = $v; });
- P\queue()->run();
- $this->assertEquals($c, 'foo');
- }
-}
diff --git a/server/vendor/guzzlehttp/promises/tests/RejectedPromiseTest.php b/server/vendor/guzzlehttp/promises/tests/RejectedPromiseTest.php
deleted file mode 100644
index 60f926e..0000000
--- a/server/vendor/guzzlehttp/promises/tests/RejectedPromiseTest.php
+++ /dev/null
@@ -1,143 +0,0 @@
-<?php
-namespace GuzzleHttp\Promise\Tests;
-
-use GuzzleHttp\Promise\Promise;
-use GuzzleHttp\Promise\RejectedPromise;
-
-/**
- * @covers GuzzleHttp\Promise\RejectedPromise
- */
-class RejectedPromiseTest extends \PHPUnit_Framework_TestCase
-{
- public function testThrowsReasonWhenWaitedUpon()
- {
- $p = new RejectedPromise('foo');
- $this->assertEquals('rejected', $p->getState());
- try {
- $p->wait(true);
- $this->fail();
- } catch (\Exception $e) {
- $this->assertEquals('rejected', $p->getState());
- $this->assertContains('foo', $e->getMessage());
- }
- }
-
- public function testCannotCancel()
- {
- $p = new RejectedPromise('foo');
- $p->cancel();
- $this->assertEquals('rejected', $p->getState());
- }
-
- /**
- * @expectedException \LogicException
- * @exepctedExceptionMessage Cannot resolve a rejected promise
- */
- public function testCannotResolve()
- {
- $p = new RejectedPromise('foo');
- $p->resolve('bar');
- }
-
- /**
- * @expectedException \LogicException
- * @exepctedExceptionMessage Cannot reject a rejected promise
- */
- public function testCannotReject()
- {
- $p = new RejectedPromise('foo');
- $p->reject('bar');
- }
-
- public function testCanRejectWithSameValue()
- {
- $p = new RejectedPromise('foo');
- $p->reject('foo');
- }
-
- public function testThrowsSpecificException()
- {
- $e = new \Exception();
- $p = new RejectedPromise($e);
- try {
- $p->wait(true);
- $this->fail();
- } catch (\Exception $e2) {
- $this->assertSame($e, $e2);
- }
- }
-
- /**
- * @expectedException \InvalidArgumentException
- */
- public function testCannotResolveWithPromise()
- {
- new RejectedPromise(new Promise());
- }
-
- public function testReturnsSelfWhenNoOnReject()
- {
- $p = new RejectedPromise('a');
- $this->assertSame($p, $p->then());
- }
-
- public function testInvokesOnRejectedAsynchronously()
- {
- $p = new RejectedPromise('a');
- $r = null;
- $f = function ($reason) use (&$r) { $r = $reason; };
- $p->then(null, $f);
- $this->assertNull($r);
- \GuzzleHttp\Promise\queue()->run();
- $this->assertEquals('a', $r);
- }
-
- public function testReturnsNewRejectedWhenOnRejectedFails()
- {
- $p = new RejectedPromise('a');
- $f = function () { throw new \Exception('b'); };
- $p2 = $p->then(null, $f);
- $this->assertNotSame($p, $p2);
- try {
- $p2->wait();
- $this->fail();
- } catch (\Exception $e) {
- $this->assertEquals('b', $e->getMessage());
- }
- }
-
- public function testWaitingIsNoOp()
- {
- $p = new RejectedPromise('a');
- $p->wait(false);
- }
-
- public function testOtherwiseIsSugarForRejections()
- {
- $p = new RejectedPromise('foo');
- $p->otherwise(function ($v) use (&$c) { $c = $v; });
- \GuzzleHttp\Promise\queue()->run();
- $this->assertSame('foo', $c);
- }
-
- public function testCanResolveThenWithSuccess()
- {
- $actual = null;
- $p = new RejectedPromise('foo');
- $p->otherwise(function ($v) {
- return $v . ' bar';
- })->then(function ($v) use (&$actual) {
- $actual = $v;
- });
- \GuzzleHttp\Promise\queue()->run();
- $this->assertEquals('foo bar', $actual);
- }
-
- public function testDoesNotTryToRejectTwiceDuringTrampoline()
- {
- $fp = new RejectedPromise('a');
- $t1 = $fp->then(null, function ($v) { return $v . ' b'; });
- $t1->resolve('why!');
- $this->assertEquals('why!', $t1->wait());
- }
-}
diff --git a/server/vendor/guzzlehttp/promises/tests/RejectionExceptionTest.php b/server/vendor/guzzlehttp/promises/tests/RejectionExceptionTest.php
deleted file mode 100644
index 36c6a88..0000000
--- a/server/vendor/guzzlehttp/promises/tests/RejectionExceptionTest.php
+++ /dev/null
@@ -1,47 +0,0 @@
-<?php
-namespace GuzzleHttp\Promise\Tests;
-
-use GuzzleHttp\Promise\RejectionException;
-
-class Thing1
-{
- public function __construct($message)
- {
- $this->message = $message;
- }
-
- public function __toString()
- {
- return $this->message;
- }
-}
-
-class Thing2 implements \JsonSerializable
-{
- public function jsonSerialize()
- {
- return '{}';
- }
-}
-
-/**
- * @covers GuzzleHttp\Promise\RejectionException
- */
-class RejectionExceptionTest extends \PHPUnit_Framework_TestCase
-{
- public function testCanGetReasonFromException()
- {
- $thing = new Thing1('foo');
- $e = new RejectionException($thing);
-
- $this->assertSame($thing, $e->getReason());
- $this->assertEquals('The promise was rejected with reason: foo', $e->getMessage());
- }
-
- public function testCanGetReasonMessageFromJson()
- {
- $reason = new Thing2();
- $e = new RejectionException($reason);
- $this->assertContains("{}", $e->getMessage());
- }
-}
diff --git a/server/vendor/guzzlehttp/promises/tests/TaskQueueTest.php b/server/vendor/guzzlehttp/promises/tests/TaskQueueTest.php
deleted file mode 100644
index 845b263..0000000
--- a/server/vendor/guzzlehttp/promises/tests/TaskQueueTest.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-namespace GuzzleHttp\Promise\Test;
-
-use GuzzleHttp\Promise\TaskQueue;
-
-class TaskQueueTest extends \PHPUnit_Framework_TestCase
-{
- public function testKnowsIfEmpty()
- {
- $tq = new TaskQueue(false);
- $this->assertTrue($tq->isEmpty());
- }
-
- public function testKnowsIfFull()
- {
- $tq = new TaskQueue(false);
- $tq->add(function () {});
- $this->assertFalse($tq->isEmpty());
- }
-
- public function testExecutesTasksInOrder()
- {
- $tq = new TaskQueue(false);
- $called = [];
- $tq->add(function () use (&$called) { $called[] = 'a'; });
- $tq->add(function () use (&$called) { $called[] = 'b'; });
- $tq->add(function () use (&$called) { $called[] = 'c'; });
- $tq->run();
- $this->assertEquals(['a', 'b', 'c'], $called);
- }
-}
diff --git a/server/vendor/guzzlehttp/promises/tests/Thennable.php b/server/vendor/guzzlehttp/promises/tests/Thennable.php
deleted file mode 100644
index 398954d..0000000
--- a/server/vendor/guzzlehttp/promises/tests/Thennable.php
+++ /dev/null
@@ -1,24 +0,0 @@
-<?php
-namespace GuzzleHttp\Promise\Tests;
-
-use GuzzleHttp\Promise\Promise;
-
-class Thennable
-{
- private $nextPromise = null;
-
- public function __construct()
- {
- $this->nextPromise = new Promise();
- }
-
- public function then(callable $res = null, callable $rej = null)
- {
- return $this->nextPromise->then($res, $rej);
- }
-
- public function resolve($value)
- {
- $this->nextPromise->resolve($value);
- }
-}
diff --git a/server/vendor/guzzlehttp/promises/tests/bootstrap.php b/server/vendor/guzzlehttp/promises/tests/bootstrap.php
deleted file mode 100644
index a63d264..0000000
--- a/server/vendor/guzzlehttp/promises/tests/bootstrap.php
+++ /dev/null
@@ -1,4 +0,0 @@
-<?php
-require __DIR__ . '/../vendor/autoload.php';
-require __DIR__ . '/Thennable.php';
-require __DIR__ . '/NotPromiseInstance.php';
diff --git a/server/vendor/guzzlehttp/promises/tests/functionsTest.php b/server/vendor/guzzlehttp/promises/tests/functionsTest.php
deleted file mode 100644
index 8e6fcf4..0000000
--- a/server/vendor/guzzlehttp/promises/tests/functionsTest.php
+++ /dev/null
@@ -1,694 +0,0 @@
-<?php
-namespace GuzzleHttp\Promise\Tests;
-
-use GuzzleHttp\Promise as P;
-use GuzzleHttp\Promise\FulfilledPromise;
-use GuzzleHttp\Promise\Promise;
-use GuzzleHttp\Promise\RejectedPromise;
-
-class FunctionsTest extends \PHPUnit_Framework_TestCase
-{
- public function testCreatesPromiseForValue()
- {
- $p = \GuzzleHttp\Promise\promise_for('foo');
- $this->assertInstanceOf('GuzzleHttp\Promise\FulfilledPromise', $p);
- }
-
- public function testReturnsPromiseForPromise()
- {
- $p = new Promise();
- $this->assertSame($p, \GuzzleHttp\Promise\promise_for($p));
- }
-
- public function testReturnsPromiseForThennable()
- {
- $p = new Thennable();
- $wrapped = \GuzzleHttp\Promise\promise_for($p);
- $this->assertNotSame($p, $wrapped);
- $this->assertInstanceOf('GuzzleHttp\Promise\PromiseInterface', $wrapped);
- $p->resolve('foo');
- P\queue()->run();
- $this->assertEquals('foo', $wrapped->wait());
- }
-
- public function testReturnsRejection()
- {
- $p = \GuzzleHttp\Promise\rejection_for('fail');
- $this->assertInstanceOf('GuzzleHttp\Promise\RejectedPromise', $p);
- $this->assertEquals('fail', $this->readAttribute($p, 'reason'));
- }
-
- public function testReturnsPromisesAsIsInRejectionFor()
- {
- $a = new Promise();
- $b = \GuzzleHttp\Promise\rejection_for($a);
- $this->assertSame($a, $b);
- }
-
- public function testWaitsOnAllPromisesIntoArray()
- {
- $e = new \Exception();
- $a = new Promise(function () use (&$a) { $a->resolve('a'); });
- $b = new Promise(function () use (&$b) { $b->reject('b'); });
- $c = new Promise(function () use (&$c, $e) { $c->reject($e); });
- $results = \GuzzleHttp\Promise\inspect_all([$a, $b, $c]);
- $this->assertEquals([
- ['state' => 'fulfilled', 'value' => 'a'],
- ['state' => 'rejected', 'reason' => 'b'],
- ['state' => 'rejected', 'reason' => $e]
- ], $results);
- }
-
- /**
- * @expectedException \GuzzleHttp\Promise\RejectionException
- */
- public function testUnwrapsPromisesWithNoDefaultAndFailure()
- {
- $promises = [new FulfilledPromise('a'), new Promise()];
- \GuzzleHttp\Promise\unwrap($promises);
- }
-
- public function testUnwrapsPromisesWithNoDefault()
- {
- $promises = [new FulfilledPromise('a')];
- $this->assertEquals(['a'], \GuzzleHttp\Promise\unwrap($promises));
- }
-
- public function testUnwrapsPromisesWithKeys()
- {
- $promises = [
- 'foo' => new FulfilledPromise('a'),
- 'bar' => new FulfilledPromise('b'),
- ];
- $this->assertEquals([
- 'foo' => 'a',
- 'bar' => 'b'
- ], \GuzzleHttp\Promise\unwrap($promises));
- }
-
- public function testAllAggregatesSortedArray()
- {
- $a = new Promise();
- $b = new Promise();
- $c = new Promise();
- $d = \GuzzleHttp\Promise\all([$a, $b, $c]);
- $b->resolve('b');
- $a->resolve('a');
- $c->resolve('c');
- $d->then(
- function ($value) use (&$result) { $result = $value; },
- function ($reason) use (&$result) { $result = $reason; }
- );
- P\queue()->run();
- $this->assertEquals(['a', 'b', 'c'], $result);
- }
-
- public function testAllThrowsWhenAnyRejected()
- {
- $a = new Promise();
- $b = new Promise();
- $c = new Promise();
- $d = \GuzzleHttp\Promise\all([$a, $b, $c]);
- $b->resolve('b');
- $a->reject('fail');
- $c->resolve('c');
- $d->then(
- function ($value) use (&$result) { $result = $value; },
- function ($reason) use (&$result) { $result = $reason; }
- );
- P\queue()->run();
- $this->assertEquals('fail', $result);
- }
-
- public function testSomeAggregatesSortedArrayWithMax()
- {
- $a = new Promise();
- $b = new Promise();
- $c = new Promise();
- $d = \GuzzleHttp\Promise\some(2, [$a, $b, $c]);
- $b->resolve('b');
- $c->resolve('c');
- $a->resolve('a');
- $d->then(function ($value) use (&$result) { $result = $value; });
- P\queue()->run();
- $this->assertEquals(['b', 'c'], $result);
- }
-
- public function testSomeRejectsWhenTooManyRejections()
- {
- $a = new Promise();
- $b = new Promise();
- $d = \GuzzleHttp\Promise\some(2, [$a, $b]);
- $a->reject('bad');
- $b->resolve('good');
- P\queue()->run();
- $this->assertEquals($a::REJECTED, $d->getState());
- $d->then(null, function ($reason) use (&$called) {
- $called = $reason;
- });
- P\queue()->run();
- $this->assertInstanceOf('GuzzleHttp\Promise\AggregateException', $called);
- $this->assertContains('bad', $called->getReason());
- }
-
- public function testCanWaitUntilSomeCountIsSatisfied()
- {
- $a = new Promise(function () use (&$a) { $a->resolve('a'); });
- $b = new Promise(function () use (&$b) { $b->resolve('b'); });
- $c = new Promise(function () use (&$c) { $c->resolve('c'); });
- $d = \GuzzleHttp\Promise\some(2, [$a, $b, $c]);
- $this->assertEquals(['a', 'b'], $d->wait());
- }
-
- /**
- * @expectedException \GuzzleHttp\Promise\AggregateException
- * @expectedExceptionMessage Not enough promises to fulfill count
- */
- public function testThrowsIfImpossibleToWaitForSomeCount()
- {
- $a = new Promise(function () use (&$a) { $a->resolve('a'); });
- $d = \GuzzleHttp\Promise\some(2, [$a]);
- $d->wait();
- }
-
- /**
- * @expectedException \GuzzleHttp\Promise\AggregateException
- * @expectedExceptionMessage Not enough promises to fulfill count
- */
- public function testThrowsIfResolvedWithoutCountTotalResults()
- {
- $a = new Promise();
- $b = new Promise();
- $d = \GuzzleHttp\Promise\some(3, [$a, $b]);
- $a->resolve('a');
- $b->resolve('b');
- $d->wait();
- }
-
- public function testAnyReturnsFirstMatch()
- {
- $a = new Promise();
- $b = new Promise();
- $c = \GuzzleHttp\Promise\any([$a, $b]);
- $b->resolve('b');
- $a->resolve('a');
- //P\queue()->run();
- //$this->assertEquals('fulfilled', $c->getState());
- $c->then(function ($value) use (&$result) { $result = $value; });
- P\queue()->run();
- $this->assertEquals('b', $result);
- }
-
- public function testSettleFulfillsWithFulfilledAndRejected()
- {
- $a = new Promise();
- $b = new Promise();
- $c = new Promise();
- $d = \GuzzleHttp\Promise\settle([$a, $b, $c]);
- $b->resolve('b');
- $c->resolve('c');
- $a->reject('a');
- P\queue()->run();
- $this->assertEquals('fulfilled', $d->getState());
- $d->then(function ($value) use (&$result) { $result = $value; });
- P\queue()->run();
- $this->assertEquals([
- ['state' => 'rejected', 'reason' => 'a'],
- ['state' => 'fulfilled', 'value' => 'b'],
- ['state' => 'fulfilled', 'value' => 'c']
- ], $result);
- }
-
- public function testCanInspectFulfilledPromise()
- {
- $p = new FulfilledPromise('foo');
- $this->assertEquals([
- 'state' => 'fulfilled',
- 'value' => 'foo'
- ], \GuzzleHttp\Promise\inspect($p));
- }
-
- public function testCanInspectRejectedPromise()
- {
- $p = new RejectedPromise('foo');
- $this->assertEquals([
- 'state' => 'rejected',
- 'reason' => 'foo'
- ], \GuzzleHttp\Promise\inspect($p));
- }
-
- public function testCanInspectRejectedPromiseWithNormalException()
- {
- $e = new \Exception('foo');
- $p = new RejectedPromise($e);
- $this->assertEquals([
- 'state' => 'rejected',
- 'reason' => $e
- ], \GuzzleHttp\Promise\inspect($p));
- }
-
- public function testCallsEachLimit()
- {
- $p = new Promise();
- $aggregate = \GuzzleHttp\Promise\each_limit($p, 2);
- $p->resolve('a');
- P\queue()->run();
- $this->assertEquals($p::FULFILLED, $aggregate->getState());
- }
-
- public function testEachLimitAllRejectsOnFailure()
- {
- $p = [new FulfilledPromise('a'), new RejectedPromise('b')];
- $aggregate = \GuzzleHttp\Promise\each_limit_all($p, 2);
- P\queue()->run();
- $this->assertEquals(P\PromiseInterface::REJECTED, $aggregate->getState());
- $result = \GuzzleHttp\Promise\inspect($aggregate);
- $this->assertEquals('b', $result['reason']);
- }
-
- public function testIterForReturnsIterator()
- {
- $iter = new \ArrayIterator();
- $this->assertSame($iter, \GuzzleHttp\Promise\iter_for($iter));
- }
-
- public function testKnowsIfFulfilled()
- {
- $p = new FulfilledPromise(null);
- $this->assertTrue(P\is_fulfilled($p));
- $this->assertFalse(P\is_rejected($p));
- }
-
- public function testKnowsIfRejected()
- {
- $p = new RejectedPromise(null);
- $this->assertTrue(P\is_rejected($p));
- $this->assertFalse(P\is_fulfilled($p));
- }
-
- public function testKnowsIfSettled()
- {
- $p = new RejectedPromise(null);
- $this->assertTrue(P\is_settled($p));
- $p = new Promise();
- $this->assertFalse(P\is_settled($p));
- }
-
- public function testReturnsTrampoline()
- {
- $this->assertInstanceOf('GuzzleHttp\Promise\TaskQueue', P\queue());
- $this->assertSame(P\queue(), P\queue());
- }
-
- public function testCanScheduleThunk()
- {
- $tramp = P\queue();
- $promise = P\task(function () { return 'Hi!'; });
- $c = null;
- $promise->then(function ($v) use (&$c) { $c = $v; });
- $this->assertNull($c);
- $tramp->run();
- $this->assertEquals('Hi!', $c);
- }
-
- public function testCanScheduleThunkWithRejection()
- {
- $tramp = P\queue();
- $promise = P\task(function () { throw new \Exception('Hi!'); });
- $c = null;
- $promise->otherwise(function ($v) use (&$c) { $c = $v; });
- $this->assertNull($c);
- $tramp->run();
- $this->assertEquals('Hi!', $c->getMessage());
- }
-
- public function testCanScheduleThunkWithWait()
- {
- $tramp = P\queue();
- $promise = P\task(function () { return 'a'; });
- $this->assertEquals('a', $promise->wait());
- $tramp->run();
- }
-
- public function testYieldsFromCoroutine()
- {
- $promise = P\coroutine(function () {
- $value = (yield new P\FulfilledPromise('a'));
- yield $value . 'b';
- });
- $promise->then(function ($value) use (&$result) { $result = $value; });
- P\queue()->run();
- $this->assertEquals('ab', $result);
- }
-
- public function testCanCatchExceptionsInCoroutine()
- {
- $promise = P\coroutine(function () {
- try {
- yield new P\RejectedPromise('a');
- $this->fail('Should have thrown into the coroutine!');
- } catch (P\RejectionException $e) {
- $value = (yield new P\FulfilledPromise($e->getReason()));
- yield $value . 'b';
- }
- });
- $promise->then(function ($value) use (&$result) { $result = $value; });
- P\queue()->run();
- $this->assertEquals(P\PromiseInterface::FULFILLED, $promise->getState());
- $this->assertEquals('ab', $result);
- }
-
- public function testRejectsParentExceptionWhenException()
- {
- $promise = P\coroutine(function () {
- yield new P\FulfilledPromise(0);
- throw new \Exception('a');
- });
- $promise->then(
- function () { $this->fail(); },
- function ($reason) use (&$result) { $result = $reason; }
- );
- P\queue()->run();
- $this->assertInstanceOf('Exception', $result);
- $this->assertEquals('a', $result->getMessage());
- }
-
- public function testCanRejectFromRejectionCallback()
- {
- $promise = P\coroutine(function () {
- yield new P\FulfilledPromise(0);
- yield new P\RejectedPromise('no!');
- });
- $promise->then(
- function () { $this->fail(); },
- function ($reason) use (&$result) { $result = $reason; }
- );
- P\queue()->run();
- $this->assertInstanceOf('GuzzleHttp\Promise\RejectionException', $result);
- $this->assertEquals('no!', $result->getReason());
- }
-
- public function testCanAsyncReject()
- {
- $rej = new P\Promise();
- $promise = P\coroutine(function () use ($rej) {
- yield new P\FulfilledPromise(0);
- yield $rej;
- });
- $promise->then(
- function () { $this->fail(); },
- function ($reason) use (&$result) { $result = $reason; }
- );
- $rej->reject('no!');
- P\queue()->run();
- $this->assertInstanceOf('GuzzleHttp\Promise\RejectionException', $result);
- $this->assertEquals('no!', $result->getReason());
- }
-
- public function testCanCatchAndThrowOtherException()
- {
- $promise = P\coroutine(function () {
- try {
- yield new P\RejectedPromise('a');
- $this->fail('Should have thrown into the coroutine!');
- } catch (P\RejectionException $e) {
- throw new \Exception('foo');
- }
- });
- $promise->otherwise(function ($value) use (&$result) { $result = $value; });
- P\queue()->run();
- $this->assertEquals(P\PromiseInterface::REJECTED, $promise->getState());
- $this->assertContains('foo', $result->getMessage());
- }
-
- public function testCanCatchAndYieldOtherException()
- {
- $promise = P\coroutine(function () {
- try {
- yield new P\RejectedPromise('a');
- $this->fail('Should have thrown into the coroutine!');
- } catch (P\RejectionException $e) {
- yield new P\RejectedPromise('foo');
- }
- });
- $promise->otherwise(function ($value) use (&$result) { $result = $value; });
- P\queue()->run();
- $this->assertEquals(P\PromiseInterface::REJECTED, $promise->getState());
- $this->assertContains('foo', $result->getMessage());
- }
-
- public function createLotsOfSynchronousPromise()
- {
- return P\coroutine(function () {
- $value = 0;
- for ($i = 0; $i < 1000; $i++) {
- $value = (yield new P\FulfilledPromise($i));
- }
- yield $value;
- });
- }
-
- public function testLotsOfSynchronousDoesNotBlowStack()
- {
- $promise = $this->createLotsOfSynchronousPromise();
- $promise->then(function ($v) use (&$r) { $r = $v; });
- P\queue()->run();
- $this->assertEquals(999, $r);
- }
-
- public function testLotsOfSynchronousWaitDoesNotBlowStack()
- {
- $promise = $this->createLotsOfSynchronousPromise();
- $promise->then(function ($v) use (&$r) { $r = $v; });
- $this->assertEquals(999, $promise->wait());
- $this->assertEquals(999, $r);
- }
-
- private function createLotsOfFlappingPromise()
- {
- return P\coroutine(function () {
- $value = 0;
- for ($i = 0; $i < 1000; $i++) {
- try {
- if ($i % 2) {
- $value = (yield new P\FulfilledPromise($i));
- } else {
- $value = (yield new P\RejectedPromise($i));
- }
- } catch (\Exception $e) {
- $value = (yield new P\FulfilledPromise($i));
- }
- }
- yield $value;
- });
- }
-
- public function testLotsOfTryCatchingDoesNotBlowStack()
- {
- $promise = $this->createLotsOfFlappingPromise();
- $promise->then(function ($v) use (&$r) { $r = $v; });
- P\queue()->run();
- $this->assertEquals(999, $r);
- }
-
- public function testLotsOfTryCatchingWaitingDoesNotBlowStack()
- {
- $promise = $this->createLotsOfFlappingPromise();
- $promise->then(function ($v) use (&$r) { $r = $v; });
- $this->assertEquals(999, $promise->wait());
- $this->assertEquals(999, $r);
- }
-
- public function testAsyncPromisesWithCorrectlyYieldedValues()
- {
- $promises = [
- new P\Promise(),
- new P\Promise(),
- new P\Promise()
- ];
-
- $promise = P\coroutine(function () use ($promises) {
- $value = null;
- $this->assertEquals('skip', (yield new P\FulfilledPromise('skip')));
- foreach ($promises as $idx => $p) {
- $value = (yield $p);
- $this->assertEquals($value, $idx);
- $this->assertEquals('skip', (yield new P\FulfilledPromise('skip')));
- }
- $this->assertEquals('skip', (yield new P\FulfilledPromise('skip')));
- yield $value;
- });
-
- $promises[0]->resolve(0);
- $promises[1]->resolve(1);
- $promises[2]->resolve(2);
-
- $promise->then(function ($v) use (&$r) { $r = $v; });
- P\queue()->run();
- $this->assertEquals(2, $r);
- }
-
- public function testYieldFinalWaitablePromise()
- {
- $p1 = new P\Promise(function () use (&$p1) {
- $p1->resolve('skip me');
- });
- $p2 = new P\Promise(function () use (&$p2) {
- $p2->resolve('hello!');
- });
- $co = P\coroutine(function() use ($p1, $p2) {
- yield $p1;
- yield $p2;
- });
- P\queue()->run();
- $this->assertEquals('hello!', $co->wait());
- }
-
- public function testCanYieldFinalPendingPromise()
- {
- $p1 = new P\Promise();
- $p2 = new P\Promise();
- $co = P\coroutine(function() use ($p1, $p2) {
- yield $p1;
- yield $p2;
- });
- $p1->resolve('a');
- $p2->resolve('b');
- $co->then(function ($value) use (&$result) { $result = $value; });
- P\queue()->run();
- $this->assertEquals('b', $result);
- }
-
- public function testCanNestYieldsAndFailures()
- {
- $p1 = new P\Promise();
- $p2 = new P\Promise();
- $p3 = new P\Promise();
- $p4 = new P\Promise();
- $p5 = new P\Promise();
- $co = P\coroutine(function() use ($p1, $p2, $p3, $p4, $p5) {
- try {
- yield $p1;
- } catch (\Exception $e) {
- yield $p2;
- try {
- yield $p3;
- yield $p4;
- } catch (\Exception $e) {
- yield $p5;
- }
- }
- });
- $p1->reject('a');
- $p2->resolve('b');
- $p3->resolve('c');
- $p4->reject('d');
- $p5->resolve('e');
- $co->then(function ($value) use (&$result) { $result = $value; });
- P\queue()->run();
- $this->assertEquals('e', $result);
- }
-
- public function testCanYieldErrorsAndSuccessesWithoutRecursion()
- {
- $promises = [];
- for ($i = 0; $i < 20; $i++) {
- $promises[] = new P\Promise();
- }
-
- $co = P\coroutine(function() use ($promises) {
- for ($i = 0; $i < 20; $i += 4) {
- try {
- yield $promises[$i];
- yield $promises[$i + 1];
- } catch (\Exception $e) {
- yield $promises[$i + 2];
- yield $promises[$i + 3];
- }
- }
- });
-
- for ($i = 0; $i < 20; $i += 4) {
- $promises[$i]->resolve($i);
- $promises[$i + 1]->reject($i + 1);
- $promises[$i + 2]->resolve($i + 2);
- $promises[$i + 3]->resolve($i + 3);
- }
-
- $co->then(function ($value) use (&$result) { $result = $value; });
- P\queue()->run();
- $this->assertEquals('19', $result);
- }
-
- public function testCanWaitOnPromiseAfterFulfilled()
- {
- $f = function () {
- static $i = 0;
- $i++;
- return $p = new P\Promise(function () use (&$p, $i) {
- $p->resolve($i . '-bar');
- });
- };
-
- $promises = [];
- for ($i = 0; $i < 20; $i++) {
- $promises[] = $f();
- }
-
- $p = P\coroutine(function () use ($promises) {
- yield new P\FulfilledPromise('foo!');
- foreach ($promises as $promise) {
- yield $promise;
- }
- });
-
- $this->assertEquals('20-bar', $p->wait());
- }
-
- public function testCanWaitOnErroredPromises()
- {
- $p1 = new P\Promise(function () use (&$p1) { $p1->reject('a'); });
- $p2 = new P\Promise(function () use (&$p2) { $p2->resolve('b'); });
- $p3 = new P\Promise(function () use (&$p3) { $p3->resolve('c'); });
- $p4 = new P\Promise(function () use (&$p4) { $p4->reject('d'); });
- $p5 = new P\Promise(function () use (&$p5) { $p5->resolve('e'); });
- $p6 = new P\Promise(function () use (&$p6) { $p6->reject('f'); });
-
- $co = P\coroutine(function() use ($p1, $p2, $p3, $p4, $p5, $p6) {
- try {
- yield $p1;
- } catch (\Exception $e) {
- yield $p2;
- try {
- yield $p3;
- yield $p4;
- } catch (\Exception $e) {
- yield $p5;
- yield $p6;
- }
- }
- });
-
- $res = P\inspect($co);
- $this->assertEquals('f', $res['reason']);
- }
-
- public function testCoroutineOtherwiseIntegrationTest()
- {
- $a = new P\Promise();
- $b = new P\Promise();
- $promise = P\coroutine(function () use ($a, $b) {
- // Execute the pool of commands concurrently, and process errors.
- yield $a;
- yield $b;
- })->otherwise(function (\Exception $e) {
- // Throw errors from the operations as a specific Multipart error.
- throw new \OutOfBoundsException('a', 0, $e);
- });
- $a->resolve('a');
- $b->reject('b');
- $reason = P\inspect($promise)['reason'];
- $this->assertInstanceOf('OutOfBoundsException', $reason);
- $this->assertInstanceOf('GuzzleHttp\Promise\RejectionException', $reason->getPrevious());
- }
-}
diff --git a/server/vendor/guzzlehttp/psr7/.gitignore b/server/vendor/guzzlehttp/psr7/.gitignore
deleted file mode 100644
index 83ec41e..0000000
--- a/server/vendor/guzzlehttp/psr7/.gitignore
+++ /dev/null
@@ -1,11 +0,0 @@
-phpunit.xml
-composer.phar
-composer.lock
-composer-test.lock
-vendor/
-build/artifacts/
-artifacts/
-docs/_build
-docs/*.pyc
-.idea
-.DS_STORE
diff --git a/server/vendor/guzzlehttp/psr7/.travis.yml b/server/vendor/guzzlehttp/psr7/.travis.yml
deleted file mode 100644
index b88f8da..0000000
--- a/server/vendor/guzzlehttp/psr7/.travis.yml
+++ /dev/null
@@ -1,20 +0,0 @@
-language: php
-
-php:
- - 5.4
- - 5.5
- - 5.6
- - 7.0
- - hhvm
-
-sudo: false
-
-install:
- - travis_retry composer install --no-interaction --prefer-source
-
-script: make test
-
-matrix:
- allow_failures:
- - php: hhvm
- fast_finish: true
diff --git a/server/vendor/guzzlehttp/psr7/CHANGELOG.md b/server/vendor/guzzlehttp/psr7/CHANGELOG.md
index 0771a9a..5c252b3 100644
--- a/server/vendor/guzzlehttp/psr7/CHANGELOG.md
+++ b/server/vendor/guzzlehttp/psr7/CHANGELOG.md
@@ -1,5 +1,45 @@
# CHANGELOG
+## 1.4.2 - 2017-03-20
+
+* Reverted BC break to `Uri::resolve` and `Uri::removeDotSegments` by removing
+ calls to `trigger_error` when deprecated methods are invoked.
+
+## 1.4.1 - 2017-02-27
+
+* Reverted BC break by reintroducing behavior to automagically fix a URI with a
+ relative path and an authority by adding a leading slash to the path. It's only
+ deprecated now.
+* Added triggering of silenced deprecation warnings.
+
+## 1.4.0 - 2017-02-21
+
+* Fix `Stream::read` when length parameter <= 0.
+* `copy_to_stream` reads bytes in chunks instead of `maxLen` into memory.
+* Fix `ServerRequest::getUriFromGlobals` when `Host` header contains port.
+* Ensure `ServerRequest::getUriFromGlobals` returns a URI in absolute form.
+* Allow `parse_response` to parse a response without delimiting space and reason.
+* Ensure each URI modification results in a valid URI according to PSR-7 discussions.
+ Invalid modifications will throw an exception instead of returning a wrong URI or
+ doing some magic.
+ - `(new Uri)->withPath('foo')->withHost('example.com')` will throw an exception
+ because the path of a URI with an authority must start with a slash "/" or be empty
+ - `(new Uri())->withScheme('http')` will return `'http://localhost'`
+* Fix compatibility of URIs with `file` scheme and empty host.
+* Added common URI utility methods based on RFC 3986 (see documentation in the readme):
+ - `Uri::isDefaultPort`
+ - `Uri::isAbsolute`
+ - `Uri::isNetworkPathReference`
+ - `Uri::isAbsolutePathReference`
+ - `Uri::isRelativePathReference`
+ - `Uri::isSameDocumentReference`
+ - `Uri::composeComponents`
+ - `UriNormalizer::normalize`
+ - `UriNormalizer::isEquivalent`
+ - `UriResolver::relativize`
+* Deprecated `Uri::resolve` in favor of `UriResolver::resolve`
+* Deprecated `Uri::removeDotSegments` in favor of `UriResolver::removeDotSegments`
+
## 1.3.1 - 2016-06-25
* Fix `Uri::__toString` for network path references, e.g. `//example.org`.
diff --git a/server/vendor/guzzlehttp/psr7/Makefile b/server/vendor/guzzlehttp/psr7/Makefile
deleted file mode 100644
index 8b00b43..0000000
--- a/server/vendor/guzzlehttp/psr7/Makefile
+++ /dev/null
@@ -1,29 +0,0 @@
-all: clean test
-
-test:
- vendor/bin/phpunit $(TEST)
-
-coverage:
- vendor/bin/phpunit --coverage-html=artifacts/coverage $(TEST)
-
-view-coverage:
- open artifacts/coverage/index.html
-
-check-tag:
- $(if $(TAG),,$(error TAG is not defined. Pass via "make tag TAG=4.2.1"))
-
-tag: check-tag
- @echo Tagging $(TAG)
- chag update $(TAG)
- git commit -a -m '$(TAG) release'
- chag tag
- @echo "Release has been created. Push using 'make release'"
- @echo "Changes made in the release commit"
- git diff HEAD~1 HEAD
-
-release: check-tag
- git push origin master
- git push origin $(TAG)
-
-clean:
- rm -rf artifacts/*
diff --git a/server/vendor/guzzlehttp/psr7/README.md b/server/vendor/guzzlehttp/psr7/README.md
index 2642164..1649935 100644
--- a/server/vendor/guzzlehttp/psr7/README.md
+++ b/server/vendor/guzzlehttp/psr7/README.md
@@ -519,51 +519,221 @@ Determines the mimetype of a file by looking at its extension.
Maps a file extensions to a mimetype.
-# Static URI methods
+# Additional URI Methods
-The `GuzzleHttp\Psr7\Uri` class has several static methods to manipulate URIs.
+Aside from the standard `Psr\Http\Message\UriInterface` implementation in form of the `GuzzleHttp\Psr7\Uri` class,
+this library also provides additional functionality when working with URIs as static methods.
+## URI Types
-## `GuzzleHttp\Psr7\Uri::removeDotSegments`
+An instance of `Psr\Http\Message\UriInterface` can either be an absolute URI or a relative reference.
+An absolute URI has a scheme. A relative reference is used to express a URI relative to another URI,
+the base URI. Relative references can be divided into several forms according to
+[RFC 3986 Section 4.2](https://tools.ietf.org/html/rfc3986#section-4.2):
-`public static function removeDotSegments(string $path): string`
+- network-path references, e.g. `//example.com/path`
+- absolute-path references, e.g. `/path`
+- relative-path references, e.g. `subpath`
-Removes dot segments from a path and returns the new path.
+The following methods can be used to identify the type of the URI.
-See http://tools.ietf.org/html/rfc3986#section-5.2.4
+### `GuzzleHttp\Psr7\Uri::isAbsolute`
+`public static function isAbsolute(UriInterface $uri): bool`
-## `GuzzleHttp\Psr7\Uri::resolve`
+Whether the URI is absolute, i.e. it has a scheme.
-`public static function resolve(UriInterface $base, $rel): UriInterface`
+### `GuzzleHttp\Psr7\Uri::isNetworkPathReference`
-Resolve a base URI with a relative URI and return a new URI.
+`public static function isNetworkPathReference(UriInterface $uri): bool`
-See http://tools.ietf.org/html/rfc3986#section-5
+Whether the URI is a network-path reference. A relative reference that begins with two slash characters is
+termed an network-path reference.
+### `GuzzleHttp\Psr7\Uri::isAbsolutePathReference`
-## `GuzzleHttp\Psr7\Uri::withQueryValue`
+`public static function isAbsolutePathReference(UriInterface $uri): bool`
-`public static function withQueryValue(UriInterface $uri, $key, $value): UriInterface`
+Whether the URI is a absolute-path reference. A relative reference that begins with a single slash character is
+termed an absolute-path reference.
-Create a new URI with a specific query string value.
+### `GuzzleHttp\Psr7\Uri::isRelativePathReference`
-Any existing query string values that exactly match the provided key are
-removed and replaced with the given key value pair.
+`public static function isRelativePathReference(UriInterface $uri): bool`
+Whether the URI is a relative-path reference. A relative reference that does not begin with a slash character is
+termed a relative-path reference.
-## `GuzzleHttp\Psr7\Uri::withoutQueryValue`
+### `GuzzleHttp\Psr7\Uri::isSameDocumentReference`
-`public static function withoutQueryValue(UriInterface $uri, $key): UriInterface`
+`public static function isSameDocumentReference(UriInterface $uri, UriInterface $base = null): bool`
+
+Whether the URI is a same-document reference. A same-document reference refers to a URI that is, aside from its
+fragment component, identical to the base URI. When no base URI is given, only an empty URI reference
+(apart from its fragment) is considered a same-document reference.
+
+## URI Components
+
+Additional methods to work with URI components.
+
+### `GuzzleHttp\Psr7\Uri::isDefaultPort`
+
+`public static function isDefaultPort(UriInterface $uri): bool`
+
+Whether the URI has the default port of the current scheme. `Psr\Http\Message\UriInterface::getPort` may return null
+or the standard port. This method can be used independently of the implementation.
-Create a new URI with a specific query string value removed.
+### `GuzzleHttp\Psr7\Uri::composeComponents`
-Any existing query string values that exactly match the provided key are
-removed.
+`public static function composeComponents($scheme, $authority, $path, $query, $fragment): string`
+Composes a URI reference string from its various components according to
+[RFC 3986 Section 5.3](https://tools.ietf.org/html/rfc3986#section-5.3). Usually this method does not need to be called
+manually but instead is used indirectly via `Psr\Http\Message\UriInterface::__toString`.
-## `GuzzleHttp\Psr7\Uri::fromParts`
+### `GuzzleHttp\Psr7\Uri::fromParts`
`public static function fromParts(array $parts): UriInterface`
-Create a `GuzzleHttp\Psr7\Uri` object from a hash of `parse_url` parts.
+Creates a URI from a hash of [`parse_url`](http://php.net/manual/en/function.parse-url.php) components.
+
+
+### `GuzzleHttp\Psr7\Uri::withQueryValue`
+
+`public static function withQueryValue(UriInterface $uri, $key, $value): UriInterface`
+
+Creates a new URI with a specific query string value. Any existing query string values that exactly match the
+provided key are removed and replaced with the given key value pair. A value of null will set the query string
+key without a value, e.g. "key" instead of "key=value".
+
+
+### `GuzzleHttp\Psr7\Uri::withoutQueryValue`
+
+`public static function withoutQueryValue(UriInterface $uri, $key): UriInterface`
+
+Creates a new URI with a specific query string value removed. Any existing query string values that exactly match the
+provided key are removed.
+
+## Reference Resolution
+
+`GuzzleHttp\Psr7\UriResolver` provides methods to resolve a URI reference in the context of a base URI according
+to [RFC 3986 Section 5](https://tools.ietf.org/html/rfc3986#section-5). This is for example also what web browsers
+do when resolving a link in a website based on the current request URI.
+
+### `GuzzleHttp\Psr7\UriResolver::resolve`
+
+`public static function resolve(UriInterface $base, UriInterface $rel): UriInterface`
+
+Converts the relative URI into a new URI that is resolved against the base URI.
+
+### `GuzzleHttp\Psr7\UriResolver::removeDotSegments`
+
+`public static function removeDotSegments(string $path): string`
+
+Removes dot segments from a path and returns the new path according to
+[RFC 3986 Section 5.2.4](https://tools.ietf.org/html/rfc3986#section-5.2.4).
+
+### `GuzzleHttp\Psr7\UriResolver::relativize`
+
+`public static function relativize(UriInterface $base, UriInterface $target): UriInterface`
+
+Returns the target URI as a relative reference from the base URI. This method is the counterpart to resolve():
+
+```php
+(string) $target === (string) UriResolver::resolve($base, UriResolver::relativize($base, $target))
+```
+
+One use-case is to use the current request URI as base URI and then generate relative links in your documents
+to reduce the document size or offer self-contained downloadable document archives.
+
+```php
+$base = new Uri('http://example.com/a/b/');
+echo UriResolver::relativize($base, new Uri('http://example.com/a/b/c')); // prints 'c'.
+echo UriResolver::relativize($base, new Uri('http://example.com/a/x/y')); // prints '../x/y'.
+echo UriResolver::relativize($base, new Uri('http://example.com/a/b/?q')); // prints '?q'.
+echo UriResolver::relativize($base, new Uri('http://example.org/a/b/')); // prints '//example.org/a/b/'.
+```
+
+## Normalization and Comparison
+
+`GuzzleHttp\Psr7\UriNormalizer` provides methods to normalize and compare URIs according to
+[RFC 3986 Section 6](https://tools.ietf.org/html/rfc3986#section-6).
+
+### `GuzzleHttp\Psr7\UriNormalizer::normalize`
+
+`public static function normalize(UriInterface $uri, $flags = self::PRESERVING_NORMALIZATIONS): UriInterface`
+
+Returns a normalized URI. The scheme and host component are already normalized to lowercase per PSR-7 UriInterface.
+This methods adds additional normalizations that can be configured with the `$flags` parameter which is a bitmask
+of normalizations to apply. The following normalizations are available:
+
+- `UriNormalizer::PRESERVING_NORMALIZATIONS`
+
+ Default normalizations which only include the ones that preserve semantics.
+
+- `UriNormalizer::CAPITALIZE_PERCENT_ENCODING`
+
+ All letters within a percent-encoding triplet (e.g., "%3A") are case-insensitive, and should be capitalized.
+
+ Example: `http://example.org/a%c2%b1b` → `http://example.org/a%C2%B1b`
+
+- `UriNormalizer::DECODE_UNRESERVED_CHARACTERS`
+
+ Decodes percent-encoded octets of unreserved characters. For consistency, percent-encoded octets in the ranges of
+ ALPHA (%41–%5A and %61–%7A), DIGIT (%30–%39), hyphen (%2D), period (%2E), underscore (%5F), or tilde (%7E) should
+ not be created by URI producers and, when found in a URI, should be decoded to their corresponding unreserved
+ characters by URI normalizers.
+
+ Example: `http://example.org/%7Eusern%61me/` → `http://example.org/~username/`
+
+- `UriNormalizer::CONVERT_EMPTY_PATH`
+
+ Converts the empty path to "/" for http and https URIs.
+
+ Example: `http://example.org` → `http://example.org/`
+
+- `UriNormalizer::REMOVE_DEFAULT_HOST`
+
+ Removes the default host of the given URI scheme from the URI. Only the "file" scheme defines the default host
+ "localhost". All of `file:/myfile`, `file:///myfile`, and `file://localhost/myfile` are equivalent according to
+ RFC 3986.
+
+ Example: `file://localhost/myfile` → `file:///myfile`
+
+- `UriNormalizer::REMOVE_DEFAULT_PORT`
+
+ Removes the default port of the given URI scheme from the URI.
+
+ Example: `http://example.org:80/` → `http://example.org/`
+
+- `UriNormalizer::REMOVE_DOT_SEGMENTS`
+
+ Removes unnecessary dot-segments. Dot-segments in relative-path references are not removed as it would
+ change the semantics of the URI reference.
+
+ Example: `http://example.org/../a/b/../c/./d.html` → `http://example.org/a/c/d.html`
+
+- `UriNormalizer::REMOVE_DUPLICATE_SLASHES`
+
+ Paths which include two or more adjacent slashes are converted to one. Webservers usually ignore duplicate slashes
+ and treat those URIs equivalent. But in theory those URIs do not need to be equivalent. So this normalization
+ may change the semantics. Encoded slashes (%2F) are not removed.
+
+ Example: `http://example.org//foo///bar.html` → `http://example.org/foo/bar.html`
+
+- `UriNormalizer::SORT_QUERY_PARAMETERS`
+
+ Sort query parameters with their values in alphabetical order. However, the order of parameters in a URI may be
+ significant (this is not defined by the standard). So this normalization is not safe and may change the semantics
+ of the URI.
+
+ Example: `?lang=en&article=fred` → `?article=fred&lang=en`
+
+### `GuzzleHttp\Psr7\UriNormalizer::isEquivalent`
+
+`public static function isEquivalent(UriInterface $uri1, UriInterface $uri2, $normalizations = self::PRESERVING_NORMALIZATIONS): bool`
+
+Whether two URIs can be considered equivalent. Both URIs are normalized automatically before comparison with the given
+`$normalizations` bitmask. The method also accepts relative URI references and returns true when they are equivalent.
+This of course assumes they will be resolved against the same base URI. If this is not the case, determination of
+equivalence or difference of relative references does not mean anything.
diff --git a/server/vendor/guzzlehttp/psr7/composer.json b/server/vendor/guzzlehttp/psr7/composer.json
index fdfb97b..b1c5a90 100644
--- a/server/vendor/guzzlehttp/psr7/composer.json
+++ b/server/vendor/guzzlehttp/psr7/composer.json
@@ -1,14 +1,18 @@
{
"name": "guzzlehttp/psr7",
"type": "library",
- "description": "PSR-7 message implementation",
- "keywords": ["message", "stream", "http", "uri"],
+ "description": "PSR-7 message implementation that also provides common utility methods",
+ "keywords": ["request", "response", "message", "stream", "http", "uri", "url"],
"license": "MIT",
"authors": [
{
"name": "Michael Dowling",
"email": "mtdowling@gmail.com",
"homepage": "https://github.com/mtdowling"
+ },
+ {
+ "name": "Tobias Schultze",
+ "homepage": "https://github.com/Tobion"
}
],
"require": {
diff --git a/server/vendor/guzzlehttp/psr7/phpunit.xml.dist b/server/vendor/guzzlehttp/psr7/phpunit.xml.dist
deleted file mode 100644
index 500cd53..0000000
--- a/server/vendor/guzzlehttp/psr7/phpunit.xml.dist
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<phpunit bootstrap="./tests/bootstrap.php"
- colors="true">
- <testsuites>
- <testsuite>
- <directory>tests</directory>
- </testsuite>
- </testsuites>
- <filter>
- <whitelist>
- <directory suffix=".php">src</directory>
- <exclude>
- <directory suffix="Interface.php">src/</directory>
- </exclude>
- </whitelist>
- </filter>
-</phpunit>
diff --git a/server/vendor/guzzlehttp/psr7/src/LimitStream.php b/server/vendor/guzzlehttp/psr7/src/LimitStream.php
index 7f2298b..3c13d4f 100644
--- a/server/vendor/guzzlehttp/psr7/src/LimitStream.php
+++ b/server/vendor/guzzlehttp/psr7/src/LimitStream.php
@@ -21,7 +21,7 @@ class LimitStream implements StreamInterface
* @param StreamInterface $stream Stream to wrap
* @param int $limit Total number of bytes to allow to be read
* from the stream. Pass -1 for no limit.
- * @param int|null $offset Position to seek to before reading (only
+ * @param int $offset Position to seek to before reading (only
* works on seekable streams).
*/
public function __construct(
diff --git a/server/vendor/guzzlehttp/psr7/src/MultipartStream.php b/server/vendor/guzzlehttp/psr7/src/MultipartStream.php
index 2988fcb..c0fd584 100644
--- a/server/vendor/guzzlehttp/psr7/src/MultipartStream.php
+++ b/server/vendor/guzzlehttp/psr7/src/MultipartStream.php
@@ -27,7 +27,7 @@ class MultipartStream implements StreamInterface
*/
public function __construct(array $elements = [], $boundary = null)
{
- $this->boundary = $boundary ?: uniqid();
+ $this->boundary = $boundary ?: sha1(uniqid('', true));
$this->stream = $this->createStream($elements);
}
@@ -108,7 +108,7 @@ class MultipartStream implements StreamInterface
/**
* @return array
*/
- private function createElement($name, $stream, $filename, array $headers)
+ private function createElement($name, StreamInterface $stream, $filename, array $headers)
{
// Set a default content-disposition header if one was no provided
$disposition = $this->getHeader($headers, 'content-disposition');
diff --git a/server/vendor/guzzlehttp/psr7/src/Request.php b/server/vendor/guzzlehttp/psr7/src/Request.php
index 4a3db6e..0828548 100644
--- a/server/vendor/guzzlehttp/psr7/src/Request.php
+++ b/server/vendor/guzzlehttp/psr7/src/Request.php
@@ -19,7 +19,7 @@ class Request implements RequestInterface
/** @var null|string */
private $requestTarget;
- /** @var null|UriInterface */
+ /** @var UriInterface */
private $uri;
/**
diff --git a/server/vendor/guzzlehttp/psr7/src/Response.php b/server/vendor/guzzlehttp/psr7/src/Response.php
index 841ff02..2830c6c 100644
--- a/server/vendor/guzzlehttp/psr7/src/Response.php
+++ b/server/vendor/guzzlehttp/psr7/src/Response.php
@@ -2,6 +2,7 @@
namespace GuzzleHttp\Psr7;
use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\StreamInterface;
/**
* PSR-7 response implementation.
@@ -100,7 +101,7 @@ class Response implements ResponseInterface
$this->setHeaders($headers);
if ($reason == '' && isset(self::$phrases[$this->statusCode])) {
- $this->reasonPhrase = self::$phrases[$status];
+ $this->reasonPhrase = self::$phrases[$this->statusCode];
} else {
$this->reasonPhrase = (string) $reason;
}
diff --git a/server/vendor/guzzlehttp/psr7/src/ServerRequest.php b/server/vendor/guzzlehttp/psr7/src/ServerRequest.php
index a6a47be..575aab8 100644
--- a/server/vendor/guzzlehttp/psr7/src/ServerRequest.php
+++ b/server/vendor/guzzlehttp/psr7/src/ServerRequest.php
@@ -188,25 +188,37 @@ class ServerRequest extends Request implements ServerRequestInterface
public static function getUriFromGlobals() {
$uri = new Uri('');
- if (isset($_SERVER['HTTPS'])) {
- $uri = $uri->withScheme($_SERVER['HTTPS'] == 'on' ? 'https' : 'http');
- }
+ $uri = $uri->withScheme(!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' ? 'https' : 'http');
+ $hasPort = false;
if (isset($_SERVER['HTTP_HOST'])) {
- $uri = $uri->withHost($_SERVER['HTTP_HOST']);
+ $hostHeaderParts = explode(':', $_SERVER['HTTP_HOST']);
+ $uri = $uri->withHost($hostHeaderParts[0]);
+ if (isset($hostHeaderParts[1])) {
+ $hasPort = true;
+ $uri = $uri->withPort($hostHeaderParts[1]);
+ }
} elseif (isset($_SERVER['SERVER_NAME'])) {
$uri = $uri->withHost($_SERVER['SERVER_NAME']);
+ } elseif (isset($_SERVER['SERVER_ADDR'])) {
+ $uri = $uri->withHost($_SERVER['SERVER_ADDR']);
}
- if (isset($_SERVER['SERVER_PORT'])) {
+ if (!$hasPort && isset($_SERVER['SERVER_PORT'])) {
$uri = $uri->withPort($_SERVER['SERVER_PORT']);
}
+ $hasQuery = false;
if (isset($_SERVER['REQUEST_URI'])) {
- $uri = $uri->withPath(current(explode('?', $_SERVER['REQUEST_URI'])));
+ $requestUriParts = explode('?', $_SERVER['REQUEST_URI']);
+ $uri = $uri->withPath($requestUriParts[0]);
+ if (isset($requestUriParts[1])) {
+ $hasQuery = true;
+ $uri = $uri->withQuery($requestUriParts[1]);
+ }
}
- if (isset($_SERVER['QUERY_STRING'])) {
+ if (!$hasQuery && isset($_SERVER['QUERY_STRING'])) {
$uri = $uri->withQuery($_SERVER['QUERY_STRING']);
}
diff --git a/server/vendor/guzzlehttp/psr7/src/Stream.php b/server/vendor/guzzlehttp/psr7/src/Stream.php
index 214af15..e336628 100644
--- a/server/vendor/guzzlehttp/psr7/src/Stream.php
+++ b/server/vendor/guzzlehttp/psr7/src/Stream.php
@@ -207,8 +207,20 @@ class Stream implements StreamInterface
if (!$this->readable) {
throw new \RuntimeException('Cannot read from non-readable stream');
}
+ if ($length < 0) {
+ throw new \RuntimeException('Length parameter cannot be negative');
+ }
+
+ if (0 === $length) {
+ return '';
+ }
+
+ $string = fread($this->stream, $length);
+ if (false === $string) {
+ throw new \RuntimeException('Unable to read from stream');
+ }
- return fread($this->stream, $length);
+ return $string;
}
public function write($string)
diff --git a/server/vendor/guzzlehttp/psr7/src/Uri.php b/server/vendor/guzzlehttp/psr7/src/Uri.php
index 44a1e9d..f46c1db 100644
--- a/server/vendor/guzzlehttp/psr7/src/Uri.php
+++ b/server/vendor/guzzlehttp/psr7/src/Uri.php
@@ -12,9 +12,26 @@ use Psr\Http\Message\UriInterface;
*/
class Uri implements UriInterface
{
- private static $schemes = [
+ /**
+ * Absolute http and https URIs require a host per RFC 7230 Section 2.7
+ * but in generic URIs the host can be empty. So for http(s) URIs
+ * we apply this default host when no host is given yet to form a
+ * valid URI.
+ */
+ const HTTP_DEFAULT_HOST = 'localhost';
+
+ private static $defaultPorts = [
'http' => 80,
'https' => 443,
+ 'ftp' => 21,
+ 'gopher' => 70,
+ 'nntp' => 119,
+ 'news' => 119,
+ 'telnet' => 23,
+ 'tn3270' => 23,
+ 'imap' => 143,
+ 'pop' => 110,
+ 'ldap' => 389,
];
private static $charUnreserved = 'a-zA-Z0-9_\-\.~';
@@ -47,6 +64,7 @@ class Uri implements UriInterface
*/
public function __construct($uri = '')
{
+ // weak type check to also accept null until we can add scalar type hints
if ($uri != '') {
$parts = parse_url($uri);
if ($parts === false) {
@@ -58,7 +76,7 @@ class Uri implements UriInterface
public function __toString()
{
- return self::createUriString(
+ return self::composeComponents(
$this->scheme,
$this->getAuthority(),
$this->path,
@@ -68,56 +86,198 @@ class Uri implements UriInterface
}
/**
- * Removes dot segments from a path and returns the new path.
+ * Composes a URI reference string from its various components.
+ *
+ * Usually this method does not need to be called manually but instead is used indirectly via
+ * `Psr\Http\Message\UriInterface::__toString`.
+ *
+ * PSR-7 UriInterface treats an empty component the same as a missing component as
+ * getQuery(), getFragment() etc. always return a string. This explains the slight
+ * difference to RFC 3986 Section 5.3.
*
+ * Another adjustment is that the authority separator is added even when the authority is missing/empty
+ * for the "file" scheme. This is because PHP stream functions like `file_get_contents` only work with
+ * `file:///myfile` but not with `file:/myfile` although they are equivalent according to RFC 3986. But
+ * `file:///` is the more common syntax for the file scheme anyway (Chrome for example redirects to
+ * that format).
+ *
+ * @param string $scheme
+ * @param string $authority
* @param string $path
+ * @param string $query
+ * @param string $fragment
*
* @return string
- * @link http://tools.ietf.org/html/rfc3986#section-5.2.4
+ *
+ * @link https://tools.ietf.org/html/rfc3986#section-5.3
*/
- public static function removeDotSegments($path)
+ public static function composeComponents($scheme, $authority, $path, $query, $fragment)
{
- static $noopPaths = ['' => true, '/' => true, '*' => true];
- static $ignoreSegments = ['.' => true, '..' => true];
+ $uri = '';
- if (isset($noopPaths[$path])) {
- return $path;
+ // weak type checks to also accept null until we can add scalar type hints
+ if ($scheme != '') {
+ $uri .= $scheme . ':';
}
- $results = [];
- $segments = explode('/', $path);
- foreach ($segments as $segment) {
- if ($segment === '..') {
- array_pop($results);
- } elseif (!isset($ignoreSegments[$segment])) {
- $results[] = $segment;
- }
+ if ($authority != ''|| $scheme === 'file') {
+ $uri .= '//' . $authority;
}
- $newPath = implode('/', $results);
- // Add the leading slash if necessary
- if (substr($path, 0, 1) === '/' &&
- substr($newPath, 0, 1) !== '/'
- ) {
- $newPath = '/' . $newPath;
+ $uri .= $path;
+
+ if ($query != '') {
+ $uri .= '?' . $query;
}
- // Add the trailing slash if necessary
- if ($newPath !== '/' && isset($ignoreSegments[end($segments)])) {
- $newPath .= '/';
+ if ($fragment != '') {
+ $uri .= '#' . $fragment;
}
- return $newPath;
+ return $uri;
+ }
+
+ /**
+ * Whether the URI has the default port of the current scheme.
+ *
+ * `Psr\Http\Message\UriInterface::getPort` may return null or the standard port. This method can be used
+ * independently of the implementation.
+ *
+ * @param UriInterface $uri
+ *
+ * @return bool
+ */
+ public static function isDefaultPort(UriInterface $uri)
+ {
+ return $uri->getPort() === null
+ || (isset(self::$defaultPorts[$uri->getScheme()]) && $uri->getPort() === self::$defaultPorts[$uri->getScheme()]);
}
/**
- * Resolve a base URI with a relative URI and return a new URI.
+ * Whether the URI is absolute, i.e. it has a scheme.
+ *
+ * An instance of UriInterface can either be an absolute URI or a relative reference. This method returns true
+ * if it is the former. An absolute URI has a scheme. A relative reference is used to express a URI relative
+ * to another URI, the base URI. Relative references can be divided into several forms:
+ * - network-path references, e.g. '//example.com/path'
+ * - absolute-path references, e.g. '/path'
+ * - relative-path references, e.g. 'subpath'
+ *
+ * @param UriInterface $uri
+ *
+ * @return bool
+ * @see Uri::isNetworkPathReference
+ * @see Uri::isAbsolutePathReference
+ * @see Uri::isRelativePathReference
+ * @link https://tools.ietf.org/html/rfc3986#section-4
+ */
+ public static function isAbsolute(UriInterface $uri)
+ {
+ return $uri->getScheme() !== '';
+ }
+
+ /**
+ * Whether the URI is a network-path reference.
+ *
+ * A relative reference that begins with two slash characters is termed an network-path reference.
+ *
+ * @param UriInterface $uri
+ *
+ * @return bool
+ * @link https://tools.ietf.org/html/rfc3986#section-4.2
+ */
+ public static function isNetworkPathReference(UriInterface $uri)
+ {
+ return $uri->getScheme() === '' && $uri->getAuthority() !== '';
+ }
+
+ /**
+ * Whether the URI is a absolute-path reference.
+ *
+ * A relative reference that begins with a single slash character is termed an absolute-path reference.
+ *
+ * @param UriInterface $uri
+ *
+ * @return bool
+ * @link https://tools.ietf.org/html/rfc3986#section-4.2
+ */
+ public static function isAbsolutePathReference(UriInterface $uri)
+ {
+ return $uri->getScheme() === ''
+ && $uri->getAuthority() === ''
+ && isset($uri->getPath()[0])
+ && $uri->getPath()[0] === '/';
+ }
+
+ /**
+ * Whether the URI is a relative-path reference.
+ *
+ * A relative reference that does not begin with a slash character is termed a relative-path reference.
+ *
+ * @param UriInterface $uri
+ *
+ * @return bool
+ * @link https://tools.ietf.org/html/rfc3986#section-4.2
+ */
+ public static function isRelativePathReference(UriInterface $uri)
+ {
+ return $uri->getScheme() === ''
+ && $uri->getAuthority() === ''
+ && (!isset($uri->getPath()[0]) || $uri->getPath()[0] !== '/');
+ }
+
+ /**
+ * Whether the URI is a same-document reference.
+ *
+ * A same-document reference refers to a URI that is, aside from its fragment
+ * component, identical to the base URI. When no base URI is given, only an empty
+ * URI reference (apart from its fragment) is considered a same-document reference.
+ *
+ * @param UriInterface $uri The URI to check
+ * @param UriInterface|null $base An optional base URI to compare against
+ *
+ * @return bool
+ * @link https://tools.ietf.org/html/rfc3986#section-4.4
+ */
+ public static function isSameDocumentReference(UriInterface $uri, UriInterface $base = null)
+ {
+ if ($base !== null) {
+ $uri = UriResolver::resolve($base, $uri);
+
+ return ($uri->getScheme() === $base->getScheme())
+ && ($uri->getAuthority() === $base->getAuthority())
+ && ($uri->getPath() === $base->getPath())
+ && ($uri->getQuery() === $base->getQuery());
+ }
+
+ return $uri->getScheme() === '' && $uri->getAuthority() === '' && $uri->getPath() === '' && $uri->getQuery() === '';
+ }
+
+ /**
+ * Removes dot segments from a path and returns the new path.
+ *
+ * @param string $path
+ *
+ * @return string
+ *
+ * @deprecated since version 1.4. Use UriResolver::removeDotSegments instead.
+ * @see UriResolver::removeDotSegments
+ */
+ public static function removeDotSegments($path)
+ {
+ return UriResolver::removeDotSegments($path);
+ }
+
+ /**
+ * Converts the relative URI into a new URI that is resolved against the base URI.
*
* @param UriInterface $base Base URI
* @param string|UriInterface $rel Relative URI
*
* @return UriInterface
- * @link http://tools.ietf.org/html/rfc3986#section-5.2
+ *
+ * @deprecated since version 1.4. Use UriResolver::resolve instead.
+ * @see UriResolver::resolve
*/
public static function resolve(UriInterface $base, $rel)
{
@@ -125,55 +285,11 @@ class Uri implements UriInterface
$rel = new self($rel);
}
- if ((string) $rel === '') {
- // we can simply return the same base URI instance for this same-document reference
- return $base;
- }
-
- if ($rel->getScheme() != '') {
- return $rel->withPath(self::removeDotSegments($rel->getPath()));
- }
-
- if ($rel->getAuthority() != '') {
- $targetAuthority = $rel->getAuthority();
- $targetPath = self::removeDotSegments($rel->getPath());
- $targetQuery = $rel->getQuery();
- } else {
- $targetAuthority = $base->getAuthority();
- if ($rel->getPath() === '') {
- $targetPath = $base->getPath();
- $targetQuery = $rel->getQuery() != '' ? $rel->getQuery() : $base->getQuery();
- } else {
- if ($rel->getPath()[0] === '/') {
- $targetPath = $rel->getPath();
- } else {
- if ($targetAuthority != '' && $base->getPath() === '') {
- $targetPath = '/' . $rel->getPath();
- } else {
- $lastSlashPos = strrpos($base->getPath(), '/');
- if ($lastSlashPos === false) {
- $targetPath = $rel->getPath();
- } else {
- $targetPath = substr($base->getPath(), 0, $lastSlashPos + 1) . $rel->getPath();
- }
- }
- }
- $targetPath = self::removeDotSegments($targetPath);
- $targetQuery = $rel->getQuery();
- }
- }
-
- return new self(self::createUriString(
- $base->getScheme(),
- $targetAuthority,
- $targetPath,
- $targetQuery,
- $rel->getFragment()
- ));
+ return UriResolver::resolve($base, $rel);
}
/**
- * Create a new URI with a specific query string value removed.
+ * Creates a new URI with a specific query string value removed.
*
* Any existing query string values that exactly match the provided key are
* removed.
@@ -186,7 +302,7 @@ class Uri implements UriInterface
public static function withoutQueryValue(UriInterface $uri, $key)
{
$current = $uri->getQuery();
- if ($current == '') {
+ if ($current === '') {
return $uri;
}
@@ -199,7 +315,7 @@ class Uri implements UriInterface
}
/**
- * Create a new URI with a specific query string value.
+ * Creates a new URI with a specific query string value.
*
* Any existing query string values that exactly match the provided key are
* removed and replaced with the given key value pair.
@@ -217,7 +333,7 @@ class Uri implements UriInterface
{
$current = $uri->getQuery();
- if ($current == '') {
+ if ($current === '') {
$result = [];
} else {
$decodedKey = rawurldecode($key);
@@ -241,16 +357,21 @@ class Uri implements UriInterface
}
/**
- * Create a URI from a hash of parse_url parts.
+ * Creates a URI from a hash of `parse_url` components.
*
* @param array $parts
*
- * @return self
+ * @return UriInterface
+ * @link http://php.net/manual/en/function.parse-url.php
+ *
+ * @throws \InvalidArgumentException If the components do not form a valid URI.
*/
public static function fromParts(array $parts)
{
$uri = new self();
$uri->applyParts($parts);
+ $uri->validateState();
+
return $uri;
}
@@ -261,12 +382,8 @@ class Uri implements UriInterface
public function getAuthority()
{
- if ($this->host == '') {
- return '';
- }
-
$authority = $this->host;
- if ($this->userInfo != '') {
+ if ($this->userInfo !== '') {
$authority = $this->userInfo . '@' . $authority;
}
@@ -317,7 +434,9 @@ class Uri implements UriInterface
$new = clone $this;
$new->scheme = $scheme;
- $new->port = $new->filterPort($new->port);
+ $new->removeDefaultPort();
+ $new->validateState();
+
return $new;
}
@@ -334,6 +453,8 @@ class Uri implements UriInterface
$new = clone $this;
$new->userInfo = $info;
+ $new->validateState();
+
return $new;
}
@@ -347,6 +468,8 @@ class Uri implements UriInterface
$new = clone $this;
$new->host = $host;
+ $new->validateState();
+
return $new;
}
@@ -360,6 +483,9 @@ class Uri implements UriInterface
$new = clone $this;
$new->port = $port;
+ $new->removeDefaultPort();
+ $new->validateState();
+
return $new;
}
@@ -373,6 +499,8 @@ class Uri implements UriInterface
$new = clone $this;
$new->path = $path;
+ $new->validateState();
+
return $new;
}
@@ -386,6 +514,7 @@ class Uri implements UriInterface
$new = clone $this;
$new->query = $query;
+
return $new;
}
@@ -399,6 +528,7 @@ class Uri implements UriInterface
$new = clone $this;
$new->fragment = $fragment;
+
return $new;
}
@@ -431,69 +561,8 @@ class Uri implements UriInterface
if (isset($parts['pass'])) {
$this->userInfo .= ':' . $parts['pass'];
}
- }
-
- /**
- * Create a URI string from its various parts
- *
- * @param string $scheme
- * @param string $authority
- * @param string $path
- * @param string $query
- * @param string $fragment
- * @return string
- */
- private static function createUriString($scheme, $authority, $path, $query, $fragment)
- {
- $uri = '';
-
- if ($scheme != '') {
- $uri .= $scheme . ':';
- }
-
- if ($authority != '') {
- $uri .= '//' . $authority;
- }
-
- if ($path != '') {
- if ($path[0] !== '/') {
- if ($authority != '') {
- // If the path is rootless and an authority is present, the path MUST be prefixed by "/"
- $path = '/' . $path;
- }
- } elseif (isset($path[1]) && $path[1] === '/') {
- if ($authority == '') {
- // If the path is starting with more than one "/" and no authority is present, the
- // starting slashes MUST be reduced to one.
- $path = '/' . ltrim($path, '/');
- }
- }
-
- $uri .= $path;
- }
-
- if ($query != '') {
- $uri .= '?' . $query;
- }
-
- if ($fragment != '') {
- $uri .= '#' . $fragment;
- }
-
- return $uri;
- }
- /**
- * Is a given port non-standard for the current scheme?
- *
- * @param string $scheme
- * @param int $port
- *
- * @return bool
- */
- private static function isNonStandardPort($scheme, $port)
- {
- return !isset(self::$schemes[$scheme]) || $port !== self::$schemes[$scheme];
+ $this->removeDefaultPort();
}
/**
@@ -548,7 +617,14 @@ class Uri implements UriInterface
);
}
- return self::isNonStandardPort($this->scheme, $port) ? $port : null;
+ return $port;
+ }
+
+ private function removeDefaultPort()
+ {
+ if ($this->port !== null && self::isDefaultPort($this)) {
+ $this->port = null;
+ }
}
/**
@@ -599,4 +675,28 @@ class Uri implements UriInterface
{
return rawurlencode($match[0]);
}
+
+ private function validateState()
+ {
+ if ($this->host === '' && ($this->scheme === 'http' || $this->scheme === 'https')) {
+ $this->host = self::HTTP_DEFAULT_HOST;
+ }
+
+ if ($this->getAuthority() === '') {
+ if (0 === strpos($this->path, '//')) {
+ throw new \InvalidArgumentException('The path of a URI without an authority must not start with two slashes "//"');
+ }
+ if ($this->scheme === '' && false !== strpos(explode('/', $this->path, 2)[0], ':')) {
+ throw new \InvalidArgumentException('A relative URI must not have a path beginning with a segment containing a colon');
+ }
+ } elseif (isset($this->path[0]) && $this->path[0] !== '/') {
+ @trigger_error(
+ 'The path of a URI with an authority must start with a slash "/" or be empty. Automagically fixing the URI ' .
+ 'by adding a leading slash to the path is deprecated since version 1.4 and will throw an exception instead.',
+ E_USER_DEPRECATED
+ );
+ $this->path = '/'. $this->path;
+ //throw new \InvalidArgumentException('The path of a URI with an authority must start with a slash "/" or be empty');
+ }
+ }
}
diff --git a/server/vendor/guzzlehttp/psr7/src/UriNormalizer.php b/server/vendor/guzzlehttp/psr7/src/UriNormalizer.php
new file mode 100644
index 0000000..384c29e
--- /dev/null
+++ b/server/vendor/guzzlehttp/psr7/src/UriNormalizer.php
@@ -0,0 +1,216 @@
+<?php
+namespace GuzzleHttp\Psr7;
+
+use Psr\Http\Message\UriInterface;
+
+/**
+ * Provides methods to normalize and compare URIs.
+ *
+ * @author Tobias Schultze
+ *
+ * @link https://tools.ietf.org/html/rfc3986#section-6
+ */
+final class UriNormalizer
+{
+ /**
+ * Default normalizations which only include the ones that preserve semantics.
+ *
+ * self::CAPITALIZE_PERCENT_ENCODING | self::DECODE_UNRESERVED_CHARACTERS | self::CONVERT_EMPTY_PATH |
+ * self::REMOVE_DEFAULT_HOST | self::REMOVE_DEFAULT_PORT | self::REMOVE_DOT_SEGMENTS
+ */
+ const PRESERVING_NORMALIZATIONS = 63;
+
+ /**
+ * All letters within a percent-encoding triplet (e.g., "%3A") are case-insensitive, and should be capitalized.
+ *
+ * Example: http://example.org/a%c2%b1b → http://example.org/a%C2%B1b
+ */
+ const CAPITALIZE_PERCENT_ENCODING = 1;
+
+ /**
+ * Decodes percent-encoded octets of unreserved characters.
+ *
+ * For consistency, percent-encoded octets in the ranges of ALPHA (%41–%5A and %61–%7A), DIGIT (%30–%39),
+ * hyphen (%2D), period (%2E), underscore (%5F), or tilde (%7E) should not be created by URI producers and,
+ * when found in a URI, should be decoded to their corresponding unreserved characters by URI normalizers.
+ *
+ * Example: http://example.org/%7Eusern%61me/ → http://example.org/~username/
+ */
+ const DECODE_UNRESERVED_CHARACTERS = 2;
+
+ /**
+ * Converts the empty path to "/" for http and https URIs.
+ *
+ * Example: http://example.org → http://example.org/
+ */
+ const CONVERT_EMPTY_PATH = 4;
+
+ /**
+ * Removes the default host of the given URI scheme from the URI.
+ *
+ * Only the "file" scheme defines the default host "localhost".
+ * All of `file:/myfile`, `file:///myfile`, and `file://localhost/myfile`
+ * are equivalent according to RFC 3986. The first format is not accepted
+ * by PHPs stream functions and thus already normalized implicitly to the
+ * second format in the Uri class. See `GuzzleHttp\Psr7\Uri::composeComponents`.
+ *
+ * Example: file://localhost/myfile → file:///myfile
+ */
+ const REMOVE_DEFAULT_HOST = 8;
+
+ /**
+ * Removes the default port of the given URI scheme from the URI.
+ *
+ * Example: http://example.org:80/ → http://example.org/
+ */
+ const REMOVE_DEFAULT_PORT = 16;
+
+ /**
+ * Removes unnecessary dot-segments.
+ *
+ * Dot-segments in relative-path references are not removed as it would
+ * change the semantics of the URI reference.
+ *
+ * Example: http://example.org/../a/b/../c/./d.html → http://example.org/a/c/d.html
+ */
+ const REMOVE_DOT_SEGMENTS = 32;
+
+ /**
+ * Paths which include two or more adjacent slashes are converted to one.
+ *
+ * Webservers usually ignore duplicate slashes and treat those URIs equivalent.
+ * But in theory those URIs do not need to be equivalent. So this normalization
+ * may change the semantics. Encoded slashes (%2F) are not removed.
+ *
+ * Example: http://example.org//foo///bar.html → http://example.org/foo/bar.html
+ */
+ const REMOVE_DUPLICATE_SLASHES = 64;
+
+ /**
+ * Sort query parameters with their values in alphabetical order.
+ *
+ * However, the order of parameters in a URI may be significant (this is not defined by the standard).
+ * So this normalization is not safe and may change the semantics of the URI.
+ *
+ * Example: ?lang=en&article=fred → ?article=fred&lang=en
+ *
+ * Note: The sorting is neither locale nor Unicode aware (the URI query does not get decoded at all) as the
+ * purpose is to be able to compare URIs in a reproducible way, not to have the params sorted perfectly.
+ */
+ const SORT_QUERY_PARAMETERS = 128;
+
+ /**
+ * Returns a normalized URI.
+ *
+ * The scheme and host component are already normalized to lowercase per PSR-7 UriInterface.
+ * This methods adds additional normalizations that can be configured with the $flags parameter.
+ *
+ * PSR-7 UriInterface cannot distinguish between an empty component and a missing component as
+ * getQuery(), getFragment() etc. always return a string. This means the URIs "/?#" and "/" are
+ * treated equivalent which is not necessarily true according to RFC 3986. But that difference
+ * is highly uncommon in reality. So this potential normalization is implied in PSR-7 as well.
+ *
+ * @param UriInterface $uri The URI to normalize
+ * @param int $flags A bitmask of normalizations to apply, see constants
+ *
+ * @return UriInterface The normalized URI
+ * @link https://tools.ietf.org/html/rfc3986#section-6.2
+ */
+ public static function normalize(UriInterface $uri, $flags = self::PRESERVING_NORMALIZATIONS)
+ {
+ if ($flags & self::CAPITALIZE_PERCENT_ENCODING) {
+ $uri = self::capitalizePercentEncoding($uri);
+ }
+
+ if ($flags & self::DECODE_UNRESERVED_CHARACTERS) {
+ $uri = self::decodeUnreservedCharacters($uri);
+ }
+
+ if ($flags & self::CONVERT_EMPTY_PATH && $uri->getPath() === '' &&
+ ($uri->getScheme() === 'http' || $uri->getScheme() === 'https')
+ ) {
+ $uri = $uri->withPath('/');
+ }
+
+ if ($flags & self::REMOVE_DEFAULT_HOST && $uri->getScheme() === 'file' && $uri->getHost() === 'localhost') {
+ $uri = $uri->withHost('');
+ }
+
+ if ($flags & self::REMOVE_DEFAULT_PORT && $uri->getPort() !== null && Uri::isDefaultPort($uri)) {
+ $uri = $uri->withPort(null);
+ }
+
+ if ($flags & self::REMOVE_DOT_SEGMENTS && !Uri::isRelativePathReference($uri)) {
+ $uri = $uri->withPath(UriResolver::removeDotSegments($uri->getPath()));
+ }
+
+ if ($flags & self::REMOVE_DUPLICATE_SLASHES) {
+ $uri = $uri->withPath(preg_replace('#//++#', '/', $uri->getPath()));
+ }
+
+ if ($flags & self::SORT_QUERY_PARAMETERS && $uri->getQuery() !== '') {
+ $queryKeyValues = explode('&', $uri->getQuery());
+ sort($queryKeyValues);
+ $uri = $uri->withQuery(implode('&', $queryKeyValues));
+ }
+
+ return $uri;
+ }
+
+ /**
+ * Whether two URIs can be considered equivalent.
+ *
+ * Both URIs are normalized automatically before comparison with the given $normalizations bitmask. The method also
+ * accepts relative URI references and returns true when they are equivalent. This of course assumes they will be
+ * resolved against the same base URI. If this is not the case, determination of equivalence or difference of
+ * relative references does not mean anything.
+ *
+ * @param UriInterface $uri1 An URI to compare
+ * @param UriInterface $uri2 An URI to compare
+ * @param int $normalizations A bitmask of normalizations to apply, see constants
+ *
+ * @return bool
+ * @link https://tools.ietf.org/html/rfc3986#section-6.1
+ */
+ public static function isEquivalent(UriInterface $uri1, UriInterface $uri2, $normalizations = self::PRESERVING_NORMALIZATIONS)
+ {
+ return (string) self::normalize($uri1, $normalizations) === (string) self::normalize($uri2, $normalizations);
+ }
+
+ private static function capitalizePercentEncoding(UriInterface $uri)
+ {
+ $regex = '/(?:%[A-Fa-f0-9]{2})++/';
+
+ $callback = function (array $match) {
+ return strtoupper($match[0]);
+ };
+
+ return
+ $uri->withPath(
+ preg_replace_callback($regex, $callback, $uri->getPath())
+ )->withQuery(
+ preg_replace_callback($regex, $callback, $uri->getQuery())
+ );
+ }
+
+ private static function decodeUnreservedCharacters(UriInterface $uri)
+ {
+ $regex = '/%(?:2D|2E|5F|7E|3[0-9]|[46][1-9A-F]|[57][0-9A])/i';
+
+ $callback = function (array $match) {
+ return rawurldecode($match[0]);
+ };
+
+ return
+ $uri->withPath(
+ preg_replace_callback($regex, $callback, $uri->getPath())
+ )->withQuery(
+ preg_replace_callback($regex, $callback, $uri->getQuery())
+ );
+ }
+
+ private function __construct()
+ {
+ // cannot be instantiated
+ }
+}
diff --git a/server/vendor/guzzlehttp/psr7/src/UriResolver.php b/server/vendor/guzzlehttp/psr7/src/UriResolver.php
new file mode 100644
index 0000000..c1cb8a2
--- /dev/null
+++ b/server/vendor/guzzlehttp/psr7/src/UriResolver.php
@@ -0,0 +1,219 @@
+<?php
+namespace GuzzleHttp\Psr7;
+
+use Psr\Http\Message\UriInterface;
+
+/**
+ * Resolves a URI reference in the context of a base URI and the opposite way.
+ *
+ * @author Tobias Schultze
+ *
+ * @link https://tools.ietf.org/html/rfc3986#section-5
+ */
+final class UriResolver
+{
+ /**
+ * Removes dot segments from a path and returns the new path.
+ *
+ * @param string $path
+ *
+ * @return string
+ * @link http://tools.ietf.org/html/rfc3986#section-5.2.4
+ */
+ public static function removeDotSegments($path)
+ {
+ if ($path === '' || $path === '/') {
+ return $path;
+ }
+
+ $results = [];
+ $segments = explode('/', $path);
+ foreach ($segments as $segment) {
+ if ($segment === '..') {
+ array_pop($results);
+ } elseif ($segment !== '.') {
+ $results[] = $segment;
+ }
+ }
+
+ $newPath = implode('/', $results);
+
+ if ($path[0] === '/' && (!isset($newPath[0]) || $newPath[0] !== '/')) {
+ // Re-add the leading slash if necessary for cases like "/.."
+ $newPath = '/' . $newPath;
+ } elseif ($newPath !== '' && ($segment === '.' || $segment === '..')) {
+ // Add the trailing slash if necessary
+ // If newPath is not empty, then $segment must be set and is the last segment from the foreach
+ $newPath .= '/';
+ }
+
+ return $newPath;
+ }
+
+ /**
+ * Converts the relative URI into a new URI that is resolved against the base URI.
+ *
+ * @param UriInterface $base Base URI
+ * @param UriInterface $rel Relative URI
+ *
+ * @return UriInterface
+ * @link http://tools.ietf.org/html/rfc3986#section-5.2
+ */
+ public static function resolve(UriInterface $base, UriInterface $rel)
+ {
+ if ((string) $rel === '') {
+ // we can simply return the same base URI instance for this same-document reference
+ return $base;
+ }
+
+ if ($rel->getScheme() != '') {
+ return $rel->withPath(self::removeDotSegments($rel->getPath()));
+ }
+
+ if ($rel->getAuthority() != '') {
+ $targetAuthority = $rel->getAuthority();
+ $targetPath = self::removeDotSegments($rel->getPath());
+ $targetQuery = $rel->getQuery();
+ } else {
+ $targetAuthority = $base->getAuthority();
+ if ($rel->getPath() === '') {
+ $targetPath = $base->getPath();
+ $targetQuery = $rel->getQuery() != '' ? $rel->getQuery() : $base->getQuery();
+ } else {
+ if ($rel->getPath()[0] === '/') {
+ $targetPath = $rel->getPath();
+ } else {
+ if ($targetAuthority != '' && $base->getPath() === '') {
+ $targetPath = '/' . $rel->getPath();
+ } else {
+ $lastSlashPos = strrpos($base->getPath(), '/');
+ if ($lastSlashPos === false) {
+ $targetPath = $rel->getPath();
+ } else {
+ $targetPath = substr($base->getPath(), 0, $lastSlashPos + 1) . $rel->getPath();
+ }
+ }
+ }
+ $targetPath = self::removeDotSegments($targetPath);
+ $targetQuery = $rel->getQuery();
+ }
+ }
+
+ return new Uri(Uri::composeComponents(
+ $base->getScheme(),
+ $targetAuthority,
+ $targetPath,
+ $targetQuery,
+ $rel->getFragment()
+ ));
+ }
+
+ /**
+ * Returns the target URI as a relative reference from the base URI.
+ *
+ * This method is the counterpart to resolve():
+ *
+ * (string) $target === (string) UriResolver::resolve($base, UriResolver::relativize($base, $target))
+ *
+ * One use-case is to use the current request URI as base URI and then generate relative links in your documents
+ * to reduce the document size or offer self-contained downloadable document archives.
+ *
+ * $base = new Uri('http://example.com/a/b/');
+ * echo UriResolver::relativize($base, new Uri('http://example.com/a/b/c')); // prints 'c'.
+ * echo UriResolver::relativize($base, new Uri('http://example.com/a/x/y')); // prints '../x/y'.
+ * echo UriResolver::relativize($base, new Uri('http://example.com/a/b/?q')); // prints '?q'.
+ * echo UriResolver::relativize($base, new Uri('http://example.org/a/b/')); // prints '//example.org/a/b/'.
+ *
+ * This method also accepts a target that is already relative and will try to relativize it further. Only a
+ * relative-path reference will be returned as-is.
+ *
+ * echo UriResolver::relativize($base, new Uri('/a/b/c')); // prints 'c' as well
+ *
+ * @param UriInterface $base Base URI
+ * @param UriInterface $target Target URI
+ *
+ * @return UriInterface The relative URI reference
+ */
+ public static function relativize(UriInterface $base, UriInterface $target)
+ {
+ if ($target->getScheme() !== '' &&
+ ($base->getScheme() !== $target->getScheme() || $target->getAuthority() === '' && $base->getAuthority() !== '')
+ ) {
+ return $target;
+ }
+
+ if (Uri::isRelativePathReference($target)) {
+ // As the target is already highly relative we return it as-is. It would be possible to resolve
+ // the target with `$target = self::resolve($base, $target);` and then try make it more relative
+ // by removing a duplicate query. But let's not do that automatically.
+ return $target;
+ }
+
+ if ($target->getAuthority() !== '' && $base->getAuthority() !== $target->getAuthority()) {
+ return $target->withScheme('');
+ }
+
+ // We must remove the path before removing the authority because if the path starts with two slashes, the URI
+ // would turn invalid. And we also cannot set a relative path before removing the authority, as that is also
+ // invalid.
+ $emptyPathUri = $target->withScheme('')->withPath('')->withUserInfo('')->withPort(null)->withHost('');
+
+ if ($base->getPath() !== $target->getPath()) {
+ return $emptyPathUri->withPath(self::getRelativePath($base, $target));
+ }
+
+ if ($base->getQuery() === $target->getQuery()) {
+ // Only the target fragment is left. And it must be returned even if base and target fragment are the same.
+ return $emptyPathUri->withQuery('');
+ }
+
+ // If the base URI has a query but the target has none, we cannot return an empty path reference as it would
+ // inherit the base query component when resolving.
+ if ($target->getQuery() === '') {
+ $segments = explode('/', $target->getPath());
+ $lastSegment = end($segments);
+
+ return $emptyPathUri->withPath($lastSegment === '' ? './' : $lastSegment);
+ }
+
+ return $emptyPathUri;
+ }
+
+ private static function getRelativePath(UriInterface $base, UriInterface $target)
+ {
+ $sourceSegments = explode('/', $base->getPath());
+ $targetSegments = explode('/', $target->getPath());
+ array_pop($sourceSegments);
+ $targetLastSegment = array_pop($targetSegments);
+ foreach ($sourceSegments as $i => $segment) {
+ if (isset($targetSegments[$i]) && $segment === $targetSegments[$i]) {
+ unset($sourceSegments[$i], $targetSegments[$i]);
+ } else {
+ break;
+ }
+ }
+ $targetSegments[] = $targetLastSegment;
+ $relativePath = str_repeat('../', count($sourceSegments)) . implode('/', $targetSegments);
+
+ // A reference to am empty last segment or an empty first sub-segment must be prefixed with "./".
+ // This also applies to a segment with a colon character (e.g., "file:colon") that cannot be used
+ // as the first segment of a relative-path reference, as it would be mistaken for a scheme name.
+ if ('' === $relativePath || false !== strpos(explode('/', $relativePath, 2)[0], ':')) {
+ $relativePath = "./$relativePath";
+ } elseif ('/' === $relativePath[0]) {
+ if ($base->getAuthority() != '' && $base->getPath() === '') {
+ // In this case an extra slash is added by resolve() automatically. So we must not add one here.
+ $relativePath = ".$relativePath";
+ } else {
+ $relativePath = "./$relativePath";
+ }
+ }
+
+ return $relativePath;
+ }
+
+ private function __construct()
+ {
+ // cannot be instantiated
+ }
+}
diff --git a/server/vendor/guzzlehttp/psr7/src/functions.php b/server/vendor/guzzlehttp/psr7/src/functions.php
index 96bf926..e40348d 100644
--- a/server/vendor/guzzlehttp/psr7/src/functions.php
+++ b/server/vendor/guzzlehttp/psr7/src/functions.php
@@ -371,25 +371,24 @@ function copy_to_stream(
StreamInterface $dest,
$maxLen = -1
) {
+ $bufferSize = 8192;
+
if ($maxLen === -1) {
while (!$source->eof()) {
- if (!$dest->write($source->read(1048576))) {
+ if (!$dest->write($source->read($bufferSize))) {
break;
}
}
- return;
- }
-
- $bytes = 0;
- while (!$source->eof()) {
- $buf = $source->read($maxLen - $bytes);
- if (!($len = strlen($buf))) {
- break;
- }
- $bytes += $len;
- $dest->write($buf);
- if ($bytes == $maxLen) {
- break;
+ } else {
+ $remaining = $maxLen;
+ while ($remaining > 0 && !$source->eof()) {
+ $buf = $source->read(min($bufferSize, $remaining));
+ $len = strlen($buf);
+ if (!$len) {
+ break;
+ }
+ $remaining -= $len;
+ $dest->write($buf);
}
}
}
@@ -492,7 +491,10 @@ function parse_request($message)
function parse_response($message)
{
$data = _parse_message($message);
- if (!preg_match('/^HTTP\/.* [0-9]{3} .*/', $data['start-line'])) {
+ // According to https://tools.ietf.org/html/rfc7230#section-3.1.2 the space
+ // between status-code and reason-phrase is required. But browsers accept
+ // responses without space and reason as well.
+ if (!preg_match('/^HTTP\/.* [0-9]{3}( .*|$)/', $data['start-line'])) {
throw new \InvalidArgumentException('Invalid response string');
}
$parts = explode(' ', $data['start-line'], 3);
diff --git a/server/vendor/guzzlehttp/psr7/tests/AppendStreamTest.php b/server/vendor/guzzlehttp/psr7/tests/AppendStreamTest.php
deleted file mode 100644
index 3c197dc..0000000
--- a/server/vendor/guzzlehttp/psr7/tests/AppendStreamTest.php
+++ /dev/null
@@ -1,186 +0,0 @@
-<?php
-namespace GuzzleHttp\Tests\Psr7;
-
-use GuzzleHttp\Psr7\AppendStream;
-use GuzzleHttp\Psr7;
-
-class AppendStreamTest extends \PHPUnit_Framework_TestCase
-{
- /**
- * @expectedException \InvalidArgumentException
- * @expectedExceptionMessage Each stream must be readable
- */
- public function testValidatesStreamsAreReadable()
- {
- $a = new AppendStream();
- $s = $this->getMockBuilder('Psr\Http\Message\StreamInterface')
- ->setMethods(['isReadable'])
- ->getMockForAbstractClass();
- $s->expects($this->once())
- ->method('isReadable')
- ->will($this->returnValue(false));
- $a->addStream($s);
- }
-
- /**
- * @expectedException \RuntimeException
- * @expectedExceptionMessage The AppendStream can only seek with SEEK_SET
- */
- public function testValidatesSeekType()
- {
- $a = new AppendStream();
- $a->seek(100, SEEK_CUR);
- }
-
- /**
- * @expectedException \RuntimeException
- * @expectedExceptionMessage Unable to seek stream 0 of the AppendStream
- */
- public function testTriesToRewindOnSeek()
- {
- $a = new AppendStream();
- $s = $this->getMockBuilder('Psr\Http\Message\StreamInterface')
- ->setMethods(['isReadable', 'rewind', 'isSeekable'])
- ->getMockForAbstractClass();
- $s->expects($this->once())
- ->method('isReadable')
- ->will($this->returnValue(true));
- $s->expects($this->once())
- ->method('isSeekable')
- ->will($this->returnValue(true));
- $s->expects($this->once())
- ->method('rewind')
- ->will($this->throwException(new \RuntimeException()));
- $a->addStream($s);
- $a->seek(10);
- }
-
- public function testSeeksToPositionByReading()
- {
- $a = new AppendStream([
- Psr7\stream_for('foo'),
- Psr7\stream_for('bar'),
- Psr7\stream_for('baz'),
- ]);
-
- $a->seek(3);
- $this->assertEquals(3, $a->tell());
- $this->assertEquals('bar', $a->read(3));
-
- $a->seek(6);
- $this->assertEquals(6, $a->tell());
- $this->assertEquals('baz', $a->read(3));
- }
-
- public function testDetachesEachStream()
- {
- $s1 = Psr7\stream_for('foo');
- $s2 = Psr7\stream_for('bar');
- $a = new AppendStream([$s1, $s2]);
- $this->assertSame('foobar', (string) $a);
- $a->detach();
- $this->assertSame('', (string) $a);
- $this->assertSame(0, $a->getSize());
- }
-
- public function testClosesEachStream()
- {
- $s1 = Psr7\stream_for('foo');
- $a = new AppendStream([$s1]);
- $a->close();
- $this->assertSame('', (string) $a);
- }
-
- /**
- * @expectedExceptionMessage Cannot write to an AppendStream
- * @expectedException \RuntimeException
- */
- public function testIsNotWritable()
- {
- $a = new AppendStream([Psr7\stream_for('foo')]);
- $this->assertFalse($a->isWritable());
- $this->assertTrue($a->isSeekable());
- $this->assertTrue($a->isReadable());
- $a->write('foo');
- }
-
- public function testDoesNotNeedStreams()
- {
- $a = new AppendStream();
- $this->assertEquals('', (string) $a);
- }
-
- public function testCanReadFromMultipleStreams()
- {
- $a = new AppendStream([
- Psr7\stream_for('foo'),
- Psr7\stream_for('bar'),
- Psr7\stream_for('baz'),
- ]);
- $this->assertFalse($a->eof());
- $this->assertSame(0, $a->tell());
- $this->assertEquals('foo', $a->read(3));
- $this->assertEquals('bar', $a->read(3));
- $this->assertEquals('baz', $a->read(3));
- $this->assertSame('', $a->read(1));
- $this->assertTrue($a->eof());
- $this->assertSame(9, $a->tell());
- $this->assertEquals('foobarbaz', (string) $a);
- }
-
- public function testCanDetermineSizeFromMultipleStreams()
- {
- $a = new AppendStream([
- Psr7\stream_for('foo'),
- Psr7\stream_for('bar')
- ]);
- $this->assertEquals(6, $a->getSize());
-
- $s = $this->getMockBuilder('Psr\Http\Message\StreamInterface')
- ->setMethods(['isSeekable', 'isReadable'])
- ->getMockForAbstractClass();
- $s->expects($this->once())
- ->method('isSeekable')
- ->will($this->returnValue(null));
- $s->expects($this->once())
- ->method('isReadable')
- ->will($this->returnValue(true));
- $a->addStream($s);
- $this->assertNull($a->getSize());
- }
-
- public function testCatchesExceptionsWhenCastingToString()
- {
- $s = $this->getMockBuilder('Psr\Http\Message\StreamInterface')
- ->setMethods(['isSeekable', 'read', 'isReadable', 'eof'])
- ->getMockForAbstractClass();
- $s->expects($this->once())
- ->method('isSeekable')
- ->will($this->returnValue(true));
- $s->expects($this->once())
- ->method('read')
- ->will($this->throwException(new \RuntimeException('foo')));
- $s->expects($this->once())
- ->method('isReadable')
- ->will($this->returnValue(true));
- $s->expects($this->any())
- ->method('eof')
- ->will($this->returnValue(false));
- $a = new AppendStream([$s]);
- $this->assertFalse($a->eof());
- $this->assertSame('', (string) $a);
- }
-
- public function testCanDetach()
- {
- $s = new AppendStream();
- $s->detach();
- }
-
- public function testReturnsEmptyMetadata()
- {
- $s = new AppendStream();
- $this->assertEquals([], $s->getMetadata());
- $this->assertNull($s->getMetadata('foo'));
- }
-}
diff --git a/server/vendor/guzzlehttp/psr7/tests/BufferStreamTest.php b/server/vendor/guzzlehttp/psr7/tests/BufferStreamTest.php
deleted file mode 100644
index 0a635d4..0000000
--- a/server/vendor/guzzlehttp/psr7/tests/BufferStreamTest.php
+++ /dev/null
@@ -1,63 +0,0 @@
-<?php
-namespace GuzzleHttp\Tests\Psr7;
-
-use GuzzleHttp\Psr7\BufferStream;
-
-class BufferStreamTest extends \PHPUnit_Framework_TestCase
-{
- public function testHasMetadata()
- {
- $b = new BufferStream(10);
- $this->assertTrue($b->isReadable());
- $this->assertTrue($b->isWritable());
- $this->assertFalse($b->isSeekable());
- $this->assertEquals(null, $b->getMetadata('foo'));
- $this->assertEquals(10, $b->getMetadata('hwm'));
- $this->assertEquals([], $b->getMetadata());
- }
-
- public function testRemovesReadDataFromBuffer()
- {
- $b = new BufferStream();
- $this->assertEquals(3, $b->write('foo'));
- $this->assertEquals(3, $b->getSize());
- $this->assertFalse($b->eof());
- $this->assertEquals('foo', $b->read(10));
- $this->assertTrue($b->eof());
- $this->assertEquals('', $b->read(10));
- }
-
- /**
- * @expectedException \RuntimeException
- * @expectedExceptionMessage Cannot determine the position of a BufferStream
- */
- public function testCanCastToStringOrGetContents()
- {
- $b = new BufferStream();
- $b->write('foo');
- $b->write('baz');
- $this->assertEquals('foo', $b->read(3));
- $b->write('bar');
- $this->assertEquals('bazbar', (string) $b);
- $b->tell();
- }
-
- public function testDetachClearsBuffer()
- {
- $b = new BufferStream();
- $b->write('foo');
- $b->detach();
- $this->assertTrue($b->eof());
- $this->assertEquals(3, $b->write('abc'));
- $this->assertEquals('abc', $b->read(10));
- }
-
- public function testExceedingHighwaterMarkReturnsFalseButStillBuffers()
- {
- $b = new BufferStream(5);
- $this->assertEquals(3, $b->write('hi '));
- $this->assertFalse($b->write('hello'));
- $this->assertEquals('hi hello', (string) $b);
- $this->assertEquals(4, $b->write('test'));
- }
-}
diff --git a/server/vendor/guzzlehttp/psr7/tests/CachingStreamTest.php b/server/vendor/guzzlehttp/psr7/tests/CachingStreamTest.php
deleted file mode 100644
index 60a2636..0000000
--- a/server/vendor/guzzlehttp/psr7/tests/CachingStreamTest.php
+++ /dev/null
@@ -1,193 +0,0 @@
-<?php
-namespace GuzzleHttp\Tests\Psr7;
-
-use GuzzleHttp\Psr7;
-use GuzzleHttp\Psr7\CachingStream;
-
-/**
- * @covers GuzzleHttp\Psr7\CachingStream
- */
-class CachingStreamTest extends \PHPUnit_Framework_TestCase
-{
- /** @var CachingStream */
- protected $body;
- protected $decorated;
-
- public function setUp()
- {
- $this->decorated = Psr7\stream_for('testing');
- $this->body = new CachingStream($this->decorated);
- }
-
- public function tearDown()
- {
- $this->decorated->close();
- $this->body->close();
- }
-
- public function testUsesRemoteSizeIfPossible()
- {
- $body = Psr7\stream_for('test');
- $caching = new CachingStream($body);
- $this->assertEquals(4, $caching->getSize());
- }
-
- public function testReadsUntilCachedToByte()
- {
- $this->body->seek(5);
- $this->assertEquals('n', $this->body->read(1));
- $this->body->seek(0);
- $this->assertEquals('t', $this->body->read(1));
- }
-
- public function testCanSeekNearEndWithSeekEnd()
- {
- $baseStream = Psr7\stream_for(implode('', range('a', 'z')));
- $cached = new CachingStream($baseStream);
- $cached->seek(-1, SEEK_END);
- $this->assertEquals(25, $baseStream->tell());
- $this->assertEquals('z', $cached->read(1));
- $this->assertEquals(26, $cached->getSize());
- }
-
- public function testCanSeekToEndWithSeekEnd()
- {
- $baseStream = Psr7\stream_for(implode('', range('a', 'z')));
- $cached = new CachingStream($baseStream);
- $cached->seek(0, SEEK_END);
- $this->assertEquals(26, $baseStream->tell());
- $this->assertEquals('', $cached->read(1));
- $this->assertEquals(26, $cached->getSize());
- }
-
- public function testCanUseSeekEndWithUnknownSize()
- {
- $baseStream = Psr7\stream_for('testing');
- $decorated = Psr7\FnStream::decorate($baseStream, [
- 'getSize' => function () { return null; }
- ]);
- $cached = new CachingStream($decorated);
- $cached->seek(-1, SEEK_END);
- $this->assertEquals('g', $cached->read(1));
- }
-
- public function testRewindUsesSeek()
- {
- $a = Psr7\stream_for('foo');
- $d = $this->getMockBuilder('GuzzleHttp\Psr7\CachingStream')
- ->setMethods(array('seek'))
- ->setConstructorArgs(array($a))
- ->getMock();
- $d->expects($this->once())
- ->method('seek')
- ->with(0)
- ->will($this->returnValue(true));
- $d->seek(0);
- }
-
- public function testCanSeekToReadBytes()
- {
- $this->assertEquals('te', $this->body->read(2));
- $this->body->seek(0);
- $this->assertEquals('test', $this->body->read(4));
- $this->assertEquals(4, $this->body->tell());
- $this->body->seek(2);
- $this->assertEquals(2, $this->body->tell());
- $this->body->seek(2, SEEK_CUR);
- $this->assertEquals(4, $this->body->tell());
- $this->assertEquals('ing', $this->body->read(3));
- }
-
- public function testCanSeekToReadBytesWithPartialBodyReturned()
- {
- $stream = fopen('php://temp', 'r+');
- fwrite($stream, 'testing');
- fseek($stream, 0);
-
- $this->decorated = $this->getMockBuilder('\GuzzleHttp\Psr7\Stream')
- ->setConstructorArgs([$stream])
- ->setMethods(['read'])
- ->getMock();
-
- $this->decorated->expects($this->exactly(2))
- ->method('read')
- ->willReturnCallback(function($length) use ($stream){
- return fread($stream, 2);
- });
-
- $this->body = new CachingStream($this->decorated);
-
- $this->assertEquals(0, $this->body->tell());
- $this->body->seek(4, SEEK_SET);
- $this->assertEquals(4, $this->body->tell());
-
- $this->body->seek(0);
- $this->assertEquals('test', $this->body->read(4));
- }
-
- public function testWritesToBufferStream()
- {
- $this->body->read(2);
- $this->body->write('hi');
- $this->body->seek(0);
- $this->assertEquals('tehiing', (string) $this->body);
- }
-
- public function testSkipsOverwrittenBytes()
- {
- $decorated = Psr7\stream_for(
- implode("\n", array_map(function ($n) {
- return str_pad($n, 4, '0', STR_PAD_LEFT);
- }, range(0, 25)))
- );
-
- $body = new CachingStream($decorated);
-
- $this->assertEquals("0000\n", Psr7\readline($body));
- $this->assertEquals("0001\n", Psr7\readline($body));
- // Write over part of the body yet to be read, so skip some bytes
- $this->assertEquals(5, $body->write("TEST\n"));
- $this->assertEquals(5, $this->readAttribute($body, 'skipReadBytes'));
- // Read, which skips bytes, then reads
- $this->assertEquals("0003\n", Psr7\readline($body));
- $this->assertEquals(0, $this->readAttribute($body, 'skipReadBytes'));
- $this->assertEquals("0004\n", Psr7\readline($body));
- $this->assertEquals("0005\n", Psr7\readline($body));
-
- // Overwrite part of the cached body (so don't skip any bytes)
- $body->seek(5);
- $this->assertEquals(5, $body->write("ABCD\n"));
- $this->assertEquals(0, $this->readAttribute($body, 'skipReadBytes'));
- $this->assertEquals("TEST\n", Psr7\readline($body));
- $this->assertEquals("0003\n", Psr7\readline($body));
- $this->assertEquals("0004\n", Psr7\readline($body));
- $this->assertEquals("0005\n", Psr7\readline($body));
- $this->assertEquals("0006\n", Psr7\readline($body));
- $this->assertEquals(5, $body->write("1234\n"));
- $this->assertEquals(5, $this->readAttribute($body, 'skipReadBytes'));
-
- // Seek to 0 and ensure the overwritten bit is replaced
- $body->seek(0);
- $this->assertEquals("0000\nABCD\nTEST\n0003\n0004\n0005\n0006\n1234\n0008\n0009\n", $body->read(50));
-
- // Ensure that casting it to a string does not include the bit that was overwritten
- $this->assertContains("0000\nABCD\nTEST\n0003\n0004\n0005\n0006\n1234\n0008\n0009\n", (string) $body);
- }
-
- public function testClosesBothStreams()
- {
- $s = fopen('php://temp', 'r');
- $a = Psr7\stream_for($s);
- $d = new CachingStream($a);
- $d->close();
- $this->assertFalse(is_resource($s));
- }
-
- /**
- * @expectedException \InvalidArgumentException
- */
- public function testEnsuresValidWhence()
- {
- $this->body->seek(10, -123456);
- }
-}
diff --git a/server/vendor/guzzlehttp/psr7/tests/DroppingStreamTest.php b/server/vendor/guzzlehttp/psr7/tests/DroppingStreamTest.php
deleted file mode 100644
index 915b215..0000000
--- a/server/vendor/guzzlehttp/psr7/tests/DroppingStreamTest.php
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-namespace GuzzleHttp\Tests\Psr7;
-
-use GuzzleHttp\Psr7\BufferStream;
-use GuzzleHttp\Psr7\DroppingStream;
-
-class DroppingStreamTest extends \PHPUnit_Framework_TestCase
-{
- public function testBeginsDroppingWhenSizeExceeded()
- {
- $stream = new BufferStream();
- $drop = new DroppingStream($stream, 5);
- $this->assertEquals(3, $drop->write('hel'));
- $this->assertEquals(2, $drop->write('lo'));
- $this->assertEquals(5, $drop->getSize());
- $this->assertEquals('hello', $drop->read(5));
- $this->assertEquals(0, $drop->getSize());
- $drop->write('12345678910');
- $this->assertEquals(5, $stream->getSize());
- $this->assertEquals(5, $drop->getSize());
- $this->assertEquals('12345', (string) $drop);
- $this->assertEquals(0, $drop->getSize());
- $drop->write('hello');
- $this->assertSame(0, $drop->write('test'));
- }
-}
diff --git a/server/vendor/guzzlehttp/psr7/tests/FnStreamTest.php b/server/vendor/guzzlehttp/psr7/tests/FnStreamTest.php
deleted file mode 100644
index 66ae90a..0000000
--- a/server/vendor/guzzlehttp/psr7/tests/FnStreamTest.php
+++ /dev/null
@@ -1,90 +0,0 @@
-<?php
-namespace GuzzleHttp\Tests\Psr7;
-
-use GuzzleHttp\Psr7;
-use GuzzleHttp\Psr7\FnStream;
-
-/**
- * @covers GuzzleHttp\Psr7\FnStream
- */
-class FnStreamTest extends \PHPUnit_Framework_TestCase
-{
- /**
- * @expectedException \BadMethodCallException
- * @expectedExceptionMessage seek() is not implemented in the FnStream
- */
- public function testThrowsWhenNotImplemented()
- {
- (new FnStream([]))->seek(1);
- }
-
- public function testProxiesToFunction()
- {
- $s = new FnStream([
- 'read' => function ($len) {
- $this->assertEquals(3, $len);
- return 'foo';
- }
- ]);
-
- $this->assertEquals('foo', $s->read(3));
- }
-
- public function testCanCloseOnDestruct()
- {
- $called = false;
- $s = new FnStream([
- 'close' => function () use (&$called) {
- $called = true;
- }
- ]);
- unset($s);
- $this->assertTrue($called);
- }
-
- public function testDoesNotRequireClose()
- {
- $s = new FnStream([]);
- unset($s);
- }
-
- public function testDecoratesStream()
- {
- $a = Psr7\stream_for('foo');
- $b = FnStream::decorate($a, []);
- $this->assertEquals(3, $b->getSize());
- $this->assertEquals($b->isWritable(), true);
- $this->assertEquals($b->isReadable(), true);
- $this->assertEquals($b->isSeekable(), true);
- $this->assertEquals($b->read(3), 'foo');
- $this->assertEquals($b->tell(), 3);
- $this->assertEquals($a->tell(), 3);
- $this->assertSame('', $a->read(1));
- $this->assertEquals($b->eof(), true);
- $this->assertEquals($a->eof(), true);
- $b->seek(0);
- $this->assertEquals('foo', (string) $b);
- $b->seek(0);
- $this->assertEquals('foo', $b->getContents());
- $this->assertEquals($a->getMetadata(), $b->getMetadata());
- $b->seek(0, SEEK_END);
- $b->write('bar');
- $this->assertEquals('foobar', (string) $b);
- $this->assertInternalType('resource', $b->detach());
- $b->close();
- }
-
- public function testDecoratesWithCustomizations()
- {
- $called = false;
- $a = Psr7\stream_for('foo');
- $b = FnStream::decorate($a, [
- 'read' => function ($len) use (&$called, $a) {
- $called = true;
- return $a->read($len);
- }
- ]);
- $this->assertEquals('foo', $b->read(3));
- $this->assertTrue($called);
- }
-}
diff --git a/server/vendor/guzzlehttp/psr7/tests/FunctionsTest.php b/server/vendor/guzzlehttp/psr7/tests/FunctionsTest.php
deleted file mode 100644
index 664f5e8..0000000
--- a/server/vendor/guzzlehttp/psr7/tests/FunctionsTest.php
+++ /dev/null
@@ -1,619 +0,0 @@
-<?php
-namespace GuzzleHttp\Tests\Psr7;
-
-use GuzzleHttp\Psr7;
-use GuzzleHttp\Psr7\FnStream;
-use GuzzleHttp\Psr7\NoSeekStream;
-
-class FunctionsTest extends \PHPUnit_Framework_TestCase
-{
- public function testCopiesToString()
- {
- $s = Psr7\stream_for('foobaz');
- $this->assertEquals('foobaz', Psr7\copy_to_string($s));
- $s->seek(0);
- $this->assertEquals('foo', Psr7\copy_to_string($s, 3));
- $this->assertEquals('baz', Psr7\copy_to_string($s, 3));
- $this->assertEquals('', Psr7\copy_to_string($s));
- }
-
- public function testCopiesToStringStopsWhenReadFails()
- {
- $s1 = Psr7\stream_for('foobaz');
- $s1 = FnStream::decorate($s1, [
- 'read' => function () { return ''; }
- ]);
- $result = Psr7\copy_to_string($s1);
- $this->assertEquals('', $result);
- }
-
- public function testCopiesToStream()
- {
- $s1 = Psr7\stream_for('foobaz');
- $s2 = Psr7\stream_for('');
- Psr7\copy_to_stream($s1, $s2);
- $this->assertEquals('foobaz', (string) $s2);
- $s2 = Psr7\stream_for('');
- $s1->seek(0);
- Psr7\copy_to_stream($s1, $s2, 3);
- $this->assertEquals('foo', (string) $s2);
- Psr7\copy_to_stream($s1, $s2, 3);
- $this->assertEquals('foobaz', (string) $s2);
- }
-
- public function testStopsCopyToStreamWhenWriteFails()
- {
- $s1 = Psr7\stream_for('foobaz');
- $s2 = Psr7\stream_for('');
- $s2 = FnStream::decorate($s2, ['write' => function () { return 0; }]);
- Psr7\copy_to_stream($s1, $s2);
- $this->assertEquals('', (string) $s2);
- }
-
- public function testStopsCopyToSteamWhenWriteFailsWithMaxLen()
- {
- $s1 = Psr7\stream_for('foobaz');
- $s2 = Psr7\stream_for('');
- $s2 = FnStream::decorate($s2, ['write' => function () { return 0; }]);
- Psr7\copy_to_stream($s1, $s2, 10);
- $this->assertEquals('', (string) $s2);
- }
-
- public function testStopsCopyToSteamWhenReadFailsWithMaxLen()
- {
- $s1 = Psr7\stream_for('foobaz');
- $s1 = FnStream::decorate($s1, ['read' => function () { return ''; }]);
- $s2 = Psr7\stream_for('');
- Psr7\copy_to_stream($s1, $s2, 10);
- $this->assertEquals('', (string) $s2);
- }
-
- public function testReadsLines()
- {
- $s = Psr7\stream_for("foo\nbaz\nbar");
- $this->assertEquals("foo\n", Psr7\readline($s));
- $this->assertEquals("baz\n", Psr7\readline($s));
- $this->assertEquals("bar", Psr7\readline($s));
- }
-
- public function testReadsLinesUpToMaxLength()
- {
- $s = Psr7\stream_for("12345\n");
- $this->assertEquals("123", Psr7\readline($s, 4));
- $this->assertEquals("45\n", Psr7\readline($s));
- }
-
- public function testReadsLineUntilFalseReturnedFromRead()
- {
- $s = $this->getMockBuilder('GuzzleHttp\Psr7\Stream')
- ->setMethods(['read', 'eof'])
- ->disableOriginalConstructor()
- ->getMock();
- $s->expects($this->exactly(2))
- ->method('read')
- ->will($this->returnCallback(function () {
- static $c = false;
- if ($c) {
- return false;
- }
- $c = true;
- return 'h';
- }));
- $s->expects($this->exactly(2))
- ->method('eof')
- ->will($this->returnValue(false));
- $this->assertEquals("h", Psr7\readline($s));
- }
-
- public function testCalculatesHash()
- {
- $s = Psr7\stream_for('foobazbar');
- $this->assertEquals(md5('foobazbar'), Psr7\hash($s, 'md5'));
- }
-
- /**
- * @expectedException \RuntimeException
- */
- public function testCalculatesHashThrowsWhenSeekFails()
- {
- $s = new NoSeekStream(Psr7\stream_for('foobazbar'));
- $s->read(2);
- Psr7\hash($s, 'md5');
- }
-
- public function testCalculatesHashSeeksToOriginalPosition()
- {
- $s = Psr7\stream_for('foobazbar');
- $s->seek(4);
- $this->assertEquals(md5('foobazbar'), Psr7\hash($s, 'md5'));
- $this->assertEquals(4, $s->tell());
- }
-
- public function testOpensFilesSuccessfully()
- {
- $r = Psr7\try_fopen(__FILE__, 'r');
- $this->assertInternalType('resource', $r);
- fclose($r);
- }
-
- /**
- * @expectedException \RuntimeException
- * @expectedExceptionMessage Unable to open /path/to/does/not/exist using mode r
- */
- public function testThrowsExceptionNotWarning()
- {
- Psr7\try_fopen('/path/to/does/not/exist', 'r');
- }
-
- public function parseQueryProvider()
- {
- return [
- // Does not need to parse when the string is empty
- ['', []],
- // Can parse mult-values items
- ['q=a&q=b', ['q' => ['a', 'b']]],
- // Can parse multi-valued items that use numeric indices
- ['q[0]=a&q[1]=b', ['q[0]' => 'a', 'q[1]' => 'b']],
- // Can parse duplicates and does not include numeric indices
- ['q[]=a&q[]=b', ['q[]' => ['a', 'b']]],
- // Ensures that the value of "q" is an array even though one value
- ['q[]=a', ['q[]' => 'a']],
- // Does not modify "." to "_" like PHP's parse_str()
- ['q.a=a&q.b=b', ['q.a' => 'a', 'q.b' => 'b']],
- // Can decode %20 to " "
- ['q%20a=a%20b', ['q a' => 'a b']],
- // Can parse funky strings with no values by assigning each to null
- ['q&a', ['q' => null, 'a' => null]],
- // Does not strip trailing equal signs
- ['data=abc=', ['data' => 'abc=']],
- // Can store duplicates without affecting other values
- ['foo=a&foo=b&?µ=c', ['foo' => ['a', 'b'], '?µ' => 'c']],
- // Sets value to null when no "=" is present
- ['foo', ['foo' => null]],
- // Preserves "0" keys.
- ['0', ['0' => null]],
- // Sets the value to an empty string when "=" is present
- ['0=', ['0' => '']],
- // Preserves falsey keys
- ['var=0', ['var' => '0']],
- ['a[b][c]=1&a[b][c]=2', ['a[b][c]' => ['1', '2']]],
- ['a[b]=c&a[d]=e', ['a[b]' => 'c', 'a[d]' => 'e']],
- // Ensure it doesn't leave things behind with repeated values
- // Can parse mult-values items
- ['q=a&q=b&q=c', ['q' => ['a', 'b', 'c']]],
- ];
- }
-
- /**
- * @dataProvider parseQueryProvider
- */
- public function testParsesQueries($input, $output)
- {
- $result = Psr7\parse_query($input);
- $this->assertSame($output, $result);
- }
-
- public function testDoesNotDecode()
- {
- $str = 'foo%20=bar';
- $data = Psr7\parse_query($str, false);
- $this->assertEquals(['foo%20' => 'bar'], $data);
- }
-
- /**
- * @dataProvider parseQueryProvider
- */
- public function testParsesAndBuildsQueries($input, $output)
- {
- $result = Psr7\parse_query($input, false);
- $this->assertSame($input, Psr7\build_query($result, false));
- }
-
- public function testEncodesWithRfc1738()
- {
- $str = Psr7\build_query(['foo bar' => 'baz+'], PHP_QUERY_RFC1738);
- $this->assertEquals('foo+bar=baz%2B', $str);
- }
-
- public function testEncodesWithRfc3986()
- {
- $str = Psr7\build_query(['foo bar' => 'baz+'], PHP_QUERY_RFC3986);
- $this->assertEquals('foo%20bar=baz%2B', $str);
- }
-
- public function testDoesNotEncode()
- {
- $str = Psr7\build_query(['foo bar' => 'baz+'], false);
- $this->assertEquals('foo bar=baz+', $str);
- }
-
- public function testCanControlDecodingType()
- {
- $result = Psr7\parse_query('var=foo+bar', PHP_QUERY_RFC3986);
- $this->assertEquals('foo+bar', $result['var']);
- $result = Psr7\parse_query('var=foo+bar', PHP_QUERY_RFC1738);
- $this->assertEquals('foo bar', $result['var']);
- }
-
- public function testParsesRequestMessages()
- {
- $req = "GET /abc HTTP/1.0\r\nHost: foo.com\r\nFoo: Bar\r\nBaz: Bam\r\nBaz: Qux\r\n\r\nTest";
- $request = Psr7\parse_request($req);
- $this->assertEquals('GET', $request->getMethod());
- $this->assertEquals('/abc', $request->getRequestTarget());
- $this->assertEquals('1.0', $request->getProtocolVersion());
- $this->assertEquals('foo.com', $request->getHeaderLine('Host'));
- $this->assertEquals('Bar', $request->getHeaderLine('Foo'));
- $this->assertEquals('Bam, Qux', $request->getHeaderLine('Baz'));
- $this->assertEquals('Test', (string) $request->getBody());
- $this->assertEquals('http://foo.com/abc', (string) $request->getUri());
- }
-
- public function testParsesRequestMessagesWithHttpsScheme()
- {
- $req = "PUT /abc?baz=bar HTTP/1.1\r\nHost: foo.com:443\r\n\r\n";
- $request = Psr7\parse_request($req);
- $this->assertEquals('PUT', $request->getMethod());
- $this->assertEquals('/abc?baz=bar', $request->getRequestTarget());
- $this->assertEquals('1.1', $request->getProtocolVersion());
- $this->assertEquals('foo.com:443', $request->getHeaderLine('Host'));
- $this->assertEquals('', (string) $request->getBody());
- $this->assertEquals('https://foo.com/abc?baz=bar', (string) $request->getUri());
- }
-
- public function testParsesRequestMessagesWithUriWhenHostIsNotFirst()
- {
- $req = "PUT / HTTP/1.1\r\nFoo: Bar\r\nHost: foo.com\r\n\r\n";
- $request = Psr7\parse_request($req);
- $this->assertEquals('PUT', $request->getMethod());
- $this->assertEquals('/', $request->getRequestTarget());
- $this->assertEquals('http://foo.com/', (string) $request->getUri());
- }
-
- public function testParsesRequestMessagesWithFullUri()
- {
- $req = "GET https://www.google.com:443/search?q=foobar HTTP/1.1\r\nHost: www.google.com\r\n\r\n";
- $request = Psr7\parse_request($req);
- $this->assertEquals('GET', $request->getMethod());
- $this->assertEquals('https://www.google.com:443/search?q=foobar', $request->getRequestTarget());
- $this->assertEquals('1.1', $request->getProtocolVersion());
- $this->assertEquals('www.google.com', $request->getHeaderLine('Host'));
- $this->assertEquals('', (string) $request->getBody());
- $this->assertEquals('https://www.google.com/search?q=foobar', (string) $request->getUri());
- }
-
- public function testParsesRequestMessagesWithCustomMethod()
- {
- $req = "GET_DATA / HTTP/1.1\r\nFoo: Bar\r\nHost: foo.com\r\n\r\n";
- $request = Psr7\parse_request($req);
- $this->assertEquals('GET_DATA', $request->getMethod());
- }
-
- /**
- * @expectedException \InvalidArgumentException
- */
- public function testValidatesRequestMessages()
- {
- Psr7\parse_request("HTTP/1.1 200 OK\r\n\r\n");
- }
-
- public function testParsesResponseMessages()
- {
- $res = "HTTP/1.0 200 OK\r\nFoo: Bar\r\nBaz: Bam\r\nBaz: Qux\r\n\r\nTest";
- $response = Psr7\parse_response($res);
- $this->assertEquals(200, $response->getStatusCode());
- $this->assertEquals('OK', $response->getReasonPhrase());
- $this->assertEquals('1.0', $response->getProtocolVersion());
- $this->assertEquals('Bar', $response->getHeaderLine('Foo'));
- $this->assertEquals('Bam, Qux', $response->getHeaderLine('Baz'));
- $this->assertEquals('Test', (string) $response->getBody());
- }
-
- /**
- * @expectedException \InvalidArgumentException
- */
- public function testValidatesResponseMessages()
- {
- Psr7\parse_response("GET / HTTP/1.1\r\n\r\n");
- }
-
- public function testDetermineMimetype()
- {
- $this->assertNull(Psr7\mimetype_from_extension('not-a-real-extension'));
- $this->assertEquals(
- 'application/json',
- Psr7\mimetype_from_extension('json')
- );
- $this->assertEquals(
- 'image/jpeg',
- Psr7\mimetype_from_filename('/tmp/images/IMG034821.JPEG')
- );
- }
-
- public function testCreatesUriForValue()
- {
- $this->assertInstanceOf('GuzzleHttp\Psr7\Uri', Psr7\uri_for('/foo'));
- $this->assertInstanceOf(
- 'GuzzleHttp\Psr7\Uri',
- Psr7\uri_for(new Psr7\Uri('/foo'))
- );
- }
-
- /**
- * @expectedException \InvalidArgumentException
- */
- public function testValidatesUri()
- {
- Psr7\uri_for([]);
- }
-
- public function testKeepsPositionOfResource()
- {
- $h = fopen(__FILE__, 'r');
- fseek($h, 10);
- $stream = Psr7\stream_for($h);
- $this->assertEquals(10, $stream->tell());
- $stream->close();
- }
-
- public function testCreatesWithFactory()
- {
- $stream = Psr7\stream_for('foo');
- $this->assertInstanceOf('GuzzleHttp\Psr7\Stream', $stream);
- $this->assertEquals('foo', $stream->getContents());
- $stream->close();
- }
-
- public function testFactoryCreatesFromEmptyString()
- {
- $s = Psr7\stream_for();
- $this->assertInstanceOf('GuzzleHttp\Psr7\Stream', $s);
- }
-
- public function testFactoryCreatesFromNull()
- {
- $s = Psr7\stream_for(null);
- $this->assertInstanceOf('GuzzleHttp\Psr7\Stream', $s);
- }
-
- public function testFactoryCreatesFromResource()
- {
- $r = fopen(__FILE__, 'r');
- $s = Psr7\stream_for($r);
- $this->assertInstanceOf('GuzzleHttp\Psr7\Stream', $s);
- $this->assertSame(file_get_contents(__FILE__), (string) $s);
- }
-
- public function testFactoryCreatesFromObjectWithToString()
- {
- $r = new HasToString();
- $s = Psr7\stream_for($r);
- $this->assertInstanceOf('GuzzleHttp\Psr7\Stream', $s);
- $this->assertEquals('foo', (string) $s);
- }
-
- public function testCreatePassesThrough()
- {
- $s = Psr7\stream_for('foo');
- $this->assertSame($s, Psr7\stream_for($s));
- }
-
- /**
- * @expectedException \InvalidArgumentException
- */
- public function testThrowsExceptionForUnknown()
- {
- Psr7\stream_for(new \stdClass());
- }
-
- public function testReturnsCustomMetadata()
- {
- $s = Psr7\stream_for('foo', ['metadata' => ['hwm' => 3]]);
- $this->assertEquals(3, $s->getMetadata('hwm'));
- $this->assertArrayHasKey('hwm', $s->getMetadata());
- }
-
- public function testCanSetSize()
- {
- $s = Psr7\stream_for('', ['size' => 10]);
- $this->assertEquals(10, $s->getSize());
- }
-
- public function testCanCreateIteratorBasedStream()
- {
- $a = new \ArrayIterator(['foo', 'bar', '123']);
- $p = Psr7\stream_for($a);
- $this->assertInstanceOf('GuzzleHttp\Psr7\PumpStream', $p);
- $this->assertEquals('foo', $p->read(3));
- $this->assertFalse($p->eof());
- $this->assertEquals('b', $p->read(1));
- $this->assertEquals('a', $p->read(1));
- $this->assertEquals('r12', $p->read(3));
- $this->assertFalse($p->eof());
- $this->assertEquals('3', $p->getContents());
- $this->assertTrue($p->eof());
- $this->assertEquals(9, $p->tell());
- }
-
- public function testConvertsRequestsToStrings()
- {
- $request = new Psr7\Request('PUT', 'http://foo.com/hi?123', [
- 'Baz' => 'bar',
- 'Qux' => 'ipsum'
- ], 'hello', '1.0');
- $this->assertEquals(
- "PUT /hi?123 HTTP/1.0\r\nHost: foo.com\r\nBaz: bar\r\nQux: ipsum\r\n\r\nhello",
- Psr7\str($request)
- );
- }
-
- public function testConvertsResponsesToStrings()
- {
- $response = new Psr7\Response(200, [
- 'Baz' => 'bar',
- 'Qux' => 'ipsum'
- ], 'hello', '1.0', 'FOO');
- $this->assertEquals(
- "HTTP/1.0 200 FOO\r\nBaz: bar\r\nQux: ipsum\r\n\r\nhello",
- Psr7\str($response)
- );
- }
-
- public function parseParamsProvider()
- {
- $res1 = array(
- array(
- '<http:/.../front.jpeg>',
- 'rel' => 'front',
- 'type' => 'image/jpeg',
- ),
- array(
- '<http://.../back.jpeg>',
- 'rel' => 'back',
- 'type' => 'image/jpeg',
- ),
- );
- return array(
- array(
- '<http:/.../front.jpeg>; rel="front"; type="image/jpeg", <http://.../back.jpeg>; rel=back; type="image/jpeg"',
- $res1
- ),
- array(
- '<http:/.../front.jpeg>; rel="front"; type="image/jpeg",<http://.../back.jpeg>; rel=back; type="image/jpeg"',
- $res1
- ),
- array(
- 'foo="baz"; bar=123, boo, test="123", foobar="foo;bar"',
- array(
- array('foo' => 'baz', 'bar' => '123'),
- array('boo'),
- array('test' => '123'),
- array('foobar' => 'foo;bar')
- )
- ),
- array(
- '<http://.../side.jpeg?test=1>; rel="side"; type="image/jpeg",<http://.../side.jpeg?test=2>; rel=side; type="image/jpeg"',
- array(
- array('<http://.../side.jpeg?test=1>', 'rel' => 'side', 'type' => 'image/jpeg'),
- array('<http://.../side.jpeg?test=2>', 'rel' => 'side', 'type' => 'image/jpeg')
- )
- ),
- array(
- '',
- array()
- )
- );
- }
- /**
- * @dataProvider parseParamsProvider
- */
- public function testParseParams($header, $result)
- {
- $this->assertEquals($result, Psr7\parse_header($header));
- }
-
- public function testParsesArrayHeaders()
- {
- $header = ['a, b', 'c', 'd, e'];
- $this->assertEquals(['a', 'b', 'c', 'd', 'e'], Psr7\normalize_header($header));
- }
-
- public function testRewindsBody()
- {
- $body = Psr7\stream_for('abc');
- $res = new Psr7\Response(200, [], $body);
- Psr7\rewind_body($res);
- $this->assertEquals(0, $body->tell());
- $body->rewind(1);
- Psr7\rewind_body($res);
- $this->assertEquals(0, $body->tell());
- }
-
- /**
- * @expectedException \RuntimeException
- */
- public function testThrowsWhenBodyCannotBeRewound()
- {
- $body = Psr7\stream_for('abc');
- $body->read(1);
- $body = FnStream::decorate($body, [
- 'rewind' => function () { throw new \RuntimeException('a'); }
- ]);
- $res = new Psr7\Response(200, [], $body);
- Psr7\rewind_body($res);
- }
-
- public function testCanModifyRequestWithUri()
- {
- $r1 = new Psr7\Request('GET', 'http://foo.com');
- $r2 = Psr7\modify_request($r1, [
- 'uri' => new Psr7\Uri('http://www.foo.com')
- ]);
- $this->assertEquals('http://www.foo.com', (string) $r2->getUri());
- $this->assertEquals('www.foo.com', (string) $r2->getHeaderLine('host'));
- }
-
- public function testCanModifyRequestWithUriAndPort()
- {
- $r1 = new Psr7\Request('GET', 'http://foo.com:8000');
- $r2 = Psr7\modify_request($r1, [
- 'uri' => new Psr7\Uri('http://www.foo.com:8000')
- ]);
- $this->assertEquals('http://www.foo.com:8000', (string) $r2->getUri());
- $this->assertEquals('www.foo.com:8000', (string) $r2->getHeaderLine('host'));
- }
-
- public function testCanModifyRequestWithCaseInsensitiveHeader()
- {
- $r1 = new Psr7\Request('GET', 'http://foo.com', ['User-Agent' => 'foo']);
- $r2 = Psr7\modify_request($r1, ['set_headers' => ['User-agent' => 'bar']]);
- $this->assertEquals('bar', $r2->getHeaderLine('User-Agent'));
- $this->assertEquals('bar', $r2->getHeaderLine('User-agent'));
- }
-
- public function testReturnsAsIsWhenNoChanges()
- {
- $r1 = new Psr7\Request('GET', 'http://foo.com');
- $r2 = Psr7\modify_request($r1, []);
- $this->assertTrue($r2 instanceof Psr7\Request);
-
- $r1 = new Psr7\ServerRequest('GET', 'http://foo.com');
- $r2 = Psr7\modify_request($r1, []);
- $this->assertTrue($r2 instanceof \Psr\Http\Message\ServerRequestInterface);
- }
-
- public function testReturnsUriAsIsWhenNoChanges()
- {
- $r1 = new Psr7\Request('GET', 'http://foo.com');
- $r2 = Psr7\modify_request($r1, ['set_headers' => ['foo' => 'bar']]);
- $this->assertNotSame($r1, $r2);
- $this->assertEquals('bar', $r2->getHeaderLine('foo'));
- }
-
- public function testRemovesHeadersFromMessage()
- {
- $r1 = new Psr7\Request('GET', 'http://foo.com', ['foo' => 'bar']);
- $r2 = Psr7\modify_request($r1, ['remove_headers' => ['foo']]);
- $this->assertNotSame($r1, $r2);
- $this->assertFalse($r2->hasHeader('foo'));
- }
-
- public function testAddsQueryToUri()
- {
- $r1 = new Psr7\Request('GET', 'http://foo.com');
- $r2 = Psr7\modify_request($r1, ['query' => 'foo=bar']);
- $this->assertNotSame($r1, $r2);
- $this->assertEquals('foo=bar', $r2->getUri()->getQuery());
- }
-
- public function testModifyRequestKeepInstanceOfRequest()
- {
- $r1 = new Psr7\Request('GET', 'http://foo.com');
- $r2 = Psr7\modify_request($r1, ['remove_headers' => ['non-existent']]);
- $this->assertTrue($r2 instanceof Psr7\Request);
-
- $r1 = new Psr7\ServerRequest('GET', 'http://foo.com');
- $r2 = Psr7\modify_request($r1, ['remove_headers' => ['non-existent']]);
- $this->assertTrue($r2 instanceof \Psr\Http\Message\ServerRequestInterface);
- }
-}
diff --git a/server/vendor/guzzlehttp/psr7/tests/InflateStreamTest.php b/server/vendor/guzzlehttp/psr7/tests/InflateStreamTest.php
deleted file mode 100644
index 0e4b586..0000000
--- a/server/vendor/guzzlehttp/psr7/tests/InflateStreamTest.php
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-namespace GuzzleHttp\Tests\Psr7;
-
-use GuzzleHttp\Psr7;
-use GuzzleHttp\Psr7\InflateStream;
-
-class InflateStreamtest extends \PHPUnit_Framework_TestCase
-{
- public function testInflatesStreams()
- {
- $content = gzencode('test');
- $a = Psr7\stream_for($content);
- $b = new InflateStream($a);
- $this->assertEquals('test', (string) $b);
- }
-
- public function testInflatesStreamsWithFilename()
- {
- $content = $this->getGzipStringWithFilename('test');
- $a = Psr7\stream_for($content);
- $b = new InflateStream($a);
- $this->assertEquals('test', (string) $b);
- }
-
- private function getGzipStringWithFilename($original_string)
- {
- $gzipped = bin2hex(gzencode($original_string));
-
- $header = substr($gzipped, 0, 20);
- // set FNAME flag
- $header[6]=0;
- $header[7]=8;
- // make a dummy filename
- $filename = "64756d6d7900";
- $rest = substr($gzipped, 20);
-
- return hex2bin($header . $filename . $rest);
- }
-}
diff --git a/server/vendor/guzzlehttp/psr7/tests/LazyOpenStreamTest.php b/server/vendor/guzzlehttp/psr7/tests/LazyOpenStreamTest.php
deleted file mode 100644
index fdef142..0000000
--- a/server/vendor/guzzlehttp/psr7/tests/LazyOpenStreamTest.php
+++ /dev/null
@@ -1,64 +0,0 @@
-<?php
-namespace GuzzleHttp\Tests\Psr7;
-
-use GuzzleHttp\Psr7\LazyOpenStream;
-
-class LazyOpenStreamTest extends \PHPUnit_Framework_TestCase
-{
- private $fname;
-
- public function setup()
- {
- $this->fname = tempnam('/tmp', 'tfile');
-
- if (file_exists($this->fname)) {
- unlink($this->fname);
- }
- }
-
- public function tearDown()
- {
- if (file_exists($this->fname)) {
- unlink($this->fname);
- }
- }
-
- public function testOpensLazily()
- {
- $l = new LazyOpenStream($this->fname, 'w+');
- $l->write('foo');
- $this->assertInternalType('array', $l->getMetadata());
- $this->assertFileExists($this->fname);
- $this->assertEquals('foo', file_get_contents($this->fname));
- $this->assertEquals('foo', (string) $l);
- }
-
- public function testProxiesToFile()
- {
- file_put_contents($this->fname, 'foo');
- $l = new LazyOpenStream($this->fname, 'r');
- $this->assertEquals('foo', $l->read(4));
- $this->assertTrue($l->eof());
- $this->assertEquals(3, $l->tell());
- $this->assertTrue($l->isReadable());
- $this->assertTrue($l->isSeekable());
- $this->assertFalse($l->isWritable());
- $l->seek(1);
- $this->assertEquals('oo', $l->getContents());
- $this->assertEquals('foo', (string) $l);
- $this->assertEquals(3, $l->getSize());
- $this->assertInternalType('array', $l->getMetadata());
- $l->close();
- }
-
- public function testDetachesUnderlyingStream()
- {
- file_put_contents($this->fname, 'foo');
- $l = new LazyOpenStream($this->fname, 'r');
- $r = $l->detach();
- $this->assertInternalType('resource', $r);
- fseek($r, 0);
- $this->assertEquals('foo', stream_get_contents($r));
- fclose($r);
- }
-}
diff --git a/server/vendor/guzzlehttp/psr7/tests/LimitStreamTest.php b/server/vendor/guzzlehttp/psr7/tests/LimitStreamTest.php
deleted file mode 100644
index 2198b7a..0000000
--- a/server/vendor/guzzlehttp/psr7/tests/LimitStreamTest.php
+++ /dev/null
@@ -1,166 +0,0 @@
-<?php
-namespace GuzzleHttp\Tests\Psr7;
-
-use GuzzleHttp\Psr7;
-use GuzzleHttp\Psr7\FnStream;
-use GuzzleHttp\Psr7\Stream;
-use GuzzleHttp\Psr7\LimitStream;
-use GuzzleHttp\Psr7\NoSeekStream;
-
-/**
- * @covers GuzzleHttp\Psr7\LimitStream
- */
-class LimitStreamTest extends \PHPUnit_Framework_TestCase
-{
- /** @var LimitStream */
- protected $body;
-
- /** @var Stream */
- protected $decorated;
-
- public function setUp()
- {
- $this->decorated = Psr7\stream_for(fopen(__FILE__, 'r'));
- $this->body = new LimitStream($this->decorated, 10, 3);
- }
-
- public function testReturnsSubset()
- {
- $body = new LimitStream(Psr7\stream_for('foo'), -1, 1);
- $this->assertEquals('oo', (string) $body);
- $this->assertTrue($body->eof());
- $body->seek(0);
- $this->assertFalse($body->eof());
- $this->assertEquals('oo', $body->read(100));
- $this->assertSame('', $body->read(1));
- $this->assertTrue($body->eof());
- }
-
- public function testReturnsSubsetWhenCastToString()
- {
- $body = Psr7\stream_for('foo_baz_bar');
- $limited = new LimitStream($body, 3, 4);
- $this->assertEquals('baz', (string) $limited);
- }
-
- /**
- * @expectedException \RuntimeException
- * @expectedExceptionMessage Unable to seek to stream position 10 with whence 0
- */
- public function testEnsuresPositionCanBeekSeekedTo()
- {
- new LimitStream(Psr7\stream_for(''), 0, 10);
- }
-
- public function testReturnsSubsetOfEmptyBodyWhenCastToString()
- {
- $body = Psr7\stream_for('01234567891234');
- $limited = new LimitStream($body, 0, 10);
- $this->assertEquals('', (string) $limited);
- }
-
- public function testReturnsSpecificSubsetOBodyWhenCastToString()
- {
- $body = Psr7\stream_for('0123456789abcdef');
- $limited = new LimitStream($body, 3, 10);
- $this->assertEquals('abc', (string) $limited);
- }
-
- public function testSeeksWhenConstructed()
- {
- $this->assertEquals(0, $this->body->tell());
- $this->assertEquals(3, $this->decorated->tell());
- }
-
- public function testAllowsBoundedSeek()
- {
- $this->body->seek(100);
- $this->assertEquals(10, $this->body->tell());
- $this->assertEquals(13, $this->decorated->tell());
- $this->body->seek(0);
- $this->assertEquals(0, $this->body->tell());
- $this->assertEquals(3, $this->decorated->tell());
- try {
- $this->body->seek(-10);
- $this->fail();
- } catch (\RuntimeException $e) {}
- $this->assertEquals(0, $this->body->tell());
- $this->assertEquals(3, $this->decorated->tell());
- $this->body->seek(5);
- $this->assertEquals(5, $this->body->tell());
- $this->assertEquals(8, $this->decorated->tell());
- // Fail
- try {
- $this->body->seek(1000, SEEK_END);
- $this->fail();
- } catch (\RuntimeException $e) {}
- }
-
- public function testReadsOnlySubsetOfData()
- {
- $data = $this->body->read(100);
- $this->assertEquals(10, strlen($data));
- $this->assertSame('', $this->body->read(1000));
-
- $this->body->setOffset(10);
- $newData = $this->body->read(100);
- $this->assertEquals(10, strlen($newData));
- $this->assertNotSame($data, $newData);
- }
-
- /**
- * @expectedException \RuntimeException
- * @expectedExceptionMessage Could not seek to stream offset 2
- */
- public function testThrowsWhenCurrentGreaterThanOffsetSeek()
- {
- $a = Psr7\stream_for('foo_bar');
- $b = new NoSeekStream($a);
- $c = new LimitStream($b);
- $a->getContents();
- $c->setOffset(2);
- }
-
- public function testCanGetContentsWithoutSeeking()
- {
- $a = Psr7\stream_for('foo_bar');
- $b = new NoSeekStream($a);
- $c = new LimitStream($b);
- $this->assertEquals('foo_bar', $c->getContents());
- }
-
- public function testClaimsConsumedWhenReadLimitIsReached()
- {
- $this->assertFalse($this->body->eof());
- $this->body->read(1000);
- $this->assertTrue($this->body->eof());
- }
-
- public function testContentLengthIsBounded()
- {
- $this->assertEquals(10, $this->body->getSize());
- }
-
- public function testGetContentsIsBasedOnSubset()
- {
- $body = new LimitStream(Psr7\stream_for('foobazbar'), 3, 3);
- $this->assertEquals('baz', $body->getContents());
- }
-
- public function testReturnsNullIfSizeCannotBeDetermined()
- {
- $a = new FnStream([
- 'getSize' => function () { return null; },
- 'tell' => function () { return 0; },
- ]);
- $b = new LimitStream($a);
- $this->assertNull($b->getSize());
- }
-
- public function testLengthLessOffsetWhenNoLimitSize()
- {
- $a = Psr7\stream_for('foo_bar');
- $b = new LimitStream($a, -1, 4);
- $this->assertEquals(3, $b->getSize());
- }
-}
diff --git a/server/vendor/guzzlehttp/psr7/tests/MultipartStreamTest.php b/server/vendor/guzzlehttp/psr7/tests/MultipartStreamTest.php
deleted file mode 100644
index a509261..0000000
--- a/server/vendor/guzzlehttp/psr7/tests/MultipartStreamTest.php
+++ /dev/null
@@ -1,242 +0,0 @@
-<?php
-namespace GuzzleHttp\Tests;
-
-use GuzzleHttp\Psr7;
-use GuzzleHttp\Psr7\MultipartStream;
-
-class MultipartStreamTest extends \PHPUnit_Framework_TestCase
-{
- public function testCreatesDefaultBoundary()
- {
- $b = new MultipartStream();
- $this->assertNotEmpty($b->getBoundary());
- }
-
- public function testCanProvideBoundary()
- {
- $b = new MultipartStream([], 'foo');
- $this->assertEquals('foo', $b->getBoundary());
- }
-
- public function testIsNotWritable()
- {
- $b = new MultipartStream();
- $this->assertFalse($b->isWritable());
- }
-
- public function testCanCreateEmptyStream()
- {
- $b = new MultipartStream();
- $boundary = $b->getBoundary();
- $this->assertSame("--{$boundary}--\r\n", $b->getContents());
- $this->assertSame(strlen($boundary) + 6, $b->getSize());
- }
-
- /**
- * @expectedException \InvalidArgumentException
- */
- public function testValidatesFilesArrayElement()
- {
- new MultipartStream([['foo' => 'bar']]);
- }
-
- /**
- * @expectedException \InvalidArgumentException
- */
- public function testEnsuresFileHasName()
- {
- new MultipartStream([['contents' => 'bar']]);
- }
-
- public function testSerializesFields()
- {
- $b = new MultipartStream([
- [
- 'name' => 'foo',
- 'contents' => 'bar'
- ],
- [
- 'name' => 'baz',
- 'contents' => 'bam'
- ]
- ], 'boundary');
- $this->assertEquals(
- "--boundary\r\nContent-Disposition: form-data; name=\"foo\"\r\nContent-Length: 3\r\n\r\n"
- . "bar\r\n--boundary\r\nContent-Disposition: form-data; name=\"baz\"\r\nContent-Length: 3"
- . "\r\n\r\nbam\r\n--boundary--\r\n", (string) $b);
- }
-
- public function testSerializesNonStringFields()
- {
- $b = new MultipartStream([
- [
- 'name' => 'int',
- 'contents' => (int) 1
- ],
- [
- 'name' => 'bool',
- 'contents' => (boolean) false
- ],
- [
- 'name' => 'bool2',
- 'contents' => (boolean) true
- ],
- [
- 'name' => 'float',
- 'contents' => (float) 1.1
- ]
- ], 'boundary');
- $this->assertEquals(
- "--boundary\r\nContent-Disposition: form-data; name=\"int\"\r\nContent-Length: 1\r\n\r\n"
- . "1\r\n--boundary\r\nContent-Disposition: form-data; name=\"bool\"\r\n\r\n\r\n--boundary"
- . "\r\nContent-Disposition: form-data; name=\"bool2\"\r\nContent-Length: 1\r\n\r\n"
- . "1\r\n--boundary\r\nContent-Disposition: form-data; name=\"float\"\r\nContent-Length: 3"
- . "\r\n\r\n1.1\r\n--boundary--\r\n", (string) $b);
- }
-
- public function testSerializesFiles()
- {
- $f1 = Psr7\FnStream::decorate(Psr7\stream_for('foo'), [
- 'getMetadata' => function () {
- return '/foo/bar.txt';
- }
- ]);
-
- $f2 = Psr7\FnStream::decorate(Psr7\stream_for('baz'), [
- 'getMetadata' => function () {
- return '/foo/baz.jpg';
- }
- ]);
-
- $f3 = Psr7\FnStream::decorate(Psr7\stream_for('bar'), [
- 'getMetadata' => function () {
- return '/foo/bar.gif';
- }
- ]);
-
- $b = new MultipartStream([
- [
- 'name' => 'foo',
- 'contents' => $f1
- ],
- [
- 'name' => 'qux',
- 'contents' => $f2
- ],
- [
- 'name' => 'qux',
- 'contents' => $f3
- ],
- ], 'boundary');
-
- $expected = <<<EOT
---boundary
-Content-Disposition: form-data; name="foo"; filename="bar.txt"
-Content-Length: 3
-Content-Type: text/plain
-
-foo
---boundary
-Content-Disposition: form-data; name="qux"; filename="baz.jpg"
-Content-Length: 3
-Content-Type: image/jpeg
-
-baz
---boundary
-Content-Disposition: form-data; name="qux"; filename="bar.gif"
-Content-Length: 3
-Content-Type: image/gif
-
-bar
---boundary--
-
-EOT;
-
- $this->assertEquals($expected, str_replace("\r", '', $b));
- }
-
- public function testSerializesFilesWithCustomHeaders()
- {
- $f1 = Psr7\FnStream::decorate(Psr7\stream_for('foo'), [
- 'getMetadata' => function () {
- return '/foo/bar.txt';
- }
- ]);
-
- $b = new MultipartStream([
- [
- 'name' => 'foo',
- 'contents' => $f1,
- 'headers' => [
- 'x-foo' => 'bar',
- 'content-disposition' => 'custom'
- ]
- ]
- ], 'boundary');
-
- $expected = <<<EOT
---boundary
-x-foo: bar
-content-disposition: custom
-Content-Length: 3
-Content-Type: text/plain
-
-foo
---boundary--
-
-EOT;
-
- $this->assertEquals($expected, str_replace("\r", '', $b));
- }
-
- public function testSerializesFilesWithCustomHeadersAndMultipleValues()
- {
- $f1 = Psr7\FnStream::decorate(Psr7\stream_for('foo'), [
- 'getMetadata' => function () {
- return '/foo/bar.txt';
- }
- ]);
-
- $f2 = Psr7\FnStream::decorate(Psr7\stream_for('baz'), [
- 'getMetadata' => function () {
- return '/foo/baz.jpg';
- }
- ]);
-
- $b = new MultipartStream([
- [
- 'name' => 'foo',
- 'contents' => $f1,
- 'headers' => [
- 'x-foo' => 'bar',
- 'content-disposition' => 'custom'
- ]
- ],
- [
- 'name' => 'foo',
- 'contents' => $f2,
- 'headers' => ['cOntenT-Type' => 'custom'],
- ]
- ], 'boundary');
-
- $expected = <<<EOT
---boundary
-x-foo: bar
-content-disposition: custom
-Content-Length: 3
-Content-Type: text/plain
-
-foo
---boundary
-cOntenT-Type: custom
-Content-Disposition: form-data; name="foo"; filename="baz.jpg"
-Content-Length: 3
-
-baz
---boundary--
-
-EOT;
-
- $this->assertEquals($expected, str_replace("\r", '', $b));
- }
-}
diff --git a/server/vendor/guzzlehttp/psr7/tests/NoSeekStreamTest.php b/server/vendor/guzzlehttp/psr7/tests/NoSeekStreamTest.php
deleted file mode 100644
index a309317..0000000
--- a/server/vendor/guzzlehttp/psr7/tests/NoSeekStreamTest.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-namespace GuzzleHttp\Tests\Psr7;
-
-use GuzzleHttp\Psr7;
-use GuzzleHttp\Psr7\NoSeekStream;
-
-/**
- * @covers GuzzleHttp\Psr7\NoSeekStream
- * @covers GuzzleHttp\Psr7\StreamDecoratorTrait
- */
-class NoSeekStreamTest extends \PHPUnit_Framework_TestCase
-{
- /**
- * @expectedException \RuntimeException
- * @expectedExceptionMessage Cannot seek a NoSeekStream
- */
- public function testCannotSeek()
- {
- $s = $this->getMockBuilder('Psr\Http\Message\StreamInterface')
- ->setMethods(['isSeekable', 'seek'])
- ->getMockForAbstractClass();
- $s->expects($this->never())->method('seek');
- $s->expects($this->never())->method('isSeekable');
- $wrapped = new NoSeekStream($s);
- $this->assertFalse($wrapped->isSeekable());
- $wrapped->seek(2);
- }
-
- /**
- * @expectedException \RuntimeException
- * @expectedExceptionMessage Cannot write to a non-writable stream
- */
- public function testHandlesClose()
- {
- $s = Psr7\stream_for('foo');
- $wrapped = new NoSeekStream($s);
- $wrapped->close();
- $wrapped->write('foo');
- }
-}
diff --git a/server/vendor/guzzlehttp/psr7/tests/PumpStreamTest.php b/server/vendor/guzzlehttp/psr7/tests/PumpStreamTest.php
deleted file mode 100644
index 7358bb6..0000000
--- a/server/vendor/guzzlehttp/psr7/tests/PumpStreamTest.php
+++ /dev/null
@@ -1,72 +0,0 @@
-<?php
-namespace GuzzleHttp\Tests\Psr7;
-
-use GuzzleHttp\Psr7\LimitStream;
-use GuzzleHttp\Psr7\PumpStream;
-use GuzzleHttp\Psr7;
-
-class PumpStreamTest extends \PHPUnit_Framework_TestCase
-{
- public function testHasMetadataAndSize()
- {
- $p = new PumpStream(function () {}, [
- 'metadata' => ['foo' => 'bar'],
- 'size' => 100
- ]);
-
- $this->assertEquals('bar', $p->getMetadata('foo'));
- $this->assertEquals(['foo' => 'bar'], $p->getMetadata());
- $this->assertEquals(100, $p->getSize());
- }
-
- public function testCanReadFromCallable()
- {
- $p = Psr7\stream_for(function ($size) {
- return 'a';
- });
- $this->assertEquals('a', $p->read(1));
- $this->assertEquals(1, $p->tell());
- $this->assertEquals('aaaaa', $p->read(5));
- $this->assertEquals(6, $p->tell());
- }
-
- public function testStoresExcessDataInBuffer()
- {
- $called = [];
- $p = Psr7\stream_for(function ($size) use (&$called) {
- $called[] = $size;
- return 'abcdef';
- });
- $this->assertEquals('a', $p->read(1));
- $this->assertEquals('b', $p->read(1));
- $this->assertEquals('cdef', $p->read(4));
- $this->assertEquals('abcdefabc', $p->read(9));
- $this->assertEquals([1, 9, 3], $called);
- }
-
- public function testInifiniteStreamWrappedInLimitStream()
- {
- $p = Psr7\stream_for(function () { return 'a'; });
- $s = new LimitStream($p, 5);
- $this->assertEquals('aaaaa', (string) $s);
- }
-
- public function testDescribesCapabilities()
- {
- $p = Psr7\stream_for(function () {});
- $this->assertTrue($p->isReadable());
- $this->assertFalse($p->isSeekable());
- $this->assertFalse($p->isWritable());
- $this->assertNull($p->getSize());
- $this->assertEquals('', $p->getContents());
- $this->assertEquals('', (string) $p);
- $p->close();
- $this->assertEquals('', $p->read(10));
- $this->assertTrue($p->eof());
-
- try {
- $this->assertFalse($p->write('aa'));
- $this->fail();
- } catch (\RuntimeException $e) {}
- }
-}
diff --git a/server/vendor/guzzlehttp/psr7/tests/RequestTest.php b/server/vendor/guzzlehttp/psr7/tests/RequestTest.php
deleted file mode 100644
index c555043..0000000
--- a/server/vendor/guzzlehttp/psr7/tests/RequestTest.php
+++ /dev/null
@@ -1,195 +0,0 @@
-<?php
-namespace GuzzleHttp\Tests\Psr7;
-
-use GuzzleHttp\Psr7;
-use GuzzleHttp\Psr7\Request;
-use GuzzleHttp\Psr7\Uri;
-
-/**
- * @covers GuzzleHttp\Psr7\Request
- */
-class RequestTest extends \PHPUnit_Framework_TestCase
-{
- public function testRequestUriMayBeString()
- {
- $r = new Request('GET', '/');
- $this->assertEquals('/', (string) $r->getUri());
- }
-
- public function testRequestUriMayBeUri()
- {
- $uri = new Uri('/');
- $r = new Request('GET', $uri);
- $this->assertSame($uri, $r->getUri());
- }
-
- /**
- * @expectedException \InvalidArgumentException
- */
- public function testValidateRequestUri()
- {
- new Request('GET', '///');
- }
-
- public function testCanConstructWithBody()
- {
- $r = new Request('GET', '/', [], 'baz');
- $this->assertInstanceOf('Psr\Http\Message\StreamInterface', $r->getBody());
- $this->assertEquals('baz', (string) $r->getBody());
- }
-
- public function testNullBody()
- {
- $r = new Request('GET', '/', [], null);
- $this->assertInstanceOf('Psr\Http\Message\StreamInterface', $r->getBody());
- $this->assertSame('', (string) $r->getBody());
- }
-
- public function testFalseyBody()
- {
- $r = new Request('GET', '/', [], '0');
- $this->assertInstanceOf('Psr\Http\Message\StreamInterface', $r->getBody());
- $this->assertSame('0', (string) $r->getBody());
- }
-
- public function testConstructorDoesNotReadStreamBody()
- {
- $streamIsRead = false;
- $body = Psr7\FnStream::decorate(Psr7\stream_for(''), [
- '__toString' => function () use (&$streamIsRead) {
- $streamIsRead = true;
- return '';
- }
- ]);
-
- $r = new Request('GET', '/', [], $body);
- $this->assertFalse($streamIsRead);
- $this->assertSame($body, $r->getBody());
- }
-
- public function testCapitalizesMethod()
- {
- $r = new Request('get', '/');
- $this->assertEquals('GET', $r->getMethod());
- }
-
- public function testCapitalizesWithMethod()
- {
- $r = new Request('GET', '/');
- $this->assertEquals('PUT', $r->withMethod('put')->getMethod());
- }
-
- public function testWithUri()
- {
- $r1 = new Request('GET', '/');
- $u1 = $r1->getUri();
- $u2 = new Uri('http://www.example.com');
- $r2 = $r1->withUri($u2);
- $this->assertNotSame($r1, $r2);
- $this->assertSame($u2, $r2->getUri());
- $this->assertSame($u1, $r1->getUri());
- }
-
- public function testSameInstanceWhenSameUri()
- {
- $r1 = new Request('GET', 'http://foo.com');
- $r2 = $r1->withUri($r1->getUri());
- $this->assertSame($r1, $r2);
- }
-
- public function testWithRequestTarget()
- {
- $r1 = new Request('GET', '/');
- $r2 = $r1->withRequestTarget('*');
- $this->assertEquals('*', $r2->getRequestTarget());
- $this->assertEquals('/', $r1->getRequestTarget());
- }
-
- /**
- * @expectedException \InvalidArgumentException
- */
- public function testRequestTargetDoesNotAllowSpaces()
- {
- $r1 = new Request('GET', '/');
- $r1->withRequestTarget('/foo bar');
- }
-
- public function testRequestTargetDefaultsToSlash()
- {
- $r1 = new Request('GET', '');
- $this->assertEquals('/', $r1->getRequestTarget());
- $r2 = new Request('GET', '*');
- $this->assertEquals('*', $r2->getRequestTarget());
- $r3 = new Request('GET', 'http://foo.com/bar baz/');
- $this->assertEquals('/bar%20baz/', $r3->getRequestTarget());
- }
-
- public function testBuildsRequestTarget()
- {
- $r1 = new Request('GET', 'http://foo.com/baz?bar=bam');
- $this->assertEquals('/baz?bar=bam', $r1->getRequestTarget());
- }
-
- public function testBuildsRequestTargetWithFalseyQuery()
- {
- $r1 = new Request('GET', 'http://foo.com/baz?0');
- $this->assertEquals('/baz?0', $r1->getRequestTarget());
- }
-
- public function testHostIsAddedFirst()
- {
- $r = new Request('GET', 'http://foo.com/baz?bar=bam', ['Foo' => 'Bar']);
- $this->assertEquals([
- 'Host' => ['foo.com'],
- 'Foo' => ['Bar']
- ], $r->getHeaders());
- }
-
- public function testCanGetHeaderAsCsv()
- {
- $r = new Request('GET', 'http://foo.com/baz?bar=bam', [
- 'Foo' => ['a', 'b', 'c']
- ]);
- $this->assertEquals('a, b, c', $r->getHeaderLine('Foo'));
- $this->assertEquals('', $r->getHeaderLine('Bar'));
- }
-
- public function testHostIsNotOverwrittenWhenPreservingHost()
- {
- $r = new Request('GET', 'http://foo.com/baz?bar=bam', ['Host' => 'a.com']);
- $this->assertEquals(['Host' => ['a.com']], $r->getHeaders());
- $r2 = $r->withUri(new Uri('http://www.foo.com/bar'), true);
- $this->assertEquals('a.com', $r2->getHeaderLine('Host'));
- }
-
- public function testOverridesHostWithUri()
- {
- $r = new Request('GET', 'http://foo.com/baz?bar=bam');
- $this->assertEquals(['Host' => ['foo.com']], $r->getHeaders());
- $r2 = $r->withUri(new Uri('http://www.baz.com/bar'));
- $this->assertEquals('www.baz.com', $r2->getHeaderLine('Host'));
- }
-
- public function testAggregatesHeaders()
- {
- $r = new Request('GET', '', [
- 'ZOO' => 'zoobar',
- 'zoo' => ['foobar', 'zoobar']
- ]);
- $this->assertEquals(['ZOO' => ['zoobar', 'foobar', 'zoobar']], $r->getHeaders());
- $this->assertEquals('zoobar, foobar, zoobar', $r->getHeaderLine('zoo'));
- }
-
- public function testAddsPortToHeader()
- {
- $r = new Request('GET', 'http://foo.com:8124/bar');
- $this->assertEquals('foo.com:8124', $r->getHeaderLine('host'));
- }
-
- public function testAddsPortToHeaderAndReplacePreviousPort()
- {
- $r = new Request('GET', 'http://foo.com:8124/bar');
- $r = $r->withUri(new Uri('http://foo.com:8125/bar'));
- $this->assertEquals('foo.com:8125', $r->getHeaderLine('host'));
- }
-}
diff --git a/server/vendor/guzzlehttp/psr7/tests/ResponseTest.php b/server/vendor/guzzlehttp/psr7/tests/ResponseTest.php
deleted file mode 100644
index ae01fe1..0000000
--- a/server/vendor/guzzlehttp/psr7/tests/ResponseTest.php
+++ /dev/null
@@ -1,252 +0,0 @@
-<?php
-namespace GuzzleHttp\Tests\Psr7;
-
-use GuzzleHttp\Psr7;
-use GuzzleHttp\Psr7\Response;
-
-/**
- * @covers GuzzleHttp\Psr7\MessageTrait
- * @covers GuzzleHttp\Psr7\Response
- */
-class ResponseTest extends \PHPUnit_Framework_TestCase
-{
- public function testDefaultConstructor()
- {
- $r = new Response();
- $this->assertSame(200, $r->getStatusCode());
- $this->assertSame('1.1', $r->getProtocolVersion());
- $this->assertSame('OK', $r->getReasonPhrase());
- $this->assertSame([], $r->getHeaders());
- $this->assertInstanceOf('Psr\Http\Message\StreamInterface', $r->getBody());
- $this->assertSame('', (string) $r->getBody());
- }
-
- public function testCanConstructWithStatusCode()
- {
- $r = new Response(404);
- $this->assertSame(404, $r->getStatusCode());
- $this->assertSame('Not Found', $r->getReasonPhrase());
- }
-
- public function testConstructorDoesNotReadStreamBody()
- {
- $streamIsRead = false;
- $body = Psr7\FnStream::decorate(Psr7\stream_for(''), [
- '__toString' => function () use (&$streamIsRead) {
- $streamIsRead = true;
- return '';
- }
- ]);
-
- $r = new Response(200, [], $body);
- $this->assertFalse($streamIsRead);
- $this->assertSame($body, $r->getBody());
- }
-
- public function testStatusCanBeNumericString()
- {
- $r = new Response('404');
- $r2 = $r->withStatus('201');
- $this->assertSame(404, $r->getStatusCode());
- $this->assertSame('Not Found', $r->getReasonPhrase());
- $this->assertSame(201, $r2->getStatusCode());
- $this->assertSame('Created', $r2->getReasonPhrase());
- }
-
- public function testCanConstructWithHeaders()
- {
- $r = new Response(200, ['Foo' => 'Bar']);
- $this->assertSame(['Foo' => ['Bar']], $r->getHeaders());
- $this->assertSame('Bar', $r->getHeaderLine('Foo'));
- $this->assertSame(['Bar'], $r->getHeader('Foo'));
- }
-
- public function testCanConstructWithHeadersAsArray()
- {
- $r = new Response(200, [
- 'Foo' => ['baz', 'bar']
- ]);
- $this->assertSame(['Foo' => ['baz', 'bar']], $r->getHeaders());
- $this->assertSame('baz, bar', $r->getHeaderLine('Foo'));
- $this->assertSame(['baz', 'bar'], $r->getHeader('Foo'));
- }
-
- public function testCanConstructWithBody()
- {
- $r = new Response(200, [], 'baz');
- $this->assertInstanceOf('Psr\Http\Message\StreamInterface', $r->getBody());
- $this->assertSame('baz', (string) $r->getBody());
- }
-
- public function testNullBody()
- {
- $r = new Response(200, [], null);
- $this->assertInstanceOf('Psr\Http\Message\StreamInterface', $r->getBody());
- $this->assertSame('', (string) $r->getBody());
- }
-
- public function testFalseyBody()
- {
- $r = new Response(200, [], '0');
- $this->assertInstanceOf('Psr\Http\Message\StreamInterface', $r->getBody());
- $this->assertSame('0', (string) $r->getBody());
- }
-
- public function testCanConstructWithReason()
- {
- $r = new Response(200, [], null, '1.1', 'bar');
- $this->assertSame('bar', $r->getReasonPhrase());
-
- $r = new Response(200, [], null, '1.1', '0');
- $this->assertSame('0', $r->getReasonPhrase(), 'Falsey reason works');
- }
-
- public function testCanConstructWithProtocolVersion()
- {
- $r = new Response(200, [], null, '1000');
- $this->assertSame('1000', $r->getProtocolVersion());
- }
-
- public function testWithStatusCodeAndNoReason()
- {
- $r = (new Response())->withStatus(201);
- $this->assertSame(201, $r->getStatusCode());
- $this->assertSame('Created', $r->getReasonPhrase());
- }
-
- public function testWithStatusCodeAndReason()
- {
- $r = (new Response())->withStatus(201, 'Foo');
- $this->assertSame(201, $r->getStatusCode());
- $this->assertSame('Foo', $r->getReasonPhrase());
-
- $r = (new Response())->withStatus(201, '0');
- $this->assertSame(201, $r->getStatusCode());
- $this->assertSame('0', $r->getReasonPhrase(), 'Falsey reason works');
- }
-
- public function testWithProtocolVersion()
- {
- $r = (new Response())->withProtocolVersion('1000');
- $this->assertSame('1000', $r->getProtocolVersion());
- }
-
- public function testSameInstanceWhenSameProtocol()
- {
- $r = new Response();
- $this->assertSame($r, $r->withProtocolVersion('1.1'));
- }
-
- public function testWithBody()
- {
- $b = Psr7\stream_for('0');
- $r = (new Response())->withBody($b);
- $this->assertInstanceOf('Psr\Http\Message\StreamInterface', $r->getBody());
- $this->assertSame('0', (string) $r->getBody());
- }
-
- public function testSameInstanceWhenSameBody()
- {
- $r = new Response();
- $b = $r->getBody();
- $this->assertSame($r, $r->withBody($b));
- }
-
- public function testWithHeader()
- {
- $r = new Response(200, ['Foo' => 'Bar']);
- $r2 = $r->withHeader('baZ', 'Bam');
- $this->assertSame(['Foo' => ['Bar']], $r->getHeaders());
- $this->assertSame(['Foo' => ['Bar'], 'baZ' => ['Bam']], $r2->getHeaders());
- $this->assertSame('Bam', $r2->getHeaderLine('baz'));
- $this->assertSame(['Bam'], $r2->getHeader('baz'));
- }
-
- public function testWithHeaderAsArray()
- {
- $r = new Response(200, ['Foo' => 'Bar']);
- $r2 = $r->withHeader('baZ', ['Bam', 'Bar']);
- $this->assertSame(['Foo' => ['Bar']], $r->getHeaders());
- $this->assertSame(['Foo' => ['Bar'], 'baZ' => ['Bam', 'Bar']], $r2->getHeaders());
- $this->assertSame('Bam, Bar', $r2->getHeaderLine('baz'));
- $this->assertSame(['Bam', 'Bar'], $r2->getHeader('baz'));
- }
-
- public function testWithHeaderReplacesDifferentCase()
- {
- $r = new Response(200, ['Foo' => 'Bar']);
- $r2 = $r->withHeader('foO', 'Bam');
- $this->assertSame(['Foo' => ['Bar']], $r->getHeaders());
- $this->assertSame(['foO' => ['Bam']], $r2->getHeaders());
- $this->assertSame('Bam', $r2->getHeaderLine('foo'));
- $this->assertSame(['Bam'], $r2->getHeader('foo'));
- }
-
- public function testWithAddedHeader()
- {
- $r = new Response(200, ['Foo' => 'Bar']);
- $r2 = $r->withAddedHeader('foO', 'Baz');
- $this->assertSame(['Foo' => ['Bar']], $r->getHeaders());
- $this->assertSame(['Foo' => ['Bar', 'Baz']], $r2->getHeaders());
- $this->assertSame('Bar, Baz', $r2->getHeaderLine('foo'));
- $this->assertSame(['Bar', 'Baz'], $r2->getHeader('foo'));
- }
-
- public function testWithAddedHeaderAsArray()
- {
- $r = new Response(200, ['Foo' => 'Bar']);
- $r2 = $r->withAddedHeader('foO', ['Baz', 'Bam']);
- $this->assertSame(['Foo' => ['Bar']], $r->getHeaders());
- $this->assertSame(['Foo' => ['Bar', 'Baz', 'Bam']], $r2->getHeaders());
- $this->assertSame('Bar, Baz, Bam', $r2->getHeaderLine('foo'));
- $this->assertSame(['Bar', 'Baz', 'Bam'], $r2->getHeader('foo'));
- }
-
- public function testWithAddedHeaderThatDoesNotExist()
- {
- $r = new Response(200, ['Foo' => 'Bar']);
- $r2 = $r->withAddedHeader('nEw', 'Baz');
- $this->assertSame(['Foo' => ['Bar']], $r->getHeaders());
- $this->assertSame(['Foo' => ['Bar'], 'nEw' => ['Baz']], $r2->getHeaders());
- $this->assertSame('Baz', $r2->getHeaderLine('new'));
- $this->assertSame(['Baz'], $r2->getHeader('new'));
- }
-
- public function testWithoutHeaderThatExists()
- {
- $r = new Response(200, ['Foo' => 'Bar', 'Baz' => 'Bam']);
- $r2 = $r->withoutHeader('foO');
- $this->assertTrue($r->hasHeader('foo'));
- $this->assertSame(['Foo' => ['Bar'], 'Baz' => ['Bam']], $r->getHeaders());
- $this->assertFalse($r2->hasHeader('foo'));
- $this->assertSame(['Baz' => ['Bam']], $r2->getHeaders());
- }
-
- public function testWithoutHeaderThatDoesNotExist()
- {
- $r = new Response(200, ['Baz' => 'Bam']);
- $r2 = $r->withoutHeader('foO');
- $this->assertSame($r, $r2);
- $this->assertFalse($r2->hasHeader('foo'));
- $this->assertSame(['Baz' => ['Bam']], $r2->getHeaders());
- }
-
- public function testSameInstanceWhenRemovingMissingHeader()
- {
- $r = new Response();
- $this->assertSame($r, $r->withoutHeader('foo'));
- }
-
- public function testHeaderValuesAreTrimmed()
- {
- $r1 = new Response(200, ['OWS' => " \t \tFoo\t \t "]);
- $r2 = (new Response())->withHeader('OWS', " \t \tFoo\t \t ");
- $r3 = (new Response())->withAddedHeader('OWS', " \t \tFoo\t \t ");;
-
- foreach ([$r1, $r2, $r3] as $r) {
- $this->assertSame(['OWS' => ['Foo']], $r->getHeaders());
- $this->assertSame('Foo', $r->getHeaderLine('OWS'));
- $this->assertSame(['Foo'], $r->getHeader('OWS'));
- }
- }
-}
diff --git a/server/vendor/guzzlehttp/psr7/tests/ServerRequestTest.php b/server/vendor/guzzlehttp/psr7/tests/ServerRequestTest.php
deleted file mode 100644
index f1727d0..0000000
--- a/server/vendor/guzzlehttp/psr7/tests/ServerRequestTest.php
+++ /dev/null
@@ -1,532 +0,0 @@
-<?php
-namespace GuzzleHttp\Tests\Psr7;
-
-use GuzzleHttp\Psr7\ServerRequest;
-use GuzzleHttp\Psr7\UploadedFile;
-use GuzzleHttp\Psr7\Uri;
-
-/**
- * @covers GuzzleHttp\Psr7\ServerRequest
- */
-class ServerRequestTest extends \PHPUnit_Framework_TestCase
-{
- public function dataNormalizeFiles()
- {
- return [
- 'Single file' => [
- [
- 'file' => [
- 'name' => 'MyFile.txt',
- 'type' => 'text/plain',
- 'tmp_name' => '/tmp/php/php1h4j1o',
- 'error' => '0',
- 'size' => '123'
- ]
- ],
- [
- 'file' => new UploadedFile(
- '/tmp/php/php1h4j1o',
- 123,
- UPLOAD_ERR_OK,
- 'MyFile.txt',
- 'text/plain'
- )
- ]
- ],
- 'Empty file' => [
- [
- 'image_file' => [
- 'name' => '',
- 'type' => '',
- 'tmp_name' => '',
- 'error' => '4',
- 'size' => '0'
- ]
- ],
- [
- 'image_file' => new UploadedFile(
- '',
- 0,
- UPLOAD_ERR_NO_FILE,
- '',
- ''
- )
- ]
- ],
- 'Already Converted' => [
- [
- 'file' => new UploadedFile(
- '/tmp/php/php1h4j1o',
- 123,
- UPLOAD_ERR_OK,
- 'MyFile.txt',
- 'text/plain'
- )
- ],
- [
- 'file' => new UploadedFile(
- '/tmp/php/php1h4j1o',
- 123,
- UPLOAD_ERR_OK,
- 'MyFile.txt',
- 'text/plain'
- )
- ]
- ],
- 'Already Converted array' => [
- [
- 'file' => [
- new UploadedFile(
- '/tmp/php/php1h4j1o',
- 123,
- UPLOAD_ERR_OK,
- 'MyFile.txt',
- 'text/plain'
- ),
- new UploadedFile(
- '',
- 0,
- UPLOAD_ERR_NO_FILE,
- '',
- ''
- )
- ],
- ],
- [
- 'file' => [
- new UploadedFile(
- '/tmp/php/php1h4j1o',
- 123,
- UPLOAD_ERR_OK,
- 'MyFile.txt',
- 'text/plain'
- ),
- new UploadedFile(
- '',
- 0,
- UPLOAD_ERR_NO_FILE,
- '',
- ''
- )
- ],
- ]
- ],
- 'Multiple files' => [
- [
- 'text_file' => [
- 'name' => 'MyFile.txt',
- 'type' => 'text/plain',
- 'tmp_name' => '/tmp/php/php1h4j1o',
- 'error' => '0',
- 'size' => '123'
- ],
- 'image_file' => [
- 'name' => '',
- 'type' => '',
- 'tmp_name' => '',
- 'error' => '4',
- 'size' => '0'
- ]
- ],
- [
- 'text_file' => new UploadedFile(
- '/tmp/php/php1h4j1o',
- 123,
- UPLOAD_ERR_OK,
- 'MyFile.txt',
- 'text/plain'
- ),
- 'image_file' => new UploadedFile(
- '',
- 0,
- UPLOAD_ERR_NO_FILE,
- '',
- ''
- )
- ]
- ],
- 'Nested files' => [
- [
- 'file' => [
- 'name' => [
- 0 => 'MyFile.txt',
- 1 => 'Image.png',
- ],
- 'type' => [
- 0 => 'text/plain',
- 1 => 'image/png',
- ],
- 'tmp_name' => [
- 0 => '/tmp/php/hp9hskjhf',
- 1 => '/tmp/php/php1h4j1o',
- ],
- 'error' => [
- 0 => '0',
- 1 => '0',
- ],
- 'size' => [
- 0 => '123',
- 1 => '7349',
- ],
- ],
- 'nested' => [
- 'name' => [
- 'other' => 'Flag.txt',
- 'test' => [
- 0 => 'Stuff.txt',
- 1 => '',
- ],
- ],
- 'type' => [
- 'other' => 'text/plain',
- 'test' => [
- 0 => 'text/plain',
- 1 => '',
- ],
- ],
- 'tmp_name' => [
- 'other' => '/tmp/php/hp9hskjhf',
- 'test' => [
- 0 => '/tmp/php/asifu2gp3',
- 1 => '',
- ],
- ],
- 'error' => [
- 'other' => '0',
- 'test' => [
- 0 => '0',
- 1 => '4',
- ],
- ],
- 'size' => [
- 'other' => '421',
- 'test' => [
- 0 => '32',
- 1 => '0',
- ]
- ]
- ],
- ],
- [
- 'file' => [
- 0 => new UploadedFile(
- '/tmp/php/hp9hskjhf',
- 123,
- UPLOAD_ERR_OK,
- 'MyFile.txt',
- 'text/plain'
- ),
- 1 => new UploadedFile(
- '/tmp/php/php1h4j1o',
- 7349,
- UPLOAD_ERR_OK,
- 'Image.png',
- 'image/png'
- ),
- ],
- 'nested' => [
- 'other' => new UploadedFile(
- '/tmp/php/hp9hskjhf',
- 421,
- UPLOAD_ERR_OK,
- 'Flag.txt',
- 'text/plain'
- ),
- 'test' => [
- 0 => new UploadedFile(
- '/tmp/php/asifu2gp3',
- 32,
- UPLOAD_ERR_OK,
- 'Stuff.txt',
- 'text/plain'
- ),
- 1 => new UploadedFile(
- '',
- 0,
- UPLOAD_ERR_NO_FILE,
- '',
- ''
- ),
- ]
- ]
- ]
- ]
- ];
- }
-
- /**
- * @dataProvider dataNormalizeFiles
- */
- public function testNormalizeFiles($files, $expected)
- {
- $result = ServerRequest::normalizeFiles($files);
-
- $this->assertEquals($expected, $result);
- }
-
- public function testNormalizeFilesRaisesException()
- {
- $this->setExpectedException('InvalidArgumentException', 'Invalid value in files specification');
-
- ServerRequest::normalizeFiles(['test' => 'something']);
- }
-
- public function dataGetUriFromGlobals()
- {
- $server = [
- 'PHP_SELF' => '/blog/article.php',
- 'GATEWAY_INTERFACE' => 'CGI/1.1',
- 'SERVER_ADDR' => 'Server IP: 217.112.82.20',
- 'SERVER_NAME' => 'www.blakesimpson.co.uk',
- 'SERVER_SOFTWARE' => 'Apache/2.2.15 (Win32) JRun/4.0 PHP/5.2.13',
- 'SERVER_PROTOCOL' => 'HTTP/1.0',
- 'REQUEST_METHOD' => 'POST',
- 'REQUEST_TIME' => 'Request start time: 1280149029',
- 'QUERY_STRING' => 'id=10&user=foo',
- 'DOCUMENT_ROOT' => '/path/to/your/server/root/',
- 'HTTP_ACCEPT' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
- 'HTTP_ACCEPT_CHARSET' => 'ISO-8859-1,utf-8;q=0.7,*;q=0.7',
- 'HTTP_ACCEPT_ENCODING' => 'gzip,deflate',
- 'HTTP_ACCEPT_LANGUAGE' => 'en-gb,en;q=0.5',
- 'HTTP_CONNECTION' => 'keep-alive',
- 'HTTP_HOST' => 'www.blakesimpson.co.uk',
- 'HTTP_REFERER' => 'http://previous.url.com',
- 'HTTP_USER_AGENT' => 'Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6 ( .NET CLR 3.5.30729)',
- 'HTTPS' => '1',
- 'REMOTE_ADDR' => '193.60.168.69',
- 'REMOTE_HOST' => 'Client server\'s host name',
- 'REMOTE_PORT' => '5390',
- 'SCRIPT_FILENAME' => '/path/to/this/script.php',
- 'SERVER_ADMIN' => 'webmaster@blakesimpson.co.uk',
- 'SERVER_PORT' => '80',
- 'SERVER_SIGNATURE' => 'Version signature: 5.123',
- 'SCRIPT_NAME' => '/blog/article.php',
- 'REQUEST_URI' => '/blog/article.php?id=10&user=foo',
- ];
-
- return [
- 'Normal request' => [
- 'http://www.blakesimpson.co.uk/blog/article.php?id=10&user=foo',
- $server,
- ],
- 'Secure request' => [
- 'https://www.blakesimpson.co.uk/blog/article.php?id=10&user=foo',
- array_merge($server, ['HTTPS' => 'on', 'SERVER_PORT' => '443']),
- ],
- 'HTTP_HOST missing' => [
- 'http://www.blakesimpson.co.uk/blog/article.php?id=10&user=foo',
- array_merge($server, ['HTTP_HOST' => null]),
- ],
- 'No query String' => [
- 'http://www.blakesimpson.co.uk/blog/article.php',
- array_merge($server, ['REQUEST_URI' => '/blog/article.php', 'QUERY_STRING' => '']),
- ],
- 'Different port' => [
- 'http://www.blakesimpson.co.uk:8324/blog/article.php?id=10&user=foo',
- array_merge($server, ['SERVER_PORT' => '8324']),
- ],
- 'Empty server variable' => [
- '',
- [],
- ],
- ];
- }
-
- /**
- * @dataProvider dataGetUriFromGlobals
- */
- public function testGetUriFromGlobals($expected, $serverParams)
- {
- $_SERVER = $serverParams;
-
- $this->assertEquals(new Uri($expected), ServerRequest::getUriFromGlobals());
- }
-
- public function testFromGlobals()
- {
- $_SERVER = [
- 'PHP_SELF' => '/blog/article.php',
- 'GATEWAY_INTERFACE' => 'CGI/1.1',
- 'SERVER_ADDR' => 'Server IP: 217.112.82.20',
- 'SERVER_NAME' => 'www.blakesimpson.co.uk',
- 'SERVER_SOFTWARE' => 'Apache/2.2.15 (Win32) JRun/4.0 PHP/5.2.13',
- 'SERVER_PROTOCOL' => 'HTTP/1.0',
- 'REQUEST_METHOD' => 'POST',
- 'REQUEST_TIME' => 'Request start time: 1280149029',
- 'QUERY_STRING' => 'id=10&user=foo',
- 'DOCUMENT_ROOT' => '/path/to/your/server/root/',
- 'HTTP_ACCEPT' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
- 'HTTP_ACCEPT_CHARSET' => 'ISO-8859-1,utf-8;q=0.7,*;q=0.7',
- 'HTTP_ACCEPT_ENCODING' => 'gzip,deflate',
- 'HTTP_ACCEPT_LANGUAGE' => 'en-gb,en;q=0.5',
- 'HTTP_CONNECTION' => 'keep-alive',
- 'HTTP_HOST' => 'www.blakesimpson.co.uk',
- 'HTTP_REFERER' => 'http://previous.url.com',
- 'HTTP_USER_AGENT' => 'Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6 ( .NET CLR 3.5.30729)',
- 'HTTPS' => '1',
- 'REMOTE_ADDR' => '193.60.168.69',
- 'REMOTE_HOST' => 'Client server\'s host name',
- 'REMOTE_PORT' => '5390',
- 'SCRIPT_FILENAME' => '/path/to/this/script.php',
- 'SERVER_ADMIN' => 'webmaster@blakesimpson.co.uk',
- 'SERVER_PORT' => '80',
- 'SERVER_SIGNATURE' => 'Version signature: 5.123',
- 'SCRIPT_NAME' => '/blog/article.php',
- 'REQUEST_URI' => '/blog/article.php?id=10&user=foo',
- ];
-
- $_COOKIE = [
- 'logged-in' => 'yes!'
- ];
-
- $_POST = [
- 'name' => 'Pesho',
- 'email' => 'pesho@example.com',
- ];
-
- $_GET = [
- 'id' => 10,
- 'user' => 'foo',
- ];
-
- $_FILES = [
- 'file' => [
- 'name' => 'MyFile.txt',
- 'type' => 'text/plain',
- 'tmp_name' => '/tmp/php/php1h4j1o',
- 'error' => UPLOAD_ERR_OK,
- 'size' => 123,
- ]
- ];
-
- $server = ServerRequest::fromGlobals();
-
- $this->assertEquals('POST', $server->getMethod());
- $this->assertEquals(['Host' => ['www.blakesimpson.co.uk']], $server->getHeaders());
- $this->assertEquals('', (string) $server->getBody());
- $this->assertEquals('1.0', $server->getProtocolVersion());
- $this->assertEquals($_COOKIE, $server->getCookieParams());
- $this->assertEquals($_POST, $server->getParsedBody());
- $this->assertEquals($_GET, $server->getQueryParams());
-
- $this->assertEquals(
- new Uri('http://www.blakesimpson.co.uk/blog/article.php?id=10&user=foo'),
- $server->getUri()
- );
-
- $expectedFiles = [
- 'file' => new UploadedFile(
- '/tmp/php/php1h4j1o',
- 123,
- UPLOAD_ERR_OK,
- 'MyFile.txt',
- 'text/plain'
- ),
- ];
-
- $this->assertEquals($expectedFiles, $server->getUploadedFiles());
- }
-
- public function testUploadedFiles()
- {
- $request1 = new ServerRequest('GET', '/');
-
- $files = [
- 'file' => new UploadedFile('test', 123, UPLOAD_ERR_OK)
- ];
-
- $request2 = $request1->withUploadedFiles($files);
-
- $this->assertNotSame($request2, $request1);
- $this->assertSame([], $request1->getUploadedFiles());
- $this->assertSame($files, $request2->getUploadedFiles());
- }
-
- public function testServerParams()
- {
- $params = ['name' => 'value'];
-
- $request = new ServerRequest('GET', '/', [], null, '1.1', $params);
- $this->assertSame($params, $request->getServerParams());
- }
-
- public function testCookieParams()
- {
- $request1 = new ServerRequest('GET', '/');
-
- $params = ['name' => 'value'];
-
- $request2 = $request1->withCookieParams($params);
-
- $this->assertNotSame($request2, $request1);
- $this->assertEmpty($request1->getCookieParams());
- $this->assertSame($params, $request2->getCookieParams());
- }
-
- public function testQueryParams()
- {
- $request1 = new ServerRequest('GET', '/');
-
- $params = ['name' => 'value'];
-
- $request2 = $request1->withQueryParams($params);
-
- $this->assertNotSame($request2, $request1);
- $this->assertEmpty($request1->getQueryParams());
- $this->assertSame($params, $request2->getQueryParams());
- }
-
- public function testParsedBody()
- {
- $request1 = new ServerRequest('GET', '/');
-
- $params = ['name' => 'value'];
-
- $request2 = $request1->withParsedBody($params);
-
- $this->assertNotSame($request2, $request1);
- $this->assertEmpty($request1->getParsedBody());
- $this->assertSame($params, $request2->getParsedBody());
- }
-
- public function testAttributes()
- {
- $request1 = new ServerRequest('GET', '/');
-
- $request2 = $request1->withAttribute('name', 'value');
- $request3 = $request2->withAttribute('other', 'otherValue');
- $request4 = $request3->withoutAttribute('other');
- $request5 = $request3->withoutAttribute('unknown');
-
- $this->assertNotSame($request2, $request1);
- $this->assertNotSame($request3, $request2);
- $this->assertNotSame($request4, $request3);
- $this->assertNotSame($request5, $request4);
-
- $this->assertEmpty($request1->getAttributes());
- $this->assertEmpty($request1->getAttribute('name'));
- $this->assertEquals(
- 'something',
- $request1->getAttribute('name', 'something'),
- 'Should return the default value'
- );
-
- $this->assertEquals('value', $request2->getAttribute('name'));
- $this->assertEquals(['name' => 'value'], $request2->getAttributes());
- $this->assertEquals(['name' => 'value', 'other' => 'otherValue'], $request3->getAttributes());
- $this->assertEquals(['name' => 'value'], $request4->getAttributes());
- }
-
- public function testNullAttribute()
- {
- $request = (new ServerRequest('GET', '/'))->withAttribute('name', null);
-
- $this->assertSame(['name' => null], $request->getAttributes());
- $this->assertNull($request->getAttribute('name', 'different-default'));
-
- $requestWithoutAttribute = $request->withoutAttribute('name');
-
- $this->assertSame([], $requestWithoutAttribute->getAttributes());
- $this->assertSame('different-default', $requestWithoutAttribute->getAttribute('name', 'different-default'));
- }
-}
diff --git a/server/vendor/guzzlehttp/psr7/tests/StreamDecoratorTraitTest.php b/server/vendor/guzzlehttp/psr7/tests/StreamDecoratorTraitTest.php
deleted file mode 100644
index 682079e..0000000
--- a/server/vendor/guzzlehttp/psr7/tests/StreamDecoratorTraitTest.php
+++ /dev/null
@@ -1,137 +0,0 @@
-<?php
-namespace GuzzleHttp\Tests\Psr7;
-
-use Psr\Http\Message\StreamInterface;
-use GuzzleHttp\Psr7;
-use GuzzleHttp\Psr7\StreamDecoratorTrait;
-
-class Str implements StreamInterface
-{
- use StreamDecoratorTrait;
-}
-
-/**
- * @covers GuzzleHttp\Psr7\StreamDecoratorTrait
- */
-class StreamDecoratorTraitTest extends \PHPUnit_Framework_TestCase
-{
- private $a;
- private $b;
- private $c;
-
- public function setUp()
- {
- $this->c = fopen('php://temp', 'r+');
- fwrite($this->c, 'foo');
- fseek($this->c, 0);
- $this->a = Psr7\stream_for($this->c);
- $this->b = new Str($this->a);
- }
-
- public function testCatchesExceptionsWhenCastingToString()
- {
- $s = $this->getMockBuilder('Psr\Http\Message\StreamInterface')
- ->setMethods(['read'])
- ->getMockForAbstractClass();
- $s->expects($this->once())
- ->method('read')
- ->will($this->throwException(new \Exception('foo')));
- $msg = '';
- set_error_handler(function ($errNo, $str) use (&$msg) { $msg = $str; });
- echo new Str($s);
- restore_error_handler();
- $this->assertContains('foo', $msg);
- }
-
- public function testToString()
- {
- $this->assertEquals('foo', (string) $this->b);
- }
-
- public function testHasSize()
- {
- $this->assertEquals(3, $this->b->getSize());
- }
-
- public function testReads()
- {
- $this->assertEquals('foo', $this->b->read(10));
- }
-
- public function testCheckMethods()
- {
- $this->assertEquals($this->a->isReadable(), $this->b->isReadable());
- $this->assertEquals($this->a->isWritable(), $this->b->isWritable());
- $this->assertEquals($this->a->isSeekable(), $this->b->isSeekable());
- }
-
- public function testSeeksAndTells()
- {
- $this->b->seek(1);
- $this->assertEquals(1, $this->a->tell());
- $this->assertEquals(1, $this->b->tell());
- $this->b->seek(0);
- $this->assertEquals(0, $this->a->tell());
- $this->assertEquals(0, $this->b->tell());
- $this->b->seek(0, SEEK_END);
- $this->assertEquals(3, $this->a->tell());
- $this->assertEquals(3, $this->b->tell());
- }
-
- public function testGetsContents()
- {
- $this->assertEquals('foo', $this->b->getContents());
- $this->assertEquals('', $this->b->getContents());
- $this->b->seek(1);
- $this->assertEquals('oo', $this->b->getContents(1));
- }
-
- public function testCloses()
- {
- $this->b->close();
- $this->assertFalse(is_resource($this->c));
- }
-
- public function testDetaches()
- {
- $this->b->detach();
- $this->assertFalse($this->b->isReadable());
- }
-
- public function testWrapsMetadata()
- {
- $this->assertSame($this->b->getMetadata(), $this->a->getMetadata());
- $this->assertSame($this->b->getMetadata('uri'), $this->a->getMetadata('uri'));
- }
-
- public function testWrapsWrites()
- {
- $this->b->seek(0, SEEK_END);
- $this->b->write('foo');
- $this->assertEquals('foofoo', (string) $this->a);
- }
-
- /**
- * @expectedException \UnexpectedValueException
- */
- public function testThrowsWithInvalidGetter()
- {
- $this->b->foo;
- }
-
- /**
- * @expectedException \BadMethodCallException
- */
- public function testThrowsWhenGetterNotImplemented()
- {
- $s = new BadStream();
- $s->stream;
- }
-}
-
-class BadStream
-{
- use StreamDecoratorTrait;
-
- public function __construct() {}
-}
diff --git a/server/vendor/guzzlehttp/psr7/tests/StreamTest.php b/server/vendor/guzzlehttp/psr7/tests/StreamTest.php
deleted file mode 100644
index 4fe92cc..0000000
--- a/server/vendor/guzzlehttp/psr7/tests/StreamTest.php
+++ /dev/null
@@ -1,161 +0,0 @@
-<?php
-namespace GuzzleHttp\Tests\Psr7;
-
-use GuzzleHttp\Psr7\NoSeekStream;
-use GuzzleHttp\Psr7\Stream;
-
-/**
- * @covers GuzzleHttp\Psr7\Stream
- */
-class StreamTest extends \PHPUnit_Framework_TestCase
-{
- /**
- * @expectedException \InvalidArgumentException
- */
- public function testConstructorThrowsExceptionOnInvalidArgument()
- {
- new Stream(true);
- }
-
- public function testConstructorInitializesProperties()
- {
- $handle = fopen('php://temp', 'r+');
- fwrite($handle, 'data');
- $stream = new Stream($handle);
- $this->assertTrue($stream->isReadable());
- $this->assertTrue($stream->isWritable());
- $this->assertTrue($stream->isSeekable());
- $this->assertEquals('php://temp', $stream->getMetadata('uri'));
- $this->assertInternalType('array', $stream->getMetadata());
- $this->assertEquals(4, $stream->getSize());
- $this->assertFalse($stream->eof());
- $stream->close();
- }
-
- public function testStreamClosesHandleOnDestruct()
- {
- $handle = fopen('php://temp', 'r');
- $stream = new Stream($handle);
- unset($stream);
- $this->assertFalse(is_resource($handle));
- }
-
- public function testConvertsToString()
- {
- $handle = fopen('php://temp', 'w+');
- fwrite($handle, 'data');
- $stream = new Stream($handle);
- $this->assertEquals('data', (string) $stream);
- $this->assertEquals('data', (string) $stream);
- $stream->close();
- }
-
- public function testGetsContents()
- {
- $handle = fopen('php://temp', 'w+');
- fwrite($handle, 'data');
- $stream = new Stream($handle);
- $this->assertEquals('', $stream->getContents());
- $stream->seek(0);
- $this->assertEquals('data', $stream->getContents());
- $this->assertEquals('', $stream->getContents());
- }
-
- public function testChecksEof()
- {
- $handle = fopen('php://temp', 'w+');
- fwrite($handle, 'data');
- $stream = new Stream($handle);
- $this->assertFalse($stream->eof());
- $stream->read(4);
- $this->assertTrue($stream->eof());
- $stream->close();
- }
-
- public function testGetSize()
- {
- $size = filesize(__FILE__);
- $handle = fopen(__FILE__, 'r');
- $stream = new Stream($handle);
- $this->assertEquals($size, $stream->getSize());
- // Load from cache
- $this->assertEquals($size, $stream->getSize());
- $stream->close();
- }
-
- public function testEnsuresSizeIsConsistent()
- {
- $h = fopen('php://temp', 'w+');
- $this->assertEquals(3, fwrite($h, 'foo'));
- $stream = new Stream($h);
- $this->assertEquals(3, $stream->getSize());
- $this->assertEquals(4, $stream->write('test'));
- $this->assertEquals(7, $stream->getSize());
- $this->assertEquals(7, $stream->getSize());
- $stream->close();
- }
-
- public function testProvidesStreamPosition()
- {
- $handle = fopen('php://temp', 'w+');
- $stream = new Stream($handle);
- $this->assertEquals(0, $stream->tell());
- $stream->write('foo');
- $this->assertEquals(3, $stream->tell());
- $stream->seek(1);
- $this->assertEquals(1, $stream->tell());
- $this->assertSame(ftell($handle), $stream->tell());
- $stream->close();
- }
-
- public function testCanDetachStream()
- {
- $r = fopen('php://temp', 'w+');
- $stream = new Stream($r);
- $stream->write('foo');
- $this->assertTrue($stream->isReadable());
- $this->assertSame($r, $stream->detach());
- $stream->detach();
-
- $this->assertFalse($stream->isReadable());
- $this->assertFalse($stream->isWritable());
- $this->assertFalse($stream->isSeekable());
-
- $throws = function (callable $fn) use ($stream) {
- try {
- $fn($stream);
- $this->fail();
- } catch (\Exception $e) {}
- };
-
- $throws(function ($stream) { $stream->read(10); });
- $throws(function ($stream) { $stream->write('bar'); });
- $throws(function ($stream) { $stream->seek(10); });
- $throws(function ($stream) { $stream->tell(); });
- $throws(function ($stream) { $stream->eof(); });
- $throws(function ($stream) { $stream->getSize(); });
- $throws(function ($stream) { $stream->getContents(); });
- $this->assertSame('', (string) $stream);
- $stream->close();
- }
-
- public function testCloseClearProperties()
- {
- $handle = fopen('php://temp', 'r+');
- $stream = new Stream($handle);
- $stream->close();
-
- $this->assertFalse($stream->isSeekable());
- $this->assertFalse($stream->isReadable());
- $this->assertFalse($stream->isWritable());
- $this->assertNull($stream->getSize());
- $this->assertEmpty($stream->getMetadata());
- }
-
- public function testDoesNotThrowInToString()
- {
- $s = \GuzzleHttp\Psr7\stream_for('foo');
- $s = new NoSeekStream($s);
- $this->assertEquals('foo', (string) $s);
- }
-}
diff --git a/server/vendor/guzzlehttp/psr7/tests/StreamWrapperTest.php b/server/vendor/guzzlehttp/psr7/tests/StreamWrapperTest.php
deleted file mode 100644
index 7183aae..0000000
--- a/server/vendor/guzzlehttp/psr7/tests/StreamWrapperTest.php
+++ /dev/null
@@ -1,102 +0,0 @@
-<?php
-namespace GuzzleHttp\Tests\Psr7;
-
-use GuzzleHttp\Psr7\StreamWrapper;
-use GuzzleHttp\Psr7;
-
-/**
- * @covers GuzzleHttp\Psr7\StreamWrapper
- */
-class StreamWrapperTest extends \PHPUnit_Framework_TestCase
-{
- public function testResource()
- {
- $stream = Psr7\stream_for('foo');
- $handle = StreamWrapper::getResource($stream);
- $this->assertSame('foo', fread($handle, 3));
- $this->assertSame(3, ftell($handle));
- $this->assertSame(3, fwrite($handle, 'bar'));
- $this->assertSame(0, fseek($handle, 0));
- $this->assertSame('foobar', fread($handle, 6));
- $this->assertSame('', fread($handle, 1));
- $this->assertTrue(feof($handle));
-
- $stBlksize = defined('PHP_WINDOWS_VERSION_BUILD') ? -1 : 0;
-
- // This fails on HHVM for some reason
- if (!defined('HHVM_VERSION')) {
- $this->assertEquals([
- 'dev' => 0,
- 'ino' => 0,
- 'mode' => 33206,
- 'nlink' => 0,
- 'uid' => 0,
- 'gid' => 0,
- 'rdev' => 0,
- 'size' => 6,
- 'atime' => 0,
- 'mtime' => 0,
- 'ctime' => 0,
- 'blksize' => $stBlksize,
- 'blocks' => $stBlksize,
- 0 => 0,
- 1 => 0,
- 2 => 33206,
- 3 => 0,
- 4 => 0,
- 5 => 0,
- 6 => 0,
- 7 => 6,
- 8 => 0,
- 9 => 0,
- 10 => 0,
- 11 => $stBlksize,
- 12 => $stBlksize,
- ], fstat($handle));
- }
-
- $this->assertTrue(fclose($handle));
- $this->assertSame('foobar', (string) $stream);
- }
-
- /**
- * @expectedException \InvalidArgumentException
- */
- public function testValidatesStream()
- {
- $stream = $this->getMockBuilder('Psr\Http\Message\StreamInterface')
- ->setMethods(['isReadable', 'isWritable'])
- ->getMockForAbstractClass();
- $stream->expects($this->once())
- ->method('isReadable')
- ->will($this->returnValue(false));
- $stream->expects($this->once())
- ->method('isWritable')
- ->will($this->returnValue(false));
- StreamWrapper::getResource($stream);
- }
-
- /**
- * @expectedException \PHPUnit_Framework_Error_Warning
- */
- public function testReturnsFalseWhenStreamDoesNotExist()
- {
- fopen('guzzle://foo', 'r');
- }
-
- public function testCanOpenReadonlyStream()
- {
- $stream = $this->getMockBuilder('Psr\Http\Message\StreamInterface')
- ->setMethods(['isReadable', 'isWritable'])
- ->getMockForAbstractClass();
- $stream->expects($this->once())
- ->method('isReadable')
- ->will($this->returnValue(false));
- $stream->expects($this->once())
- ->method('isWritable')
- ->will($this->returnValue(true));
- $r = StreamWrapper::getResource($stream);
- $this->assertInternalType('resource', $r);
- fclose($r);
- }
-}
diff --git a/server/vendor/guzzlehttp/psr7/tests/UploadedFileTest.php b/server/vendor/guzzlehttp/psr7/tests/UploadedFileTest.php
deleted file mode 100644
index 809f7ab..0000000
--- a/server/vendor/guzzlehttp/psr7/tests/UploadedFileTest.php
+++ /dev/null
@@ -1,280 +0,0 @@
-<?php
-namespace GuzzleHttp\Tests\Psr7;
-
-use ReflectionProperty;
-use GuzzleHttp\Psr7\Stream;
-use GuzzleHttp\Psr7\UploadedFile;
-
-/**
- * @covers GuzzleHttp\Psr7\UploadedFile
- */
-class UploadedFileTest extends \PHPUnit_Framework_TestCase
-{
- protected $cleanup;
-
- public function setUp()
- {
- $this->cleanup = [];
- }
-
- public function tearDown()
- {
- foreach ($this->cleanup as $file) {
- if (is_scalar($file) && file_exists($file)) {
- unlink($file);
- }
- }
- }
-
- public function invalidStreams()
- {
- return [
- 'null' => [null],
- 'true' => [true],
- 'false' => [false],
- 'int' => [1],
- 'float' => [1.1],
- 'array' => [['filename']],
- 'object' => [(object) ['filename']],
- ];
- }
-
- /**
- * @dataProvider invalidStreams
- */
- public function testRaisesExceptionOnInvalidStreamOrFile($streamOrFile)
- {
- $this->setExpectedException('InvalidArgumentException');
-
- new UploadedFile($streamOrFile, 0, UPLOAD_ERR_OK);
- }
-
- public function invalidSizes()
- {
- return [
- 'null' => [null],
- 'float' => [1.1],
- 'array' => [[1]],
- 'object' => [(object) [1]],
- ];
- }
-
- /**
- * @dataProvider invalidSizes
- */
- public function testRaisesExceptionOnInvalidSize($size)
- {
- $this->setExpectedException('InvalidArgumentException', 'size');
-
- new UploadedFile(fopen('php://temp', 'wb+'), $size, UPLOAD_ERR_OK);
- }
-
- public function invalidErrorStatuses()
- {
- return [
- 'null' => [null],
- 'true' => [true],
- 'false' => [false],
- 'float' => [1.1],
- 'string' => ['1'],
- 'array' => [[1]],
- 'object' => [(object) [1]],
- 'negative' => [-1],
- 'too-big' => [9],
- ];
- }
-
- /**
- * @dataProvider invalidErrorStatuses
- */
- public function testRaisesExceptionOnInvalidErrorStatus($status)
- {
- $this->setExpectedException('InvalidArgumentException', 'status');
-
- new UploadedFile(fopen('php://temp', 'wb+'), 0, $status);
- }
-
- public function invalidFilenamesAndMediaTypes()
- {
- return [
- 'true' => [true],
- 'false' => [false],
- 'int' => [1],
- 'float' => [1.1],
- 'array' => [['string']],
- 'object' => [(object) ['string']],
- ];
- }
-
- /**
- * @dataProvider invalidFilenamesAndMediaTypes
- */
- public function testRaisesExceptionOnInvalidClientFilename($filename)
- {
- $this->setExpectedException('InvalidArgumentException', 'filename');
-
- new UploadedFile(fopen('php://temp', 'wb+'), 0, UPLOAD_ERR_OK, $filename);
- }
-
- /**
- * @dataProvider invalidFilenamesAndMediaTypes
- */
- public function testRaisesExceptionOnInvalidClientMediaType($mediaType)
- {
- $this->setExpectedException('InvalidArgumentException', 'media type');
-
- new UploadedFile(fopen('php://temp', 'wb+'), 0, UPLOAD_ERR_OK, 'foobar.baz', $mediaType);
- }
-
- public function testGetStreamReturnsOriginalStreamObject()
- {
- $stream = new Stream(fopen('php://temp', 'r'));
- $upload = new UploadedFile($stream, 0, UPLOAD_ERR_OK);
-
- $this->assertSame($stream, $upload->getStream());
- }
-
- public function testGetStreamReturnsWrappedPhpStream()
- {
- $stream = fopen('php://temp', 'wb+');
- $upload = new UploadedFile($stream, 0, UPLOAD_ERR_OK);
- $uploadStream = $upload->getStream()->detach();
-
- $this->assertSame($stream, $uploadStream);
- }
-
- public function testGetStreamReturnsStreamForFile()
- {
- $this->cleanup[] = $stream = tempnam(sys_get_temp_dir(), 'stream_file');
- $upload = new UploadedFile($stream, 0, UPLOAD_ERR_OK);
- $uploadStream = $upload->getStream();
- $r = new ReflectionProperty($uploadStream, 'filename');
- $r->setAccessible(true);
-
- $this->assertSame($stream, $r->getValue($uploadStream));
- }
-
- public function testSuccessful()
- {
- $stream = \GuzzleHttp\Psr7\stream_for('Foo bar!');
- $upload = new UploadedFile($stream, $stream->getSize(), UPLOAD_ERR_OK, 'filename.txt', 'text/plain');
-
- $this->assertEquals($stream->getSize(), $upload->getSize());
- $this->assertEquals('filename.txt', $upload->getClientFilename());
- $this->assertEquals('text/plain', $upload->getClientMediaType());
-
- $this->cleanup[] = $to = tempnam(sys_get_temp_dir(), 'successful');
- $upload->moveTo($to);
- $this->assertFileExists($to);
- $this->assertEquals($stream->__toString(), file_get_contents($to));
- }
-
- public function invalidMovePaths()
- {
- return [
- 'null' => [null],
- 'true' => [true],
- 'false' => [false],
- 'int' => [1],
- 'float' => [1.1],
- 'empty' => [''],
- 'array' => [['filename']],
- 'object' => [(object) ['filename']],
- ];
- }
-
- /**
- * @dataProvider invalidMovePaths
- */
- public function testMoveRaisesExceptionForInvalidPath($path)
- {
- $stream = \GuzzleHttp\Psr7\stream_for('Foo bar!');
- $upload = new UploadedFile($stream, 0, UPLOAD_ERR_OK);
-
- $this->cleanup[] = $path;
-
- $this->setExpectedException('InvalidArgumentException', 'path');
- $upload->moveTo($path);
- }
-
- public function testMoveCannotBeCalledMoreThanOnce()
- {
- $stream = \GuzzleHttp\Psr7\stream_for('Foo bar!');
- $upload = new UploadedFile($stream, 0, UPLOAD_ERR_OK);
-
- $this->cleanup[] = $to = tempnam(sys_get_temp_dir(), 'diac');
- $upload->moveTo($to);
- $this->assertTrue(file_exists($to));
-
- $this->setExpectedException('RuntimeException', 'moved');
- $upload->moveTo($to);
- }
-
- public function testCannotRetrieveStreamAfterMove()
- {
- $stream = \GuzzleHttp\Psr7\stream_for('Foo bar!');
- $upload = new UploadedFile($stream, 0, UPLOAD_ERR_OK);
-
- $this->cleanup[] = $to = tempnam(sys_get_temp_dir(), 'diac');
- $upload->moveTo($to);
- $this->assertFileExists($to);
-
- $this->setExpectedException('RuntimeException', 'moved');
- $upload->getStream();
- }
-
- public function nonOkErrorStatus()
- {
- return [
- 'UPLOAD_ERR_INI_SIZE' => [ UPLOAD_ERR_INI_SIZE ],
- 'UPLOAD_ERR_FORM_SIZE' => [ UPLOAD_ERR_FORM_SIZE ],
- 'UPLOAD_ERR_PARTIAL' => [ UPLOAD_ERR_PARTIAL ],
- 'UPLOAD_ERR_NO_FILE' => [ UPLOAD_ERR_NO_FILE ],
- 'UPLOAD_ERR_NO_TMP_DIR' => [ UPLOAD_ERR_NO_TMP_DIR ],
- 'UPLOAD_ERR_CANT_WRITE' => [ UPLOAD_ERR_CANT_WRITE ],
- 'UPLOAD_ERR_EXTENSION' => [ UPLOAD_ERR_EXTENSION ],
- ];
- }
-
- /**
- * @dataProvider nonOkErrorStatus
- */
- public function testConstructorDoesNotRaiseExceptionForInvalidStreamWhenErrorStatusPresent($status)
- {
- $uploadedFile = new UploadedFile('not ok', 0, $status);
- $this->assertSame($status, $uploadedFile->getError());
- }
-
- /**
- * @dataProvider nonOkErrorStatus
- */
- public function testMoveToRaisesExceptionWhenErrorStatusPresent($status)
- {
- $uploadedFile = new UploadedFile('not ok', 0, $status);
- $this->setExpectedException('RuntimeException', 'upload error');
- $uploadedFile->moveTo(__DIR__ . '/' . uniqid());
- }
-
- /**
- * @dataProvider nonOkErrorStatus
- */
- public function testGetStreamRaisesExceptionWhenErrorStatusPresent($status)
- {
- $uploadedFile = new UploadedFile('not ok', 0, $status);
- $this->setExpectedException('RuntimeException', 'upload error');
- $stream = $uploadedFile->getStream();
- }
-
- public function testMoveToCreatesStreamIfOnlyAFilenameWasProvided()
- {
- $this->cleanup[] = $from = tempnam(sys_get_temp_dir(), 'copy_from');
- $this->cleanup[] = $to = tempnam(sys_get_temp_dir(), 'copy_to');
-
- copy(__FILE__, $from);
-
- $uploadedFile = new UploadedFile($from, 100, UPLOAD_ERR_OK, basename($from), 'text/plain');
- $uploadedFile->moveTo($to);
-
- $this->assertFileEquals(__FILE__, $to);
- }
-}
diff --git a/server/vendor/guzzlehttp/psr7/tests/UriTest.php b/server/vendor/guzzlehttp/psr7/tests/UriTest.php
deleted file mode 100644
index a29d9cc..0000000
--- a/server/vendor/guzzlehttp/psr7/tests/UriTest.php
+++ /dev/null
@@ -1,573 +0,0 @@
-<?php
-namespace GuzzleHttp\Tests\Psr7;
-
-use GuzzleHttp\Psr7\Uri;
-
-/**
- * @covers GuzzleHttp\Psr7\Uri
- */
-class UriTest extends \PHPUnit_Framework_TestCase
-{
- const RFC3986_BASE = 'http://a/b/c/d;p?q';
-
- public function testParsesProvidedUri()
- {
- $uri = new Uri('https://user:pass@example.com:8080/path/123?q=abc#test');
-
- $this->assertSame('https', $uri->getScheme());
- $this->assertSame('user:pass@example.com:8080', $uri->getAuthority());
- $this->assertSame('user:pass', $uri->getUserInfo());
- $this->assertSame('example.com', $uri->getHost());
- $this->assertSame(8080, $uri->getPort());
- $this->assertSame('/path/123', $uri->getPath());
- $this->assertSame('q=abc', $uri->getQuery());
- $this->assertSame('test', $uri->getFragment());
- $this->assertSame('https://user:pass@example.com:8080/path/123?q=abc#test', (string) $uri);
- }
-
- public function testCanTransformAndRetrievePartsIndividually()
- {
- $uri = (new Uri())
- ->withScheme('https')
- ->withUserInfo('user', 'pass')
- ->withHost('example.com')
- ->withPort(8080)
- ->withPath('/path/123')
- ->withQuery('q=abc')
- ->withFragment('test');
-
- $this->assertSame('https', $uri->getScheme());
- $this->assertSame('user:pass@example.com:8080', $uri->getAuthority());
- $this->assertSame('user:pass', $uri->getUserInfo());
- $this->assertSame('example.com', $uri->getHost());
- $this->assertSame(8080, $uri->getPort());
- $this->assertSame('/path/123', $uri->getPath());
- $this->assertSame('q=abc', $uri->getQuery());
- $this->assertSame('test', $uri->getFragment());
- $this->assertSame('https://user:pass@example.com:8080/path/123?q=abc#test', (string) $uri);
- }
-
- /**
- * @dataProvider getValidUris
- */
- public function testValidUrisStayValid($input)
- {
- $uri = new Uri($input);
-
- $this->assertSame($input, (string) $uri);
- }
-
- /**
- * @dataProvider getValidUris
- */
- public function testFromParts($input)
- {
- $uri = Uri::fromParts(parse_url($input));
-
- $this->assertSame($input, (string) $uri);
- }
-
- public function getValidUris()
- {
- return [
- ['urn:path-rootless'],
- ['urn:path:with:colon'],
- ['urn:/path-absolute'],
- ['urn:/'],
- // only scheme with empty path
- ['urn:'],
- // only path
- ['/'],
- ['relative/'],
- ['0'],
- // same document reference
- [''],
- // network path without scheme
- ['//example.org'],
- ['//example.org/'],
- ['//example.org?q#h'],
- // only query
- ['?q'],
- ['?q=abc&foo=bar'],
- // only fragment
- ['#fragment'],
- // dot segments are not removed automatically
- ['./foo/../bar'],
- ];
- }
-
- /**
- * @expectedException \InvalidArgumentException
- * @expectedExceptionMessage Unable to parse URI
- * @dataProvider getInvalidUris
- */
- public function testInvalidUrisThrowException($invalidUri)
- {
- new Uri($invalidUri);
- }
-
- public function getInvalidUris()
- {
- return [
- // parse_url() requires the host component which makes sense for http(s)
- // but not when the scheme is not known or different. So '//' or '///' is
- // currently invalid as well but should not according to RFC 3986.
- ['http://'],
- ['urn://host:with:colon'], // host cannot contain ":"
- ];
- }
-
- /**
- * @expectedException \InvalidArgumentException
- * @expectedExceptionMessage Invalid port: 100000. Must be between 1 and 65535
- */
- public function testPortMustBeValid()
- {
- (new Uri())->withPort(100000);
- }
-
- /**
- * @expectedException \InvalidArgumentException
- * @expectedExceptionMessage Invalid port: 0. Must be between 1 and 65535
- */
- public function testWithPortCannotBeZero()
- {
- (new Uri())->withPort(0);
- }
-
- /**
- * @expectedException \InvalidArgumentException
- * @expectedExceptionMessage Unable to parse URI
- */
- public function testParseUriPortCannotBeZero()
- {
- new Uri('//example.com:0');
- }
-
- /**
- * @expectedException \InvalidArgumentException
- */
- public function testSchemeMustHaveCorrectType()
- {
- (new Uri())->withScheme([]);
- }
-
- /**
- * @expectedException \InvalidArgumentException
- */
- public function testHostMustHaveCorrectType()
- {
- (new Uri())->withHost([]);
- }
-
- /**
- * @expectedException \InvalidArgumentException
- */
- public function testPathMustHaveCorrectType()
- {
- (new Uri())->withPath([]);
- }
-
- /**
- * @expectedException \InvalidArgumentException
- */
- public function testQueryMustHaveCorrectType()
- {
- (new Uri())->withQuery([]);
- }
-
- /**
- * @expectedException \InvalidArgumentException
- */
- public function testFragmentMustHaveCorrectType()
- {
- (new Uri())->withFragment([]);
- }
-
- public function testCanParseFalseyUriParts()
- {
- $uri = new Uri('0://0:0@0/0?0#0');
-
- $this->assertSame('0', $uri->getScheme());
- $this->assertSame('0:0@0', $uri->getAuthority());
- $this->assertSame('0:0', $uri->getUserInfo());
- $this->assertSame('0', $uri->getHost());
- $this->assertSame('/0', $uri->getPath());
- $this->assertSame('0', $uri->getQuery());
- $this->assertSame('0', $uri->getFragment());
- $this->assertSame('0://0:0@0/0?0#0', (string) $uri);
- }
-
- public function testCanConstructFalseyUriParts()
- {
- $uri = (new Uri())
- ->withScheme('0')
- ->withUserInfo('0', '0')
- ->withHost('0')
- ->withPath('/0')
- ->withQuery('0')
- ->withFragment('0');
-
- $this->assertSame('0', $uri->getScheme());
- $this->assertSame('0:0@0', $uri->getAuthority());
- $this->assertSame('0:0', $uri->getUserInfo());
- $this->assertSame('0', $uri->getHost());
- $this->assertSame('/0', $uri->getPath());
- $this->assertSame('0', $uri->getQuery());
- $this->assertSame('0', $uri->getFragment());
- $this->assertSame('0://0:0@0/0?0#0', (string) $uri);
- }
-
- /**
- * @dataProvider getResolveTestCases
- */
- public function testResolvesUris($base, $rel, $expected)
- {
- $uri = new Uri($base);
- $actual = Uri::resolve($uri, $rel);
- $this->assertSame($expected, (string) $actual);
- }
-
- public function getResolveTestCases()
- {
- return [
- [self::RFC3986_BASE, 'g:h', 'g:h'],
- [self::RFC3986_BASE, 'g', 'http://a/b/c/g'],
- [self::RFC3986_BASE, './g', 'http://a/b/c/g'],
- [self::RFC3986_BASE, 'g/', 'http://a/b/c/g/'],
- [self::RFC3986_BASE, '/g', 'http://a/g'],
- [self::RFC3986_BASE, '//g', 'http://g'],
- [self::RFC3986_BASE, '?y', 'http://a/b/c/d;p?y'],
- [self::RFC3986_BASE, 'g?y', 'http://a/b/c/g?y'],
- [self::RFC3986_BASE, '#s', 'http://a/b/c/d;p?q#s'],
- [self::RFC3986_BASE, 'g#s', 'http://a/b/c/g#s'],
- [self::RFC3986_BASE, 'g?y#s', 'http://a/b/c/g?y#s'],
- [self::RFC3986_BASE, ';x', 'http://a/b/c/;x'],
- [self::RFC3986_BASE, 'g;x', 'http://a/b/c/g;x'],
- [self::RFC3986_BASE, 'g;x?y#s', 'http://a/b/c/g;x?y#s'],
- [self::RFC3986_BASE, '', self::RFC3986_BASE],
- [self::RFC3986_BASE, '.', 'http://a/b/c/'],
- [self::RFC3986_BASE, './', 'http://a/b/c/'],
- [self::RFC3986_BASE, '..', 'http://a/b/'],
- [self::RFC3986_BASE, '../', 'http://a/b/'],
- [self::RFC3986_BASE, '../g', 'http://a/b/g'],
- [self::RFC3986_BASE, '../..', 'http://a/'],
- [self::RFC3986_BASE, '../../', 'http://a/'],
- [self::RFC3986_BASE, '../../g', 'http://a/g'],
- [self::RFC3986_BASE, '../../../g', 'http://a/g'],
- [self::RFC3986_BASE, '../../../../g', 'http://a/g'],
- [self::RFC3986_BASE, '/./g', 'http://a/g'],
- [self::RFC3986_BASE, '/../g', 'http://a/g'],
- [self::RFC3986_BASE, 'g.', 'http://a/b/c/g.'],
- [self::RFC3986_BASE, '.g', 'http://a/b/c/.g'],
- [self::RFC3986_BASE, 'g..', 'http://a/b/c/g..'],
- [self::RFC3986_BASE, '..g', 'http://a/b/c/..g'],
- [self::RFC3986_BASE, './../g', 'http://a/b/g'],
- [self::RFC3986_BASE, 'foo////g', 'http://a/b/c/foo////g'],
- [self::RFC3986_BASE, './g/.', 'http://a/b/c/g/'],
- [self::RFC3986_BASE, 'g/./h', 'http://a/b/c/g/h'],
- [self::RFC3986_BASE, 'g/../h', 'http://a/b/c/h'],
- [self::RFC3986_BASE, 'g;x=1/./y', 'http://a/b/c/g;x=1/y'],
- [self::RFC3986_BASE, 'g;x=1/../y', 'http://a/b/c/y'],
- // dot-segments in the query or fragment
- [self::RFC3986_BASE, 'g?y/./x', 'http://a/b/c/g?y/./x'],
- [self::RFC3986_BASE, 'g?y/../x', 'http://a/b/c/g?y/../x'],
- [self::RFC3986_BASE, 'g#s/./x', 'http://a/b/c/g#s/./x'],
- [self::RFC3986_BASE, 'g#s/../x', 'http://a/b/c/g#s/../x'],
- [self::RFC3986_BASE, 'g#s/../x', 'http://a/b/c/g#s/../x'],
- [self::RFC3986_BASE, '?y#s', 'http://a/b/c/d;p?y#s'],
- ['http://a/b/c/d;p?q#s', '?y', 'http://a/b/c/d;p?y'],
- ['http://u@a/b/c/d;p?q', '.', 'http://u@a/b/c/'],
- ['http://u:p@a/b/c/d;p?q', '.', 'http://u:p@a/b/c/'],
- ['http://a/b/c/d/', 'e', 'http://a/b/c/d/e'],
- ['urn:no-slash', 'e', 'urn:e'],
- // falsey relative parts
- [self::RFC3986_BASE, '//0', 'http://0'],
- [self::RFC3986_BASE, '0', 'http://a/b/c/0'],
- [self::RFC3986_BASE, '?0', 'http://a/b/c/d;p?0'],
- [self::RFC3986_BASE, '#0', 'http://a/b/c/d;p?q#0'],
- ];
- }
-
- public function testAddAndRemoveQueryValues()
- {
- $uri = new Uri();
- $uri = Uri::withQueryValue($uri, 'a', 'b');
- $uri = Uri::withQueryValue($uri, 'c', 'd');
- $uri = Uri::withQueryValue($uri, 'e', null);
- $this->assertSame('a=b&c=d&e', $uri->getQuery());
-
- $uri = Uri::withoutQueryValue($uri, 'c');
- $this->assertSame('a=b&e', $uri->getQuery());
- $uri = Uri::withoutQueryValue($uri, 'e');
- $this->assertSame('a=b', $uri->getQuery());
- $uri = Uri::withoutQueryValue($uri, 'a');
- $this->assertSame('', $uri->getQuery());
- }
-
- public function testWithQueryValueReplacesSameKeys()
- {
- $uri = new Uri();
- $uri = Uri::withQueryValue($uri, 'a', 'b');
- $uri = Uri::withQueryValue($uri, 'c', 'd');
- $uri = Uri::withQueryValue($uri, 'a', 'e');
- $this->assertSame('c=d&a=e', $uri->getQuery());
- }
-
- public function testWithoutQueryValueRemovesAllSameKeys()
- {
- $uri = (new Uri())->withQuery('a=b&c=d&a=e');
- $uri = Uri::withoutQueryValue($uri, 'a');
- $this->assertSame('c=d', $uri->getQuery());
- }
-
- public function testRemoveNonExistingQueryValue()
- {
- $uri = new Uri();
- $uri = Uri::withQueryValue($uri, 'a', 'b');
- $uri = Uri::withoutQueryValue($uri, 'c');
- $this->assertSame('a=b', $uri->getQuery());
- }
-
- public function testWithQueryValueHandlesEncoding()
- {
- $uri = new Uri();
- $uri = Uri::withQueryValue($uri, 'E=mc^2', 'ein&stein');
- $this->assertSame('E%3Dmc%5E2=ein%26stein', $uri->getQuery(), 'Decoded key/value get encoded');
-
- $uri = new Uri();
- $uri = Uri::withQueryValue($uri, 'E%3Dmc%5e2', 'ein%26stein');
- $this->assertSame('E%3Dmc%5e2=ein%26stein', $uri->getQuery(), 'Encoded key/value do not get double-encoded');
- }
-
- public function testWithoutQueryValueHandlesEncoding()
- {
- // It also tests that the case of the percent-encoding does not matter,
- // i.e. both lowercase "%3d" and uppercase "%5E" can be removed.
- $uri = (new Uri())->withQuery('E%3dmc%5E2=einstein&foo=bar');
- $uri = Uri::withoutQueryValue($uri, 'E=mc^2');
- $this->assertSame('foo=bar', $uri->getQuery(), 'Handles key in decoded form');
-
- $uri = (new Uri())->withQuery('E%3dmc%5E2=einstein&foo=bar');
- $uri = Uri::withoutQueryValue($uri, 'E%3Dmc%5e2');
- $this->assertSame('foo=bar', $uri->getQuery(), 'Handles key in encoded form');
- }
-
- public function testSchemeIsNormalizedToLowercase()
- {
- $uri = new Uri('HTTP://example.com');
-
- $this->assertSame('http', $uri->getScheme());
- $this->assertSame('http://example.com', (string) $uri);
-
- $uri = (new Uri('//example.com'))->withScheme('HTTP');
-
- $this->assertSame('http', $uri->getScheme());
- $this->assertSame('http://example.com', (string) $uri);
- }
-
- public function testHostIsNormalizedToLowercase()
- {
- $uri = new Uri('//eXaMpLe.CoM');
-
- $this->assertSame('example.com', $uri->getHost());
- $this->assertSame('//example.com', (string) $uri);
-
- $uri = (new Uri())->withHost('eXaMpLe.CoM');
-
- $this->assertSame('example.com', $uri->getHost());
- $this->assertSame('//example.com', (string) $uri);
- }
-
- public function testPortIsNullIfStandardPortForScheme()
- {
- // HTTPS standard port
- $uri = new Uri('https://example.com:443');
- $this->assertNull($uri->getPort());
- $this->assertSame('example.com', $uri->getAuthority());
-
- $uri = (new Uri('https://example.com'))->withPort(443);
- $this->assertNull($uri->getPort());
- $this->assertSame('example.com', $uri->getAuthority());
-
- // HTTP standard port
- $uri = new Uri('http://example.com:80');
- $this->assertNull($uri->getPort());
- $this->assertSame('example.com', $uri->getAuthority());
-
- $uri = (new Uri('http://example.com'))->withPort(80);
- $this->assertNull($uri->getPort());
- $this->assertSame('example.com', $uri->getAuthority());
- }
-
- public function testPortIsReturnedIfSchemeUnknown()
- {
- $uri = (new Uri('//example.com'))->withPort(80);
-
- $this->assertSame(80, $uri->getPort());
- $this->assertSame('example.com:80', $uri->getAuthority());
- }
-
- public function testStandardPortIsNullIfSchemeChanges()
- {
- $uri = new Uri('http://example.com:443');
- $this->assertSame('http', $uri->getScheme());
- $this->assertSame(443, $uri->getPort());
-
- $uri = $uri->withScheme('https');
- $this->assertNull($uri->getPort());
- }
-
- public function testPortPassedAsStringIsCastedToInt()
- {
- $uri = (new Uri('//example.com'))->withPort('8080');
-
- $this->assertSame(8080, $uri->getPort(), 'Port is returned as integer');
- $this->assertSame('example.com:8080', $uri->getAuthority());
- }
-
- public function testPortCanBeRemoved()
- {
- $uri = (new Uri('http://example.com:8080'))->withPort(null);
-
- $this->assertNull($uri->getPort());
- $this->assertSame('http://example.com', (string) $uri);
- }
-
- public function testAuthorityWithUserInfoButWithoutHost()
- {
- $uri = (new Uri())->withUserInfo('user', 'pass');
-
- $this->assertSame('user:pass', $uri->getUserInfo());
- $this->assertSame('', $uri->getAuthority());
- }
-
- public function uriComponentsEncodingProvider()
- {
- $unreserved = 'a-zA-Z0-9.-_~!$&\'()*+,;=:@';
-
- return [
- // Percent encode spaces
- ['/pa th?q=va lue#frag ment', '/pa%20th', 'q=va%20lue', 'frag%20ment', '/pa%20th?q=va%20lue#frag%20ment'],
- // Percent encode multibyte
- ['/€?€#€', '/%E2%82%AC', '%E2%82%AC', '%E2%82%AC', '/%E2%82%AC?%E2%82%AC#%E2%82%AC'],
- // Don't encode something that's already encoded
- ['/pa%20th?q=va%20lue#frag%20ment', '/pa%20th', 'q=va%20lue', 'frag%20ment', '/pa%20th?q=va%20lue#frag%20ment'],
- // Percent encode invalid percent encodings
- ['/pa%2-th?q=va%2-lue#frag%2-ment', '/pa%252-th', 'q=va%252-lue', 'frag%252-ment', '/pa%252-th?q=va%252-lue#frag%252-ment'],
- // Don't encode path segments
- ['/pa/th//two?q=va/lue#frag/ment', '/pa/th//two', 'q=va/lue', 'frag/ment', '/pa/th//two?q=va/lue#frag/ment'],
- // Don't encode unreserved chars or sub-delimiters
- ["/$unreserved?$unreserved#$unreserved", "/$unreserved", $unreserved, $unreserved, "/$unreserved?$unreserved#$unreserved"],
- // Encoded unreserved chars are not decoded
- ['/p%61th?q=v%61lue#fr%61gment', '/p%61th', 'q=v%61lue', 'fr%61gment', '/p%61th?q=v%61lue#fr%61gment'],
- ];
- }
-
- /**
- * @dataProvider uriComponentsEncodingProvider
- */
- public function testUriComponentsGetEncodedProperly($input, $path, $query, $fragment, $output)
- {
- $uri = new Uri($input);
- $this->assertSame($path, $uri->getPath());
- $this->assertSame($query, $uri->getQuery());
- $this->assertSame($fragment, $uri->getFragment());
- $this->assertSame($output, (string) $uri);
- }
-
- public function testWithPathEncodesProperly()
- {
- $uri = (new Uri())->withPath('/baz?#€/b%61r');
- // Query and fragment delimiters and multibyte chars are encoded.
- $this->assertSame('/baz%3F%23%E2%82%AC/b%61r', $uri->getPath());
- $this->assertSame('/baz%3F%23%E2%82%AC/b%61r', (string) $uri);
- }
-
- public function testWithQueryEncodesProperly()
- {
- $uri = (new Uri())->withQuery('?=#&€=/&b%61r');
- // A query starting with a "?" is valid and must not be magically removed. Otherwise it would be impossible to
- // construct such an URI. Also the "?" and "/" does not need to be encoded in the query.
- $this->assertSame('?=%23&%E2%82%AC=/&b%61r', $uri->getQuery());
- $this->assertSame('??=%23&%E2%82%AC=/&b%61r', (string) $uri);
- }
-
- public function testWithFragmentEncodesProperly()
- {
- $uri = (new Uri())->withFragment('#€?/b%61r');
- // A fragment starting with a "#" is valid and must not be magically removed. Otherwise it would be impossible to
- // construct such an URI. Also the "?" and "/" does not need to be encoded in the fragment.
- $this->assertSame('%23%E2%82%AC?/b%61r', $uri->getFragment());
- $this->assertSame('#%23%E2%82%AC?/b%61r', (string) $uri);
- }
-
- public function testAllowsForRelativeUri()
- {
- $uri = (new Uri)->withPath('foo');
- $this->assertSame('foo', $uri->getPath());
- $this->assertSame('foo', (string) $uri);
- }
-
- public function testAddsSlashForRelativeUriStringWithHost()
- {
- // If the path is rootless and an authority is present, the path MUST
- // be prefixed by "/".
- $uri = (new Uri)->withPath('foo')->withHost('example.com');
- $this->assertSame('foo', $uri->getPath());
- // concatenating a relative path with a host doesn't work: "//example.comfoo" would be wrong
- $this->assertSame('//example.com/foo', (string) $uri);
- }
-
- public function testRemoveExtraSlashesWihoutHost()
- {
- // If the path is starting with more than one "/" and no authority is
- // present, the starting slashes MUST be reduced to one.
- $uri = (new Uri)->withPath('//foo');
- $this->assertSame('//foo', $uri->getPath());
- // URI "//foo" would be interpreted as network reference and thus change the original path to the host
- $this->assertSame('/foo', (string) $uri);
- }
-
- public function testDefaultReturnValuesOfGetters()
- {
- $uri = new Uri();
-
- $this->assertSame('', $uri->getScheme());
- $this->assertSame('', $uri->getAuthority());
- $this->assertSame('', $uri->getUserInfo());
- $this->assertSame('', $uri->getHost());
- $this->assertNull($uri->getPort());
- $this->assertSame('', $uri->getPath());
- $this->assertSame('', $uri->getQuery());
- $this->assertSame('', $uri->getFragment());
- }
-
- public function testImmutability()
- {
- $uri = new Uri();
-
- $this->assertNotSame($uri, $uri->withScheme('https'));
- $this->assertNotSame($uri, $uri->withUserInfo('user', 'pass'));
- $this->assertNotSame($uri, $uri->withHost('example.com'));
- $this->assertNotSame($uri, $uri->withPort(8080));
- $this->assertNotSame($uri, $uri->withPath('/path/123'));
- $this->assertNotSame($uri, $uri->withQuery('q=abc'));
- $this->assertNotSame($uri, $uri->withFragment('test'));
- }
-
- public function testExtendingClassesInstantiates()
- {
- // The non-standard port triggers a cascade of private methods which
- // should not use late static binding to access private static members.
- // If they do, this will fatal.
- $this->assertInstanceOf(
- '\GuzzleHttp\Tests\Psr7\ExtendingClassTest',
- new ExtendingClassTest('http://h:9/')
- );
- }
-}
-
-class ExtendingClassTest extends \GuzzleHttp\Psr7\Uri
-{
-}
diff --git a/server/vendor/guzzlehttp/psr7/tests/bootstrap.php b/server/vendor/guzzlehttp/psr7/tests/bootstrap.php
deleted file mode 100644
index 8601dd3..0000000
--- a/server/vendor/guzzlehttp/psr7/tests/bootstrap.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-namespace GuzzleHttp\Tests\Psr7;
-
-require __DIR__ . '/../vendor/autoload.php';
-
-class HasToString
-{
- public function __toString() {
- return 'foo';
- }
-}
diff --git a/server/vendor/nikic/fast-route/.gitignore b/server/vendor/nikic/fast-route/.gitignore
new file mode 100644
index 0000000..e378a07
--- /dev/null
+++ b/server/vendor/nikic/fast-route/.gitignore
@@ -0,0 +1,5 @@
+/vendor/
+.idea/
+
+# ignore lock file since we have no extra dependencies
+composer.lock
diff --git a/server/vendor/nikic/fast-route/README.md b/server/vendor/nikic/fast-route/README.md
index f812a2a..91bd466 100644
--- a/server/vendor/nikic/fast-route/README.md
+++ b/server/vendor/nikic/fast-route/README.md
@@ -122,6 +122,46 @@ The `$handler` parameter does not necessarily have to be a callback, it could al
class name or any other kind of data you wish to associate with the route. FastRoute only tells you
which handler corresponds to your URI, how you interpret it is up to you.
+#### Shorcut methods for common request methods
+
+For the `GET`, `POST`, `PUT`, `PATCH`, `DELETE` and `HEAD` request methods shortcut methods are available. For example:
+
+```php
+$r->get('/get-route', 'get_handler');
+$r->post('/post-route', 'post_handler');
+```
+
+Is equivalent to:
+
+```php
+$r->addRoute('GET', '/get-route', 'get_handler');
+$r->addRoute('POST', '/post-route', 'post_handler');
+```
+
+#### Route Groups
+
+Additionally, you can specify routes inside of a group. All routes defined inside a group will have a common prefix.
+
+For example, defining your routes as:
+
+```php
+$r->addGroup('/admin', function (RouteCollector $r) {
+ $r->addRoute('GET', '/do-something', 'handler');
+ $r->addRoute('GET', '/do-another-thing', 'handler');
+ $r->addRoute('GET', '/do-something-else', 'handler');
+});
+```
+
+Will have the same result as:
+
+ ```php
+$r->addRoute('GET', '/admin/do-something', 'handler');
+$r->addRoute('GET', '/admin/do-another-thing', 'handler');
+$r->addRoute('GET', '/admin/do-something-else', 'handler');
+ ```
+
+Nested groups are also supported, in which case the prefixes of all the nested groups are combined.
+
### Caching
The reason `simpleDispatcher` accepts a callback for defining the routes is to allow seamless
diff --git a/server/vendor/nikic/fast-route/src/RouteCollector.php b/server/vendor/nikic/fast-route/src/RouteCollector.php
index 4386bbf..7d7667b 100644
--- a/server/vendor/nikic/fast-route/src/RouteCollector.php
+++ b/server/vendor/nikic/fast-route/src/RouteCollector.php
@@ -3,8 +3,9 @@
namespace FastRoute;
class RouteCollector {
- private $routeParser;
- private $dataGenerator;
+ protected $routeParser;
+ protected $dataGenerator;
+ protected $currentGroupPrefix;
/**
* Constructs a route collector.
@@ -15,6 +16,7 @@ class RouteCollector {
public function __construct(RouteParser $routeParser, DataGenerator $dataGenerator) {
$this->routeParser = $routeParser;
$this->dataGenerator = $dataGenerator;
+ $this->currentGroupPrefix = '';
}
/**
@@ -27,6 +29,7 @@ class RouteCollector {
* @param mixed $handler
*/
public function addRoute($httpMethod, $route, $handler) {
+ $route = $this->currentGroupPrefix . $route;
$routeDatas = $this->routeParser->parse($route);
foreach ((array) $httpMethod as $method) {
foreach ($routeDatas as $routeData) {
@@ -36,6 +39,93 @@ class RouteCollector {
}
/**
+ * Create a route group with a common prefix.
+ *
+ * All routes created in the passed callback will have the given group prefix prepended.
+ *
+ * @param string $prefix
+ * @param callable $callback
+ */
+ public function addGroup($prefix, callable $callback) {
+ $previousGroupPrefix = $this->currentGroupPrefix;
+ $this->currentGroupPrefix = $previousGroupPrefix . $prefix;
+ $callback($this);
+ $this->currentGroupPrefix = $previousGroupPrefix;
+ }
+
+ /**
+ * Adds a GET route to the collection
+ *
+ * This is simply an alias of $this->addRoute('GET', $route, $handler)
+ *
+ * @param string $route
+ * @param mixed $handler
+ */
+ public function get($route, $handler) {
+ $this->addRoute('GET', $route, $handler);
+ }
+
+ /**
+ * Adds a POST route to the collection
+ *
+ * This is simply an alias of $this->addRoute('POST', $route, $handler)
+ *
+ * @param string $route
+ * @param mixed $handler
+ */
+ public function post($route, $handler) {
+ $this->addRoute('POST', $route, $handler);
+ }
+
+ /**
+ * Adds a PUT route to the collection
+ *
+ * This is simply an alias of $this->addRoute('PUT', $route, $handler)
+ *
+ * @param string $route
+ * @param mixed $handler
+ */
+ public function put($route, $handler) {
+ $this->addRoute('PUT', $route, $handler);
+ }
+
+ /**
+ * Adds a DELETE route to the collection
+ *
+ * This is simply an alias of $this->addRoute('DELETE', $route, $handler)
+ *
+ * @param string $route
+ * @param mixed $handler
+ */
+ public function delete($route, $handler) {
+ $this->addRoute('DELETE', $route, $handler);
+ }
+
+ /**
+ * Adds a PATCH route to the collection
+ *
+ * This is simply an alias of $this->addRoute('PATCH', $route, $handler)
+ *
+ * @param string $route
+ * @param mixed $handler
+ */
+ public function patch($route, $handler) {
+ $this->addRoute('PATCH', $route, $handler);
+ }
+
+ /**
+ * Adds a HEAD route to the collection
+ *
+ * This is simply an alias of $this->addRoute('HEAD', $route, $handler)
+ *
+ * @param string $route
+ * @param mixed $handler
+ */
+ public function head($route, $handler) {
+ $this->addRoute('HEAD', $route, $handler);
+ }
+
+ /**
* Returns the collected route data, as provided by the data generator.
*
* @return array
diff --git a/server/vendor/nikic/fast-route/src/functions.php b/server/vendor/nikic/fast-route/src/functions.php
index 3af6779..46bc805 100644
--- a/server/vendor/nikic/fast-route/src/functions.php
+++ b/server/vendor/nikic/fast-route/src/functions.php
@@ -60,10 +60,12 @@ if (!function_exists('FastRoute\simpleDispatcher')) {
/** @var RouteCollector $routeCollector */
$dispatchData = $routeCollector->getData();
- file_put_contents(
- $options['cacheFile'],
- '<?php return ' . var_export($dispatchData, true) . ';'
- );
+ if (!$options['cacheDisabled']) {
+ file_put_contents(
+ $options['cacheFile'],
+ '<?php return ' . var_export($dispatchData, true) . ';'
+ );
+ }
return new $options['dispatcher']($dispatchData);
}
diff --git a/server/vendor/nikic/fast-route/test/RouteCollectorTest.php b/server/vendor/nikic/fast-route/test/RouteCollectorTest.php
new file mode 100644
index 0000000..11bcf1c
--- /dev/null
+++ b/server/vendor/nikic/fast-route/test/RouteCollectorTest.php
@@ -0,0 +1,97 @@
+<?php
+
+namespace FastRoute;
+
+class RouteCollectorTest extends \PHPUnit_Framework_TestCase {
+ public function testShortcuts() {
+ $r = new DummyRouteCollector();
+
+ $r->delete('/delete', 'delete');
+ $r->get('/get', 'get');
+ $r->head('/head', 'head');
+ $r->patch('/patch', 'patch');
+ $r->post('/post', 'post');
+ $r->put('/put', 'put');
+
+ $expected = [
+ ['DELETE', '/delete', 'delete'],
+ ['GET', '/get', 'get'],
+ ['HEAD', '/head', 'head'],
+ ['PATCH', '/patch', 'patch'],
+ ['POST', '/post', 'post'],
+ ['PUT', '/put', 'put'],
+ ];
+
+ $this->assertSame($expected, $r->routes);
+ }
+
+ public function testGroups() {
+ $r = new DummyRouteCollector();
+
+ $r->delete('/delete', 'delete');
+ $r->get('/get', 'get');
+ $r->head('/head', 'head');
+ $r->patch('/patch', 'patch');
+ $r->post('/post', 'post');
+ $r->put('/put', 'put');
+
+ $r->addGroup('/group-one', function (DummyRouteCollector $r) {
+ $r->delete('/delete', 'delete');
+ $r->get('/get', 'get');
+ $r->head('/head', 'head');
+ $r->patch('/patch', 'patch');
+ $r->post('/post', 'post');
+ $r->put('/put', 'put');
+
+ $r->addGroup('/group-two', function (DummyRouteCollector $r) {
+ $r->delete('/delete', 'delete');
+ $r->get('/get', 'get');
+ $r->head('/head', 'head');
+ $r->patch('/patch', 'patch');
+ $r->post('/post', 'post');
+ $r->put('/put', 'put');
+ });
+ });
+
+ $r->addGroup('/admin', function (DummyRouteCollector $r) {
+ $r->get('-some-info', 'admin-some-info');
+ });
+ $r->addGroup('/admin-', function (DummyRouteCollector $r) {
+ $r->get('more-info', 'admin-more-info');
+ });
+
+ $expected = [
+ ['DELETE', '/delete', 'delete'],
+ ['GET', '/get', 'get'],
+ ['HEAD', '/head', 'head'],
+ ['PATCH', '/patch', 'patch'],
+ ['POST', '/post', 'post'],
+ ['PUT', '/put', 'put'],
+ ['DELETE', '/group-one/delete', 'delete'],
+ ['GET', '/group-one/get', 'get'],
+ ['HEAD', '/group-one/head', 'head'],
+ ['PATCH', '/group-one/patch', 'patch'],
+ ['POST', '/group-one/post', 'post'],
+ ['PUT', '/group-one/put', 'put'],
+ ['DELETE', '/group-one/group-two/delete', 'delete'],
+ ['GET', '/group-one/group-two/get', 'get'],
+ ['HEAD', '/group-one/group-two/head', 'head'],
+ ['PATCH', '/group-one/group-two/patch', 'patch'],
+ ['POST', '/group-one/group-two/post', 'post'],
+ ['PUT', '/group-one/group-two/put', 'put'],
+ ['GET', '/admin-some-info', 'admin-some-info'],
+ ['GET', '/admin-more-info', 'admin-more-info'],
+ ];
+
+ $this->assertSame($expected, $r->routes);
+ }
+}
+
+class DummyRouteCollector extends RouteCollector {
+ public $routes = [];
+ public function __construct() {}
+ public function addRoute($method, $route, $handler) {
+ $route = $this->currentGroupPrefix . $route;
+ $this->routes[] = [$method, $route, $handler];
+ }
+} \ No newline at end of file
diff --git a/server/vendor/psr/container/.gitignore b/server/vendor/psr/container/.gitignore
new file mode 100644
index 0000000..b2395aa
--- /dev/null
+++ b/server/vendor/psr/container/.gitignore
@@ -0,0 +1,3 @@
+composer.lock
+composer.phar
+/vendor/
diff --git a/server/vendor/psr/container/LICENSE b/server/vendor/psr/container/LICENSE
new file mode 100644
index 0000000..2877a48
--- /dev/null
+++ b/server/vendor/psr/container/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2013-2016 container-interop
+Copyright (c) 2016 PHP Framework Interoperability Group
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/server/vendor/psr/container/README.md b/server/vendor/psr/container/README.md
new file mode 100644
index 0000000..084f6df
--- /dev/null
+++ b/server/vendor/psr/container/README.md
@@ -0,0 +1,5 @@
+# PSR Container
+
+This repository holds all interfaces/classes/traits related to [PSR-11](https://github.com/container-interop/fig-standards/blob/master/proposed/container.md).
+
+Note that this is not a container implementation of its own. See the specification for more details.
diff --git a/server/vendor/psr/container/composer.json b/server/vendor/psr/container/composer.json
new file mode 100644
index 0000000..b8ee012
--- /dev/null
+++ b/server/vendor/psr/container/composer.json
@@ -0,0 +1,27 @@
+{
+ "name": "psr/container",
+ "type": "library",
+ "description": "Common Container Interface (PHP FIG PSR-11)",
+ "keywords": ["psr", "psr-11", "container", "container-interop", "container-interface"],
+ "homepage": "https://github.com/php-fig/container",
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Container\\": "src/"
+ }
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ }
+}
diff --git a/server/vendor/psr/container/src/ContainerExceptionInterface.php b/server/vendor/psr/container/src/ContainerExceptionInterface.php
new file mode 100644
index 0000000..d35c6b4
--- /dev/null
+++ b/server/vendor/psr/container/src/ContainerExceptionInterface.php
@@ -0,0 +1,13 @@
+<?php
+/**
+ * @license http://www.opensource.org/licenses/mit-license.php MIT (see the LICENSE file)
+ */
+
+namespace Psr\Container;
+
+/**
+ * Base interface representing a generic exception in a container.
+ */
+interface ContainerExceptionInterface
+{
+}
diff --git a/server/vendor/psr/container/src/ContainerInterface.php b/server/vendor/psr/container/src/ContainerInterface.php
new file mode 100644
index 0000000..c3a7206
--- /dev/null
+++ b/server/vendor/psr/container/src/ContainerInterface.php
@@ -0,0 +1,37 @@
+<?php
+/**
+ * @license http://www.opensource.org/licenses/mit-license.php MIT (see the LICENSE file)
+ */
+
+namespace Psr\Container;
+
+/**
+ * Describes the interface of a container that exposes methods to read its entries.
+ */
+interface ContainerInterface
+{
+ /**
+ * Finds an entry of the container by its identifier and returns it.
+ *
+ * @param string $id Identifier of the entry to look for.
+ *
+ * @throws NotFoundExceptionInterface No entry was found for **this** identifier.
+ * @throws ContainerExceptionInterface Error while retrieving the entry.
+ *
+ * @return mixed Entry.
+ */
+ public function get($id);
+
+ /**
+ * Returns true if the container can return an entry for the given identifier.
+ * Returns false otherwise.
+ *
+ * `has($id)` returning true does not mean that `get($id)` will not throw an exception.
+ * It does however mean that `get($id)` will not throw a `NotFoundExceptionInterface`.
+ *
+ * @param string $id Identifier of the entry to look for.
+ *
+ * @return bool
+ */
+ public function has($id);
+}
diff --git a/server/vendor/psr/container/src/NotFoundExceptionInterface.php b/server/vendor/psr/container/src/NotFoundExceptionInterface.php
new file mode 100644
index 0000000..6566704
--- /dev/null
+++ b/server/vendor/psr/container/src/NotFoundExceptionInterface.php
@@ -0,0 +1,13 @@
+<?php
+/**
+ * @license http://www.opensource.org/licenses/mit-license.php MIT (see the LICENSE file)
+ */
+
+namespace Psr\Container;
+
+/**
+ * No entry was found in the container.
+ */
+interface NotFoundExceptionInterface extends ContainerExceptionInterface
+{
+}
diff --git a/server/vendor/slim/slim/CONTRIBUTING.md b/server/vendor/slim/slim/CONTRIBUTING.md
deleted file mode 100644
index 9bbb6b1..0000000
--- a/server/vendor/slim/slim/CONTRIBUTING.md
+++ /dev/null
@@ -1,20 +0,0 @@
-# How to Contribute
-
-## Pull Requests
-
-1. Fork the Slim Framework repository
-2. Create a new branch for each feature or improvement
-3. Send a pull request from each feature branch to the **develop** branch
-
-It is very important to separate new features or improvements into separate feature branches, and to send a
-pull request for each branch. This allows me to review and pull in new features or improvements individually.
-
-## Style Guide
-
-All pull requests must adhere to the [PSR-2 standard](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md).
-
-## Unit Testing
-
-All pull requests must be accompanied by passing unit tests and complete code coverage. The Slim Framework uses phpunit for testing.
-
-[Learn about PHPUnit](https://github.com/sebastianbergmann/phpunit/)
diff --git a/server/vendor/slim/slim/LICENSE.md b/server/vendor/slim/slim/LICENSE.md
index 0875f84..682c21d 100644
--- a/server/vendor/slim/slim/LICENSE.md
+++ b/server/vendor/slim/slim/LICENSE.md
@@ -1,4 +1,4 @@
-Copyright (c) 2011-2016 Josh Lockhart
+Copyright (c) 2011-2017 Josh Lockhart
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/server/vendor/slim/slim/README.md b/server/vendor/slim/slim/README.md
deleted file mode 100644
index d20f393..0000000
--- a/server/vendor/slim/slim/README.md
+++ /dev/null
@@ -1,84 +0,0 @@
-# Slim Framework
-
-[![Build Status](https://travis-ci.org/slimphp/Slim.svg?branch=develop)](https://travis-ci.org/slimphp/Slim)
-[![Coverage Status](https://coveralls.io/repos/slimphp/Slim/badge.svg)](https://coveralls.io/r/slimphp/Slim)
-[![Total Downloads](https://poser.pugx.org/slim/slim/downloads)](https://packagist.org/packages/slim/slim)
-[![License](https://poser.pugx.org/slim/slim/license)](https://packagist.org/packages/slim/slim)
-
-Slim is a PHP micro-framework that helps you quickly write simple yet powerful web applications and APIs.
-
-## Installation
-
-It's recommended that you use [Composer](https://getcomposer.org/) to install Slim.
-
-```bash
-$ composer require slim/slim "^3.0"
-```
-
-This will install Slim and all required dependencies. Slim requires PHP 5.5.0 or newer.
-
-## Usage
-
-Create an index.php file with the following contents:
-
-```php
-<?php
-
-require 'vendor/autoload.php';
-
-$app = new Slim\App();
-
-$app->get('/hello/{name}', function ($request, $response, $args) {
- $response->write("Hello, " . $args['name']);
- return $response;
-});
-
-$app->run();
-```
-
-You may quickly test this using the built-in PHP server:
-```bash
-$ php -S localhost:8000
-```
-
-Going to http://localhost:8000/hello/world will now display "Hello, world".
-
-For more information on how to configure your web server, see the [Documentation](http://www.slimframework.com/docs/start/web-servers.html).
-
-## Tests
-
-To execute the test suite, you'll need phpunit.
-
-```bash
-$ phpunit
-```
-
-## Contributing
-
-Please see [CONTRIBUTING](CONTRIBUTING.md) for details.
-
-## Learn More
-
-Learn more at these links:
-
-- [Website](http://www.slimframework.com)
-- [Documentation](http://www.slimframework.com/docs/start/installation.html)
-- [Support Forum](http://help.slimframework.com)
-- [Twitter](https://twitter.com/slimphp)
-- [Resources](https://github.com/xssc/awesome-slim)
-
-## Security
-
-If you discover security related issues, please email security@slimframework.com instead of using the issue tracker.
-
-## Credits
-
-- [Josh Lockhart](https://github.com/codeguy)
-- [Andrew Smith](https://github.com/silentworks)
-- [Rob Allen](https://github.com/akrabat)
-- [Gabriel Manricks](https://github.com/gmanricks)
-- [All Contributors](../../contributors)
-
-## License
-
-The Slim Framework is licensed under the MIT license. See [License File](LICENSE.md) for more information.
diff --git a/server/vendor/slim/slim/Slim/App.php b/server/vendor/slim/slim/Slim/App.php
index c083539..587e671 100644
--- a/server/vendor/slim/slim/Slim/App.php
+++ b/server/vendor/slim/slim/Slim/App.php
@@ -1,21 +1,23 @@
<?php
/**
- * Slim Framework (http://slimframework.com)
+ * Slim Framework (https://slimframework.com)
*
* @link https://github.com/slimphp/Slim
- * @copyright Copyright (c) 2011-2016 Josh Lockhart
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
* @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
*/
namespace Slim;
use Exception;
+use Slim\Exception\InvalidMethodException;
+use Slim\Http\Response;
use Throwable;
use Closure;
use InvalidArgumentException;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\ResponseInterface;
-use Interop\Container\ContainerInterface;
+use Psr\Container\ContainerInterface;
use FastRoute\Dispatcher;
use Slim\Exception\SlimException;
use Slim\Exception\MethodNotAllowedException;
@@ -36,11 +38,6 @@ use Slim\Interfaces\RouterInterface;
* configure, and run a Slim Framework application.
* The \Slim\App class also accepts Slim Framework middleware.
*
- * @property-read array $settings App settings
- * @property-read EnvironmentInterface $environment
- * @property-read RequestInterface $request
- * @property-read ResponseInterface $response
- * @property-read RouterInterface $router
* @property-read callable $errorHandler
* @property-read callable $phpErrorHandler
* @property-read callable $notFoundHandler function($request, $response)
@@ -55,7 +52,7 @@ class App
*
* @var string
*/
- const VERSION = '3.5.0';
+ const VERSION = '3.8.1';
/**
* Container
@@ -292,10 +289,13 @@ class App
*/
public function run($silent = false)
{
- $request = $this->container->get('request');
$response = $this->container->get('response');
- $response = $this->process($request, $response);
+ try {
+ $response = $this->process($this->container->get('request'), $response);
+ } catch (InvalidMethodException $e) {
+ $response = $this->processInvalidMethod($e->getRequest(), $response);
+ }
if (!$silent) {
$this->respond($response);
@@ -305,6 +305,39 @@ class App
}
/**
+ * Pull route info for a request with a bad method to decide whether to
+ * return a not-found error (default) or a bad-method error, then run
+ * the handler for that error, returning the resulting response.
+ *
+ * Used for cases where an incoming request has an unrecognized method,
+ * rather than throwing an exception and not catching it all the way up.
+ *
+ * @param ServerRequestInterface $request
+ * @param ResponseInterface $response
+ * @return ResponseInterface
+ */
+ protected function processInvalidMethod(ServerRequestInterface $request, ResponseInterface $response)
+ {
+ $router = $this->container->get('router');
+ if (is_callable([$request->getUri(), 'getBasePath']) && is_callable([$router, 'setBasePath'])) {
+ $router->setBasePath($request->getUri()->getBasePath());
+ }
+
+ $request = $this->dispatchRouterAndPrepareRoute($request, $router);
+ $routeInfo = $request->getAttribute('routeInfo', [RouterInterface::DISPATCH_STATUS => Dispatcher::NOT_FOUND]);
+
+ if ($routeInfo[RouterInterface::DISPATCH_STATUS] === Dispatcher::METHOD_NOT_ALLOWED) {
+ return $this->handleException(
+ new MethodNotAllowedException($request, $response, $routeInfo[RouterInterface::ALLOWED_METHODS]),
+ $request,
+ $response
+ );
+ }
+
+ return $this->handleException(new NotFoundException($request, $response), $request, $response);
+ }
+
+ /**
* Process a request
*
* This method traverses the application middleware stack and then returns the
@@ -391,9 +424,9 @@ class App
while ($amountToRead > 0 && !$body->eof()) {
$data = $body->read(min($chunkSize, $amountToRead));
echo $data;
-
+
$amountToRead -= strlen($data);
-
+
if (connection_status() != CONNECTION_NORMAL) {
break;
}
@@ -597,7 +630,7 @@ class App
$params = [$e->getRequest(), $e->getResponse(), $e->getAllowedMethods()];
} elseif ($e instanceof NotFoundException) {
$handler = 'notFoundHandler';
- $params = [$e->getRequest(), $e->getResponse()];
+ $params = [$e->getRequest(), $e->getResponse(), $e];
} elseif ($e instanceof SlimException) {
// This is a Stop exception and contains the response
return $e->getResponse();
diff --git a/server/vendor/slim/slim/Slim/CallableResolver.php b/server/vendor/slim/slim/Slim/CallableResolver.php
index 169ac48..b2ce368 100644
--- a/server/vendor/slim/slim/Slim/CallableResolver.php
+++ b/server/vendor/slim/slim/Slim/CallableResolver.php
@@ -1,15 +1,15 @@
<?php
/**
- * Slim Framework (http://slimframework.com)
+ * Slim Framework (https://slimframework.com)
*
* @link https://github.com/slimphp/Slim
- * @copyright Copyright (c) 2011-2016 Josh Lockhart
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
* @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
*/
namespace Slim;
use RuntimeException;
-use Interop\Container\ContainerInterface;
+use Psr\Container\ContainerInterface;
use Slim\Interfaces\CallableResolverInterface;
/**
@@ -18,6 +18,8 @@ use Slim\Interfaces\CallableResolverInterface;
*/
final class CallableResolver implements CallableResolverInterface
{
+ const CALLABLE_PATTERN = '!^([^\:]+)\:([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)$!';
+
/**
* @var ContainerInterface
*/
@@ -46,45 +48,63 @@ final class CallableResolver implements CallableResolverInterface
*/
public function resolve($toResolve)
{
- $resolved = $toResolve;
+ if (is_callable($toResolve)) {
+ return $toResolve;
+ }
+
+ if (!is_string($toResolve)) {
+ $this->assertCallable($toResolve);
+ }
+
+ // check for slim callable as "class:method"
+ if (preg_match(self::CALLABLE_PATTERN, $toResolve, $matches)) {
+ $resolved = $this->resolveCallable($matches[1], $matches[2]);
+ $this->assertCallable($resolved);
+
+ return $resolved;
+ }
- if (!is_callable($toResolve) && is_string($toResolve)) {
- // check for slim callable as "class:method"
- $callablePattern = '!^([^\:]+)\:([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)$!';
- if (preg_match($callablePattern, $toResolve, $matches)) {
- $class = $matches[1];
- $method = $matches[2];
+ $resolved = $this->resolveCallable($toResolve);
+ $this->assertCallable($resolved);
+
+ return $resolved;
+ }
+
+ /**
+ * Check if string is something in the DIC
+ * that's callable or is a class name which has an __invoke() method.
+ *
+ * @param string $class
+ * @param string $method
+ * @return callable
+ *
+ * @throws \RuntimeException if the callable does not exist
+ */
+ protected function resolveCallable($class, $method = '__invoke')
+ {
+ if ($this->container->has($class)) {
+ return [$this->container->get($class), $method];
+ }
- if ($this->container->has($class)) {
- $resolved = [$this->container->get($class), $method];
- } else {
- if (!class_exists($class)) {
- throw new RuntimeException(sprintf('Callable %s does not exist', $class));
- }
- $resolved = [new $class($this->container), $method];
- }
- } else {
- // check if string is something in the DIC that's callable or is a class name which
- // has an __invoke() method
- $class = $toResolve;
- if ($this->container->has($class)) {
- $resolved = $this->container->get($class);
- } else {
- if (!class_exists($class)) {
- throw new RuntimeException(sprintf('Callable %s does not exist', $class));
- }
- $resolved = new $class($this->container);
- }
- }
+ if (!class_exists($class)) {
+ throw new RuntimeException(sprintf('Callable %s does not exist', $class));
}
- if (!is_callable($resolved)) {
+ return [new $class($this->container), $method];
+ }
+
+ /**
+ * @param Callable $callable
+ *
+ * @throws \RuntimeException if the callable is not resolvable
+ */
+ protected function assertCallable($callable)
+ {
+ if (!is_callable($callable)) {
throw new RuntimeException(sprintf(
'%s is not resolvable',
- is_array($toResolve) || is_object($toResolve) ? json_encode($toResolve) : $toResolve
+ is_array($callable) || is_object($callable) ? json_encode($callable) : $callable
));
}
-
- return $resolved;
}
}
diff --git a/server/vendor/slim/slim/Slim/CallableResolverAwareTrait.php b/server/vendor/slim/slim/Slim/CallableResolverAwareTrait.php
index f7ff485..ffb4eb2 100644
--- a/server/vendor/slim/slim/Slim/CallableResolverAwareTrait.php
+++ b/server/vendor/slim/slim/Slim/CallableResolverAwareTrait.php
@@ -1,15 +1,15 @@
<?php
/**
- * Slim Framework (http://slimframework.com)
+ * Slim Framework (https://slimframework.com)
*
* @link https://github.com/slimphp/Slim
- * @copyright Copyright (c) 2011-2016 Josh Lockhart
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
* @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
*/
namespace Slim;
use RuntimeException;
-use Interop\Container\ContainerInterface;
+use Psr\Container\ContainerInterface;
use Slim\Interfaces\CallableResolverInterface;
/**
diff --git a/server/vendor/slim/slim/Slim/Collection.php b/server/vendor/slim/slim/Slim/Collection.php
index 5d19734..728bb73 100644
--- a/server/vendor/slim/slim/Slim/Collection.php
+++ b/server/vendor/slim/slim/Slim/Collection.php
@@ -1,9 +1,9 @@
<?php
/**
- * Slim Framework (http://slimframework.com)
+ * Slim Framework (https://slimframework.com)
*
* @link https://github.com/slimphp/Slim
- * @copyright Copyright (c) 2011-2016 Josh Lockhart
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
* @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
*/
namespace Slim;
diff --git a/server/vendor/slim/slim/Slim/Container.php b/server/vendor/slim/slim/Slim/Container.php
index 2d15a8d..ac0d917 100644
--- a/server/vendor/slim/slim/Slim/Container.php
+++ b/server/vendor/slim/slim/Slim/Container.php
@@ -1,9 +1,9 @@
<?php
/**
- * Slim Framework (http://slimframework.com)
+ * Slim Framework (https://slimframework.com)
*
* @link https://github.com/slimphp/Slim
- * @copyright Copyright (c) 2011-2016 Josh Lockhart
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
* @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
*/
namespace Slim;
@@ -29,7 +29,7 @@ use Slim\Exception\ContainerException as SlimContainerException;
* - errorHandler: a callable with the signature: function($request, $response, $exception)
* - notFoundHandler: a callable with the signature: function($request, $response)
* - notAllowedHandler: a callable with the signature: function($request, $response, $allowedHttpMethods)
- * - callableResolver: an instance of callableResolver
+ * - callableResolver: an instance of \Slim\Interfaces\CallableResolverInterface
*
* @property-read array settings
* @property-read \Slim\Interfaces\Http\EnvironmentInterface environment
diff --git a/server/vendor/slim/slim/Slim/DefaultServicesProvider.php b/server/vendor/slim/slim/Slim/DefaultServicesProvider.php
index 5e1398d..7087e4e 100644
--- a/server/vendor/slim/slim/Slim/DefaultServicesProvider.php
+++ b/server/vendor/slim/slim/Slim/DefaultServicesProvider.php
@@ -1,9 +1,9 @@
<?php
/**
- * Slim Framework (http://slimframework.com)
+ * Slim Framework (https://slimframework.com)
*
* @link https://github.com/slimphp/Slim
- * @copyright Copyright (c) 2011-2016 Josh Lockhart
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
* @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
*/
namespace Slim;
@@ -91,8 +91,14 @@ class DefaultServicesProvider
if (isset($container->get('settings')['routerCacheFile'])) {
$routerCacheFile = $container->get('settings')['routerCacheFile'];
}
-
- return (new Router)->setCacheFile($routerCacheFile);
+
+
+ $router = (new Router)->setCacheFile($routerCacheFile);
+ if (method_exists($router, 'setContainer')) {
+ $router->setContainer($container);
+ }
+
+ return $router;
};
}
diff --git a/server/vendor/slim/slim/Slim/DeferredCallable.php b/server/vendor/slim/slim/Slim/DeferredCallable.php
index af5aed7..22887c0 100644
--- a/server/vendor/slim/slim/Slim/DeferredCallable.php
+++ b/server/vendor/slim/slim/Slim/DeferredCallable.php
@@ -1,16 +1,16 @@
<?php
/**
- * Slim Framework (http://slimframework.com)
+ * Slim Framework (https://slimframework.com)
*
* @link https://github.com/slimphp/Slim
- * @copyright Copyright (c) 2011-2016 Josh Lockhart
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
* @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
*/
namespace Slim;
use Closure;
-use Interop\Container\ContainerInterface;
+use Psr\Container\ContainerInterface;
class DeferredCallable
{
diff --git a/server/vendor/slim/slim/Slim/Exception/ContainerException.php b/server/vendor/slim/slim/Slim/Exception/ContainerException.php
index 0200e1a..b147eb9 100644
--- a/server/vendor/slim/slim/Slim/Exception/ContainerException.php
+++ b/server/vendor/slim/slim/Slim/Exception/ContainerException.php
@@ -1,10 +1,10 @@
<?php
/**
- * Slim Framework (http://slimframework.com)
+ * Slim Framework (https://slimframework.com)
*
- * @link https://github.com/codeguy/Slim
- * @copyright Copyright (c) 2011-2015 Josh Lockhart
- * @license https://github.com/codeguy/Slim/blob/master/LICENSE (MIT License)
+ * @link https://github.com/slimphp/Slim
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
+ * @license https://github.com/slimphp/Slim/blob/3.x/LICENSE (MIT License)
*/
namespace Slim\Exception;
diff --git a/server/vendor/slim/slim/Slim/Exception/ContainerValueNotFoundException.php b/server/vendor/slim/slim/Slim/Exception/ContainerValueNotFoundException.php
index 0ea7671..c5033b6 100644
--- a/server/vendor/slim/slim/Slim/Exception/ContainerValueNotFoundException.php
+++ b/server/vendor/slim/slim/Slim/Exception/ContainerValueNotFoundException.php
@@ -1,10 +1,10 @@
<?php
/**
- * Slim Framework (http://slimframework.com)
+ * Slim Framework (https://slimframework.com)
*
- * @link https://github.com/codeguy/Slim
- * @copyright Copyright (c) 2011-2016 Josh Lockhart
- * @license https://github.com/codeguy/Slim/blob/master/LICENSE (MIT License)
+ * @link https://github.com/slimphp/Slim
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
+ * @license https://github.com/slimphp/Slim/blob/3.x/LICENSE (MIT License)
*/
namespace Slim\Exception;
diff --git a/server/vendor/slim/slim/Slim/Exception/InvalidMethodException.php b/server/vendor/slim/slim/Slim/Exception/InvalidMethodException.php
new file mode 100644
index 0000000..238bf7a
--- /dev/null
+++ b/server/vendor/slim/slim/Slim/Exception/InvalidMethodException.php
@@ -0,0 +1,21 @@
+<?php
+
+namespace Slim\Exception;
+
+use Psr\Http\Message\ServerRequestInterface;
+
+class InvalidMethodException extends \InvalidArgumentException
+{
+ protected $request;
+
+ public function __construct(ServerRequestInterface $request, $method)
+ {
+ $this->request = $request;
+ parent::__construct(sprintf('Unsupported HTTP method "%s" provided', $method));
+ }
+
+ public function getRequest()
+ {
+ return $this->request;
+ }
+}
diff --git a/server/vendor/slim/slim/Slim/Exception/MethodNotAllowedException.php b/server/vendor/slim/slim/Slim/Exception/MethodNotAllowedException.php
index d104d19..e73b99e 100644
--- a/server/vendor/slim/slim/Slim/Exception/MethodNotAllowedException.php
+++ b/server/vendor/slim/slim/Slim/Exception/MethodNotAllowedException.php
@@ -1,10 +1,10 @@
<?php
/**
- * Slim Framework (http://slimframework.com)
+ * Slim Framework (https://slimframework.com)
*
- * @link https://github.com/codeguy/Slim
- * @copyright Copyright (c) 2011-2016 Josh Lockhart
- * @license https://github.com/codeguy/Slim/blob/master/LICENSE (MIT License)
+ * @link https://github.com/slimphp/Slim
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
+ * @license https://github.com/slimphp/Slim/blob/3.x/LICENSE (MIT License)
*/
namespace Slim\Exception;
diff --git a/server/vendor/slim/slim/Slim/Exception/NotFoundException.php b/server/vendor/slim/slim/Slim/Exception/NotFoundException.php
index 65365eb..8095eac 100644
--- a/server/vendor/slim/slim/Slim/Exception/NotFoundException.php
+++ b/server/vendor/slim/slim/Slim/Exception/NotFoundException.php
@@ -1,10 +1,10 @@
<?php
/**
- * Slim Framework (http://slimframework.com)
+ * Slim Framework (https://slimframework.com)
*
- * @link https://github.com/codeguy/Slim
- * @copyright Copyright (c) 2011-2016 Josh Lockhart
- * @license https://github.com/codeguy/Slim/blob/master/LICENSE (MIT License)
+ * @link https://github.com/slimphp/Slim
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
+ * @license https://github.com/slimphp/Slim/blob/3.x/LICENSE (MIT License)
*/
namespace Slim\Exception;
diff --git a/server/vendor/slim/slim/Slim/Exception/SlimException.php b/server/vendor/slim/slim/Slim/Exception/SlimException.php
index b8a03a5..2480d73 100644
--- a/server/vendor/slim/slim/Slim/Exception/SlimException.php
+++ b/server/vendor/slim/slim/Slim/Exception/SlimException.php
@@ -1,9 +1,9 @@
<?php
/**
- * Slim Framework (http://slimframework.com)
+ * Slim Framework (https://slimframework.com)
*
* @link https://github.com/slimphp/Slim
- * @copyright Copyright (c) 2011-2016 Josh Lockhart
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
* @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
*/
namespace Slim\Exception;
diff --git a/server/vendor/slim/slim/Slim/Handlers/AbstractError.php b/server/vendor/slim/slim/Slim/Handlers/AbstractError.php
index 5a6cee3..42f8dde 100644
--- a/server/vendor/slim/slim/Slim/Handlers/AbstractError.php
+++ b/server/vendor/slim/slim/Slim/Handlers/AbstractError.php
@@ -1,9 +1,9 @@
<?php
/**
- * Slim Framework (http://slimframework.com)
+ * Slim Framework (https://slimframework.com)
*
* @link https://github.com/slimphp/Slim
- * @copyright Copyright (c) 2011-2016 Josh Lockhart
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
* @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
*/
namespace Slim\Handlers;
diff --git a/server/vendor/slim/slim/Slim/Handlers/AbstractHandler.php b/server/vendor/slim/slim/Slim/Handlers/AbstractHandler.php
index decdf72..b166a15 100644
--- a/server/vendor/slim/slim/Slim/Handlers/AbstractHandler.php
+++ b/server/vendor/slim/slim/Slim/Handlers/AbstractHandler.php
@@ -1,9 +1,9 @@
<?php
/**
- * Slim Framework (http://slimframework.com)
+ * Slim Framework (https://slimframework.com)
*
* @link https://github.com/slimphp/Slim
- * @copyright Copyright (c) 2011-2016 Josh Lockhart
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
* @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
*/
namespace Slim\Handlers;
diff --git a/server/vendor/slim/slim/Slim/Handlers/Error.php b/server/vendor/slim/slim/Slim/Handlers/Error.php
index b995188..dd0bc8d 100644
--- a/server/vendor/slim/slim/Slim/Handlers/Error.php
+++ b/server/vendor/slim/slim/Slim/Handlers/Error.php
@@ -1,9 +1,9 @@
<?php
/**
- * Slim Framework (http://slimframework.com)
+ * Slim Framework (https://slimframework.com)
*
* @link https://github.com/slimphp/Slim
- * @copyright Copyright (c) 2011-2016 Josh Lockhart
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
* @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
*/
namespace Slim\Handlers;
@@ -47,7 +47,7 @@ class Error extends AbstractError
case 'text/html':
$output = $this->renderHtmlErrorMessage($exception);
break;
-
+
default:
throw new UnexpectedValueException('Cannot render unknown content type ' . $contentType);
}
@@ -81,7 +81,7 @@ class Error extends AbstractError
while ($exception = $exception->getPrevious()) {
$html .= '<h2>Previous exception</h2>';
- $html .= $this->renderHtmlException($exception);
+ $html .= $this->renderHtmlExceptionOrError($exception);
}
} else {
$html = '<p>A website error has occurred. Sorry for the temporary inconvenience.</p>';
@@ -103,12 +103,30 @@ class Error extends AbstractError
/**
* Render exception as HTML.
*
+ * Provided for backwards compatibility; use renderHtmlExceptionOrError().
+ *
* @param \Exception $exception
*
* @return string
*/
protected function renderHtmlException(\Exception $exception)
{
+ return $this->renderHtmlExceptionOrError($exception);
+ }
+
+ /**
+ * Render exception or error as HTML.
+ *
+ * @param \Exception|\Error $exception
+ *
+ * @return string
+ */
+ protected function renderHtmlExceptionOrError($exception)
+ {
+ if (!$exception instanceof \Exception && !$exception instanceof \Error) {
+ throw new \RuntimeException("Unexpected type. Expected Exception or Error.");
+ }
+
$html = sprintf('<div><strong>Type:</strong> %s</div>', get_class($exception));
if (($code = $exception->getCode())) {
diff --git a/server/vendor/slim/slim/Slim/Handlers/NotAllowed.php b/server/vendor/slim/slim/Slim/Handlers/NotAllowed.php
index 3442f20..9f382c4 100644
--- a/server/vendor/slim/slim/Slim/Handlers/NotAllowed.php
+++ b/server/vendor/slim/slim/Slim/Handlers/NotAllowed.php
@@ -1,9 +1,9 @@
<?php
/**
- * Slim Framework (http://slimframework.com)
+ * Slim Framework (https://slimframework.com)
*
* @link https://github.com/slimphp/Slim
- * @copyright Copyright (c) 2011-2016 Josh Lockhart
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
* @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
*/
namespace Slim\Handlers;
diff --git a/server/vendor/slim/slim/Slim/Handlers/NotFound.php b/server/vendor/slim/slim/Slim/Handlers/NotFound.php
index ab1d47a..d4a9dec 100644
--- a/server/vendor/slim/slim/Slim/Handlers/NotFound.php
+++ b/server/vendor/slim/slim/Slim/Handlers/NotFound.php
@@ -1,9 +1,9 @@
<?php
/**
- * Slim Framework (http://slimframework.com)
+ * Slim Framework (https://slimframework.com)
*
* @link https://github.com/slimphp/Slim
- * @copyright Copyright (c) 2011-2016 Josh Lockhart
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
* @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
*/
namespace Slim\Handlers;
@@ -46,7 +46,7 @@ class NotFound extends AbstractHandler
case 'text/html':
$output = $this->renderHtmlNotFoundOutput($request);
break;
-
+
default:
throw new UnexpectedValueException('Cannot render unknown content type ' . $contentType);
}
diff --git a/server/vendor/slim/slim/Slim/Handlers/PhpError.php b/server/vendor/slim/slim/Slim/Handlers/PhpError.php
index 0122ddb..3ecce30 100644
--- a/server/vendor/slim/slim/Slim/Handlers/PhpError.php
+++ b/server/vendor/slim/slim/Slim/Handlers/PhpError.php
@@ -1,9 +1,9 @@
<?php
/**
- * Slim Framework (http://slimframework.com)
+ * Slim Framework (https://slimframework.com)
*
* @link https://github.com/slimphp/Slim
- * @copyright Copyright (c) 2011-2016 Josh Lockhart
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
* @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
*/
namespace Slim\Handlers;
diff --git a/server/vendor/slim/slim/Slim/Handlers/Strategies/RequestResponse.php b/server/vendor/slim/slim/Slim/Handlers/Strategies/RequestResponse.php
index 157bdeb..ad99b56 100644
--- a/server/vendor/slim/slim/Slim/Handlers/Strategies/RequestResponse.php
+++ b/server/vendor/slim/slim/Slim/Handlers/Strategies/RequestResponse.php
@@ -1,9 +1,9 @@
<?php
/**
- * Slim Framework (http://slimframework.com)
+ * Slim Framework (https://slimframework.com)
*
* @link https://github.com/slimphp/Slim
- * @copyright Copyright (c) 2011-2016 Josh Lockhart
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
* @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
*/
namespace Slim\Handlers\Strategies;
diff --git a/server/vendor/slim/slim/Slim/Handlers/Strategies/RequestResponseArgs.php b/server/vendor/slim/slim/Slim/Handlers/Strategies/RequestResponseArgs.php
index 11793d3..739cc7e 100644
--- a/server/vendor/slim/slim/Slim/Handlers/Strategies/RequestResponseArgs.php
+++ b/server/vendor/slim/slim/Slim/Handlers/Strategies/RequestResponseArgs.php
@@ -1,9 +1,9 @@
<?php
/**
- * Slim Framework (http://slimframework.com)
+ * Slim Framework (https://slimframework.com)
*
* @link https://github.com/slimphp/Slim
- * @copyright Copyright (c) 2011-2016 Josh Lockhart
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
* @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
*/
namespace Slim\Handlers\Strategies;
diff --git a/server/vendor/slim/slim/Slim/Http/Body.php b/server/vendor/slim/slim/Slim/Http/Body.php
index 06a25a2..7a7b4df 100644
--- a/server/vendor/slim/slim/Slim/Http/Body.php
+++ b/server/vendor/slim/slim/Slim/Http/Body.php
@@ -1,9 +1,9 @@
<?php
/**
- * Slim Framework (http://slimframework.com)
+ * Slim Framework (https://slimframework.com)
*
* @link https://github.com/slimphp/Slim
- * @copyright Copyright (c) 2011-2016 Josh Lockhart
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
* @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
*/
namespace Slim\Http;
diff --git a/server/vendor/slim/slim/Slim/Http/Cookies.php b/server/vendor/slim/slim/Slim/Http/Cookies.php
index 0604f81..c07c96f 100644
--- a/server/vendor/slim/slim/Slim/Http/Cookies.php
+++ b/server/vendor/slim/slim/Slim/Http/Cookies.php
@@ -1,9 +1,9 @@
<?php
/**
- * Slim Framework (http://slimframework.com)
+ * Slim Framework (https://slimframework.com)
*
* @link https://github.com/slimphp/Slim
- * @copyright Copyright (c) 2011-2016 Josh Lockhart
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
* @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
*/
namespace Slim\Http;
@@ -141,7 +141,7 @@ class Cookies implements CookiesInterface
if (isset($properties['secure']) && $properties['secure']) {
$result .= '; secure';
}
-
+
if (isset($properties['hostonly']) && $properties['hostonly']) {
$result .= '; HostOnly';
}
@@ -174,7 +174,7 @@ class Cookies implements CookiesInterface
}
$header = rtrim($header, "\r\n");
- $pieces = preg_split('@\s*[;,]\s*@', $header);
+ $pieces = preg_split('@[;]\s*@', $header);
$cookies = [];
foreach ($pieces as $cookie) {
diff --git a/server/vendor/slim/slim/Slim/Http/Environment.php b/server/vendor/slim/slim/Slim/Http/Environment.php
index a106fa8..786dc0a 100644
--- a/server/vendor/slim/slim/Slim/Http/Environment.php
+++ b/server/vendor/slim/slim/Slim/Http/Environment.php
@@ -1,9 +1,9 @@
<?php
/**
- * Slim Framework (http://slimframework.com)
+ * Slim Framework (https://slimframework.com)
*
* @link https://github.com/slimphp/Slim
- * @copyright Copyright (c) 2011-2016 Josh Lockhart
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
* @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
*/
namespace Slim\Http;
diff --git a/server/vendor/slim/slim/Slim/Http/Headers.php b/server/vendor/slim/slim/Slim/Http/Headers.php
index 4aa7a5e..f8c4ac1 100644
--- a/server/vendor/slim/slim/Slim/Http/Headers.php
+++ b/server/vendor/slim/slim/Slim/Http/Headers.php
@@ -1,9 +1,9 @@
<?php
/**
- * Slim Framework (http://slimframework.com)
+ * Slim Framework (https://slimframework.com)
*
* @link https://github.com/slimphp/Slim
- * @copyright Copyright (c) 2011-2016 Josh Lockhart
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
* @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
*/
namespace Slim\Http;
diff --git a/server/vendor/slim/slim/Slim/Http/Message.php b/server/vendor/slim/slim/Slim/Http/Message.php
index 1596c8d..d02a43c 100644
--- a/server/vendor/slim/slim/Slim/Http/Message.php
+++ b/server/vendor/slim/slim/Slim/Http/Message.php
@@ -1,9 +1,9 @@
<?php
/**
- * Slim Framework (http://slimframework.com)
+ * Slim Framework (https://slimframework.com)
*
* @link https://github.com/slimphp/Slim
- * @copyright Copyright (c) 2011-2016 Josh Lockhart
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
* @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
*/
namespace Slim\Http;
diff --git a/server/vendor/slim/slim/Slim/Http/Request.php b/server/vendor/slim/slim/Slim/Http/Request.php
index b040bf4..f67050b 100644
--- a/server/vendor/slim/slim/Slim/Http/Request.php
+++ b/server/vendor/slim/slim/Slim/Http/Request.php
@@ -1,9 +1,9 @@
<?php
/**
- * Slim Framework (http://slimframework.com)
+ * Slim Framework (https://slimframework.com)
*
* @link https://github.com/slimphp/Slim
- * @copyright Copyright (c) 2011-2016 Josh Lockhart
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
* @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
*/
namespace Slim\Http;
@@ -16,6 +16,8 @@ use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\UriInterface;
use Psr\Http\Message\StreamInterface;
use Slim\Collection;
+use Slim\Exception\InvalidMethodException;
+use Slim\Exception\MethodNotAllowedException;
use Slim\Interfaces\Http\HeadersInterface;
/**
@@ -131,7 +133,7 @@ class Request extends Message implements ServerRequestInterface
*
* @param Environment $environment The Slim application Environment
*
- * @return self
+ * @return static
*/
public static function createFromEnvironment(Environment $environment)
{
@@ -166,6 +168,7 @@ class Request extends Message implements ServerRequestInterface
* @param array $serverParams The server environment variables
* @param StreamInterface $body The request body object
* @param array $uploadedFiles The request uploadedFiles collection
+ * @throws InvalidMethodException on invalid HTTP method
*/
public function __construct(
$method,
@@ -176,7 +179,12 @@ class Request extends Message implements ServerRequestInterface
StreamInterface $body,
array $uploadedFiles = []
) {
- $this->originalMethod = $this->filterMethod($method);
+ try {
+ $this->originalMethod = $this->filterMethod($method);
+ } catch (InvalidMethodException $e) {
+ $this->originalMethod = $method;
+ }
+
$this->uri = $uri;
$this->headers = $headers;
$this->cookies = $cookies;
@@ -194,20 +202,36 @@ class Request extends Message implements ServerRequestInterface
}
$this->registerMediaTypeParser('application/json', function ($input) {
- return json_decode($input, true);
+ $result = json_decode($input, true);
+ if (!is_array($result)) {
+ return null;
+ }
+ return $result;
});
$this->registerMediaTypeParser('application/xml', function ($input) {
$backup = libxml_disable_entity_loader(true);
+ $backup_errors = libxml_use_internal_errors(true);
$result = simplexml_load_string($input);
libxml_disable_entity_loader($backup);
+ libxml_clear_errors();
+ libxml_use_internal_errors($backup_errors);
+ if ($result === false) {
+ return null;
+ }
return $result;
});
$this->registerMediaTypeParser('text/xml', function ($input) {
$backup = libxml_disable_entity_loader(true);
+ $backup_errors = libxml_use_internal_errors(true);
$result = simplexml_load_string($input);
libxml_disable_entity_loader($backup);
+ libxml_clear_errors();
+ libxml_use_internal_errors($backup_errors);
+ if ($result === false) {
+ return null;
+ }
return $result;
});
@@ -215,6 +239,11 @@ class Request extends Message implements ServerRequestInterface
parse_str($input, $data);
return $data;
});
+
+ // if the request had an invalid method, we can throw it now
+ if (isset($e) && $e instanceof InvalidMethodException) {
+ throw $e;
+ }
}
/**
@@ -248,12 +277,9 @@ class Request extends Message implements ServerRequestInterface
if ($customMethod) {
$this->method = $this->filterMethod($customMethod);
} elseif ($this->originalMethod === 'POST') {
- $body = $this->getParsedBody();
-
- if (is_object($body) && property_exists($body, '_METHOD')) {
- $this->method = $this->filterMethod((string)$body->_METHOD);
- } elseif (is_array($body) && isset($body['_METHOD'])) {
- $this->method = $this->filterMethod((string)$body['_METHOD']);
+ $overrideMethod = $this->filterMethod($this->getParsedBodyParam('_METHOD'));
+ if ($overrideMethod !== null) {
+ $this->method = $overrideMethod;
}
if ($this->getBody()->eof()) {
@@ -289,7 +315,7 @@ class Request extends Message implements ServerRequestInterface
* changed request method.
*
* @param string $method Case-sensitive method.
- * @return self
+ * @return static
* @throws \InvalidArgumentException for invalid HTTP methods.
*/
public function withMethod($method)
@@ -324,10 +350,7 @@ class Request extends Message implements ServerRequestInterface
$method = strtoupper($method);
if (!isset($this->validMethods[$method])) {
- throw new InvalidArgumentException(sprintf(
- 'Unsupported HTTP method "%s" provided',
- $method
- ));
+ throw new InvalidMethodException($this, $method);
}
return $method;
@@ -500,7 +523,7 @@ class Request extends Message implements ServerRequestInterface
* @link http://tools.ietf.org/html/rfc7230#section-2.7 (for the various
* request-target forms allowed in request messages)
* @param mixed $requestTarget
- * @return self
+ * @return static
* @throws InvalidArgumentException if the request target is invalid
*/
public function withRequestTarget($requestTarget)
@@ -558,7 +581,7 @@ class Request extends Message implements ServerRequestInterface
* @link http://tools.ietf.org/html/rfc3986#section-4.3
* @param UriInterface $uri New request URI to use.
* @param bool $preserveHost Preserve the original state of the Host header.
- * @return self
+ * @return static
*/
public function withUri(UriInterface $uri, $preserveHost = false)
{
@@ -570,7 +593,7 @@ class Request extends Message implements ServerRequestInterface
$clone->headers->set('Host', $uri->getHost());
}
} else {
- if ($this->uri->getHost() !== '' && (!$this->hasHeader('Host') || $this->getHeader('Host') === null)) {
+ if ($uri->getHost() !== '' && (!$this->hasHeader('Host') || $this->getHeaderLine('Host') === '')) {
$clone->headers->set('Host', $uri->getHost());
}
}
@@ -689,7 +712,7 @@ class Request extends Message implements ServerRequestInterface
*
* Note: This method is not part of the PSR-7 standard.
*
- * @param string $name The attribute name.
+ * @param string $key The attribute name.
* @param mixed $default Default value to return if the attribute does not exist.
*
* @return mixed
@@ -720,7 +743,7 @@ class Request extends Message implements ServerRequestInterface
* updated cookie values.
*
* @param array $cookies Array of key/value pairs representing cookies.
- * @return self
+ * @return static
*/
public function withCookieParams(array $cookies)
{
@@ -781,7 +804,7 @@ class Request extends Message implements ServerRequestInterface
*
* @param array $query Array of query string arguments, typically from
* $_GET.
- * @return self
+ * @return static
*/
public function withQueryParams(array $query)
{
@@ -820,7 +843,7 @@ class Request extends Message implements ServerRequestInterface
* updated body parameters.
*
* @param array $uploadedFiles An array tree of UploadedFileInterface instances.
- * @return self
+ * @return static
* @throws \InvalidArgumentException if an invalid structure is provided.
*/
public function withUploadedFiles(array $uploadedFiles)
@@ -849,6 +872,22 @@ class Request extends Message implements ServerRequestInterface
return $this->serverParams;
}
+ /**
+ * Retrieve a server parameter.
+ *
+ * Note: This method is not part of the PSR-7 standard.
+ *
+ * @param string $key
+ * @param mixed $default
+ * @return mixed
+ */
+ public function getServerParam($key, $default = null)
+ {
+ $serverParams = $this->getServerParams();
+
+ return isset($serverParams[$key]) ? $serverParams[$key] : $default;
+ }
+
/*******************************************************************************
* Attributes
******************************************************************************/
@@ -902,7 +941,7 @@ class Request extends Message implements ServerRequestInterface
* @see getAttributes()
* @param string $name The attribute name.
* @param mixed $value The value of the attribute.
- * @return self
+ * @return static
*/
public function withAttribute($name, $value)
{
@@ -925,7 +964,7 @@ class Request extends Message implements ServerRequestInterface
* updated attributes.
*
* @param array $attributes New attributes
- * @return self
+ * @return static
*/
public function withAttributes(array $attributes)
{
@@ -947,7 +986,7 @@ class Request extends Message implements ServerRequestInterface
*
* @see getAttributes()
* @param string $name The attribute name.
- * @return self
+ * @return static
*/
public function withoutAttribute($name)
{
@@ -1035,7 +1074,7 @@ class Request extends Message implements ServerRequestInterface
*
* @param null|array|object $data The deserialized body data. This will
* typically be in an array or object.
- * @return self
+ * @return static
* @throws \InvalidArgumentException if an unsupported argument type is
* provided.
*/
@@ -1056,7 +1095,7 @@ class Request extends Message implements ServerRequestInterface
*
* Note: This method is not part of the PSR-7 standard.
*
- * @return self
+ * @return $this
*/
public function reparseBody()
{
@@ -1118,10 +1157,10 @@ class Request extends Message implements ServerRequestInterface
*
* Note: This method is not part of the PSR-7 standard.
*
- * @param $key
- * @param null $default
+ * @param string $key
+ * @param mixed $default
*
- * @return null
+ * @return mixed
*/
public function getParsedBodyParam($key, $default = null)
{
@@ -1141,10 +1180,10 @@ class Request extends Message implements ServerRequestInterface
*
* Note: This method is not part of the PSR-7 standard.
*
- * @param $key
- * @param null $default
+ * @param string $key
+ * @param mixed $default
*
- * @return null
+ * @return mixed
*/
public function getQueryParam($key, $default = null)
{
@@ -1158,7 +1197,7 @@ class Request extends Message implements ServerRequestInterface
}
/**
- * Fetch assocative array of body and query string parameters.
+ * Fetch associative array of body and query string parameters.
*
* Note: This method is not part of the PSR-7 standard.
*
diff --git a/server/vendor/slim/slim/Slim/Http/RequestBody.php b/server/vendor/slim/slim/Slim/Http/RequestBody.php
index 2345fe4..50887fd 100644
--- a/server/vendor/slim/slim/Slim/Http/RequestBody.php
+++ b/server/vendor/slim/slim/Slim/Http/RequestBody.php
@@ -1,9 +1,9 @@
<?php
/**
- * Slim Framework (http://slimframework.com)
+ * Slim Framework (https://slimframework.com)
*
* @link https://github.com/slimphp/Slim
- * @copyright Copyright (c) 2011-2016 Josh Lockhart
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
* @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
*/
namespace Slim\Http;
diff --git a/server/vendor/slim/slim/Slim/Http/Response.php b/server/vendor/slim/slim/Slim/Http/Response.php
index a70d35d..dd96505 100644
--- a/server/vendor/slim/slim/Slim/Http/Response.php
+++ b/server/vendor/slim/slim/Slim/Http/Response.php
@@ -1,9 +1,9 @@
<?php
/**
- * Slim Framework (http://slimframework.com)
+ * Slim Framework (https://slimframework.com)
*
* @link https://github.com/slimphp/Slim
- * @copyright Copyright (c) 2011-2016 Josh Lockhart
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
* @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
*/
namespace Slim\Http;
@@ -91,6 +91,7 @@ class Response extends Message implements ResponseInterface
416 => 'Requested Range Not Satisfiable',
417 => 'Expectation Failed',
418 => 'I\'m a teapot',
+ 421 => 'Misdirected Request',
422 => 'Unprocessable Entity',
423 => 'Locked',
424 => 'Failed Dependency',
@@ -98,7 +99,9 @@ class Response extends Message implements ResponseInterface
428 => 'Precondition Required',
429 => 'Too Many Requests',
431 => 'Request Header Fields Too Large',
+ 444 => 'Connection Closed Without Response',
451 => 'Unavailable For Legal Reasons',
+ 499 => 'Client Closed Request',
//Server Error 5xx
500 => 'Internal Server Error',
501 => 'Not Implemented',
@@ -111,9 +114,17 @@ class Response extends Message implements ResponseInterface
508 => 'Loop Detected',
510 => 'Not Extended',
511 => 'Network Authentication Required',
+ 599 => 'Network Connect Timeout Error',
];
/**
+ * EOL characters used for HTTP response.
+ *
+ * @var string
+ */
+ const EOL = "\r\n";
+
+ /**
* Create new HTTP response.
*
* @param int $status The response status code.
@@ -172,7 +183,7 @@ class Response extends Message implements ResponseInterface
* @param string $reasonPhrase The reason phrase to use with the
* provided status code; if none is provided, implementations MAY
* use the defaults as suggested in the HTTP specification.
- * @return self
+ * @return static
* @throws \InvalidArgumentException For invalid status code arguments.
*/
public function withStatus($code, $reasonPhrase = '')
@@ -250,7 +261,7 @@ class Response extends Message implements ResponseInterface
* Proxies to the underlying stream and writes the provided data to it.
*
* @param string $data
- * @return self
+ * @return $this
*/
public function write($data)
{
@@ -273,7 +284,7 @@ class Response extends Message implements ResponseInterface
*
* @param string|UriInterface $url The redirect destination.
* @param int|null $status The redirect HTTP status code.
- * @return self
+ * @return static
*/
public function withRedirect($url, $status = null)
{
@@ -302,20 +313,19 @@ class Response extends Message implements ResponseInterface
* @param int $status The HTTP status code.
* @param int $encodingOptions Json encoding options
* @throws \RuntimeException
- * @return self
+ * @return static
*/
public function withJson($data, $status = null, $encodingOptions = 0)
{
- $body = $this->getBody();
- $body->rewind();
- $body->write($json = json_encode($data, $encodingOptions));
+ $response = $this->withBody(new Body(fopen('php://temp', 'r+')));
+ $response->body->write($json = json_encode($data, $encodingOptions));
// Ensure that the json encoding passed successfully
if ($json === false) {
throw new \RuntimeException(json_last_error_msg(), json_last_error());
}
- $responseWithJson = $this->withHeader('Content-Type', 'application/json;charset=utf-8');
+ $responseWithJson = $response->withHeader('Content-Type', 'application/json;charset=utf-8');
if (isset($status)) {
return $responseWithJson->withStatus($status);
}
@@ -458,11 +468,11 @@ class Response extends Message implements ResponseInterface
$this->getStatusCode(),
$this->getReasonPhrase()
);
- $output .= PHP_EOL;
+ $output .= Response::EOL;
foreach ($this->getHeaders() as $name => $values) {
- $output .= sprintf('%s: %s', $name, $this->getHeaderLine($name)) . PHP_EOL;
+ $output .= sprintf('%s: %s', $name, $this->getHeaderLine($name)) . Response::EOL;
}
- $output .= PHP_EOL;
+ $output .= Response::EOL;
$output .= (string)$this->getBody();
return $output;
diff --git a/server/vendor/slim/slim/Slim/Http/Stream.php b/server/vendor/slim/slim/Slim/Http/Stream.php
index 62c9562..27c7a76 100644
--- a/server/vendor/slim/slim/Slim/Http/Stream.php
+++ b/server/vendor/slim/slim/Slim/Http/Stream.php
@@ -1,9 +1,9 @@
<?php
/**
- * Slim Framework (http://slimframework.com)
+ * Slim Framework (https://slimframework.com)
*
* @link https://github.com/slimphp/Slim
- * @copyright Copyright (c) 2011-2016 Josh Lockhart
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
* @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
*/
namespace Slim\Http;
diff --git a/server/vendor/slim/slim/Slim/Http/UploadedFile.php b/server/vendor/slim/slim/Slim/Http/UploadedFile.php
index 48ed3ff..ae5dfb6 100644
--- a/server/vendor/slim/slim/Slim/Http/UploadedFile.php
+++ b/server/vendor/slim/slim/Slim/Http/UploadedFile.php
@@ -1,9 +1,9 @@
<?php
/**
- * Slim Framework (http://slimframework.com)
+ * Slim Framework (https://slimframework.com)
*
* @link https://github.com/slimphp/Slim
- * @copyright Copyright (c) 2011-2016 Josh Lockhart
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
* @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
*/
namespace Slim\Http;
diff --git a/server/vendor/slim/slim/Slim/Http/Uri.php b/server/vendor/slim/slim/Slim/Http/Uri.php
index 6b87747..31f202a 100644
--- a/server/vendor/slim/slim/Slim/Http/Uri.php
+++ b/server/vendor/slim/slim/Slim/Http/Uri.php
@@ -1,9 +1,9 @@
<?php
/**
- * Slim Framework (http://slimframework.com)
+ * Slim Framework (https://slimframework.com)
*
* @link https://github.com/slimphp/Slim
- * @copyright Copyright (c) 2011-2016 Josh Lockhart
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
* @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
*/
namespace Slim\Http;
diff --git a/server/vendor/slim/slim/Slim/Interfaces/CallableResolverInterface.php b/server/vendor/slim/slim/Slim/Interfaces/CallableResolverInterface.php
index 9bde59a..17d81db 100644
--- a/server/vendor/slim/slim/Slim/Interfaces/CallableResolverInterface.php
+++ b/server/vendor/slim/slim/Slim/Interfaces/CallableResolverInterface.php
@@ -1,9 +1,9 @@
<?php
/**
- * Slim Framework (http://slimframework.com)
+ * Slim Framework (https://slimframework.com)
*
* @link https://github.com/slimphp/Slim
- * @copyright Copyright (c) 2011-2016 Josh Lockhart
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
* @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
*/
namespace Slim\Interfaces;
diff --git a/server/vendor/slim/slim/Slim/Interfaces/CollectionInterface.php b/server/vendor/slim/slim/Slim/Interfaces/CollectionInterface.php
index 876b061..be995bf 100644
--- a/server/vendor/slim/slim/Slim/Interfaces/CollectionInterface.php
+++ b/server/vendor/slim/slim/Slim/Interfaces/CollectionInterface.php
@@ -1,9 +1,9 @@
<?php
/**
- * Slim Framework (http://slimframework.com)
+ * Slim Framework (https://slimframework.com)
*
* @link https://github.com/slimphp/Slim
- * @copyright Copyright (c) 2011-2016 Josh Lockhart
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
* @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
*/
namespace Slim\Interfaces;
diff --git a/server/vendor/slim/slim/Slim/Interfaces/Http/CookiesInterface.php b/server/vendor/slim/slim/Slim/Interfaces/Http/CookiesInterface.php
index 44981ce..206175a 100644
--- a/server/vendor/slim/slim/Slim/Interfaces/Http/CookiesInterface.php
+++ b/server/vendor/slim/slim/Slim/Interfaces/Http/CookiesInterface.php
@@ -1,9 +1,9 @@
<?php
/**
- * Slim Framework (http://slimframework.com)
+ * Slim Framework (https://slimframework.com)
*
* @link https://github.com/slimphp/Slim
- * @copyright Copyright (c) 2011-2016 Josh Lockhart
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
* @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
*/
namespace Slim\Interfaces\Http;
diff --git a/server/vendor/slim/slim/Slim/Interfaces/Http/EnvironmentInterface.php b/server/vendor/slim/slim/Slim/Interfaces/Http/EnvironmentInterface.php
index a14ecbd..af19d28 100644
--- a/server/vendor/slim/slim/Slim/Interfaces/Http/EnvironmentInterface.php
+++ b/server/vendor/slim/slim/Slim/Interfaces/Http/EnvironmentInterface.php
@@ -1,9 +1,9 @@
<?php
/**
- * Slim Framework (http://slimframework.com)
+ * Slim Framework (https://slimframework.com)
*
* @link https://github.com/slimphp/Slim
- * @copyright Copyright (c) 2011-2016 Josh Lockhart
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
* @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
*/
namespace Slim\Interfaces\Http;
diff --git a/server/vendor/slim/slim/Slim/Interfaces/Http/HeadersInterface.php b/server/vendor/slim/slim/Slim/Interfaces/Http/HeadersInterface.php
index 08288fc..b737705 100644
--- a/server/vendor/slim/slim/Slim/Interfaces/Http/HeadersInterface.php
+++ b/server/vendor/slim/slim/Slim/Interfaces/Http/HeadersInterface.php
@@ -1,9 +1,9 @@
<?php
/**
- * Slim Framework (http://slimframework.com)
+ * Slim Framework (https://slimframework.com)
*
* @link https://github.com/slimphp/Slim
- * @copyright Copyright (c) 2011-2016 Josh Lockhart
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
* @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
*/
namespace Slim\Interfaces\Http;
diff --git a/server/vendor/slim/slim/Slim/Interfaces/InvocationStrategyInterface.php b/server/vendor/slim/slim/Slim/Interfaces/InvocationStrategyInterface.php
index 07b3314..14a92c1 100644
--- a/server/vendor/slim/slim/Slim/Interfaces/InvocationStrategyInterface.php
+++ b/server/vendor/slim/slim/Slim/Interfaces/InvocationStrategyInterface.php
@@ -1,9 +1,9 @@
<?php
/**
- * Slim Framework (http://slimframework.com)
+ * Slim Framework (https://slimframework.com)
*
* @link https://github.com/slimphp/Slim
- * @copyright Copyright (c) 2011-2016 Josh Lockhart
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
* @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
*/
namespace Slim\Interfaces;
diff --git a/server/vendor/slim/slim/Slim/Interfaces/RouteGroupInterface.php b/server/vendor/slim/slim/Slim/Interfaces/RouteGroupInterface.php
index 319a67e..5ed3303 100644
--- a/server/vendor/slim/slim/Slim/Interfaces/RouteGroupInterface.php
+++ b/server/vendor/slim/slim/Slim/Interfaces/RouteGroupInterface.php
@@ -1,9 +1,9 @@
<?php
/**
- * Slim Framework (http://slimframework.com)
+ * Slim Framework (https://slimframework.com)
*
* @link https://github.com/slimphp/Slim
- * @copyright Copyright (c) 2011-2016 Josh Lockhart
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
* @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
*/
namespace Slim\Interfaces;
diff --git a/server/vendor/slim/slim/Slim/Interfaces/RouteInterface.php b/server/vendor/slim/slim/Slim/Interfaces/RouteInterface.php
index 32d4bae..d2d0d24 100644
--- a/server/vendor/slim/slim/Slim/Interfaces/RouteInterface.php
+++ b/server/vendor/slim/slim/Slim/Interfaces/RouteInterface.php
@@ -1,9 +1,9 @@
<?php
/**
- * Slim Framework (http://slimframework.com)
+ * Slim Framework (https://slimframework.com)
*
* @link https://github.com/slimphp/Slim
- * @copyright Copyright (c) 2011-2016 Josh Lockhart
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
* @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
*/
namespace Slim\Interfaces;
@@ -25,16 +25,16 @@ interface RouteInterface
* Retrieve a specific route argument
*
* @param string $name
- * @param mixed $default
+ * @param string|null $default
*
- * @return mixed
+ * @return string|null
*/
public function getArgument($name, $default = null);
/**
* Get route arguments
*
- * @return array
+ * @return string[]
*/
public function getArguments();
@@ -58,16 +58,16 @@ interface RouteInterface
* @param string $name
* @param string $value
*
- * @return static
+ * @return self
*/
public function setArgument($name, $value);
/**
* Replace route arguments
*
- * @param array $arguments
+ * @param string[] $arguments
*
- * @return static
+ * @return self
*/
public function setArguments(array $arguments);
diff --git a/server/vendor/slim/slim/Slim/Interfaces/RouterInterface.php b/server/vendor/slim/slim/Slim/Interfaces/RouterInterface.php
index 3d32dcd..2ab8b67 100644
--- a/server/vendor/slim/slim/Slim/Interfaces/RouterInterface.php
+++ b/server/vendor/slim/slim/Slim/Interfaces/RouterInterface.php
@@ -1,9 +1,9 @@
<?php
/**
- * Slim Framework (http://slimframework.com)
+ * Slim Framework (https://slimframework.com)
*
* @link https://github.com/slimphp/Slim
- * @copyright Copyright (c) 2011-2016 Josh Lockhart
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
* @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
*/
namespace Slim\Interfaces;
@@ -20,6 +20,10 @@ use Psr\Http\Message\ServerRequestInterface;
*/
interface RouterInterface
{
+ // array keys from route result
+ const DISPATCH_STATUS = 0;
+ const ALLOWED_METHODS = 1;
+
/**
* Add route
*
diff --git a/server/vendor/slim/slim/Slim/MiddlewareAwareTrait.php b/server/vendor/slim/slim/Slim/MiddlewareAwareTrait.php
index 84bc6bb..14404b5 100644
--- a/server/vendor/slim/slim/Slim/MiddlewareAwareTrait.php
+++ b/server/vendor/slim/slim/Slim/MiddlewareAwareTrait.php
@@ -1,9 +1,9 @@
<?php
/**
- * Slim Framework (http://slimframework.com)
+ * Slim Framework (https://slimframework.com)
*
* @link https://github.com/slimphp/Slim
- * @copyright Copyright (c) 2011-2016 Josh Lockhart
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
* @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
*/
namespace Slim;
@@ -63,8 +63,14 @@ trait MiddlewareAwareTrait
$this->seedMiddlewareStack();
}
$next = $this->stack->top();
- $this->stack[] = function (ServerRequestInterface $req, ResponseInterface $res) use ($callable, $next) {
- $result = call_user_func($callable, $req, $res, $next);
+ $this->stack[] = function (
+ ServerRequestInterface $request,
+ ResponseInterface $response
+ ) use (
+ $callable,
+ $next
+ ) {
+ $result = call_user_func($callable, $request, $response, $next);
if ($result instanceof ResponseInterface === false) {
throw new UnexpectedValueException(
'Middleware must return instance of \Psr\Http\Message\ResponseInterface'
@@ -100,12 +106,12 @@ trait MiddlewareAwareTrait
/**
* Call middleware stack
*
- * @param ServerRequestInterface $req A request object
- * @param ResponseInterface $res A response object
+ * @param ServerRequestInterface $request A request object
+ * @param ResponseInterface $response A response object
*
* @return ResponseInterface
*/
- public function callMiddlewareStack(ServerRequestInterface $req, ResponseInterface $res)
+ public function callMiddlewareStack(ServerRequestInterface $request, ResponseInterface $response)
{
if (is_null($this->stack)) {
$this->seedMiddlewareStack();
@@ -113,8 +119,8 @@ trait MiddlewareAwareTrait
/** @var callable $start */
$start = $this->stack->top();
$this->middlewareLock = true;
- $resp = $start($req, $res);
+ $response = $start($request, $response);
$this->middlewareLock = false;
- return $resp;
+ return $response;
}
}
diff --git a/server/vendor/slim/slim/Slim/Routable.php b/server/vendor/slim/slim/Slim/Routable.php
index 4a6759f..c912db4 100644
--- a/server/vendor/slim/slim/Slim/Routable.php
+++ b/server/vendor/slim/slim/Slim/Routable.php
@@ -1,14 +1,14 @@
<?php
/**
- * Slim Framework (http://slimframework.com)
+ * Slim Framework (https://slimframework.com)
*
* @link https://github.com/slimphp/Slim
- * @copyright Copyright (c) 2011-2016 Josh Lockhart
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
* @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
*/
namespace Slim;
-use Interop\Container\ContainerInterface;
+use Psr\Container\ContainerInterface;
/**
* A routable, middleware-aware object
@@ -19,7 +19,7 @@ use Interop\Container\ContainerInterface;
abstract class Routable
{
use CallableResolverAwareTrait;
-
+
/**
* Route callable
*
@@ -93,11 +93,11 @@ abstract class Routable
$this->middleware[] = new DeferredCallable($callable, $this->container);
return $this;
}
-
+
/**
* Set the route pattern
*
- * @set string
+ * @param string $newPattern
*/
public function setPattern($newPattern)
{
diff --git a/server/vendor/slim/slim/Slim/Route.php b/server/vendor/slim/slim/Slim/Route.php
index 4572441..6a44b3f 100644
--- a/server/vendor/slim/slim/Slim/Route.php
+++ b/server/vendor/slim/slim/Slim/Route.php
@@ -1,17 +1,19 @@
<?php
/**
- * Slim Framework (http://slimframework.com)
+ * Slim Framework (https://slimframework.com)
*
* @link https://github.com/slimphp/Slim
- * @copyright Copyright (c) 2011-2016 Josh Lockhart
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
* @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
*/
namespace Slim;
use Exception;
+use Throwable;
use InvalidArgumentException;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\ResponseInterface;
+use Slim\Exception\SlimException;
use Slim\Handlers\Strategies\RequestResponse;
use Slim\Interfaces\InvocationStrategyInterface;
use Slim\Interfaces\RouteInterface;
@@ -70,6 +72,13 @@ class Route extends Routable implements RouteInterface
protected $arguments = [];
/**
+ * The callable payload
+ *
+ * @var callable
+ */
+ protected $callable;
+
+ /**
* Create new route
*
* @param string|string[] $methods The route HTTP methods
@@ -121,6 +130,16 @@ class Route extends Routable implements RouteInterface
}
/**
+ * This method enables you to override the Route's callable
+ *
+ * @param string|\Closure $callable
+ */
+ public function setCallable($callable)
+ {
+ $this->callable = $callable;
+ }
+
+ /**
* Get route methods
*
* @return string[]
@@ -246,7 +265,7 @@ class Route extends Routable implements RouteInterface
* Retrieve a specific route argument
*
* @param string $name
- * @param mixed $default
+ * @param string|null $default
*
* @return mixed
*/
@@ -324,6 +343,11 @@ class Route extends Routable implements RouteInterface
ob_start();
$newResponse = $handler($this->callable, $request, $response, $this->arguments);
$output = ob_get_clean();
+ // @codeCoverageIgnoreStart
+ } catch (Throwable $e) {
+ ob_end_clean();
+ throw $e;
+ // @codeCoverageIgnoreEnd
} catch (Exception $e) {
ob_end_clean();
throw $e;
diff --git a/server/vendor/slim/slim/Slim/RouteGroup.php b/server/vendor/slim/slim/Slim/RouteGroup.php
index a0cdf4d..705ac45 100644
--- a/server/vendor/slim/slim/Slim/RouteGroup.php
+++ b/server/vendor/slim/slim/Slim/RouteGroup.php
@@ -1,9 +1,9 @@
<?php
/**
- * Slim Framework (http://slimframework.com)
+ * Slim Framework (https://slimframework.com)
*
* @link https://github.com/slimphp/Slim
- * @copyright Copyright (c) 2011-2016 Josh Lockhart
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
* @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
*/
namespace Slim;
diff --git a/server/vendor/slim/slim/Slim/Router.php b/server/vendor/slim/slim/Slim/Router.php
index 5d14fc9..8311628 100644
--- a/server/vendor/slim/slim/Slim/Router.php
+++ b/server/vendor/slim/slim/Slim/Router.php
@@ -1,14 +1,15 @@
<?php
/**
- * Slim Framework (http://slimframework.com)
+ * Slim Framework (https://slimframework.com)
*
* @link https://github.com/slimphp/Slim
- * @copyright Copyright (c) 2011-2016 Josh Lockhart
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
* @license https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
*/
namespace Slim;
use FastRoute\Dispatcher;
+use Psr\Container\ContainerInterface;
use InvalidArgumentException;
use RuntimeException;
use Psr\Http\Message\ServerRequestInterface;
@@ -30,6 +31,13 @@ use Slim\Interfaces\RouteInterface;
class Router implements RouterInterface
{
/**
+ * Container Interface
+ *
+ * @var ContainerInterface
+ */
+ protected $container;
+
+ /**
* Parser
*
* @var \FastRoute\RouteParser
@@ -127,6 +135,14 @@ class Router implements RouterInterface
}
/**
+ * @param ContainerInterface $container
+ */
+ public function setContainer(ContainerInterface $container)
+ {
+ $this->container = $container;
+ }
+
+ /**
* Add route
*
* @param string[] $methods Array of HTTP methods
@@ -183,13 +199,18 @@ class Router implements RouterInterface
*
* @param string[] $methods Array of HTTP methods
* @param string $pattern The route pattern
- * @param callable $handler The route callable
+ * @param callable $callable The route callable
*
- * @return Slim\Interfaces\RouteInterface
+ * @return \Slim\Interfaces\RouteInterface
*/
protected function createRoute($methods, $pattern, $callable)
{
- return new Route($methods, $pattern, $callable, $this->routeGroups, $this->routeCounter);
+ $route = new Route($methods, $pattern, $callable, $this->routeGroups, $this->routeCounter);
+ if (!empty($this->container)) {
+ $route->setContainer($this->container);
+ }
+
+ return $route;
}
/**
diff --git a/server/vendor/slim/slim/composer.json b/server/vendor/slim/slim/composer.json
index 808eb9d..554a838 100644
--- a/server/vendor/slim/slim/composer.json
+++ b/server/vendor/slim/slim/composer.json
@@ -3,7 +3,7 @@
"type": "library",
"description": "Slim is a PHP micro framework that helps you quickly write simple yet powerful web applications and APIs",
"keywords": ["framework","micro","api","router"],
- "homepage": "http://slimframework.com",
+ "homepage": "https://slimframework.com",
"license": "MIT",
"authors": [
{
@@ -32,7 +32,8 @@
"pimple/pimple": "^3.0",
"psr/http-message": "^1.0",
"nikic/fast-route": "^1.0",
- "container-interop/container-interop": "^1.1"
+ "container-interop/container-interop": "^1.2",
+ "psr/container": "^1.0"
},
"require-dev": {
"squizlabs/php_codesniffer": "^2.5",
diff --git a/server/vendor/slim/slim/example/.htaccess b/server/vendor/slim/slim/example/.htaccess
deleted file mode 100644
index 0784bd2..0000000
--- a/server/vendor/slim/slim/example/.htaccess
+++ /dev/null
@@ -1,12 +0,0 @@
-# Note: see https://httpd.apache.org/docs/current/howto/htaccess.html:
-#
-# "You should avoid using .htaccess files completely if you have access to
-# httpd main server config file. Using .htaccess files slows down your Apache
-# http server. Any directive that you can include in a .htaccess file is
-# better set in a Directory block, as it will have the same effect with
-# better performance."
-
-RewriteEngine On
-RewriteCond %{REQUEST_FILENAME} !-f
-RewriteCond %{REQUEST_FILENAME} !-d
-RewriteRule ^ index.php [QSA,L]
diff --git a/server/vendor/slim/slim/example/README.md b/server/vendor/slim/slim/example/README.md
deleted file mode 100644
index e4fb359..0000000
--- a/server/vendor/slim/slim/example/README.md
+++ /dev/null
@@ -1,19 +0,0 @@
-# Slim example
-
-1. Install composer
-
- ```text
- $ cd Slim
- $ composer install
- ```
-
-2. Run php server
-
- ```text
- $ cd Slim
- $ php -S localhost:8888 -t example example/index.php
- ```
-
-3. Open browser
-
- Open http://localhost:8888 in your browser and you will see 'Welcome to Slim!'
diff --git a/server/vendor/slim/slim/example/index.php b/server/vendor/slim/slim/example/index.php
deleted file mode 100644
index ef895f8..0000000
--- a/server/vendor/slim/slim/example/index.php
+++ /dev/null
@@ -1,45 +0,0 @@
-<?php
-
-/**
- * Step 1: Require the Slim Framework using Composer's autoloader
- *
- * If you are not using Composer, you need to load Slim Framework with your own
- * PSR-4 autoloader.
- */
-require 'vendor/autoload.php';
-
-/**
- * Step 2: Instantiate a Slim application
- *
- * This example instantiates a Slim application using
- * its default settings. However, you will usually configure
- * your Slim application now by passing an associative array
- * of setting names and values into the application constructor.
- */
-$app = new Slim\App();
-
-/**
- * Step 3: Define the Slim application routes
- *
- * Here we define several Slim application routes that respond
- * to appropriate HTTP request methods. In this example, the second
- * argument for `Slim::get`, `Slim::post`, `Slim::put`, `Slim::patch`, and `Slim::delete`
- * is an anonymous function.
- */
-$app->get('/', function ($request, $response, $args) {
- $response->write("Welcome to Slim!");
- return $response;
-});
-
-$app->get('/hello[/{name}]', function ($request, $response, $args) {
- $response->write("Hello, " . $args['name']);
- return $response;
-})->setArgument('name', 'World!');
-
-/**
- * Step 4: Run the Slim application
- *
- * This method should be called last. This executes the Slim application
- * and returns the HTTP response to the HTTP client.
- */
-$app->run();
diff --git a/server/verifycron.php b/server/verifycron.php
new file mode 100644
index 0000000..ad4dc48
--- /dev/null
+++ b/server/verifycron.php
@@ -0,0 +1,38 @@
+<?php
+/**
+ * @copyright Copyright (c) 2017 Bjoern Schiessle <bjoern@schiessle.org>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+require __DIR__ . '/vendor/autoload.php';
+
+if (PHP_SAPI !== 'cli') {
+ return;
+}
+
+$env = \Slim\Http\Environment::mock(['REQUEST_URI' => '/verify']);
+
+$settings = require __DIR__ . '/src/config.php';
+$settings['environment'] = $env;
+$container = new \Slim\Container($settings);
+require __DIR__ . '/src/dependencies.php';
+
+$app = new \Slim\App($container);
+
+$app->map(['GET'], '/verify', 'UserManager:verify');
+$app->run();