Server IP : 213.176.29.180 / Your IP : 3.12.163.23 Web Server : Apache System : Linux 213.176.29.180.hostiran.name 4.18.0-553.22.1.el8_10.x86_64 #1 SMP Tue Sep 24 05:16:59 EDT 2024 x86_64 User : webtaragh ( 1001) PHP Version : 7.4.33 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON Directory (0750) : /home/webtaragh/public_html/whmcs/../../www/ |
[ Home ] | [ C0mmand ] | [ Upload File ] |
---|
.htaccess 0000644 00000000015 14735711174 0006350 0 ustar 00 Deny from all cache/.htaccess 0000644 00000000015 14735711174 0007413 0 ustar 00 Deny from all cache/repo/https---releases.whmcs.com-v2/UpdatePackagesDataFile 0000644 00002131732 14735711174 0020314 0 ustar 00 { "packages": { "whmcs/whmcs": { "8.8.0-release.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "8.8.0", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^7.2.0 || ^7.3.0 || ^7.4.0 || ~8.1.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-8.8.0-release.1.zip", "type": "zip" }, "time": "2023-09-20", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "1.1.0", "authorizenet/authorizenet": "1.9.9", "aws/aws-sdk-php": "3.138.0", "bitpay/php-client": "v3.0.0-p2", "brick/math": "0.8.15", "bshaffer/oauth2-server-httpfoundation-bridge": "v1.4-p1", "bshaffer/oauth2-server-php": "v1.11.1-p1", "cebe/php-openapi": "1.5.2", "composer/ca-bundle": "1.2.8", "composer/composer": "dev-v1.10.6-php72-php81-compat", "composer/semver": "1.5.1", "composer/spdx-licenses": "1.5.3", "composer/xdebug-handler": "1.4.3", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "1.10.4", "doctrine/inflector": "1.4.1", "doctrine/instantiator": "1.4.1", "doctrine/lexer": "1.2.0", "duosecurity/duo_php": "1.0.1", "egulias/email-validator": "2.1.22", "ezyang/htmlpurifier": "v4.12.0", "facebook/graph-sdk": "5.7.0", "filp/whoops": "2.14.3", "firebase/php-jwt": "v5.2.0", "goetas-webservices/xsd2php-runtime": "v0.2.12", "google/apiclient": "2.7.0-p1", "google/auth": "v1.11.1", "google/recaptcha": "1.2.4", "guzzlehttp/guzzle": "7.0.1", "guzzlehttp/promises": "1.4.0", "guzzlehttp/psr7": "1.6.1", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v7.12.0", "illuminate/container": "dev-v7.12.0-php72-php81-compat", "illuminate/contracts": "v7.12.0", "illuminate/database": "dev-v7.12.0-php72-php81-compat", "illuminate/events": "v7.12.0", "illuminate/filesystem": "v7.28.4", "illuminate/support": "v7.12.0", "illuminate/translation": "v7.28.4", "illuminate/validation": "v7.12.0", "jms/metadata": "1.7.0", "jms/parser-lib": "1.0.0", "jms/serializer": "dev-v1.14.1-php72-php81-compat", "justinrainbow/json-schema": "5.2.9", "knplabs/knp-menu": "v3.1.1", "laminas/laminas-diactoros": "2.3.1", "laminas/laminas-httphandlerrunner": "1.2.0", "laminas/laminas-loader": "2.6.1", "laminas/laminas-mail": "2.14.0-p1", "laminas/laminas-mime": "2.7.4", "laminas/laminas-stdlib": "3.3.0", "laminas/laminas-validator": "2.13.4", "laminas/laminas-zendframework-bridge": "1.1.1", "league/climate": "3.5.2", "league/flysystem": "1.0.67", "league/flysystem-aws-s3-v3": "1.0.24", "league/oauth2-client": "2.5.0", "league/oauth2-google": "3.0.3", "league/openapi-psr7-validator": "0.16.4", "league/plates": "3.3.0", "league/uri": "6.7.1", "league/uri-interfaces": "2.3.0", "michelf/php-markdown": "1.9.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "2.0.2", "mtdowling/jmespath.php": "2.6.0", "nesbot/carbon": "2.63.0", "nikic/fast-route": "v1.3.0", "paragonie/random_compat": "v9.99.100", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.2.0", "phpmyadmin/sql-parser": "5.3.1", "phpoption/phpoption": "1.7.3", "phpseclib/mcrypt_compat": "1.0.12", "phpseclib/phpseclib": "2.0.39", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-client": "1.0.1", "psr/http-factory": "1.0.1", "psr/http-message": "1.0.1", "psr/http-server-handler": "1.0.1", "psr/http-server-middleware": "1.0.1", "psr/log": "1.0.2", "psr/simple-cache": "1.0.1", "punic/punic": "3.5.1", "ralouphie/getallheaders": "3.0.3", "ramsey/collection": "1.0.1", "ramsey/uuid": "4.0.1", "react/promise": "v2.8.0", "respect/stringifier": "0.2.0", "respect/validation": "2.2.3", "riverline/multipart-parser": "2.0.9", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.8.0", "seld/phar-utils": "1.1.0", "smarty/smarty": "dev-v3.1.36-php72-php81-compat", "sonata-project/google-authenticator": "2.2.0", "stevenmaguire/oauth2-microsoft": "2.2.0", "stripe/stripe-php": "v7.34.0", "symfony/cache": "v5.1.11", "symfony/cache-contracts": "v2.5.2", "symfony/config": "v5.4.9", "symfony/console": "v5.4.12", "symfony/dependency-injection": "v5.1.7", "symfony/deprecation-contracts": "v2.2.0", "symfony/filesystem": "v5.0.8", "symfony/finder": "v5.3.7", "symfony/http-foundation": "v5.3.7", "symfony/mime": "v5.1.7", "symfony/polyfill-ctype": "v1.18.1", "symfony/polyfill-iconv": "v1.18.1", "symfony/polyfill-intl-grapheme": "v1.26.0", "symfony/polyfill-intl-idn": "v1.18.1", "symfony/polyfill-intl-normalizer": "v1.18.1", "symfony/polyfill-mbstring": "v1.18.1", "symfony/polyfill-php70": "v1.20.0", "symfony/polyfill-php72": "v1.18.1", "symfony/polyfill-php73": "v1.18.1", "symfony/polyfill-php80": "v1.18.1", "symfony/polyfill-php81": "v1.26.0", "symfony/process": "v5.3.7", "symfony/service-contracts": "v2.2.0", "symfony/string": "v5.4.10", "symfony/translation": "v5.0.8", "symfony/translation-contracts": "v2.3.0", "symfony/var-exporter": "v5.4.10", "symfony/yaml": "v5.0.8", "tecnickcom/tcpdf": "6.3.5-p1", "true/punycode": "v2.1.1", "voku/portable-ascii": "1.5.3", "webmozart/assert": "1.11.0", "zbateson/mail-mime-parser": "1.3.1", "zbateson/mb-wrapper": "1.0.1", "zbateson/stream-decorators": "1.0.4" }, "extra": {"sha":"a7a72057858684ff9c27eb498e5f685d8247524ef9d1f25ce79a4678585f83d0","sig":"mf+kiKGRwC1RZRd6+bQSSr+oRsaJNlMAjr5mAigxahOVE3WLirVs6Y7dodiROxRZm1SW88kUdN+IWzHgQYbkhSJHFJlqc5Zy2s7d4kZb6gwL4nwURiJTIQZwA0oJ9CV\/\/nVHgUih1K\/Y\/gtztmXz0Qf5p7TG0jcKItcnGruU8b3PB26qOE2iTChpI+fPx+Ffin+wsU6OrENJBvi1EWONkRH2qhOFPCx7BWsBXUrOU0rKyeLl4rPtZSSLHXk1jR8seR2uDYSu076P38WZ9TztnEKrkORq1rPa3E6UO98qEOc+H4qhO9e8sPIdkBax2FQPXajI1OJnH5lbW2RNB1dGBg==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_8.8.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V8.8.0","fileSize":"117060717","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"byZIBsWEjGQA4LqYT57uuXVMP3Zbop1O1lg53jwDdG3DmM2djzl\/J1fB+WRV05Giv6d2SgDyM7LwOeGdlvM5yUpxHL7ATXcL275nZbX\/JN7V4KJeWw\/M3YbaNzomPPDTtzw60NYM3PorePAEGr2VufGXWp61acGOMtZUT3Q1iwa\/W2rfs5AzXaDNEUo7On6kW0ImeonnqSunIXjSssjrlL31WtrG5FfpnUthbq9RFvUkjgxM7Bonc5d3gA5T30SYhs1iaiNXxfXo9iGHbrj9fQuToatDAmwNI\/Caoe3EhXMTde3qH\/cU+dz0i4svcV\/PruHzGw10mXZxZQ8DxS5PSg=="},"require":{"ionCubeLoader":"10.1.0"}} }, "8.8.0-rc.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "8.8.0-RC.1", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^7.2.0 || ^7.3.0 || ^7.4.0 || ~8.1.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-8.8.0-rc.1.zip", "type": "zip" }, "time": "2023-08-25", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "1.1.0", "authorizenet/authorizenet": "1.9.9", "aws/aws-sdk-php": "3.138.0", "bitpay/php-client": "v3.0.0-p2", "brick/math": "0.8.15", "bshaffer/oauth2-server-httpfoundation-bridge": "v1.4-p1", "bshaffer/oauth2-server-php": "v1.11.1-p1", "cebe/php-openapi": "1.5.2", "composer/ca-bundle": "1.2.8", "composer/composer": "dev-v1.10.6-php72-php81-compat", "composer/semver": "1.5.1", "composer/spdx-licenses": "1.5.3", "composer/xdebug-handler": "1.4.3", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "1.10.4", "doctrine/inflector": "1.4.1", "doctrine/instantiator": "1.4.1", "doctrine/lexer": "1.2.0", "duosecurity/duo_php": "1.0.1", "egulias/email-validator": "2.1.22", "ezyang/htmlpurifier": "v4.12.0", "facebook/graph-sdk": "5.7.0", "filp/whoops": "2.14.3", "firebase/php-jwt": "v5.2.0", "goetas-webservices/xsd2php-runtime": "v0.2.12", "google/apiclient": "2.7.0-p1", "google/auth": "v1.11.1", "google/recaptcha": "1.2.4", "guzzlehttp/guzzle": "7.0.1", "guzzlehttp/promises": "1.4.0", "guzzlehttp/psr7": "1.6.1", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v7.12.0", "illuminate/container": "dev-v7.12.0-php72-php81-compat", "illuminate/contracts": "v7.12.0", "illuminate/database": "dev-v7.12.0-php72-php81-compat", "illuminate/events": "v7.12.0", "illuminate/filesystem": "v7.28.4", "illuminate/support": "v7.12.0", "illuminate/translation": "v7.28.4", "illuminate/validation": "v7.12.0", "jms/metadata": "1.7.0", "jms/parser-lib": "1.0.0", "jms/serializer": "dev-v1.14.1-php72-php81-compat", "justinrainbow/json-schema": "5.2.9", "knplabs/knp-menu": "v3.1.1", "laminas/laminas-diactoros": "2.3.1", "laminas/laminas-httphandlerrunner": "1.2.0", "laminas/laminas-loader": "2.6.1", "laminas/laminas-mail": "2.14.0-p1", "laminas/laminas-mime": "2.7.4", "laminas/laminas-stdlib": "3.3.0", "laminas/laminas-validator": "2.13.4", "laminas/laminas-zendframework-bridge": "1.1.1", "league/climate": "3.5.2", "league/flysystem": "1.0.67", "league/flysystem-aws-s3-v3": "1.0.24", "league/oauth2-client": "2.5.0", "league/oauth2-google": "3.0.3", "league/openapi-psr7-validator": "0.16.4", "league/plates": "3.3.0", "league/uri": "6.7.1", "league/uri-interfaces": "2.3.0", "michelf/php-markdown": "1.9.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "2.0.2", "mtdowling/jmespath.php": "2.6.0", "nesbot/carbon": "2.63.0", "nikic/fast-route": "v1.3.0", "paragonie/random_compat": "v9.99.100", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.2.0", "phpmyadmin/sql-parser": "5.3.1", "phpoption/phpoption": "1.7.3", "phpseclib/mcrypt_compat": "1.0.12", "phpseclib/phpseclib": "2.0.39", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-client": "1.0.1", "psr/http-factory": "1.0.1", "psr/http-message": "1.0.1", "psr/http-server-handler": "1.0.1", "psr/http-server-middleware": "1.0.1", "psr/log": "1.0.2", "psr/simple-cache": "1.0.1", "punic/punic": "3.5.1", "ralouphie/getallheaders": "3.0.3", "ramsey/collection": "1.0.1", "ramsey/uuid": "4.0.1", "react/promise": "v2.8.0", "respect/stringifier": "0.2.0", "respect/validation": "2.2.3", "riverline/multipart-parser": "2.0.9", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.8.0", "seld/phar-utils": "1.1.0", "smarty/smarty": "dev-v3.1.36-php72-php81-compat", "sonata-project/google-authenticator": "2.2.0", "stevenmaguire/oauth2-microsoft": "2.2.0", "stripe/stripe-php": "v7.34.0", "symfony/cache": "v5.1.11", "symfony/cache-contracts": "v2.5.2", "symfony/config": "v5.4.9", "symfony/console": "v5.4.12", "symfony/dependency-injection": "v5.1.7", "symfony/deprecation-contracts": "v2.2.0", "symfony/filesystem": "v5.0.8", "symfony/finder": "v5.3.7", "symfony/http-foundation": "v5.3.7", "symfony/mime": "v5.1.7", "symfony/polyfill-ctype": "v1.18.1", "symfony/polyfill-iconv": "v1.18.1", "symfony/polyfill-intl-grapheme": "v1.26.0", "symfony/polyfill-intl-idn": "v1.18.1", "symfony/polyfill-intl-normalizer": "v1.18.1", "symfony/polyfill-mbstring": "v1.18.1", "symfony/polyfill-php70": "v1.20.0", "symfony/polyfill-php72": "v1.18.1", "symfony/polyfill-php73": "v1.18.1", "symfony/polyfill-php80": "v1.18.1", "symfony/polyfill-php81": "v1.26.0", "symfony/process": "v5.3.7", "symfony/service-contracts": "v2.2.0", "symfony/string": "v5.4.10", "symfony/translation": "v5.0.8", "symfony/translation-contracts": "v2.3.0", "symfony/var-exporter": "v5.4.10", "symfony/yaml": "v5.0.8", "tecnickcom/tcpdf": "6.3.5-p1", "true/punycode": "v2.1.1", "voku/portable-ascii": "1.5.3", "webmozart/assert": "1.11.0", "zbateson/mail-mime-parser": "1.3.1", "zbateson/mb-wrapper": "1.0.1", "zbateson/stream-decorators": "1.0.4" }, "extra": {"sha":"1f4ed96a6085d097d42bf6316b942b7ed4a2ab59e8c8bf8795b7beebcb13766b","sig":"aWR7QiycjwvVKCswCo9VInjBRTA8ztH0PzCCCcXSTaeqOnCsP7cNiMVY2ZT9F0dT3P6ThmRyuVulzLwhAWzEE2Wb8aq4IFiouT4fd2fmiJM8QHc4zZKgmXopXguB47RYFzyA4hGvYpP5jecKtt1eO1MRm17KOv5YRAzqnjCnE\/fFETfLodDSORy5m8deaLbsUBsdHXxGLbPJvjve+y1EogDY5QQjuCtXtLqZgU\/T5YEseYg\/BNmyLdpauu9EPqMRZM3eH5Ta5A2x+GbLSjIKgII+WuRUnEF755XmKa3v+7hT6vqot3UpIPWJxQd2d8JgbQsFotCk+9P\/7\/VA0P89Ew==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_8.8.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V8.8.0","fileSize":"115868939","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"lzehtklhK\/cOch0JOuA6QbV9lhcRR8SqT\/z8G6Z2w9Ti4onJuxjAMA85a8YYS3IMLy+z2iIujhvg12ys\/NVdkRmHx9T0n2WFwxeZ+Pq6PPYMQiRWeUAttxCVN6W7yj\/VlmockdEwAPGr47Jki8W5TE08bYib2I+fKIPZ0vLeKmHmbw8hZGX\/SRhQMKeXjfwun4cEABEm6AtCMCMXllem0w74ouRz\/b7peXrnWxwm8Gaexs7gAvZPUcUqWOW3p\/EkA9kj1AdTMzeLopWbXmKtR8cr+jxJA4VXr2Ato+XtT\/HC9DcWWF645Fvj883oGscDYxLsaZCdvDnYnvUK9sNkvA=="},"require":{"ionCubeLoader":"10.1.0"}} }, "8.8.0-beta.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "8.8.0-beta.1", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^7.2.0 || ^7.3.0 || ^7.4.0 || ~8.1.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-8.8.0-beta.1.zip", "type": "zip" }, "time": "2023-07-26", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "1.1.0", "authorizenet/authorizenet": "1.9.9", "aws/aws-sdk-php": "3.138.0", "bitpay/php-client": "v3.0.0-p2", "brick/math": "0.8.15", "bshaffer/oauth2-server-httpfoundation-bridge": "v1.4-p1", "bshaffer/oauth2-server-php": "v1.11.1-p1", "cebe/php-openapi": "1.5.2", "composer/ca-bundle": "1.2.8", "composer/composer": "dev-v1.10.6-php72-php81-compat", "composer/semver": "1.5.1", "composer/spdx-licenses": "1.5.3", "composer/xdebug-handler": "1.4.3", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "1.10.4", "doctrine/inflector": "1.4.1", "doctrine/instantiator": "1.4.1", "doctrine/lexer": "1.2.0", "duosecurity/duo_php": "1.0.1", "egulias/email-validator": "2.1.22", "ezyang/htmlpurifier": "v4.12.0", "facebook/graph-sdk": "5.7.0", "filp/whoops": "2.14.3", "firebase/php-jwt": "v5.2.0", "goetas-webservices/xsd2php-runtime": "v0.2.12", "google/apiclient": "2.7.0-p1", "google/auth": "v1.11.1", "google/recaptcha": "1.2.4", "guzzlehttp/guzzle": "7.0.1", "guzzlehttp/promises": "1.4.0", "guzzlehttp/psr7": "1.6.1", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v7.12.0", "illuminate/container": "dev-v7.12.0-php72-php81-compat", "illuminate/contracts": "v7.12.0", "illuminate/database": "dev-v7.12.0-php72-php81-compat", "illuminate/events": "v7.12.0", "illuminate/filesystem": "v7.28.4", "illuminate/support": "v7.12.0", "illuminate/translation": "v7.28.4", "illuminate/validation": "v7.12.0", "jms/metadata": "1.7.0", "jms/parser-lib": "1.0.0", "jms/serializer": "dev-v1.14.1-php72-php81-compat", "justinrainbow/json-schema": "5.2.9", "knplabs/knp-menu": "v3.1.1", "laminas/laminas-diactoros": "2.3.1", "laminas/laminas-httphandlerrunner": "1.2.0", "laminas/laminas-loader": "2.6.1", "laminas/laminas-mail": "2.14.0-p1", "laminas/laminas-mime": "2.7.4", "laminas/laminas-stdlib": "3.3.0", "laminas/laminas-validator": "2.13.4", "laminas/laminas-zendframework-bridge": "1.1.1", "league/climate": "3.5.2", "league/flysystem": "1.0.67", "league/flysystem-aws-s3-v3": "1.0.24", "league/oauth2-client": "2.5.0", "league/oauth2-google": "3.0.3", "league/openapi-psr7-validator": "0.16.4", "league/plates": "3.3.0", "league/uri": "6.7.1", "league/uri-interfaces": "2.3.0", "michelf/php-markdown": "1.9.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "2.0.2", "mtdowling/jmespath.php": "2.6.0", "nesbot/carbon": "2.63.0", "nikic/fast-route": "v1.3.0", "paragonie/random_compat": "v9.99.100", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.2.0", "phpmyadmin/sql-parser": "5.3.1", "phpoption/phpoption": "1.7.3", "phpseclib/mcrypt_compat": "1.0.12", "phpseclib/phpseclib": "2.0.39", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-client": "1.0.1", "psr/http-factory": "1.0.1", "psr/http-message": "1.0.1", "psr/http-server-handler": "1.0.1", "psr/http-server-middleware": "1.0.1", "psr/log": "1.0.2", "psr/simple-cache": "1.0.1", "punic/punic": "3.5.1", "ralouphie/getallheaders": "3.0.3", "ramsey/collection": "1.0.1", "ramsey/uuid": "4.0.1", "react/promise": "v2.8.0", "respect/stringifier": "0.2.0", "respect/validation": "2.2.3", "riverline/multipart-parser": "2.0.9", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.8.0", "seld/phar-utils": "1.1.0", "smarty/smarty": "dev-v3.1.36-php72-php81-compat", "sonata-project/google-authenticator": "2.2.0", "stevenmaguire/oauth2-microsoft": "2.2.0", "stripe/stripe-php": "v7.34.0", "symfony/cache": "v5.1.11", "symfony/cache-contracts": "v2.5.2", "symfony/config": "v5.4.9", "symfony/console": "v5.4.12", "symfony/dependency-injection": "v5.1.7", "symfony/deprecation-contracts": "v2.2.0", "symfony/filesystem": "v5.0.8", "symfony/finder": "v5.3.7", "symfony/http-foundation": "v5.3.7", "symfony/mime": "v5.1.7", "symfony/polyfill-ctype": "v1.18.1", "symfony/polyfill-iconv": "v1.18.1", "symfony/polyfill-intl-grapheme": "v1.26.0", "symfony/polyfill-intl-idn": "v1.18.1", "symfony/polyfill-intl-normalizer": "v1.18.1", "symfony/polyfill-mbstring": "v1.18.1", "symfony/polyfill-php70": "v1.20.0", "symfony/polyfill-php72": "v1.18.1", "symfony/polyfill-php73": "v1.18.1", "symfony/polyfill-php80": "v1.18.1", "symfony/polyfill-php81": "v1.26.0", "symfony/process": "v5.3.7", "symfony/service-contracts": "v2.2.0", "symfony/string": "v5.4.10", "symfony/translation": "v5.0.8", "symfony/translation-contracts": "v2.3.0", "symfony/var-exporter": "v5.4.10", "symfony/yaml": "v5.0.8", "tecnickcom/tcpdf": "6.3.5-p1", "true/punycode": "v2.1.1", "voku/portable-ascii": "1.5.3", "webmozart/assert": "1.11.0", "zbateson/mail-mime-parser": "1.3.1", "zbateson/mb-wrapper": "1.0.1", "zbateson/stream-decorators": "1.0.4" }, "extra": {"sha":"11cde5f991938f6ff76694c05e27c18bea231cde080d836d18ea811a58a5a6d8","sig":"Dfga5NvR+NDTsFHAeFzujxB2qmKCZmbOHoZFPKXRZb6q9dYO4y4LvcscEgIDPZ9Vym6vPXvXOfnO0is3auEqRVXIXFUJb0XRLckfRj7IE2p0j7Muz\/67G0DExtH4LH5n0tIL9ClJVk23ZQCFaXnqFJvmCdHra\/bmiDnD40lKmQK2\/1yCawsY2M6pM1QI2GIYMrtKAVeHhF9+FMOgDwVPDyn4I0B\/NLxYyGPVRRsAMZyBXCFNqzOAeyP8BueKVmlPtjB8Iv3bcos8GREbBTMGOyg8GsoQ2uTAym5vYQWuHaSSD99tbjXJwrTUu+BDZ69OrVLGJdps39Pyvtk8lvTNMA==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_8.8.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V8.8.0","fileSize":"115702608","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"oIybbBhagFUFoImKlaPACHsKY0TmSAmyD\/bkYKH4XC\/IAc38j4YPZRBBhQ4gEqOYbOBWwdTyzdRa31Di8ycfjA1qZZC9pUQaJrPNvC8YpODrXSvwYxXwbVjqoKIjMH2SMhMC8lyJBOmcfYXHHmONoAicP5pwBuvyTGkO9Tgpjhkz6Xqb\/Rthm71yU19FixnGG4lwM8b3fsUQrIGSyNoJhVq7C1Iv3g0Y88Mh5rkkave5gnVYl08EKlMpFd5Xm49f+tuqoCmnPXVTKqp979HH7R6co\/RoNLMxeJPKTKfIhSpDsRzHDSsD1kOYh8w3IAI0nA7A339W3mco8reqLdfLVg=="},"require":{"ionCubeLoader":"10.1.0"}} }, "8.7.3-release.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "8.7.3", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^7.2.0 || ^7.3.0 || ^7.4.0 || ~8.1.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-8.7.3-release.1.zip", "type": "zip" }, "time": "2023-06-14", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "1.1.0", "authorizenet/authorizenet": "1.9.9", "aws/aws-sdk-php": "3.138.0", "bitpay/php-client": "v3.0.0-p2", "brick/math": "0.8.15", "bshaffer/oauth2-server-httpfoundation-bridge": "v1.4-p1", "bshaffer/oauth2-server-php": "v1.11.1-p1", "cebe/php-openapi": "1.5.2", "composer/ca-bundle": "1.2.8", "composer/composer": "dev-v1.10.6-php72-php81-compat", "composer/semver": "1.5.1", "composer/spdx-licenses": "1.5.3", "composer/xdebug-handler": "1.4.3", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "1.10.4", "doctrine/inflector": "1.4.1", "doctrine/instantiator": "1.4.1", "doctrine/lexer": "1.2.0", "duosecurity/duo_php": "1.0.1", "egulias/email-validator": "2.1.22", "ezyang/htmlpurifier": "v4.12.0", "facebook/graph-sdk": "5.7.0", "filp/whoops": "2.14.3", "firebase/php-jwt": "v5.2.0", "goetas-webservices/xsd2php-runtime": "v0.2.12", "google/apiclient": "2.7.0-p1", "google/auth": "v1.11.1", "google/recaptcha": "1.2.4", "guzzlehttp/guzzle": "7.0.1", "guzzlehttp/promises": "1.4.0", "guzzlehttp/psr7": "1.6.1", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v7.12.0", "illuminate/container": "dev-v7.12.0-php72-php81-compat", "illuminate/contracts": "v7.12.0", "illuminate/database": "dev-v7.12.0-php72-php81-compat", "illuminate/events": "v7.12.0", "illuminate/filesystem": "v7.28.4", "illuminate/support": "v7.12.0", "illuminate/translation": "v7.28.4", "illuminate/validation": "v7.12.0", "jms/metadata": "1.7.0", "jms/parser-lib": "1.0.0", "jms/serializer": "dev-v1.14.1-php72-php81-compat", "justinrainbow/json-schema": "5.2.9", "knplabs/knp-menu": "v3.1.1", "laminas/laminas-diactoros": "2.3.1", "laminas/laminas-httphandlerrunner": "1.2.0", "laminas/laminas-loader": "2.6.1", "laminas/laminas-mail": "2.14.0-p1", "laminas/laminas-mime": "2.7.4", "laminas/laminas-stdlib": "3.3.0", "laminas/laminas-validator": "2.13.4", "laminas/laminas-zendframework-bridge": "1.1.1", "league/climate": "3.5.2", "league/flysystem": "1.0.67", "league/flysystem-aws-s3-v3": "1.0.24", "league/oauth2-client": "2.5.0", "league/oauth2-google": "3.0.3", "league/openapi-psr7-validator": "0.16.4", "league/plates": "3.3.0", "league/uri": "6.7.1", "league/uri-interfaces": "2.3.0", "michelf/php-markdown": "1.9.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "2.0.2", "mtdowling/jmespath.php": "2.6.0", "nesbot/carbon": "2.63.0", "nikic/fast-route": "v1.3.0", "paragonie/random_compat": "v9.99.100", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.2.0", "phpmyadmin/sql-parser": "5.3.1", "phpoption/phpoption": "1.7.3", "phpseclib/mcrypt_compat": "1.0.12", "phpseclib/phpseclib": "2.0.39", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-client": "1.0.1", "psr/http-factory": "1.0.1", "psr/http-message": "1.0.1", "psr/http-server-handler": "1.0.1", "psr/http-server-middleware": "1.0.1", "psr/log": "1.0.2", "psr/simple-cache": "1.0.1", "punic/punic": "3.5.1", "ralouphie/getallheaders": "3.0.3", "ramsey/collection": "1.0.1", "ramsey/uuid": "4.0.1", "react/promise": "v2.8.0", "respect/stringifier": "0.2.0", "respect/validation": "2.2.3", "riverline/multipart-parser": "2.0.9", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.8.0", "seld/phar-utils": "1.1.0", "smarty/smarty": "dev-v3.1.36-php72-php81-compat", "sonata-project/google-authenticator": "2.2.0", "stevenmaguire/oauth2-microsoft": "2.2.0", "stripe/stripe-php": "v7.34.0", "symfony/cache": "v5.1.11", "symfony/cache-contracts": "v2.5.2", "symfony/config": "v5.4.9", "symfony/console": "v5.4.12", "symfony/dependency-injection": "v5.1.7", "symfony/deprecation-contracts": "v2.2.0", "symfony/filesystem": "v5.0.8", "symfony/finder": "v5.3.7", "symfony/http-foundation": "v5.3.7", "symfony/mime": "v5.1.7", "symfony/polyfill-ctype": "v1.18.1", "symfony/polyfill-iconv": "v1.18.1", "symfony/polyfill-intl-grapheme": "v1.26.0", "symfony/polyfill-intl-idn": "v1.18.1", "symfony/polyfill-intl-normalizer": "v1.18.1", "symfony/polyfill-mbstring": "v1.18.1", "symfony/polyfill-php70": "v1.20.0", "symfony/polyfill-php72": "v1.18.1", "symfony/polyfill-php73": "v1.18.1", "symfony/polyfill-php80": "v1.18.1", "symfony/polyfill-php81": "v1.26.0", "symfony/process": "v5.3.7", "symfony/service-contracts": "v2.2.0", "symfony/string": "v5.4.10", "symfony/translation": "v5.0.8", "symfony/translation-contracts": "v2.3.0", "symfony/var-exporter": "v5.4.10", "symfony/yaml": "v5.0.8", "tecnickcom/tcpdf": "6.3.5-p1", "true/punycode": "v2.1.1", "voku/portable-ascii": "1.5.3", "webmozart/assert": "1.11.0", "zbateson/mail-mime-parser": "1.3.1", "zbateson/mb-wrapper": "1.0.1", "zbateson/stream-decorators": "1.0.4" }, "extra": {"sha":"15973c60cbf3afd7c4d4a0a7238a2acabacb501223a0d4e5445582d1ae9ef012","sig":"VUt4c3P2v4aWdR7+gHZklaSQiGlB\/imGU\/vV1KW\/jAQN\/xFELp6Ko5JTiiDxqOfCe7bXqq3htUDZwUGUMR\/HD7\/YGCj1W+xH2fmkbok7dl9Jka1Qc2AlKmqLzqPiFexfhsa0Wqealrwgg6FVxBwsJ24mWxuYV4h4DJjrf0FgDIFbBQB0lygmnYARxbrBtraznX2NB3MRzEpo5hpWQ5SiEqQ\/ouKQGKT\/3gc6k3QFpYpXe9mgVoRZCCYw9at40Q+Z9uHusXjfSY4uNWqFbK5xbmbNYKvWgrIDjeFIpTq+PZSGv97D894fVC5rfU\/QjY6IchGAVSFaIYHGn+0n1Xj0zQ==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_8.7.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V8.7.0","fileSize":"113421354","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"Az20IjHVVqNfXwlHCDg\/tHkHVOzcXkDDNbXYUE4U1iCh9c+PlFOO2xT9W4jmFvV7kGhXDBaF7QCAgVYZkP27aglGFdUFY\/p\/NqW0UjkmmaPyJqMq0RrnV3IGeZ0KAEe\/QpB+FQb+GxCSEYfXty+igpoO0ArDbIRZ4JnEnmdKpV77Iw0cbeBuoOAnhndRYI0ziaTJs6vopeAb7LHhuTX5+Vb5zHdMvdo7eXquu1Crc8oxNiNuFw2ApnbphBwF+4tqcN70VQx+Gh+P1Su7rOqJIsKJesqVB\/+7svr\/+Kpt1aGywAO5Im+SodHzEnugh0vRyCnL\/Gzjnwc+l68uJC\/E\/g=="},"require":{"ionCubeLoader":"10.1.0"}} }, "8.7.2-release.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "8.7.2", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^7.2.0 || ^7.3.0 || ^7.4.0 || ~8.1.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-8.7.2-release.1.zip", "type": "zip" }, "time": "2023-04-25", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "1.1.0", "authorizenet/authorizenet": "1.9.9", "aws/aws-sdk-php": "3.138.0", "bitpay/php-client": "v3.0.0-p2", "brick/math": "0.8.15", "bshaffer/oauth2-server-httpfoundation-bridge": "v1.4-p1", "bshaffer/oauth2-server-php": "v1.11.1-p1", "cebe/php-openapi": "1.5.2", "composer/ca-bundle": "1.2.8", "composer/composer": "dev-v1.10.6-php72-php81-compat", "composer/semver": "1.5.1", "composer/spdx-licenses": "1.5.3", "composer/xdebug-handler": "1.4.3", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "1.10.4", "doctrine/inflector": "1.4.1", "doctrine/instantiator": "1.4.1", "doctrine/lexer": "1.2.0", "duosecurity/duo_php": "1.0.1", "egulias/email-validator": "2.1.22", "ezyang/htmlpurifier": "v4.12.0", "facebook/graph-sdk": "5.7.0", "filp/whoops": "2.14.3", "firebase/php-jwt": "v5.2.0", "goetas-webservices/xsd2php-runtime": "v0.2.12", "google/apiclient": "2.7.0-p1", "google/auth": "v1.11.1", "google/recaptcha": "1.2.4", "guzzlehttp/guzzle": "7.0.1", "guzzlehttp/promises": "1.4.0", "guzzlehttp/psr7": "1.6.1", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v7.12.0", "illuminate/container": "dev-v7.12.0-php72-php81-compat", "illuminate/contracts": "v7.12.0", "illuminate/database": "dev-v7.12.0-php72-php81-compat", "illuminate/events": "v7.12.0", "illuminate/filesystem": "v7.28.4", "illuminate/support": "v7.12.0", "illuminate/translation": "v7.28.4", "illuminate/validation": "v7.12.0", "jms/metadata": "1.7.0", "jms/parser-lib": "1.0.0", "jms/serializer": "dev-v1.14.1-php72-php81-compat", "justinrainbow/json-schema": "5.2.9", "knplabs/knp-menu": "v3.1.1", "laminas/laminas-diactoros": "2.3.1", "laminas/laminas-httphandlerrunner": "1.2.0", "laminas/laminas-loader": "2.6.1", "laminas/laminas-mail": "2.14.0-p1", "laminas/laminas-mime": "2.7.4", "laminas/laminas-stdlib": "3.3.0", "laminas/laminas-validator": "2.13.4", "laminas/laminas-zendframework-bridge": "1.1.1", "league/climate": "3.5.2", "league/flysystem": "1.0.67", "league/flysystem-aws-s3-v3": "1.0.24", "league/oauth2-client": "2.5.0", "league/oauth2-google": "3.0.3", "league/openapi-psr7-validator": "0.16.4", "league/plates": "3.3.0", "league/uri": "6.7.1", "league/uri-interfaces": "2.3.0", "michelf/php-markdown": "1.9.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "2.0.2", "mtdowling/jmespath.php": "2.6.0", "nesbot/carbon": "2.63.0", "nikic/fast-route": "v1.3.0", "paragonie/random_compat": "v9.99.100", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.2.0", "phpmyadmin/sql-parser": "5.3.1", "phpoption/phpoption": "1.7.3", "phpseclib/mcrypt_compat": "1.0.12", "phpseclib/phpseclib": "2.0.39", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-client": "1.0.1", "psr/http-factory": "1.0.1", "psr/http-message": "1.0.1", "psr/http-server-handler": "1.0.1", "psr/http-server-middleware": "1.0.1", "psr/log": "1.0.2", "psr/simple-cache": "1.0.1", "punic/punic": "3.5.1", "ralouphie/getallheaders": "3.0.3", "ramsey/collection": "1.0.1", "ramsey/uuid": "4.0.1", "react/promise": "v2.8.0", "respect/stringifier": "0.2.0", "respect/validation": "2.2.3", "riverline/multipart-parser": "2.0.9", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.8.0", "seld/phar-utils": "1.1.0", "smarty/smarty": "dev-v3.1.36-php72-php81-compat", "sonata-project/google-authenticator": "2.2.0", "stevenmaguire/oauth2-microsoft": "2.2.0", "stripe/stripe-php": "v7.34.0", "symfony/cache": "v5.1.11", "symfony/cache-contracts": "v2.5.2", "symfony/config": "v5.4.9", "symfony/console": "v5.4.12", "symfony/dependency-injection": "v5.1.7", "symfony/deprecation-contracts": "v2.2.0", "symfony/filesystem": "v5.0.8", "symfony/finder": "v5.3.7", "symfony/http-foundation": "v5.3.7", "symfony/mime": "v5.1.7", "symfony/polyfill-ctype": "v1.18.1", "symfony/polyfill-iconv": "v1.18.1", "symfony/polyfill-intl-grapheme": "v1.26.0", "symfony/polyfill-intl-idn": "v1.18.1", "symfony/polyfill-intl-normalizer": "v1.18.1", "symfony/polyfill-mbstring": "v1.18.1", "symfony/polyfill-php70": "v1.20.0", "symfony/polyfill-php72": "v1.18.1", "symfony/polyfill-php73": "v1.18.1", "symfony/polyfill-php80": "v1.18.1", "symfony/polyfill-php81": "v1.26.0", "symfony/process": "v5.3.7", "symfony/service-contracts": "v2.2.0", "symfony/string": "v5.4.10", "symfony/translation": "v5.0.8", "symfony/translation-contracts": "v2.3.0", "symfony/var-exporter": "v5.4.10", "symfony/yaml": "v5.0.8", "tecnickcom/tcpdf": "6.3.5-p1", "true/punycode": "v2.1.1", "voku/portable-ascii": "1.5.3", "webmozart/assert": "1.11.0", "zbateson/mail-mime-parser": "1.3.1", "zbateson/mb-wrapper": "1.0.1", "zbateson/stream-decorators": "1.0.4" }, "extra": {"sha":"702357a5d08878cf592b07271ebc3194b7dd02fdfb04a3cca5815df74296de6d","sig":"FQdP1oQmyTiHWUDciMowG5d65LYoidYwG+6jhut+YhE1LVuSDvErJrgY9yTFKkb162lBPfchQcU\/qYqjb7PmIMreixJb+BO7XaD6qS3Hu53+Xtrp\/BMrJUQgwuxCQnZ3+fG8gkTXfPxwtzhUK1zTghVEYoV\/J2CJcwvRjQd7D94X8IyLGyy5fGkjQ7hdanp5DQNjqivxJMB1tIsvUBhqmopnT3DxU4FWY5RiRWpSDNSesEeugmMVtB3z+BzOL9k+DDFJrycbLa5k++VrP5LEZbgEtl307TVLRlVBfBYoIsHKnkdqlGP5wWR14uObISPqcJpE2Ct8bc2tiws2KwoWig==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_8.7.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V8.7.0","fileSize":"113424740","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"XxCbTlAPH1ma84vqPH5THOBiUcBBHQFG4ZXX5GEYYk3Pv\/XFB8UCx9HaL2cojAbBHWf7xYcllua3C4V9VunJ7wWq184apajpzS+b0j3SBxgXBXagUCvs8Sm1L5STrR+x68IT5tgMKNHCfgyPDLMU\/MCtB6mZdLQXX63IIUsSP0+1kD+3PVvBxjFe+MdFNz0whIkg6sHbz0\/DpvrSgET\/Tsf6bS7MG7d\/Ctz9NhlRlKIP1tFgehLtiUjj9zFl1bTmvLyzem0Kl45ZdcyrjO5\/NNut\/LEs\/KOJrWhsqsRMkMtzTqAErR0gIq4ItGPOUUiLTFTHLA7tlQuYppgDLPt84w=="},"require":{"ionCubeLoader":"10.1.0"}} }, "8.7.1-release.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "8.7.1", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^7.2.0 || ^7.3.0 || ^7.4.0 || ~8.1.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-8.7.1-release.1.zip", "type": "zip" }, "time": "2023-03-23", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "1.1.0", "authorizenet/authorizenet": "1.9.9", "aws/aws-sdk-php": "3.138.0", "bitpay/php-client": "v3.0.0-p2", "brick/math": "0.8.15", "bshaffer/oauth2-server-httpfoundation-bridge": "v1.4-p1", "bshaffer/oauth2-server-php": "v1.11.1-p1", "cebe/php-openapi": "1.5.2", "composer/ca-bundle": "1.2.8", "composer/composer": "dev-v1.10.6-php72-php81-compat", "composer/semver": "1.5.1", "composer/spdx-licenses": "1.5.3", "composer/xdebug-handler": "1.4.3", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "1.10.4", "doctrine/inflector": "1.4.1", "doctrine/instantiator": "1.4.1", "doctrine/lexer": "1.2.0", "duosecurity/duo_php": "1.0.1", "egulias/email-validator": "2.1.22", "ezyang/htmlpurifier": "v4.12.0", "facebook/graph-sdk": "5.7.0", "filp/whoops": "2.14.3", "firebase/php-jwt": "v5.2.0", "goetas-webservices/xsd2php-runtime": "v0.2.12", "google/apiclient": "2.7.0-p1", "google/auth": "v1.11.1", "google/recaptcha": "1.2.4", "guzzlehttp/guzzle": "7.0.1", "guzzlehttp/promises": "1.4.0", "guzzlehttp/psr7": "1.6.1", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v7.12.0", "illuminate/container": "dev-v7.12.0-php72-php81-compat", "illuminate/contracts": "v7.12.0", "illuminate/database": "dev-v7.12.0-php72-php81-compat", "illuminate/events": "v7.12.0", "illuminate/filesystem": "v7.28.4", "illuminate/support": "v7.12.0", "illuminate/translation": "v7.28.4", "illuminate/validation": "v7.12.0", "jms/metadata": "1.7.0", "jms/parser-lib": "1.0.0", "jms/serializer": "dev-v1.14.1-php72-php81-compat", "justinrainbow/json-schema": "5.2.9", "knplabs/knp-menu": "v3.1.1", "laminas/laminas-diactoros": "2.3.1", "laminas/laminas-httphandlerrunner": "1.2.0", "laminas/laminas-loader": "2.6.1", "laminas/laminas-mail": "2.14.0-p1", "laminas/laminas-mime": "2.7.4", "laminas/laminas-stdlib": "3.3.0", "laminas/laminas-validator": "2.13.4", "laminas/laminas-zendframework-bridge": "1.1.1", "league/climate": "3.5.2", "league/flysystem": "1.0.67", "league/flysystem-aws-s3-v3": "1.0.24", "league/oauth2-client": "2.5.0", "league/oauth2-google": "3.0.3", "league/openapi-psr7-validator": "0.16.4", "league/plates": "3.3.0", "league/uri": "6.7.1", "league/uri-interfaces": "2.3.0", "michelf/php-markdown": "1.9.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "2.0.2", "mtdowling/jmespath.php": "2.6.0", "nesbot/carbon": "2.63.0", "nikic/fast-route": "v1.3.0", "paragonie/random_compat": "v9.99.100", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.2.0", "phpmyadmin/sql-parser": "5.3.1", "phpoption/phpoption": "1.7.3", "phpseclib/mcrypt_compat": "1.0.12", "phpseclib/phpseclib": "2.0.39", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-client": "1.0.1", "psr/http-factory": "1.0.1", "psr/http-message": "1.0.1", "psr/http-server-handler": "1.0.1", "psr/http-server-middleware": "1.0.1", "psr/log": "1.0.2", "psr/simple-cache": "1.0.1", "punic/punic": "3.5.1", "ralouphie/getallheaders": "3.0.3", "ramsey/collection": "1.0.1", "ramsey/uuid": "4.0.1", "react/promise": "v2.8.0", "respect/stringifier": "0.2.0", "respect/validation": "2.2.3", "riverline/multipart-parser": "2.0.9", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.8.0", "seld/phar-utils": "1.1.0", "smarty/smarty": "dev-v3.1.36-php72-php81-compat", "sonata-project/google-authenticator": "2.2.0", "stevenmaguire/oauth2-microsoft": "2.2.0", "stripe/stripe-php": "v7.34.0", "symfony/cache": "v5.1.11", "symfony/cache-contracts": "v2.5.2", "symfony/config": "v5.4.9", "symfony/console": "v5.4.12", "symfony/dependency-injection": "v5.1.7", "symfony/deprecation-contracts": "v2.2.0", "symfony/filesystem": "v5.0.8", "symfony/finder": "v5.3.7", "symfony/http-foundation": "v5.3.7", "symfony/mime": "v5.1.7", "symfony/polyfill-ctype": "v1.18.1", "symfony/polyfill-iconv": "v1.18.1", "symfony/polyfill-intl-grapheme": "v1.26.0", "symfony/polyfill-intl-idn": "v1.18.1", "symfony/polyfill-intl-normalizer": "v1.18.1", "symfony/polyfill-mbstring": "v1.18.1", "symfony/polyfill-php70": "v1.20.0", "symfony/polyfill-php72": "v1.18.1", "symfony/polyfill-php73": "v1.18.1", "symfony/polyfill-php80": "v1.18.1", "symfony/polyfill-php81": "v1.26.0", "symfony/process": "v5.3.7", "symfony/service-contracts": "v2.2.0", "symfony/string": "v5.4.10", "symfony/translation": "v5.0.8", "symfony/translation-contracts": "v2.3.0", "symfony/var-exporter": "v5.4.10", "symfony/yaml": "v5.0.8", "tecnickcom/tcpdf": "6.3.5-p1", "true/punycode": "v2.1.1", "voku/portable-ascii": "1.5.3", "webmozart/assert": "1.11.0", "zbateson/mail-mime-parser": "1.3.1", "zbateson/mb-wrapper": "1.0.1", "zbateson/stream-decorators": "1.0.4" }, "extra": {"sha":"4a89ac9f981a148f5fc1c5e0b6b95be8bacf3c309da17594c837015f6b936b5a","sig":"oWWcM+yahzHR0RHyy4iOALpLtBVMY5Yr3gfQSyiP3O4tLmKFm8KPSq2JMQA6O6wF4svaeOk5dRG1EKXb2k7nj+BtDuE++jOhi7XwxmRk0BvwnpJyGZ8liFMICYJseJsh7mHQwVsR1OW6+Y7hUBZXZb01o15q51OqymTDRLkwq9tP\/cFgQ6KwoCo1x2M204vT3gzBzYESzbKOIKDiatVbkJqRfiQurGq4AGk0ifil9GyHRsyYZctNw2t0cL+XQFM0Th0DtLJc5xLw2\/5bsvBi3xboaY634XOvW3LeATXsvoRTXnVGrczP4tnrZpUsl\/GNP20R3R\/hVdh2reBJLW0l1A==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_8.7.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V8.7.0","fileSize":"113347873","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"LOz4em1u\/X8A5RJCyfzyScW2AV0TJqq0L+ILy2Evvs9uHAaDpjza1gWZzGYm\/F96azX\/7CQ9bg7DmX\/HOdw8CfuU60GsHT5wNLGrWI6J6ZpcpiHJlQK6LbKaFvmwZsiX6n9c4g+BZxQcWqNRvAFXxdsgBSfh77IdfKr8jE1y0YHUXLHPb5kBvoPHoDBgZUbIbttuF+\/tkxscED+UIZeKiG9\/L2WTz4zQ117BEo9y4aDlc8\/xR1gxPXmL8GMbckjqEIPi0jcgCPYN+CYFQGumOgqiYxlx+kZN8bHZH0QtQNHUnDMbVIxx5CZ\/t5t\/IrkaM+XlEkD2cp29eGzfixzfKw=="},"require":{"ionCubeLoader":"10.1.0"}} }, "8.7.0-release.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "8.7.0", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^7.2.0 || ^7.3.0 || ^7.4.0 || ~8.1.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-8.7.0-release.1.zip", "type": "zip" }, "time": "2023-03-20", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "1.1.0", "authorizenet/authorizenet": "1.9.9", "aws/aws-sdk-php": "3.138.0", "bitpay/php-client": "v3.0.0-p2", "brick/math": "0.8.15", "bshaffer/oauth2-server-httpfoundation-bridge": "v1.4-p1", "bshaffer/oauth2-server-php": "v1.11.1-p1", "cebe/php-openapi": "1.5.2", "composer/ca-bundle": "1.2.8", "composer/composer": "dev-v1.10.6-php72-php81-compat", "composer/semver": "1.5.1", "composer/spdx-licenses": "1.5.3", "composer/xdebug-handler": "1.4.3", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "1.10.4", "doctrine/inflector": "1.4.1", "doctrine/instantiator": "1.4.1", "doctrine/lexer": "1.2.0", "duosecurity/duo_php": "1.0.1", "egulias/email-validator": "2.1.22", "ezyang/htmlpurifier": "v4.12.0", "facebook/graph-sdk": "5.7.0", "filp/whoops": "2.14.3", "firebase/php-jwt": "v5.2.0", "goetas-webservices/xsd2php-runtime": "v0.2.12", "google/apiclient": "2.7.0-p1", "google/auth": "v1.11.1", "google/recaptcha": "1.2.4", "guzzlehttp/guzzle": "7.0.1", "guzzlehttp/promises": "1.4.0", "guzzlehttp/psr7": "1.6.1", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v7.12.0", "illuminate/container": "dev-v7.12.0-php72-php81-compat", "illuminate/contracts": "v7.12.0", "illuminate/database": "dev-v7.12.0-php72-php81-compat", "illuminate/events": "v7.12.0", "illuminate/filesystem": "v7.28.4", "illuminate/support": "v7.12.0", "illuminate/translation": "v7.28.4", "illuminate/validation": "v7.12.0", "jms/metadata": "1.7.0", "jms/parser-lib": "1.0.0", "jms/serializer": "dev-v1.14.1-php72-php81-compat", "justinrainbow/json-schema": "5.2.9", "knplabs/knp-menu": "v3.1.1", "laminas/laminas-diactoros": "2.3.1", "laminas/laminas-httphandlerrunner": "1.2.0", "laminas/laminas-loader": "2.6.1", "laminas/laminas-mail": "2.14.0-p1", "laminas/laminas-mime": "2.7.4", "laminas/laminas-stdlib": "3.3.0", "laminas/laminas-validator": "2.13.4", "laminas/laminas-zendframework-bridge": "1.1.1", "league/climate": "3.5.2", "league/flysystem": "1.0.67", "league/flysystem-aws-s3-v3": "1.0.24", "league/oauth2-client": "2.5.0", "league/oauth2-google": "3.0.3", "league/openapi-psr7-validator": "0.16.4", "league/plates": "3.3.0", "league/uri": "6.7.1", "league/uri-interfaces": "2.3.0", "michelf/php-markdown": "1.9.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "2.0.2", "mtdowling/jmespath.php": "2.6.0", "nesbot/carbon": "2.63.0", "nikic/fast-route": "v1.3.0", "paragonie/random_compat": "v9.99.100", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.2.0", "phpmyadmin/sql-parser": "5.3.1", "phpoption/phpoption": "1.7.3", "phpseclib/mcrypt_compat": "1.0.12", "phpseclib/phpseclib": "2.0.39", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-client": "1.0.1", "psr/http-factory": "1.0.1", "psr/http-message": "1.0.1", "psr/http-server-handler": "1.0.1", "psr/http-server-middleware": "1.0.1", "psr/log": "1.0.2", "psr/simple-cache": "1.0.1", "punic/punic": "3.5.1", "ralouphie/getallheaders": "3.0.3", "ramsey/collection": "1.0.1", "ramsey/uuid": "4.0.1", "react/promise": "v2.8.0", "respect/stringifier": "0.2.0", "respect/validation": "2.2.3", "riverline/multipart-parser": "2.0.9", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.8.0", "seld/phar-utils": "1.1.0", "smarty/smarty": "dev-v3.1.36-php72-php81-compat", "sonata-project/google-authenticator": "2.2.0", "stevenmaguire/oauth2-microsoft": "2.2.0", "stripe/stripe-php": "v7.34.0", "symfony/cache": "v5.1.11", "symfony/cache-contracts": "v2.5.2", "symfony/config": "v5.4.9", "symfony/console": "v5.4.12", "symfony/dependency-injection": "v5.1.7", "symfony/deprecation-contracts": "v2.2.0", "symfony/filesystem": "v5.0.8", "symfony/finder": "v5.3.7", "symfony/http-foundation": "v5.3.7", "symfony/mime": "v5.1.7", "symfony/polyfill-ctype": "v1.18.1", "symfony/polyfill-iconv": "v1.18.1", "symfony/polyfill-intl-grapheme": "v1.26.0", "symfony/polyfill-intl-idn": "v1.18.1", "symfony/polyfill-intl-normalizer": "v1.18.1", "symfony/polyfill-mbstring": "v1.18.1", "symfony/polyfill-php70": "v1.20.0", "symfony/polyfill-php72": "v1.18.1", "symfony/polyfill-php73": "v1.18.1", "symfony/polyfill-php80": "v1.18.1", "symfony/polyfill-php81": "v1.26.0", "symfony/process": "v5.3.7", "symfony/service-contracts": "v2.2.0", "symfony/string": "v5.4.10", "symfony/translation": "v5.0.8", "symfony/translation-contracts": "v2.3.0", "symfony/var-exporter": "v5.4.10", "symfony/yaml": "v5.0.8", "tecnickcom/tcpdf": "6.3.5-p1", "true/punycode": "v2.1.1", "voku/portable-ascii": "1.5.3", "webmozart/assert": "1.11.0", "zbateson/mail-mime-parser": "1.3.1", "zbateson/mb-wrapper": "1.0.1", "zbateson/stream-decorators": "1.0.4" }, "extra": {"sha":"10778dd22b1cacacc29e0678d2630c0c10f994ffbd0c6b2648239df7591e58da","sig":"D8mn7DEhV\/ELE10n7uox9ELsRiZSuQy7UnoWhQqiWeko+dS+NiiE+F6i68b\/rHjxMNTcQ6mnFWElqS1sVPPbykXUOAtDz+gdgHzQZjo5hCAUI4yd\/oEQorHZt1YsUMdZdgXaUk2UxaOaEKtlx5hydwmYvdG3rv8aB3kSyUMkvJ+vZYtBe47i9Jm6faFS5DP4+kx\/g4LV+FMVFl9fisHpJRLzmuphZJoBBxXrrrH7x8QUexINHlcimx\/ZLD32PAwCm+97Xdb4WrrCD9uLfjSnW7EdTN07iiqxv+fh0JtH7qLKnb0C3c4vTEpZD5zpjBCqKPs2Q8v5sUK4S8U\/cMMXVQ==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_8.7.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V8.7.0","fileSize":"116406928","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"NFvhxpBVc059rWEAmTB92Sxx6YRjO\/xriKa5wU93+Pbp7HQl3BueACtpn8VzJIHFP8ZgLuCz71+zwtGIWjGP+A9M6czZ4Hqt6fw\/Lo7s+mu7+Mv1+Hp73J+yGfW5JATte0B2HIm44Yi8pUfkyuEc0ANtSH0qd06oaj+3O9zl04nhfkgUX9XG68DziPIt6xjaODaq3X+D9LCYEQnVIpDLRwlQb5ZcmLwxTwfGFpF5N+8AFZ5VJ9+YucLqVIz+rjITsvk\/HAmqeRtn\/FRtMPcWWc9VP+gZOomRc\/9sRHKo4R0Dgko0XdW\/zhjdAjswWYFoIQ\/gl2g1UVVVJgCF0xws8A=="},"require":{"ionCubeLoader":"10.1.0"}} }, "8.7.0-rc.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "8.7.0-RC.1", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^7.2.0 || ^7.3.0 || ^7.4.0 || ~8.1.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-8.7.0-rc.1.zip", "type": "zip" }, "time": "2023-02-21", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "1.1.0", "authorizenet/authorizenet": "1.9.9", "aws/aws-sdk-php": "3.138.0", "bitpay/php-client": "v3.0.0-p2", "brick/math": "0.8.15", "bshaffer/oauth2-server-httpfoundation-bridge": "v1.4-p1", "bshaffer/oauth2-server-php": "v1.11.1-p1", "cebe/php-openapi": "1.5.2", "composer/ca-bundle": "1.2.8", "composer/composer": "dev-v1.10.6-php72-php81-compat", "composer/semver": "1.5.1", "composer/spdx-licenses": "1.5.3", "composer/xdebug-handler": "1.4.3", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "1.10.4", "doctrine/inflector": "1.4.1", "doctrine/instantiator": "1.4.1", "doctrine/lexer": "1.2.0", "duosecurity/duo_php": "1.0.1", "egulias/email-validator": "2.1.22", "ezyang/htmlpurifier": "v4.12.0", "facebook/graph-sdk": "5.7.0", "filp/whoops": "2.14.3", "firebase/php-jwt": "v5.2.0", "goetas-webservices/xsd2php-runtime": "v0.2.12", "google/apiclient": "2.7.0-p1", "google/auth": "v1.11.1", "google/recaptcha": "1.2.4", "guzzlehttp/guzzle": "7.0.1", "guzzlehttp/promises": "1.4.0", "guzzlehttp/psr7": "1.6.1", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v7.12.0", "illuminate/container": "dev-v7.12.0-php72-php81-compat", "illuminate/contracts": "v7.12.0", "illuminate/database": "dev-v7.12.0-php72-php81-compat", "illuminate/events": "v7.12.0", "illuminate/filesystem": "v7.28.4", "illuminate/support": "v7.12.0", "illuminate/translation": "v7.28.4", "illuminate/validation": "v7.12.0", "jms/metadata": "1.7.0", "jms/parser-lib": "1.0.0", "jms/serializer": "dev-v1.14.1-php72-php81-compat", "justinrainbow/json-schema": "5.2.9", "knplabs/knp-menu": "v3.1.1", "laminas/laminas-diactoros": "2.3.1", "laminas/laminas-httphandlerrunner": "1.2.0", "laminas/laminas-loader": "2.6.1", "laminas/laminas-mail": "2.14.0-p1", "laminas/laminas-mime": "2.7.4", "laminas/laminas-stdlib": "3.3.0", "laminas/laminas-validator": "2.13.4", "laminas/laminas-zendframework-bridge": "1.1.1", "league/climate": "3.5.2", "league/flysystem": "1.0.67", "league/flysystem-aws-s3-v3": "1.0.24", "league/oauth2-client": "2.5.0", "league/oauth2-google": "3.0.3", "league/openapi-psr7-validator": "0.16.4", "league/plates": "3.3.0", "league/uri": "6.7.1", "league/uri-interfaces": "2.3.0", "michelf/php-markdown": "1.9.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "2.0.2", "mtdowling/jmespath.php": "2.6.0", "nesbot/carbon": "2.63.0", "nikic/fast-route": "v1.3.0", "paragonie/random_compat": "v9.99.100", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.2.0", "phpmyadmin/sql-parser": "5.3.1", "phpoption/phpoption": "1.7.3", "phpseclib/mcrypt_compat": "1.0.12", "phpseclib/phpseclib": "2.0.39", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-client": "1.0.1", "psr/http-factory": "1.0.1", "psr/http-message": "1.0.1", "psr/http-server-handler": "1.0.1", "psr/http-server-middleware": "1.0.1", "psr/log": "1.0.2", "psr/simple-cache": "1.0.1", "punic/punic": "3.5.1", "ralouphie/getallheaders": "3.0.3", "ramsey/collection": "1.0.1", "ramsey/uuid": "4.0.1", "react/promise": "v2.8.0", "respect/stringifier": "0.2.0", "respect/validation": "2.2.3", "riverline/multipart-parser": "2.0.9", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.8.0", "seld/phar-utils": "1.1.0", "smarty/smarty": "dev-v3.1.36-php72-php81-compat", "sonata-project/google-authenticator": "2.2.0", "stevenmaguire/oauth2-microsoft": "2.2.0", "stripe/stripe-php": "v7.34.0", "symfony/cache": "v5.1.11", "symfony/cache-contracts": "v2.5.2", "symfony/config": "v5.4.9", "symfony/console": "v5.4.12", "symfony/dependency-injection": "v5.1.7", "symfony/deprecation-contracts": "v2.2.0", "symfony/filesystem": "v5.0.8", "symfony/finder": "v5.3.7", "symfony/http-foundation": "v5.3.7", "symfony/mime": "v5.1.7", "symfony/polyfill-ctype": "v1.18.1", "symfony/polyfill-iconv": "v1.18.1", "symfony/polyfill-intl-grapheme": "v1.26.0", "symfony/polyfill-intl-idn": "v1.18.1", "symfony/polyfill-intl-normalizer": "v1.18.1", "symfony/polyfill-mbstring": "v1.18.1", "symfony/polyfill-php70": "v1.20.0", "symfony/polyfill-php72": "v1.18.1", "symfony/polyfill-php73": "v1.18.1", "symfony/polyfill-php80": "v1.18.1", "symfony/polyfill-php81": "v1.26.0", "symfony/process": "v5.3.7", "symfony/service-contracts": "v2.2.0", "symfony/string": "v5.4.10", "symfony/translation": "v5.0.8", "symfony/translation-contracts": "v2.3.0", "symfony/var-exporter": "v5.4.10", "symfony/yaml": "v5.0.8", "tecnickcom/tcpdf": "6.3.5-p1", "true/punycode": "v2.1.1", "voku/portable-ascii": "1.5.3", "webmozart/assert": "1.11.0", "zbateson/mail-mime-parser": "1.3.1", "zbateson/mb-wrapper": "1.0.1", "zbateson/stream-decorators": "1.0.4" }, "extra": {"sha":"56d091ec8dc0499cea9cffabe66e9044e8396c56ad0be9bba275fcb1fb106434","sig":"FjD4d\/BEH3lrdi9x9DkLqXIgPXuDFXWFOlGh1wPl\/u8d5meBP9qm9ZXgyYuGR6ItF5rKRoxnp\/0VFzekhyK9YRJfvmkEjmz98WR\/xHQHWlIJOiWwoBga\/YQcfdxylL6RANd9VH1dBwksZqaqKFyycTEZcN3Fc4EbBsJLVRgfPLHkPtIp5RI39iuiI1G4MOo+uOSU459AtzK9xH\/8C2U\/kbru5ddD7Mrjs8cE7EnNSOV0C0UkOeKLbexzHz2\/QVAvxtvK3f5PILOk0lnFVcKKY3A5onAnVQrDx81TmWuklorivTIR15+TbGVE7Xa4RzDUTUH47\/31SUMcBXs9IYw56A==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_8.7.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V8.7.0","fileSize":"109507842","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"niSQDnjStrhWkViMYSOkuRWTW2UlmXqh1xiXZAw8Obk2spQSuaq1lg+fuwIQAePa6bnRPIyFoxkgQlMilMnDx17cqMKhvMntWDTVJZfJt8bdYLsIQHzdRcLOiNQrZmwt73UmiDWYeWM\/siasD5rS0XQAbv4U1MJBCEj5Q37bODY8A+zfpfFgTHtw2Hw\/PIvF59LlqnSzK7\/KX9vBDeSUU+cxEg1LjIjIaFPCbLTXChW10py1PomfQpTDz\/plXEcSQOCpxPJNdUmNLB9zZd1rNoux10JSbswXwtodAKMmCuFxV0oqiLOygAdtiRSE4JhaBf4YdGmLeQisUFr3kM9avw=="},"require":{"ionCubeLoader":"10.1.0"}} }, "8.7.0-beta.2": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "8.7.0-beta.2", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^7.2.0 || ^7.3.0 || ^7.4.0 || ~8.1.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-8.7.0-beta.2.zip", "type": "zip" }, "time": "2023-01-23", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "1.1.0", "authorizenet/authorizenet": "1.9.9", "aws/aws-sdk-php": "3.138.0", "bitpay/php-client": "v3.0.0-p2", "brick/math": "0.8.15", "bshaffer/oauth2-server-httpfoundation-bridge": "v1.4-p1", "bshaffer/oauth2-server-php": "v1.11.1-p1", "cebe/php-openapi": "1.5.2", "composer/ca-bundle": "1.2.8", "composer/composer": "dev-v1.10.6-php72-php81-compat", "composer/semver": "1.5.1", "composer/spdx-licenses": "1.5.3", "composer/xdebug-handler": "1.4.3", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "1.10.4", "doctrine/inflector": "1.4.1", "doctrine/instantiator": "1.4.1", "doctrine/lexer": "1.2.0", "duosecurity/duo_php": "1.0.1", "egulias/email-validator": "2.1.22", "ezyang/htmlpurifier": "v4.12.0", "facebook/graph-sdk": "5.7.0", "filp/whoops": "2.14.3", "firebase/php-jwt": "v5.2.0", "goetas-webservices/xsd2php-runtime": "v0.2.12", "google/apiclient": "2.7.0-p1", "google/auth": "v1.11.1", "google/recaptcha": "1.2.4", "guzzlehttp/guzzle": "7.0.1", "guzzlehttp/promises": "1.4.0", "guzzlehttp/psr7": "1.6.1", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v7.12.0", "illuminate/container": "dev-v7.12.0-php72-php81-compat", "illuminate/contracts": "v7.12.0", "illuminate/database": "dev-v7.12.0-php72-php81-compat", "illuminate/events": "v7.12.0", "illuminate/filesystem": "v7.28.4", "illuminate/support": "v7.12.0", "illuminate/translation": "v7.28.4", "illuminate/validation": "v7.12.0", "jms/metadata": "1.7.0", "jms/parser-lib": "1.0.0", "jms/serializer": "dev-v1.14.1-php72-php81-compat", "justinrainbow/json-schema": "5.2.9", "knplabs/knp-menu": "v3.1.1", "laminas/laminas-diactoros": "2.3.1", "laminas/laminas-httphandlerrunner": "1.2.0", "laminas/laminas-loader": "2.6.1", "laminas/laminas-mail": "2.14.0-p1", "laminas/laminas-mime": "2.7.4", "laminas/laminas-stdlib": "3.3.0", "laminas/laminas-validator": "2.13.4", "laminas/laminas-zendframework-bridge": "1.1.1", "league/climate": "3.5.2", "league/flysystem": "1.0.67", "league/flysystem-aws-s3-v3": "1.0.24", "league/oauth2-client": "2.5.0", "league/oauth2-google": "3.0.3", "league/openapi-psr7-validator": "0.16.4", "league/plates": "3.3.0", "league/uri": "6.7.1", "league/uri-interfaces": "2.3.0", "michelf/php-markdown": "1.9.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "2.0.2", "mtdowling/jmespath.php": "2.6.0", "nesbot/carbon": "2.63.0", "nikic/fast-route": "v1.3.0", "paragonie/random_compat": "v9.99.100", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.2.0", "phpmyadmin/sql-parser": "5.3.1", "phpoption/phpoption": "1.7.3", "phpseclib/mcrypt_compat": "1.0.12", "phpseclib/phpseclib": "2.0.39", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-client": "1.0.1", "psr/http-factory": "1.0.1", "psr/http-message": "1.0.1", "psr/http-server-handler": "1.0.1", "psr/http-server-middleware": "1.0.1", "psr/log": "1.0.2", "psr/simple-cache": "1.0.1", "punic/punic": "3.5.1", "ralouphie/getallheaders": "3.0.3", "ramsey/collection": "1.0.1", "ramsey/uuid": "4.0.1", "react/promise": "v2.8.0", "respect/stringifier": "0.2.0", "respect/validation": "2.2.3", "riverline/multipart-parser": "2.0.9", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.8.0", "seld/phar-utils": "1.1.0", "smarty/smarty": "dev-v3.1.36-php72-php81-compat", "sonata-project/google-authenticator": "2.2.0", "stevenmaguire/oauth2-microsoft": "2.2.0", "stripe/stripe-php": "v7.34.0", "symfony/cache": "v5.1.11", "symfony/cache-contracts": "v2.5.2", "symfony/config": "v5.4.9", "symfony/console": "v5.4.12", "symfony/dependency-injection": "v5.1.7", "symfony/deprecation-contracts": "v2.2.0", "symfony/filesystem": "v5.0.8", "symfony/finder": "v5.3.7", "symfony/http-foundation": "v5.3.7", "symfony/mime": "v5.1.7", "symfony/polyfill-ctype": "v1.18.1", "symfony/polyfill-iconv": "v1.18.1", "symfony/polyfill-intl-grapheme": "v1.26.0", "symfony/polyfill-intl-idn": "v1.18.1", "symfony/polyfill-intl-normalizer": "v1.18.1", "symfony/polyfill-mbstring": "v1.18.1", "symfony/polyfill-php70": "v1.20.0", "symfony/polyfill-php72": "v1.18.1", "symfony/polyfill-php73": "v1.18.1", "symfony/polyfill-php80": "v1.18.1", "symfony/polyfill-php81": "v1.26.0", "symfony/process": "v5.3.7", "symfony/service-contracts": "v2.2.0", "symfony/string": "v5.4.10", "symfony/translation": "v5.0.8", "symfony/translation-contracts": "v2.3.0", "symfony/var-exporter": "v5.4.10", "symfony/yaml": "v5.0.8", "tecnickcom/tcpdf": "6.3.5-p1", "true/punycode": "v2.1.1", "voku/portable-ascii": "1.5.3", "webmozart/assert": "1.11.0", "zbateson/mail-mime-parser": "1.3.1", "zbateson/mb-wrapper": "1.0.1", "zbateson/stream-decorators": "1.0.4" }, "extra": {"sha":"1aa8217eeff9281bbac781cc354fd826fc7502d76bd0d8402917b8d35e36ce92","sig":"auZAiBY+XKMIaBJL3mkf7V31p0ULAYTJ6KxQ4ysQ6RCGmRL6poajlKfpb4EfUUp0mL1h41+9HwZGqOS+HWU7ygROzMOgvKAZ6bHIm0Sw6O5ymGpDZYyyGuHtxG\/7TBkt1f07rtzRAJ0SS9gU1+g1o+bGRP5HUGpYhLauQtdnc0oG0blHpPpz2tD4r6A+0v2Psc2iSrXQyZ5D579cBbC8oEeEKS2DYolFBirZ\/9+t3ZfdXkmq\/D3eqKjAn8o69kDz9qUX4b49ffRfjdqGVZNe2TF+Uhmmryfi3qvmSUntZ9uqrtEoORDKdw2rU9ddMFFHtMTIb8vRqNNDSWQvxzMAMg==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_8.7.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V8.7.0","fileSize":"110202413","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"ouAHiqarARO5TgA912e8w1vPyWGKidMSvv52pjTZi1OjIYi\/qZ3d\/asiywyeey3qbEGQZUFSxjLuFBNllwBv+VVFAJeqj3Kk\/+jb5XCaZK77nfU46KnzDy5zvmoYAnY8ejlFGYbGsPBEhE6TR+A5Nrs1mLKO3z5wkGq3WVRSXjW+3gcPp\/g8lDz84DNDfUxb1r4B4AmFg7Ynqxn1sON2HxIFQ1kwkTftnE3IGtYoeXj5QpevVT4\/RzDgOq2DyYG7mCv\/SSF7fBtMQyIh0ZRHiXpguRilG5z7bcwbXPGeHGoE1T72scdIIj3kC0RlV2Q6CreOYjh0ZBZBEYPPmcH9MA=="},"require":{"ionCubeLoader":"10.1.0"}} }, "8.7.0-beta.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "8.7.0-beta.1", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^7.2.0 || ^7.3.0 || ^7.4.0 || ~8.1.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-8.7.0-beta.1.zip", "type": "zip" }, "time": "2022-12-19", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "1.1.0", "authorizenet/authorizenet": "1.9.9", "aws/aws-sdk-php": "3.138.0", "bitpay/php-client": "v3.0.0-p2", "brick/math": "0.8.15", "bshaffer/oauth2-server-httpfoundation-bridge": "v1.4-p1", "bshaffer/oauth2-server-php": "v1.11.1-p1", "cebe/php-openapi": "1.5.2", "composer/ca-bundle": "1.2.8", "composer/composer": "dev-v1.10.6-php72-php81-compat", "composer/semver": "1.5.1", "composer/spdx-licenses": "1.5.3", "composer/xdebug-handler": "1.4.3", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "1.10.4", "doctrine/inflector": "1.4.1", "doctrine/instantiator": "1.4.1", "doctrine/lexer": "1.2.0", "duosecurity/duo_php": "1.0.1", "egulias/email-validator": "2.1.22", "ezyang/htmlpurifier": "v4.12.0", "facebook/graph-sdk": "5.7.0", "filp/whoops": "2.14.3", "firebase/php-jwt": "v5.2.0", "goetas-webservices/xsd2php-runtime": "v0.2.12", "google/apiclient": "2.7.0-p1", "google/auth": "v1.11.1", "google/recaptcha": "1.2.4", "guzzlehttp/guzzle": "7.0.1", "guzzlehttp/promises": "1.4.0", "guzzlehttp/psr7": "1.6.1", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v7.12.0", "illuminate/container": "dev-v7.12.0-php72-php81-compat", "illuminate/contracts": "v7.12.0", "illuminate/database": "dev-v7.12.0-php72-php81-compat", "illuminate/events": "v7.12.0", "illuminate/filesystem": "v7.28.4", "illuminate/support": "v7.12.0", "illuminate/translation": "v7.28.4", "illuminate/validation": "v7.12.0", "jms/metadata": "1.7.0", "jms/parser-lib": "1.0.0", "jms/serializer": "dev-v1.14.1-php72-php81-compat", "justinrainbow/json-schema": "5.2.9", "knplabs/knp-menu": "v3.1.1", "laminas/laminas-diactoros": "2.3.1", "laminas/laminas-httphandlerrunner": "1.2.0", "laminas/laminas-loader": "2.6.1", "laminas/laminas-mail": "2.14.0-p1", "laminas/laminas-mime": "2.7.4", "laminas/laminas-stdlib": "3.3.0", "laminas/laminas-validator": "2.13.4", "laminas/laminas-zendframework-bridge": "1.1.1", "league/climate": "3.5.2", "league/flysystem": "1.0.67", "league/flysystem-aws-s3-v3": "1.0.24", "league/oauth2-client": "2.5.0", "league/oauth2-google": "3.0.3", "league/openapi-psr7-validator": "0.16.4", "league/plates": "3.3.0", "league/uri": "6.7.1", "league/uri-interfaces": "2.3.0", "michelf/php-markdown": "1.9.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "2.0.2", "mtdowling/jmespath.php": "2.6.0", "nesbot/carbon": "2.63.0", "nikic/fast-route": "v1.3.0", "paragonie/random_compat": "v9.99.100", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.2.0", "phpmyadmin/sql-parser": "5.3.1", "phpoption/phpoption": "1.7.3", "phpseclib/mcrypt_compat": "1.0.12", "phpseclib/phpseclib": "2.0.27", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-client": "1.0.1", "psr/http-factory": "1.0.1", "psr/http-message": "1.0.1", "psr/http-server-handler": "1.0.1", "psr/http-server-middleware": "1.0.1", "psr/log": "1.0.2", "psr/simple-cache": "1.0.1", "punic/punic": "3.5.1", "ralouphie/getallheaders": "3.0.3", "ramsey/collection": "1.0.1", "ramsey/uuid": "4.0.1", "react/promise": "v2.8.0", "respect/stringifier": "0.2.0", "respect/validation": "2.2.3", "riverline/multipart-parser": "2.0.9", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.8.0", "seld/phar-utils": "1.1.0", "smarty/smarty": "dev-v3.1.36-php72-php81-compat", "sonata-project/google-authenticator": "2.2.0", "stevenmaguire/oauth2-microsoft": "2.2.0", "stripe/stripe-php": "v7.34.0", "symfony/cache": "v5.1.11", "symfony/cache-contracts": "v2.5.2", "symfony/config": "v5.4.9", "symfony/console": "v5.4.12", "symfony/dependency-injection": "v5.1.7", "symfony/deprecation-contracts": "v2.2.0", "symfony/filesystem": "v5.0.8", "symfony/finder": "v5.3.7", "symfony/http-foundation": "v5.3.7", "symfony/mime": "v5.1.7", "symfony/polyfill-ctype": "v1.18.1", "symfony/polyfill-iconv": "v1.18.1", "symfony/polyfill-intl-grapheme": "v1.26.0", "symfony/polyfill-intl-idn": "v1.18.1", "symfony/polyfill-intl-normalizer": "v1.18.1", "symfony/polyfill-mbstring": "v1.18.1", "symfony/polyfill-php70": "v1.20.0", "symfony/polyfill-php72": "v1.18.1", "symfony/polyfill-php73": "v1.18.1", "symfony/polyfill-php80": "v1.18.1", "symfony/polyfill-php81": "v1.26.0", "symfony/process": "v5.3.7", "symfony/service-contracts": "v2.2.0", "symfony/string": "v5.4.10", "symfony/translation": "v5.0.8", "symfony/translation-contracts": "v2.3.0", "symfony/var-exporter": "v5.4.10", "symfony/yaml": "v5.0.8", "tecnickcom/tcpdf": "6.3.5-p1", "true/punycode": "v2.1.1", "voku/portable-ascii": "1.5.3", "webmozart/assert": "1.11.0", "zbateson/mail-mime-parser": "1.3.1", "zbateson/mb-wrapper": "1.0.1", "zbateson/stream-decorators": "1.0.4" }, "extra": {"sha":"0233a6f226a035587960eedd5e8de708fa6f3cddb63d8f5aa0ae7d9ec55ad057","sig":"c6qLvHM0LpN09aQE8wEwdurCrTRCly10Z1uTtPWr6Xukw1EmOQm+In4RA4VL3I30B72ziYz6zOCm18BGavBjudu9KR+Ey0ecfWpWTa0gnbzDpKP9qkYnCITx2QWUsaobKApNMzzrbOMyk53uWb4n5JeEcJ+WwEXzIDhGVJweqANalydGZQaS7KEglEfCCRiYw2CYPwFTCqmAb06bQb\/d7K2pqrTKherjBB+DFCgExzgemUEIbsqm+3ex9MLAqwziY5XrGXZNWBs4fVHrGfB+rV2UJ5v8sEr1yln0yxO7S0NJ5FdgvzR\/ut4f+KSj3ojy4idWi7DWHYgiDe6DpFLwZg==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_8.7.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V8.7.0","fileSize":"109418528","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"ADLIYco5wQMNIXUMY\/pkJCqcT8BAnkZzRP9wJ5G7ooeNTXzlkGMlJxjoBv9HzkdMw9zsC3NYRD8Ga1zKGv7IW+l\/f9Sn9EBgyjg2VEPtx0zldLiFc+iLpslqzt2Ox7AC7B3m3i6w15cQZ18NYnwkTaAhLef9wl9TJ5c+TWqBozXt+xfDujEKw9skwgmH4s3Q1ZQfaqWwp6BV0quyAisOtw+2vFq+log\/p5Gv1NDq\/jbHZUTFN9XSg+aUNqzz0BQsUYmFnejtzRqepV28vDg97qXSi5GcjhzXnw0lBhFLevLoyxdD3Xdx3xgltKkGuuRLplVn29\/aKolP1zc1GDIS1A=="},"require":{"ionCubeLoader":"10.1.0"}} }, "8.6.2-release.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "8.6.2", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^7.2.0 || ^7.3.0 || ^7.4.0 || ~8.1.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-8.6.2-release.1.zip", "type": "zip" }, "time": "2023-06-14", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "1.1.0", "authorizenet/authorizenet": "1.9.9", "aws/aws-sdk-php": "3.138.0", "bitpay/php-client": "v3.0.0-p2", "brick/math": "0.8.15", "bshaffer/oauth2-server-httpfoundation-bridge": "v1.4-p1", "bshaffer/oauth2-server-php": "v1.11.1-p1", "cebe/php-openapi": "1.5.2", "composer/ca-bundle": "1.2.8", "composer/composer": "dev-v1.10.6-php72-php81-compat", "composer/semver": "1.5.1", "composer/spdx-licenses": "1.5.3", "composer/xdebug-handler": "1.4.3", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "1.10.4", "doctrine/inflector": "1.4.1", "doctrine/instantiator": "1.4.1", "doctrine/lexer": "1.2.0", "duosecurity/duo_php": "1.0.1", "egulias/email-validator": "2.1.22", "ezyang/htmlpurifier": "v4.12.0", "facebook/graph-sdk": "5.7.0", "filp/whoops": "2.14.3", "firebase/php-jwt": "v5.2.0", "goetas-webservices/xsd2php-runtime": "v0.2.12", "google/apiclient": "2.7.0-p1", "google/auth": "v1.11.1", "google/recaptcha": "1.2.4", "guzzlehttp/guzzle": "7.0.1", "guzzlehttp/promises": "1.4.0", "guzzlehttp/psr7": "1.6.1", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v7.12.0", "illuminate/container": "dev-v7.12.0-php72-php81-compat", "illuminate/contracts": "v7.12.0", "illuminate/database": "dev-v7.12.0-php72-php81-compat", "illuminate/events": "v7.12.0", "illuminate/filesystem": "v7.28.4", "illuminate/support": "v7.12.0", "illuminate/translation": "v7.28.4", "illuminate/validation": "v7.12.0", "jms/metadata": "1.7.0", "jms/parser-lib": "1.0.0", "jms/serializer": "dev-v1.14.1-php72-php81-compat", "justinrainbow/json-schema": "5.2.9", "knplabs/knp-menu": "v3.1.1", "laminas/laminas-diactoros": "2.3.1", "laminas/laminas-httphandlerrunner": "1.2.0", "laminas/laminas-loader": "2.6.1", "laminas/laminas-mail": "2.14.0-p1", "laminas/laminas-mime": "2.7.4", "laminas/laminas-stdlib": "3.3.0", "laminas/laminas-validator": "2.13.4", "laminas/laminas-zendframework-bridge": "1.1.1", "league/climate": "3.5.2", "league/flysystem": "1.0.67", "league/flysystem-aws-s3-v3": "1.0.24", "league/oauth2-client": "2.5.0", "league/oauth2-google": "3.0.3", "league/openapi-psr7-validator": "0.16.4", "league/plates": "3.3.0", "league/uri": "6.7.1", "league/uri-interfaces": "2.3.0", "michelf/php-markdown": "1.9.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "2.0.2", "mtdowling/jmespath.php": "2.6.0", "nesbot/carbon": "2.51.0", "nikic/fast-route": "v1.3.0", "paragonie/random_compat": "v9.99.100", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.2.0", "phpmyadmin/sql-parser": "5.3.1", "phpoption/phpoption": "1.7.3", "phpseclib/mcrypt_compat": "1.0.12", "phpseclib/phpseclib": "2.0.27", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-client": "1.0.1", "psr/http-factory": "1.0.1", "psr/http-message": "1.0.1", "psr/http-server-handler": "1.0.1", "psr/http-server-middleware": "1.0.1", "psr/log": "1.0.2", "psr/simple-cache": "1.0.1", "punic/punic": "3.5.1", "ralouphie/getallheaders": "3.0.3", "ramsey/collection": "1.0.1", "ramsey/uuid": "4.0.1", "react/promise": "v2.8.0", "respect/stringifier": "0.2.0", "respect/validation": "2.2.3", "riverline/multipart-parser": "2.0.9", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.8.0", "seld/phar-utils": "1.1.0", "smarty/smarty": "dev-v3.1.36-php72-php81-compat", "sonata-project/google-authenticator": "2.2.0", "stevenmaguire/oauth2-microsoft": "2.2.0", "stripe/stripe-php": "v7.34.0", "symfony/cache": "v5.1.11", "symfony/cache-contracts": "v2.5.2", "symfony/config": "v5.4.9", "symfony/console": "v5.4.12", "symfony/dependency-injection": "v5.1.7", "symfony/deprecation-contracts": "v2.2.0", "symfony/filesystem": "v5.0.8", "symfony/finder": "v5.3.7", "symfony/http-foundation": "v5.3.7", "symfony/mime": "v5.1.7", "symfony/polyfill-ctype": "v1.18.1", "symfony/polyfill-iconv": "v1.18.1", "symfony/polyfill-intl-grapheme": "v1.26.0", "symfony/polyfill-intl-idn": "v1.18.1", "symfony/polyfill-intl-normalizer": "v1.18.1", "symfony/polyfill-mbstring": "v1.18.1", "symfony/polyfill-php70": "v1.20.0", "symfony/polyfill-php72": "v1.18.1", "symfony/polyfill-php73": "v1.18.1", "symfony/polyfill-php80": "v1.18.1", "symfony/polyfill-php81": "v1.26.0", "symfony/process": "v5.3.7", "symfony/service-contracts": "v2.2.0", "symfony/string": "v5.4.10", "symfony/translation": "v5.0.8", "symfony/translation-contracts": "v2.3.0", "symfony/var-exporter": "v5.4.10", "symfony/yaml": "v5.0.8", "tecnickcom/tcpdf": "6.3.5-p1", "true/punycode": "v2.1.1", "voku/portable-ascii": "1.5.3", "webmozart/assert": "1.11.0", "zbateson/mail-mime-parser": "1.3.1", "zbateson/mb-wrapper": "1.0.1", "zbateson/stream-decorators": "1.0.4" }, "extra": {"sha":"00f79dd4dd034ca355b6d01b5333bb2d5453e09d0603c7396e539b2e8bdfe27a","sig":"AORyQXt06h9Bqb4p2xRr0bd2tqQfMebLIKOhEBEaoU0tCjOtfMio+T21XiA\/qptCfm+YDKgdz3YO5YuCBMNOH2kDi00VGyuO\/MDmUU3IC+EZFFBpy3gR5ETxiYwY2i797khj9SJWsZ3yDiT75Pmsk5rr+TMEXXakJiAisdPfOfqxeGWeAGWenV\/5BoFUZ4PpwImchGlgTVPv3OUw1EPbH3MN0NMoDSaXMfIyZGC8VeY9iWvWiRZ3R2o44F73njT2HjZCqBFMGBPqIZxd4TiYOd5BulhgKhAh4KDRlEWX16xTQvJ4JNnAQ42on2OWLpvseI\/s9sn0H8y0EJ\/aBoxdFA==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_8.6.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V8.6.0","fileSize":"107181644","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"Xo2wKbX2D9Uz3pb6A8IS9c4EpZBJfAVZHOuRLGO10m7ro\/Cvosg1x+ySwxyvOZWfEsLWmVi56h6nYbLCgU\/cZ7BskJSZNlpC3WMLnDHGMuAlUqMlSJUvAOl7iuK8awM6AEgKqOo41smXlrKt3WH6FNC+zet6OMntjZtMIP3SmOYT83lGfCPpOAHMEs3k\/VJY1pedu3uijltMNquvyVxMzrkz\/bSgtrQg6sl8Xx9KWvDNzcKX1Y7kyG5yxY4DgduKkv+0iLaiAwiHP6EFeSp1nK3H4PTJ8jhZx+mC1L+VCJxEYGkVSEXsv9xx0SI9Y8m0IJj2OStgJyJQSXh6zTxeJw=="},"require":{"ionCubeLoader":"10.1.0"}} }, "8.6.1-release.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "8.6.1", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^7.2.0 || ^7.3.0 || ^7.4.0 || ~8.1.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-8.6.1-release.1.zip", "type": "zip" }, "time": "2022-11-29", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "1.1.0", "authorizenet/authorizenet": "1.9.9", "aws/aws-sdk-php": "3.138.0", "bitpay/php-client": "v3.0.0-p2", "brick/math": "0.8.15", "bshaffer/oauth2-server-httpfoundation-bridge": "v1.4-p1", "bshaffer/oauth2-server-php": "v1.11.1-p1", "cebe/php-openapi": "1.5.2", "composer/ca-bundle": "1.2.8", "composer/composer": "dev-v1.10.6-php72-php81-compat", "composer/semver": "1.5.1", "composer/spdx-licenses": "1.5.3", "composer/xdebug-handler": "1.4.3", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "1.10.4", "doctrine/inflector": "1.4.1", "doctrine/instantiator": "1.4.1", "doctrine/lexer": "1.2.0", "duosecurity/duo_php": "1.0.1", "egulias/email-validator": "2.1.22", "ezyang/htmlpurifier": "v4.12.0", "facebook/graph-sdk": "5.7.0", "filp/whoops": "2.14.3", "firebase/php-jwt": "v5.2.0", "goetas-webservices/xsd2php-runtime": "v0.2.12", "google/apiclient": "2.7.0-p1", "google/auth": "v1.11.1", "google/recaptcha": "1.2.4", "guzzlehttp/guzzle": "7.0.1", "guzzlehttp/promises": "1.4.0", "guzzlehttp/psr7": "1.6.1", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v7.12.0", "illuminate/container": "dev-v7.12.0-php72-php81-compat", "illuminate/contracts": "v7.12.0", "illuminate/database": "dev-v7.12.0-php72-php81-compat", "illuminate/events": "v7.12.0", "illuminate/filesystem": "v7.28.4", "illuminate/support": "v7.12.0", "illuminate/translation": "v7.28.4", "illuminate/validation": "v7.12.0", "jms/metadata": "1.7.0", "jms/parser-lib": "1.0.0", "jms/serializer": "dev-v1.14.1-php72-php81-compat", "justinrainbow/json-schema": "5.2.9", "knplabs/knp-menu": "v3.1.1", "laminas/laminas-diactoros": "2.3.1", "laminas/laminas-httphandlerrunner": "1.2.0", "laminas/laminas-loader": "2.6.1", "laminas/laminas-mail": "2.14.0-p1", "laminas/laminas-mime": "2.7.4", "laminas/laminas-stdlib": "3.3.0", "laminas/laminas-validator": "2.13.4", "laminas/laminas-zendframework-bridge": "1.1.1", "league/climate": "3.5.2", "league/flysystem": "1.0.67", "league/flysystem-aws-s3-v3": "1.0.24", "league/oauth2-client": "2.5.0", "league/oauth2-google": "3.0.3", "league/openapi-psr7-validator": "0.16.4", "league/plates": "3.3.0", "league/uri": "6.7.1", "league/uri-interfaces": "2.3.0", "michelf/php-markdown": "1.9.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "2.0.2", "mtdowling/jmespath.php": "2.6.0", "nesbot/carbon": "2.51.0", "nikic/fast-route": "v1.3.0", "paragonie/random_compat": "v9.99.100", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.2.0", "phpmyadmin/sql-parser": "5.3.1", "phpoption/phpoption": "1.7.3", "phpseclib/mcrypt_compat": "1.0.12", "phpseclib/phpseclib": "2.0.27", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-client": "1.0.1", "psr/http-factory": "1.0.1", "psr/http-message": "1.0.1", "psr/http-server-handler": "1.0.1", "psr/http-server-middleware": "1.0.1", "psr/log": "1.0.2", "psr/simple-cache": "1.0.1", "punic/punic": "3.5.1", "ralouphie/getallheaders": "3.0.3", "ramsey/collection": "1.0.1", "ramsey/uuid": "4.0.1", "react/promise": "v2.8.0", "respect/stringifier": "0.2.0", "respect/validation": "2.2.3", "riverline/multipart-parser": "2.0.9", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.8.0", "seld/phar-utils": "1.1.0", "smarty/smarty": "dev-v3.1.36-php72-php81-compat", "sonata-project/google-authenticator": "2.2.0", "stevenmaguire/oauth2-microsoft": "2.2.0", "stripe/stripe-php": "v7.34.0", "symfony/cache": "v5.1.11", "symfony/cache-contracts": "v2.5.2", "symfony/config": "v5.4.9", "symfony/console": "v5.4.12", "symfony/dependency-injection": "v5.1.7", "symfony/deprecation-contracts": "v2.2.0", "symfony/filesystem": "v5.0.8", "symfony/finder": "v5.3.7", "symfony/http-foundation": "v5.3.7", "symfony/mime": "v5.1.7", "symfony/polyfill-ctype": "v1.18.1", "symfony/polyfill-iconv": "v1.18.1", "symfony/polyfill-intl-grapheme": "v1.26.0", "symfony/polyfill-intl-idn": "v1.18.1", "symfony/polyfill-intl-normalizer": "v1.18.1", "symfony/polyfill-mbstring": "v1.18.1", "symfony/polyfill-php70": "v1.20.0", "symfony/polyfill-php72": "v1.18.1", "symfony/polyfill-php73": "v1.18.1", "symfony/polyfill-php80": "v1.18.1", "symfony/polyfill-php81": "v1.26.0", "symfony/process": "v5.3.7", "symfony/service-contracts": "v2.2.0", "symfony/string": "v5.4.10", "symfony/translation": "v5.0.8", "symfony/translation-contracts": "v2.3.0", "symfony/var-exporter": "v5.4.10", "symfony/yaml": "v5.0.8", "tecnickcom/tcpdf": "6.3.5-p1", "true/punycode": "v2.1.1", "voku/portable-ascii": "1.5.3", "webmozart/assert": "1.11.0", "zbateson/mail-mime-parser": "1.3.1", "zbateson/mb-wrapper": "1.0.1", "zbateson/stream-decorators": "1.0.4" }, "extra": {"sha":"d4b5d44eab65fc15726366c6a4b9d2092c84b8839bcb5d755981a834ead27936","sig":"eaMSvrZBeGPVP0hgGkZlJi65G5JXrgVX5sRQvS+VjbbxnrxvLRqzhCdSfXMMhBez2G8JaYszf+hqIPX1t7XjiWz4D6MSv+S7UsvODC0lU7dDe0Ip9Y2FxCvu5vuciqUhIj0vjkZQAra9A9pnej4seGIWaT7OESYnBl+aOqau1Y076eZehYDXzW5udQk8aeq6bNtv7ZEfGxW21v6xAYKP1ut7K3Nmv9Em9VLow47U0RoxJAwqjae+r1PeNQpPBWv78ykEYm7zMwKrdg10x0f9+WFIdsY9rJHgc\/7UXaxgYN9i3eDUempXxoeAR+PfC\/AoaF+qEgmnIKKi8Wc9V9v4\/w==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_8.6.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V8.6.1","fileSize":"108720069","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"oVlynVzb18fbmA32KKvXoh\/XEhFUv0M5CC0a8PlvNOkbwpQAogXc\/zanW8L96D8bkxZWx76fW4v3MSezT+7iOU1r2IirzUr9buAM5U0nPT49\/Ri8T3vDitvyi0CMQFhn7hIMWpD3XcwNxOK3fwLMCrKJ3CeKX9ufd2sbhnhhXGNf9nFReUHiQ7n5I\/3bZghbZx8xsf7ffiCJs9LHd70dLYhfAs9jDZMtiz9QpyvxW8LEX0lyoEX5XQp5rv8uqwJZWAMJC0+fc8\/7uNfSf8PADtbSKD4nPugfDZw2NMUeGeCFKh7wD26P2fZANyB6f6Kk44SCbKMGp9\/CwMm1IciQvg=="},"require":{"ionCubeLoader":"10.1.0"}} }, "8.6.0-release.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "8.6.0", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^7.2.0 || ^7.3.0 || ^7.4.0 || ~8.1.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-8.6.0-release.1.zip", "type": "zip" }, "time": "2022-10-24", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "1.1.0", "authorizenet/authorizenet": "1.9.9", "aws/aws-sdk-php": "3.138.0", "bitpay/php-client": "v3.0.0-p2", "brick/math": "0.8.15", "bshaffer/oauth2-server-httpfoundation-bridge": "v1.4-p1", "bshaffer/oauth2-server-php": "v1.11.1-p1", "cebe/php-openapi": "1.5.2", "composer/ca-bundle": "1.2.8", "composer/composer": "dev-v1.10.6-php72-php81-compat", "composer/semver": "1.5.1", "composer/spdx-licenses": "1.5.3", "composer/xdebug-handler": "1.4.3", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "1.10.4", "doctrine/inflector": "1.4.1", "doctrine/instantiator": "1.4.1", "doctrine/lexer": "1.2.0", "duosecurity/duo_php": "1.0.1", "egulias/email-validator": "2.1.22", "ezyang/htmlpurifier": "v4.12.0", "facebook/graph-sdk": "5.7.0", "filp/whoops": "2.14.3", "firebase/php-jwt": "v5.2.0", "goetas-webservices/xsd2php-runtime": "v0.2.12", "google/apiclient": "2.7.0-p1", "google/auth": "v1.11.1", "google/recaptcha": "1.2.4", "guzzlehttp/guzzle": "7.0.1", "guzzlehttp/promises": "1.4.0", "guzzlehttp/psr7": "1.6.1", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v7.12.0", "illuminate/container": "dev-v7.12.0-php72-php81-compat", "illuminate/contracts": "v7.12.0", "illuminate/database": "dev-v7.12.0-php72-php81-compat", "illuminate/events": "v7.12.0", "illuminate/filesystem": "v7.28.4", "illuminate/support": "v7.12.0", "illuminate/translation": "v7.28.4", "illuminate/validation": "v7.12.0", "jms/metadata": "1.7.0", "jms/parser-lib": "1.0.0", "jms/serializer": "dev-v1.14.1-php72-php81-compat", "justinrainbow/json-schema": "5.2.9", "knplabs/knp-menu": "v3.1.1", "laminas/laminas-diactoros": "2.3.1", "laminas/laminas-httphandlerrunner": "1.2.0", "laminas/laminas-loader": "2.6.1", "laminas/laminas-mail": "2.14.0-p1", "laminas/laminas-mime": "2.7.4", "laminas/laminas-stdlib": "3.3.0", "laminas/laminas-validator": "2.13.4", "laminas/laminas-zendframework-bridge": "1.1.1", "league/climate": "3.5.2", "league/flysystem": "1.0.67", "league/flysystem-aws-s3-v3": "1.0.24", "league/oauth2-client": "2.5.0", "league/oauth2-google": "3.0.3", "league/openapi-psr7-validator": "0.16.4", "league/plates": "3.3.0", "league/uri": "6.7.1", "league/uri-interfaces": "2.3.0", "michelf/php-markdown": "1.9.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "2.0.2", "mtdowling/jmespath.php": "2.6.0", "nesbot/carbon": "2.51.0", "nikic/fast-route": "v1.3.0", "paragonie/random_compat": "v9.99.100", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.2.0", "phpmyadmin/sql-parser": "5.3.1", "phpoption/phpoption": "1.7.3", "phpseclib/mcrypt_compat": "1.0.12", "phpseclib/phpseclib": "2.0.27", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-client": "1.0.1", "psr/http-factory": "1.0.1", "psr/http-message": "1.0.1", "psr/http-server-handler": "1.0.1", "psr/http-server-middleware": "1.0.1", "psr/log": "1.0.2", "psr/simple-cache": "1.0.1", "punic/punic": "3.5.1", "ralouphie/getallheaders": "3.0.3", "ramsey/collection": "1.0.1", "ramsey/uuid": "4.0.1", "react/promise": "v2.8.0", "respect/stringifier": "0.2.0", "respect/validation": "2.2.3", "riverline/multipart-parser": "2.0.9", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.8.0", "seld/phar-utils": "1.1.0", "smarty/smarty": "dev-v3.1.36-php72-php81-compat", "sonata-project/google-authenticator": "2.2.0", "stevenmaguire/oauth2-microsoft": "2.2.0", "stripe/stripe-php": "v7.34.0", "symfony/cache": "v5.1.11", "symfony/cache-contracts": "v2.5.2", "symfony/config": "v5.4.9", "symfony/console": "v5.4.12", "symfony/dependency-injection": "v5.1.7", "symfony/deprecation-contracts": "v2.2.0", "symfony/filesystem": "v5.0.8", "symfony/finder": "v5.3.7", "symfony/http-foundation": "v5.3.7", "symfony/mime": "v5.1.7", "symfony/polyfill-ctype": "v1.18.1", "symfony/polyfill-iconv": "v1.18.1", "symfony/polyfill-intl-grapheme": "v1.26.0", "symfony/polyfill-intl-idn": "v1.18.1", "symfony/polyfill-intl-normalizer": "v1.18.1", "symfony/polyfill-mbstring": "v1.18.1", "symfony/polyfill-php70": "v1.20.0", "symfony/polyfill-php72": "v1.18.1", "symfony/polyfill-php73": "v1.18.1", "symfony/polyfill-php80": "v1.18.1", "symfony/polyfill-php81": "v1.26.0", "symfony/process": "v5.3.7", "symfony/service-contracts": "v2.2.0", "symfony/string": "v5.4.10", "symfony/translation": "v5.0.8", "symfony/translation-contracts": "v2.3.0", "symfony/var-exporter": "v5.4.10", "symfony/yaml": "v5.0.8", "tecnickcom/tcpdf": "6.3.5-p1", "true/punycode": "v2.1.1", "voku/portable-ascii": "1.5.3", "webmozart/assert": "1.11.0", "zbateson/mail-mime-parser": "1.3.1", "zbateson/mb-wrapper": "1.0.1", "zbateson/stream-decorators": "1.0.4" }, "extra": {"sha":"516f58cf423065b55a04f50ecc9696a823549c409b1b3eeefed11c44d26fce8d","sig":"oWcupuNlWRg0+eK8H+poKxDwO+4Sp3N02ckRfJfAlv9DC\/QiNgPFt4dU4R12aASMvYPrD8T02cmepMYZM9Cp+qoB80wZTl5oeLy5qHvq0QASX84eH3yoslFkRd1N8RwdluDedH1jCzasA+tobujd7HYhcfbiS3U7CCJjgG0+fPh4PTR2uQNNnzgh1czKfRsC7SPRUUYtJ9eFG9HDBKC8gs3iG9lrMkmHJ272h1Ch5\/2w\/zdFcDvoS\/lzUtiEcy1oKVSaRjAg7siE\/5\/DZdH0MfDw0AxE8ag9DN96rJsszqX4OuHM\/xifCyXWYlg\/6r2Wezh57rpKPQweecDq3J8BEg==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_8.6.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V8.6.0","fileSize":"108719356","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"csJ\/P6zHXHEXG8aF7RQnPmRaroyOlv85yCg5JA\/t\/leG4vlpIdciLeE+61dFnOWoR98ZIWV\/5MJdoICjD5hzwX5tNqaDsjRx6X8IuWpz\/XhKMpWOCLBtwa\/dnr18LGOyX+ofbcfH5daie5+rjh9N6pdib9JBivoHrsyAdYy6ke22WtGBbNQzjwXlbLnGNx1VIb6N9h2abTj\/O4TdGW12YbnLiunLO6Xa69Nb5M6D5\/s7wTv+9dA4Uycpdbc5F7sstA6AZxvP97m\/YqvDTECWclQausSz2zj8oMG8ugEDnUcqoM6f5dNNlXqGtp+wCMY1h6b5VMwmn4nXcDb9V5eq\/Q=="},"require":{"ionCubeLoader":"10.1.0"}} }, "8.6.0-rc.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "8.6.0-RC.1", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^7.2.0 || ^7.3.0 || ^7.4.0 || ~8.1.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-8.6.0-rc.1.zip", "type": "zip" }, "time": "2022-10-03", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "1.1.0", "authorizenet/authorizenet": "1.9.9", "aws/aws-sdk-php": "3.138.0", "bitpay/php-client": "v3.0.0-p2", "brick/math": "0.8.15", "bshaffer/oauth2-server-httpfoundation-bridge": "v1.4-p1", "bshaffer/oauth2-server-php": "v1.11.1-p1", "cebe/php-openapi": "1.5.2", "composer/ca-bundle": "1.2.8", "composer/composer": "dev-v1.10.6-php72-php81-compat", "composer/semver": "1.5.1", "composer/spdx-licenses": "1.5.3", "composer/xdebug-handler": "1.4.3", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "1.10.4", "doctrine/inflector": "1.4.1", "doctrine/instantiator": "1.4.1", "doctrine/lexer": "1.2.0", "duosecurity/duo_php": "1.0.1", "egulias/email-validator": "2.1.22", "ezyang/htmlpurifier": "v4.12.0", "facebook/graph-sdk": "5.7.0", "filp/whoops": "2.14.3", "firebase/php-jwt": "v5.2.0", "goetas-webservices/xsd2php-runtime": "v0.2.12", "google/apiclient": "2.7.0-p1", "google/auth": "v1.11.1", "google/recaptcha": "1.2.4", "guzzlehttp/guzzle": "7.0.1", "guzzlehttp/promises": "1.4.0", "guzzlehttp/psr7": "1.6.1", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v7.12.0", "illuminate/container": "dev-v7.12.0-php72-php81-compat", "illuminate/contracts": "v7.12.0", "illuminate/database": "dev-v7.12.0-php72-php81-compat", "illuminate/events": "v7.12.0", "illuminate/filesystem": "v7.28.4", "illuminate/support": "v7.12.0", "illuminate/translation": "v7.28.4", "illuminate/validation": "v7.12.0", "jms/metadata": "1.7.0", "jms/parser-lib": "1.0.0", "jms/serializer": "dev-v1.14.1-php72-php81-compat", "justinrainbow/json-schema": "5.2.9", "knplabs/knp-menu": "v3.1.1", "laminas/laminas-diactoros": "2.3.1", "laminas/laminas-httphandlerrunner": "1.2.0", "laminas/laminas-loader": "2.6.1", "laminas/laminas-mail": "2.14.0-p1", "laminas/laminas-mime": "2.7.4", "laminas/laminas-stdlib": "3.3.0", "laminas/laminas-validator": "2.13.4", "laminas/laminas-zendframework-bridge": "1.1.1", "league/climate": "3.5.2", "league/flysystem": "1.0.67", "league/flysystem-aws-s3-v3": "1.0.24", "league/oauth2-client": "2.5.0", "league/oauth2-google": "3.0.3", "league/openapi-psr7-validator": "0.16.4", "league/plates": "3.3.0", "league/uri": "6.7.1", "league/uri-interfaces": "2.3.0", "michelf/php-markdown": "1.9.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "2.0.2", "mtdowling/jmespath.php": "2.6.0", "nesbot/carbon": "2.51.0", "nikic/fast-route": "v1.3.0", "paragonie/random_compat": "v9.99.100", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.2.0", "phpmyadmin/sql-parser": "5.3.1", "phpoption/phpoption": "1.7.3", "phpseclib/mcrypt_compat": "1.0.12", "phpseclib/phpseclib": "2.0.27", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-client": "1.0.1", "psr/http-factory": "1.0.1", "psr/http-message": "1.0.1", "psr/http-server-handler": "1.0.1", "psr/http-server-middleware": "1.0.1", "psr/log": "1.0.2", "psr/simple-cache": "1.0.1", "punic/punic": "3.5.1", "ralouphie/getallheaders": "3.0.3", "ramsey/collection": "1.0.1", "ramsey/uuid": "4.0.1", "react/promise": "v2.8.0", "respect/stringifier": "0.2.0", "respect/validation": "2.2.3", "riverline/multipart-parser": "2.0.9", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.8.0", "seld/phar-utils": "1.1.0", "smarty/smarty": "dev-v3.1.36-php72-php81-compat", "sonata-project/google-authenticator": "2.2.0", "stevenmaguire/oauth2-microsoft": "2.2.0", "stripe/stripe-php": "v7.34.0", "symfony/cache": "v5.1.11", "symfony/cache-contracts": "v2.5.2", "symfony/config": "v5.4.9", "symfony/console": "v5.3.7", "symfony/dependency-injection": "v5.1.7", "symfony/deprecation-contracts": "v2.2.0", "symfony/filesystem": "v5.0.8", "symfony/finder": "v5.3.7", "symfony/http-foundation": "v5.3.7", "symfony/mime": "v5.1.7", "symfony/polyfill-ctype": "v1.18.1", "symfony/polyfill-iconv": "v1.18.1", "symfony/polyfill-intl-grapheme": "v1.26.0", "symfony/polyfill-intl-idn": "v1.18.1", "symfony/polyfill-intl-normalizer": "v1.18.1", "symfony/polyfill-mbstring": "v1.18.1", "symfony/polyfill-php70": "v1.20.0", "symfony/polyfill-php72": "v1.18.1", "symfony/polyfill-php73": "v1.18.1", "symfony/polyfill-php80": "v1.18.1", "symfony/polyfill-php81": "v1.26.0", "symfony/process": "v5.3.7", "symfony/service-contracts": "v2.2.0", "symfony/string": "v5.4.10", "symfony/translation": "v5.0.8", "symfony/translation-contracts": "v2.3.0", "symfony/var-exporter": "v5.4.10", "symfony/yaml": "v5.0.8", "tecnickcom/tcpdf": "6.3.5-p1", "true/punycode": "v2.1.1", "voku/portable-ascii": "1.5.3", "webmozart/assert": "1.11.0", "zbateson/mail-mime-parser": "1.3.1", "zbateson/mb-wrapper": "1.0.1", "zbateson/stream-decorators": "1.0.4" }, "extra": {"sha":"8bf12fb0e17e59462e593b6a936840a1e9880d967daf43ed56c3fcd77a065941","sig":"CzkPDVWRnDlcHzJ4dJIDNMaAeE4wrYMGUSY+B65BRusp+q2jd+92zLJaTJVyDtje\/VbcvL\/utUQYLI3G0CzfzT6lmZ2uebpTAkJ8a2nrCqfHigr2o+cfH696Uye153d57Ix3TbcaOJb7JObxhJkr1KSitBXGDS6k9flg3p1SJESO05dfeXapmcPJ49Qu6GkWMEJzCKJn5aUHHGN+UVW9VpHhGE8ZBa3rINuAXh6pBo+h9V2OQ2QQ2MxzxeTY1strQ5AcXw3SF5e8\/8sXeVXjtUVG8WiB27DHpdclgolQLnB+otppG2IWEUQdhYpwz20Y1e89ke9xiQhUpe2paXmRuQ==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_8.6.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V8.6.0","fileSize":"108639496","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"eDKZ1lTZBEcWtsAIINVWFLrM7SncAr8p1SUq4XT8aTZLhlfAHP1uyMC4wq1dmsH9tV7+qa4OuP37zbWpAoq9DTTkhbNHw9qT5DW7MxzXktIhsZXeGIFplEXd6U5WAkk9cCVWZ3yNMdmf6UkeS\/LXLmUkYZYE2U6iY4B6Ck4iPSzJfv7BDZ7KsxbJlLpmev+X\/CL0TLddsPaVvT60wRXCm9WMAzpu66SkixkqDjK8t0Wofu5AakDxAuaKD\/\/mqWai6QOaMfVW7DOD0P1BO7VJwWoTEGtKydcso6BZjlGdX+OE2XuXBDz03ALxC3zaj\/4TWtkgnIdn4LVkvK565INJTQ=="},"require":{"ionCubeLoader":"10.1.0"}} }, "8.6.0-beta.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "8.6.0-beta.1", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^7.2.0 || ^7.3.0 || ^7.4.0 || ~8.1.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-8.6.0-beta.1.zip", "type": "zip" }, "time": "2022-08-29", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "1.1.0", "authorizenet/authorizenet": "1.9.9", "aws/aws-sdk-php": "3.138.0", "bitpay/php-client": "v3.0.0-p2", "brick/math": "0.8.15", "bshaffer/oauth2-server-httpfoundation-bridge": "v1.4-p1", "bshaffer/oauth2-server-php": "v1.11.1-p1", "cebe/php-openapi": "1.5.2", "composer/ca-bundle": "1.2.8", "composer/composer": "dev-v1.10.6-php72-php81-compat", "composer/semver": "1.5.1", "composer/spdx-licenses": "1.5.3", "composer/xdebug-handler": "1.4.3", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "1.10.4", "doctrine/inflector": "1.4.1", "doctrine/instantiator": "1.4.1", "doctrine/lexer": "1.2.0", "duosecurity/duo_php": "1.0.1", "egulias/email-validator": "2.1.22", "ezyang/htmlpurifier": "v4.12.0", "facebook/graph-sdk": "5.7.0", "filp/whoops": "2.14.3", "firebase/php-jwt": "v5.2.0", "goetas-webservices/xsd2php-runtime": "v0.2.12", "google/apiclient": "2.7.0-p1", "google/auth": "v1.11.1", "google/recaptcha": "1.2.4", "guzzlehttp/guzzle": "7.0.1", "guzzlehttp/promises": "1.4.0", "guzzlehttp/psr7": "1.6.1", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v7.12.0", "illuminate/container": "dev-v7.12.0-php72-php81-compat", "illuminate/contracts": "v7.12.0", "illuminate/database": "dev-v7.12.0-php72-php81-compat", "illuminate/events": "v7.12.0", "illuminate/filesystem": "v7.28.4", "illuminate/support": "v7.12.0", "illuminate/translation": "v7.28.4", "illuminate/validation": "v7.12.0", "jms/metadata": "1.7.0", "jms/parser-lib": "1.0.0", "jms/serializer": "dev-v1.14.1-php72-php81-compat", "justinrainbow/json-schema": "5.2.9", "knplabs/knp-menu": "v3.1.1", "laminas/laminas-diactoros": "2.3.1", "laminas/laminas-httphandlerrunner": "1.2.0", "laminas/laminas-loader": "2.6.1", "laminas/laminas-mail": "2.14.0-p1", "laminas/laminas-mime": "2.7.4", "laminas/laminas-stdlib": "3.3.0", "laminas/laminas-validator": "2.13.4", "laminas/laminas-zendframework-bridge": "1.1.1", "league/climate": "3.5.2", "league/flysystem": "1.0.67", "league/flysystem-aws-s3-v3": "1.0.24", "league/oauth2-client": "2.5.0", "league/oauth2-google": "3.0.3", "league/openapi-psr7-validator": "0.16.4", "league/plates": "3.3.0", "league/uri": "6.7.1", "league/uri-interfaces": "2.3.0", "michelf/php-markdown": "1.9.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "2.0.2", "mtdowling/jmespath.php": "2.6.0", "nesbot/carbon": "2.51.0", "nikic/fast-route": "v1.3.0", "paragonie/random_compat": "v9.99.100", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.2.0", "phpmyadmin/sql-parser": "5.3.1", "phpoption/phpoption": "1.7.3", "phpseclib/mcrypt_compat": "1.0.12", "phpseclib/phpseclib": "2.0.27", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-client": "1.0.1", "psr/http-factory": "1.0.1", "psr/http-message": "1.0.1", "psr/http-server-handler": "1.0.1", "psr/http-server-middleware": "1.0.1", "psr/log": "1.0.2", "psr/simple-cache": "1.0.1", "punic/punic": "3.5.1", "ralouphie/getallheaders": "3.0.3", "ramsey/collection": "1.0.1", "ramsey/uuid": "4.0.1", "react/promise": "v2.8.0", "respect/stringifier": "0.2.0", "respect/validation": "2.2.3", "riverline/multipart-parser": "2.0.9", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.8.0", "seld/phar-utils": "1.1.0", "smarty/smarty": "dev-v3.1.36-php72-php81-compat", "sonata-project/google-authenticator": "2.2.0", "stevenmaguire/oauth2-microsoft": "2.2.0", "stripe/stripe-php": "v7.34.0", "symfony/cache": "v5.1.11", "symfony/cache-contracts": "v2.5.2", "symfony/config": "v5.4.9", "symfony/console": "v5.3.7", "symfony/dependency-injection": "v5.1.7", "symfony/deprecation-contracts": "v2.2.0", "symfony/filesystem": "v5.0.8", "symfony/finder": "v5.3.7", "symfony/http-foundation": "v5.3.7", "symfony/mime": "v5.1.7", "symfony/polyfill-ctype": "v1.18.1", "symfony/polyfill-iconv": "v1.18.1", "symfony/polyfill-intl-grapheme": "v1.26.0", "symfony/polyfill-intl-idn": "v1.18.1", "symfony/polyfill-intl-normalizer": "v1.18.1", "symfony/polyfill-mbstring": "v1.18.1", "symfony/polyfill-php70": "v1.20.0", "symfony/polyfill-php72": "v1.18.1", "symfony/polyfill-php73": "v1.18.1", "symfony/polyfill-php80": "v1.18.1", "symfony/polyfill-php81": "v1.26.0", "symfony/process": "v5.3.7", "symfony/service-contracts": "v2.2.0", "symfony/string": "v5.4.10", "symfony/translation": "v5.0.8", "symfony/translation-contracts": "v2.3.0", "symfony/var-exporter": "v5.4.10", "symfony/yaml": "v5.0.8", "tecnickcom/tcpdf": "6.3.5-p1", "true/punycode": "v2.1.1", "voku/portable-ascii": "1.5.3", "webmozart/assert": "1.11.0", "zbateson/mail-mime-parser": "1.3.1", "zbateson/mb-wrapper": "1.0.1", "zbateson/stream-decorators": "1.0.4" }, "extra": {"sha":"75cd40c25512c58947aa42c168536d8dcff3e060db107dc489835601a02b40fd","sig":"BJVh5liPujLERsfsSId31Gm2Kw\/gtt3QwNYe4Mv2LWnSMEqXdCTedri8zvABcT0J5atF\/7Y\/2Koo\/TQL8y20WholaCd+dMRqEdUSANPhz4nxp\/CaIUgwLdtpqUCOyWSnbdp5tFVQ6KHOvIBFpkwljWfPVV3UVPUV1X75EfC4gY6m0VXI3FlLRGGGp22CasQ3tqzKyNkw3MxhhOTV9z59P0lRIG5ZJHCCgIhkvWaUqDXaMD\/El1zSPCnMKTqMg5vUzE4ggvY\/J6DtoN1dNVcYLlu2LnawqDNM81xYPtoMKMkwH4b1t0ohutyZNXWyvbOsUg+qpUYhhqXlRyZ+yA+GVg==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_8.6.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V8.6.0","fileSize":"108492940","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"hvHdKY9UrPhFJS5ETUMZRqHl0OHJb9HsqkdFTpCX5ol6R6uVe4A4BMGT+diZk8O7XabD5RbHDfr0pcknThEOVl9HyuS+8GsUdGAtkmH1qzpqb6TQuWH8JhXxAgyVOZou63rozLGZh3710Mx34LWskwZCht2WLTwwR92LAZoEa1e9grzeGGsVFHuRIjUtYVqDFwsy+\/UAKkhjcsBt3KJ\/fxxwgOpTGg4J4ZJj\/m9Ef3BCr2HmoYGYioCxtB\/YeatMRnOkE1M7hZa5z3wGrYnjnFQdlonaS3jqmkHwfZ1V4AKrUSTYHnode1Dg9eJUHpg8CeZ5TaIK8Oj9\/nJU6BTt5A=="},"require":{"ionCubeLoader":"10.1.0"}} }, "8.5.2-release.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "8.5.2", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^7.2.0 || ^7.3.0 || ^7.4.0 || ~8.1.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-8.5.2-release.1.zip", "type": "zip" }, "time": "2022-11-29", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "1.1.0", "authorizenet/authorizenet": "1.9.9", "aws/aws-sdk-php": "3.138.0", "bitpay/php-client": "v3.0.0-p2", "brick/math": "0.8.15", "bshaffer/oauth2-server-httpfoundation-bridge": "v1.4-p1", "bshaffer/oauth2-server-php": "v1.11.1-p1", "cebe/php-openapi": "1.5.2", "composer/ca-bundle": "1.2.8", "composer/composer": "1.10.6", "composer/semver": "1.5.1", "composer/spdx-licenses": "1.5.3", "composer/xdebug-handler": "1.4.3", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "1.10.2", "doctrine/inflector": "1.4.1", "doctrine/instantiator": "1.3.0", "doctrine/lexer": "1.2.0", "duosecurity/duo_php": "1.0.1", "egulias/email-validator": "2.1.22", "ezyang/htmlpurifier": "v4.12.0", "facebook/graph-sdk": "5.7.0", "filp/whoops": "2.7.2", "firebase/php-jwt": "v5.2.0", "goetas-webservices/xsd2php-runtime": "v0.2.12", "google/apiclient": "2.7.0-p1", "google/auth": "v1.11.1", "google/recaptcha": "1.2.4", "guzzlehttp/guzzle": "7.0.1", "guzzlehttp/promises": "v1.3.1", "guzzlehttp/psr7": "1.6.1", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v7.12.0", "illuminate/container": "v7.12.0", "illuminate/contracts": "v7.12.0", "illuminate/database": "v7.12.0", "illuminate/events": "v7.12.0", "illuminate/filesystem": "v7.28.4", "illuminate/support": "v7.12.0", "illuminate/translation": "v7.28.4", "illuminate/validation": "v7.12.0", "jms/metadata": "1.7.0", "jms/parser-lib": "1.0.0", "jms/serializer": "1.14.1", "justinrainbow/json-schema": "5.2.9", "knplabs/knp-menu": "v3.1.1", "laminas/laminas-diactoros": "2.3.1", "laminas/laminas-httphandlerrunner": "1.2.0", "laminas/laminas-loader": "2.6.1", "laminas/laminas-mail": "2.14.0-p1", "laminas/laminas-mime": "2.7.4", "laminas/laminas-stdlib": "3.3.0", "laminas/laminas-validator": "2.13.4", "laminas/laminas-zendframework-bridge": "1.1.1", "league/climate": "3.5.2", "league/flysystem": "1.0.67", "league/flysystem-aws-s3-v3": "1.0.24", "league/oauth2-client": "2.5.0", "league/oauth2-google": "3.0.3", "league/openapi-psr7-validator": "0.16.4", "league/plates": "3.3.0", "league/uri": "6.5.0", "league/uri-interfaces": "2.3.0", "michelf/php-markdown": "1.9.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "2.0.2", "mtdowling/jmespath.php": "2.6.0", "nesbot/carbon": "2.33.0", "nikic/fast-route": "v1.3.0", "paragonie/random_compat": "v9.99.100", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.1.5", "phpmyadmin/sql-parser": "5.3.1", "phpoption/phpoption": "1.7.3", "phpseclib/mcrypt_compat": "1.0.11", "phpseclib/phpseclib": "2.0.27", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-client": "1.0.1", "psr/http-factory": "1.0.1", "psr/http-message": "1.0.1", "psr/http-server-handler": "1.0.1", "psr/http-server-middleware": "1.0.1", "psr/log": "1.0.2", "psr/simple-cache": "1.0.1", "punic/punic": "3.5.1", "ralouphie/getallheaders": "3.0.3", "ramsey/collection": "1.0.1", "ramsey/uuid": "4.0.1", "react/promise": "v2.8.0", "respect/stringifier": "0.2.0", "respect/validation": "2.2.3", "riverline/multipart-parser": "2.0.9", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.8.0", "seld/phar-utils": "1.1.0", "smarty/smarty": "v3.1.36", "sonata-project/google-authenticator": "2.2.0", "stevenmaguire/oauth2-microsoft": "2.2.0", "stripe/stripe-php": "v7.34.0", "symfony/cache": "v5.1.11", "symfony/cache-contracts": "v2.5.0", "symfony/config": "v5.4.3", "symfony/console": "v5.0.8", "symfony/dependency-injection": "v5.1.7", "symfony/deprecation-contracts": "v2.2.0", "symfony/filesystem": "v5.0.8", "symfony/finder": "v5.0.8", "symfony/http-foundation": "v5.0.8", "symfony/mime": "v5.1.7", "symfony/polyfill-ctype": "v1.18.1", "symfony/polyfill-iconv": "v1.18.1", "symfony/polyfill-intl-idn": "v1.18.1", "symfony/polyfill-intl-normalizer": "v1.18.1", "symfony/polyfill-mbstring": "v1.18.1", "symfony/polyfill-php70": "v1.20.0", "symfony/polyfill-php72": "v1.18.1", "symfony/polyfill-php73": "v1.18.1", "symfony/polyfill-php80": "v1.18.1", "symfony/polyfill-php81": "v1.24.0", "symfony/process": "v5.0.8", "symfony/service-contracts": "v2.2.0", "symfony/translation": "v5.0.8", "symfony/translation-contracts": "v2.3.0", "symfony/var-exporter": "v5.4.6", "symfony/yaml": "v5.0.8", "tecnickcom/tcpdf": "6.3.5-p1", "true/punycode": "v2.1.1", "voku/portable-ascii": "1.5.3", "webmozart/assert": "1.10.0", "zbateson/mail-mime-parser": "1.2.1", "zbateson/mb-wrapper": "1.0.0", "zbateson/stream-decorators": "1.0.3" }, "extra": {"sha":"bd7bfb447b7673fe5378877d403d179ce7550e059185abd988a2caed820b8557","sig":"EWf1MmkrAAbffzfJwoUv94ptuvh0GyTFQdjBm9nyet\/AsqBaYPUQxevl8JX9YWL7RYzhCrVX9qdIx75WPEQk9aJaxX2uwHPGfpiwg5owUCzNgZxKNf+\/BXKEKhbihlj+mblW0+zy3YpmDHLhHZrFIkdSSJXnV8wVg0gLbJQlNNLPdU+01vggnzLR7L0yp1RBH\/fkFQy24GCWucQcj\/hhBRVGEMpGmB8BphZ5Ab5npLyvstEiaP3+791ynbZKHsIv236zH6ijzsURugS3C7cdyFN31ISz4\/yRl5Z+PhJAcQFoHNYeLR3onaQrHeEavJO4xxvDExha3B+RyLsw+vVRjQ==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_8.5.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V8.5.2","fileSize":"84327149","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"PAju0N9aBQwvnm84W\/vytivGh1xswXev7Masf8kToh0T83KNDkClKzLMbJJislc0EB1dsyndHnitszq0Bkuj81whtbj5IzdJeluyc0yYQCEbrlHqMG4CMNlFcOxVJ4yy3mWRr+Uh5zGC4DhQnlVjOlTG6JFtXFQyeIp+l9OrHdpLfW4vjqPcF6Pg8niH9CpAtdnKbDn6vlWKaTtcKkrrkQCckWMeJ7y1EjUr7cSlKXpjzfm3ifU0xCZ\/Dwd2TUIN2mfzlTjPFW\/INslygvdUjJtAftvqA+9U5xW20Db8U7f63fte\/OkJrZtpsrNpp7QlMnU8xeiz3KDPSXCUFyOmfA=="},"require":{"ionCubeLoader":"10.1.0"}} }, "8.5.1-release.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "8.5.1", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^7.2.0 || ^7.3.0 || ^7.4.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-8.5.1-release.1.zip", "type": "zip" }, "time": "2022-06-15", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "1.1.0", "authorizenet/authorizenet": "1.9.9", "aws/aws-sdk-php": "3.138.0", "bitpay/php-client": "v3.0.0-p2", "brick/math": "0.8.15", "bshaffer/oauth2-server-httpfoundation-bridge": "v1.4-p1", "bshaffer/oauth2-server-php": "v1.11.1-p1", "cebe/php-openapi": "1.5.2", "composer/ca-bundle": "1.2.8", "composer/composer": "1.10.6", "composer/semver": "1.5.1", "composer/spdx-licenses": "1.5.3", "composer/xdebug-handler": "1.4.3", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "1.10.2", "doctrine/inflector": "1.4.1", "doctrine/instantiator": "1.3.0", "doctrine/lexer": "1.2.0", "duosecurity/duo_php": "1.0.1", "egulias/email-validator": "2.1.22", "ezyang/htmlpurifier": "v4.12.0", "facebook/graph-sdk": "5.7.0", "filp/whoops": "2.7.2", "firebase/php-jwt": "v5.2.0", "goetas-webservices/xsd2php-runtime": "v0.2.12", "google/apiclient": "2.7.0-p1", "google/auth": "v1.11.1", "google/recaptcha": "1.2.4", "guzzlehttp/guzzle": "7.0.1", "guzzlehttp/promises": "v1.3.1", "guzzlehttp/psr7": "1.6.1", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v7.12.0", "illuminate/container": "v7.12.0", "illuminate/contracts": "v7.12.0", "illuminate/database": "v7.12.0", "illuminate/events": "v7.12.0", "illuminate/filesystem": "v7.28.4", "illuminate/support": "v7.12.0", "illuminate/translation": "v7.28.4", "illuminate/validation": "v7.12.0", "jms/metadata": "1.7.0", "jms/parser-lib": "1.0.0", "jms/serializer": "1.14.1", "justinrainbow/json-schema": "5.2.9", "knplabs/knp-menu": "v3.1.1", "laminas/laminas-diactoros": "2.3.1", "laminas/laminas-httphandlerrunner": "1.2.0", "laminas/laminas-loader": "2.6.1", "laminas/laminas-mail": "2.14.0-p1", "laminas/laminas-mime": "2.7.4", "laminas/laminas-stdlib": "3.3.0", "laminas/laminas-validator": "2.13.4", "laminas/laminas-zendframework-bridge": "1.1.1", "league/climate": "3.5.2", "league/flysystem": "1.0.67", "league/flysystem-aws-s3-v3": "1.0.24", "league/oauth2-client": "2.5.0", "league/oauth2-google": "3.0.3", "league/openapi-psr7-validator": "0.16.4", "league/plates": "3.3.0", "league/uri": "6.5.0", "league/uri-interfaces": "2.3.0", "michelf/php-markdown": "1.9.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "2.0.2", "mtdowling/jmespath.php": "2.6.0", "nesbot/carbon": "2.33.0", "nikic/fast-route": "v1.3.0", "paragonie/random_compat": "v9.99.100", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.1.5", "phpmyadmin/sql-parser": "5.3.1", "phpoption/phpoption": "1.7.3", "phpseclib/mcrypt_compat": "1.0.11", "phpseclib/phpseclib": "2.0.27", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-client": "1.0.1", "psr/http-factory": "1.0.1", "psr/http-message": "1.0.1", "psr/http-server-handler": "1.0.1", "psr/http-server-middleware": "1.0.1", "psr/log": "1.0.2", "psr/simple-cache": "1.0.1", "punic/punic": "3.5.1", "ralouphie/getallheaders": "3.0.3", "ramsey/collection": "1.0.1", "ramsey/uuid": "4.0.1", "react/promise": "v2.8.0", "respect/stringifier": "0.2.0", "respect/validation": "2.2.3", "riverline/multipart-parser": "2.0.9", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.8.0", "seld/phar-utils": "1.1.0", "smarty/smarty": "v3.1.36", "sonata-project/google-authenticator": "2.2.0", "stevenmaguire/oauth2-microsoft": "2.2.0", "stripe/stripe-php": "v7.34.0", "symfony/cache": "v5.1.11", "symfony/cache-contracts": "v2.5.0", "symfony/config": "v5.4.3", "symfony/console": "v5.0.8", "symfony/dependency-injection": "v5.1.7", "symfony/deprecation-contracts": "v2.2.0", "symfony/filesystem": "v5.0.8", "symfony/finder": "v5.0.8", "symfony/http-foundation": "v5.0.8", "symfony/mime": "v5.1.7", "symfony/polyfill-ctype": "v1.18.1", "symfony/polyfill-iconv": "v1.18.1", "symfony/polyfill-intl-idn": "v1.18.1", "symfony/polyfill-intl-normalizer": "v1.18.1", "symfony/polyfill-mbstring": "v1.18.1", "symfony/polyfill-php70": "v1.20.0", "symfony/polyfill-php72": "v1.18.1", "symfony/polyfill-php73": "v1.18.1", "symfony/polyfill-php80": "v1.18.1", "symfony/polyfill-php81": "v1.24.0", "symfony/process": "v5.0.8", "symfony/service-contracts": "v2.2.0", "symfony/translation": "v5.0.8", "symfony/translation-contracts": "v2.3.0", "symfony/var-exporter": "v5.4.6", "symfony/yaml": "v5.0.8", "tecnickcom/tcpdf": "6.3.5-p1", "true/punycode": "v2.1.1", "voku/portable-ascii": "1.5.3", "webmozart/assert": "1.10.0", "zbateson/mail-mime-parser": "1.2.1", "zbateson/mb-wrapper": "1.0.0", "zbateson/stream-decorators": "1.0.3" }, "extra": {"sha":"4474462d48389190a76c182961653bdcb5e2b3aca2603b17ffc5de226442cb0f","sig":"F8mLIozphZjLdeiz\/RhhoZuIMQvZ3retkAliUPGhUFdtX0HmTvvNsU2lOaRMv9F6crUUXsMd8fRZ0UxnjAKr5UddRNQ+tGsjoiYqbwE\/HFp\/LyrihOxULM1yy5PSi3M7DNBAv6TVX29HZQvcJ8EgEt6\/97KYJMONLYmM1Q9YqpVDi2rx47nFyKC5+wJgOv4je8l8MEYqydp8ac2tGLFfD7PL9ROHUFXyxdwzeHSnRkWp6WpP1v2M4XaIpBD74fQvRfgShplAs8Auot\/QNwWr84lqnZA7FyMoQ8u4WCj4wECuxzio3bMrEDD+GTwDM2wWKIaiY0SgFBm2lUe7AN417w==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_8.5.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V8.5.1","fileSize":"84344664","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"f44M7XMt+NKyUsHQms1cRYZZytMkhomIxZ7T0V4P0itAD25Jo7QPux1JeGhrmf\/0TuhIkSxaIhP14bxEOKGB8qsy1XSq0ZkDqx1A54QIMfTyWGk30a34qSufJWtw8uHv+4tu3GNKL1062ZA8H9x1ikVGyDPM5tBq3g+1+ISzFTlu2lPgopV+GZJM6IJTcYiE+rN8ARER1ZWXxRPFM\/jM4Ptvrk1E\/UmDHAVaNhD0HZa7FzfhIghPVddI21I5Ig7MAlvb23a1LS7Xf1ukg2uM1A5IZgIqduEcl0Yf30opT1qmrq91jzHpx2973HNMjNH0fpUECmPKW4ptjFXbspV87Q=="},"require":{"ionCubeLoader":"10.1.0"}} }, "8.5.0-release.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "8.5.0", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^7.2.0 || ^7.3.0 || ^7.4.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-8.5.0-release.1.zip", "type": "zip" }, "time": "2022-06-06", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "1.1.0", "authorizenet/authorizenet": "1.9.9", "aws/aws-sdk-php": "3.138.0", "bitpay/php-client": "v3.0.0-p2", "brick/math": "0.8.15", "bshaffer/oauth2-server-httpfoundation-bridge": "v1.4-p1", "bshaffer/oauth2-server-php": "v1.11.1-p1", "cebe/php-openapi": "1.5.2", "composer/ca-bundle": "1.2.8", "composer/composer": "1.10.6", "composer/semver": "1.5.1", "composer/spdx-licenses": "1.5.3", "composer/xdebug-handler": "1.4.3", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "1.10.2", "doctrine/inflector": "1.4.1", "doctrine/instantiator": "1.3.0", "doctrine/lexer": "1.2.0", "duosecurity/duo_php": "1.0.1", "egulias/email-validator": "2.1.22", "ezyang/htmlpurifier": "v4.12.0", "facebook/graph-sdk": "5.7.0", "filp/whoops": "2.7.2", "firebase/php-jwt": "v5.2.0", "goetas-webservices/xsd2php-runtime": "v0.2.12", "google/apiclient": "2.7.0-p1", "google/auth": "v1.11.1", "google/recaptcha": "1.2.4", "guzzlehttp/guzzle": "7.0.1", "guzzlehttp/promises": "v1.3.1", "guzzlehttp/psr7": "1.6.1", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v7.12.0", "illuminate/container": "v7.12.0", "illuminate/contracts": "v7.12.0", "illuminate/database": "v7.12.0", "illuminate/events": "v7.12.0", "illuminate/filesystem": "v7.28.4", "illuminate/support": "v7.12.0", "illuminate/translation": "v7.28.4", "illuminate/validation": "v7.12.0", "jms/metadata": "1.7.0", "jms/parser-lib": "1.0.0", "jms/serializer": "1.14.1", "justinrainbow/json-schema": "5.2.9", "knplabs/knp-menu": "v3.1.1", "laminas/laminas-diactoros": "2.3.1", "laminas/laminas-httphandlerrunner": "1.2.0", "laminas/laminas-loader": "2.6.1", "laminas/laminas-mail": "2.14.0-p1", "laminas/laminas-mime": "2.7.4", "laminas/laminas-stdlib": "3.3.0", "laminas/laminas-validator": "2.13.4", "laminas/laminas-zendframework-bridge": "1.1.1", "league/climate": "3.5.2", "league/flysystem": "1.0.67", "league/flysystem-aws-s3-v3": "1.0.24", "league/oauth2-client": "2.5.0", "league/oauth2-google": "3.0.3", "league/openapi-psr7-validator": "0.16.4", "league/plates": "3.3.0", "league/uri": "6.5.0", "league/uri-interfaces": "2.3.0", "michelf/php-markdown": "1.9.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "2.0.2", "mtdowling/jmespath.php": "2.6.0", "nesbot/carbon": "2.33.0", "nikic/fast-route": "v1.3.0", "paragonie/random_compat": "v9.99.100", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.1.5", "phpmyadmin/sql-parser": "5.3.1", "phpoption/phpoption": "1.7.3", "phpseclib/mcrypt_compat": "1.0.11", "phpseclib/phpseclib": "2.0.27", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-client": "1.0.1", "psr/http-factory": "1.0.1", "psr/http-message": "1.0.1", "psr/http-server-handler": "1.0.1", "psr/http-server-middleware": "1.0.1", "psr/log": "1.0.2", "psr/simple-cache": "1.0.1", "punic/punic": "3.5.1", "ralouphie/getallheaders": "3.0.3", "ramsey/collection": "1.0.1", "ramsey/uuid": "4.0.1", "react/promise": "v2.8.0", "respect/stringifier": "0.2.0", "respect/validation": "2.2.3", "riverline/multipart-parser": "2.0.9", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.8.0", "seld/phar-utils": "1.1.0", "smarty/smarty": "v3.1.36", "sonata-project/google-authenticator": "2.2.0", "stevenmaguire/oauth2-microsoft": "2.2.0", "stripe/stripe-php": "v7.34.0", "symfony/cache": "v5.1.11", "symfony/cache-contracts": "v2.5.0", "symfony/config": "v5.4.3", "symfony/console": "v5.0.8", "symfony/dependency-injection": "v5.1.7", "symfony/deprecation-contracts": "v2.2.0", "symfony/filesystem": "v5.0.8", "symfony/finder": "v5.0.8", "symfony/http-foundation": "v5.0.8", "symfony/mime": "v5.1.7", "symfony/polyfill-ctype": "v1.18.1", "symfony/polyfill-iconv": "v1.18.1", "symfony/polyfill-intl-idn": "v1.18.1", "symfony/polyfill-intl-normalizer": "v1.18.1", "symfony/polyfill-mbstring": "v1.18.1", "symfony/polyfill-php70": "v1.20.0", "symfony/polyfill-php72": "v1.18.1", "symfony/polyfill-php73": "v1.18.1", "symfony/polyfill-php80": "v1.18.1", "symfony/polyfill-php81": "v1.24.0", "symfony/process": "v5.0.8", "symfony/service-contracts": "v2.2.0", "symfony/translation": "v5.0.8", "symfony/translation-contracts": "v2.3.0", "symfony/var-exporter": "v5.4.6", "symfony/yaml": "v5.0.8", "tecnickcom/tcpdf": "6.3.5-p1", "true/punycode": "v2.1.1", "voku/portable-ascii": "1.5.3", "webmozart/assert": "1.10.0", "zbateson/mail-mime-parser": "1.2.1", "zbateson/mb-wrapper": "1.0.0", "zbateson/stream-decorators": "1.0.3" }, "extra": {"sha":"a3f96889670a3b5864e1c33872bcbab2a71037dd77447cb29095a6c099c53313","sig":"SXdxoxgrN42mFB2NwFZ7OayVzMRqL10DvhEothdCR8f4+9T15Emscl\/54Qgpd1HXaD32VDeR+GeWquFh50S+tcDmce9qgb9Isb0oiMWaFF+8UqWNt0rOKOTpA+2BWBq9vln4C+CPWoztEEBE7ZDVHkRiYlSk3mPkYF5p77Ix1m85Az46xJ\/CU9rUbsT9fxXevC+Ilr8tDixGS58V1gBvlOxjmKKG\/yTN1l0nwYglJyKBbEO5ExxCisXPyNo9PrIGRpVZup9dtKroQlrn+tVHZubcJ+D2SLlNvyJgo0DZxfnjfNORBHCo31OaOinSiE+VDPrIvx5KgNZclrCvJTC18A==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_8.5.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V8.5.0_GA","fileSize":"84351336","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"I\/+aJxvJLg0WVwVwZzSbBE4z\/fZfz\/LJIpYMvzpKz+69bXW7dtfHxBbUt+h8BqL4pIHkKHLOIN+EZ78LJITb+pFxwlMpqGZYD7up+ijLk8LJzEtY0KYpPGR9BrR40mdAGYW1dwlm0uy8IP3K45oxwjWABJIsf3XjfD\/9sqC\/m1+kt7f8EB9+b97Yi4vnVj77+8BzxNKRkF8QBnOFRQX6cVIx8VtTKipQfFXbCe4xXWmzbxROg1v7x9UtI2zmhLrXwtkGceWr0rUpgmIcBoNgrmeUj5cglbtcseddut1g4vcbz+Q4fZ539Iy\/TR2Ul8jsNlsbsAIG8mqL4D3gycA+Rg=="},"require":{"ionCubeLoader":"10.1.0"}} }, "8.5.0-rc.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "8.5.0-RC.1", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^7.2.0 || ^7.3.0 || ^7.4.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-8.5.0-rc.1.zip", "type": "zip" }, "time": "2022-05-11", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "1.1.0", "authorizenet/authorizenet": "1.9.9", "aws/aws-sdk-php": "3.138.0", "bitpay/php-client": "v3.0.0-p2", "brick/math": "0.8.15", "bshaffer/oauth2-server-httpfoundation-bridge": "v1.4-p1", "bshaffer/oauth2-server-php": "v1.11.1-p1", "cebe/php-openapi": "1.5.2", "composer/ca-bundle": "1.2.8", "composer/composer": "1.10.6", "composer/semver": "1.5.1", "composer/spdx-licenses": "1.5.3", "composer/xdebug-handler": "1.4.3", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "1.10.2", "doctrine/inflector": "1.4.1", "doctrine/instantiator": "1.3.0", "doctrine/lexer": "1.2.0", "duosecurity/duo_php": "1.0.1", "egulias/email-validator": "2.1.22", "ezyang/htmlpurifier": "v4.12.0", "facebook/graph-sdk": "5.7.0", "filp/whoops": "2.7.2", "firebase/php-jwt": "v5.2.0", "goetas-webservices/xsd2php-runtime": "v0.2.12", "google/apiclient": "2.7.0-p1", "google/auth": "v1.11.1", "google/recaptcha": "1.2.4", "guzzlehttp/guzzle": "7.0.1", "guzzlehttp/promises": "v1.3.1", "guzzlehttp/psr7": "1.6.1", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v7.12.0", "illuminate/container": "v7.12.0", "illuminate/contracts": "v7.12.0", "illuminate/database": "v7.12.0", "illuminate/events": "v7.12.0", "illuminate/filesystem": "v7.28.4", "illuminate/support": "v7.12.0", "illuminate/translation": "v7.28.4", "illuminate/validation": "v7.12.0", "jms/metadata": "1.7.0", "jms/parser-lib": "1.0.0", "jms/serializer": "1.14.1", "justinrainbow/json-schema": "5.2.9", "knplabs/knp-menu": "v3.1.1", "laminas/laminas-diactoros": "2.3.1", "laminas/laminas-httphandlerrunner": "1.2.0", "laminas/laminas-loader": "2.6.1", "laminas/laminas-mail": "2.14.0-p1", "laminas/laminas-mime": "2.7.4", "laminas/laminas-stdlib": "3.3.0", "laminas/laminas-validator": "2.13.4", "laminas/laminas-zendframework-bridge": "1.1.1", "league/climate": "3.5.2", "league/flysystem": "1.0.67", "league/flysystem-aws-s3-v3": "1.0.24", "league/oauth2-client": "2.5.0", "league/oauth2-google": "3.0.3", "league/openapi-psr7-validator": "0.16.4", "league/plates": "3.3.0", "league/uri": "6.5.0", "league/uri-interfaces": "2.3.0", "michelf/php-markdown": "1.9.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "2.0.2", "mtdowling/jmespath.php": "2.6.0", "nesbot/carbon": "2.33.0", "nikic/fast-route": "v1.3.0", "paragonie/random_compat": "v9.99.100", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.1.5", "phpmyadmin/sql-parser": "5.3.1", "phpoption/phpoption": "1.7.3", "phpseclib/mcrypt_compat": "1.0.11", "phpseclib/phpseclib": "2.0.27", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-client": "1.0.1", "psr/http-factory": "1.0.1", "psr/http-message": "1.0.1", "psr/http-server-handler": "1.0.1", "psr/http-server-middleware": "1.0.1", "psr/log": "1.0.2", "psr/simple-cache": "1.0.1", "punic/punic": "3.5.1", "ralouphie/getallheaders": "3.0.3", "ramsey/collection": "1.0.1", "ramsey/uuid": "4.0.1", "react/promise": "v2.8.0", "respect/stringifier": "0.2.0", "respect/validation": "2.2.3", "riverline/multipart-parser": "2.0.9", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.8.0", "seld/phar-utils": "1.1.0", "smarty/smarty": "v3.1.36", "sonata-project/google-authenticator": "2.2.0", "stevenmaguire/oauth2-microsoft": "2.2.0", "stripe/stripe-php": "v7.34.0", "symfony/cache": "v5.1.11", "symfony/cache-contracts": "v2.5.0", "symfony/config": "v5.4.3", "symfony/console": "v5.0.8", "symfony/dependency-injection": "v5.1.7", "symfony/deprecation-contracts": "v2.2.0", "symfony/filesystem": "v5.0.8", "symfony/finder": "v5.0.8", "symfony/http-foundation": "v5.0.8", "symfony/mime": "v5.1.7", "symfony/polyfill-ctype": "v1.18.1", "symfony/polyfill-iconv": "v1.18.1", "symfony/polyfill-intl-idn": "v1.18.1", "symfony/polyfill-intl-normalizer": "v1.18.1", "symfony/polyfill-mbstring": "v1.18.1", "symfony/polyfill-php70": "v1.20.0", "symfony/polyfill-php72": "v1.18.1", "symfony/polyfill-php73": "v1.18.1", "symfony/polyfill-php80": "v1.18.1", "symfony/polyfill-php81": "v1.24.0", "symfony/process": "v5.0.8", "symfony/service-contracts": "v2.2.0", "symfony/translation": "v5.0.8", "symfony/translation-contracts": "v2.3.0", "symfony/var-exporter": "v5.4.6", "symfony/yaml": "v5.0.8", "tecnickcom/tcpdf": "6.3.5-p1", "true/punycode": "v2.1.1", "voku/portable-ascii": "1.5.3", "webmozart/assert": "1.10.0", "zbateson/mail-mime-parser": "1.2.1", "zbateson/mb-wrapper": "1.0.0", "zbateson/stream-decorators": "1.0.3" }, "extra": {"sha":"401522d5ab08bcddf3168f10518d79864c26e2ea3ddf1ebd8d908073b394ae4f","sig":"db8AAtnSJ3FRHRFFVF+TPRVdooEnle4UF7hsplXJydS1f8LuoKZu\/6\/vPQZY2Xi6nPlG\/1TTyHmS684qbWUzqGr3NjaKxOADhipqEIIJtQ8EEXax6CjpusdWibNpLq98WGSxkqthCgstlJhCBOjibE3xdr3M7PuLKOU6XD02KprwzS\/ghftN8h5RblV8DAVAxiZ4Hpxv4e093dzNcosRSyQs5zrPJo+dCsEERdF7ASnANB9ltYOWxgdZtddnUYSfXp+gmaAOBU3b\/tOgsGeQkZgy6dZk3BddVeCxVsH6YBYO3XkZj4c\/oeyyvTprb1QS2N27RHJc429aRciCTWEAkA==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_8.5.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V8.5.0_RC_1","fileSize":"84174157","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"efcrR5qE9F4ChpHv5vQMI2WRl55UBYIU+ztkQPL+Vl3E1CoOQMsC8WOOGs3AxZ9u4XLcAv39Pk9OKeeJYfwW7BrCF6LWwHO7pdM\/PhJ5D19MGuuwHBygTAOYHtSK8f6+jhF4r3eWYhEVUW7v5gPFzaKPFBtROhsmeWXlrjm6RbQ7JM0PKWrmBDVGKo7A05rFtzrWb5MG805oUz92fajsxyl0m+gRLN15mSYFT8sqMXcTCraRWQY0fkzxsJui\/9FAFcaWPoXKrqJwtPoFvyWP\/urL4VNUUJqKtnwNLaS\/RUQtJ6EB8rOw7A3fvSD6V3boWl0K6fIm5l6W19IFKEhXZA=="},"require":{"ionCubeLoader":"10.1.0"}} }, "8.5.0-beta.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "8.5.0-beta.1", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^7.2.0 || ^7.3.0 || ^7.4.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-8.5.0-beta.1.zip", "type": "zip" }, "time": "2022-04-20", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "1.1.0", "authorizenet/authorizenet": "1.9.9", "aws/aws-sdk-php": "3.138.0", "bitpay/php-client": "v3.0.0-p2", "brick/math": "0.8.15", "bshaffer/oauth2-server-httpfoundation-bridge": "v1.4-p1", "bshaffer/oauth2-server-php": "v1.11.1-p1", "cebe/php-openapi": "1.5.2", "composer/ca-bundle": "1.2.8", "composer/composer": "1.10.6", "composer/semver": "1.5.1", "composer/spdx-licenses": "1.5.3", "composer/xdebug-handler": "1.4.3", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "1.10.2", "doctrine/inflector": "1.4.1", "doctrine/instantiator": "1.3.0", "doctrine/lexer": "1.2.0", "duosecurity/duo_php": "1.0.1", "egulias/email-validator": "2.1.22", "ezyang/htmlpurifier": "v4.12.0", "facebook/graph-sdk": "5.7.0", "filp/whoops": "2.7.2", "firebase/php-jwt": "v5.2.0", "goetas-webservices/xsd2php-runtime": "v0.2.12", "google/apiclient": "2.7.0-p1", "google/auth": "v1.11.1", "google/recaptcha": "1.2.4", "guzzlehttp/guzzle": "7.0.1", "guzzlehttp/promises": "v1.3.1", "guzzlehttp/psr7": "1.6.1", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v7.12.0", "illuminate/container": "v7.12.0", "illuminate/contracts": "v7.12.0", "illuminate/database": "v7.12.0", "illuminate/events": "v7.12.0", "illuminate/filesystem": "v7.28.4", "illuminate/support": "v7.12.0", "illuminate/translation": "v7.28.4", "illuminate/validation": "v7.12.0", "jms/metadata": "1.7.0", "jms/parser-lib": "1.0.0", "jms/serializer": "1.14.1", "justinrainbow/json-schema": "5.2.9", "knplabs/knp-menu": "v3.1.1", "laminas/laminas-diactoros": "2.3.1", "laminas/laminas-httphandlerrunner": "1.2.0", "laminas/laminas-loader": "2.6.1", "laminas/laminas-mail": "2.14.0-p1", "laminas/laminas-mime": "2.7.4", "laminas/laminas-stdlib": "3.3.0", "laminas/laminas-validator": "2.13.4", "laminas/laminas-zendframework-bridge": "1.1.1", "league/climate": "3.5.2", "league/flysystem": "1.0.67", "league/flysystem-aws-s3-v3": "1.0.24", "league/oauth2-client": "2.5.0", "league/oauth2-google": "3.0.3", "league/openapi-psr7-validator": "0.16.4", "league/plates": "3.3.0", "league/uri": "6.5.0", "league/uri-interfaces": "2.3.0", "michelf/php-markdown": "1.9.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "2.0.2", "mtdowling/jmespath.php": "2.6.0", "nesbot/carbon": "2.33.0", "nikic/fast-route": "v1.3.0", "paragonie/random_compat": "v9.99.100", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.1.5", "phpmyadmin/sql-parser": "5.3.1", "phpoption/phpoption": "1.7.3", "phpseclib/mcrypt_compat": "1.0.11", "phpseclib/phpseclib": "2.0.27", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-client": "1.0.1", "psr/http-factory": "1.0.1", "psr/http-message": "1.0.1", "psr/http-server-handler": "1.0.1", "psr/http-server-middleware": "1.0.1", "psr/log": "1.0.2", "psr/simple-cache": "1.0.1", "punic/punic": "3.5.1", "ralouphie/getallheaders": "3.0.3", "ramsey/collection": "1.0.1", "ramsey/uuid": "4.0.1", "react/promise": "v2.8.0", "respect/stringifier": "0.2.0", "respect/validation": "2.2.3", "riverline/multipart-parser": "2.0.9", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.8.0", "seld/phar-utils": "1.1.0", "smarty/smarty": "v3.1.36", "sonata-project/google-authenticator": "2.2.0", "stevenmaguire/oauth2-microsoft": "2.2.0", "stripe/stripe-php": "v7.34.0", "symfony/cache": "v5.1.11", "symfony/cache-contracts": "v2.5.0", "symfony/config": "v5.4.3", "symfony/console": "v5.0.8", "symfony/dependency-injection": "v5.1.7", "symfony/deprecation-contracts": "v2.2.0", "symfony/filesystem": "v5.0.8", "symfony/finder": "v5.0.8", "symfony/http-foundation": "v5.0.8", "symfony/mime": "v5.1.7", "symfony/polyfill-ctype": "v1.18.1", "symfony/polyfill-iconv": "v1.18.1", "symfony/polyfill-intl-idn": "v1.18.1", "symfony/polyfill-intl-normalizer": "v1.18.1", "symfony/polyfill-mbstring": "v1.18.1", "symfony/polyfill-php70": "v1.20.0", "symfony/polyfill-php72": "v1.18.1", "symfony/polyfill-php73": "v1.18.1", "symfony/polyfill-php80": "v1.18.1", "symfony/polyfill-php81": "v1.24.0", "symfony/process": "v5.0.8", "symfony/service-contracts": "v2.2.0", "symfony/translation": "v5.0.8", "symfony/translation-contracts": "v2.3.0", "symfony/var-exporter": "v5.4.6", "symfony/yaml": "v5.0.8", "tecnickcom/tcpdf": "6.3.5-p1", "true/punycode": "v2.1.1", "voku/portable-ascii": "1.5.3", "webmozart/assert": "1.10.0", "zbateson/mail-mime-parser": "1.2.1", "zbateson/mb-wrapper": "1.0.0", "zbateson/stream-decorators": "1.0.3" }, "extra": {"sha":"f87d2f7f577dc541a51341e771aa34e6a078cf6bb6fb402e7aade2ce0ee0e350","sig":"nT4BEwlQf9YTFGMYTR1cv9\/w2pfbJmv2cPxzuiPkMkac58nWA1WhTLfaxjMam+CL5dC4Uo1GOKPUlXdefSeT9Ah3Oha9F7lLQpFVZl6EpVKp4bj6+6kk4YF\/6na\/hage6fj\/8MZc93Rm3Tt9iPsn2GXPqkaKV\/\/G3Pahw95mYQPXFA5oiP0NqHZztPoe\/NApoVGCUgYN45wI0KR\/2l5049+zegS0f3AV0q431KyHFUwYDRIqH0wHH8NDf+n4p2mPq5zuk\/SP8NSdHRGBVU6K27AJY3hk7IiN4P\/CzEek4Tzb6I2trNVD29THV2kHX9IXJaEAzWznIg3IU0ftOm27DQ==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_8.5.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V8.5.0_Beta_1","fileSize":"84286489","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"Z7lPPNZKVri9bWcvX7FDdPE2BS9x+NqL1yJnSGLzeq0gTKXBqVz9wSvrriBVNGvWXjz4Tp++IFJQz8catTg6DOqzVwPEhOywurM4oJFFYgdtkXgCsjZgM0PEiv1AUVjV+ZTeYXMt+ESQVH6nPj\/h6FxV7E7h1YkLKWdwL5IJnB80Ak44yuvu4sQr2IRPwjbjPLiv1+3juQn7bOZ4Y\/C\/fAaF9v5gObj7j9OlsaP97yyAEn4Lc7HnrseJ0YadMkd7GkLnDnXNrbfd8x4+zWBHbMwDwuYupxhbuaTtFMJ2CoNlHNSzs6kZEtaGdWwXhwWNI3cGl\/yzCNhSFvPoBgHF7w=="},"require":{"ionCubeLoader":"10.1.0"}} }, "8.4.1-release.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "8.4.1", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^7.2.0 || ^7.3.0 || ^7.4.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-8.4.1-release.1.zip", "type": "zip" }, "time": "2022-02-17", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "1.1.0", "authorizenet/authorizenet": "1.9.9", "aws/aws-sdk-php": "3.138.0", "bitpay/php-client": "v3.0.0-p2", "brick/math": "0.8.15", "bshaffer/oauth2-server-httpfoundation-bridge": "v1.4-p1", "bshaffer/oauth2-server-php": "v1.11.1-p1", "composer/ca-bundle": "1.2.8", "composer/composer": "1.10.6", "composer/semver": "1.5.1", "composer/spdx-licenses": "1.5.3", "composer/xdebug-handler": "1.4.3", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "1.10.2", "doctrine/inflector": "1.4.1", "doctrine/instantiator": "1.3.0", "doctrine/lexer": "1.2.0", "duosecurity/duo_php": "1.0.1", "egulias/email-validator": "2.1.22", "ezyang/htmlpurifier": "v4.12.0", "facebook/graph-sdk": "5.7.0", "filp/whoops": "2.7.2", "firebase/php-jwt": "v5.2.0", "goetas-webservices/xsd2php-runtime": "v0.2.12", "google/apiclient": "2.7.0-p1", "google/auth": "v1.11.1", "google/recaptcha": "1.2.4", "guzzlehttp/guzzle": "7.0.1", "guzzlehttp/promises": "v1.3.1", "guzzlehttp/psr7": "1.6.1", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v7.12.0", "illuminate/container": "v7.12.0", "illuminate/contracts": "v7.12.0", "illuminate/database": "v7.12.0", "illuminate/events": "v7.12.0", "illuminate/filesystem": "v7.28.4", "illuminate/support": "v7.12.0", "illuminate/translation": "v7.28.4", "illuminate/validation": "v7.12.0", "jms/metadata": "1.7.0", "jms/parser-lib": "1.0.0", "jms/serializer": "1.14.1", "justinrainbow/json-schema": "5.2.9", "knplabs/knp-menu": "v3.1.1", "laminas/laminas-diactoros": "2.3.1", "laminas/laminas-httphandlerrunner": "1.2.0", "laminas/laminas-loader": "2.6.1", "laminas/laminas-mail": "2.14.0-p1", "laminas/laminas-mime": "2.7.4", "laminas/laminas-stdlib": "3.3.0", "laminas/laminas-validator": "2.13.4", "laminas/laminas-zendframework-bridge": "1.1.1", "league/climate": "3.5.2", "league/flysystem": "1.0.67", "league/flysystem-aws-s3-v3": "1.0.24", "league/oauth2-client": "2.5.0", "league/oauth2-google": "3.0.3", "league/plates": "3.3.0", "michelf/php-markdown": "1.9.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "2.0.2", "mtdowling/jmespath.php": "2.6.0", "nesbot/carbon": "2.33.0", "nikic/fast-route": "v1.3.0", "paragonie/random_compat": "v9.99.100", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.1.5", "phpmyadmin/sql-parser": "5.3.1", "phpoption/phpoption": "1.7.3", "phpseclib/mcrypt_compat": "1.0.11", "phpseclib/phpseclib": "2.0.27", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-client": "1.0.1", "psr/http-factory": "1.0.1", "psr/http-message": "1.0.1", "psr/http-server-handler": "1.0.1", "psr/log": "1.0.2", "psr/simple-cache": "1.0.1", "punic/punic": "3.5.1", "ralouphie/getallheaders": "3.0.3", "ramsey/collection": "1.0.1", "ramsey/uuid": "4.0.1", "react/promise": "v2.8.0", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.8.0", "seld/phar-utils": "1.1.0", "smarty/smarty": "v3.1.36", "sonata-project/google-authenticator": "2.2.0", "stevenmaguire/oauth2-microsoft": "2.2.0", "stripe/stripe-php": "v7.34.0", "symfony/config": "v5.4.3", "symfony/console": "v5.0.8", "symfony/dependency-injection": "v5.1.7", "symfony/deprecation-contracts": "v2.2.0", "symfony/filesystem": "v5.0.8", "symfony/finder": "v5.0.8", "symfony/http-foundation": "v5.0.8", "symfony/mime": "v5.1.7", "symfony/polyfill-ctype": "v1.18.1", "symfony/polyfill-iconv": "v1.18.1", "symfony/polyfill-intl-idn": "v1.18.1", "symfony/polyfill-intl-normalizer": "v1.18.1", "symfony/polyfill-mbstring": "v1.18.1", "symfony/polyfill-php70": "v1.20.0", "symfony/polyfill-php72": "v1.18.1", "symfony/polyfill-php73": "v1.18.1", "symfony/polyfill-php80": "v1.18.1", "symfony/polyfill-php81": "v1.24.0", "symfony/process": "v5.0.8", "symfony/service-contracts": "v2.2.0", "symfony/translation": "v5.0.8", "symfony/translation-contracts": "v2.3.0", "symfony/yaml": "v5.0.8", "tecnickcom/tcpdf": "6.3.5-p1", "true/punycode": "v2.1.1", "voku/portable-ascii": "1.5.3", "zbateson/mail-mime-parser": "1.2.1", "zbateson/mb-wrapper": "1.0.0", "zbateson/stream-decorators": "1.0.3" }, "extra": {"sha":"3ba973ed13e1df2cc80578c62db6d6016310b9476f136ad7cdf53f385eafbe38","sig":"P3BLK7Q5UOnGnVvhcep2ymYdunEwobfAv2S5YxuNEIcqGboPhfgLYjnLzRvIq5jTQmYiaU1KJyDNiYsZMk+xBjumuOS1Hb6ERcjsvQtHd6a4SrL\/qZpAoqM1OlsqgUvsWMDtWhaDUc6XFVHXB\/SA3q3ksUyYWrtllXb\/qgHcMvzJDH7xr05D3iW\/w5q37rhKj83bGnHqaLk2zkHjs3BqIQWFO693ldHF4qac7TSiWzNl+AxvfypOkG0b5EvcR3y0I6UHGNg4u8ddaolNwqCeO3FEedxOyWFxdWs2uw6UZSfI0PfdXwsmTKh5T4vMSTZbAGyaBl+4W4nSjP0qq514PA==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_8.4.1_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V8.4.1","fileSize":"80044630","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"RPNljvww6d8LHpBBajO71pVVDAtgWZ4KdAdIDqMNkLLIjxMKc3htWOt1clA\/8zhjYtjQ0kAqRyF1OV1fQvi4F6gkCpPKPthqeqojxye77knEJmZtG5uepA30mxuQED8TaEFh134Q9lLt9Hd7+iS0htR3NmjpKRtEd00HGk6JS06Ik1jvVpLdIITC8m4gr9j2\/fS5JquGEK9oVo+4zQJzGRX5ITksoP510tIMbyD3blH2AJL\/vWACqLtj68+N7on5m\/eALTkHQXQTypiqHsTiVsiGba9iiOrxx1ajEk45HfjxlhoX9ALU1XoaBhLs4C0YjCCTg0Y+RD0m55EnWaF63A=="},"require":{"ionCubeLoader":"10.1.0"}} }, "8.4.0-release.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "8.4.0", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^7.2.0 || ^7.3.0 || ^7.4.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-8.4.0-release.1.zip", "type": "zip" }, "time": "2022-01-17", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "1.1.0", "authorizenet/authorizenet": "1.9.9", "aws/aws-sdk-php": "3.138.0", "bitpay/php-client": "v3.0.0-p2", "brick/math": "0.8.15", "bshaffer/oauth2-server-httpfoundation-bridge": "v1.4-p1", "bshaffer/oauth2-server-php": "v1.11.1-p1", "composer/ca-bundle": "1.2.8", "composer/composer": "1.10.6", "composer/semver": "1.5.1", "composer/spdx-licenses": "1.5.3", "composer/xdebug-handler": "1.4.3", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "1.10.2", "doctrine/inflector": "1.4.1", "doctrine/instantiator": "1.3.0", "doctrine/lexer": "1.2.0", "duosecurity/duo_php": "1.0.1", "egulias/email-validator": "2.1.22", "ezyang/htmlpurifier": "v4.12.0", "facebook/graph-sdk": "5.7.0", "filp/whoops": "2.7.2", "firebase/php-jwt": "v5.2.0", "goetas-webservices/xsd2php-runtime": "v0.2.12", "google/apiclient": "2.7.0-p1", "google/auth": "v1.11.1", "google/recaptcha": "1.2.4", "guzzlehttp/guzzle": "7.0.1", "guzzlehttp/promises": "v1.3.1", "guzzlehttp/psr7": "1.6.1", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v7.12.0", "illuminate/container": "v7.12.0", "illuminate/contracts": "v7.12.0", "illuminate/database": "v7.12.0", "illuminate/events": "v7.12.0", "illuminate/filesystem": "v7.28.4", "illuminate/support": "v7.12.0", "illuminate/translation": "v7.28.4", "illuminate/validation": "v7.12.0", "jms/metadata": "1.7.0", "jms/parser-lib": "1.0.0", "jms/serializer": "1.14.1", "justinrainbow/json-schema": "5.2.9", "knplabs/knp-menu": "v3.1.1", "laminas/laminas-diactoros": "2.3.1", "laminas/laminas-httphandlerrunner": "1.2.0", "laminas/laminas-loader": "2.6.1", "laminas/laminas-mail": "2.14.0-p1", "laminas/laminas-mime": "2.7.4", "laminas/laminas-stdlib": "3.3.0", "laminas/laminas-validator": "2.13.4", "laminas/laminas-zendframework-bridge": "1.1.1", "league/climate": "3.5.2", "league/flysystem": "1.0.67", "league/flysystem-aws-s3-v3": "1.0.24", "league/oauth2-client": "2.5.0", "league/oauth2-google": "3.0.3", "league/plates": "3.3.0", "michelf/php-markdown": "1.9.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "2.0.2", "mtdowling/jmespath.php": "2.6.0", "nesbot/carbon": "2.33.0", "nikic/fast-route": "v1.3.0", "paragonie/random_compat": "v9.99.100", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.1.5", "phpmyadmin/sql-parser": "5.3.1", "phpoption/phpoption": "1.7.3", "phpseclib/mcrypt_compat": "1.0.11", "phpseclib/phpseclib": "2.0.27", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-client": "1.0.1", "psr/http-factory": "1.0.1", "psr/http-message": "1.0.1", "psr/http-server-handler": "1.0.1", "psr/log": "1.0.2", "psr/simple-cache": "1.0.1", "punic/punic": "3.5.1", "ralouphie/getallheaders": "3.0.3", "ramsey/collection": "1.0.1", "ramsey/uuid": "4.0.1", "react/promise": "v2.8.0", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.8.0", "seld/phar-utils": "1.1.0", "smarty/smarty": "v3.1.36", "sonata-project/google-authenticator": "2.2.0", "stevenmaguire/oauth2-microsoft": "2.2.0", "stripe/stripe-php": "v7.34.0", "symfony/config": "v5.4.2", "symfony/console": "v5.0.8", "symfony/dependency-injection": "v5.1.7", "symfony/deprecation-contracts": "v2.2.0", "symfony/filesystem": "v5.0.8", "symfony/finder": "v5.0.8", "symfony/http-foundation": "v5.0.8", "symfony/mime": "v5.1.7", "symfony/polyfill-ctype": "v1.18.1", "symfony/polyfill-iconv": "v1.18.1", "symfony/polyfill-intl-idn": "v1.18.1", "symfony/polyfill-intl-normalizer": "v1.18.1", "symfony/polyfill-mbstring": "v1.18.1", "symfony/polyfill-php70": "v1.20.0", "symfony/polyfill-php72": "v1.18.1", "symfony/polyfill-php73": "v1.18.1", "symfony/polyfill-php80": "v1.18.1", "symfony/polyfill-php81": "v1.24.0", "symfony/process": "v5.0.8", "symfony/service-contracts": "v2.2.0", "symfony/translation": "v5.0.8", "symfony/translation-contracts": "v2.3.0", "symfony/yaml": "v5.0.8", "tecnickcom/tcpdf": "6.3.5-p1", "true/punycode": "v2.1.1", "voku/portable-ascii": "1.5.3", "zbateson/mail-mime-parser": "1.2.1", "zbateson/mb-wrapper": "1.0.0", "zbateson/stream-decorators": "1.0.3" }, "extra": {"sha":"6dcd38824039125f912453b47e1cf2adaaa62a1ccd9c06305d0cb5ede448c208","sig":"gzx2rtPpwEHOPjHkRcG6ctBUMTUSkf9P8QleKZPb562R3oefaNXQ5+0zX9SybDaC\/54vvsIIzyUU\/YXL\/b2rYcBhwYyznq9TtpETWhAySnVL8VJuvBmvxWbp2tvxaxYQQCTn\/ZDY5cie1KjeNjk2auSc32mgsvyu+hI5aQi1PNsftwoutYo6KWZrypx5gu10AMUo5aDj5jTLDA\/uIhd7OKp5DIpFg1S2WcoiQ0XXGqTjCUWxa34GVfT6KtHGfQUWi4vk6QM2edScZD1jNoD2Tnj1lPhGk9\/UqWOYFFflJrCjWTkSZDKrWG1o95wODazCjegAKdSkwN+uv+NKRTnrOQ==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_8.4.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V8.4.0_GA","fileSize":"80023206","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"avAy9s4qebwsfxXN6u13eIZRk7UuSyIKu7UuoyCg+3BWB2luoZ0vLSJ0Qvm7QWkhJzhjit+kRQgXUFSQ\/8\/zm9VgzLEza8mvofVQ02qioe6AWVVufhiazUMjwNxtisOa5RXU\/s2eWvf2GDLN8t4i4Nbhzt83H9wmvuUqi2mypzZhCJbnPkI9Sh8HSLHGQBI6KJct0KGbn5cqEOtVQGdMvJLD64NbBXiueRm4wzx0OsmExly\/HKdoAzcTHCdmViLlsVg9Y33bel948O+YmiATjNfcIYcykunZUm+ZauewlErBYUpdk2EbJGIafIvsDGFYJDDBD1x4kL+yqyOdQCD5yg=="},"require":{"ionCubeLoader":"10.1.0"}} }, "8.4.0-rc.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "8.4.0-RC.1", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^7.2.0 || ^7.3.0 || ^7.4.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-8.4.0-rc.1.zip", "type": "zip" }, "time": "2021-12-15", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "1.1.0", "authorizenet/authorizenet": "1.9.9", "aws/aws-sdk-php": "3.138.0", "bitpay/php-client": "v3.0.0-p2", "brick/math": "0.8.15", "bshaffer/oauth2-server-httpfoundation-bridge": "v1.4-p1", "bshaffer/oauth2-server-php": "v1.11.1-p1", "composer/ca-bundle": "1.2.8", "composer/composer": "1.10.6", "composer/semver": "1.5.1", "composer/spdx-licenses": "1.5.3", "composer/xdebug-handler": "1.4.3", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "1.10.2", "doctrine/inflector": "1.4.1", "doctrine/instantiator": "1.3.0", "doctrine/lexer": "1.2.0", "duosecurity/duo_php": "1.0.1", "egulias/email-validator": "2.1.22", "ezyang/htmlpurifier": "v4.12.0", "facebook/graph-sdk": "5.7.0", "filp/whoops": "2.7.2", "firebase/php-jwt": "v5.2.0", "goetas-webservices/xsd2php-runtime": "v0.2.12", "google/apiclient": "2.7.0-p1", "google/auth": "v1.11.1", "google/recaptcha": "1.2.4", "guzzlehttp/guzzle": "7.0.1", "guzzlehttp/promises": "v1.3.1", "guzzlehttp/psr7": "1.6.1", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v7.12.0", "illuminate/container": "v7.12.0", "illuminate/contracts": "v7.12.0", "illuminate/database": "v7.12.0", "illuminate/events": "v7.12.0", "illuminate/filesystem": "v7.28.4", "illuminate/support": "v7.12.0", "illuminate/translation": "v7.28.4", "illuminate/validation": "v7.12.0", "jms/metadata": "1.7.0", "jms/parser-lib": "1.0.0", "jms/serializer": "1.14.1", "justinrainbow/json-schema": "5.2.9", "knplabs/knp-menu": "v3.1.1", "laminas/laminas-diactoros": "2.3.1", "laminas/laminas-httphandlerrunner": "1.2.0", "laminas/laminas-loader": "2.6.1", "laminas/laminas-mail": "2.14.0-p1", "laminas/laminas-mime": "2.7.4", "laminas/laminas-stdlib": "3.3.0", "laminas/laminas-validator": "2.13.4", "laminas/laminas-zendframework-bridge": "1.1.1", "league/climate": "3.5.2", "league/flysystem": "1.0.67", "league/flysystem-aws-s3-v3": "1.0.24", "league/oauth2-client": "2.5.0", "league/oauth2-google": "3.0.3", "league/plates": "3.3.0", "michelf/php-markdown": "1.9.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "2.0.2", "mtdowling/jmespath.php": "2.6.0", "nesbot/carbon": "2.33.0", "nikic/fast-route": "v1.3.0", "paragonie/random_compat": "v9.99.100", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.1.5", "phpmyadmin/sql-parser": "5.3.1", "phpoption/phpoption": "1.7.3", "phpseclib/mcrypt_compat": "1.0.11", "phpseclib/phpseclib": "2.0.27", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-client": "1.0.1", "psr/http-factory": "1.0.1", "psr/http-message": "1.0.1", "psr/http-server-handler": "1.0.1", "psr/log": "1.0.2", "psr/simple-cache": "1.0.1", "punic/punic": "3.5.1", "ralouphie/getallheaders": "3.0.3", "ramsey/collection": "1.0.1", "ramsey/uuid": "4.0.1", "react/promise": "v2.8.0", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.8.0", "seld/phar-utils": "1.1.0", "smarty/smarty": "v3.1.36", "sonata-project/google-authenticator": "2.2.0", "stevenmaguire/oauth2-microsoft": "2.2.0", "stripe/stripe-php": "v7.34.0", "symfony/config": "v5.4.0", "symfony/console": "v5.0.8", "symfony/dependency-injection": "v5.1.7", "symfony/deprecation-contracts": "v2.2.0", "symfony/filesystem": "v5.0.8", "symfony/finder": "v5.0.8", "symfony/http-foundation": "v5.0.8", "symfony/mime": "v5.1.7", "symfony/polyfill-ctype": "v1.18.1", "symfony/polyfill-iconv": "v1.18.1", "symfony/polyfill-intl-idn": "v1.18.1", "symfony/polyfill-intl-normalizer": "v1.18.1", "symfony/polyfill-mbstring": "v1.18.1", "symfony/polyfill-php70": "v1.20.0", "symfony/polyfill-php72": "v1.18.1", "symfony/polyfill-php73": "v1.18.1", "symfony/polyfill-php80": "v1.18.1", "symfony/polyfill-php81": "v1.23.0", "symfony/process": "v5.0.8", "symfony/service-contracts": "v2.2.0", "symfony/translation": "v5.0.8", "symfony/translation-contracts": "v2.3.0", "symfony/yaml": "v5.0.8", "tecnickcom/tcpdf": "6.3.5-p1", "true/punycode": "v2.1.1", "voku/portable-ascii": "1.5.3", "zbateson/mail-mime-parser": "1.2.1", "zbateson/mb-wrapper": "1.0.0", "zbateson/stream-decorators": "1.0.3" }, "extra": {"sha":"ad8cbafb13d37eff2721c6fefffbaa98ecc2ba235597d61e780807045c53b5f2","sig":"TUopMN3gynf8dy+bRvJmgsadzOAE\/S7XzDHwClEYA+nKaa7GtLsbw5oLz1JXdSanC81O4ZRFsPsPyrk2bWu+FYV9V8jWH1qgys\/FoOMXDlslEgNZUPCOb2jjUogacypwpCIK0RDLn4AUvbCzVaE\/U90pt+XNFf\/uwF1lyN+4nbWoXI3gCI\/EYbq8XeYpRVDjPmZCXRxwazu\/Ljappq+wb8IQnxE7CsOQQfYw91wYXv78OeXFlPyobpkQ+uWegwwOAILwDTqJjtxr6MrFjEjhdOAkc6vB4SwOElux0gqLu+bZeabuZGXkFaZu9on32s3I7Zlu\/A5SIZq3GB9Z90WRZw==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_8.4.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V8.4.0_RC_1","fileSize":"79970712","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"DJsCYJw4JXZHyHKt+IIW8bfmPv5b2hLlH3osxvwKdKQ+WsFyva5qSk7LFdJBrSG06hOXAoaF7fEOXTo9k59ZfnSulWds8xY7fSPzkQIG2ySl1EWp4c1fmHVbEgXRawJfVF+8yoTCsGfdE8iE+kPjGpFnb9SYRNqmqo12AH8GjVAUN8Bvx5\/u14aO4XsTI+\/GYojB380D4fbKdj75K25fVUuxQ4HDlf65EeXR9TLxJNkrEBZGjQHPe32M4\/G+yxQb+6EhO2Wp3Vs0OuFRa+pQWhJrNdJCPK3KIRkLcg8eAjoFya0Czx2Q07azX+kgz7tdHZ\/JFVKzs36+WqUj+dItcQ=="},"require":{"ionCubeLoader":"10.1.0"}} }, "8.4.0-beta.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "8.4.0-beta.1", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^7.2.0 || ^7.3.0 || ^7.4.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-8.4.0-beta.1.zip", "type": "zip" }, "time": "2021-11-22", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "1.1.0", "authorizenet/authorizenet": "1.9.9", "aws/aws-sdk-php": "3.138.0", "bitpay/php-client": "v3.0.0-p2", "brick/math": "0.8.15", "bshaffer/oauth2-server-httpfoundation-bridge": "v1.4-p1", "bshaffer/oauth2-server-php": "v1.11.1-p1", "composer/ca-bundle": "1.2.8", "composer/composer": "1.10.6", "composer/semver": "1.5.1", "composer/spdx-licenses": "1.5.3", "composer/xdebug-handler": "1.4.3", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "1.10.2", "doctrine/inflector": "1.4.1", "doctrine/instantiator": "1.3.0", "doctrine/lexer": "1.2.0", "duosecurity/duo_php": "1.0.1", "egulias/email-validator": "2.1.22", "ezyang/htmlpurifier": "v4.12.0", "facebook/graph-sdk": "5.7.0", "filp/whoops": "2.7.2", "firebase/php-jwt": "v5.2.0", "goetas-webservices/xsd2php-runtime": "v0.2.12", "google/apiclient": "2.7.0-p1", "google/auth": "v1.11.1", "google/recaptcha": "1.2.4", "guzzlehttp/guzzle": "7.0.1", "guzzlehttp/promises": "v1.3.1", "guzzlehttp/psr7": "1.6.1", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v7.12.0", "illuminate/container": "v7.12.0", "illuminate/contracts": "v7.12.0", "illuminate/database": "v7.12.0", "illuminate/events": "v7.12.0", "illuminate/filesystem": "v7.28.4", "illuminate/support": "v7.12.0", "illuminate/translation": "v7.28.4", "illuminate/validation": "v7.12.0", "jms/metadata": "1.7.0", "jms/parser-lib": "1.0.0", "jms/serializer": "1.14.1", "justinrainbow/json-schema": "5.2.9", "knplabs/knp-menu": "v3.1.1", "laminas/laminas-diactoros": "2.3.1", "laminas/laminas-httphandlerrunner": "1.2.0", "laminas/laminas-loader": "2.6.1", "laminas/laminas-mail": "2.14.0-p1", "laminas/laminas-mime": "2.7.4", "laminas/laminas-stdlib": "3.3.0", "laminas/laminas-validator": "2.13.4", "laminas/laminas-zendframework-bridge": "1.1.1", "league/climate": "3.5.2", "league/flysystem": "1.0.67", "league/flysystem-aws-s3-v3": "1.0.24", "league/oauth2-client": "2.5.0", "league/oauth2-google": "3.0.3", "league/plates": "3.3.0", "michelf/php-markdown": "1.9.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "2.0.2", "mtdowling/jmespath.php": "2.6.0", "nesbot/carbon": "2.33.0", "nikic/fast-route": "v1.3.0", "paragonie/random_compat": "v9.99.100", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.1.5", "phpmyadmin/sql-parser": "5.3.1", "phpoption/phpoption": "1.7.3", "phpseclib/mcrypt_compat": "1.0.11", "phpseclib/phpseclib": "2.0.27", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-client": "1.0.1", "psr/http-factory": "1.0.1", "psr/http-message": "1.0.1", "psr/http-server-handler": "1.0.1", "psr/log": "1.0.2", "psr/simple-cache": "1.0.1", "punic/punic": "3.5.1", "ralouphie/getallheaders": "3.0.3", "ramsey/collection": "1.0.1", "ramsey/uuid": "4.0.1", "react/promise": "v2.8.0", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.8.0", "seld/phar-utils": "1.1.0", "smarty/smarty": "v3.1.36", "sonata-project/google-authenticator": "2.2.0", "stevenmaguire/oauth2-microsoft": "2.2.0", "stripe/stripe-php": "v7.34.0", "symfony/config": "v5.4.0", "symfony/console": "v5.0.8", "symfony/dependency-injection": "v5.1.7", "symfony/deprecation-contracts": "v2.2.0", "symfony/filesystem": "v5.0.8", "symfony/finder": "v5.0.8", "symfony/http-foundation": "v5.0.8", "symfony/mime": "v5.1.7", "symfony/polyfill-ctype": "v1.18.1", "symfony/polyfill-iconv": "v1.18.1", "symfony/polyfill-intl-idn": "v1.18.1", "symfony/polyfill-intl-normalizer": "v1.18.1", "symfony/polyfill-mbstring": "v1.18.1", "symfony/polyfill-php70": "v1.20.0", "symfony/polyfill-php72": "v1.18.1", "symfony/polyfill-php73": "v1.18.1", "symfony/polyfill-php80": "v1.18.1", "symfony/polyfill-php81": "v1.23.0", "symfony/process": "v5.0.8", "symfony/service-contracts": "v2.2.0", "symfony/translation": "v5.0.8", "symfony/translation-contracts": "v2.3.0", "symfony/yaml": "v5.0.8", "tecnickcom/tcpdf": "6.3.5-p1", "true/punycode": "v2.1.1", "voku/portable-ascii": "1.5.3", "zbateson/mail-mime-parser": "1.2.1", "zbateson/mb-wrapper": "1.0.0", "zbateson/stream-decorators": "1.0.3" }, "extra": {"sha":"b66994a5da551159d1ce21fb4708c75de6d30cfb5fac07d268b1a080f4d025f2","sig":"enrpvGeTrTr9eB0Zxw4agwom\/9PGmNPGaLEfYglt+2pEpoRfh26OeCzxtSvFe6ykosoxq7dGumcQatMe\/EuSKWeerqwHaGWWUCMRvkKb6IoInCpG8QEdNfZwSCz\/38\/eAZ1niFpjXF15ptc4Yoa6glr0rBMybwFHE+Ra0X7v4OP5N9WO0Q190c2c3P5Y+v0vPTjfaKUHXOfDp5wWBUS83xTB\/i0CI4rhwIPGKfXCKRyErz6kMZ70LvQVNaSO6FuWSRUy0KqzWjCL6WcVig5v20MKSUPRb6erLzB8+yx4\/QvJsJFKpWeJeBdffaY5g4CSp0t\/4iFu8zFapdwHGfuHYQ==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_8.4.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V8.4.0_Beta_1","fileSize":"79948144","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"AC+somDDYxcUq5a1KkgKFJdlXDA0Oxt3uupliUJozC2Utw9c9nuKYjWfj1VqPAt1LkmmdqanVJMioQBsCYqA7LCKrH7bKMjH+QO+Cl\/uoV5RylAJ990jevgvjOQAfuNYJZCfflD6+Ou74Mr8dAzE+M0StjlB+AjCA\/66rrQf2y4J6njXAkcOC7HLBRN1m5KqlmOFIvoj8H+BZtn\/yBUwD4dPApivV9Nt0tjIqhYOdxIhqNr0YzxpaFlHs\/jOpImR1iGmxLVOjY7CDBToBpPK635Ds1Y\/bJNFgOSSR2uD1rRW\/Nb9xWZeydE1wyjw0yhi7JOA9zELz30ikkUSznfa3A=="},"require":{"ionCubeLoader":"10.1.0"}} }, "8.3.2-release.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "8.3.2", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^7.2.0 || ^7.3.0 || ^7.4.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-8.3.2-release.1.zip", "type": "zip" }, "time": "2021-10-26", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "1.1.0", "authorizenet/authorizenet": "1.9.9", "aws/aws-sdk-php": "3.138.0", "bitpay/php-client": "v3.0.0-p2", "brick/math": "0.8.15", "bshaffer/oauth2-server-httpfoundation-bridge": "v1.4-p1", "bshaffer/oauth2-server-php": "v1.11.1-p1", "composer/ca-bundle": "1.2.8", "composer/composer": "1.10.6", "composer/semver": "1.5.1", "composer/spdx-licenses": "1.5.3", "composer/xdebug-handler": "1.4.3", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "1.10.2", "doctrine/inflector": "1.4.1", "doctrine/instantiator": "1.3.0", "doctrine/lexer": "1.2.0", "duosecurity/duo_php": "1.0.1", "egulias/email-validator": "2.1.22", "ezyang/htmlpurifier": "v4.12.0", "facebook/graph-sdk": "5.7.0", "filp/whoops": "2.7.2", "firebase/php-jwt": "v5.2.0", "goetas-webservices/xsd2php-runtime": "v0.2.12", "google/apiclient": "2.7.0-p1", "google/auth": "v1.11.1", "google/recaptcha": "1.2.4", "guzzlehttp/guzzle": "7.0.1", "guzzlehttp/promises": "v1.3.1", "guzzlehttp/psr7": "1.6.1", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v7.12.0", "illuminate/container": "v7.12.0", "illuminate/contracts": "v7.12.0", "illuminate/database": "v7.12.0", "illuminate/events": "v7.12.0", "illuminate/filesystem": "v7.28.4", "illuminate/support": "v7.12.0", "illuminate/translation": "v7.28.4", "illuminate/validation": "v7.12.0", "jms/metadata": "1.7.0", "jms/parser-lib": "1.0.0", "jms/serializer": "1.14.1", "justinrainbow/json-schema": "5.2.9", "knplabs/knp-menu": "v3.1.1", "laminas/laminas-diactoros": "2.3.1", "laminas/laminas-httphandlerrunner": "1.2.0", "laminas/laminas-loader": "2.6.1", "laminas/laminas-mail": "2.14.0-p1", "laminas/laminas-mime": "2.7.4", "laminas/laminas-stdlib": "3.3.0", "laminas/laminas-validator": "2.13.4", "laminas/laminas-zendframework-bridge": "1.1.1", "league/climate": "3.5.2", "league/flysystem": "1.0.67", "league/flysystem-aws-s3-v3": "1.0.24", "league/oauth2-client": "2.5.0", "league/oauth2-google": "3.0.3", "league/plates": "3.3.0", "michelf/php-markdown": "1.9.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "2.0.2", "mtdowling/jmespath.php": "2.6.0", "nesbot/carbon": "2.33.0", "nikic/fast-route": "v1.3.0", "paragonie/random_compat": "v9.99.100", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.1.5", "phpmyadmin/sql-parser": "5.3.1", "phpoption/phpoption": "1.7.3", "phpseclib/mcrypt_compat": "1.0.11", "phpseclib/phpseclib": "2.0.27", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-client": "1.0.1", "psr/http-factory": "1.0.1", "psr/http-message": "1.0.1", "psr/http-server-handler": "1.0.1", "psr/log": "1.0.2", "psr/simple-cache": "1.0.1", "punic/punic": "3.5.1", "ralouphie/getallheaders": "3.0.3", "ramsey/collection": "1.0.1", "ramsey/uuid": "4.0.1", "react/promise": "v2.8.0", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.8.0", "seld/phar-utils": "1.1.0", "smarty/smarty": "v3.1.36", "sonata-project/google-authenticator": "2.2.0", "stevenmaguire/oauth2-microsoft": "2.2.0", "stripe/stripe-php": "v7.34.0", "symfony/config": "v5.3.11", "symfony/console": "v5.0.8", "symfony/dependency-injection": "v5.1.7", "symfony/deprecation-contracts": "v2.2.0", "symfony/filesystem": "v5.0.8", "symfony/finder": "v5.0.8", "symfony/http-foundation": "v5.0.8", "symfony/mime": "v5.1.7", "symfony/polyfill-ctype": "v1.18.1", "symfony/polyfill-iconv": "v1.18.1", "symfony/polyfill-intl-idn": "v1.18.1", "symfony/polyfill-intl-normalizer": "v1.18.1", "symfony/polyfill-mbstring": "v1.18.1", "symfony/polyfill-php70": "v1.20.0", "symfony/polyfill-php72": "v1.18.1", "symfony/polyfill-php73": "v1.18.1", "symfony/polyfill-php80": "v1.18.1", "symfony/polyfill-php81": "v1.23.0", "symfony/process": "v5.0.8", "symfony/service-contracts": "v2.2.0", "symfony/translation": "v5.0.8", "symfony/translation-contracts": "v2.3.0", "symfony/yaml": "v5.0.8", "tecnickcom/tcpdf": "6.3.5-p1", "true/punycode": "v2.1.1", "voku/portable-ascii": "1.5.3", "zbateson/mail-mime-parser": "1.2.1", "zbateson/mb-wrapper": "1.0.0", "zbateson/stream-decorators": "1.0.3" }, "extra": {"sha":"306e9e2c3d0e67b00e24a964fd4db46c1148ea51ef5c52826ab266a27a523cb5","sig":"kC7bOEgp0P6oblUc8RYf8yVWbJ3vEYklgKeUALS4iYwKIeGZHPVaAGtUdthjmCpgYxHLGMyx8gYyiNzG\/\/3aaq8OchQ8M4lcu3rwmzx1etlVkz2+AmJER5UhKR8nIcDVzHwVskzt+s1Ji+\/sYeCcxhJqBFquXdYd\/sjycq6Ww5cWPrkREgK8picOlllYmnhkD8f7leQq\/exg4K\/zYNnTONW\/C8uVWH4pUbseiqCn8GBRrWB4ZAqBCkJIVP7V6jaaUB\/0xNo4sl14ZQua\/TC6o4m50p4YxPt\/aae5ZjQZGuA\/2xmNM7croJSEPrnPNCx5Pn1FKOu8QmtOe96yVxehxA==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_8.3.2_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V8.3.2","fileSize":"79729751","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"CK4E3hnYDLkcy6GDrVJP7rXfmff551oC9o6ogxR6gP6GeZAbnbf4G2YDMkI2tlUZXiLU6qiadOjkeGgaB2I9MWHclXnK\/9vmQ9JTn5\/lPr2am6x6Bh7bwPmpJN+pRFNmpFAR5\/iC\/rO19bsswxDci0RE0tg+9OviVtaM0PxOUbqaEGAcJp3eX96n06zhagK4ADU3ONAfIgn3+rT80TAiH7KDp+NL1rqIIDx5pqehYzwHk6AtAAu2DMLivWD\/aE2MJsmD4jjOyv\/AKrglZjuoxKFaUh7Io75cyV3bJvgi\/\/eCXso6cxlLYWwXq6xCLSvsyIkjssPmgqryMB5kiMCNGQ=="},"require":{"ionCubeLoader":"10.1.0"}} }, "8.3.1-release.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "8.3.1", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^7.2.0 || ^7.3.0 || ^7.4.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-8.3.1-release.1.zip", "type": "zip" }, "time": "2021-10-26", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "1.1.0", "authorizenet/authorizenet": "1.9.9", "aws/aws-sdk-php": "3.138.0", "bitpay/php-client": "v3.0.0-p2", "brick/math": "0.8.15", "bshaffer/oauth2-server-httpfoundation-bridge": "v1.4-p1", "bshaffer/oauth2-server-php": "v1.11.1-p1", "composer/ca-bundle": "1.2.8", "composer/composer": "1.10.6", "composer/semver": "1.5.1", "composer/spdx-licenses": "1.5.3", "composer/xdebug-handler": "1.4.3", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "1.10.2", "doctrine/inflector": "1.4.1", "doctrine/instantiator": "1.3.0", "doctrine/lexer": "1.2.0", "duosecurity/duo_php": "1.0.1", "egulias/email-validator": "2.1.22", "ezyang/htmlpurifier": "v4.12.0", "facebook/graph-sdk": "5.7.0", "filp/whoops": "2.7.2", "firebase/php-jwt": "v5.2.0", "goetas-webservices/xsd2php-runtime": "v0.2.12", "google/apiclient": "2.7.0-p1", "google/auth": "v1.11.1", "google/recaptcha": "1.2.4", "guzzlehttp/guzzle": "7.0.1", "guzzlehttp/promises": "v1.3.1", "guzzlehttp/psr7": "1.6.1", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v7.12.0", "illuminate/container": "v7.12.0", "illuminate/contracts": "v7.12.0", "illuminate/database": "v7.12.0", "illuminate/events": "v7.12.0", "illuminate/filesystem": "v7.28.4", "illuminate/support": "v7.12.0", "illuminate/translation": "v7.28.4", "illuminate/validation": "v7.12.0", "jms/metadata": "1.7.0", "jms/parser-lib": "1.0.0", "jms/serializer": "1.14.1", "justinrainbow/json-schema": "5.2.9", "knplabs/knp-menu": "v3.1.1", "laminas/laminas-diactoros": "2.3.1", "laminas/laminas-httphandlerrunner": "1.2.0", "laminas/laminas-loader": "2.6.1", "laminas/laminas-mail": "2.14.0-p1", "laminas/laminas-mime": "2.7.4", "laminas/laminas-stdlib": "3.3.0", "laminas/laminas-validator": "2.13.4", "laminas/laminas-zendframework-bridge": "1.1.1", "league/climate": "3.5.2", "league/flysystem": "1.0.67", "league/flysystem-aws-s3-v3": "1.0.24", "league/oauth2-client": "2.5.0", "league/oauth2-google": "3.0.3", "league/plates": "3.3.0", "michelf/php-markdown": "1.9.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "2.0.2", "mtdowling/jmespath.php": "2.6.0", "nesbot/carbon": "2.33.0", "nikic/fast-route": "v1.3.0", "paragonie/random_compat": "v9.99.100", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.1.5", "phpmyadmin/sql-parser": "5.3.1", "phpoption/phpoption": "1.7.3", "phpseclib/mcrypt_compat": "1.0.11", "phpseclib/phpseclib": "2.0.27", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-client": "1.0.1", "psr/http-factory": "1.0.1", "psr/http-message": "1.0.1", "psr/http-server-handler": "1.0.1", "psr/log": "1.0.2", "psr/simple-cache": "1.0.1", "punic/punic": "3.5.1", "ralouphie/getallheaders": "3.0.3", "ramsey/collection": "1.0.1", "ramsey/uuid": "4.0.1", "react/promise": "v2.8.0", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.8.0", "seld/phar-utils": "1.1.0", "smarty/smarty": "v3.1.36", "sonata-project/google-authenticator": "2.2.0", "stevenmaguire/oauth2-microsoft": "2.2.0", "stripe/stripe-php": "v7.34.0", "symfony/config": "v5.3.4", "symfony/console": "v5.0.8", "symfony/dependency-injection": "v5.1.7", "symfony/deprecation-contracts": "v2.2.0", "symfony/filesystem": "v5.0.8", "symfony/finder": "v5.0.8", "symfony/http-foundation": "v5.0.8", "symfony/mime": "v5.1.7", "symfony/polyfill-ctype": "v1.18.1", "symfony/polyfill-iconv": "v1.18.1", "symfony/polyfill-intl-idn": "v1.18.1", "symfony/polyfill-intl-normalizer": "v1.18.1", "symfony/polyfill-mbstring": "v1.18.1", "symfony/polyfill-php70": "v1.20.0", "symfony/polyfill-php72": "v1.18.1", "symfony/polyfill-php73": "v1.18.1", "symfony/polyfill-php80": "v1.18.1", "symfony/polyfill-php81": "v1.23.0", "symfony/process": "v5.0.8", "symfony/service-contracts": "v2.2.0", "symfony/translation": "v5.0.8", "symfony/translation-contracts": "v2.3.0", "symfony/yaml": "v5.0.8", "tecnickcom/tcpdf": "6.3.5-p1", "true/punycode": "v2.1.1", "voku/portable-ascii": "1.5.3", "zbateson/mail-mime-parser": "1.2.1", "zbateson/mb-wrapper": "1.0.0", "zbateson/stream-decorators": "1.0.3" }, "extra": {"sha":"af94a8b8b8467d6884d263254f689175bcb32ee6c6fb78e3a360a379763ef020","sig":"kY2YyhJpg4lDoQvrbaZ\/GZdoQI7FKAoK8HcmP3xIaJey2Be4sigeno2ZmU7FddW\/N0nXNMaAmY+CUqU2iZhMO8zu3gbJTNnyUIiR+irLdSkyWeLOlgoxVUwH3QSaTpz73c0DPdEoBECXBY345dykGIghgYu4cNN6ZoI0heuNvwL2W1IOaaUbGcfuSdmNvcvizLMWaRqZ9jTdR7REeWp+WrSrz4oAE4K2Hi6AyjxqGfNH92DEK7cPs\/wiGFgnn0vtqa8fVZbtN6cvaXDptzNoOqlFN2kZc9DM1ulayzJXfvE3ebTNQN88toXANe\/1aWWs6QqlzzSu40wO+xpxeP2qiQ==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_8.3.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V8.3.1","fileSize":"79713133","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"mNhQ7kuu7ItgzGzo3G7uci45FvC8HrrakZHjL20HqBFVFyoBY8yBeDXVBPb7x0bpbBqWGtA1AzZQSeB9nvz8wrs5qH\/h1TmJHd1b0\/B3vSN8LeN44cPetB66tpwzY1s8L5GM1IPSdb4bsoqx8rs6z5mZWnXE2BXzeDbXhQO0\/+NkHKYBaxRCRf8PEGfBX6N6gvFtgp0dk+YyROlOfbtCgV5CBpCwfRhkyQX9NAVT2JjpTTprNaTNGZImaZ08cv1H6hIoH3PBd8CmJoHhlhd8a+K18q+60HpR\/RWs+aSBNreKKseQd1L0G+oG6nqJmH8FovjBjNyO7L+C1qUiBUbQTw=="},"require":{"ionCubeLoader":"10.1.0"}} }, "8.3.0-release.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "8.3.0", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^7.2.0 || ^7.3.0 || ^7.4.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-8.3.0-release.1.zip", "type": "zip" }, "time": "2021-10-12", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "1.1.0", "authorizenet/authorizenet": "1.9.9", "aws/aws-sdk-php": "3.138.0", "bitpay/php-client": "v3.0.0-p2", "brick/math": "0.8.15", "bshaffer/oauth2-server-httpfoundation-bridge": "v1.4-p1", "bshaffer/oauth2-server-php": "v1.11.1-p1", "composer/ca-bundle": "1.2.8", "composer/composer": "1.10.6", "composer/semver": "1.5.1", "composer/spdx-licenses": "1.5.3", "composer/xdebug-handler": "1.4.3", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "1.10.2", "doctrine/inflector": "1.4.1", "doctrine/instantiator": "1.3.0", "doctrine/lexer": "1.2.0", "duosecurity/duo_php": "1.0.1", "egulias/email-validator": "2.1.22", "ezyang/htmlpurifier": "v4.12.0", "facebook/graph-sdk": "5.7.0", "filp/whoops": "2.7.2", "firebase/php-jwt": "v5.2.0", "goetas-webservices/xsd2php-runtime": "v0.2.12", "google/apiclient": "2.7.0-p1", "google/auth": "v1.11.1", "google/recaptcha": "1.2.4", "guzzlehttp/guzzle": "7.0.1", "guzzlehttp/promises": "v1.3.1", "guzzlehttp/psr7": "1.6.1", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v7.12.0", "illuminate/container": "v7.12.0", "illuminate/contracts": "v7.12.0", "illuminate/database": "v7.12.0", "illuminate/events": "v7.12.0", "illuminate/filesystem": "v7.28.4", "illuminate/support": "v7.12.0", "illuminate/translation": "v7.28.4", "illuminate/validation": "v7.12.0", "jms/metadata": "1.7.0", "jms/parser-lib": "1.0.0", "jms/serializer": "1.14.1", "justinrainbow/json-schema": "5.2.9", "knplabs/knp-menu": "v3.1.1", "laminas/laminas-diactoros": "2.3.1", "laminas/laminas-httphandlerrunner": "1.2.0", "laminas/laminas-loader": "2.6.1", "laminas/laminas-mail": "2.14.0-p1", "laminas/laminas-mime": "2.7.4", "laminas/laminas-stdlib": "3.3.0", "laminas/laminas-validator": "2.13.4", "laminas/laminas-zendframework-bridge": "1.1.1", "league/climate": "3.5.2", "league/flysystem": "1.0.67", "league/flysystem-aws-s3-v3": "1.0.24", "league/oauth2-client": "2.5.0", "league/oauth2-google": "3.0.3", "league/plates": "3.3.0", "michelf/php-markdown": "1.9.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "2.0.2", "mtdowling/jmespath.php": "2.6.0", "nesbot/carbon": "2.33.0", "nikic/fast-route": "v1.3.0", "paragonie/random_compat": "v9.99.100", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.1.5", "phpmyadmin/sql-parser": "5.3.1", "phpoption/phpoption": "1.7.3", "phpseclib/mcrypt_compat": "1.0.11", "phpseclib/phpseclib": "2.0.27", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-client": "1.0.1", "psr/http-factory": "1.0.1", "psr/http-message": "1.0.1", "psr/http-server-handler": "1.0.1", "psr/log": "1.0.2", "psr/simple-cache": "1.0.1", "punic/punic": "3.5.1", "ralouphie/getallheaders": "3.0.3", "ramsey/collection": "1.0.1", "ramsey/uuid": "4.0.1", "react/promise": "v2.8.0", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.8.0", "seld/phar-utils": "1.1.0", "smarty/smarty": "v3.1.36", "sonata-project/google-authenticator": "2.2.0", "stevenmaguire/oauth2-microsoft": "2.2.0", "stripe/stripe-php": "v7.34.0", "symfony/config": "v5.3.4", "symfony/console": "v5.0.8", "symfony/dependency-injection": "v5.1.7", "symfony/deprecation-contracts": "v2.2.0", "symfony/filesystem": "v5.0.8", "symfony/finder": "v5.0.8", "symfony/http-foundation": "v5.0.8", "symfony/mime": "v5.1.7", "symfony/polyfill-ctype": "v1.18.1", "symfony/polyfill-iconv": "v1.18.1", "symfony/polyfill-intl-idn": "v1.18.1", "symfony/polyfill-intl-normalizer": "v1.18.1", "symfony/polyfill-mbstring": "v1.18.1", "symfony/polyfill-php70": "v1.20.0", "symfony/polyfill-php72": "v1.18.1", "symfony/polyfill-php73": "v1.18.1", "symfony/polyfill-php80": "v1.18.1", "symfony/polyfill-php81": "v1.23.0", "symfony/process": "v5.0.8", "symfony/service-contracts": "v2.2.0", "symfony/translation": "v5.0.8", "symfony/translation-contracts": "v2.3.0", "symfony/yaml": "v5.0.8", "tecnickcom/tcpdf": "6.3.5-p1", "true/punycode": "v2.1.1", "voku/portable-ascii": "1.5.3", "zbateson/mail-mime-parser": "1.2.1", "zbateson/mb-wrapper": "1.0.0", "zbateson/stream-decorators": "1.0.3" }, "extra": {"sha":"fd1be846226aaad89c40c266c0db92caef37ab127b066f43bb9287e12bc2a4eb","sig":"TH0zteF08Jc6mdPwm3hsOazY59HKHU9gr7iV2ZNL9Vu90dmdIaa3MvPtUtm0Kpfz\/Csa1vil0t4ddaV3RUv\/JpWccVEXPMCcAW51iOymLIafYTCLN\/3Fb0h7ocCOcbErI6XwUDlH5exFhwY5VjVpaF\/sy61HcABk1k+6Ngi3uN1zqxPr+BlCg9Kb\/FGGa+bJFL0mwugWH9EGMpmVlupxX7MTByQROSwzsKrPQwGpmUsVRNBrUyxYFS1FiOv340O9B3eMnKMfiF47MBHfJMllzPxj5DJQBfnXVqGolKx4IW+T0YCeSb3ayY0rMhj0c+5nhyYtBDWqf8y8liD2K9spPg==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_8.3.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V8.3.0_GA","fileSize":"79698227","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"hKX\/g1JZ8eKblxg37L6buItUtsnTbHpINO7EqYnSal+dXkuPrQ4kX+Ot3M\/DwKqIwHT4HjWrnaueQdDHcx75mdLLoA\/ACkuoWjZy3kKccgsQc91LtllXN4IQZLthE0vWq8Vnu7a81g2oxarmQ2EfLLM7JZUo7Zd+83M2LSuHT58xJ+rg1mhTTLaoQuInFpyyaZBc7MFt1n9bHfOzp\/2SNf\/nC5epnP8Mf5aOQws8psPeK3I5W61z3EIZ8zhpeG9JupWAkfszrtqi5L3r4LXSOSvoxRrf\/zp2JZc6xuErclUutiU6G35AkfaZ66P2heuuO62ctow79gj6zF5u\/43y8w=="},"require":{"ionCubeLoader":"10.1.0"}} }, "8.3.0-rc.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "8.3.0-RC.1", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^7.2.0 || ^7.3.0 || ^7.4.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-8.3.0-rc.1.zip", "type": "zip" }, "time": "now", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "1.1.0", "authorizenet/authorizenet": "1.9.9", "aws/aws-sdk-php": "3.138.0", "bitpay/php-client": "v3.0.0-p2", "brick/math": "0.8.15", "bshaffer/oauth2-server-httpfoundation-bridge": "v1.4-p1", "bshaffer/oauth2-server-php": "v1.11.1-p1", "composer/ca-bundle": "1.2.8", "composer/composer": "1.10.6", "composer/semver": "1.5.1", "composer/spdx-licenses": "1.5.3", "composer/xdebug-handler": "1.4.3", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "1.10.2", "doctrine/inflector": "1.4.1", "doctrine/instantiator": "1.3.0", "doctrine/lexer": "1.2.0", "duosecurity/duo_php": "1.0.1", "egulias/email-validator": "2.1.22", "ezyang/htmlpurifier": "v4.12.0", "facebook/graph-sdk": "5.7.0", "filp/whoops": "2.7.2", "firebase/php-jwt": "v5.2.0", "goetas-webservices/xsd2php-runtime": "v0.2.12", "google/apiclient": "2.7.0-p1", "google/auth": "v1.11.1", "google/recaptcha": "1.2.4", "guzzlehttp/guzzle": "7.0.1", "guzzlehttp/promises": "v1.3.1", "guzzlehttp/psr7": "1.6.1", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v7.12.0", "illuminate/container": "v7.12.0", "illuminate/contracts": "v7.12.0", "illuminate/database": "v7.12.0", "illuminate/events": "v7.12.0", "illuminate/filesystem": "v7.28.4", "illuminate/support": "v7.12.0", "illuminate/translation": "v7.28.4", "illuminate/validation": "v7.12.0", "jms/metadata": "1.7.0", "jms/parser-lib": "1.0.0", "jms/serializer": "1.14.1", "justinrainbow/json-schema": "5.2.9", "knplabs/knp-menu": "v3.1.1", "laminas/laminas-diactoros": "2.3.1", "laminas/laminas-httphandlerrunner": "1.2.0", "laminas/laminas-loader": "2.6.1", "laminas/laminas-mail": "2.14.0-p1", "laminas/laminas-mime": "2.7.4", "laminas/laminas-stdlib": "3.3.0", "laminas/laminas-validator": "2.13.4", "laminas/laminas-zendframework-bridge": "1.1.1", "league/climate": "3.5.2", "league/flysystem": "1.0.67", "league/flysystem-aws-s3-v3": "1.0.24", "league/oauth2-client": "2.5.0", "league/oauth2-google": "3.0.3", "league/plates": "3.3.0", "michelf/php-markdown": "1.9.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "2.0.2", "mtdowling/jmespath.php": "2.6.0", "nesbot/carbon": "2.33.0", "nikic/fast-route": "v1.3.0", "paragonie/random_compat": "v9.99.100", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.1.5", "phpmyadmin/sql-parser": "5.3.1", "phpoption/phpoption": "1.7.3", "phpseclib/mcrypt_compat": "1.0.11", "phpseclib/phpseclib": "2.0.27", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-client": "1.0.1", "psr/http-factory": "1.0.1", "psr/http-message": "1.0.1", "psr/http-server-handler": "1.0.1", "psr/log": "1.0.2", "psr/simple-cache": "1.0.1", "punic/punic": "3.5.1", "ralouphie/getallheaders": "3.0.3", "ramsey/collection": "1.0.1", "ramsey/uuid": "4.0.1", "react/promise": "v2.8.0", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.8.0", "seld/phar-utils": "1.1.0", "smarty/smarty": "v3.1.36", "sonata-project/google-authenticator": "2.2.0", "stevenmaguire/oauth2-microsoft": "2.2.0", "stripe/stripe-php": "v7.34.0", "symfony/config": "v5.3.4", "symfony/console": "v5.0.8", "symfony/dependency-injection": "v5.1.7", "symfony/deprecation-contracts": "v2.2.0", "symfony/filesystem": "v5.0.8", "symfony/finder": "v5.0.8", "symfony/http-foundation": "v5.0.8", "symfony/mime": "v5.1.7", "symfony/polyfill-ctype": "v1.18.1", "symfony/polyfill-iconv": "v1.18.1", "symfony/polyfill-intl-idn": "v1.18.1", "symfony/polyfill-intl-normalizer": "v1.18.1", "symfony/polyfill-mbstring": "v1.18.1", "symfony/polyfill-php70": "v1.20.0", "symfony/polyfill-php72": "v1.18.1", "symfony/polyfill-php73": "v1.18.1", "symfony/polyfill-php80": "v1.18.1", "symfony/polyfill-php81": "v1.23.0", "symfony/process": "v5.0.8", "symfony/service-contracts": "v2.2.0", "symfony/translation": "v5.0.8", "symfony/translation-contracts": "v2.3.0", "symfony/yaml": "v5.0.8", "tecnickcom/tcpdf": "6.3.5-p1", "true/punycode": "v2.1.1", "voku/portable-ascii": "1.5.3", "zbateson/mail-mime-parser": "1.2.1", "zbateson/mb-wrapper": "1.0.0", "zbateson/stream-decorators": "1.0.3" }, "extra": {"sha":"04342e391c66d64aee601e388e2c8e6a515312e22b61160883dd6b0994fdf189","sig":"Zua1+Ijw4vUileq4mRyVePvCb11oIeHGzc+82DVve9kS0LQmWfqk031cBujIWjPJtrEJIrOzN91cJ2D4qDHFCpmKte6BtxXbsVUtCEaVI84AfITM3XzvqhEODqMZSrLpiVEEQP50ZIQIa\/VZMyu0rOf+am+mR8r6Vb4j78X5J5BtX65Py8cpHdi+Ej+aE72NV7m7uB1smga3Kw8jKJrUuSeI3zJQHncRU79Z4PHIIr0ZQ0gyyzFuJBdc0FU1YNNDMGlWInhH10OPGFXlwoSE946FwGx+xhuE4oqHHG7fU9J7VMqFAZZ7PbZpyIaLkVl5z9g9Pkxv1J9cq9xlQslAcw==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_8.3.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V8.3.0_RC_1","fileSize":"79657500","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"IXWVKjooxS7W1CLqGpZbAbRtT3Mv1KSrJ4s9fpMkcvUIRBI98MRJJm72pHAS\/jnI5gAH7tfLcq9iH6LCWzTsjQV6JutrqpGbfs7L5QYXW12zxATjZIVrx4IttgjpRoFIQHSY05bRQd10eYBLKj+sOXyD1WuC2isOvOCrIIiRkXI2GFTID\/lUywdC8CTSsIG4cbv5XgKF4pcvGKio3nT7lR8tLfAj84Fv3FapC+UKgnMQJBXh58ytgE9QljE1u\/sgnpf\/KVVyJNPeXd3PYxzHC48ET6sWm10HfeKQgVqE8EHH\/YBWyQvq3ljBBep7eWsFW0E+K\/DGbaib3YpCWIgT1Q=="},"require":{"ionCubeLoader":"10.1.0"}} }, "8.3.0-beta.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "8.3.0-beta.1", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^7.2.0 || ^7.3.0 || ^7.4.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-8.3.0-beta.1.zip", "type": "zip" }, "time": "now", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "1.1.0", "authorizenet/authorizenet": "1.9.9", "aws/aws-sdk-php": "3.138.0", "bitpay/php-client": "v3.0.0-p2", "brick/math": "0.8.15", "bshaffer/oauth2-server-httpfoundation-bridge": "v1.4-p1", "bshaffer/oauth2-server-php": "v1.11.1-p1", "composer/ca-bundle": "1.2.8", "composer/composer": "1.10.6", "composer/semver": "1.5.1", "composer/spdx-licenses": "1.5.3", "composer/xdebug-handler": "1.4.3", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "1.10.2", "doctrine/inflector": "1.4.1", "doctrine/instantiator": "1.3.0", "doctrine/lexer": "1.2.0", "duosecurity/duo_php": "1.0.1", "egulias/email-validator": "2.1.22", "ezyang/htmlpurifier": "v4.12.0", "facebook/graph-sdk": "5.7.0", "filp/whoops": "2.7.2", "firebase/php-jwt": "v5.2.0", "goetas-webservices/xsd2php-runtime": "v0.2.12", "google/apiclient": "2.7.0-p1", "google/auth": "v1.11.1", "google/recaptcha": "1.2.4", "guzzlehttp/guzzle": "7.0.1", "guzzlehttp/promises": "v1.3.1", "guzzlehttp/psr7": "1.6.1", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v7.12.0", "illuminate/container": "v7.12.0", "illuminate/contracts": "v7.12.0", "illuminate/database": "v7.12.0", "illuminate/events": "v7.12.0", "illuminate/filesystem": "v7.28.4", "illuminate/support": "v7.12.0", "illuminate/translation": "v7.28.4", "illuminate/validation": "v7.12.0", "jms/metadata": "1.7.0", "jms/parser-lib": "1.0.0", "jms/serializer": "1.14.1", "justinrainbow/json-schema": "5.2.9", "knplabs/knp-menu": "v3.1.1", "laminas/laminas-diactoros": "2.3.1", "laminas/laminas-httphandlerrunner": "1.2.0", "laminas/laminas-loader": "2.6.1", "laminas/laminas-mail": "2.14.0-p1", "laminas/laminas-mime": "2.7.4", "laminas/laminas-stdlib": "3.3.0", "laminas/laminas-validator": "2.13.4", "laminas/laminas-zendframework-bridge": "1.1.1", "league/climate": "3.5.2", "league/flysystem": "1.0.67", "league/flysystem-aws-s3-v3": "1.0.24", "league/oauth2-client": "2.5.0", "league/oauth2-google": "3.0.3", "league/plates": "3.3.0", "michelf/php-markdown": "1.9.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "2.0.2", "mtdowling/jmespath.php": "2.6.0", "nesbot/carbon": "2.33.0", "nikic/fast-route": "v1.3.0", "paragonie/random_compat": "v9.99.100", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.1.5", "phpmyadmin/sql-parser": "5.3.1", "phpoption/phpoption": "1.7.3", "phpseclib/mcrypt_compat": "1.0.11", "phpseclib/phpseclib": "2.0.27", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-client": "1.0.1", "psr/http-factory": "1.0.1", "psr/http-message": "1.0.1", "psr/http-server-handler": "1.0.1", "psr/log": "1.0.2", "psr/simple-cache": "1.0.1", "punic/punic": "3.5.1", "ralouphie/getallheaders": "3.0.3", "ramsey/collection": "1.0.1", "ramsey/uuid": "4.0.1", "react/promise": "v2.8.0", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.8.0", "seld/phar-utils": "1.1.0", "smarty/smarty": "v3.1.36", "sonata-project/google-authenticator": "2.2.0", "stevenmaguire/oauth2-microsoft": "2.2.0", "stripe/stripe-php": "v7.34.0", "symfony/config": "v5.3.4", "symfony/console": "v5.0.8", "symfony/dependency-injection": "v5.1.7", "symfony/deprecation-contracts": "v2.2.0", "symfony/filesystem": "v5.0.8", "symfony/finder": "v5.0.8", "symfony/http-foundation": "v5.0.8", "symfony/mime": "v5.1.7", "symfony/polyfill-ctype": "v1.18.1", "symfony/polyfill-iconv": "v1.18.1", "symfony/polyfill-intl-idn": "v1.18.1", "symfony/polyfill-intl-normalizer": "v1.18.1", "symfony/polyfill-mbstring": "v1.18.1", "symfony/polyfill-php70": "v1.20.0", "symfony/polyfill-php72": "v1.18.1", "symfony/polyfill-php73": "v1.18.1", "symfony/polyfill-php80": "v1.18.1", "symfony/polyfill-php81": "v1.23.0", "symfony/process": "v5.0.8", "symfony/service-contracts": "v2.2.0", "symfony/translation": "v5.0.8", "symfony/translation-contracts": "v2.3.0", "symfony/yaml": "v5.0.8", "tecnickcom/tcpdf": "6.3.5-p1", "true/punycode": "v2.1.1", "voku/portable-ascii": "1.5.3", "zbateson/mail-mime-parser": "1.2.1", "zbateson/mb-wrapper": "1.0.0", "zbateson/stream-decorators": "1.0.3" }, "extra": {"sha":"4f5e34860d474cc80cc6d4ffda9bd06814c7084c67ad6b87462719da66e58550","sig":"FVp9pZVtDEe91At4tNiAPnqC4uO\/Fu8jguR0gKJVpzbLKC0ZHgD0b1ouwHGsXzi9\/6686jJvvqI\/8488zvC5DxBUqB698V8UG0FYG2uZ6G5t4WQivKCufK7iXDBsW5VkONVzzsF9alK1MLLdjbRi7A6sIyp32Cku\/LNvu6F6YDv9stfgThchE6QtrRYmSiSORPxQTmb99XcM3VtOpifQWbOVejwoHFP+htFk41+mo4Nlcx1w7HrYeOy\/6tvbNkj+cvPgiHRAHMyudEgjrMPR7+UXT+b9FANUQdKpoI2luxYrkgo93go20e2mEOqUzNG3VBuqz6itTgCx9AheblXNFg==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_8.3.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V8.3.0_beta_1","fileSize":"79588876","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"Zlwbn1gTWb1ZF5YE58xcJRHL\/X4ATKBVRHsMXH\/hrOoCtphf8nuWMCwKsbJ\/7RtgGFdGGEKKdCpEiE3WgRNqqbPjXgiWmNQxIMT28+rHoiLOu4Xi2uPaDXxWreBvRy7a7d0cU2i5WzOjHjOi3ODatSl7rPw\/HYsNZl8d9pH8RNlaHmu43CrvPUp1mxHzYX68ZuZkBsVXkWtXToye39ogEXyeZsSBG1NgYEL1L88WAju7R2KiDM2z4SKmaVZmBlaWaMZsvQuOiYxFdRsGwZ16jREIG7JaE0QThbx5LhH1mS25qq8aFh9yz\/I3DVkzQsiATyZuiMQvShv0MMqkzOL36w=="},"require":{"ionCubeLoader":"10.1.0"}} }, "8.2.1-release.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "8.2.1", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^7.2.0 || ^7.3.0 || ^7.4.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-8.2.1-release.1.zip", "type": "zip" }, "time": "now", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "1.1.0", "authorizenet/authorizenet": "1.9.9", "aws/aws-sdk-php": "3.138.0", "bitpay/php-client": "v3.0.0-p2", "brick/math": "0.8.15", "bshaffer/oauth2-server-httpfoundation-bridge": "v1.4-p1", "bshaffer/oauth2-server-php": "v1.11.1-p1", "composer/ca-bundle": "1.2.8", "composer/composer": "1.10.6", "composer/semver": "1.5.1", "composer/spdx-licenses": "1.5.3", "composer/xdebug-handler": "1.4.3", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "1.10.2", "doctrine/inflector": "1.4.1", "doctrine/instantiator": "1.3.0", "doctrine/lexer": "1.2.0", "duosecurity/duo_php": "1.0.1", "egulias/email-validator": "2.1.22", "ezyang/htmlpurifier": "v4.12.0", "facebook/graph-sdk": "5.7.0", "filp/whoops": "2.7.2", "firebase/php-jwt": "v5.2.0", "goetas-webservices/xsd2php-runtime": "v0.2.12", "google/apiclient": "2.7.0-p1", "google/auth": "v1.11.1", "google/recaptcha": "1.2.4", "guzzlehttp/guzzle": "7.0.1", "guzzlehttp/promises": "v1.3.1", "guzzlehttp/psr7": "1.6.1", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v7.12.0", "illuminate/container": "v7.12.0", "illuminate/contracts": "v7.12.0", "illuminate/database": "v7.12.0", "illuminate/events": "v7.12.0", "illuminate/filesystem": "v7.28.4", "illuminate/support": "v7.12.0", "illuminate/translation": "v7.28.4", "illuminate/validation": "v7.12.0", "jms/metadata": "1.7.0", "jms/parser-lib": "1.0.0", "jms/serializer": "1.14.1", "justinrainbow/json-schema": "5.2.9", "knplabs/knp-menu": "v3.1.1", "laminas/laminas-diactoros": "2.3.1", "laminas/laminas-httphandlerrunner": "1.2.0", "laminas/laminas-loader": "2.6.1", "laminas/laminas-mail": "2.14.0-p1", "laminas/laminas-mime": "2.7.4", "laminas/laminas-stdlib": "3.3.0", "laminas/laminas-validator": "2.13.4", "laminas/laminas-zendframework-bridge": "1.1.1", "league/climate": "3.5.2", "league/flysystem": "1.0.67", "league/flysystem-aws-s3-v3": "1.0.24", "league/oauth2-client": "2.5.0", "league/oauth2-google": "3.0.3", "league/plates": "3.3.0", "michelf/php-markdown": "1.9.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "2.0.2", "mtdowling/jmespath.php": "2.6.0", "nesbot/carbon": "2.33.0", "nikic/fast-route": "v1.3.0", "paragonie/random_compat": "v9.99.100", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.1.5", "phpmyadmin/sql-parser": "5.3.1", "phpoption/phpoption": "1.7.3", "phpseclib/mcrypt_compat": "1.0.11", "phpseclib/phpseclib": "2.0.27", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-client": "1.0.1", "psr/http-factory": "1.0.1", "psr/http-message": "1.0.1", "psr/http-server-handler": "1.0.1", "psr/log": "1.0.2", "psr/simple-cache": "1.0.1", "punic/punic": "3.5.1", "ralouphie/getallheaders": "3.0.3", "ramsey/collection": "1.0.1", "ramsey/uuid": "4.0.1", "react/promise": "v2.8.0", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.8.0", "seld/phar-utils": "1.1.0", "smarty/smarty": "v3.1.36", "sonata-project/google-authenticator": "2.2.0", "stevenmaguire/oauth2-microsoft": "2.2.0", "stripe/stripe-php": "v7.34.0", "symfony/config": "v5.3.3", "symfony/console": "v5.0.8", "symfony/dependency-injection": "v5.1.7", "symfony/deprecation-contracts": "v2.2.0", "symfony/filesystem": "v5.0.8", "symfony/finder": "v5.0.8", "symfony/http-foundation": "v5.0.8", "symfony/mime": "v5.1.7", "symfony/polyfill-ctype": "v1.18.1", "symfony/polyfill-iconv": "v1.18.1", "symfony/polyfill-intl-idn": "v1.18.1", "symfony/polyfill-intl-normalizer": "v1.18.1", "symfony/polyfill-mbstring": "v1.18.1", "symfony/polyfill-php70": "v1.20.0", "symfony/polyfill-php72": "v1.18.1", "symfony/polyfill-php73": "v1.18.1", "symfony/polyfill-php80": "v1.18.1", "symfony/polyfill-php81": "v1.23.0", "symfony/process": "v5.0.8", "symfony/service-contracts": "v2.2.0", "symfony/translation": "v5.0.8", "symfony/translation-contracts": "v2.3.0", "symfony/yaml": "v5.0.8", "tecnickcom/tcpdf": "6.3.5-p1", "true/punycode": "v2.1.1", "voku/portable-ascii": "1.5.3", "zbateson/mail-mime-parser": "1.2.1", "zbateson/mb-wrapper": "1.0.0", "zbateson/stream-decorators": "1.0.3" }, "extra": {"sha":"e6683b74041a573e3a5a05a6024d81e1fc4e72bfdb4c1e0d79a9ebe57ddbe373","sig":"czJQ5q5z0\/1eRUZbYS\/EI2j5CEwF3KImWAE08Jgek\/XFRbO3uzlLCDCWkdF4fX4uhR\/iylKB\/Qw+fej7Q4TcxQetESQIBg\/Du8Eq8Q+qYWOKL\/s1cAOQJHLhbc7cOGrBuxBkpBjhj\/7rRG+oo4eLloaDJZlj0OCd\/3j8tVN4jarW+dGxgBuWn3d0JOf79wgFbur2V\/mHgFiyVMWo+ESyaPbEIgFaYPeJ2Nh\/C+x1hgnZ\/atfNh3VRAqI+RFBw8GGfhArwA6uuL4e2vXEmjnllvYMyhhdwE47\/M61j8\/IG2zbc2BdXPgQ6mSjMGnJ1q60c9MitzMhdBYI4BtWkQicqQ==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_8.2.1_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V8.2.1","fileSize":"78909847","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"NEIWI0\/JeQXjjB4xXNkJ3lhXSub5eG+eJpMeWZaPjA2sraL8+\/FVpfeaRjkwcEA66F0KZ2im1OqVeEWJP\/zXC\/E50OSZ666w8AZKEK+bjVdHoZVHgBTHLVaEZHQsyROUo++NAO9gEbC6skjUbD2eZh5kJ8zQ3lKgRz+c\/Otdb1WThBhdwBJ+pgPzA+jdWY1Pe0RF\/Q6ZiaL07ncXmCN2DaEIBF02+STsTBuoR98V4ZksHvnCevP7CiXytOK+0b5ERP\/lGXJ7f81NTF6i8uA+n79Zu1QZG7y2VFKskSedSf1fotCblaLkRBS+1Ob576RXJi+ix0PPvr3AOEJoqaynoQ=="},"require":{"ionCubeLoader":"10.1.0"}} }, "8.2.0-release.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "8.2.0", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^7.2.0 || ^7.3.0 || ^7.4.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-8.2.0-release.1.zip", "type": "zip" }, "time": "now", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "1.1.0", "authorizenet/authorizenet": "1.9.9", "aws/aws-sdk-php": "3.138.0", "bitpay/php-client": "v3.0.0-p2", "brick/math": "0.8.15", "bshaffer/oauth2-server-httpfoundation-bridge": "v1.4-p1", "bshaffer/oauth2-server-php": "v1.11.1-p1", "composer/ca-bundle": "1.2.8", "composer/composer": "1.10.6", "composer/semver": "1.5.1", "composer/spdx-licenses": "1.5.3", "composer/xdebug-handler": "1.4.3", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "1.10.2", "doctrine/inflector": "1.4.1", "doctrine/instantiator": "1.3.0", "doctrine/lexer": "1.2.0", "duosecurity/duo_php": "1.0.1", "egulias/email-validator": "2.1.22", "ezyang/htmlpurifier": "v4.12.0", "facebook/graph-sdk": "5.7.0", "filp/whoops": "2.7.2", "firebase/php-jwt": "v5.2.0", "goetas-webservices/xsd2php-runtime": "v0.2.12", "google/apiclient": "2.7.0-p1", "google/auth": "v1.11.1", "google/recaptcha": "1.2.4", "guzzlehttp/guzzle": "7.0.1", "guzzlehttp/promises": "v1.3.1", "guzzlehttp/psr7": "1.6.1", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v7.12.0", "illuminate/container": "v7.12.0", "illuminate/contracts": "v7.12.0", "illuminate/database": "v7.12.0", "illuminate/events": "v7.12.0", "illuminate/filesystem": "v7.28.4", "illuminate/support": "v7.12.0", "illuminate/translation": "v7.28.4", "illuminate/validation": "v7.12.0", "jms/metadata": "1.7.0", "jms/parser-lib": "1.0.0", "jms/serializer": "1.14.1", "justinrainbow/json-schema": "5.2.9", "knplabs/knp-menu": "v3.1.1", "laminas/laminas-diactoros": "2.3.1", "laminas/laminas-httphandlerrunner": "1.2.0", "laminas/laminas-loader": "2.6.1", "laminas/laminas-mail": "2.14.0-p1", "laminas/laminas-mime": "2.7.4", "laminas/laminas-stdlib": "3.3.0", "laminas/laminas-validator": "2.13.4", "laminas/laminas-zendframework-bridge": "1.1.1", "league/climate": "3.5.2", "league/flysystem": "1.0.67", "league/flysystem-aws-s3-v3": "1.0.24", "league/oauth2-client": "2.5.0", "league/oauth2-google": "3.0.3", "league/plates": "3.3.0", "michelf/php-markdown": "1.9.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "2.0.2", "mtdowling/jmespath.php": "2.6.0", "nesbot/carbon": "2.33.0", "nikic/fast-route": "v1.3.0", "paragonie/random_compat": "v9.99.100", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.1.5", "phpmyadmin/sql-parser": "5.3.1", "phpoption/phpoption": "1.7.3", "phpseclib/mcrypt_compat": "1.0.11", "phpseclib/phpseclib": "2.0.27", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-client": "1.0.1", "psr/http-factory": "1.0.1", "psr/http-message": "1.0.1", "psr/http-server-handler": "1.0.1", "psr/log": "1.0.2", "psr/simple-cache": "1.0.1", "punic/punic": "3.5.1", "ralouphie/getallheaders": "3.0.3", "ramsey/collection": "1.0.1", "ramsey/uuid": "4.0.1", "react/promise": "v2.8.0", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.8.0", "seld/phar-utils": "1.1.0", "smarty/smarty": "v3.1.36", "sonata-project/google-authenticator": "2.2.0", "stevenmaguire/oauth2-microsoft": "2.2.0", "stripe/stripe-php": "v7.34.0", "symfony/config": "v5.3.2", "symfony/console": "v5.0.8", "symfony/dependency-injection": "v5.1.7", "symfony/deprecation-contracts": "v2.2.0", "symfony/filesystem": "v5.0.8", "symfony/finder": "v5.0.8", "symfony/http-foundation": "v5.0.8", "symfony/mime": "v5.1.7", "symfony/polyfill-ctype": "v1.18.1", "symfony/polyfill-iconv": "v1.18.1", "symfony/polyfill-intl-idn": "v1.18.1", "symfony/polyfill-intl-normalizer": "v1.18.1", "symfony/polyfill-mbstring": "v1.18.1", "symfony/polyfill-php70": "v1.20.0", "symfony/polyfill-php72": "v1.18.1", "symfony/polyfill-php73": "v1.18.1", "symfony/polyfill-php80": "v1.18.1", "symfony/polyfill-php81": "v1.23.0", "symfony/process": "v5.0.8", "symfony/service-contracts": "v2.2.0", "symfony/translation": "v5.0.8", "symfony/translation-contracts": "v2.3.0", "symfony/yaml": "v5.0.8", "tecnickcom/tcpdf": "6.3.5-p1", "true/punycode": "v2.1.1", "voku/portable-ascii": "1.5.3", "zbateson/mail-mime-parser": "1.2.1", "zbateson/mb-wrapper": "1.0.0", "zbateson/stream-decorators": "1.0.3" }, "extra": {"sha":"20a1b87a5e394f32b53116f923d4e7471e09208de98829c1664806d510462fae","sig":"XFhCxsMmDTwoujjzMnzGEGgNPUO8QtPfuJiEUez21YKsv0LRVocNlm+3FesStBNLegXdvokXOeUcTvHeD4yvswTPnRASZJA08MccW1gQMpyO6RnSTeSViRitXWJQh4XxSEV58jr4giq2EyxPusRMejWKiEvI61QzOd0bXlnmJ\/N42C5xCqj\/+AVbO6Vqwg5iZjG48ufQPw\/cD1IXUBFhx9CqE9gMjqUooz3OHI6nQtgn3R\/iQFJMLmF+kLt5KsfPqQ7FAB4\/xjhGheQDXvpgfYxNGu\/MSUQiZZHW9W5Ndmat7zNjBFpVF5WLVdcQnQyjbi2L6i8lf50UFMTscOeL9A==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_8.2.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V8.2.0_GA","fileSize":"78895819","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"h0AWa+FB2TOv06Frh4saGWE4MtvKyvngYC7KqkSrezAlCDY3QN70yo6FVMifUS+7ED8OHdqnPwF7oJVqQV3UuafyoXD2Ksb5E+Gdj7IkeQQ0ecibGI88H0LwGGe+n7j6xvhOiVySIQQCp7BNKbM+3EM0bmTtdvbfFSbuz92KroxN8TgWh2ljzSfiGjNdWqtcjIPbyxmsdCPrmIuuu38egWBrza6ojdd5u+0ZX9KYnt11TCxYVNP8vl++SBAWrWBv2ftN4WdQsBWsCWhcPAfv8lVBPHjBdxwNO1E+j0DcYlM5XvZ+aYHIgGkJeDXL+KPA+4CK1EQHEBlg\/WhN+4INeg=="},"require":{"ionCubeLoader":"10.1.0"}} }, "8.2.0-rc.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "8.2.0-RC.1", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^7.2.0 || ^7.3.0 || ^7.4.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-8.2.0-rc.1.zip", "type": "zip" }, "time": "now", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "1.1.0", "authorizenet/authorizenet": "1.9.9", "aws/aws-sdk-php": "3.138.0", "bitpay/php-client": "v3.0.0-p2", "brick/math": "0.8.15", "bshaffer/oauth2-server-httpfoundation-bridge": "v1.4-p1", "bshaffer/oauth2-server-php": "v1.11.1-p1", "composer/ca-bundle": "1.2.8", "composer/composer": "1.10.6", "composer/semver": "1.5.1", "composer/spdx-licenses": "1.5.3", "composer/xdebug-handler": "1.4.3", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "1.10.2", "doctrine/inflector": "1.4.1", "doctrine/instantiator": "1.3.0", "doctrine/lexer": "1.2.0", "duosecurity/duo_php": "1.0.1", "egulias/email-validator": "2.1.22", "ezyang/htmlpurifier": "v4.12.0", "facebook/graph-sdk": "5.7.0", "filp/whoops": "2.7.2", "firebase/php-jwt": "v5.2.0", "goetas-webservices/xsd2php-runtime": "v0.2.12", "google/apiclient": "2.7.0-p1", "google/auth": "v1.11.1", "google/recaptcha": "1.2.4", "guzzlehttp/guzzle": "7.0.1", "guzzlehttp/promises": "v1.3.1", "guzzlehttp/psr7": "1.6.1", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v7.12.0", "illuminate/container": "v7.12.0", "illuminate/contracts": "v7.12.0", "illuminate/database": "v7.12.0", "illuminate/events": "v7.12.0", "illuminate/filesystem": "v7.28.4", "illuminate/support": "v7.12.0", "illuminate/translation": "v7.28.4", "illuminate/validation": "v7.12.0", "jms/metadata": "1.7.0", "jms/parser-lib": "1.0.0", "jms/serializer": "1.14.1", "justinrainbow/json-schema": "5.2.9", "knplabs/knp-menu": "v3.1.1", "laminas/laminas-diactoros": "2.3.1", "laminas/laminas-httphandlerrunner": "1.2.0", "laminas/laminas-loader": "2.6.1", "laminas/laminas-mail": "2.14.0-p1", "laminas/laminas-mime": "2.7.4", "laminas/laminas-stdlib": "3.3.0", "laminas/laminas-validator": "2.13.4", "laminas/laminas-zendframework-bridge": "1.1.1", "league/climate": "3.5.2", "league/flysystem": "1.0.67", "league/flysystem-aws-s3-v3": "1.0.24", "league/oauth2-client": "2.5.0", "league/oauth2-google": "3.0.3", "league/plates": "3.3.0", "michelf/php-markdown": "1.9.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "2.0.2", "mtdowling/jmespath.php": "2.6.0", "nesbot/carbon": "2.33.0", "nikic/fast-route": "v1.3.0", "paragonie/random_compat": "v9.99.100", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.1.5", "phpmyadmin/sql-parser": "5.3.1", "phpoption/phpoption": "1.7.3", "phpseclib/mcrypt_compat": "1.0.11", "phpseclib/phpseclib": "2.0.27", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-client": "1.0.1", "psr/http-factory": "1.0.1", "psr/http-message": "1.0.1", "psr/http-server-handler": "1.0.1", "psr/log": "1.0.2", "psr/simple-cache": "1.0.1", "punic/punic": "3.5.1", "ralouphie/getallheaders": "3.0.3", "ramsey/collection": "1.0.1", "ramsey/uuid": "4.0.1", "react/promise": "v2.8.0", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.8.0", "seld/phar-utils": "1.1.0", "smarty/smarty": "v3.1.36", "sonata-project/google-authenticator": "2.2.0", "stevenmaguire/oauth2-microsoft": "2.2.0", "stripe/stripe-php": "v7.34.0", "symfony/config": "v5.3.0", "symfony/console": "v5.0.8", "symfony/dependency-injection": "v5.1.7", "symfony/deprecation-contracts": "v2.2.0", "symfony/filesystem": "v5.0.8", "symfony/finder": "v5.0.8", "symfony/http-foundation": "v5.0.8", "symfony/mime": "v5.1.7", "symfony/polyfill-ctype": "v1.18.1", "symfony/polyfill-iconv": "v1.18.1", "symfony/polyfill-intl-idn": "v1.18.1", "symfony/polyfill-intl-normalizer": "v1.18.1", "symfony/polyfill-mbstring": "v1.18.1", "symfony/polyfill-php70": "v1.20.0", "symfony/polyfill-php72": "v1.18.1", "symfony/polyfill-php73": "v1.18.1", "symfony/polyfill-php80": "v1.18.1", "symfony/polyfill-php81": "v1.23.0", "symfony/process": "v5.0.8", "symfony/service-contracts": "v2.2.0", "symfony/translation": "v5.0.8", "symfony/translation-contracts": "v2.3.0", "symfony/yaml": "v5.0.8", "tecnickcom/tcpdf": "6.3.5-p1", "true/punycode": "v2.1.1", "voku/portable-ascii": "1.5.3", "zbateson/mail-mime-parser": "1.2.1", "zbateson/mb-wrapper": "1.0.0", "zbateson/stream-decorators": "1.0.3" }, "extra": {"sha":"31c21a5ffd28f250455eb51d4b2906af2d8f98ca344901d07f010753e1651ea1","sig":"oS2b7EgPVKS3bY3WPSCuLcsBDK9TvYrBKZGMxpH2x0OErBSGh3kmdbZlvdcrH\/X8ei02Gb\/XKOthMwWty+NdUlghjDqIs5uxgqPSukbzilWqNhCeoVgfT830HFEvxvhT2XanWPiNsKnslWWcilsZLzgDHh0yZLDW0q6mDjomgVK+ZtnsPJB221tt43CJ0DlK8qIybsGDh9Y\/Imp14hBRA9gK2JHwtp21w8K6lqP3eMBunwgkRzRBqWEiYgg+KjtmbiwAuoF9Y8kFrBIBRqDyqV8MdUeCRZXHRkSyl1Rm+gwSmN74xPQ6fCqrcCiKUBJImIIGPr1nbmv0Nkwr7MhjLA==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_8.2.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V8.2.0_RC_1","fileSize":"78280026","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"e9XLCv\/CcSJEDXWGJg\/nn9D5dGEktuCIXwvAerPDUr7f3ZetGC8tyfRgP7d5svFgQpmKgh9ZAzxJ96sAPW\/eH9eRxhgpGoQrKSOxFRTBHzHBVELQo4wOxUGxmDHQiOZ1EYCcJJ0dZF3KGQcXf6\/W25rKibpUZLgFloX6tEh40eF1NF53C5uUT5VZxxX2leuTBiFHMzFnw\/3hrlmEiF8F\/bYotfBLfA0Oxaf0Qkh\/BL+X6\/U7KbGjXqLCxM69D5CylR9MvdD7CV4F5HTuMw3m8TmQmSN3Pu1Gj\/i9vv92HnT\/P4as+o1UIl0JaR8vZ+lpZuzPuLNy\/hBYnU3tXqqhlA=="},"require":{"ionCubeLoader":"10.1.0"}} }, "8.2.0-beta.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "8.2.0-beta.1", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^7.2.0 || ^7.3.0 || ^7.4.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-8.2.0-beta.1.zip", "type": "zip" }, "time": "now", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "1.1.0", "authorizenet/authorizenet": "1.9.9", "aws/aws-sdk-php": "3.138.0", "bitpay/php-client": "v3.0.0-p2", "brick/math": "0.8.15", "bshaffer/oauth2-server-httpfoundation-bridge": "v1.4-p1", "bshaffer/oauth2-server-php": "v1.11.1-p1", "composer/ca-bundle": "1.2.8", "composer/composer": "1.10.6", "composer/semver": "1.5.1", "composer/spdx-licenses": "1.5.3", "composer/xdebug-handler": "1.4.3", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "1.10.2", "doctrine/inflector": "1.4.1", "doctrine/instantiator": "1.3.0", "doctrine/lexer": "1.2.0", "duosecurity/duo_php": "1.0.1", "egulias/email-validator": "2.1.22", "ezyang/htmlpurifier": "v4.12.0", "facebook/graph-sdk": "5.7.0", "filp/whoops": "2.7.2", "firebase/php-jwt": "v5.2.0", "goetas-webservices/xsd2php-runtime": "v0.2.12", "google/apiclient": "2.7.0-p1", "google/auth": "v1.11.1", "google/recaptcha": "1.2.4", "guzzlehttp/guzzle": "7.0.1", "guzzlehttp/promises": "v1.3.1", "guzzlehttp/psr7": "1.6.1", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v7.12.0", "illuminate/container": "v7.12.0", "illuminate/contracts": "v7.12.0", "illuminate/database": "v7.12.0", "illuminate/events": "v7.12.0", "illuminate/filesystem": "v7.28.4", "illuminate/support": "v7.12.0", "illuminate/translation": "v7.28.4", "illuminate/validation": "v7.12.0", "jms/metadata": "1.7.0", "jms/parser-lib": "1.0.0", "jms/serializer": "1.14.1", "justinrainbow/json-schema": "5.2.9", "knplabs/knp-menu": "v3.1.1", "laminas/laminas-diactoros": "2.3.1", "laminas/laminas-httphandlerrunner": "1.2.0", "laminas/laminas-loader": "2.6.1", "laminas/laminas-mail": "2.12.3-p2", "laminas/laminas-mime": "2.7.4", "laminas/laminas-stdlib": "3.3.0", "laminas/laminas-validator": "2.13.4", "laminas/laminas-zendframework-bridge": "1.1.1", "league/climate": "3.5.2", "league/flysystem": "1.0.67", "league/flysystem-aws-s3-v3": "1.0.24", "league/oauth2-client": "2.5.0", "league/oauth2-google": "3.0.3", "league/plates": "3.3.0", "michelf/php-markdown": "1.9.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "2.0.2", "mtdowling/jmespath.php": "2.6.0", "nesbot/carbon": "2.33.0", "nikic/fast-route": "v1.3.0", "paragonie/random_compat": "v9.99.100", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.1.5", "phpmyadmin/sql-parser": "5.3.1", "phpoption/phpoption": "1.7.3", "phpseclib/mcrypt_compat": "1.0.11", "phpseclib/phpseclib": "2.0.27", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-client": "1.0.1", "psr/http-factory": "1.0.1", "psr/http-message": "1.0.1", "psr/http-server-handler": "1.0.1", "psr/log": "1.0.2", "psr/simple-cache": "1.0.1", "punic/punic": "3.5.1", "ralouphie/getallheaders": "3.0.3", "ramsey/collection": "1.0.1", "ramsey/uuid": "4.0.1", "react/promise": "v2.8.0", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.8.0", "seld/phar-utils": "1.1.0", "smarty/smarty": "v3.1.36", "sonata-project/google-authenticator": "2.2.0", "stevenmaguire/oauth2-microsoft": "2.2.0", "stripe/stripe-php": "v7.34.0", "symfony/config": "v5.2.8", "symfony/console": "v5.0.8", "symfony/dependency-injection": "v5.1.7", "symfony/deprecation-contracts": "v2.2.0", "symfony/filesystem": "v5.0.8", "symfony/finder": "v5.0.8", "symfony/http-foundation": "v5.0.8", "symfony/mime": "v5.1.7", "symfony/polyfill-ctype": "v1.18.1", "symfony/polyfill-iconv": "v1.18.1", "symfony/polyfill-intl-idn": "v1.18.1", "symfony/polyfill-intl-normalizer": "v1.18.1", "symfony/polyfill-mbstring": "v1.18.1", "symfony/polyfill-php70": "v1.20.0", "symfony/polyfill-php72": "v1.18.1", "symfony/polyfill-php73": "v1.18.1", "symfony/polyfill-php80": "v1.18.1", "symfony/process": "v5.0.8", "symfony/service-contracts": "v2.2.0", "symfony/translation": "v5.0.8", "symfony/translation-contracts": "v2.3.0", "symfony/yaml": "v5.0.8", "tecnickcom/tcpdf": "6.3.5-p1", "true/punycode": "v2.1.1", "voku/portable-ascii": "1.5.3", "zbateson/mail-mime-parser": "1.2.1", "zbateson/mb-wrapper": "1.0.0", "zbateson/stream-decorators": "1.0.3" }, "extra": {"sha":"7a6e25fb2a06870c689c073b484b132a9742f15d28e79d9e966e5de8eacb5398","sig":"Zewq17nS4qgvk9h+UMfNSL6BWbyNEKKLcIAwM+IezsS+NNeYbQxM\/TTeyIccSrUVTtbbYPuTc8FnEy6pxr+UKOSHtYXM2ZNGP2bo2rk+mMn8o1mlkLz3TSy+0g4Vvdfu3i3eVoYsEOE6TWV74YOb1GOC+KwvJ87IUg4HHuHfW5WxgkUNsYCa0N4SaabaRrmW4IMPihwTXHxU09EIFv2waAhNcdIqPzf6J9Kmz05pkCZgaGMy5BjBHg1QkkGOCo2f8lFjCqLCAVbLY77q0EReXeOtWvL5WxbeTIf2Rim1qYQj\/R1Jv9JbknphhIieuLsFIcRgaYMCAUaCQVnJoT5ShQ==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_8.2.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V8.2.0_Beta_1","fileSize":"76543663","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"ThZzMQp\/QOJzdQ7sfBOk5UarEQ5srXXSvsjRGLnzrPVeP4zuY2pqFKYbUjvBJEPtme5ZeTrAHqu6+kBRMbDOr6L7byr5B1gLt8QJIZIlfRnxtqKkUYc4xJCcH830WL2v+jlKAcQxo\/mOqjhhB5t5ILw5YHNF1l7ibWBEh6m+dgqPDau+\/AzDkso3YGCCzwj1ITO8HkL6ofPHXR6SucmdJ5UazThdE8BzkTsIxJgvgECzoE+jg9alRqz1q\/xuNJ5grqeTuNQFsRRqRizHHyWFIoFFXdvttBp18U\/KXwszUxEvH84UR2bmmU3Cbx0o2Ry3XnTR1KX\/DCBvu\/NpVJRBRQ=="},"require":{"ionCubeLoader":"10.1.0"}} }, "8.1.3-release.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "8.1.3", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^7.2.0 || ^7.3.0 || ^7.4.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-8.1.3-release.1.zip", "type": "zip" }, "time": "now", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "1.1.0", "authorizenet/authorizenet": "1.9.9", "aws/aws-sdk-php": "3.138.0", "bitpay/php-client": "v3.0.0-p2", "brick/math": "0.8.15", "bshaffer/oauth2-server-httpfoundation-bridge": "v1.4-p1", "bshaffer/oauth2-server-php": "v1.11.1-p1", "composer/ca-bundle": "1.2.8", "composer/composer": "1.10.6", "composer/semver": "1.5.1", "composer/spdx-licenses": "1.5.3", "composer/xdebug-handler": "1.4.3", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "1.10.2", "doctrine/inflector": "1.4.1", "doctrine/instantiator": "1.3.0", "doctrine/lexer": "1.2.0", "duosecurity/duo_php": "1.0.1", "egulias/email-validator": "2.1.22", "ezyang/htmlpurifier": "v4.12.0", "facebook/graph-sdk": "5.7.0", "filp/whoops": "2.7.2", "firebase/php-jwt": "v5.2.0", "goetas-webservices/xsd2php-runtime": "v0.2.12", "google/apiclient": "2.7.0-p1", "google/auth": "v1.11.1", "google/recaptcha": "1.2.4", "guzzlehttp/guzzle": "7.0.1", "guzzlehttp/promises": "v1.3.1", "guzzlehttp/psr7": "1.6.1", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v7.12.0", "illuminate/container": "v7.12.0", "illuminate/contracts": "v7.12.0", "illuminate/database": "v7.12.0", "illuminate/events": "v7.12.0", "illuminate/filesystem": "v7.28.4", "illuminate/support": "v7.12.0", "illuminate/translation": "v7.28.4", "illuminate/validation": "v7.12.0", "jms/metadata": "1.7.0", "jms/parser-lib": "1.0.0", "jms/serializer": "1.14.1", "justinrainbow/json-schema": "5.2.9", "knplabs/knp-menu": "v3.1.1", "laminas/laminas-diactoros": "2.3.1", "laminas/laminas-httphandlerrunner": "1.2.0", "laminas/laminas-loader": "2.6.1", "laminas/laminas-mail": "2.12.3-p2", "laminas/laminas-mime": "2.7.4", "laminas/laminas-stdlib": "3.3.0", "laminas/laminas-validator": "2.13.4", "laminas/laminas-zendframework-bridge": "1.1.1", "league/climate": "3.5.2", "league/flysystem": "1.0.67", "league/flysystem-aws-s3-v3": "1.0.24", "league/oauth2-client": "2.5.0", "league/oauth2-google": "3.0.3", "league/plates": "3.3.0", "michelf/php-markdown": "1.9.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "2.0.2", "mtdowling/jmespath.php": "2.6.0", "nesbot/carbon": "2.33.0", "nikic/fast-route": "v1.3.0", "paragonie/random_compat": "v9.99.100", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.1.5", "phpmyadmin/sql-parser": "5.3.1", "phpoption/phpoption": "1.7.3", "phpseclib/mcrypt_compat": "1.0.11", "phpseclib/phpseclib": "2.0.27", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-client": "1.0.1", "psr/http-factory": "1.0.1", "psr/http-message": "1.0.1", "psr/http-server-handler": "1.0.1", "psr/log": "1.0.2", "psr/simple-cache": "1.0.1", "punic/punic": "3.5.1", "ralouphie/getallheaders": "3.0.3", "ramsey/collection": "1.0.1", "ramsey/uuid": "4.0.1", "react/promise": "v2.8.0", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.8.0", "seld/phar-utils": "1.1.0", "smarty/smarty": "v3.1.36", "sonata-project/google-authenticator": "2.2.0", "stevenmaguire/oauth2-microsoft": "2.2.0", "stripe/stripe-php": "v7.34.0", "symfony/config": "v5.2.3", "symfony/console": "v5.0.8", "symfony/dependency-injection": "v5.1.7", "symfony/deprecation-contracts": "v2.2.0", "symfony/filesystem": "v5.0.8", "symfony/finder": "v5.0.8", "symfony/http-foundation": "v5.0.8", "symfony/mime": "v5.1.7", "symfony/polyfill-ctype": "v1.18.1", "symfony/polyfill-iconv": "v1.18.1", "symfony/polyfill-intl-idn": "v1.18.1", "symfony/polyfill-intl-normalizer": "v1.18.1", "symfony/polyfill-mbstring": "v1.18.1", "symfony/polyfill-php70": "v1.20.0", "symfony/polyfill-php72": "v1.18.1", "symfony/polyfill-php73": "v1.18.1", "symfony/polyfill-php80": "v1.18.1", "symfony/process": "v5.0.8", "symfony/service-contracts": "v2.2.0", "symfony/translation": "v5.0.8", "symfony/translation-contracts": "v2.3.0", "symfony/yaml": "v5.0.8", "tecnickcom/tcpdf": "6.3.5-p1", "true/punycode": "v2.1.1", "voku/portable-ascii": "1.5.3", "zbateson/mail-mime-parser": "1.2.1", "zbateson/mb-wrapper": "1.0.0", "zbateson/stream-decorators": "1.0.3" }, "extra": {"sha":"17850e077a82a433778e15c89fe6e4a58edcf644b864a1da508f56f974af3cda","sig":"e45qCcUinsETHVAsl+W+\/2\/ekRRqHwvcGO5rwKlZBT9JmdBSjva74k6VF9NSPUWEliv5PZ75pv4bzPoltux8Ga0ntFbAwnwQAQvoak4bqPpJwBWKqL1gM\/kvn2EI\/m4tQ9\/7mPIztAUnuH1iiNgyS1YzFyynu0ydmSEn1nHCN9e7e5KJLBdBZCwbxJH2IX\/\/SitSvNvZIku7H15amGFOotRltl0bw65t5jwwhg9GRFdyBCmlzKd5IveDovQUPw6wZXs56wxaJ\/y2fc2g7T\/SZ+SyEW4YMlQxW+kqQiW\/FsLVsZT+LrZXHYj44eR0ho8KxHRRyRKL3qNkljRsmByX5Q==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_8.1.3_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V8.1.3","fileSize":"70398151","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"naI3xjBqtmjpTfcwPvzQSq8XYflEQ5zUAF15WX37W2y4vUdfJriLvw2vxSRINZb\/cVQtaFZK3YOmQ4KWo6asuXsiEiFiLwehLP7Mn\/+Q6oi8xT1S6W\/H\/NIqL+M32sn5dUHObWoeAxjkdifiwi+mbo5jNQlalF+BoKIFm4sMuP97bV+SSgpf1UXuOfOfBIHGz09I1tysaFbl8Sh4ShSSZcTy33gD6l8G+mLOoZj0G\/zVDP71usuR3Tdc3zugEsvRIibaRw28gDeikwz41j49kvKmxHs1giKnG2P2vz8Nuv3vjxO52N1HZdytOrFfOyaZ04dSWUYOkPodv+AKLKGG2A=="},"require":{"ionCubeLoader":"10.1.0"}} }, "8.1.2-release.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "8.1.2", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^7.2.0 || ^7.3.0 || ^7.4.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-8.1.2-release.1.zip", "type": "zip" }, "time": "now", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "1.1.0", "authorizenet/authorizenet": "1.9.9", "aws/aws-sdk-php": "3.138.0", "bitpay/php-client": "v3.0.0-p2", "brick/math": "0.8.15", "bshaffer/oauth2-server-httpfoundation-bridge": "v1.4-p1", "bshaffer/oauth2-server-php": "v1.11.1-p1", "composer/ca-bundle": "1.2.8", "composer/composer": "1.10.6", "composer/semver": "1.5.1", "composer/spdx-licenses": "1.5.3", "composer/xdebug-handler": "1.4.3", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "1.10.2", "doctrine/inflector": "1.4.1", "doctrine/instantiator": "1.3.0", "doctrine/lexer": "1.2.0", "duosecurity/duo_php": "1.0.1", "egulias/email-validator": "2.1.22", "ezyang/htmlpurifier": "v4.12.0", "facebook/graph-sdk": "5.7.0", "filp/whoops": "2.7.2", "firebase/php-jwt": "v5.2.0", "goetas-webservices/xsd2php-runtime": "v0.2.12", "google/apiclient": "2.7.0-p1", "google/auth": "v1.11.1", "google/recaptcha": "1.2.4", "guzzlehttp/guzzle": "7.0.1", "guzzlehttp/promises": "v1.3.1", "guzzlehttp/psr7": "1.6.1", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v7.12.0", "illuminate/container": "v7.12.0", "illuminate/contracts": "v7.12.0", "illuminate/database": "v7.12.0", "illuminate/events": "v7.12.0", "illuminate/filesystem": "v7.28.4", "illuminate/support": "v7.12.0", "illuminate/translation": "v7.28.4", "illuminate/validation": "v7.12.0", "jms/metadata": "1.7.0", "jms/parser-lib": "1.0.0", "jms/serializer": "1.14.1", "justinrainbow/json-schema": "5.2.9", "knplabs/knp-menu": "v3.1.1", "laminas/laminas-diactoros": "2.3.1", "laminas/laminas-httphandlerrunner": "1.2.0", "laminas/laminas-loader": "2.6.1", "laminas/laminas-mail": "2.12.3-p2", "laminas/laminas-mime": "2.7.4", "laminas/laminas-stdlib": "3.3.0", "laminas/laminas-validator": "2.13.4", "laminas/laminas-zendframework-bridge": "1.1.1", "league/climate": "3.5.2", "league/flysystem": "1.0.67", "league/flysystem-aws-s3-v3": "1.0.24", "league/oauth2-client": "2.5.0", "league/oauth2-google": "3.0.3", "league/plates": "3.3.0", "michelf/php-markdown": "1.9.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "2.0.2", "mtdowling/jmespath.php": "2.6.0", "nesbot/carbon": "2.33.0", "nikic/fast-route": "v1.3.0", "paragonie/random_compat": "v9.99.100", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.1.5", "phpmyadmin/sql-parser": "5.3.1", "phpoption/phpoption": "1.7.3", "phpseclib/mcrypt_compat": "1.0.11", "phpseclib/phpseclib": "2.0.27", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-client": "1.0.1", "psr/http-factory": "1.0.1", "psr/http-message": "1.0.1", "psr/http-server-handler": "1.0.1", "psr/log": "1.0.2", "psr/simple-cache": "1.0.1", "punic/punic": "3.5.1", "ralouphie/getallheaders": "3.0.3", "ramsey/collection": "1.0.1", "ramsey/uuid": "4.0.1", "react/promise": "v2.8.0", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.8.0", "seld/phar-utils": "1.1.0", "smarty/smarty": "v3.1.36", "sonata-project/google-authenticator": "2.2.0", "stevenmaguire/oauth2-microsoft": "2.2.0", "stripe/stripe-php": "v7.34.0", "symfony/config": "v5.2.3", "symfony/console": "v5.0.8", "symfony/dependency-injection": "v5.1.7", "symfony/deprecation-contracts": "v2.2.0", "symfony/filesystem": "v5.0.8", "symfony/finder": "v5.0.8", "symfony/http-foundation": "v5.0.8", "symfony/mime": "v5.1.7", "symfony/polyfill-ctype": "v1.18.1", "symfony/polyfill-iconv": "v1.18.1", "symfony/polyfill-intl-idn": "v1.18.1", "symfony/polyfill-intl-normalizer": "v1.18.1", "symfony/polyfill-mbstring": "v1.18.1", "symfony/polyfill-php70": "v1.20.0", "symfony/polyfill-php72": "v1.18.1", "symfony/polyfill-php73": "v1.18.1", "symfony/polyfill-php80": "v1.18.1", "symfony/process": "v5.0.8", "symfony/service-contracts": "v2.2.0", "symfony/translation": "v5.0.8", "symfony/translation-contracts": "v2.3.0", "symfony/yaml": "v5.0.8", "tecnickcom/tcpdf": "6.3.5-p1", "true/punycode": "v2.1.1", "voku/portable-ascii": "1.5.3", "zbateson/mail-mime-parser": "1.2.1", "zbateson/mb-wrapper": "1.0.0", "zbateson/stream-decorators": "1.0.3" }, "extra": {"sha":"55d5881755eedc6d5b287ead2221b56c9cf44073590120088db3db245dc452fe","sig":"EN6h6RGcp4nMwwwLZpVbo5a1yyn2r994WDVOpEo2MpCGfMbuVYH\/L2LJZNuvxgla85W7WzAeFkGKFDbnNBj4FXdsw+lipIkI7br4xt4qYheRab5zijUqq4P0z\/HiC\/zouI793ZkoFG4E729IHm9+J1wvhBSiruA0IWZhyymUXlRQhLJ1\/mXU8s9dRIvhOmRDq1iT1mbtute3T6RD0wAMz5KNy25jkYuFrPYZc4qQ+bJY4JoI8s8JtTikGWcVsRb5+DNNshzrsoQ5ZZwqE0QdVuciNXlMVu35a8ZXU+AGPkfBXTslEMTRnGtntQWDHAGd4S0R\/eCy5uxrEdcKqltPWA==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_8.1.2_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V8.1.2","fileSize":"70395339","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"lbr7vBsQ4bQHBa\/cJH+U+XNScf24QsAGAOL8Vr+X1wTBuLR2lyGCvgHSBD8+mty16nWfUhU36Gr6Ky4Az98PkYXR0QNzKtjiymknfDMlZSzr18xMcFyqylcu3zNqEvt76CKhnc0dyfhXBufHrC2Btm\/ABMr\/DucD6DD8lYOY+0W+nGig8xcAP+vK8k0nnY6jT\/NerstEwg\/UKttc6OF3+G8aU9zVNU4KcIdN2\/zU05nEWbKdlT7foH1fyIvFeN4NrndU0TggFnz3Mx3yROmWOZGGKZ6SDoN71DNgVe2Wjw6GTY9J6DLKgdl20Q4hklJ7drLb+RDoSItc+IA6Bmss1Q=="},"require":{"ionCubeLoader":"10.1.0"}} }, "8.1.1-release.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "8.1.1", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^7.2.0 || ^7.3.0 || ^7.4.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-8.1.1-release.1.zip", "type": "zip" }, "time": "now", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "1.1.0", "authorizenet/authorizenet": "1.9.9", "aws/aws-sdk-php": "3.138.0", "bitpay/php-client": "v3.0.0-p2", "brick/math": "0.8.15", "bshaffer/oauth2-server-httpfoundation-bridge": "v1.4-p1", "bshaffer/oauth2-server-php": "v1.11.1-p1", "composer/ca-bundle": "1.2.8", "composer/composer": "1.10.6", "composer/semver": "1.5.1", "composer/spdx-licenses": "1.5.3", "composer/xdebug-handler": "1.4.3", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "1.10.2", "doctrine/inflector": "1.4.1", "doctrine/instantiator": "1.3.0", "doctrine/lexer": "1.2.0", "duosecurity/duo_php": "1.0.1", "egulias/email-validator": "2.1.22", "ezyang/htmlpurifier": "v4.12.0", "facebook/graph-sdk": "5.7.0", "filp/whoops": "2.7.2", "firebase/php-jwt": "v5.2.0", "goetas-webservices/xsd2php-runtime": "v0.2.12", "google/apiclient": "2.7.0-p1", "google/auth": "v1.11.1", "google/recaptcha": "1.2.4", "guzzlehttp/guzzle": "7.0.1", "guzzlehttp/promises": "v1.3.1", "guzzlehttp/psr7": "1.6.1", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v7.12.0", "illuminate/container": "v7.12.0", "illuminate/contracts": "v7.12.0", "illuminate/database": "v7.12.0", "illuminate/events": "v7.12.0", "illuminate/filesystem": "v7.28.4", "illuminate/support": "v7.12.0", "illuminate/translation": "v7.28.4", "illuminate/validation": "v7.12.0", "jms/metadata": "1.7.0", "jms/parser-lib": "1.0.0", "jms/serializer": "1.14.1", "justinrainbow/json-schema": "5.2.9", "knplabs/knp-menu": "v3.1.1", "laminas/laminas-diactoros": "2.3.1", "laminas/laminas-httphandlerrunner": "1.2.0", "laminas/laminas-loader": "2.6.1", "laminas/laminas-mail": "2.12.3-p2", "laminas/laminas-mime": "2.7.4", "laminas/laminas-stdlib": "3.3.0", "laminas/laminas-validator": "2.13.4", "laminas/laminas-zendframework-bridge": "1.1.1", "league/climate": "3.5.2", "league/flysystem": "1.0.67", "league/flysystem-aws-s3-v3": "1.0.24", "league/oauth2-client": "2.5.0", "league/oauth2-google": "3.0.3", "league/plates": "3.3.0", "michelf/php-markdown": "1.9.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "2.0.2", "mtdowling/jmespath.php": "2.6.0", "nesbot/carbon": "2.33.0", "nikic/fast-route": "v1.3.0", "paragonie/random_compat": "v9.99.100", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.1.5", "phpmyadmin/sql-parser": "5.3.1", "phpoption/phpoption": "1.7.3", "phpseclib/mcrypt_compat": "1.0.11", "phpseclib/phpseclib": "2.0.27", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-client": "1.0.1", "psr/http-factory": "1.0.1", "psr/http-message": "1.0.1", "psr/http-server-handler": "1.0.1", "psr/log": "1.0.2", "psr/simple-cache": "1.0.1", "punic/punic": "3.5.1", "ralouphie/getallheaders": "3.0.3", "ramsey/collection": "1.0.1", "ramsey/uuid": "4.0.1", "react/promise": "v2.8.0", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.8.0", "seld/phar-utils": "1.1.0", "smarty/smarty": "v3.1.36", "sonata-project/google-authenticator": "2.2.0", "stevenmaguire/oauth2-microsoft": "2.2.0", "stripe/stripe-php": "v7.34.0", "symfony/config": "v5.2.3", "symfony/console": "v5.0.8", "symfony/dependency-injection": "v5.1.7", "symfony/deprecation-contracts": "v2.2.0", "symfony/filesystem": "v5.0.8", "symfony/finder": "v5.0.8", "symfony/http-foundation": "v5.0.8", "symfony/mime": "v5.1.7", "symfony/polyfill-ctype": "v1.18.1", "symfony/polyfill-iconv": "v1.18.1", "symfony/polyfill-intl-idn": "v1.18.1", "symfony/polyfill-intl-normalizer": "v1.18.1", "symfony/polyfill-mbstring": "v1.18.1", "symfony/polyfill-php70": "v1.20.0", "symfony/polyfill-php72": "v1.18.1", "symfony/polyfill-php73": "v1.18.1", "symfony/polyfill-php80": "v1.18.1", "symfony/process": "v5.0.8", "symfony/service-contracts": "v2.2.0", "symfony/translation": "v5.0.8", "symfony/translation-contracts": "v2.3.0", "symfony/yaml": "v5.0.8", "tecnickcom/tcpdf": "6.3.5-p1", "true/punycode": "v2.1.1", "voku/portable-ascii": "1.5.3", "zbateson/mail-mime-parser": "1.2.1", "zbateson/mb-wrapper": "1.0.0", "zbateson/stream-decorators": "1.0.3" }, "extra": {"sha":"ac85e794b1a2b76571d2badb47e3e0b541e252de7254bda4e2a079d8e0f324a2","sig":"VN6Mj1xE95RPuTqDazK5c7Lk9qqUNCYpQjZ+QADTBq2ubtauIgh5EA+\/Byl4QBwAOVAex0cb04LPjARDYQmKW+3XvzrMLa+gDYlejqYQRNMzEQe3XUv09z58C107vf0TZi2Em7\/LsX0FamPE8hzAn5ndcu1Uxfrp6qjraRGO1LhgLtEVC2GcQWZPBc1TGAUVxCqnl6lNhUH3CsFZVgIFgV3RLUsQT225zouagmmS8ndZo4JlPOkiEfolvcjWKXwHVsDuOusQ3CDDWCTT91HnPWC5uDzjX0N+yvnI+wTNdKdU+L8C8lVuoDubAlR2cmsmMDtko2wxP4QdHFViiOVWpQ==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_8.1.1_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V8.1.1","fileSize":"70402748","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"cEQPk61ib4cQOo7PiL6rf6u5IcgSIX5FGmMFCSBJ8TdTWvLxbdeCi8Kh+BqZ13aTzeaiwdReIk+JWNDIB4jpo1d3a20nducCxSlNjqe9dtz\/04Su6zUNSRUyytjBHmDgXr\/5ECHAQJG63xMgZppnNRC0zf4EjiRmqdj011BKyG8jzzgYPgV75DGh5xuUc7PMiLZhlnWonCH7zfbJnydCuLPBQdTBluNfhC6Rf1ouI39+VQlM7yfhw4joC+vNYIAp6FKbr59XuFaY41OZ5TUeo4iRwqEAnMFv51NCKYThQagIZf25wUqYB1eeVHCs79oZP87bldtN4NXXUa3+SQAipw=="},"require":{"ionCubeLoader":"10.1.0"}} }, "8.1.0-release.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "8.1.0", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^7.2.0 || ^7.3.0 || ^7.4.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-8.1.0-release.1.zip", "type": "zip" }, "time": "now", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "1.1.0", "authorizenet/authorizenet": "1.9.9", "aws/aws-sdk-php": "3.138.0", "bitpay/php-client": "v3.0.0-p2", "brick/math": "0.8.15", "bshaffer/oauth2-server-httpfoundation-bridge": "v1.4-p1", "bshaffer/oauth2-server-php": "v1.11.1-p1", "composer/ca-bundle": "1.2.8", "composer/composer": "1.10.6", "composer/semver": "1.5.1", "composer/spdx-licenses": "1.5.3", "composer/xdebug-handler": "1.4.3", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "1.10.2", "doctrine/inflector": "1.4.1", "doctrine/instantiator": "1.3.0", "doctrine/lexer": "1.2.0", "duosecurity/duo_php": "1.0.1", "egulias/email-validator": "2.1.22", "ezyang/htmlpurifier": "v4.12.0", "facebook/graph-sdk": "5.7.0", "filp/whoops": "2.7.2", "firebase/php-jwt": "v5.2.0", "goetas-webservices/xsd2php-runtime": "v0.2.12", "google/apiclient": "2.7.0-p1", "google/auth": "v1.11.1", "google/recaptcha": "1.2.4", "guzzlehttp/guzzle": "7.0.1", "guzzlehttp/promises": "v1.3.1", "guzzlehttp/psr7": "1.6.1", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v7.12.0", "illuminate/container": "v7.12.0", "illuminate/contracts": "v7.12.0", "illuminate/database": "v7.12.0", "illuminate/events": "v7.12.0", "illuminate/filesystem": "v7.28.4", "illuminate/support": "v7.12.0", "illuminate/translation": "v7.28.4", "illuminate/validation": "v7.12.0", "jms/metadata": "1.7.0", "jms/parser-lib": "1.0.0", "jms/serializer": "1.14.1", "justinrainbow/json-schema": "5.2.9", "knplabs/knp-menu": "v3.1.1", "laminas/laminas-diactoros": "2.3.1", "laminas/laminas-httphandlerrunner": "1.2.0", "laminas/laminas-loader": "2.6.1", "laminas/laminas-mail": "2.12.3-p2", "laminas/laminas-mime": "2.7.4", "laminas/laminas-stdlib": "3.3.0", "laminas/laminas-validator": "2.13.4", "laminas/laminas-zendframework-bridge": "1.1.1", "league/climate": "3.5.2", "league/flysystem": "1.0.67", "league/flysystem-aws-s3-v3": "1.0.24", "league/oauth2-client": "2.5.0", "league/oauth2-google": "3.0.3", "league/plates": "3.3.0", "michelf/php-markdown": "1.9.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "2.0.2", "mtdowling/jmespath.php": "2.6.0", "nesbot/carbon": "2.33.0", "nikic/fast-route": "v1.3.0", "paragonie/random_compat": "v9.99.100", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.1.5", "phpmyadmin/sql-parser": "5.3.1", "phpoption/phpoption": "1.7.3", "phpseclib/mcrypt_compat": "1.0.11", "phpseclib/phpseclib": "2.0.27", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-client": "1.0.1", "psr/http-factory": "1.0.1", "psr/http-message": "1.0.1", "psr/http-server-handler": "1.0.1", "psr/log": "1.0.2", "psr/simple-cache": "1.0.1", "punic/punic": "3.5.1", "ralouphie/getallheaders": "3.0.3", "ramsey/collection": "1.0.1", "ramsey/uuid": "4.0.1", "react/promise": "v2.8.0", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.8.0", "seld/phar-utils": "1.1.0", "smarty/smarty": "v3.1.36", "sonata-project/google-authenticator": "2.2.0", "stevenmaguire/oauth2-microsoft": "2.2.0", "stripe/stripe-php": "v7.34.0", "symfony/config": "v5.2.1", "symfony/console": "v5.0.8", "symfony/dependency-injection": "v5.1.7", "symfony/deprecation-contracts": "v2.2.0", "symfony/filesystem": "v5.0.8", "symfony/finder": "v5.0.8", "symfony/http-foundation": "v5.0.8", "symfony/mime": "v5.1.7", "symfony/polyfill-ctype": "v1.18.1", "symfony/polyfill-iconv": "v1.18.1", "symfony/polyfill-intl-idn": "v1.18.1", "symfony/polyfill-intl-normalizer": "v1.18.1", "symfony/polyfill-mbstring": "v1.18.1", "symfony/polyfill-php70": "v1.20.0", "symfony/polyfill-php72": "v1.18.1", "symfony/polyfill-php73": "v1.18.1", "symfony/polyfill-php80": "v1.18.1", "symfony/process": "v5.0.8", "symfony/service-contracts": "v2.2.0", "symfony/translation": "v5.0.8", "symfony/translation-contracts": "v2.3.0", "symfony/yaml": "v5.0.8", "tecnickcom/tcpdf": "6.3.5-p1", "true/punycode": "v2.1.1", "voku/portable-ascii": "1.5.3", "zbateson/mail-mime-parser": "1.2.1", "zbateson/mb-wrapper": "1.0.0", "zbateson/stream-decorators": "1.0.3" }, "extra": {"sha":"25b97f4cb7c84ac99bd05429e9b86d7973be5f2d1f47d697ba6dcd4f929555fc","sig":"bJELPlgzm8\/HGKQZ41pac65CEeNUi15vYWB+pXjgSTFZPHfIIE9DL5v3sXyYfHEgW6VrDNzJn+jamgSNMHus55WWXF00wZ0urjIxwPKmI78xa2MvkAS25F\/oodVDXXhvfJHpCOS+mz+GD+\/4mKvwVO6z8Pf+3aKPCU4iWEdmPD8Zvy7vFcMqtN0S2\/WkCGlaZwgQ+sAPdCWuu2Hbo17p+HrGcEegehv6vnV\/ItycCUJDvQ\/jNYxW0rO2ElesunoUJ1QVd9TmIF+h\/SGDH++\/Os3ZnSTAEvqyV41FTBHSgJGE8L\/DwfJBfxYabWtnPDetemuuBgyDKKAwH8LFOAlM6Q==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_8.1.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V8.1.0_GA","fileSize":"70343780","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"iPK5dclqpcl82XzQobQYGDKTFNJs19aNd7FfUXRQnDg+wQFzodergXL\/qB1lu7iOQtuZBWRTX64yq2eACcG2l6OX5m1OuMwvEfSSSRXecAnal5OHbPRN1mki8p+UShMovmxydJhtroW+XhccYuY2iFiIRJ2xGEMAopTHrRQ8usW0pB4CP6yCDMtNXG5YOHMUt+HV3qHV3xiw8oyQda7+JXPvKXwrU7FOXSmXY21nWcHTn4b8bmW7Qw4F+hVoKZCHPHhLNU1X56YDziF27HbS+7ubYVL0Z8McTL+tCSXbHuyDjAb9uDNutPkR39OIpZ5JcZKunO3Z86E8kK1Z+GaAqQ=="},"require":{"ionCubeLoader":"10.1.0"}} }, "8.1.0-rc.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "8.1.0-RC.1", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^7.2.0 || ^7.3.0 || ^7.4.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-8.1.0-rc.1.zip", "type": "zip" }, "time": "now", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "1.1.0", "authorizenet/authorizenet": "1.9.9", "aws/aws-sdk-php": "3.138.0", "bitpay/php-client": "v3.0.0-p2", "brick/math": "0.8.15", "bshaffer/oauth2-server-httpfoundation-bridge": "v1.4-p1", "bshaffer/oauth2-server-php": "v1.11.1-p1", "composer/ca-bundle": "1.2.8", "composer/composer": "1.10.6", "composer/semver": "1.5.1", "composer/spdx-licenses": "1.5.3", "composer/xdebug-handler": "1.4.3", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "1.10.2", "doctrine/inflector": "1.4.1", "doctrine/instantiator": "1.3.0", "doctrine/lexer": "1.2.0", "duosecurity/duo_php": "1.0.1", "egulias/email-validator": "2.1.22", "ezyang/htmlpurifier": "v4.12.0", "facebook/graph-sdk": "5.7.0", "filp/whoops": "2.7.2", "firebase/php-jwt": "v5.2.0", "goetas-webservices/xsd2php-runtime": "v0.2.12", "google/apiclient": "2.7.0-p1", "google/auth": "v1.11.1", "google/recaptcha": "1.2.4", "guzzlehttp/guzzle": "7.0.1", "guzzlehttp/promises": "v1.3.1", "guzzlehttp/psr7": "1.6.1", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v7.12.0", "illuminate/container": "v7.12.0", "illuminate/contracts": "v7.12.0", "illuminate/database": "v7.12.0", "illuminate/events": "v7.12.0", "illuminate/filesystem": "v7.28.4", "illuminate/support": "v7.12.0", "illuminate/translation": "v7.28.4", "illuminate/validation": "v7.12.0", "jms/metadata": "1.7.0", "jms/parser-lib": "1.0.0", "jms/serializer": "1.14.1", "justinrainbow/json-schema": "5.2.9", "knplabs/knp-menu": "v3.1.1", "laminas/laminas-diactoros": "2.3.1", "laminas/laminas-httphandlerrunner": "1.2.0", "laminas/laminas-loader": "2.6.1", "laminas/laminas-mail": "2.12.3-p2", "laminas/laminas-mime": "2.7.4", "laminas/laminas-stdlib": "3.3.0", "laminas/laminas-validator": "2.13.4", "laminas/laminas-zendframework-bridge": "1.1.1", "league/climate": "3.5.2", "league/flysystem": "1.0.67", "league/flysystem-aws-s3-v3": "1.0.24", "league/oauth2-client": "2.5.0", "league/oauth2-google": "3.0.3", "league/plates": "3.3.0", "michelf/php-markdown": "1.9.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "2.0.2", "mtdowling/jmespath.php": "2.6.0", "nesbot/carbon": "2.33.0", "nikic/fast-route": "v1.3.0", "paragonie/random_compat": "v9.99.100", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.1.5", "phpmyadmin/sql-parser": "5.3.1", "phpoption/phpoption": "1.7.3", "phpseclib/mcrypt_compat": "1.0.11", "phpseclib/phpseclib": "2.0.27", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-client": "1.0.1", "psr/http-factory": "1.0.1", "psr/http-message": "1.0.1", "psr/http-server-handler": "1.0.1", "psr/log": "1.0.2", "psr/simple-cache": "1.0.1", "punic/punic": "3.5.1", "ralouphie/getallheaders": "3.0.3", "ramsey/collection": "1.0.1", "ramsey/uuid": "4.0.1", "react/promise": "v2.8.0", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.8.0", "seld/phar-utils": "1.1.0", "smarty/smarty": "v3.1.36", "sonata-project/google-authenticator": "2.2.0", "stevenmaguire/oauth2-microsoft": "2.2.0", "stripe/stripe-php": "v7.34.0", "symfony/config": "v5.2.0", "symfony/console": "v5.0.8", "symfony/dependency-injection": "v5.1.7", "symfony/deprecation-contracts": "v2.2.0", "symfony/filesystem": "v5.0.8", "symfony/finder": "v5.0.8", "symfony/http-foundation": "v5.0.8", "symfony/mime": "v5.1.7", "symfony/polyfill-ctype": "v1.18.1", "symfony/polyfill-iconv": "v1.18.1", "symfony/polyfill-intl-idn": "v1.18.1", "symfony/polyfill-intl-normalizer": "v1.18.1", "symfony/polyfill-mbstring": "v1.18.1", "symfony/polyfill-php70": "v1.20.0", "symfony/polyfill-php72": "v1.18.1", "symfony/polyfill-php73": "v1.18.1", "symfony/polyfill-php80": "v1.18.1", "symfony/process": "v5.0.8", "symfony/service-contracts": "v2.2.0", "symfony/translation": "v5.0.8", "symfony/translation-contracts": "v2.3.0", "symfony/yaml": "v5.0.8", "tecnickcom/tcpdf": "6.3.5-p1", "true/punycode": "v2.1.1", "voku/portable-ascii": "1.5.3", "zbateson/mail-mime-parser": "1.2.1", "zbateson/mb-wrapper": "1.0.0", "zbateson/stream-decorators": "1.0.3" }, "extra": {"sha":"6d04ccd833a1c0d6dfb88565a2bf15a11c37defb24c59c7e0c19b322d04a10ba","sig":"RxocH3gqsoqBB1WjCXuLF6UdGGUxSzS8+oK8cNqEwUgpcduzrzgw4jSFYrN2g4dUEyBLzaGFW4Kxf33AfhXLKBzDxQhjap5ebR5ybeE1WsVBs4GSQUeRT8UH9thyiDn15Ab1OTRxSFroxPCck4UkQTxPQ0tm8RLRUp3Ed0q6XekomIu5I8EQs2Ghc1JrN5uLJGm4xsNg94d2wrqXb7EYGfQw1cMAWaHaGF8EWiF0H+CDi40kFIU1YL6BQ\/j\/vpUm52qhK6jjL6mTKoERlTVkSpb5Rlro+pnpoqM\/vE1x\/4bAsgLhjBfQkXlQvYouyrbwIEzYlC58omdvpbY9rasnjQ==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_8.1.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V8.1.0_RC_1","fileSize":"60672653","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"aEy59hCpDv19mIes3o0UsTKrNwrUkDT8GZ2y0Kg2GgafPnGMslVjKpMMleMVmlBJsB2Z7ScGKx4fjXsREEb0ouiib0hG4hX3lkvyXxegff5PdrU1f0HjoTozp6fduo3omEv1Vgt48AdR7A56aNT4lWqFRstpsnrGnQ5nrMK1X5JNEAqt9lizfvEAN+8Opx8e35O\/oJS1ebRfhaPGV3CJVhEMFcXQa6RNkwPW6lT6XtE7AJY2Qs9knl46FjQQkE0UhShFnVkANvRKg+tqKXds6qc\/eGzkg5IkLmJP2mh47\/pebPAXxsh9sggLum2r1\/+ZYFQRwtzUkCbCIepDtUAV5w=="},"require":{"ionCubeLoader":"10.1.0"}} }, "8.1.0-beta.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "8.1.0-beta.1", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^7.2.0 || ^7.3.0 || ^7.4.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-8.1.0-beta.1.zip", "type": "zip" }, "time": "now", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "1.1.0", "authorizenet/authorizenet": "1.9.9", "aws/aws-sdk-php": "3.138.0", "bitpay/php-client": "v3.0.0-p2", "brick/math": "0.8.15", "bshaffer/oauth2-server-httpfoundation-bridge": "v1.4-p1", "bshaffer/oauth2-server-php": "v1.11.1-p1", "composer/ca-bundle": "1.2.8", "composer/composer": "1.10.6", "composer/semver": "1.5.1", "composer/spdx-licenses": "1.5.3", "composer/xdebug-handler": "1.4.3", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "1.10.2", "doctrine/inflector": "1.4.1", "doctrine/instantiator": "1.3.0", "doctrine/lexer": "1.2.0", "duosecurity/duo_php": "1.0.1", "egulias/email-validator": "2.1.22", "ezyang/htmlpurifier": "v4.12.0", "facebook/graph-sdk": "5.7.0", "filp/whoops": "2.7.2", "firebase/php-jwt": "v5.2.0", "goetas-webservices/xsd2php-runtime": "v0.2.12", "google/apiclient": "2.7.0-p1", "google/auth": "v1.11.1", "google/recaptcha": "1.2.4", "guzzlehttp/guzzle": "7.0.1", "guzzlehttp/promises": "v1.3.1", "guzzlehttp/psr7": "1.6.1", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v7.12.0", "illuminate/container": "v7.12.0", "illuminate/contracts": "v7.12.0", "illuminate/database": "v7.12.0", "illuminate/events": "v7.12.0", "illuminate/filesystem": "v7.28.4", "illuminate/support": "v7.12.0", "illuminate/translation": "v7.28.4", "illuminate/validation": "v7.12.0", "jms/metadata": "1.7.0", "jms/parser-lib": "1.0.0", "jms/serializer": "1.14.1", "justinrainbow/json-schema": "5.2.9", "knplabs/knp-menu": "v3.1.1", "laminas/laminas-diactoros": "2.3.1", "laminas/laminas-httphandlerrunner": "1.2.0", "laminas/laminas-loader": "2.6.1", "laminas/laminas-mail": "2.12.3-p2", "laminas/laminas-mime": "2.7.4", "laminas/laminas-stdlib": "3.3.0", "laminas/laminas-validator": "2.13.4", "laminas/laminas-zendframework-bridge": "1.1.1", "league/climate": "3.5.2", "league/flysystem": "1.0.67", "league/flysystem-aws-s3-v3": "1.0.24", "league/oauth2-client": "2.5.0", "league/oauth2-google": "3.0.3", "league/plates": "3.3.0", "michelf/php-markdown": "1.9.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "2.0.2", "mtdowling/jmespath.php": "2.6.0", "nesbot/carbon": "2.33.0", "nikic/fast-route": "v1.3.0", "paragonie/random_compat": "v9.99.100", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.1.5", "phpmyadmin/sql-parser": "5.3.1", "phpoption/phpoption": "1.7.3", "phpseclib/mcrypt_compat": "1.0.11", "phpseclib/phpseclib": "2.0.27", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-client": "1.0.1", "psr/http-factory": "1.0.1", "psr/http-message": "1.0.1", "psr/http-server-handler": "1.0.1", "psr/log": "1.0.2", "psr/simple-cache": "1.0.1", "punic/punic": "3.5.1", "ralouphie/getallheaders": "3.0.3", "ramsey/collection": "1.0.1", "ramsey/uuid": "4.0.1", "react/promise": "v2.8.0", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.8.0", "seld/phar-utils": "1.1.0", "smarty/smarty": "v3.1.36", "sonata-project/google-authenticator": "2.2.0", "stevenmaguire/oauth2-microsoft": "2.2.0", "stripe/stripe-php": "v7.34.0", "symfony/config": "v5.1.8", "symfony/console": "v5.0.8", "symfony/dependency-injection": "v5.1.7", "symfony/deprecation-contracts": "v2.2.0", "symfony/filesystem": "v5.0.8", "symfony/finder": "v5.0.8", "symfony/http-foundation": "v5.0.8", "symfony/mime": "v5.1.7", "symfony/polyfill-ctype": "v1.18.1", "symfony/polyfill-iconv": "v1.18.1", "symfony/polyfill-intl-idn": "v1.18.1", "symfony/polyfill-intl-normalizer": "v1.18.1", "symfony/polyfill-mbstring": "v1.18.1", "symfony/polyfill-php70": "v1.20.0", "symfony/polyfill-php72": "v1.18.1", "symfony/polyfill-php73": "v1.18.1", "symfony/polyfill-php80": "v1.18.1", "symfony/process": "v5.0.8", "symfony/service-contracts": "v2.2.0", "symfony/translation": "v5.0.8", "symfony/translation-contracts": "v2.3.0", "symfony/yaml": "v5.0.8", "tecnickcom/tcpdf": "6.3.5-p1", "true/punycode": "v2.1.1", "voku/portable-ascii": "1.5.3", "zbateson/mail-mime-parser": "1.2.1", "zbateson/mb-wrapper": "1.0.0", "zbateson/stream-decorators": "1.0.3" }, "extra": {"sha":"14468525b753b1c0088b0270a05638b929fd83893b93cb1e309fe4c79811ecb6","sig":"nf1NF9BlGPVmIUkI6XhacINYJvfuvDkkEMepj6\/I1lWdWZ6RPFku4aJBLJW3fJ\/S1EeSEfA\/TDUydVzEb2hlDmRzj8F\/DhnxpvFqY6P3aHQJmjrYAPCOup\/lsnX+hPIj931ACsMHXyqgfvvPF0zCtNlUxzfMuNhDLzyKkWWtpHleAHy7h0duWScPG1JxEEIWVNqQktj5H2907xADY1btsQ7r+wyoYTO+4tL5eeukpN2VKrVID51uHffh+bsrbaKR4Iv2JqcbV9dqcBSwwZ\/lpHPIAoCC3om8qND1Qj2h9RRFBQaIHR0xJPPbe6eGlfOcFXYCDfXj1CfCmRIITwyiEA==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_8.1.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V8.1.0_Beta_1","fileSize":"60681892","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"SLQdeSyJqioPksVhhv7WRYuzCCxLZv6ZINMZ8hST\/sjs8Y\/IFWn2KBDR3SkLknkMD+S7Rr+5if+ho1XJ5Fec6w+KAgjrNMF4OYX32PrEjbttx6vDg2I3OHgh8\/TjgkVGD16Cgs1TTUxRrrPoW+EJTfbzJHuNQ9x0s7bkXfk+r47d7GVLGNFbRoACeBygBzmKemP53u8s30LANOkM6XMIdwXX\/qJN2RjCcKqPo7l9\/o8XOXV4qlPtOKs7M0dJe9CITRj1oxpaFQz\/QM8M1MckYxNrT18onYqR8XgK6x0gLwAxG1wjPx5d0MZvh3s5S08DZsqxMDYTOozU5J7bQ\/+GrA=="},"require":{"ionCubeLoader":"10.1.0"}} }, "8.0.5-release.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "8.0.5", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^7.2.0 || ^7.3.0 || ^7.4.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-8.0.5-release.1.zip", "type": "zip" }, "time": "now", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "1.1.0", "authorizenet/authorizenet": "1.9.9", "aws/aws-sdk-php": "3.138.0", "bitpay/php-client": "v3.0.0-p2", "brick/math": "0.8.15", "bshaffer/oauth2-server-httpfoundation-bridge": "v1.4-p1", "bshaffer/oauth2-server-php": "v1.11.1-p1", "composer/ca-bundle": "1.2.8", "composer/composer": "1.10.6", "composer/semver": "1.5.1", "composer/spdx-licenses": "1.5.3", "composer/xdebug-handler": "1.4.3", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "1.10.2", "doctrine/inflector": "1.4.1", "doctrine/instantiator": "1.3.0", "doctrine/lexer": "1.2.0", "duosecurity/duo_php": "1.0.1", "egulias/email-validator": "2.1.22", "ezyang/htmlpurifier": "v4.12.0", "facebook/graph-sdk": "5.7.0", "filp/whoops": "2.7.2", "firebase/php-jwt": "v5.2.0", "goetas-webservices/xsd2php-runtime": "v0.2.12", "google/apiclient": "2.7.0-p1", "google/auth": "v1.11.1", "google/recaptcha": "1.2.4", "guzzlehttp/guzzle": "7.0.1", "guzzlehttp/promises": "v1.3.1", "guzzlehttp/psr7": "1.6.1", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v7.12.0", "illuminate/container": "v7.12.0", "illuminate/contracts": "v7.12.0", "illuminate/database": "v7.12.0", "illuminate/events": "v7.12.0", "illuminate/filesystem": "v7.28.4", "illuminate/support": "v7.12.0", "illuminate/translation": "v7.28.4", "illuminate/validation": "v7.12.0", "jms/metadata": "1.7.0", "jms/parser-lib": "1.0.0", "jms/serializer": "1.14.1", "justinrainbow/json-schema": "5.2.9", "knplabs/knp-menu": "v3.1.1", "laminas/laminas-diactoros": "2.3.1", "laminas/laminas-httphandlerrunner": "1.2.0", "laminas/laminas-loader": "2.6.1", "laminas/laminas-mail": "2.12.3-p2", "laminas/laminas-mime": "2.7.4", "laminas/laminas-stdlib": "3.3.0", "laminas/laminas-validator": "2.13.4", "laminas/laminas-zendframework-bridge": "1.1.1", "league/climate": "3.5.2", "league/flysystem": "1.0.67", "league/flysystem-aws-s3-v3": "1.0.24", "league/oauth2-client": "2.5.0", "league/oauth2-google": "3.0.3", "league/plates": "3.3.0", "michelf/php-markdown": "1.9.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "2.0.2", "mtdowling/jmespath.php": "2.6.0", "nesbot/carbon": "2.33.0", "nikic/fast-route": "v1.3.0", "paragonie/random_compat": "v9.99.100", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.1.5", "phpmyadmin/sql-parser": "5.3.1", "phpoption/phpoption": "1.7.3", "phpseclib/mcrypt_compat": "1.0.11", "phpseclib/phpseclib": "2.0.27", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-client": "1.0.1", "psr/http-factory": "1.0.1", "psr/http-message": "1.0.1", "psr/http-server-handler": "1.0.1", "psr/log": "1.0.2", "psr/simple-cache": "1.0.1", "punic/punic": "3.5.1", "ralouphie/getallheaders": "3.0.3", "ramsey/collection": "1.0.1", "ramsey/uuid": "4.0.1", "react/promise": "v2.8.0", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.8.0", "seld/phar-utils": "1.1.0", "smarty/smarty": "v3.1.36", "sonata-project/google-authenticator": "2.2.0", "stevenmaguire/oauth2-microsoft": "2.2.0", "stripe/stripe-php": "v7.34.0", "symfony/config": "v5.2.3", "symfony/console": "v5.0.8", "symfony/dependency-injection": "v5.1.7", "symfony/deprecation-contracts": "v2.2.0", "symfony/filesystem": "v5.0.8", "symfony/finder": "v5.0.8", "symfony/http-foundation": "v5.0.8", "symfony/mime": "v5.1.7", "symfony/polyfill-ctype": "v1.18.1", "symfony/polyfill-iconv": "v1.18.1", "symfony/polyfill-intl-idn": "v1.18.1", "symfony/polyfill-intl-normalizer": "v1.18.1", "symfony/polyfill-mbstring": "v1.18.1", "symfony/polyfill-php70": "v1.20.0", "symfony/polyfill-php72": "v1.18.1", "symfony/polyfill-php73": "v1.18.1", "symfony/polyfill-php80": "v1.18.1", "symfony/process": "v5.0.8", "symfony/service-contracts": "v2.2.0", "symfony/translation": "v5.0.8", "symfony/translation-contracts": "v2.3.0", "symfony/yaml": "v5.0.8", "tecnickcom/tcpdf": "6.3.5-p1", "true/punycode": "v2.1.1", "voku/portable-ascii": "1.5.3", "zbateson/mail-mime-parser": "1.2.1", "zbateson/mb-wrapper": "1.0.0", "zbateson/stream-decorators": "1.0.3" }, "extra": {"sha":"c7b45d4a8f45aa89d12b8d4a45c55264692334d371496c30666aacac90e753d9","sig":"ns5Rx1xRQBS9vF\/8\/G6jUTAaZOSuni3ttLyzSvymE+mYLDArvtariAImcwr0VyklMUhvaG3LXabGVzzYuwezDhGx\/nr1\/5jqFVShWGrPxrxbM\/akMffMamhwE+bW9ftSfB072XSiujOPARzxEbEJq4e0+NrPJgu4JR\/FzcQ1DqlErsQ50ilNZO4LapsgWnktF00dcmvCNk1Epxtg3uerBfpUbKcoCo1I0ZE1lMLzogJ8PablkVDBXXniO0WLUol9OWQEKFN0U0nIQ0Tm3aIz5JvU2J9hP222RHwRaNsNlSqlUx+rocd3POkQjJfrrK\/PVyVDW5X2YYeYxTQ\/Bzn1ZQ==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_8.0.5_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V8.0.5","fileSize":"68699310","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"SQQYmsucYPFj83tk9PKvYaMCCcg9xWVs0scDWM3VH18G\/yk21x6nv1pSsuZ\/QsqTrNLW5NO7HrVmbT6YAckdZvx9su8o7R4oqIO2dkQ\/\/fFsTOnZ2Xl35yyENyQzmb4kZSbS3FLnD5gbZqgd5buYa29NtIrHtkct\/mhrzoGzJDEZ60fwo+bZ+IN4AWZaLRgf3Jnj45wOrsoeYki5t8v1nIooRymOooMBXH9mUu\/6Wj62W7mIrCTQcsNOKgLj\/aKdxghlmrGrCVOxvIPeujM2k\/opSGLYMS6GSid50pb+QmMB+AszFXr22bznqrIDQsppZ1PFZKmd265RE\/dCer9ybw=="},"require":{"ionCubeLoader":"10.1.0"}} }, "8.0.4-release.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "8.0.4", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^7.2.0 || ^7.3.0 || ^7.4.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-8.0.4-release.1.zip", "type": "zip" }, "time": "now", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "1.1.0", "authorizenet/authorizenet": "1.9.9", "aws/aws-sdk-php": "3.138.0", "bitpay/php-client": "v3.0.0-p2", "brick/math": "0.8.15", "bshaffer/oauth2-server-httpfoundation-bridge": "v1.4-p1", "bshaffer/oauth2-server-php": "v1.11.1-p1", "composer/ca-bundle": "1.2.8", "composer/composer": "1.10.6", "composer/semver": "1.5.1", "composer/spdx-licenses": "1.5.3", "composer/xdebug-handler": "1.4.3", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "1.10.2", "doctrine/inflector": "1.4.1", "doctrine/instantiator": "1.3.0", "doctrine/lexer": "1.2.0", "duosecurity/duo_php": "1.0.1", "egulias/email-validator": "2.1.22", "ezyang/htmlpurifier": "v4.12.0", "facebook/graph-sdk": "5.7.0", "filp/whoops": "2.7.2", "firebase/php-jwt": "v5.2.0", "goetas-webservices/xsd2php-runtime": "v0.2.12", "google/apiclient": "2.7.0-p1", "google/auth": "v1.11.1", "google/recaptcha": "1.2.4", "guzzlehttp/guzzle": "7.0.1", "guzzlehttp/promises": "v1.3.1", "guzzlehttp/psr7": "1.6.1", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v7.12.0", "illuminate/container": "v7.12.0", "illuminate/contracts": "v7.12.0", "illuminate/database": "v7.12.0", "illuminate/events": "v7.12.0", "illuminate/filesystem": "v7.28.4", "illuminate/support": "v7.12.0", "illuminate/translation": "v7.28.4", "illuminate/validation": "v7.12.0", "jms/metadata": "1.7.0", "jms/parser-lib": "1.0.0", "jms/serializer": "1.14.1", "justinrainbow/json-schema": "5.2.9", "knplabs/knp-menu": "v3.1.1", "laminas/laminas-diactoros": "2.3.1", "laminas/laminas-httphandlerrunner": "1.2.0", "laminas/laminas-loader": "2.6.1", "laminas/laminas-mail": "2.12.3-p2", "laminas/laminas-mime": "2.7.4", "laminas/laminas-stdlib": "3.3.0", "laminas/laminas-validator": "2.13.4", "laminas/laminas-zendframework-bridge": "1.1.1", "league/climate": "3.5.2", "league/flysystem": "1.0.67", "league/flysystem-aws-s3-v3": "1.0.24", "league/oauth2-client": "2.5.0", "league/oauth2-google": "3.0.3", "league/plates": "3.3.0", "michelf/php-markdown": "1.9.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "2.0.2", "mtdowling/jmespath.php": "2.6.0", "nesbot/carbon": "2.33.0", "nikic/fast-route": "v1.3.0", "paragonie/random_compat": "v9.99.100", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.1.5", "phpmyadmin/sql-parser": "5.3.1", "phpoption/phpoption": "1.7.3", "phpseclib/mcrypt_compat": "1.0.11", "phpseclib/phpseclib": "2.0.27", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-client": "1.0.1", "psr/http-factory": "1.0.1", "psr/http-message": "1.0.1", "psr/http-server-handler": "1.0.1", "psr/log": "1.0.2", "psr/simple-cache": "1.0.1", "punic/punic": "3.5.1", "ralouphie/getallheaders": "3.0.3", "ramsey/collection": "1.0.1", "ramsey/uuid": "4.0.1", "react/promise": "v2.8.0", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.8.0", "seld/phar-utils": "1.1.0", "smarty/smarty": "v3.1.36", "sonata-project/google-authenticator": "2.2.0", "stevenmaguire/oauth2-microsoft": "2.2.0", "stripe/stripe-php": "v7.34.0", "symfony/config": "v5.1.7", "symfony/console": "v5.0.8", "symfony/dependency-injection": "v5.1.7", "symfony/deprecation-contracts": "v2.2.0", "symfony/filesystem": "v5.0.8", "symfony/finder": "v5.0.8", "symfony/http-foundation": "v5.0.8", "symfony/mime": "v5.1.7", "symfony/polyfill-ctype": "v1.18.1", "symfony/polyfill-iconv": "v1.18.1", "symfony/polyfill-intl-idn": "v1.18.1", "symfony/polyfill-intl-normalizer": "v1.18.1", "symfony/polyfill-mbstring": "v1.18.1", "symfony/polyfill-php70": "v1.20.0", "symfony/polyfill-php72": "v1.18.1", "symfony/polyfill-php73": "v1.18.1", "symfony/polyfill-php80": "v1.18.1", "symfony/process": "v5.0.8", "symfony/service-contracts": "v2.2.0", "symfony/translation": "v5.0.8", "symfony/translation-contracts": "v2.3.0", "symfony/yaml": "v5.0.8", "tecnickcom/tcpdf": "6.3.5-p1", "true/punycode": "v2.1.1", "voku/portable-ascii": "1.5.3", "zbateson/mail-mime-parser": "1.2.1", "zbateson/mb-wrapper": "1.0.0", "zbateson/stream-decorators": "1.0.3" }, "extra": {"sha":"32ec21439601fdff326735ecd599efe522a00416344528dbf997dd3c2cf7e663","sig":"lxE5T0xanLflGYkV+67GV4gH28X2yNDOYdHTtQL2\/uf7kVH4boLF1LUggiEPF\/LG87xKZzGz7TwuYK8S2iSew7IEd2KXS7GpF\/hq4yrXv3umqSfKjMXXF1NPSERKzHso5mde4eefNHbCAYIYJj8C4pfkbIkKvMQbMo3zt16hJGQVKKJIzeMRMkgdK90maD+2+10lTppNewuY5C6n8EEcfzlTHSNnwfphfeYDBAR4nIJ67swpTb541af2wnTTiONex\/\/PrRwvvE1\/asKr4jOm6SVFEorC+T+QXPkPnYBxLfp47VsLaKRladvwPSwMkJf3IIHSbX4O37yTzJNODWgoyg==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_8.0.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V8.0.4","fileSize":"59131677","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"hBm4Q1wCnqrRQ12bUfJYYJI2kHNUGHoVDnxThCRoxEJwJrgWljCOY9SEdt9KZLqp4s89l4h\/I6e9cwA1hU8fkqEZ9mWMjI+W3ntQNwEspMfW5p0Qh8nyGnEGjRFn4DCvug1f3HXUWOFCbS6tpU8nwlbCCz8G8v3nedXFj\/\/sevu7H1EO\/PdRum0HdrwQocuybcdZkSSMcjAR0cF2zghDi2kkpMdsc8RG58Bq+WgpLgdlLJEa0L9VbbkLq4oZS8BUK5qE5REG9G351ibbl7PH8hdljqiWeP6\/pyhdaKaGxAZkN1uVm17F5gqv1la+Zn4TzuZyh2bdysy5+Ss43POToA=="},"require":{"ionCubeLoader":"10.1.0"}} }, "8.0.3-release.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "8.0.3", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^7.2.0 || ^7.3.0 || ^7.4.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-8.0.3-release.1.zip", "type": "zip" }, "time": "now", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "1.1.0", "authorizenet/authorizenet": "1.9.9", "aws/aws-sdk-php": "3.138.0", "bitpay/php-client": "v3.0.0-p2", "brick/math": "0.8.15", "bshaffer/oauth2-server-httpfoundation-bridge": "v1.4-p1", "bshaffer/oauth2-server-php": "v1.11.1-p1", "composer/ca-bundle": "1.2.8", "composer/composer": "1.10.6", "composer/semver": "1.5.1", "composer/spdx-licenses": "1.5.3", "composer/xdebug-handler": "1.4.3", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "1.10.2", "doctrine/inflector": "1.4.1", "doctrine/instantiator": "1.3.0", "doctrine/lexer": "1.2.0", "duosecurity/duo_php": "1.0.1", "egulias/email-validator": "2.1.22", "ezyang/htmlpurifier": "v4.12.0", "facebook/graph-sdk": "5.7.0", "filp/whoops": "2.7.2", "firebase/php-jwt": "v5.2.0", "goetas-webservices/xsd2php-runtime": "v0.2.12", "google/apiclient": "2.7.0-p1", "google/auth": "v1.11.1", "google/recaptcha": "1.2.4", "guzzlehttp/guzzle": "7.0.1", "guzzlehttp/promises": "v1.3.1", "guzzlehttp/psr7": "1.6.1", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v7.12.0", "illuminate/container": "v7.12.0", "illuminate/contracts": "v7.12.0", "illuminate/database": "v7.12.0", "illuminate/events": "v7.12.0", "illuminate/filesystem": "v7.28.4", "illuminate/support": "v7.12.0", "illuminate/translation": "v7.28.4", "illuminate/validation": "v7.12.0", "jms/metadata": "1.7.0", "jms/parser-lib": "1.0.0", "jms/serializer": "1.14.1", "justinrainbow/json-schema": "5.2.9", "knplabs/knp-menu": "v3.1.1", "laminas/laminas-diactoros": "2.3.1", "laminas/laminas-httphandlerrunner": "1.2.0", "laminas/laminas-loader": "2.6.1", "laminas/laminas-mail": "2.12.3-p2", "laminas/laminas-mime": "2.7.4", "laminas/laminas-stdlib": "3.3.0", "laminas/laminas-validator": "2.13.4", "laminas/laminas-zendframework-bridge": "1.1.1", "league/climate": "3.5.2", "league/flysystem": "1.0.67", "league/flysystem-aws-s3-v3": "1.0.24", "league/oauth2-client": "2.5.0", "league/oauth2-google": "3.0.3", "league/plates": "3.3.0", "michelf/php-markdown": "1.9.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "2.0.2", "mtdowling/jmespath.php": "2.6.0", "nesbot/carbon": "2.33.0", "nikic/fast-route": "v1.3.0", "paragonie/random_compat": "v9.99.100", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.1.5", "phpmyadmin/sql-parser": "5.3.1", "phpoption/phpoption": "1.7.3", "phpseclib/mcrypt_compat": "1.0.11", "phpseclib/phpseclib": "2.0.27", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-client": "1.0.1", "psr/http-factory": "1.0.1", "psr/http-message": "1.0.1", "psr/http-server-handler": "1.0.1", "psr/log": "1.0.2", "psr/simple-cache": "1.0.1", "punic/punic": "3.5.1", "ralouphie/getallheaders": "3.0.3", "ramsey/collection": "1.0.1", "ramsey/uuid": "4.0.1", "react/promise": "v2.8.0", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.8.0", "seld/phar-utils": "1.1.0", "smarty/smarty": "v3.1.36", "sonata-project/google-authenticator": "2.2.0", "stevenmaguire/oauth2-microsoft": "2.2.0", "stripe/stripe-php": "v7.34.0", "symfony/config": "v5.1.7", "symfony/console": "v5.0.8", "symfony/dependency-injection": "v5.1.7", "symfony/deprecation-contracts": "v2.2.0", "symfony/filesystem": "v5.0.8", "symfony/finder": "v5.0.8", "symfony/http-foundation": "v5.0.8", "symfony/mime": "v5.1.7", "symfony/polyfill-ctype": "v1.18.1", "symfony/polyfill-iconv": "v1.18.1", "symfony/polyfill-intl-idn": "v1.18.1", "symfony/polyfill-intl-normalizer": "v1.18.1", "symfony/polyfill-mbstring": "v1.18.1", "symfony/polyfill-php70": "v1.18.1", "symfony/polyfill-php72": "v1.18.1", "symfony/polyfill-php73": "v1.18.1", "symfony/polyfill-php80": "v1.18.1", "symfony/process": "v5.0.8", "symfony/service-contracts": "v2.2.0", "symfony/translation": "v5.0.8", "symfony/translation-contracts": "v2.3.0", "symfony/yaml": "v5.0.8", "tecnickcom/tcpdf": "6.3.5-p1", "true/punycode": "v2.1.1", "voku/portable-ascii": "1.5.3", "zbateson/mail-mime-parser": "1.2.1", "zbateson/mb-wrapper": "1.0.0", "zbateson/stream-decorators": "1.0.3" }, "extra": {"sha":"65d3a7b6255ba69ae714eaea396d95d5313bf6d09872ce5b694e6a1ed45e9ef7","sig":"UTvv0dLgRS7kUhOwMfeT6nVzXPqYCak9c95lXpQWG\/QVDGSnnmC\/4XcW0s6fF5X0Vsodg\/lzrvxYlSj60EhRWo0yVysR7+CwThzFL48Nm7bnXJF9\/kL28saGhq\/XO3E0IIjnb8sqxoL0DR7OIB9Bo3Izn3Ly2CZAb46vQ8bOjcUcN\/0yqDDRtdERTrq468pkwnBR3AECjVQ7sTeGGno7eVfWdM3gIQ0kxyEcR0rNZe0iWfiIlTI9r1ADbM0O2dbcO0yVYtcJAlvQE0cJlTjS0XQZC9dYS+XFfF9fc0y9o7x0TQfI1uMnqzYNa3mjZIo8qLZbf5b2i8wRwk81tusGMA==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_8.0.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V8.0.3","fileSize":"59135820","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"C6CFDHt0FEao2SkH71FW8kkkujNSVLXeqFOJmCUDxBKB184Y9eqDw0Ev66YNKV2+q1tuZ0zgNnp5Ej+DFnbQiw59W43hQ6gSbv24bK\/C4dOQeJ3z+mBfz+U9q1JTSujdTocT8JYG9BJ3m2x\/e98alvFifz+40ktegKnbhAgYfMr8S7KFANphXZMAOhXzuwu81ixrS+4hsOLmfCa0MVp0hvJ3lsRCCjGfAeStT1z99fRM+Y\/5MFYMbKiRFasStcoExhaLZObKMCchBFyq8t1ZB\/1cCoDjr5zCBsTOUIpFWHyqMrIFd3WvN97JZJWRZlcAVPk7NeBQ1ZMiKVdZmFnA9w=="},"require":{"ionCubeLoader":"10.1.0"}} }, "8.0.2-release.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "8.0.2", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^7.2.0 || ^7.3.0 || ^7.4.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-8.0.2-release.1.zip", "type": "zip" }, "time": "now", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "1.1.0", "authorizenet/authorizenet": "1.9.9", "aws/aws-sdk-php": "3.138.0", "bitpay/php-client": "v3.0.0-p2", "brick/math": "0.8.15", "bshaffer/oauth2-server-httpfoundation-bridge": "v1.4-p1", "bshaffer/oauth2-server-php": "v1.11.1-p1", "composer/ca-bundle": "1.2.8", "composer/composer": "1.10.6", "composer/semver": "1.5.1", "composer/spdx-licenses": "1.5.3", "composer/xdebug-handler": "1.4.3", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "1.10.2", "doctrine/inflector": "1.4.1", "doctrine/instantiator": "1.3.0", "doctrine/lexer": "1.2.0", "duosecurity/duo_php": "1.0.1", "egulias/email-validator": "2.1.22", "ezyang/htmlpurifier": "v4.12.0", "facebook/graph-sdk": "5.7.0", "filp/whoops": "2.7.2", "firebase/php-jwt": "v5.2.0", "goetas-webservices/xsd2php-runtime": "v0.2.12", "google/apiclient": "2.7.0-p1", "google/auth": "v1.11.1", "google/recaptcha": "1.2.4", "guzzlehttp/guzzle": "7.0.1", "guzzlehttp/promises": "v1.3.1", "guzzlehttp/psr7": "1.6.1", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v7.12.0", "illuminate/container": "v7.12.0", "illuminate/contracts": "v7.12.0", "illuminate/database": "v7.12.0", "illuminate/events": "v7.12.0", "illuminate/filesystem": "v7.28.4", "illuminate/support": "v7.12.0", "illuminate/translation": "v7.28.4", "illuminate/validation": "v7.12.0", "jms/metadata": "1.7.0", "jms/parser-lib": "1.0.0", "jms/serializer": "1.14.1", "justinrainbow/json-schema": "5.2.9", "knplabs/knp-menu": "v3.1.1", "laminas/laminas-diactoros": "2.3.1", "laminas/laminas-httphandlerrunner": "1.2.0", "laminas/laminas-loader": "2.6.1", "laminas/laminas-mail": "2.12.3-p2", "laminas/laminas-mime": "2.7.4", "laminas/laminas-stdlib": "3.3.0", "laminas/laminas-validator": "2.13.4", "laminas/laminas-zendframework-bridge": "1.1.1", "league/climate": "3.5.2", "league/flysystem": "1.0.67", "league/flysystem-aws-s3-v3": "1.0.24", "league/oauth2-client": "2.5.0", "league/oauth2-google": "3.0.3", "league/plates": "3.3.0", "michelf/php-markdown": "1.9.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "2.0.2", "mtdowling/jmespath.php": "2.6.0", "nesbot/carbon": "2.33.0", "nikic/fast-route": "v1.3.0", "paragonie/random_compat": "v9.99.99", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.1.5", "phpmyadmin/sql-parser": "5.3.1", "phpoption/phpoption": "1.7.3", "phpseclib/mcrypt_compat": "1.0.11", "phpseclib/phpseclib": "2.0.27", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-client": "1.0.1", "psr/http-factory": "1.0.1", "psr/http-message": "1.0.1", "psr/http-server-handler": "1.0.1", "psr/log": "1.0.2", "psr/simple-cache": "1.0.1", "punic/punic": "3.5.1", "ralouphie/getallheaders": "3.0.3", "ramsey/collection": "1.0.1", "ramsey/uuid": "4.0.1", "react/promise": "v2.8.0", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.8.0", "seld/phar-utils": "1.1.0", "smarty/smarty": "v3.1.36", "sonata-project/google-authenticator": "2.2.0", "stevenmaguire/oauth2-microsoft": "2.2.0", "stripe/stripe-php": "v7.34.0", "symfony/config": "v5.1.7", "symfony/console": "v5.0.8", "symfony/dependency-injection": "v5.1.7", "symfony/deprecation-contracts": "v2.2.0", "symfony/filesystem": "v5.0.8", "symfony/finder": "v5.0.8", "symfony/http-foundation": "v5.0.8", "symfony/mime": "v5.1.7", "symfony/polyfill-ctype": "v1.18.1", "symfony/polyfill-iconv": "v1.18.1", "symfony/polyfill-intl-idn": "v1.18.1", "symfony/polyfill-intl-normalizer": "v1.18.1", "symfony/polyfill-mbstring": "v1.18.1", "symfony/polyfill-php70": "v1.18.1", "symfony/polyfill-php72": "v1.18.1", "symfony/polyfill-php73": "v1.18.1", "symfony/polyfill-php80": "v1.18.1", "symfony/process": "v5.0.8", "symfony/service-contracts": "v2.2.0", "symfony/translation": "v5.0.8", "symfony/translation-contracts": "v2.3.0", "symfony/yaml": "v5.0.8", "tecnickcom/tcpdf": "6.3.5-p1", "true/punycode": "v2.1.1", "voku/portable-ascii": "1.5.3", "zbateson/mail-mime-parser": "1.2.1", "zbateson/mb-wrapper": "1.0.0", "zbateson/stream-decorators": "1.0.3" }, "extra": {"sha":"1f4851e2b646ab2fc9e52b29fef13d34230b2b5eb0e9e28f2701c12becb5a2d6","sig":"Bnd86tAPv\/ZjyBzWe33lvohIZn+rzusO73yMuLOBAbiviOzddcJBwt8exHMKtFUUIy9QQtd7rsNBDxoaq4TSnY6Mh+\/\/zCWjbOvmpfV2+sGOvKxTZ4xKJsfKRNl0bId8bWkmR+BDv8l4GZjbEgEJZxT47vjaazOK76ZYeU7mXAqw+2Fs58Ycak37qK0835twc4i6nvqbba7vl\/89cKi7WZjqVR90kRr50nfM1OiysR02p2\/iULkls2T4dokFtY5bN6v7Iip5sMlY\/\/RRpsINsOp9LZBAeEHG1FhnSXiMX4qXngSFYJcnNxBHed21p6GJ\/zE7w7tciWccBN9oJHdXsw==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_8.0.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V8.0.2","fileSize":"59123234","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"bvjwZwzagqQ0JOmKGxpwX2iSazn0Nl9lF4D4mWnWiuNRGld+\/Tsy0SM1G6wxCZUHwPIcteqmMgWMt+v0HSMBVJ\/rKITtzDl5h9rw+XeSAAeVJtQjPvoKikQN9V6e2yuGECxpv7MCOTEUpAbf7kxJ\/WWMLVrn9zrfGkv2MXMBFfGPQZOg+aZvYVcqJAe3w7RRGmt+vz2MAtlO4jN7x\/ioiMDIOif5xt3HG9e+E6e9ugfsIU44pvTvexxGK378EbdfXz7CE62yXubcO1ZwSP8dFJFnIe8haM\/TAjnLQl\/m76bmXxpxvVkATMbMFg1fdzTHVRZZXKTa46rqb5ORf1z7BA=="},"require":{"ionCubeLoader":"10.1.0"}} }, "8.0.1-release.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "8.0.1", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^7.2.0 || ^7.3.0 || ^7.4.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-8.0.1-release.1.zip", "type": "zip" }, "time": "now", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "1.1.0", "authorizenet/authorizenet": "1.9.9", "aws/aws-sdk-php": "3.138.0", "bitpay/php-client": "v3.0.0-p2", "brick/math": "0.8.15", "bshaffer/oauth2-server-httpfoundation-bridge": "v1.4-p1", "bshaffer/oauth2-server-php": "v1.11.1-p1", "composer/ca-bundle": "1.2.8", "composer/composer": "1.10.6", "composer/semver": "1.5.1", "composer/spdx-licenses": "1.5.3", "composer/xdebug-handler": "1.4.3", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "1.10.2", "doctrine/inflector": "1.4.1", "doctrine/instantiator": "1.3.0", "doctrine/lexer": "1.2.0", "duosecurity/duo_php": "1.0.1", "egulias/email-validator": "2.1.22", "ezyang/htmlpurifier": "v4.12.0", "facebook/graph-sdk": "5.7.0", "filp/whoops": "2.7.2", "firebase/php-jwt": "v5.2.0", "goetas-webservices/xsd2php-runtime": "v0.2.12", "google/apiclient": "2.7.0-p1", "google/auth": "v1.11.1", "google/recaptcha": "1.2.4", "guzzlehttp/guzzle": "7.0.1", "guzzlehttp/promises": "v1.3.1", "guzzlehttp/psr7": "1.6.1", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v7.12.0", "illuminate/container": "v7.12.0", "illuminate/contracts": "v7.12.0", "illuminate/database": "v7.12.0", "illuminate/events": "v7.12.0", "illuminate/filesystem": "v7.28.3", "illuminate/support": "v7.12.0", "illuminate/translation": "v7.28.3", "illuminate/validation": "v7.12.0", "jms/metadata": "1.7.0", "jms/parser-lib": "1.0.0", "jms/serializer": "1.14.1", "justinrainbow/json-schema": "5.2.9", "knplabs/knp-menu": "v3.1.1", "laminas/laminas-diactoros": "2.3.1", "laminas/laminas-httphandlerrunner": "1.2.0", "laminas/laminas-loader": "2.6.1", "laminas/laminas-mail": "2.12.3-p2", "laminas/laminas-mime": "2.7.4", "laminas/laminas-stdlib": "3.3.0", "laminas/laminas-validator": "2.13.4", "laminas/laminas-zendframework-bridge": "1.1.1", "league/climate": "3.5.2", "league/flysystem": "1.0.67", "league/flysystem-aws-s3-v3": "1.0.24", "league/oauth2-client": "2.5.0", "league/oauth2-google": "3.0.3", "league/plates": "3.3.0", "michelf/php-markdown": "1.9.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "2.0.2", "mtdowling/jmespath.php": "2.6.0", "nesbot/carbon": "2.33.0", "nikic/fast-route": "v1.3.0", "paragonie/random_compat": "v9.99.99", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.1.5", "phpmyadmin/sql-parser": "5.3.1", "phpoption/phpoption": "1.7.3", "phpseclib/mcrypt_compat": "1.0.11", "phpseclib/phpseclib": "2.0.27", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-client": "1.0.1", "psr/http-factory": "1.0.1", "psr/http-message": "1.0.1", "psr/http-server-handler": "1.0.1", "psr/log": "1.0.2", "psr/simple-cache": "1.0.1", "punic/punic": "3.5.1", "ralouphie/getallheaders": "3.0.3", "ramsey/collection": "1.0.1", "ramsey/uuid": "4.0.1", "react/promise": "v2.8.0", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.8.0", "seld/phar-utils": "1.1.0", "smarty/smarty": "v3.1.36", "sonata-project/google-authenticator": "2.2.0", "stevenmaguire/oauth2-microsoft": "2.2.0", "stripe/stripe-php": "v7.34.0", "symfony/config": "v5.1.6", "symfony/console": "v5.0.8", "symfony/dependency-injection": "v5.1.6", "symfony/deprecation-contracts": "v2.2.0", "symfony/filesystem": "v5.0.8", "symfony/finder": "v5.0.8", "symfony/http-foundation": "v5.0.8", "symfony/mime": "v5.1.6", "symfony/polyfill-ctype": "v1.18.1", "symfony/polyfill-iconv": "v1.18.1", "symfony/polyfill-intl-idn": "v1.18.1", "symfony/polyfill-intl-normalizer": "v1.18.1", "symfony/polyfill-mbstring": "v1.18.1", "symfony/polyfill-php70": "v1.18.1", "symfony/polyfill-php72": "v1.18.1", "symfony/polyfill-php73": "v1.18.1", "symfony/polyfill-php80": "v1.18.1", "symfony/process": "v5.0.8", "symfony/service-contracts": "v2.2.0", "symfony/translation": "v5.0.8", "symfony/translation-contracts": "v2.2.0", "symfony/yaml": "v5.0.8", "tecnickcom/tcpdf": "6.3.5-p1", "true/punycode": "v2.1.1", "voku/portable-ascii": "1.5.3", "zbateson/mail-mime-parser": "1.2.1", "zbateson/mb-wrapper": "1.0.0", "zbateson/stream-decorators": "1.0.3" }, "extra": {"sha":"69e39362da99862d0fd38ce9e3200c36d572fa7dc09e7b880b9fb2764f4fca8b","sig":"jFnVkyqyOhjA3tieCydClUiK0HvePOGg1rC1JUfFSu9anY5H\/XAyYfFVPMX+WcmSTUr4HGrAscd9SonaMHoeewoAFOkPjubsET1qhz4II70vtIcW+JgDIqfPTsvX8nvF+pQGMrGHuTEZKmg+qwY6zRdRee1\/WtUC8fIt91Phk9adZ9HuOrJfFQ6TUGySlufDgbO1dOuGZfv0BN6ULKhkwP5HK6avl0BzUAgQPBhi8oRvHk8KpuqCMI7fuF7d1jtYqnm+QPwID9QmyP5JRbt5gXGMK\/KlQOQXrHJ+5ev9e+fiqPbkHPzjeiH3Drk47OQ+GdyOddGFzmWQ761ChgjlNg==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_8.0.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V8.0.1","fileSize":"59135104","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"F9VpKuJfWQBzUsKWiXk+vX\/zdIvj1CX1QVPgjDsgFh7RtBQXGnHcnbIUfQzg9mUYePDDVqjJGW6gM8VDXqNuaQ\/n8XHZKC9+zlY+riR4DPrh6qIeGQcnXN6GpQ6A2eSRw6N+ZzNhRRWJtKtcrFnT5BV\/BqH\/Yr+2vGPNYjCDsB+2JBoqNQXKLiRZZCNgR6JZcaKcBZlK+SyO53w0AwdfdDMDozpUCjWiZ2EtwptiUa1JxYbPA4b\/5lJ4O0bZVASaAviIGT5gV1iGjXs3qvqvR\/L+XggEK4gYFHuqPfHzAAaf1tWfyhdywJBp6XMXc7kgb2TJZlgkOJ0fBeicOO6CsQ=="},"require":{"ionCubeLoader":"10.1.0"}} }, "8.0.0-release.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "8.0.0", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^7.2.0 || ^7.3.0 || ^7.4.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-8.0.0-release.1.zip", "type": "zip" }, "time": "now", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "1.1.0", "authorizenet/authorizenet": "1.9.9", "aws/aws-sdk-php": "3.138.0", "bitpay/sdk-light": "v2.0.2007", "brick/math": "0.8.15", "bshaffer/oauth2-server-httpfoundation-bridge": "v1.4-p1", "bshaffer/oauth2-server-php": "v1.11.1-p1", "composer/ca-bundle": "1.2.8", "composer/composer": "1.10.6", "composer/semver": "1.5.1", "composer/spdx-licenses": "1.5.3", "composer/xdebug-handler": "1.4.3", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "1.10.2", "doctrine/inflector": "1.4.1", "doctrine/instantiator": "1.3.0", "doctrine/lexer": "1.2.0", "duosecurity/duo_php": "1.0.1", "egulias/email-validator": "2.1.22", "ezyang/htmlpurifier": "v4.12.0", "facebook/graph-sdk": "5.7.0", "filp/whoops": "2.7.2", "firebase/php-jwt": "v5.2.0", "goetas-webservices/xsd2php-runtime": "v0.2.12", "google/apiclient": "2.7.0-p1", "google/auth": "v1.11.1", "google/recaptcha": "1.2.4", "guzzlehttp/guzzle": "7.0.1", "guzzlehttp/promises": "v1.3.1", "guzzlehttp/psr7": "1.6.1", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v7.12.0", "illuminate/container": "v7.12.0", "illuminate/contracts": "v7.12.0", "illuminate/database": "v7.12.0", "illuminate/events": "v7.12.0", "illuminate/filesystem": "v7.28.3", "illuminate/support": "v7.12.0", "illuminate/translation": "v7.28.3", "illuminate/validation": "v7.12.0", "jms/metadata": "1.7.0", "jms/parser-lib": "1.0.0", "jms/serializer": "1.14.1", "justinrainbow/json-schema": "5.2.9", "knplabs/knp-menu": "v3.1.1", "laminas/laminas-diactoros": "2.3.1", "laminas/laminas-httphandlerrunner": "1.2.0", "laminas/laminas-loader": "2.6.1", "laminas/laminas-mail": "2.11.0", "laminas/laminas-mime": "2.7.4", "laminas/laminas-stdlib": "3.3.0", "laminas/laminas-validator": "2.13.4", "laminas/laminas-zendframework-bridge": "1.1.1", "league/climate": "3.5.2", "league/flysystem": "1.0.67", "league/flysystem-aws-s3-v3": "1.0.24", "league/oauth2-client": "2.5.0", "league/oauth2-google": "3.0.3", "league/plates": "3.3.0", "michelf/php-markdown": "1.9.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "2.0.2", "mtdowling/jmespath.php": "2.6.0", "nesbot/carbon": "2.33.0", "nikic/fast-route": "v1.3.0", "paragonie/random_compat": "v9.99.99", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.1.5", "phpmyadmin/sql-parser": "5.3.1", "phpoption/phpoption": "1.7.3", "phpseclib/mcrypt_compat": "1.0.11", "phpseclib/phpseclib": "2.0.27", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-client": "1.0.1", "psr/http-factory": "1.0.1", "psr/http-message": "1.0.1", "psr/http-server-handler": "1.0.1", "psr/log": "1.0.2", "psr/simple-cache": "1.0.1", "punic/punic": "3.5.1", "ralouphie/getallheaders": "3.0.3", "ramsey/collection": "1.0.1", "ramsey/uuid": "4.0.1", "react/promise": "v2.8.0", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.8.0", "seld/phar-utils": "1.1.0", "smarty/smarty": "v3.1.36", "sonata-project/google-authenticator": "2.2.0", "stevenmaguire/oauth2-microsoft": "2.2.0", "stripe/stripe-php": "v7.34.0", "symfony/console": "v5.0.8", "symfony/filesystem": "v5.0.8", "symfony/finder": "v5.0.8", "symfony/http-foundation": "v5.0.8", "symfony/mime": "v5.1.6", "symfony/polyfill-ctype": "v1.18.1", "symfony/polyfill-iconv": "v1.18.1", "symfony/polyfill-intl-idn": "v1.18.1", "symfony/polyfill-intl-normalizer": "v1.18.1", "symfony/polyfill-mbstring": "v1.18.1", "symfony/polyfill-php70": "v1.18.1", "symfony/polyfill-php72": "v1.18.1", "symfony/polyfill-php73": "v1.18.1", "symfony/polyfill-php80": "v1.18.1", "symfony/process": "v5.0.8", "symfony/service-contracts": "v2.2.0", "symfony/translation": "v5.0.8", "symfony/translation-contracts": "v2.2.0", "symfony/yaml": "v5.0.8", "tecnickcom/tcpdf": "6.3.5-p1", "true/punycode": "v2.1.1", "voku/portable-ascii": "1.5.3", "zbateson/mail-mime-parser": "1.2.1", "zbateson/mb-wrapper": "1.0.0", "zbateson/stream-decorators": "1.0.3" }, "extra": {"sha":"88a0a62254bb9ac84dfe72c4e0bda39871778461e28b5af2b9df01b520ae6636","sig":"cNz8pSNMsPAds0bcC11shJii+33t7UV2OaGUIUrjQY2TuPoouyDsQNU6F7BI6xd6QsAZiFd1tBnzs36KGWV7dNUmLmlWzytAr1sL5QS1aAakEvPiiF0xeqYyls5AijcVpdJt44mgq5gKFVitF\/Mj+8QIjS0TrPvWY7Evf0bBZjKrrGmam1KAaNJLpcgC6KlzWQruV31WXTuoO6zwFYYCI6aEDViyxUdOxsKIcfTtsUSucIhS50cRfLgDMVo0jZHn4U5fap9v6YDWRptN8Ieib4HYdK+ZDlRhGAQ6+FCzouZMPwqRhq1mhrwrsaYvGT+X+DeipNSFiGJpZMSX30le7g==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_8.0.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V8.0.0_GA","fileSize":"58631447","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"Cx+2kvfHrJjn+sgyJxo8PFYGJ0dFEX7sYJfel6FtEJAuLSV4Oi1x4cgxNhEpSwqBg2cvor1anrSxf4u\/rHBmYjXEhw42JLPfc7hi6wE9PtM4\/0N1vP0wdNYZczKNR2HLDXljXW49hKnU\/YGJYFPIArKGPb\/LrPE0L7dBceZzj3bWVmGhHCPYuMnprS37THEXBrR71xB2J\/QWucN3kfa4wqEUM+12gqfnJYhMcb04ke9hgxSms9FCIB1RWXjaci2B9RE6QoCMnKfDF8a8gMZDZGVhaTz+sel\/MGdrxFViYatTa1QFaFTg94q4Cymt4MrJehLH2T8Mp\/v6Hv+Ez5U5xg=="},"require":{"ionCubeLoader":"10.1.0"}} }, "8.0.0-rc.3": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "8.0.0-RC.3", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^7.2.0 || ^7.3.0 || ^7.4.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-8.0.0-rc.3.zip", "type": "zip" }, "time": "now", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "1.1.0", "authorizenet/authorizenet": "1.9.9", "aws/aws-sdk-php": "3.138.0", "bitpay/sdk-light": "v2.0.2007", "brick/math": "0.8.15", "bshaffer/oauth2-server-httpfoundation-bridge": "v1.4-p1", "bshaffer/oauth2-server-php": "v1.11.1-p1", "composer/ca-bundle": "1.2.8", "composer/composer": "1.10.6", "composer/semver": "1.5.1", "composer/spdx-licenses": "1.5.3", "composer/xdebug-handler": "1.4.3", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "1.10.2", "doctrine/inflector": "1.4.1", "doctrine/instantiator": "1.3.0", "doctrine/lexer": "1.2.0", "duosecurity/duo_php": "1.0.1", "egulias/email-validator": "2.1.20", "ezyang/htmlpurifier": "v4.12.0", "facebook/graph-sdk": "5.7.0", "filp/whoops": "2.7.2", "firebase/php-jwt": "v5.2.0", "goetas-webservices/xsd2php-runtime": "v0.2.12", "google/apiclient": "2.7.0-p1", "google/auth": "v1.11.1", "google/recaptcha": "1.2.4", "guzzlehttp/guzzle": "7.0.1", "guzzlehttp/promises": "v1.3.1", "guzzlehttp/psr7": "1.6.1", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v7.12.0", "illuminate/container": "v7.12.0", "illuminate/contracts": "v7.12.0", "illuminate/database": "v7.12.0", "illuminate/events": "v7.12.0", "illuminate/filesystem": "v7.28.3", "illuminate/support": "v7.12.0", "illuminate/translation": "v7.28.3", "illuminate/validation": "v7.12.0", "jms/metadata": "1.7.0", "jms/parser-lib": "1.0.0", "jms/serializer": "1.14.1", "justinrainbow/json-schema": "5.2.9", "knplabs/knp-menu": "v3.1.1", "laminas/laminas-diactoros": "2.3.1", "laminas/laminas-httphandlerrunner": "1.2.0", "laminas/laminas-loader": "2.6.1", "laminas/laminas-mail": "2.11.0", "laminas/laminas-mime": "2.7.4", "laminas/laminas-stdlib": "3.3.0", "laminas/laminas-validator": "2.13.4", "laminas/laminas-zendframework-bridge": "1.1.1", "league/climate": "3.5.2", "league/flysystem": "1.0.67", "league/flysystem-aws-s3-v3": "1.0.24", "league/oauth2-client": "2.5.0", "league/oauth2-google": "3.0.3", "league/plates": "3.3.0", "michelf/php-markdown": "1.9.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "2.0.2", "mtdowling/jmespath.php": "2.6.0", "nesbot/carbon": "2.33.0", "nikic/fast-route": "v1.3.0", "paragonie/random_compat": "v9.99.99", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.1.5", "phpmyadmin/sql-parser": "5.3.1", "phpoption/phpoption": "1.7.3", "phpseclib/mcrypt_compat": "1.0.11", "phpseclib/phpseclib": "2.0.27", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-client": "1.0.1", "psr/http-factory": "1.0.1", "psr/http-message": "1.0.1", "psr/http-server-handler": "1.0.1", "psr/log": "1.0.2", "psr/simple-cache": "1.0.1", "punic/punic": "3.5.1", "ralouphie/getallheaders": "3.0.3", "ramsey/collection": "1.0.1", "ramsey/uuid": "4.0.1", "react/promise": "v2.8.0", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.8.0", "seld/phar-utils": "1.1.0", "smarty/smarty": "v3.1.36", "sonata-project/google-authenticator": "2.2.0", "stevenmaguire/oauth2-microsoft": "2.2.0", "stripe/stripe-php": "v7.34.0", "symfony/console": "v5.0.8", "symfony/filesystem": "v5.0.8", "symfony/finder": "v5.0.8", "symfony/http-foundation": "v5.0.8", "symfony/mime": "v5.1.5", "symfony/polyfill-ctype": "v1.18.1", "symfony/polyfill-iconv": "v1.18.1", "symfony/polyfill-intl-idn": "v1.18.1", "symfony/polyfill-intl-normalizer": "v1.18.1", "symfony/polyfill-mbstring": "v1.18.1", "symfony/polyfill-php70": "v1.18.1", "symfony/polyfill-php72": "v1.18.1", "symfony/polyfill-php73": "v1.18.1", "symfony/polyfill-php80": "v1.18.1", "symfony/process": "v5.0.8", "symfony/service-contracts": "v2.2.0", "symfony/translation": "v5.0.8", "symfony/translation-contracts": "v2.2.0", "symfony/yaml": "v5.0.8", "tecnickcom/tcpdf": "6.3.5-p1", "true/punycode": "v2.1.1", "voku/portable-ascii": "1.5.3", "zbateson/mail-mime-parser": "1.2.1", "zbateson/mb-wrapper": "1.0.0", "zbateson/stream-decorators": "1.0.3" }, "extra": {"sha":"f8aaf6365a812d87f7988baeda1b34bb44d4b4ce6ebdab0ed781d96e017b3ed7","sig":"Xx0gYueKfsHDkmM8a7AYJabPmJMYivq2Jdr1q7wgpdFC9W0ulqAQN7x1AJZA59JgRNxeNM7pn6OqsACfWdrFTkGBMDnsB5\/NoVFgQxtIQqKnpaIOuf5KgXi5Zjf\/vO5r974maJi114a7QAtR9JoCw6xUdB6QpirmH3URw4IQOZZ7LgfCLP27pj4hUtdA8r2QmjFT1V8e5gjz9A2Fr2XukzZ63MzSZRiDeeXu6Obnybsnpatjw9uBO2SnSPniD34Ip3+XCF9YiGDat8mL9OVrMrdMOd5AApe1YeG1OOa1nP92jVjJU8H88x3wHl+G04WpMUcyTKu5gAmMuxLUrwpbZw==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_8.0.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V8.0.0_RC_3","fileSize":"58584615","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"SoTZtpcVkkkQwyaGqorpbwwqjzflhvId0r7UQ8YwXaKjZl8I3DPAFeUp8LT+nbcA8SIwKaYulrfrISnv4HX0roIpy\/MzUt9l1m71J3EQ7Tvd3nNO5JwfBhy55Mh0au7dDfj6z9CIipkDKZiDFXrVl\/FrRK9kgz5YgMI9sjR9OX1qGYqsmgp9DZktGMD+kl+01+k0xYo\/1dEkqn5uHLGxRJ1eYC2\/QK\/8VIwIrXX0Gi8qbmZs4RbsjVUINrL43APr8+3Q3l2qxATNVL+Hpy2r2Xux9eXisKVjZ+6bpADdMPGiP896ElKGYnFkmFPwQ4DLFXATa8tHqtPYkZVnM9dEDQ=="},"require":{"ionCubeLoader":"10.1.0"}} }, "8.0.0-rc.2": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "8.0.0-RC.2", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^7.2.0 || ^7.3.0 || ^7.4.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-8.0.0-rc.2.zip", "type": "zip" }, "time": "now", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "1.1.0", "authorizenet/authorizenet": "1.9.9", "aws/aws-sdk-php": "3.138.0", "bitpay/sdk-light": "v2.0.2007", "brick/math": "0.8.15", "bshaffer/oauth2-server-httpfoundation-bridge": "v1.4-p1", "bshaffer/oauth2-server-php": "v1.11.1-p1", "composer/ca-bundle": "1.2.8", "composer/composer": "1.10.6", "composer/semver": "1.5.1", "composer/spdx-licenses": "1.5.3", "composer/xdebug-handler": "1.4.3", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "1.10.2", "doctrine/inflector": "1.4.1", "doctrine/instantiator": "1.3.0", "doctrine/lexer": "1.2.0", "duosecurity/duo_php": "1.0.1", "egulias/email-validator": "2.1.19", "ezyang/htmlpurifier": "v4.12.0", "facebook/graph-sdk": "5.7.0", "filp/whoops": "2.7.2", "firebase/php-jwt": "v5.2.0", "goetas-webservices/xsd2php-runtime": "v0.2.12", "google/apiclient": "2.7.0-p1", "google/auth": "v1.11.1", "google/recaptcha": "1.2.4", "guzzlehttp/guzzle": "7.0.1", "guzzlehttp/promises": "v1.3.1", "guzzlehttp/psr7": "1.6.1", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v7.12.0", "illuminate/container": "v7.12.0", "illuminate/contracts": "v7.12.0", "illuminate/database": "v7.12.0", "illuminate/events": "v7.12.0", "illuminate/filesystem": "v7.27.0", "illuminate/support": "v7.12.0", "illuminate/translation": "v7.27.0", "illuminate/validation": "v7.12.0", "jms/metadata": "1.7.0", "jms/parser-lib": "1.0.0", "jms/serializer": "1.14.1", "justinrainbow/json-schema": "5.2.9", "knplabs/knp-menu": "v3.1.1", "laminas/laminas-diactoros": "2.3.1", "laminas/laminas-httphandlerrunner": "1.2.0", "laminas/laminas-loader": "2.6.1", "laminas/laminas-mail": "2.11.0", "laminas/laminas-mime": "2.7.4", "laminas/laminas-stdlib": "3.3.0", "laminas/laminas-validator": "2.13.4", "laminas/laminas-zendframework-bridge": "1.1.0", "league/climate": "3.5.2", "league/flysystem": "1.0.67", "league/flysystem-aws-s3-v3": "1.0.24", "league/oauth2-client": "2.5.0", "league/oauth2-google": "3.0.3", "league/plates": "3.3.0", "michelf/php-markdown": "1.9.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "2.0.2", "mtdowling/jmespath.php": "2.6.0", "nesbot/carbon": "2.33.0", "nikic/fast-route": "v1.3.0", "paragonie/random_compat": "v9.99.99", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.1.5", "phpmyadmin/sql-parser": "5.3.1", "phpoption/phpoption": "1.7.3", "phpseclib/mcrypt_compat": "1.0.11", "phpseclib/phpseclib": "2.0.27", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-client": "1.0.1", "psr/http-factory": "1.0.1", "psr/http-message": "1.0.1", "psr/http-server-handler": "1.0.1", "psr/log": "1.0.2", "psr/simple-cache": "1.0.1", "punic/punic": "3.5.1", "ralouphie/getallheaders": "3.0.3", "ramsey/collection": "1.0.1", "ramsey/uuid": "4.0.1", "react/promise": "v2.8.0", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.8.0", "seld/phar-utils": "1.1.0", "smarty/smarty": "v3.1.36", "sonata-project/google-authenticator": "2.2.0", "stevenmaguire/oauth2-microsoft": "2.2.0", "stripe/stripe-php": "v7.34.0", "symfony/console": "v5.0.8", "symfony/filesystem": "v5.0.8", "symfony/finder": "v5.0.8", "symfony/http-foundation": "v5.0.8", "symfony/mime": "v5.1.5", "symfony/polyfill-ctype": "v1.18.1", "symfony/polyfill-iconv": "v1.18.1", "symfony/polyfill-intl-idn": "v1.18.1", "symfony/polyfill-intl-normalizer": "v1.18.1", "symfony/polyfill-mbstring": "v1.18.1", "symfony/polyfill-php70": "v1.18.1", "symfony/polyfill-php72": "v1.18.1", "symfony/polyfill-php73": "v1.18.1", "symfony/polyfill-php80": "v1.18.1", "symfony/process": "v5.0.8", "symfony/service-contracts": "v2.1.3", "symfony/translation": "v5.0.8", "symfony/translation-contracts": "v2.1.3", "symfony/yaml": "v5.0.8", "tecnickcom/tcpdf": "6.3.5-p1", "true/punycode": "v2.1.1", "voku/portable-ascii": "1.5.3", "zbateson/mail-mime-parser": "1.2.1", "zbateson/mb-wrapper": "1.0.0", "zbateson/stream-decorators": "1.0.3" }, "extra": {"sha":"20554c18638c4c1fd29e7cbc434298d6cc17ddf4de0396d7f838b516a6bed067","sig":"WThG9xlIdYecLAA5d3niLrZ6pq7osYiv3FZ\/RIh9RavWPuftJX+PKCL0WG0qRcyzz3SzQSV7W+aEMzJoE8\/RaEUJ+UBQR4qE2EMDY2wN8ZIz2Gnd7mtTZTqq7HVVl8YO9Ms0rg2m\/XPa68jkywVbj2w9+AmtFiRcPBvkQmFIZe4w1\/wDDo515ECKZNjVq36T2ut\/43wVDFEx0cWWU+eprWiE9Bjpmg1mmqfpJtwHUWq9L6PBguGcf\/RJpxZIYMdnfOgwPrnu6jefb0u7BuZ4hWteNORNeAolKfK4Qs6c6urJsQjug1d\/kGzQNkNKAdAkuUy7ZIV5iDtJniNA6r7sDQ==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_8.0.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V8.0.0_RC_2","fileSize":"58581048","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"QX3XiW9c6dLtbIZMgJ2NoovdMCIM3yRjDcoAPl4Pyd8O5rdWtdgKYKetukOCaZ4ZlUYFAqBCUJYTWc1fmcpCoQuCQi0OoCapCz+IFB0KpuC3PfsYrcTcpCR8S6PGYXgyvpC12Y7ZqHgkSYVDWUzH+RRHlEKGxHKg2BC0dQiWolZwi5OCJWoVHP+o7vg5DKjKxXtL+4Z\/9ZjUxPk0zdLVMZeejITAz60uq954dGa0wrnx9mQy\/nH61Kd9\/b8+X0jaqKOuYLFiXU9ev9kMthSYM2\/xBAG+xoVnYZBd3CvhLcqyveZSgW1QoEEvFZPVMSN9mEk\/KIj0hgjuCLaJs2XyVw=="},"require":{"ionCubeLoader":"10.1.0"}} }, "8.0.0-rc.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "8.0.0-RC.1", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^7.2.0 || ^7.3.0 || ^7.4.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-8.0.0-rc.1.zip", "type": "zip" }, "time": "now", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "1.1.0", "authorizenet/authorizenet": "1.9.9", "aws/aws-sdk-php": "3.138.0", "bitpay/sdk-light": "v2.0.2007", "brick/math": "0.8.15", "bshaffer/oauth2-server-httpfoundation-bridge": "v1.4-p1", "bshaffer/oauth2-server-php": "v1.11.1-p1", "composer/ca-bundle": "1.2.8", "composer/composer": "1.10.6", "composer/semver": "1.5.1", "composer/spdx-licenses": "1.5.3", "composer/xdebug-handler": "1.4.3", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "1.10.2", "doctrine/inflector": "1.4.1", "doctrine/instantiator": "1.3.0", "doctrine/lexer": "1.2.0", "duosecurity/duo_php": "1.0.1", "egulias/email-validator": "2.1.19", "ezyang/htmlpurifier": "v4.12.0", "facebook/graph-sdk": "5.7.0", "filp/whoops": "2.7.2", "firebase/php-jwt": "v5.2.0", "goetas-webservices/xsd2php-runtime": "v0.2.12", "google/apiclient": "2.7.0-p1", "google/auth": "v1.11.1", "google/recaptcha": "1.2.4", "guzzlehttp/guzzle": "7.0.1", "guzzlehttp/promises": "v1.3.1", "guzzlehttp/psr7": "1.6.1", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v7.12.0", "illuminate/container": "v7.12.0", "illuminate/contracts": "v7.12.0", "illuminate/database": "v7.12.0", "illuminate/events": "v7.12.0", "illuminate/filesystem": "v7.26.0", "illuminate/support": "v7.12.0", "illuminate/translation": "v7.26.0", "illuminate/validation": "v7.12.0", "jms/metadata": "1.7.0", "jms/parser-lib": "1.0.0", "jms/serializer": "1.14.1", "justinrainbow/json-schema": "5.2.9", "knplabs/knp-menu": "v3.1.1", "laminas/laminas-diactoros": "2.3.1", "laminas/laminas-httphandlerrunner": "1.2.0", "laminas/laminas-loader": "2.6.1", "laminas/laminas-mail": "2.11.0", "laminas/laminas-mime": "2.7.4", "laminas/laminas-stdlib": "3.3.0", "laminas/laminas-validator": "2.13.4", "laminas/laminas-zendframework-bridge": "1.1.0", "league/climate": "3.5.2", "league/flysystem": "1.0.67", "league/flysystem-aws-s3-v3": "1.0.24", "league/oauth2-client": "2.5.0", "league/oauth2-google": "3.0.3", "league/plates": "3.3.0", "michelf/php-markdown": "1.9.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "2.0.2", "mtdowling/jmespath.php": "2.6.0", "nesbot/carbon": "2.33.0", "nikic/fast-route": "v1.3.0", "paragonie/random_compat": "v9.99.99", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.1.5", "phpmyadmin/sql-parser": "5.3.1", "phpoption/phpoption": "1.7.3", "phpseclib/mcrypt_compat": "1.0.11", "phpseclib/phpseclib": "2.0.27", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-client": "1.0.1", "psr/http-factory": "1.0.1", "psr/http-message": "1.0.1", "psr/http-server-handler": "1.0.1", "psr/log": "1.0.2", "psr/simple-cache": "1.0.1", "punic/punic": "3.5.1", "ralouphie/getallheaders": "3.0.3", "ramsey/collection": "1.0.1", "ramsey/uuid": "4.0.1", "react/promise": "v2.8.0", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.8.0", "seld/phar-utils": "1.1.0", "smarty/smarty": "v3.1.36", "sonata-project/google-authenticator": "2.2.0", "stevenmaguire/oauth2-microsoft": "2.2.0", "stripe/stripe-php": "v7.34.0", "symfony/console": "v5.0.8", "symfony/filesystem": "v5.0.8", "symfony/finder": "v5.0.8", "symfony/http-foundation": "v5.0.8", "symfony/mime": "v5.1.3", "symfony/polyfill-ctype": "v1.18.1", "symfony/polyfill-iconv": "v1.18.1", "symfony/polyfill-intl-idn": "v1.18.1", "symfony/polyfill-intl-normalizer": "v1.18.1", "symfony/polyfill-mbstring": "v1.18.1", "symfony/polyfill-php70": "v1.18.1", "symfony/polyfill-php72": "v1.18.1", "symfony/polyfill-php73": "v1.18.1", "symfony/polyfill-php80": "v1.18.1", "symfony/process": "v5.0.8", "symfony/service-contracts": "v2.1.3", "symfony/translation": "v5.0.8", "symfony/translation-contracts": "v2.1.3", "symfony/yaml": "v5.0.8", "tecnickcom/tcpdf": "6.3.5-p1", "true/punycode": "v2.1.1", "voku/portable-ascii": "1.5.3", "zbateson/mail-mime-parser": "1.2.1", "zbateson/mb-wrapper": "1.0.0", "zbateson/stream-decorators": "1.0.3" }, "extra": {"sha":"d3f802a4e3c5abeb4bea4de10d1b1c81e0541e33bc44003a659c450f62e61d38","sig":"mGb4\/6e9gOYW8gRqF1JMZ5R28HqSbA9B5nam7wnNwbK3YBzSA02M+8tPZNCA+r95CKXZhQU8jZszzJ9OUklSkCW7fhoaKNzQ0Xk+3Roe2mkusvSVV6hulNH2gI22hNiu7CqhMgm0e\/UfjRs1AnQv23VfarSWyWBkQjgaFC0YpotdBTgENLDJLnY\/xLfoTNev\/BlH9jheK3OWkyh0LLXrzvQSBkct+2\/\/+hDLYrLd6gOvKomvkNV\/POeclsmUUGg84OdMEU6\/xmNiVEaojMpZuiNsWTfECE4+Mba7sxpMJb70tkZ6BzrYuj3JWjf\/zbUUTytoX0A68CGmTxRsN9huxg==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_8.0.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V8.0.0_RC_1","fileSize":"58046148","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"Pw0LACnqUUZdERxRgHsjLwUY3Huj8k5kxjcvti+LXYbHcFWxZ+AZNi2LV0DO\/yjQsH0uBQol\/g9ribxW6xKWlJdz8wlk5hkxiiZVv2ybDDCaRO5enNUD58SPBUj5Dgn10N01F2+5iDNsIpPPZ0s1\/Nv1G+vz2cJQ7zbDIXNVf64NyI\/AaW7XEqHLKRn6rVv8R+ZR1yJY1mQOwJ+wPbIkVqS2C0kyv0Lgtt3vnx3wh3ZP1ajkG9HNtVlYQ2N7tShjCyr\/GX0GBqc7oiDnY5gj5usjIbmHJg8jllyWE8viuZw4t9mx0nL6g9tz\/IHasJzwNoYzsD+hBktk41fPA3hc9w=="},"require":{"ionCubeLoader":"10.1.0"}} }, "8.0.0-beta.3": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "8.0.0-beta.3", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^7.2.0 || ^7.3.0 || ^7.4.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-8.0.0-beta.3.zip", "type": "zip" }, "time": "now", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "1.1.0", "authorizenet/authorizenet": "1.9.9", "aws/aws-sdk-php": "3.138.0", "bitpay/sdk-light": "v2.0.2007", "brick/math": "0.8.15", "bshaffer/oauth2-server-httpfoundation-bridge": "v1.4-p1", "bshaffer/oauth2-server-php": "v1.11.1-p1", "composer/ca-bundle": "1.2.7", "composer/composer": "1.10.6", "composer/semver": "1.5.1", "composer/spdx-licenses": "1.5.3", "composer/xdebug-handler": "1.4.2", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "1.10.2", "doctrine/inflector": "1.4.1", "doctrine/instantiator": "1.3.0", "doctrine/lexer": "1.2.0", "duosecurity/duo_php": "1.0.1", "egulias/email-validator": "2.1.19", "ezyang/htmlpurifier": "v4.12.0", "facebook/graph-sdk": "5.7.0", "filp/whoops": "2.7.2", "firebase/php-jwt": "v5.2.0", "goetas-webservices/xsd2php-runtime": "v0.2.12", "google/apiclient": "2.7.0-p1", "google/auth": "v1.11.1", "google/recaptcha": "1.2.4", "guzzlehttp/guzzle": "7.0.1", "guzzlehttp/promises": "v1.3.1", "guzzlehttp/psr7": "1.6.1", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v7.12.0", "illuminate/container": "v7.12.0", "illuminate/contracts": "v7.12.0", "illuminate/database": "v7.12.0", "illuminate/events": "v7.12.0", "illuminate/filesystem": "v7.24.0", "illuminate/support": "v7.12.0", "illuminate/translation": "v7.24.0", "illuminate/validation": "v7.12.0", "jms/metadata": "1.7.0", "jms/parser-lib": "1.0.0", "jms/serializer": "1.14.1", "justinrainbow/json-schema": "5.2.9", "knplabs/knp-menu": "v3.1.1", "laminas/laminas-diactoros": "2.3.1", "laminas/laminas-httphandlerrunner": "1.2.0", "laminas/laminas-loader": "2.6.1", "laminas/laminas-mail": "2.11.0", "laminas/laminas-mime": "2.7.4", "laminas/laminas-stdlib": "3.2.1", "laminas/laminas-validator": "2.13.4", "laminas/laminas-zendframework-bridge": "1.0.4", "league/climate": "3.5.2", "league/flysystem": "1.0.67", "league/flysystem-aws-s3-v3": "1.0.24", "league/oauth2-client": "2.5.0", "league/oauth2-google": "3.0.3", "league/plates": "3.3.0", "michelf/php-markdown": "1.9.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "2.0.2", "mtdowling/jmespath.php": "2.6.0", "nesbot/carbon": "2.33.0", "nikic/fast-route": "v1.3.0", "paragonie/random_compat": "v9.99.99", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.1.5", "phpmyadmin/sql-parser": "5.3.1", "phpoption/phpoption": "1.7.3", "phpseclib/mcrypt_compat": "1.0.11", "phpseclib/phpseclib": "2.0.27", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-client": "1.0.1", "psr/http-factory": "1.0.1", "psr/http-message": "1.0.1", "psr/http-server-handler": "1.0.1", "psr/log": "1.0.2", "psr/simple-cache": "1.0.1", "punic/punic": "3.5.1", "ralouphie/getallheaders": "3.0.3", "ramsey/collection": "1.0.1", "ramsey/uuid": "4.0.1", "react/promise": "v2.8.0", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.8.0", "seld/phar-utils": "1.1.0", "smarty/smarty": "v3.1.36", "sonata-project/google-authenticator": "2.2.0", "stevenmaguire/oauth2-microsoft": "2.2.0", "stripe/stripe-php": "v7.34.0", "symfony/console": "v5.0.8", "symfony/filesystem": "v5.0.8", "symfony/finder": "v5.0.8", "symfony/http-foundation": "v5.0.8", "symfony/mime": "v5.1.3", "symfony/polyfill-ctype": "v1.18.1", "symfony/polyfill-iconv": "v1.18.1", "symfony/polyfill-intl-idn": "v1.18.1", "symfony/polyfill-intl-normalizer": "v1.18.1", "symfony/polyfill-mbstring": "v1.18.1", "symfony/polyfill-php70": "v1.18.1", "symfony/polyfill-php72": "v1.18.1", "symfony/polyfill-php73": "v1.18.1", "symfony/polyfill-php80": "v1.18.1", "symfony/process": "v5.0.8", "symfony/service-contracts": "v2.1.3", "symfony/translation": "v5.0.8", "symfony/translation-contracts": "v2.1.3", "symfony/yaml": "v5.0.8", "tecnickcom/tcpdf": "6.3.5-p1", "true/punycode": "v2.1.1", "voku/portable-ascii": "1.5.3", "zbateson/mail-mime-parser": "1.2.1", "zbateson/mb-wrapper": "1.0.0", "zbateson/stream-decorators": "1.0.3" }, "extra": {"sha":"40a3947dcb5f2d91b1b7396ebf213470ab1fae0e1074262c7a2915b678ac10b3","sig":"CDMGPDk8CgQ79Ewryc0AC0kfb1CiGxzT7M50FUiR88Gq1cZnmcgIyUqtXK6Sy7qeNWJRL43RDeiZ4aGWnQskwcK60EZ1ykTMyVpG3yrGMjkEo3z7XmZT1F1ofEo9AHGua40uXSuphWaTHCWlPuXqu9csfwCzn3Y0YRLc3jYB5\/GygWnvGWozDs47AkNGNk\/bFh\/F8nbWqeroH\/wDzjvLWFw8zi5o0g\/gx5ZdfYYPi3EORsiO07GEvVfodJV1RQK36Kg7KinZQcgvMbqIyH0E3NzbexYMZfBkkAJJN9IhDqb2jnCQEPQyVh7X5E19AazIEUJTWeNh9sxNkZ5uXnXWkg==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_8.0.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V8.0.0_Beta_3","fileSize":"57941357","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"Bwcox2gKFT1u59+9f5P3kCUFry1F8MODzcib9Ka6qYDw8AL03KK\/U+Yw1FfgBpXBcncCVlNopYQTkO\/zUfsCeLjb1GpA9PWaqGiNV1F9YIXwLTu5hQv6FtlnxkJsWBPRfyP4EPl4X79dOlLLvyRuWq2LalSSwlEWE+drHA6oXM\/EVCAIwmnmFVsBXw0mcosEhwlcWIqMWY7qHpFlVK7NFDA51AlpFizot0s1dkbON7xasmWgomQdFpULeEQ9xifAgRuzqhQIwyX8ssB86GJkcF\/fSqiTo3ZxWYfqovCKfqiXWto4RK993+LT+exVuqEiRgZK2UB5lpOJm1zgzYRz7Q=="},"require":{"ionCubeLoader":"10.1.0"}} }, "8.0.0-beta.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "8.0.0-beta.1", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^7.2.0 || ^7.3.0 || ^7.4.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-8.0.0-beta.1.zip", "type": "zip" }, "time": "now", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "1.1.0", "authorizenet/authorizenet": "1.9.9", "aws/aws-sdk-php": "3.138.0", "bitpay/sdk-light": "v2.0.2007", "brick/math": "0.8.15", "bshaffer/oauth2-server-httpfoundation-bridge": "v1.4-p1", "bshaffer/oauth2-server-php": "v1.11.1-p1", "composer/ca-bundle": "1.2.7", "composer/composer": "1.10.6", "composer/semver": "1.5.1", "composer/spdx-licenses": "1.5.3", "composer/xdebug-handler": "1.4.2", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "1.10.2", "doctrine/inflector": "1.4.1", "doctrine/instantiator": "1.3.0", "doctrine/lexer": "1.2.0", "duosecurity/duo_php": "1.0.1", "egulias/email-validator": "2.1.18", "ezyang/htmlpurifier": "v4.12.0", "facebook/graph-sdk": "5.7.0", "filp/whoops": "2.7.2", "firebase/php-jwt": "v5.2.0", "goetas-webservices/xsd2php-runtime": "v0.2.12", "google/apiclient": "2.7.0-p1", "google/auth": "v1.11.1", "google/recaptcha": "1.2.4", "guzzlehttp/guzzle": "7.0.1", "guzzlehttp/promises": "v1.3.1", "guzzlehttp/psr7": "1.6.1", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v7.12.0", "illuminate/container": "v7.12.0", "illuminate/contracts": "v7.12.0", "illuminate/database": "v7.12.0", "illuminate/events": "v7.12.0", "illuminate/filesystem": "v7.22.4", "illuminate/support": "v7.12.0", "illuminate/translation": "v7.22.4", "illuminate/validation": "v7.12.0", "jms/metadata": "1.7.0", "jms/parser-lib": "1.0.0", "jms/serializer": "1.14.1", "justinrainbow/json-schema": "5.2.9", "knplabs/knp-menu": "v3.1.1", "laminas/laminas-diactoros": "2.3.1", "laminas/laminas-httphandlerrunner": "1.2.0", "laminas/laminas-loader": "2.6.1", "laminas/laminas-mail": "2.11.0", "laminas/laminas-mime": "2.7.4", "laminas/laminas-stdlib": "3.2.1", "laminas/laminas-validator": "2.13.4", "laminas/laminas-zendframework-bridge": "1.0.4", "league/climate": "3.5.2", "league/flysystem": "1.0.67", "league/flysystem-aws-s3-v3": "1.0.24", "league/oauth2-client": "2.5.0", "league/oauth2-google": "3.0.3", "league/plates": "3.3.0", "michelf/php-markdown": "1.9.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "2.0.2", "mtdowling/jmespath.php": "2.6.0", "nesbot/carbon": "2.33.0", "nikic/fast-route": "v1.3.0", "paragonie/random_compat": "v9.99.99", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.1.5", "phpmyadmin/sql-parser": "5.3.1", "phpoption/phpoption": "1.7.3", "phpseclib/mcrypt_compat": "1.0.11", "phpseclib/phpseclib": "2.0.27", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-client": "1.0.1", "psr/http-factory": "1.0.1", "psr/http-message": "1.0.1", "psr/http-server-handler": "1.0.1", "psr/log": "1.0.2", "psr/simple-cache": "1.0.1", "punic/punic": "3.5.1", "ralouphie/getallheaders": "3.0.3", "ramsey/collection": "1.0.1", "ramsey/uuid": "4.0.1", "react/promise": "v2.8.0", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.8.0", "seld/phar-utils": "1.1.0", "smarty/smarty": "v3.1.36", "sonata-project/google-authenticator": "2.2.0", "stevenmaguire/oauth2-microsoft": "2.2.0", "stripe/stripe-php": "v7.34.0", "symfony/console": "v5.0.8", "symfony/filesystem": "v5.0.8", "symfony/finder": "v5.0.8", "symfony/http-foundation": "v5.0.8", "symfony/mime": "v5.1.3", "symfony/polyfill-ctype": "v1.17.0", "symfony/polyfill-iconv": "v1.17.0", "symfony/polyfill-intl-idn": "v1.17.0", "symfony/polyfill-mbstring": "v1.17.0", "symfony/polyfill-php72": "v1.17.0", "symfony/polyfill-php73": "v1.17.0", "symfony/polyfill-php80": "v1.18.0", "symfony/process": "v5.0.8", "symfony/service-contracts": "v2.1.3", "symfony/translation": "v5.0.8", "symfony/translation-contracts": "v2.1.3", "symfony/yaml": "v5.0.8", "tecnickcom/tcpdf": "6.3.5-p1", "true/punycode": "v2.1.1", "voku/portable-ascii": "1.5.3", "zbateson/mail-mime-parser": "1.2.1", "zbateson/mb-wrapper": "1.0.0", "zbateson/stream-decorators": "1.0.3" }, "extra": {"sha":"9c19dccd64023d608cc60befbf6d00c36ac3b3513bce350be0a6bb8891c2556a","sig":"alTrYYLUFrNZgM0WK9Xaa912CJh1p5LSNFeIKQBUvkLhIMjDakgXzRHJ8vdSlo7z\/5QJfzC8LBhIhy5Ic6RJGLuN4dm3\/C3KoYbkiUC4PYhyTt3ywCCbctV0ZvIH4z6AyzH2wgWDjuiGiQYNP8xfMmIVLCa48GZlsMfDbfEDuWKBsVyAbBV2\/Q+FlmFnmln6RMQjFocNYlJwAan3TBY9ogXSUr1rLOpjoKBU195al6sd3tBXhEVs+babqK1ijedXaAmCq02qdnF+uETsO24e\/\/4tjwqClwCmnEE+oGhFHwZfxRCaxj4GxtwCsQ8B3tIRzYSiYGWakPTEcajHJI3U6g==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_8.0.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V8.0.0_Beta_1","fileSize":"57835358","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"JnI\/ZHRQ0rdSwmZjH89KFTuYcwSqHcL7qcKCGXrY4xiSdJx1JVG4lO61Qy1Xlu4RwflDdc24Lu1kMOpF+vHyJG3sKl7dK7z6fxoFuMObgkzrB7K4dSrLg\/9OeLcVsxhnMP59UKjODEt3AcD3AbprRv52TYdIukEyi\/aJPQ4gz8awwXdm5nYYi6iM4EqSpN8lydReXcsfzef4YaV79i6MXUsLKgm\/ysjuJOZQ9oj3FcfAo8aXI2FRb20J0nw+6QSftZv6iMnYJL+wPe67OhuciYcCHYFJUVkVnvGzmCx0V38JaiSN\/5UWZBnY8LDsFvAeyP9QrAsTsc3EXaY4x5Pr1w=="},"require":{"ionCubeLoader":"10.1.0"}} }, "7.9.2-release.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "7.9.2", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^5.6.0 || ^7.0.0 || ^7.1.0 || ^7.2.0 || ^7.3.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-7.9.2-release.1.zip", "type": "zip" }, "time": "2020-02-18", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "0.7.4", "authorizenet/authorizenet": "1.9.6", "aws/aws-sdk-php": "3.69.2", "bitpay/php-client": "v3.0.0-p1", "bshaffer/oauth2-server-httpfoundation-bridge": "dev-develop", "bshaffer/oauth2-server-php": "v1.8.0", "composer/composer": "1.0.3-p1", "composer/semver": "1.4.2", "composer/spdx-licenses": "1.1.6", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "v1.4.0", "doctrine/inflector": "v1.1.0", "doctrine/instantiator": "1.0.5", "doctrine/lexer": "v1.0.1", "duosecurity/duo_php": "1.0.0", "ezyang/htmlpurifier": "v4.9.2", "facebook/graph-sdk": "5.5.0", "filp/whoops": "2.1.8", "firebase/php-jwt": "v3.0.0", "goetas-webservices/xsd2php-runtime": "v0.2.7", "google/apiclient": "v2.1.3-p1", "google/auth": "v0.11.1", "google/recaptcha": "1.1.2", "guzzlehttp/guzzle": "5.3.3", "guzzlehttp/promises": "v1.3.1", "guzzlehttp/psr7": "1.4.2", "guzzlehttp/ringphp": "1.1.1", "guzzlehttp/streams": "3.0.0", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v5.2.37", "illuminate/container": "v5.2.37", "illuminate/contracts": "v5.2.45", "illuminate/database": "v5.2.37-p2", "illuminate/events": "v5.2.37", "illuminate/support": "v5.2.37-p1", "illuminate/validation": "v5.2.45", "ircmaxell/password-compat": "v1.0.4", "jms/metadata": "1.6.0", "jms/parser-lib": "1.0.0", "jms/serializer": "1.8.1", "justinrainbow/json-schema": "1.6.1", "knplabs/knp-menu": "v2.1.1", "league/climate": "3.2.1", "league/flysystem": "1.0.45", "league/flysystem-aws-s3-v3": "1.0.21", "league/plates": "3.3.0", "michelf/php-markdown": "1.6.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "1.18.2", "mtdowling/jmespath.php": "2.4.0", "nesbot/carbon": "1.21.0", "nikic/fast-route": "v1.2.0", "paragonie/random_compat": "v1.4.2", "php-imap/php-imap": "2.0.9", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.0.7", "phpmyadmin/sql-parser": "v4.2.4", "phpoption/phpoption": "1.5.0", "phpseclib/mcrypt_compat": "1.0.5", "phpseclib/phpseclib": "2.0.10", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-message": "1.0.1", "psr/log": "1.0.2", "punic/punic": "1.6.3", "ramsey/uuid": "3.4.1", "react/promise": "v2.5.1", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.6.1", "seld/phar-utils": "1.0.1", "smarty/smarty": "v3.1.33-p1", "stripe/stripe-php": "v6.43.1", "symfony/config": "v3.2.14", "symfony/console": "v2.8.7", "symfony/dependency-injection": "v3.1.10", "symfony/filesystem": "v3.3.8", "symfony/finder": "v2.8.7", "symfony/http-foundation": "v2.8.7", "symfony/polyfill-iconv": "v1.2.0", "symfony/polyfill-mbstring": "v1.3.0", "symfony/polyfill-php54": "v1.5.0", "symfony/polyfill-php55": "v1.5.0", "symfony/process": "v3.3.8", "symfony/translation": "v2.8.7", "symfony/yaml": "v2.8.7", "tecnickcom/tcpdf": "6.2.26-p1", "zendframework/zend-diactoros": "1.3.10" }, "extra": {"sha":"f82c95a78251d4ece9065700f6a66bcc88984b59649e5713bfac07af7cac2707","sig":"J58YQmZqpy68ZQa4eoBsqY8zhxgusU22lvIfsVMHNaqaLH6CHIpWNIQQHnQ3crUfAtu+5ow6y92g1GFtrj6ImbcRYbLPkcyA8VyqgSXRzBEUeln24s4aZOGVhDbwUf5h3c7x68ufNXQZFx3HTOyVh\/nWIttAyjJvCamsfnVbuoNdfNLJ+7PPtypI4\/AbhoZ8mY7GOAMu3E76iRM6mOsfRSLS5n\/0Xls8JNUjl2K8IR\/SijJMgK3YohUP8Hl1\/WsMCZ6tBIPJQZ++bTwwDgETHYFMckztFCnhZ24YNRXSOvLGBVKNb0xmONV7K3qbmcDvMNHncTubEgF\/5xmvS29jaA==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_7.9.2_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V7.9.2","fileSize":"71873879","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"deJPeCbBmj0OJAtoqNWAAyd5wYysgyWrVOVRIc4YiNjL+nTIuHAArb1esrpQZ+Hvw4B1WJYtgaDtaSuN\/LkwVEI\/z3Qrs93+QyPvsRoLmZtNBKPsxGVsdk1MSNxipXZS6Czeg\/EgGP9G0yj55xW3WLPmCQOu1eKkND+SmvNpTegaookCjWlWqU4bMbUWztrpd8VNckLKlKxSjO2MI3n1p8yOtt9YshDx\/j78sHVpj+s76AciWpAY62TM+\/L1x3rUtfXJfU+BgBpMpD1CFSMzEA9X33riY+6W5N35UwxiziN4oXgvRuseke8f4wZuPXQnZX9wiy48J4XVnkqj0p96Og=="},"require":{"ionCubeLoader":"10.1.0"}} }, "7.9.1-release.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "7.9.1", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^5.6.0 || ^7.0.0 || ^7.1.0 || ^7.2.0 || ^7.3.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-7.9.1-release.1.zip", "type": "zip" }, "time": "2020-01-13", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "0.7.4", "authorizenet/authorizenet": "1.9.6", "aws/aws-sdk-php": "3.69.2", "bitpay/php-client": "v3.0.0-p1", "bshaffer/oauth2-server-httpfoundation-bridge": "dev-develop", "bshaffer/oauth2-server-php": "v1.8.0", "composer/composer": "1.0.3-p1", "composer/semver": "1.4.2", "composer/spdx-licenses": "1.1.6", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "v1.4.0", "doctrine/inflector": "v1.1.0", "doctrine/instantiator": "1.0.5", "doctrine/lexer": "v1.0.1", "duosecurity/duo_php": "1.0.0", "ezyang/htmlpurifier": "v4.9.2", "facebook/graph-sdk": "5.5.0", "filp/whoops": "2.1.8", "firebase/php-jwt": "v3.0.0", "goetas-webservices/xsd2php-runtime": "v0.2.7", "google/apiclient": "v2.1.3-p1", "google/auth": "v0.11.1", "google/recaptcha": "1.1.2", "guzzlehttp/guzzle": "5.3.3", "guzzlehttp/promises": "v1.3.1", "guzzlehttp/psr7": "1.4.2", "guzzlehttp/ringphp": "1.1.1", "guzzlehttp/streams": "3.0.0", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v5.2.37", "illuminate/container": "v5.2.37", "illuminate/contracts": "v5.2.45", "illuminate/database": "v5.2.37-p2", "illuminate/events": "v5.2.37", "illuminate/support": "v5.2.37-p1", "illuminate/validation": "v5.2.45", "ircmaxell/password-compat": "v1.0.4", "jms/metadata": "1.6.0", "jms/parser-lib": "1.0.0", "jms/serializer": "1.8.1", "justinrainbow/json-schema": "1.6.1", "knplabs/knp-menu": "v2.1.1", "league/climate": "3.2.1", "league/flysystem": "1.0.45", "league/flysystem-aws-s3-v3": "1.0.21", "league/plates": "3.3.0", "michelf/php-markdown": "1.6.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "1.18.2", "mtdowling/jmespath.php": "2.4.0", "nesbot/carbon": "1.21.0", "nikic/fast-route": "v1.2.0", "paragonie/random_compat": "v1.4.2", "php-imap/php-imap": "2.0.9", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.0.7", "phpmyadmin/sql-parser": "v4.2.4", "phpoption/phpoption": "1.5.0", "phpseclib/mcrypt_compat": "1.0.5", "phpseclib/phpseclib": "2.0.10", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-message": "1.0.1", "psr/log": "1.0.2", "punic/punic": "1.6.3", "ramsey/uuid": "3.4.1", "react/promise": "v2.5.1", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.6.1", "seld/phar-utils": "1.0.1", "smarty/smarty": "v3.1.33-p1", "stripe/stripe-php": "v6.43.1", "symfony/config": "v3.2.14", "symfony/console": "v2.8.7", "symfony/dependency-injection": "v3.1.10", "symfony/filesystem": "v3.3.8", "symfony/finder": "v2.8.7", "symfony/http-foundation": "v2.8.7", "symfony/polyfill-iconv": "v1.2.0", "symfony/polyfill-mbstring": "v1.3.0", "symfony/polyfill-php54": "v1.5.0", "symfony/polyfill-php55": "v1.5.0", "symfony/process": "v3.3.8", "symfony/translation": "v2.8.7", "symfony/yaml": "v2.8.7", "tecnickcom/tcpdf": "6.2.26-p1", "zendframework/zend-diactoros": "1.3.10" }, "extra": {"sha":"482693bf66163f1e7f3ae1bd4b0eb74ea44e124ee80131fcbfc1a12e31c7847b","sig":"p8oa0cy5ngwx0syx8a709pTERGcUo\/CUT8O6qM\/cD476sM\/cwwBopffEzN8Xd35R4GVcd05o9\/KdrnvVmMPBQu+5n4e7BIRBnWGA4T7zaxJiMR16G+I2IFLLTlgqjo43xDEYNeGz9SrFQVujUmf1JnZMbGasmrWa4zqlXx6yaMpWiksMZIJz6oceT5xo1+taTqqb7j5GA89PB2EZnE\/mKEQX5QAuD4D6IWU524qZGTkY8JMb1GBgsqGmDSW4ZKWJP\/C+C\/NPB8aPenGx2N6FTMlzrIhxjMgPLKIldPofKvxT2MOKnW1OHNsCdXRzPCPICgiNj9\/DO9AaArK2\/5QPAw==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_7.9.1_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V7.9.1","fileSize":"71812833","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"Q\/UdkWvrnx80T13+4KFJIAUrs8Vg8OjJKUM6QYk1sr+MYIL5y8vjsuUt8szBo25QUYHMkRSHty+Ocygayvjl68Bbb4cFJlZBli2OWKx2fvDob5gX9XrXMvQA\/Y+E+7wYEX+8TzqCw1vrDChKr579+rRQfbfzr7XVkBMCUxmhrcMjTpyZv8RckHsIGXUx19avsCdtW1Hj5MDOfZydCFNKMEA7ufiRsg5eOIxZU1aZmCXH80scGfY7r9PmUWNHZOoWpL+qhHXgJrZTdOYMyGvsPAZCK6xTWgZkZO93Ni+g6AkGS5lM5PcxWmiXMtYIFfbwwz9PIaAlZWjddoYMiKG3ew=="},"require":{"ionCubeLoader":"10.1.0"}} }, "7.9.0-release.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "7.9.0", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^5.6.0 || ^7.0.0 || ^7.1.0 || ^7.2.0 || ^7.3.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-7.9.0-release.1.zip", "type": "zip" }, "time": "2020-01-07", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "0.7.4", "authorizenet/authorizenet": "1.9.6", "aws/aws-sdk-php": "3.69.2", "bitpay/php-client": "v3.0.0-p1", "bshaffer/oauth2-server-httpfoundation-bridge": "dev-develop", "bshaffer/oauth2-server-php": "v1.8.0", "composer/composer": "1.0.3-p1", "composer/semver": "1.4.2", "composer/spdx-licenses": "1.1.6", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "v1.4.0", "doctrine/inflector": "v1.1.0", "doctrine/instantiator": "1.0.5", "doctrine/lexer": "v1.0.1", "duosecurity/duo_php": "1.0.0", "ezyang/htmlpurifier": "v4.9.2", "facebook/graph-sdk": "5.5.0", "filp/whoops": "2.1.8", "firebase/php-jwt": "v3.0.0", "goetas-webservices/xsd2php-runtime": "v0.2.7", "google/apiclient": "v2.1.3-p1", "google/auth": "v0.11.1", "google/recaptcha": "1.1.2", "guzzlehttp/guzzle": "5.3.3", "guzzlehttp/promises": "v1.3.1", "guzzlehttp/psr7": "1.4.2", "guzzlehttp/ringphp": "1.1.1", "guzzlehttp/streams": "3.0.0", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v5.2.37", "illuminate/container": "v5.2.37", "illuminate/contracts": "v5.2.45", "illuminate/database": "v5.2.37-p2", "illuminate/events": "v5.2.37", "illuminate/support": "v5.2.37-p1", "illuminate/validation": "v5.2.45", "ircmaxell/password-compat": "v1.0.4", "jms/metadata": "1.6.0", "jms/parser-lib": "1.0.0", "jms/serializer": "1.8.1", "justinrainbow/json-schema": "1.6.1", "knplabs/knp-menu": "v2.1.1", "league/climate": "3.2.1", "league/flysystem": "1.0.45", "league/flysystem-aws-s3-v3": "1.0.21", "league/plates": "3.3.0", "michelf/php-markdown": "1.6.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "1.18.2", "mtdowling/jmespath.php": "2.4.0", "nesbot/carbon": "1.21.0", "nikic/fast-route": "v1.2.0", "paragonie/random_compat": "v1.4.2", "php-imap/php-imap": "2.0.9", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.0.7", "phpmyadmin/sql-parser": "v4.2.4", "phpoption/phpoption": "1.5.0", "phpseclib/mcrypt_compat": "1.0.5", "phpseclib/phpseclib": "2.0.10", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-message": "1.0.1", "psr/log": "1.0.2", "punic/punic": "1.6.3", "ramsey/uuid": "3.4.1", "react/promise": "v2.5.1", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.6.1", "seld/phar-utils": "1.0.1", "smarty/smarty": "v3.1.33-p1", "stripe/stripe-php": "v6.43.1", "symfony/config": "v3.2.14", "symfony/console": "v2.8.7", "symfony/dependency-injection": "v3.1.10", "symfony/filesystem": "v3.3.8", "symfony/finder": "v2.8.7", "symfony/http-foundation": "v2.8.7", "symfony/polyfill-iconv": "v1.2.0", "symfony/polyfill-mbstring": "v1.3.0", "symfony/polyfill-php54": "v1.5.0", "symfony/polyfill-php55": "v1.5.0", "symfony/process": "v3.3.8", "symfony/translation": "v2.8.7", "symfony/yaml": "v2.8.7", "tecnickcom/tcpdf": "6.2.26-p1", "zendframework/zend-diactoros": "1.3.10" }, "extra": {"sha":"4896b9336948adf72a76127e875c68819312f80cd3b20b6c84264481ba324cf9","sig":"b+8N1+3ZptpfDxQ9G6TILrk8vTNdU4t1UH15jWwDggKDB\/3S149\/dQpbPj7XMbW0QtiiGvCMS+nnX1\/kwELWvu6S\/L6kHRxaKLnkoSftBsXbjoEvA+gt95RxDvte7nRG9oBW4QA+IibJf+GkV6cXjDBfpGHK0EVL\/9lo2V\/x4d4+FBXu37khk1zft8L692isTWgbNjRKuNqlyl32Y4KsE1fb0Zwi4j6g\/v7XzMJIbhjUs0W3uoC3+\/no61Enf923y09aLjiPGqopfx1ivSNqursUJJWjnHdDr3NiIJVxO0PfgQqH80PixLr4rYxt\/E4HdEC8WmTYjeYfVvM5zoT37g==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_7.9.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V7.9.0_GA","fileSize":"71797107","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"hyCkcI+ZfPIW2nBrJFXpDl4qCQTRBPKQ7ZMEk1CZfyR2PQJyABA1KM6xjk5JRsBnz3VZ8wmgqW4f4AjQmLLbb6EC3NzucsD5F7Y1ArxoljllC02qm0ZpcshGEaOLAGmiH6pBlPfJLkciqYdbdYkVcP1pllC0PDwqrYuVeZbcfM4xpz3zOaxKgTjzgF+09xep4HfzTh7KNrRNhGAhBO4iZWJId\/ZVQqcWikM+HB\/k6kK9+7zGVuNWWTFXG7rqshKHr327v6YjPXx33lK7jAU\/gpbGHqsoWnxBOdwQQoxiYEtYMDNiOaFBZhNGWiVQlplHoqew6mpJ9phgl8Q504Oj\/A=="},"require":{"ionCubeLoader":"10.1.0"}} }, "7.9.0-rc.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "7.9.0-RC.1", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^5.6.0 || ^7.0.0 || ^7.1.0 || ^7.2.0 || ^7.3.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-7.9.0-rc.1.zip", "type": "zip" }, "time": "2019-12-12", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "0.7.4", "authorizenet/authorizenet": "1.9.6", "aws/aws-sdk-php": "3.69.2", "bitpay/php-client": "v3.0.0-p1", "bshaffer/oauth2-server-httpfoundation-bridge": "dev-develop", "bshaffer/oauth2-server-php": "v1.8.0", "composer/composer": "1.0.3-p1", "composer/semver": "1.4.2", "composer/spdx-licenses": "1.1.6", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "v1.4.0", "doctrine/inflector": "v1.1.0", "doctrine/instantiator": "1.0.5", "doctrine/lexer": "v1.0.1", "duosecurity/duo_php": "1.0.0", "ezyang/htmlpurifier": "v4.9.2", "facebook/graph-sdk": "5.5.0", "filp/whoops": "2.1.8", "firebase/php-jwt": "v3.0.0", "goetas-webservices/xsd2php-runtime": "v0.2.7", "google/apiclient": "v2.1.3-p1", "google/auth": "v0.11.1", "google/recaptcha": "1.1.2", "guzzlehttp/guzzle": "5.3.3", "guzzlehttp/promises": "v1.3.1", "guzzlehttp/psr7": "1.4.2", "guzzlehttp/ringphp": "1.1.1", "guzzlehttp/streams": "3.0.0", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v5.2.37", "illuminate/container": "v5.2.37", "illuminate/contracts": "v5.2.45", "illuminate/database": "v5.2.37-p2", "illuminate/events": "v5.2.37", "illuminate/support": "v5.2.37-p1", "illuminate/validation": "v5.2.45", "ircmaxell/password-compat": "v1.0.4", "jms/metadata": "1.6.0", "jms/parser-lib": "1.0.0", "jms/serializer": "1.8.1", "justinrainbow/json-schema": "1.6.1", "knplabs/knp-menu": "v2.1.1", "league/climate": "3.2.1", "league/flysystem": "1.0.45", "league/flysystem-aws-s3-v3": "1.0.21", "league/plates": "3.3.0", "michelf/php-markdown": "1.6.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "1.18.2", "mtdowling/jmespath.php": "2.4.0", "nesbot/carbon": "1.21.0", "nikic/fast-route": "v1.2.0", "paragonie/random_compat": "v1.4.2", "php-imap/php-imap": "2.0.9", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.0.7", "phpmyadmin/sql-parser": "v4.2.4", "phpoption/phpoption": "1.5.0", "phpseclib/mcrypt_compat": "1.0.5", "phpseclib/phpseclib": "2.0.10", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-message": "1.0.1", "psr/log": "1.0.2", "punic/punic": "1.6.3", "ramsey/uuid": "3.4.1", "react/promise": "v2.5.1", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.6.1", "seld/phar-utils": "1.0.1", "smarty/smarty": "v3.1.33-p1", "stripe/stripe-php": "v6.43.1", "symfony/config": "v3.2.14", "symfony/console": "v2.8.7", "symfony/dependency-injection": "v3.1.10", "symfony/filesystem": "v3.3.8", "symfony/finder": "v2.8.7", "symfony/http-foundation": "v2.8.7", "symfony/polyfill-iconv": "v1.2.0", "symfony/polyfill-mbstring": "v1.3.0", "symfony/polyfill-php54": "v1.5.0", "symfony/polyfill-php55": "v1.5.0", "symfony/process": "v3.3.8", "symfony/translation": "v2.8.7", "symfony/yaml": "v2.8.7", "tecnickcom/tcpdf": "6.2.26-p1", "zendframework/zend-diactoros": "1.3.10" }, "extra": {"sha":"9f068b613e20ecbad618da910fe3ce7143d58c23deac4b943cdb8758fd3b2de7","sig":"ceGqyITX+44mpYWPOrDumbkCo0ZPeAvaCzZXsEVqJJSOw81X7KiDvQMXEl+1YlLYAfFu\/3HPOiSgbr1rsBnUgj6aBeJ1e3AS8EtWCRGEj\/8IfXEw81aAYkNp+EdYUGonQ4iBOD\/4dBhoZCG2DBqGfpjgEHEf1HVQpZzgiQI72wTHI+nNmGIRVIU2UBJzRCSpo\/7Vx23WNmivghQDEr3reUJkM8QTRvYp6AmoyNyAXkJp5GkyeEFK5yWjVSrHAy9ahzOS8C+GyvS6dTTYUPe5Pn\/Ucru9xLxBzuOSszBNGgrBFcyvJWVgFW26ZVx5o7ZNyBTwmL9t\/+CsGqHHasGJtA==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_7.9.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V7.9.0_RC_1","fileSize":"71623374","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"TuT7yvaaJpAFu2Z5CpWk+zeZOB7lR0hPIiL6DJ6SdHZZyd\/5K+7XFxqsO1mq\/yhsyi2LzBBD1gI29ZzkDAD9KZi\/gG3BAbCAi7G1yMbAOfwOVgKFIQFa5cRwrg\/cpz8kcNTWuGeRpwcROM8LbEuMgYfUfqTU6j8PfQPKV5+LfhbqfvH+UxuOr3DAxscs3zE0iNgjbds\/tp1KlxqN\/y39mCXLBYew9Qgy4D8Uh3jZw2HfWcgffHNESAC7T\/vNrpuAOiSYLhASurYHhYnDEDfoxonkVl\/Sn1KiGaLw4aJ2refrPKnhwyJoSbp0riEwrdfynQTzUkFGiVGvu5Hs8Icikg=="},"require":{"ionCubeLoader":"10.1.0"}} }, "7.9.0-beta.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "7.9.0-beta.1", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^5.6.0 || ^7.0.0 || ^7.1.0 || ^7.2.0 || ^7.3.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-7.9.0-beta.1.zip", "type": "zip" }, "time": "2019-11-15", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "0.7.4", "authorizenet/authorizenet": "1.9.6", "aws/aws-sdk-php": "3.69.2", "bitpay/php-client": "v3.0.0-p1", "bshaffer/oauth2-server-httpfoundation-bridge": "dev-develop", "bshaffer/oauth2-server-php": "v1.8.0", "composer/composer": "1.0.3-p1", "composer/semver": "1.4.2", "composer/spdx-licenses": "1.1.6", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "v1.4.0", "doctrine/inflector": "v1.1.0", "doctrine/instantiator": "1.0.5", "doctrine/lexer": "v1.0.1", "duosecurity/duo_php": "1.0.0", "ezyang/htmlpurifier": "v4.9.2", "facebook/graph-sdk": "5.5.0", "filp/whoops": "2.1.8", "firebase/php-jwt": "v3.0.0", "goetas-webservices/xsd2php-runtime": "v0.2.7", "google/apiclient": "v2.1.3-p1", "google/auth": "v0.11.1", "google/recaptcha": "1.1.2", "guzzlehttp/guzzle": "5.3.3", "guzzlehttp/promises": "v1.3.1", "guzzlehttp/psr7": "1.4.2", "guzzlehttp/ringphp": "1.1.1", "guzzlehttp/streams": "3.0.0", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v5.2.37", "illuminate/container": "v5.2.37", "illuminate/contracts": "v5.2.45", "illuminate/database": "v5.2.37-p2", "illuminate/events": "v5.2.37", "illuminate/support": "v5.2.37-p1", "illuminate/validation": "v5.2.45", "ircmaxell/password-compat": "v1.0.4", "jms/metadata": "1.6.0", "jms/parser-lib": "1.0.0", "jms/serializer": "1.8.1", "justinrainbow/json-schema": "1.6.1", "knplabs/knp-menu": "v2.1.1", "league/climate": "3.2.1", "league/flysystem": "1.0.45", "league/flysystem-aws-s3-v3": "1.0.21", "league/plates": "3.3.0", "michelf/php-markdown": "1.6.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "1.18.2", "mtdowling/jmespath.php": "2.4.0", "nesbot/carbon": "1.21.0", "nikic/fast-route": "v1.2.0", "paragonie/random_compat": "v1.4.2", "php-imap/php-imap": "2.0.9", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.0.7", "phpmyadmin/sql-parser": "v4.2.4", "phpoption/phpoption": "1.5.0", "phpseclib/mcrypt_compat": "1.0.5", "phpseclib/phpseclib": "2.0.10", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-message": "1.0.1", "psr/log": "1.0.2", "punic/punic": "1.6.3", "ramsey/uuid": "3.4.1", "react/promise": "v2.5.1", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.6.1", "seld/phar-utils": "1.0.1", "smarty/smarty": "v3.1.33-p1", "stripe/stripe-php": "v6.43.1", "symfony/config": "v3.2.14", "symfony/console": "v2.8.7", "symfony/dependency-injection": "v3.1.10", "symfony/filesystem": "v3.3.8", "symfony/finder": "v2.8.7", "symfony/http-foundation": "v2.8.7", "symfony/polyfill-iconv": "v1.2.0", "symfony/polyfill-mbstring": "v1.3.0", "symfony/polyfill-php54": "v1.5.0", "symfony/polyfill-php55": "v1.5.0", "symfony/process": "v3.3.8", "symfony/translation": "v2.8.7", "symfony/yaml": "v2.8.7", "tecnickcom/tcpdf": "6.2.26-p1", "zendframework/zend-diactoros": "1.3.10" }, "extra": {"sha":"1e8ca0d57f8d503aef8be5c48739ec9256035f602cec33a47d686f661fe62ff9","sig":"XWPxFb5p0XxpSaUkP0eT3l775htU9g8rKPv36NYXqFiDZbgLOlHT8ObFTOGNoV+eKBv4J3zq06No1VIQ5nUI+C\/DOOEptercno4CqjnstpASOKLU4yQsgUKefGutO3G7b7zDeFYIO5qtAUV2Vs1MDT\/pGK5kLsAoyevUMmGFg5wkAFjIZZPzBYV3ofDZ8On7Vm\/avlNBg7gchaOizsdd506TWWl\/fT6pLOjf7RQwZ66fC9BEwvn\/ZdV1LTIPfT0di3qT91y\/58\/Ru2yIOv7n9ovyO1C3lArpZ6wRNSY1aU\/+Q0GsYnHdfdRaq+GS4nsxLRv\/ijbieCj5AR9bnJgGwg==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_7.9.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelogs:WHMCS_V7.9.0","fileSize":"71424303","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"enX05n7s3ugs6BoaO6nBnQfPflb8GaASlDaopGUslD2iRnYDrQP91BPJc6f9aQkpDhqjaMv4YG\/q98Rb6Eig6r0hNtmE5T2Yx+TK2HuW1L4hMGhc8hI8x4AaniwrepzkR4JxprISYfq74bPu1+c\/Vu3XULO7qIYY47a0FKrax+PGzUxQY4ujfBEXU1ONynFP7nKCfq2zJgK3JmGWued\/mW+4cYTQBANBX\/GD127SmI32ztkQXPCcW2mHJVAIeOV9vtqO1Ep7KN8H1oUuvHs\/dTbwJB0R3dJQ\/B\/5MumoIW1g73RxsbryFNXHOSAXq1cHpuika5dWEnCCWq3QfoN6aA=="},"require":{"ionCubeLoader":"10.1.0"}} }, "7.8.3-release.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "7.8.3", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^5.6.0 || ^7.0.0 || ^7.1.0 || ^7.2.0 || ^7.3.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-7.8.3-release.1.zip", "type": "zip" }, "time": "2019-09-23", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "0.7.4", "authorizenet/authorizenet": "1.9.6", "aws/aws-sdk-php": "3.69.2", "bitpay/php-client": "v3.0.0-p1", "bshaffer/oauth2-server-httpfoundation-bridge": "dev-develop", "bshaffer/oauth2-server-php": "v1.8.0", "composer/composer": "1.0.3-p1", "composer/semver": "1.4.2", "composer/spdx-licenses": "1.1.6", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "v1.4.0", "doctrine/inflector": "v1.1.0", "doctrine/instantiator": "1.0.5", "doctrine/lexer": "v1.0.1", "duosecurity/duo_php": "1.0.0", "ezyang/htmlpurifier": "v4.9.2", "facebook/graph-sdk": "5.5.0", "filp/whoops": "2.1.8", "firebase/php-jwt": "v3.0.0", "goetas-webservices/xsd2php-runtime": "v0.2.7", "google/apiclient": "v2.1.3-p1", "google/auth": "v0.11.1", "google/recaptcha": "1.1.2", "guzzlehttp/guzzle": "5.3.3", "guzzlehttp/promises": "v1.3.1", "guzzlehttp/psr7": "1.4.2", "guzzlehttp/ringphp": "1.1.1", "guzzlehttp/streams": "3.0.0", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v5.2.37", "illuminate/container": "v5.2.37", "illuminate/contracts": "v5.2.45", "illuminate/database": "v5.2.37-p2", "illuminate/events": "v5.2.37", "illuminate/support": "v5.2.37-p1", "illuminate/validation": "v5.2.45", "ircmaxell/password-compat": "v1.0.4", "jms/metadata": "1.6.0", "jms/parser-lib": "1.0.0", "jms/serializer": "1.8.1", "justinrainbow/json-schema": "1.6.1", "knplabs/knp-menu": "v2.1.1", "league/climate": "3.2.1", "league/flysystem": "1.0.45", "league/flysystem-aws-s3-v3": "1.0.21", "league/plates": "3.3.0", "michelf/php-markdown": "1.6.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "1.18.2", "mtdowling/jmespath.php": "2.4.0", "nesbot/carbon": "1.21.0", "nikic/fast-route": "v1.2.0", "paragonie/random_compat": "v1.4.2", "php-imap/php-imap": "2.0.9", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.0.7", "phpmyadmin/sql-parser": "v4.2.4", "phpoption/phpoption": "1.5.0", "phpseclib/mcrypt_compat": "1.0.5", "phpseclib/phpseclib": "2.0.10", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-message": "1.0.1", "psr/log": "1.0.2", "punic/punic": "1.6.3", "ramsey/uuid": "3.4.1", "react/promise": "v2.5.1", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.6.1", "seld/phar-utils": "1.0.1", "smarty/smarty": "v3.1.33-p1", "stripe/stripe-php": "v6.40.0", "symfony/config": "v3.2.14", "symfony/console": "v2.8.7", "symfony/dependency-injection": "v3.1.10", "symfony/filesystem": "v3.3.8", "symfony/finder": "v2.8.7", "symfony/http-foundation": "v2.8.7", "symfony/polyfill-iconv": "v1.2.0", "symfony/polyfill-mbstring": "v1.3.0", "symfony/polyfill-php54": "v1.5.0", "symfony/polyfill-php55": "v1.5.0", "symfony/process": "v3.3.8", "symfony/translation": "v2.8.7", "symfony/yaml": "v2.8.7", "tecnickcom/tcpdf": "6.2.26-p1", "zendframework/zend-diactoros": "1.3.10" }, "extra": {"sha":"e7d783baf87d0ab786a2bdc7cf9579867fe8db982a8b45228c2df49d2083c15c","sig":"RfzZCeF+JHs\/jKoC3N4vUkQmLBzsS890kjevzRhfRIPrAabkNsGRxwRBalxXGYSxsXhf2dV9MHbF0c2OKoAX5A\/MFX\/upP1dTZn8BpqTtcUm8626Qu5vkqcxaTHz9\/fSH8lKno5S37zUyx\/5I5oot6uxfO0a0SeYXEL8XNWQJv\/9M6c8FuyGMd00jCPyB6w5lz4thG+tPSQTJLoBxhXeuxteP0PdsBAqs4F4STEtdYJJmyqP1Mmk7VjkYJcsdqFZji\/WwD\/fiuy6zsPd6DMVQh2cHnkdq4hnyRy0JFITgV1qnlRccAvbwn9yP4fCgd89f5bpeJ7xrl19E4r1pHTqIg==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_7.8.3_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V7.8.3","fileSize":"69865786","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"Y1f+3WkGNK16H\/xGy9VwJKvjsDBkLDFaWtXyRmPWN7NEsVu3Ko\/pxr0ahEF1Owdg7\/jWoFaklOJnSUxAGQNUQSvwCxBt9FuS3oVjp61Koco1jTaCeEruhmlqdPGTJb+UhUjSKBtD0tBNo4e\/xL3YNgCCqYV41IT7uHY1v8+4dO1tBp2dinpzjh9uVBVJ4xLletbpYOvE2eJ9I3OpUwd0FYWFQpn77a64+BSTjB15ZVEbFPQv3gkOxZJGUTguZda8t3\/TMx5\/vQS04fFehgzEzwtisdLEE\/8+efkP7Scw0dzf4NeBX3hNfdKxHUIZZcYioZesBg7SKOpFKOyKbiDUCA=="},"require":{"ionCubeLoader":"10.1.0"}} }, "7.8.2-release.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "7.8.2", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^5.6.0 || ^7.0.0 || ^7.1.0 || ^7.2.0 || ^7.3.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-7.8.2-release.1.zip", "type": "zip" }, "time": "2019-09-05", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "0.7.4", "authorizenet/authorizenet": "1.9.6", "aws/aws-sdk-php": "3.69.2", "bitpay/php-client": "v3.0.0-p1", "bshaffer/oauth2-server-httpfoundation-bridge": "dev-develop", "bshaffer/oauth2-server-php": "v1.8.0", "composer/composer": "1.0.3-p1", "composer/semver": "1.4.2", "composer/spdx-licenses": "1.1.6", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "v1.4.0", "doctrine/inflector": "v1.1.0", "doctrine/instantiator": "1.0.5", "doctrine/lexer": "v1.0.1", "duosecurity/duo_php": "1.0.0", "ezyang/htmlpurifier": "v4.9.2", "facebook/graph-sdk": "5.5.0", "filp/whoops": "2.1.8", "firebase/php-jwt": "v3.0.0", "goetas-webservices/xsd2php-runtime": "v0.2.7", "google/apiclient": "v2.1.3-p1", "google/auth": "v0.11.1", "google/recaptcha": "1.1.2", "guzzlehttp/guzzle": "5.3.3", "guzzlehttp/promises": "v1.3.1", "guzzlehttp/psr7": "1.4.2", "guzzlehttp/ringphp": "1.1.1", "guzzlehttp/streams": "3.0.0", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v5.2.37", "illuminate/container": "v5.2.37", "illuminate/contracts": "v5.2.45", "illuminate/database": "v5.2.37-p2", "illuminate/events": "v5.2.37", "illuminate/support": "v5.2.37-p1", "illuminate/validation": "v5.2.45", "ircmaxell/password-compat": "v1.0.4", "jms/metadata": "1.6.0", "jms/parser-lib": "1.0.0", "jms/serializer": "1.8.1", "justinrainbow/json-schema": "1.6.1", "knplabs/knp-menu": "v2.1.1", "league/climate": "3.2.1", "league/flysystem": "1.0.45", "league/flysystem-aws-s3-v3": "1.0.21", "league/plates": "3.3.0", "michelf/php-markdown": "1.6.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "1.18.2", "mtdowling/jmespath.php": "2.4.0", "nesbot/carbon": "1.21.0", "nikic/fast-route": "v1.2.0", "paragonie/random_compat": "v1.4.2", "php-imap/php-imap": "2.0.9", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.0.7", "phpmyadmin/sql-parser": "v4.2.4", "phpoption/phpoption": "1.5.0", "phpseclib/mcrypt_compat": "1.0.5", "phpseclib/phpseclib": "2.0.10", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-message": "1.0.1", "psr/log": "1.0.2", "punic/punic": "1.6.3", "ramsey/uuid": "3.4.1", "react/promise": "v2.5.1", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.6.1", "seld/phar-utils": "1.0.1", "smarty/smarty": "v3.1.33-p1", "stripe/stripe-php": "v6.40.0", "symfony/config": "v3.2.14", "symfony/console": "v2.8.7", "symfony/dependency-injection": "v3.1.10", "symfony/filesystem": "v3.3.8", "symfony/finder": "v2.8.7", "symfony/http-foundation": "v2.8.7", "symfony/polyfill-iconv": "v1.2.0", "symfony/polyfill-mbstring": "v1.3.0", "symfony/polyfill-php54": "v1.5.0", "symfony/polyfill-php55": "v1.5.0", "symfony/process": "v3.3.8", "symfony/translation": "v2.8.7", "symfony/yaml": "v2.8.7", "tecnickcom/tcpdf": "6.2.26-p1", "zendframework/zend-diactoros": "1.3.10" }, "extra": {"sha":"f47b8a0f617064af97f2fc8d326003b3875a5d88c19a95415e912678c28c1682","sig":"Z8rIuazUPIT2TjAdNc9alp6BBkG54enSTmARHVxpAM29b8cTxpS3vTfxQGQstuKqSQOSnAhKm+vjPGvV\/M\/yPxKnKXpZsLwFd4HVQf9NDD3G04S98mlUSOXfRqWSko26yJxSw34rmJTrEbnKj2vBdeJiY9ehDyMNOFI4GLOvnWIuhm6QsiXCjEdMQvDtONy3OfdKRMWTw4Cmb+rea1YtZZ+8fGTCKEthQO+R7JN13ZWg7zwctUhz5LxDxAdmm5vBYrMkC\/4vxTr1XxuLexWvsVXwCOmmO0QIzyW1TWrBbQFbxa4rNhLA71UygI\/TCeHeBUzTS4bbSSzUW+4kXHPLSA==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_7.8.2_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V7.8.2","fileSize":"69781117","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"Ysad4sRfIP2\/HKie7ESpOQ04iVQ\/neDU\/X8K\/ILu2PDWZsVzZURORDp6uPbXT1WP5MiMbaGevQuJn3r1UT6bYgJwPnns57ZX529k91FpSmbXsoMWDljGHGNsi0IUAIiFczktZeppLGeSWh6YWYLy5uxSZNgEE0MyAw6imSlQ734GYRIb9NHIuzHyAa8rD61oZ7nQKhVmX9qZlpxCcLR6B62jI5egdgL9DSd\/mL2UbaPlNX7NFqy\/PBIBzhkvn1Lq3XSaD57hwPwh2daK36vy5KaDuPDX8ELFla1TeA+j1zcJ4qnx7wZWDuTV5DitnOxyJYkbTWvRVGK5PXP2b1Rojw=="},"require":{"ionCubeLoader":"10.1.0"}} }, "7.8.1-release.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "7.8.1", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^5.6.0 || ^7.0.0 || ^7.1.0 || ^7.2.0 || ^7.3.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-7.8.1-release.1.zip", "type": "zip" }, "time": "2019-08-30", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "0.7.4", "authorizenet/authorizenet": "1.9.6", "aws/aws-sdk-php": "3.69.2", "bitpay/php-client": "v3.0.0-p1", "bshaffer/oauth2-server-httpfoundation-bridge": "dev-develop", "bshaffer/oauth2-server-php": "v1.8.0", "composer/composer": "1.0.3-p1", "composer/semver": "1.4.2", "composer/spdx-licenses": "1.1.6", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "v1.4.0", "doctrine/inflector": "v1.1.0", "doctrine/instantiator": "1.0.5", "doctrine/lexer": "v1.0.1", "duosecurity/duo_php": "1.0.0", "ezyang/htmlpurifier": "v4.9.2", "facebook/graph-sdk": "5.5.0", "filp/whoops": "2.1.8", "firebase/php-jwt": "v3.0.0", "goetas-webservices/xsd2php-runtime": "v0.2.7", "google/apiclient": "v2.1.3-p1", "google/auth": "v0.11.1", "google/recaptcha": "1.1.2", "guzzlehttp/guzzle": "5.3.3", "guzzlehttp/promises": "v1.3.1", "guzzlehttp/psr7": "1.4.2", "guzzlehttp/ringphp": "1.1.1", "guzzlehttp/streams": "3.0.0", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v5.2.37", "illuminate/container": "v5.2.37", "illuminate/contracts": "v5.2.45", "illuminate/database": "v5.2.37-p2", "illuminate/events": "v5.2.37", "illuminate/support": "v5.2.37-p1", "illuminate/validation": "v5.2.45", "ircmaxell/password-compat": "v1.0.4", "jms/metadata": "1.6.0", "jms/parser-lib": "1.0.0", "jms/serializer": "1.8.1", "justinrainbow/json-schema": "1.6.1", "knplabs/knp-menu": "v2.1.1", "league/climate": "3.2.1", "league/flysystem": "1.0.45", "league/flysystem-aws-s3-v3": "1.0.21", "league/plates": "3.3.0", "michelf/php-markdown": "1.6.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "1.18.2", "mtdowling/jmespath.php": "2.4.0", "nesbot/carbon": "1.21.0", "nikic/fast-route": "v1.2.0", "paragonie/random_compat": "v1.4.2", "php-imap/php-imap": "2.0.9", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.0.7", "phpmyadmin/sql-parser": "v4.2.4", "phpoption/phpoption": "1.5.0", "phpseclib/mcrypt_compat": "1.0.5", "phpseclib/phpseclib": "2.0.10", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-message": "1.0.1", "psr/log": "1.0.2", "punic/punic": "1.6.3", "ramsey/uuid": "3.4.1", "react/promise": "v2.5.1", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.6.1", "seld/phar-utils": "1.0.1", "smarty/smarty": "v3.1.33-p1", "stripe/stripe-php": "v6.40.0", "symfony/config": "v3.2.14", "symfony/console": "v2.8.7", "symfony/dependency-injection": "v3.1.10", "symfony/filesystem": "v3.3.8", "symfony/finder": "v2.8.7", "symfony/http-foundation": "v2.8.7", "symfony/polyfill-iconv": "v1.2.0", "symfony/polyfill-mbstring": "v1.3.0", "symfony/polyfill-php54": "v1.5.0", "symfony/polyfill-php55": "v1.5.0", "symfony/process": "v3.3.8", "symfony/translation": "v2.8.7", "symfony/yaml": "v2.8.7", "tecnickcom/tcpdf": "6.2.26-p1", "zendframework/zend-diactoros": "1.3.10" }, "extra": {"sha":"8ef74c248a3db02c4c041dacfcc577724bf958904f4c67131f07506bb4b26a72","sig":"krvBqHDqcESwosgfAyZ3jNUt3+9i5XB2lQALpUbPWKYbIE8tXODiQCX\/cK6xI52wBzwUamhcvdaqSwYZDvqLeo8awMOPp860poUR\/uSeulWR4NFiLDIG7MedH9SFr7KvXodQSqq+vKI9WFhuBRXo7Q2e8LOTiMRu4DGUB3Zqf9c8dYvpX9wZVqUHRHfZPoaeghfl\/rlJDAWwvuLZtE3wP4hCQLQ6Ap2ZNVv6SLAKVF+g935DY5MDLh7pzJq\/50WB48pIGFi9B+qMCphBFJdciyinQepHlMo+cuTVIUCQZUv19MBrxJcm\/oNI7DEWV8kddyYDkP98+gVSEFK5yBGRIg==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_7.8.1_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V7.8.1","fileSize":"69745452","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"dYZ0xQcUDYlbhGFQJTAESOS0d51iC7qxd3vSgcU6\/W3408H7UQ78UZjzCnyWUrseE9eBTXGrW1aUj\/GdwRdrNLXjWcVjRP9wl5uKXhL5ppju3xRN+\/FHCjlESMJZOJAfrI\/H\/UHNRuEJErdEfQx0jgpz73LMEVw0QW8O+jdX8RaODdA7bTEDTGUhThzuNFUo8RdxZLn\/84Da9JHdELUL4ROkxhcWGa8Vwznrme6kHXLi7lQX95HBgHpqbvxMYMeWWzczSRSKpDipL+xxdNCW9O+oSoeD8lM62UiUmBeTHuj+lEH57p8hdizUmoMDWfMMbMPHosTi9AOqsAenVfS6eg=="},"require":{"ionCubeLoader":"10.1.0"}} }, "7.8.0-release.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "7.8.0", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^5.6.0 || ^7.0.0 || ^7.1.0 || ^7.2.0 || ^7.3.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-7.8.0-release.1.zip", "type": "zip" }, "time": "2019-08-28", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "0.7.4", "authorizenet/authorizenet": "1.9.6", "aws/aws-sdk-php": "3.69.2", "bitpay/php-client": "v3.0.0-p1", "bshaffer/oauth2-server-httpfoundation-bridge": "dev-develop", "bshaffer/oauth2-server-php": "v1.8.0", "composer/composer": "1.0.3-p1", "composer/semver": "1.4.2", "composer/spdx-licenses": "1.1.6", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "v1.4.0", "doctrine/inflector": "v1.1.0", "doctrine/instantiator": "1.0.5", "doctrine/lexer": "v1.0.1", "duosecurity/duo_php": "1.0.0", "ezyang/htmlpurifier": "v4.9.2", "facebook/graph-sdk": "5.5.0", "filp/whoops": "2.1.8", "firebase/php-jwt": "v3.0.0", "goetas-webservices/xsd2php-runtime": "v0.2.7", "google/apiclient": "v2.1.3-p1", "google/auth": "v0.11.1", "google/recaptcha": "1.1.2", "guzzlehttp/guzzle": "5.3.3", "guzzlehttp/promises": "v1.3.1", "guzzlehttp/psr7": "1.4.2", "guzzlehttp/ringphp": "1.1.1", "guzzlehttp/streams": "3.0.0", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v5.2.37", "illuminate/container": "v5.2.37", "illuminate/contracts": "v5.2.45", "illuminate/database": "v5.2.37-p2", "illuminate/events": "v5.2.37", "illuminate/support": "v5.2.37-p1", "illuminate/validation": "v5.2.45", "ircmaxell/password-compat": "v1.0.4", "jms/metadata": "1.6.0", "jms/parser-lib": "1.0.0", "jms/serializer": "1.8.1", "justinrainbow/json-schema": "1.6.1", "knplabs/knp-menu": "v2.1.1", "league/climate": "3.2.1", "league/flysystem": "1.0.45", "league/flysystem-aws-s3-v3": "1.0.21", "league/plates": "3.3.0", "michelf/php-markdown": "1.6.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "1.18.2", "mtdowling/jmespath.php": "2.4.0", "nesbot/carbon": "1.21.0", "nikic/fast-route": "v1.2.0", "paragonie/random_compat": "v1.4.2", "php-imap/php-imap": "2.0.9", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.0.7", "phpmyadmin/sql-parser": "v4.2.4", "phpoption/phpoption": "1.5.0", "phpseclib/mcrypt_compat": "1.0.5", "phpseclib/phpseclib": "2.0.10", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-message": "1.0.1", "psr/log": "1.0.2", "punic/punic": "1.6.3", "ramsey/uuid": "3.4.1", "react/promise": "v2.5.1", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.6.1", "seld/phar-utils": "1.0.1", "smarty/smarty": "v3.1.33-p1", "stripe/stripe-php": "v6.40.0", "symfony/config": "v3.2.14", "symfony/console": "v2.8.7", "symfony/dependency-injection": "v3.1.10", "symfony/filesystem": "v3.3.8", "symfony/finder": "v2.8.7", "symfony/http-foundation": "v2.8.7", "symfony/polyfill-iconv": "v1.2.0", "symfony/polyfill-mbstring": "v1.3.0", "symfony/polyfill-php54": "v1.5.0", "symfony/polyfill-php55": "v1.5.0", "symfony/process": "v3.3.8", "symfony/translation": "v2.8.7", "symfony/yaml": "v2.8.7", "tecnickcom/tcpdf": "6.2.26-p1", "zendframework/zend-diactoros": "1.3.10" }, "extra": {"sha":"22c3a9d442fd9d014da68b817e347a0d09ca9266374e17327889d2e92e1791c9","sig":"BaJK8Is7X1cGgIJXCm2PhKQHbWDW6hLmX28F6eGw6A0\/htc\/1k1nAjhD01K1t1UV2981W6LsFnP5O21kBh\/+qJSdnmw6dMGdn8AN3bS6BAO4CUltJRRbfEU\/8OxRRz6wI+fNfZ6XCLy\/aDgB0nR0m9\/P1C5j7thJk\/AyY4kgwvcEDiPHBs+J7ZBf9sj8LD0bGTCn4g4eC8W2tpTrJBRwK4eawJ0GKpPyN67WDmZM3vqMPoT5+dSmhWrTZ7qb6ZwhHlE23B\/VC9MzgkKuirpaGHesfndiVnqDVKneA5LNsAf\/YtqICt2TByIxbMTFrIfpMQP9OYNBamLuzMwX7ib20Q==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_7.8.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V7.8.0_GA","fileSize":"69754886","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"V9UkwaDLd18uMaRmC+Y0zOhFv6Pg3A47lIikDIC8e6MeQgvR8YEf8coUx51gnnE8bLAlnYtEJ2x+I+eNh9ok\/4AtlMSYNMphDsTyxWHKCpj+35r6LV8sHdThejKp4PoQKK610iqvB6hwcl8KzjsrPwrI82KTP4hyKpfMT1grVaDpNPf+\/o+LYa2TsrR9+hbwqXqZpBk1DmjqybHMznqjmydO5wDA2PBM0lg1o9SQhYDPZOdxMImHWcIQvUnxJXq4d31XwojBh5dRWoSQT9hxF\/MmXH1zMc5bwVbO8WE9O4s90YFQ+FbGxkcA67K2U+zXNbzP9Lghw+Kgt55AUZlkMQ=="},"require":{"ionCubeLoader":"10.1.0"}} }, "7.8.0-rc.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "7.8.0-RC.1", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^5.6.0 || ^7.0.0 || ^7.1.0 || ^7.2.0 || ^7.3.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-7.8.0-rc.1.zip", "type": "zip" }, "time": "2019-08-07", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "0.7.4", "authorizenet/authorizenet": "1.9.6", "aws/aws-sdk-php": "3.69.2", "bitpay/php-client": "v3.0.0-p1", "bshaffer/oauth2-server-httpfoundation-bridge": "dev-develop", "bshaffer/oauth2-server-php": "v1.8.0", "composer/composer": "1.0.3-p1", "composer/semver": "1.4.2", "composer/spdx-licenses": "1.1.6", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "v1.4.0", "doctrine/inflector": "v1.1.0", "doctrine/instantiator": "1.0.5", "doctrine/lexer": "v1.0.1", "duosecurity/duo_php": "1.0.0", "ezyang/htmlpurifier": "v4.9.2", "facebook/graph-sdk": "5.5.0", "filp/whoops": "2.1.8", "firebase/php-jwt": "v3.0.0", "goetas-webservices/xsd2php-runtime": "v0.2.7", "google/apiclient": "v2.1.3-p1", "google/auth": "v0.11.1", "google/recaptcha": "1.1.2", "guzzlehttp/guzzle": "5.3.3", "guzzlehttp/promises": "v1.3.1", "guzzlehttp/psr7": "1.4.2", "guzzlehttp/ringphp": "1.1.1", "guzzlehttp/streams": "3.0.0", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v5.2.37", "illuminate/container": "v5.2.37", "illuminate/contracts": "v5.2.45", "illuminate/database": "v5.2.37-p2", "illuminate/events": "v5.2.37", "illuminate/support": "v5.2.37-p1", "illuminate/validation": "v5.2.45", "ircmaxell/password-compat": "v1.0.4", "jms/metadata": "1.6.0", "jms/parser-lib": "1.0.0", "jms/serializer": "1.8.1", "justinrainbow/json-schema": "1.6.1", "knplabs/knp-menu": "v2.1.1", "league/climate": "3.2.1", "league/flysystem": "1.0.45", "league/flysystem-aws-s3-v3": "1.0.21", "league/plates": "3.3.0", "michelf/php-markdown": "1.6.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "1.18.2", "mtdowling/jmespath.php": "2.4.0", "nesbot/carbon": "1.21.0", "nikic/fast-route": "v1.2.0", "paragonie/random_compat": "v1.4.2", "php-imap/php-imap": "2.0.9", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.0.7", "phpmyadmin/sql-parser": "v4.2.4", "phpoption/phpoption": "1.5.0", "phpseclib/mcrypt_compat": "1.0.5", "phpseclib/phpseclib": "2.0.10", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-message": "1.0.1", "psr/log": "1.0.2", "punic/punic": "1.6.3", "ramsey/uuid": "3.4.1", "react/promise": "v2.5.1", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.6.1", "seld/phar-utils": "1.0.1", "smarty/smarty": "v3.1.33-p1", "stripe/stripe-php": "v6.40.0", "symfony/config": "v3.2.14", "symfony/console": "v2.8.7", "symfony/dependency-injection": "v3.1.10", "symfony/filesystem": "v3.3.8", "symfony/finder": "v2.8.7", "symfony/http-foundation": "v2.8.7", "symfony/polyfill-iconv": "v1.2.0", "symfony/polyfill-mbstring": "v1.3.0", "symfony/polyfill-php54": "v1.5.0", "symfony/polyfill-php55": "v1.5.0", "symfony/process": "v3.3.8", "symfony/translation": "v2.8.7", "symfony/yaml": "v2.8.7", "tecnickcom/tcpdf": "6.2.26-p1", "zendframework/zend-diactoros": "1.3.10" }, "extra": {"sha":"72db1073b5a271d75e8b992b3be372550ccda6efe13e7072b87c0f4fb0efbd1d","sig":"WEPKUeZ2lT2TUTzJhx9OXGtRjA87WvJwtd8jSJylyB6cjRhAYwJxyF94Pl\/HaSCAMpw+mZ7m2nL2Hc1qlR7zfnnKltt1+f1WLwv5b4v7FqFoum1Zhkzgt7biqcc6ct8406LIRQczqE20Qz+KB1KdBLrnRS6MfQQbXddjej4lMxw\/i03N7qdb2L0iF4yOq7tU5VHK311k51hOyImKT3QcQBqCm9wuf9eatXlADbQ+BRTc9ZAB9G0yFNQKk5z5c19mFgJgC3DWQxO1u8FffqED6PHA\/MU3ezzDHEiiDBmwyg9+M73U8xxERXQUWzy5JvfOUvmb4Q4Yn6CsNMeckqEOzQ==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_7.8.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V7.8.0_RC_2","fileSize":"66758828","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"QPY\/gfH0vk2tcjVhUXbH4baTm7jpb10bg+XLxeY3bb0v42f6Lyh\/+NIpKB6SiX1eAxoj+GUGmdtJ2UNsLDD8nuig8R8SQXdC3OCKzLMvhHX9Ux2ov07R0XO+\/1XDl4IzPWOzIgCDITaiolhzlItg3pLGxm3qSGadLdoZyeLolM4Mw+CXJePwKtGz3c9UiJHXdHbWM\/KLjnPW+V+VB3wikAJ1NkAjkQSU8Lg6EfB4ZOoxeOD1FZi\/NJe0K2UW6MnDCRqkuKlokDMApxHaCojD0wprXCktOb3UsVlocKS65nSISkqFfbZ2Qu40XYS6fTPQ\/w0Gm9f0H8CZ47UTUASxsg=="},"require":{"ionCubeLoader":"10.1.0"}} }, "7.8.0-beta.2": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "7.8.0-beta.2", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^5.6.0 || ^7.0.0 || ^7.1.0 || ^7.2.0 || ^7.3.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-7.8.0-beta.2.zip", "type": "zip" }, "time": "now", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "0.7.4", "authorizenet/authorizenet": "1.9.6", "aws/aws-sdk-php": "3.69.2", "bitpay/php-client": "v3.0.0-p1", "bshaffer/oauth2-server-httpfoundation-bridge": "dev-develop", "bshaffer/oauth2-server-php": "v1.8.0", "composer/composer": "1.0.3-p1", "composer/semver": "1.4.2", "composer/spdx-licenses": "1.1.6", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "v1.4.0", "doctrine/inflector": "v1.1.0", "doctrine/instantiator": "1.0.5", "doctrine/lexer": "v1.0.1", "duosecurity/duo_php": "1.0.0", "ezyang/htmlpurifier": "v4.9.2", "facebook/graph-sdk": "5.5.0", "filp/whoops": "2.1.8", "firebase/php-jwt": "v3.0.0", "goetas-webservices/xsd2php-runtime": "v0.2.7", "google/apiclient": "v2.1.3-p1", "google/auth": "v0.11.1", "google/recaptcha": "1.1.2", "guzzlehttp/guzzle": "5.3.3", "guzzlehttp/promises": "v1.3.1", "guzzlehttp/psr7": "1.4.2", "guzzlehttp/ringphp": "1.1.1", "guzzlehttp/streams": "3.0.0", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v5.2.37", "illuminate/container": "v5.2.37", "illuminate/contracts": "v5.2.45", "illuminate/database": "v5.2.37-p2", "illuminate/events": "v5.2.37", "illuminate/support": "v5.2.37-p1", "illuminate/validation": "v5.2.45", "ircmaxell/password-compat": "v1.0.4", "jms/metadata": "1.6.0", "jms/parser-lib": "1.0.0", "jms/serializer": "1.8.1", "justinrainbow/json-schema": "1.6.1", "knplabs/knp-menu": "v2.1.1", "league/climate": "3.2.1", "league/flysystem": "1.0.45", "league/flysystem-aws-s3-v3": "1.0.21", "league/plates": "3.3.0", "michelf/php-markdown": "1.6.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "1.18.2", "mtdowling/jmespath.php": "2.4.0", "nesbot/carbon": "1.21.0", "nikic/fast-route": "v1.2.0", "paragonie/random_compat": "v1.4.2", "php-imap/php-imap": "2.0.9", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.0.7", "phpmyadmin/sql-parser": "v4.2.4", "phpoption/phpoption": "1.5.0", "phpseclib/mcrypt_compat": "1.0.5", "phpseclib/phpseclib": "2.0.10", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-message": "1.0.1", "psr/log": "1.0.2", "punic/punic": "1.6.3", "ramsey/uuid": "3.4.1", "react/promise": "v2.5.1", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.6.1", "seld/phar-utils": "1.0.1", "smarty/smarty": "v3.1.33-p1", "stripe/stripe-php": "v6.40.0", "symfony/config": "v3.2.14", "symfony/console": "v2.8.7", "symfony/dependency-injection": "v3.1.10", "symfony/filesystem": "v3.3.8", "symfony/finder": "v2.8.7", "symfony/http-foundation": "v2.8.7", "symfony/polyfill-iconv": "v1.2.0", "symfony/polyfill-mbstring": "v1.3.0", "symfony/polyfill-php54": "v1.5.0", "symfony/polyfill-php55": "v1.5.0", "symfony/process": "v3.3.8", "symfony/translation": "v2.8.7", "symfony/yaml": "v2.8.7", "tecnickcom/tcpdf": "6.2.26-p1", "zendframework/zend-diactoros": "1.3.10" }, "extra": {"sha":"62bb95a38d2fdde7cd9563e3c2e0cc12b6fd28f69487ca974ce803714d6d7000","sig":"mac99sMIAJEGkDQ6sCmZzbVgwgv6+ytJFXg0xPJYz4aLYgpzVh4HmCZGkUtnbggWZTfdd8u6mar4IU+QEn5eFD11qVMj8j6KO+9yhsFxmEhCq7kVgJ9Sdrf4HlW3DTojMtzYDaASpEBZy6mUa6j6S7qCqsSTcM8cNFpu9zv\/zJ3e\/yHZxVqw5WcryESYcooE+GE+qzHrARRWsZfRyByIDBQK9sr+yKcT+jR9yYJ2Blw22m+n+NbwFFIyoNxgLvNonryf9Nx50mubt0PwrDg+t9uRJ8jdhkr9M1M7FuS+cbcKJyDtZcTvGT1y4+UMiD7D8NpHMzyeEzoY4MIGAC5LkQ==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_7.8.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V7.8.0_Beta_2","fileSize":"66633521","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"f5WPf8odRAvEoGjM\/iRhgvAZGaLwzU6RhRCt1KJEtm\/F83xiibeQs+oG6XwgeRvG9IqUQezQRiKIENxnRqjvrXPPT+Vyt\/Th3P4IXTa\/La91gTgQscoWLTqn92PSPo8GDPVjCARUOvzBxUL6Fr3GVsHO5bj7UROX8jfct9WKa+VeqwLB7yehlGaZWvvpwhYzRUcdS7dNCcxBmyPUxOhuIsk4R539mxXMORDQthQlF0K9zY+qAvyu++gPg+xsi4a\/mYqOre\/AJUT\/zRwnh1yKPSYJuxLEgIwzB6rGG71F03eTKu3KAtFywnYlU67DVDmIITwjHU15kdagj18jYstx1A=="},"require":{"ionCubeLoader":"10.1.0"}} }, "7.8.0-beta.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "7.8.0-beta.1", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^5.6.0 || ^7.0.0 || ^7.1.0 || ^7.2.0 || ^7.3.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-7.8.0-beta.1.zip", "type": "zip" }, "time": "2019-07-23", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "0.7.4", "authorizenet/authorizenet": "1.9.6", "aws/aws-sdk-php": "3.69.2", "bitpay/php-client": "v3.0.0-p1", "bshaffer/oauth2-server-httpfoundation-bridge": "dev-develop", "bshaffer/oauth2-server-php": "v1.8.0", "composer/composer": "1.0.3-p1", "composer/semver": "1.4.2", "composer/spdx-licenses": "1.1.6", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "v1.4.0", "doctrine/inflector": "v1.1.0", "doctrine/instantiator": "1.0.5", "doctrine/lexer": "v1.0.1", "duosecurity/duo_php": "1.0.0", "ezyang/htmlpurifier": "v4.9.2", "facebook/graph-sdk": "5.5.0", "filp/whoops": "2.1.8", "firebase/php-jwt": "v3.0.0", "goetas-webservices/xsd2php-runtime": "v0.2.7", "google/apiclient": "v2.1.3-p1", "google/auth": "v0.11.1", "google/recaptcha": "1.1.2", "guzzlehttp/guzzle": "5.3.3", "guzzlehttp/promises": "v1.3.1", "guzzlehttp/psr7": "1.4.2", "guzzlehttp/ringphp": "1.1.1", "guzzlehttp/streams": "3.0.0", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v5.2.37", "illuminate/container": "v5.2.37", "illuminate/contracts": "v5.2.45", "illuminate/database": "v5.2.37-p2", "illuminate/events": "v5.2.37", "illuminate/support": "v5.2.37-p1", "illuminate/validation": "v5.2.45", "ircmaxell/password-compat": "v1.0.4", "jms/metadata": "1.6.0", "jms/parser-lib": "1.0.0", "jms/serializer": "1.8.1", "justinrainbow/json-schema": "1.6.1", "knplabs/knp-menu": "v2.1.1", "league/climate": "3.2.1", "league/flysystem": "1.0.45", "league/flysystem-aws-s3-v3": "1.0.21", "league/plates": "3.3.0", "michelf/php-markdown": "1.6.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "1.18.2", "mtdowling/jmespath.php": "2.4.0", "nesbot/carbon": "1.21.0", "nikic/fast-route": "v1.2.0", "paragonie/random_compat": "v1.4.2", "php-imap/php-imap": "2.0.9", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.0.7", "phpmyadmin/sql-parser": "v4.2.4", "phpoption/phpoption": "1.5.0", "phpseclib/mcrypt_compat": "1.0.5", "phpseclib/phpseclib": "2.0.10", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-message": "1.0.1", "psr/log": "1.0.2", "punic/punic": "1.6.3", "ramsey/uuid": "3.4.1", "react/promise": "v2.5.1", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.6.1", "seld/phar-utils": "1.0.1", "smarty/smarty": "v3.1.33-p1", "stripe/stripe-php": "v6.40.0", "symfony/config": "v3.2.14", "symfony/console": "v2.8.7", "symfony/dependency-injection": "v3.1.10", "symfony/filesystem": "v3.3.8", "symfony/finder": "v2.8.7", "symfony/http-foundation": "v2.8.7", "symfony/polyfill-iconv": "v1.2.0", "symfony/polyfill-mbstring": "v1.3.0", "symfony/polyfill-php54": "v1.5.0", "symfony/polyfill-php55": "v1.5.0", "symfony/process": "v3.3.8", "symfony/translation": "v2.8.7", "symfony/yaml": "v2.8.7", "tecnickcom/tcpdf": "6.2.26-p1", "zendframework/zend-diactoros": "1.3.10" }, "extra": {"sha":"191a30eea0ef0a968a8d723d951072dca23bb903615626a8d509efc85b221adc","sig":"MBt5ERuXpqYSY1RDW60pujGobxoAXs09uvGRI1BL9V0Xg3uap\/CrYKNZaTNgjSunKYF6taHiF8IY2lbW6d\/XcgzXmM1ZJr0zoa2WRw4QptYIBkxCuzKKwZYYrfv2L7kjzWXA6edTtjQ5IbdeG+\/E2u1bbEMY4rDttbEQiPggVRBjT\/1ACg4N0rPYfIbTf8kd5QW80\/1XV1hSlENRzDJeBmYmyIWTkUC0TBo8xxf2aT01MAMRbHq\/7Y5G1ALSjFs0sK0FyQ5uM5ejFWBwbUh2noCHe8w6kO8HFUzIH8vzq7ePhHGAEePHTUs+ifL\/jXIcpmpBfV+vUOqwcO8EmTBygQ==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_7.8.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelogs:WHMCS_V7.8.0","fileSize":"66636807","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"IdkzR\/oOifjl3UrylM9AHLbTzPPBPyS5Tir0tHiIldlri3raxZNdKwEqSu9Tj0K3SUTOAhMIdnPVKhme0fwzrE7kuU2xLhU2OoICh1NYOkBA520smcPavRQjaJ6p1qKx1JtvzwDx1DDOHTb+wk33326+XyAHNezXSX36EAbaJIg9FE2BJn+FHBjwtqb\/JHrdupY5QuXoy4WSwLvWhuuin4TNq1tSkj37XBRRZwJnpjPPHAzM4ba8k0U0PaqHsDACQIqHUXfTsVyVZ1iAnwRAPTfg0k1jjyUy4J9nhUJERXRkA51ln9EVqMRvA+PzW8oMkru7vJSIPQD3ix0AUlpwSg=="},"require":{"ionCubeLoader":"10.1.0"}} }, "7.7.1-release.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "7.7.1", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^5.6.0 || ^7.0.0 || ^7.1.0 || ^7.2.0 || ^7.3.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-7.7.1-release.1.zip", "type": "zip" }, "time": "now", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "psr/container": "1.0.0", "symfony/dependency-injection": "v3.1.10", "symfony/filesystem": "v3.3.8", "symfony/config": "v3.2.14", "bitpay/php-client": "v3.0.0-p1", "symfony/process": "v3.3.8", "symfony/finder": "v2.8.7", "symfony/polyfill-mbstring": "v1.3.0", "symfony/console": "v2.8.7", "seld/phar-utils": "1.0.1", "seld/jsonlint": "1.6.1", "seld/cli-prompt": "1.0.3", "justinrainbow/json-schema": "1.6.1", "composer/spdx-licenses": "1.1.6", "composer/semver": "1.4.2", "composer/composer": "1.0.3-p1", "phpseclib/phpseclib": "2.0.10", "psr/log": "1.0.2", "monolog/monolog": "1.18.2", "psr/http-message": "1.0.1", "guzzlehttp/psr7": "1.4.2", "react/promise": "v2.5.1", "guzzlehttp/streams": "3.0.0", "guzzlehttp/ringphp": "1.1.1", "guzzlehttp/guzzle": "5.3.3", "psr/cache": "1.0.1", "firebase/php-jwt": "v3.0.0", "google/auth": "v0.11.1", "google/apiclient": "v2.1.3-p1", "symfony/translation": "v2.8.7", "nesbot/carbon": "1.21.0", "paragonie/random_compat": "v1.4.2", "illuminate/contracts": "v5.2.45", "doctrine/inflector": "v1.1.0", "illuminate/support": "v5.2.37-p1", "illuminate/container": "v5.2.37", "illuminate/database": "v5.2.37-p2", "mtdowling/jmespath.php": "2.4.0", "guzzlehttp/promises": "v1.3.1", "aws/aws-sdk-php": "3.69.2", "league/flysystem": "1.0.45", "league/flysystem-aws-s3-v3": "1.0.21", "mindplay/readable": "1.1.1", "http-interop/http-middleware": "0.4.1", "container-interop/container-interop": "1.2.0", "mindplay/middleman": "dev-whmcs_custom", "smarty/smarty": "v3.1.33-p1", "tecnickcom/tcpdf": "6.2.26-p1", "symfony/yaml": "v2.8.7", "doctrine/instantiator": "1.0.5", "doctrine/lexer": "v1.0.1", "doctrine/annotations": "v1.4.0", "abraham/twitteroauth": "0.7.4", "phpoption/phpoption": "1.5.0", "phpcollection/phpcollection": "0.5.0", "jms/parser-lib": "1.0.0", "jms/metadata": "1.6.0", "jms/serializer": "1.8.1", "goetas-webservices/xsd2php-runtime": "v0.2.7", "authorizenet/authorizenet": "1.9.6", "ircmaxell/password-compat": "v1.0.4", "symfony/polyfill-php55": "v1.5.0", "symfony/polyfill-php54": "v1.5.0", "symfony/http-foundation": "v2.8.7", "bshaffer/oauth2-server-php": "v1.8.0", "bshaffer/oauth2-server-httpfoundation-bridge": "dev-develop", "duosecurity/duo_php": "1.0.0", "ezyang/htmlpurifier": "v4.9.2", "facebook/graph-sdk": "5.5.0", "filp/whoops": "2.1.8", "google/recaptcha": "1.1.2", "illuminate/console": "v5.2.37", "illuminate/events": "v5.2.37", "illuminate/validation": "v5.2.45", "knplabs/knp-menu": "v2.1.1", "league/climate": "3.2.1", "league/plates": "3.3.0", "michelf/php-markdown": "1.6.0", "nikic/fast-route": "v1.2.0", "http-interop/http-factory": "0.2.0", "middlewares/utils": "v0.9.0", "middlewares/fast-route": "v0.4.0", "php-imap/php-imap": "2.0.9", "phpmyadmin/sql-parser": "v4.2.4", "phpmailer/phpmailer": "v5.2.26", "phpseclib/mcrypt_compat": "1.0.5", "punic/punic": "1.6.3", "ramsey/uuid": "3.4.1", "stripe/stripe-php": "v3.23.0", "symfony/polyfill-iconv": "v1.2.0", "zendframework/zend-diactoros": "1.3.10" }, "extra": {"sha":"3712163779ab0d3899197e4cf35500bbce630ce3e54a7cb764e437647edaf91c","sig":"MUh2eeP9bNumrUzq2ruPlKxZLCKuDRsfRLyT9boz8ZFzilKfDrKquOAKXb75XD5AFp7vw33pHn2w6PrrFr2hTmCXCjP0fVc\/VYyix3QNd4KdhooGxxXXU1Ln8DPyJs+aqdvjU\/+F7jcsJymFj3nWfpCvavXOKGMTgvnuiuqSJvxY4T\/uMD\/8r0kWhJcnNPG7+FQYcod\/SniVMuSCtJOVG\/OVGFWnfKHvEluESkAZKGDiO+vy0qL\/qxUeaxCnAO20vJwBX4nOvRX2lFlluL70GBT0kmtFT+Mrg19YrK9e08m6SLUOjoBhfqG9Ed9feIFXgF\/vm43D\/hUUJbBLYjNCAw==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_7.7.1_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V7.7.1","fileSize":"65624890","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"nEYBJJixZUs8eKEUGGk9eZeoOHqiMmcw4ajo27N\/qfOmoSd8d5vc6EME3maRM+EfVfw9VL\/eRiVJp\/piLAssnQ1wyC8ItR0k5p5mRlK8GBZbda+REYaeZ16tv6L8UxXqkv2edXOiO1E9ew7gAc5RnfTymORCOgdAXVcyaf69lXNLV+2cK51Wn+7sbjDXF7F3hMZ9UGEt+Tc2Mjgjc44CLXIaEjUiIcxfvkSxrEy\/zN7UhNMsj9EI6hxweTIMVtxV0pnBRwBtIWj3+iZOU73nS0So7cB\/bipplA7nQLQh3VPzQF1K5Uy5eeRCWDw9hRdyZWphifZV6SGIAI1PgvCCww=="},"require":{"ionCubeLoader":"10.1.0"}} }, "7.7.0-release.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "7.7.0", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^5.6.0 || ^7.0.0 || ^7.1.0 || ^7.2.0 || ^7.3.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-7.7.0-release.1.zip", "type": "zip" }, "time": "now", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "psr/container": "1.0.0", "symfony/dependency-injection": "v3.1.10", "symfony/filesystem": "v3.3.8", "symfony/config": "v3.2.14", "bitpay/php-client": "v3.0.0-p1", "phpseclib/phpseclib": "2.0.10", "psr/log": "1.0.2", "monolog/monolog": "1.18.2", "psr/http-message": "1.0.1", "guzzlehttp/psr7": "1.4.2", "react/promise": "v2.5.1", "guzzlehttp/streams": "3.0.0", "guzzlehttp/ringphp": "1.1.1", "guzzlehttp/guzzle": "5.3.3", "psr/cache": "1.0.1", "firebase/php-jwt": "v3.0.0", "google/auth": "v0.11.1", "google/apiclient": "v2.1.3-p1", "symfony/polyfill-mbstring": "v1.3.0", "symfony/translation": "v2.8.7", "nesbot/carbon": "1.21.0", "paragonie/random_compat": "v1.4.2", "illuminate/contracts": "v5.2.45", "doctrine/inflector": "v1.1.0", "illuminate/support": "v5.2.37-p1", "illuminate/container": "v5.2.37", "illuminate/database": "v5.2.37-p2", "mtdowling/jmespath.php": "2.4.0", "guzzlehttp/promises": "v1.3.1", "aws/aws-sdk-php": "3.69.2", "league/flysystem": "1.0.45", "league/flysystem-aws-s3-v3": "1.0.21", "mindplay/readable": "1.1.1", "http-interop/http-middleware": "0.4.1", "container-interop/container-interop": "1.2.0", "mindplay/middleman": "dev-whmcs_custom", "smarty/smarty": "v3.1.33-p1", "symfony/yaml": "v2.8.7", "symfony/finder": "v2.8.7", "symfony/console": "v2.8.7", "doctrine/instantiator": "1.0.5", "symfony/process": "v3.3.8", "doctrine/lexer": "v1.0.1", "doctrine/annotations": "v1.4.0", "abraham/twitteroauth": "0.7.4", "phpoption/phpoption": "1.5.0", "phpcollection/phpcollection": "0.5.0", "jms/parser-lib": "1.0.0", "jms/metadata": "1.6.0", "jms/serializer": "1.8.1", "goetas-webservices/xsd2php-runtime": "v0.2.7", "authorizenet/authorizenet": "1.9.6", "ircmaxell/password-compat": "v1.0.4", "symfony/polyfill-php55": "v1.5.0", "symfony/polyfill-php54": "v1.5.0", "symfony/http-foundation": "v2.8.7", "bshaffer/oauth2-server-php": "v1.8.0", "bshaffer/oauth2-server-httpfoundation-bridge": "dev-develop", "seld/phar-utils": "1.0.1", "seld/jsonlint": "1.6.1", "seld/cli-prompt": "1.0.3", "justinrainbow/json-schema": "1.6.1", "composer/spdx-licenses": "1.1.6", "composer/semver": "1.4.2", "composer/composer": "1.0.3", "duosecurity/duo_php": "1.0.0", "ezyang/htmlpurifier": "v4.9.2", "facebook/graph-sdk": "5.5.0", "filp/whoops": "2.1.8", "google/recaptcha": "1.1.2", "illuminate/console": "v5.2.37", "illuminate/events": "v5.2.37", "illuminate/validation": "v5.2.45", "knplabs/knp-menu": "v2.1.1", "league/climate": "3.2.1", "league/plates": "3.3.0", "michelf/php-markdown": "1.6.0", "nikic/fast-route": "v1.2.0", "http-interop/http-factory": "0.2.0", "middlewares/utils": "v0.9.0", "middlewares/fast-route": "v0.4.0", "php-imap/php-imap": "2.0.9", "phpmyadmin/sql-parser": "v4.2.4", "phpmailer/phpmailer": "v5.2.26", "phpseclib/mcrypt_compat": "1.0.5", "punic/punic": "1.6.3", "ramsey/uuid": "3.4.1", "stripe/stripe-php": "v3.23.0", "symfony/polyfill-iconv": "v1.2.0", "tecnickcom/tcpdf": "6.2.26", "zendframework/zend-diactoros": "1.3.10" }, "extra": {"sha":"516704d0673ab5c156dcff1548082f4f09a8bb88a849302512c0170cd48e1ad2","sig":"MQVpRKf674+jDM2cOY0cRSVfGqo3mTeHVpl9lUPy5qUYu61NwgudITilA+EsGJbPE9A1cX8GQF2FKthns56tz944EVWAivlNGdK2D+VX3Mr\/7k0SWk9TpXEP29f+YEARos0Dp++scHfjgxzhZwUFFvdycGdWkDMKs6NZwz\/nfV8KdwFAJkQrcSIZmp+Syy42Q0zZxB7iKtkoYHAMEqt6uXL1T9VVlf3UsWhTzVecbomDfZMwkgmVyO0004Sc1PrGa6ohEhzY6sVj2YXxSR8hnH1FbQsQ2MLJpQ888wa+dhezldX+tBl+GnWzm4hZT0Y\/GH14f8jViZgRwCRwde6hTQ==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_7.7.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V7.7.0","fileSize":"65602654","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"ZvJi\/EwMeS4r0y3Sa\/zWNNmOdLYT4+x7VB4M18d1e7NiOb4jzMDCf1xJ7W35QYW\/H+xT580Fy7yVeyWDNOdLXkzbl0g3O4Cka84yQHNOFyUPNSx48kxocHjakCVpBWF1RATdGlMpkom8bRP7\/eiI5IuYLt0ok6Qo5ZVn7GN7fBjL4p7NOaDOKM7xETE9krD3Jro1OqphL9VrMTk1TnOZYsgVT\/MNIhpwByt5NammeKMSZ3w5UCt0RHIuKhQAFTPrgVTd8rsaeDXZ3DbmnTEao9DA5KD+tN3kDsNabRBhsuJrDXOQoIKfuFVhAT\/q3Q77vXxWIa4bCEnPcDZFRJyl7Q=="},"require":{"ionCubeLoader":"10.1.0"}} }, "7.7.0-rc.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "7.7.0-RC.1", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^5.6.0 || ^7.0.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-7.7.0-rc.1.zip", "type": "zip" }, "time": "now", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "psr/container": "1.0.0", "symfony/dependency-injection": "v3.1.10", "symfony/filesystem": "v3.3.8", "symfony/config": "v3.2.14", "bitpay/php-client": "v3.0.0-p1", "phpseclib/phpseclib": "2.0.10", "psr/log": "1.0.2", "monolog/monolog": "1.18.2", "psr/http-message": "1.0.1", "guzzlehttp/psr7": "1.4.2", "react/promise": "v2.5.1", "guzzlehttp/streams": "3.0.0", "guzzlehttp/ringphp": "1.1.0", "guzzlehttp/guzzle": "5.3.1", "psr/cache": "1.0.1", "firebase/php-jwt": "v3.0.0", "google/auth": "v0.11.1", "google/apiclient": "v2.1.3-p1", "symfony/polyfill-mbstring": "v1.3.0", "symfony/translation": "v2.8.7", "nesbot/carbon": "1.21.0", "paragonie/random_compat": "v1.4.2", "illuminate/contracts": "v5.2.45", "doctrine/inflector": "v1.1.0", "illuminate/support": "v5.2.37-p1", "illuminate/container": "v5.2.37", "illuminate/database": "v5.2.37-p2", "mtdowling/jmespath.php": "2.4.0", "guzzlehttp/promises": "v1.3.1", "aws/aws-sdk-php": "3.69.2", "league/flysystem": "1.0.45", "league/flysystem-aws-s3-v3": "1.0.21", "mindplay/readable": "1.1.1", "http-interop/http-middleware": "0.4.1", "container-interop/container-interop": "1.2.0", "mindplay/middleman": "dev-whmcs_custom", "smarty/smarty": "v3.1.33-p1", "symfony/yaml": "v2.8.7", "symfony/finder": "v2.8.7", "symfony/console": "v2.8.7", "doctrine/instantiator": "1.0.5", "symfony/process": "v3.3.8", "doctrine/lexer": "v1.0.1", "doctrine/annotations": "v1.4.0", "abraham/twitteroauth": "0.7.4", "phpoption/phpoption": "1.5.0", "phpcollection/phpcollection": "0.5.0", "jms/parser-lib": "1.0.0", "jms/metadata": "1.6.0", "jms/serializer": "1.8.1", "goetas-webservices/xsd2php-runtime": "v0.2.7", "authorizenet/authorizenet": "1.9.6", "ircmaxell/password-compat": "v1.0.4", "symfony/polyfill-php55": "v1.5.0", "symfony/polyfill-php54": "v1.5.0", "symfony/http-foundation": "v2.8.7", "bshaffer/oauth2-server-php": "v1.8.0", "bshaffer/oauth2-server-httpfoundation-bridge": "dev-develop", "seld/phar-utils": "1.0.1", "seld/jsonlint": "1.6.1", "seld/cli-prompt": "1.0.3", "justinrainbow/json-schema": "1.6.1", "composer/spdx-licenses": "1.1.6", "composer/semver": "1.4.2", "composer/composer": "1.0.3", "duosecurity/duo_php": "1.0.0", "ezyang/htmlpurifier": "v4.9.2", "facebook/graph-sdk": "5.5.0", "filp/whoops": "2.1.8", "google/recaptcha": "1.1.2", "illuminate/console": "v5.2.37", "illuminate/events": "v5.2.37", "illuminate/validation": "v5.2.45", "knplabs/knp-menu": "v2.1.1", "league/climate": "3.2.1", "league/plates": "3.3.0", "michelf/php-markdown": "1.6.0", "nikic/fast-route": "v1.2.0", "http-interop/http-factory": "0.2.0", "middlewares/utils": "v0.9.0", "middlewares/fast-route": "v0.4.0", "php-imap/php-imap": "2.0.9", "phpmyadmin/sql-parser": "v4.2.4", "phpmailer/phpmailer": "v5.2.26", "phpseclib/mcrypt_compat": "1.0.5", "punic/punic": "1.6.3", "ramsey/uuid": "3.4.1", "stripe/stripe-php": "v3.23.0", "symfony/polyfill-iconv": "v1.2.0", "tecnickcom/tcpdf": "6.2.26", "zendframework/zend-diactoros": "1.3.10" }, "extra": {"sha":"0ac5dd177494fada38547f2c56f64000090574a704b9fde9dac7ee5b48b4bd49","sig":"bx7ETEDhznGGOgOg1Mc3dG9FBshOdbLuOCgBe1jbZdIjnMYKzwkIJEyLRib97w+hJM4sZhR\/iV4IGljQOVbJ\/3Qfwr4Q4qrJdOjIbnqs770k7K04o9uhrjOKXpE8gw9uEe1aogeJNcLT81cxMO5xk6RFhb3jfsxtV0c9cJMVgNLR+oNUbvYoQxossoTSfacmMAtRHhE2T19E1y6zgn8V5zsqmTKPe\/2U2SncTMS1RqkkpbVkmI59euSrw73Rz+tivWcOZe+xpbqVIXUu2P6UhK6\/Lt+b77L+piMhs10znfJEXxn0R4H2mmUset1aJHJle3HXZLg4uAY3LUvfYGe54g==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_7.7.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V7.7.0_RC_1","fileSize":"65447303","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"F0yw5pOHXJFnWYTtqQlfFXeFuzDmcxqwsaARXA9tgWP2I\/XIEoItYROjcriZPqllje4OtabmDa0uLLwLOi8sc9Ut6vZzbOw1nXHcXGCD4+WgYXhVT7ug1aojiFnzPAigJX8dCaIAjquYvKgJxuVJzqFeBJVtsY2dm05Q1zhU67ZBHBROm7nEpgZx5bSfCKE5sBZk7PkukbpyZFVEdj0NDQw+9PP6GxYg3EljU8a1IJ\/mf8BZdI5rxWPUSQuBHDR+WOhzoIxF4nedoeYTLZFba5StM3xdxfEMyBbNb5MYsp5ZgUBhJ6p89UCYYrTOw88ttfLDRXJ98pmRAT2XaIjVwA=="},"require":{"ionCubeLoader":"10.1.0"}} }, "7.7.0-beta.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "7.7.0-beta.1", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^5.6.0 || ^7.0.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-7.7.0-beta.1.zip", "type": "zip" }, "time": "now", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "psr/container": "1.0.0", "symfony/dependency-injection": "v3.1.10", "symfony/filesystem": "v3.3.8", "symfony/config": "v3.2.14", "bitpay/php-client": "v3.0.0-p1", "phpseclib/phpseclib": "2.0.10", "psr/log": "1.0.2", "monolog/monolog": "1.18.2", "psr/http-message": "1.0.1", "guzzlehttp/psr7": "1.4.2", "react/promise": "v2.5.1", "guzzlehttp/streams": "3.0.0", "guzzlehttp/ringphp": "1.1.0", "guzzlehttp/guzzle": "5.3.1", "psr/cache": "1.0.1", "firebase/php-jwt": "v3.0.0", "google/auth": "v0.11.1", "google/apiclient": "v2.1.3-p1", "symfony/polyfill-mbstring": "v1.3.0", "symfony/translation": "v2.8.7", "nesbot/carbon": "1.21.0", "paragonie/random_compat": "v1.4.2", "illuminate/contracts": "v5.2.45", "doctrine/inflector": "v1.1.0", "illuminate/support": "v5.2.37-p1", "illuminate/container": "v5.2.37", "illuminate/database": "v5.2.37-p2", "mtdowling/jmespath.php": "2.4.0", "guzzlehttp/promises": "v1.3.1", "aws/aws-sdk-php": "3.69.2", "league/flysystem": "1.0.45", "league/flysystem-aws-s3-v3": "1.0.21", "mindplay/readable": "1.1.1", "http-interop/http-middleware": "0.4.1", "container-interop/container-interop": "1.2.0", "mindplay/middleman": "dev-whmcs_custom", "smarty/smarty": "v3.1.33-p1", "symfony/yaml": "v2.8.7", "symfony/finder": "v2.8.7", "symfony/console": "v2.8.7", "doctrine/instantiator": "1.0.5", "symfony/process": "v3.3.8", "doctrine/lexer": "v1.0.1", "doctrine/annotations": "v1.4.0", "abraham/twitteroauth": "0.7.4", "phpoption/phpoption": "1.5.0", "phpcollection/phpcollection": "0.5.0", "jms/parser-lib": "1.0.0", "jms/metadata": "1.6.0", "jms/serializer": "1.8.1", "goetas-webservices/xsd2php-runtime": "v0.2.7", "authorizenet/authorizenet": "1.9.6", "ircmaxell/password-compat": "v1.0.4", "symfony/polyfill-php55": "v1.5.0", "symfony/polyfill-php54": "v1.5.0", "symfony/http-foundation": "v2.8.7", "bshaffer/oauth2-server-php": "v1.8.0", "bshaffer/oauth2-server-httpfoundation-bridge": "dev-develop", "seld/phar-utils": "1.0.1", "seld/jsonlint": "1.6.1", "seld/cli-prompt": "1.0.3", "justinrainbow/json-schema": "1.6.1", "composer/spdx-licenses": "1.1.6", "composer/semver": "1.4.2", "composer/composer": "1.0.3", "duosecurity/duo_php": "1.0.0", "ezyang/htmlpurifier": "v4.9.2", "facebook/graph-sdk": "5.5.0", "filp/whoops": "2.1.8", "google/recaptcha": "1.1.2", "illuminate/console": "v5.2.37", "illuminate/events": "v5.2.37", "illuminate/validation": "v5.2.45", "knplabs/knp-menu": "v2.1.1", "league/climate": "3.2.1", "league/plates": "3.3.0", "michelf/php-markdown": "1.6.0", "nikic/fast-route": "v1.2.0", "http-interop/http-factory": "0.2.0", "middlewares/utils": "v0.9.0", "middlewares/fast-route": "v0.4.0", "php-imap/php-imap": "2.0.9", "phpmyadmin/sql-parser": "v4.2.4", "phpmailer/phpmailer": "v5.2.26", "phpseclib/mcrypt_compat": "1.0.5", "punic/punic": "1.6.3", "ramsey/uuid": "3.4.1", "stripe/stripe-php": "v3.23.0", "symfony/polyfill-iconv": "v1.2.0", "tecnickcom/tcpdf": "6.2.26", "zendframework/zend-diactoros": "1.3.10" }, "extra": {"sha":"69d29fca84a80df47fa98046ac7aff4ea2e6ab5c5358c8f80f26492f48fad8cf","sig":"EwyexZdDKw1Mil3fZTcuTLESciCvNj9y\/cgwCokynj18KwM4dMACx9VV05r5pPD1coCrKidtWgjGRMC4FVvM+n4R7j2vhuqb9+NmV7uQ8hHVFBULuLloffsLNuzcRHw4i4w157M1JD\/hOeno0L9Em1lOx43sKfxaNY0zz51Z+hb6obOFCJfIaBK7FMpxZVsxTR2iApEYC2I3obwz42ruc5te\/Qw9LVyo4TfwRqJYZ3Ho8JgtMM\/XkxR5RtIVPJ2h\/mgvXwRg0++kzwDefsRfbZpjLZHI54zAozPnX1f+vC6D+hiKld72tWrX5YSOzGiNAiqYvuqzqjPPtVlH9HwjOw==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_7.7.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V7.7.0_Beta_1","fileSize":"85995514","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"Igm3DOL836BCi5f1egIv1DCQ5CD2XIXeTyQwTeVrv8oxFuwZNF4WEIQANz1Q9\/YIx3cmjYsHQlA49Ku6vvcLuQQCa9Fhj+ZA6ZOf1HdBYG7YfDP+UckfoWohsklpYt6iwpdfabclVFSDCQrm7NvYZTgESeIcohlsD9u8KAlAVUxYouSX+Hxok13qQRRarqkLcGzzTu3h\/PecMYHmCer6au0TPOhR4SxFv5R\/B\/UxycNyNpHLtLnmllWPGptWC49kWKYsLq8EXkh3betoRMafZTcARbuiiobAU+9wvwtQLJuWyFyX9TWmi+iLhundgjoiYDmFScPcHsLXYscjdUeqbQ=="},"require":{"ionCubeLoader":"10.1.0"}} }, "7.6.2-release.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "7.6.2", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^5.6.0 || ^7.0.0 || ^7.1.0 || ^7.2.0 || ^7.3.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-7.6.2-release.1.zip", "type": "zip" }, "time": "2019-01-15", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "phpseclib/phpseclib": "2.0.10", "psr/log": "1.0.2", "monolog/monolog": "1.18.2", "psr/http-message": "1.0.1", "guzzlehttp/psr7": "1.4.2", "react/promise": "v2.5.1", "guzzlehttp/streams": "3.0.0", "guzzlehttp/ringphp": "1.1.1", "guzzlehttp/guzzle": "5.3.3", "psr/cache": "1.0.1", "firebase/php-jwt": "v3.0.0", "google/auth": "v0.11.1", "google/apiclient": "v2.1.3-p1", "symfony/polyfill-mbstring": "v1.3.0", "symfony/translation": "v2.8.7", "nesbot/carbon": "1.21.0", "paragonie/random_compat": "v1.4.2", "illuminate/contracts": "v5.2.45", "doctrine/inflector": "v1.1.0", "illuminate/support": "v5.2.37", "illuminate/container": "v5.2.37", "illuminate/database": "v5.2.37-p1", "mindplay/readable": "1.1.1", "http-interop/http-middleware": "0.4.1", "psr/container": "1.0.0", "container-interop/container-interop": "1.2.0", "mindplay/middleman": "dev-whmcs_custom", "smarty/smarty": "v3.1.33-p1", "symfony/yaml": "v2.8.7", "symfony/finder": "v2.8.7", "symfony/console": "v2.8.7", "doctrine/instantiator": "1.0.5", "symfony/process": "v3.3.8", "doctrine/lexer": "v1.0.1", "doctrine/annotations": "v1.4.0", "abraham/twitteroauth": "0.7.4", "phpoption/phpoption": "1.5.0", "phpcollection/phpcollection": "0.5.0", "jms/parser-lib": "1.0.0", "jms/metadata": "1.6.0", "jms/serializer": "1.8.1", "goetas-webservices/xsd2php-runtime": "v0.2.7", "authorizenet/authorizenet": "1.9.6", "ircmaxell/password-compat": "v1.0.4", "symfony/polyfill-php55": "v1.5.0", "symfony/polyfill-php54": "v1.5.0", "symfony/http-foundation": "v2.8.7", "bshaffer/oauth2-server-php": "v1.8.0", "bshaffer/oauth2-server-httpfoundation-bridge": "dev-develop", "symfony/filesystem": "v3.3.8", "seld/phar-utils": "1.0.1", "seld/jsonlint": "1.6.1", "seld/cli-prompt": "1.0.3", "justinrainbow/json-schema": "1.6.1", "composer/spdx-licenses": "1.1.6", "composer/semver": "1.4.2", "composer/composer": "1.0.3", "duosecurity/duo_php": "1.0.0", "ezyang/htmlpurifier": "v4.9.2", "facebook/graph-sdk": "5.5.0", "filp/whoops": "2.1.8", "google/recaptcha": "1.1.2", "illuminate/console": "v5.2.37", "illuminate/events": "v5.2.37", "illuminate/validation": "v5.2.45", "knplabs/knp-menu": "v2.1.1", "league/climate": "3.2.1", "league/plates": "3.3.0", "michelf/php-markdown": "1.6.0", "nikic/fast-route": "v1.2.0", "http-interop/http-factory": "0.2.0", "middlewares/utils": "v0.9.0", "middlewares/fast-route": "v0.4.0", "php-imap/php-imap": "2.0.9", "phpmyadmin/sql-parser": "v4.2.4", "phpmailer/phpmailer": "v5.2.26", "phpseclib/mcrypt_compat": "1.0.5", "punic/punic": "1.6.3", "ramsey/uuid": "3.4.1", "stripe/stripe-php": "v3.23.0", "symfony/polyfill-iconv": "v1.2.0", "tecnickcom/tcpdf": "6.2.26", "zendframework/zend-diactoros": "1.3.10" }, "extra": {"sha":"2b05e99ad558a198afdafe7229d131ac02b15e8c2a621a7d437bd0759d67b324","sig":"c7TDz7jNRoRs479m+1HcaxAbg2mIo1hm0KyFb4uwJvRNfO3VB+hJ74K7IyGHWJbwxrbmtx2d7aUwt4\/PBcqgWROFW26eUKWgLH6CrGaPXORL0W6jnTZN2fdqsOsxZe5c6b833UdHIB8id\/+CKiIdyvI0GPutmSUB8QX66Lvvx5EuH10dyjXsG1vn8GejtBWqkq0ING0z5w9wQrQtCtqEBN9GX2TnpdcxD9LTngVsV0GAD0MRdm1q\/Yj0W1QdSqN5e9ZSUbUg6wzYhtRwwmsyYfMs3SQpz5BDbZL9iqqZvH5rtp6JzemJrx4IzbhHZ072Rz3d43J1n3N2dQ5nDW2SLQ==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_7.6.2_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V7.6.2","fileSize":"68893299","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"VA2w7B6Qm9K2bwc1hxYB2bwKmzUCHrjZiQQOEgu2tQaTgblS3ljNllXoegH\/7XqSs0GNHxtLLRJqvv68T4tyAvRXGxkQ7pPSBoAg9Be0LUmXvQZgWz1oYW9nmxjvftNcTjEhIy\/uKMSTGNIxLE5QiZI08OXLc\/uqSoNcDMAJiel87DzbwGQWoCK0JxMfiyYm0DTSVuo+SdR2YOM\/gqWVjzfky2v3D9osrKwkIFs6ED9Ga+dTDaWuO27uPj76zg\/x69WXCTK9k\/HauMJ\/hLZb3ck\/tQrR67Rcy2TyGoe0ej1y2tBuLEi+KgpaZDb\/XvoNhTIK3\/Wkb16BpYkq1gPBpw=="},"require":{"ionCubeLoader":"10.1.0"}} }, "7.6.1-release.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "7.6.1", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^5.6.0 || ^7.0.0 || ^7.1.0 || ^7.2.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-7.6.1-release.1.zip", "type": "zip" }, "time": "2018-08-28", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "phpseclib/phpseclib": "2.0.10", "psr/log": "1.0.2", "monolog/monolog": "1.18.2", "psr/http-message": "1.0.1", "guzzlehttp/psr7": "1.4.2", "react/promise": "v2.5.1", "guzzlehttp/streams": "3.0.0", "guzzlehttp/ringphp": "1.1.0", "guzzlehttp/guzzle": "5.3.1", "psr/cache": "1.0.1", "firebase/php-jwt": "v3.0.0", "google/auth": "v0.11.1", "google/apiclient": "v2.1.3-p1", "symfony/polyfill-mbstring": "v1.3.0", "symfony/translation": "v2.8.7", "nesbot/carbon": "1.21.0", "paragonie/random_compat": "v1.4.2", "illuminate/contracts": "v5.2.45", "doctrine/inflector": "v1.1.0", "illuminate/support": "v5.2.37", "illuminate/container": "v5.2.37", "illuminate/database": "v5.2.37-p1", "mindplay/readable": "1.1.1", "http-interop/http-middleware": "0.4.1", "psr/container": "1.0.0", "container-interop/container-interop": "1.2.0", "mindplay/middleman": "dev-whmcs_custom", "symfony/yaml": "v2.8.7", "symfony/finder": "v2.8.7", "symfony/console": "v2.8.7", "doctrine/instantiator": "1.0.5", "symfony/process": "v3.3.8", "doctrine/lexer": "v1.0.1", "doctrine/annotations": "v1.4.0", "abraham/twitteroauth": "0.7.4", "phpoption/phpoption": "1.5.0", "phpcollection/phpcollection": "0.5.0", "jms/parser-lib": "1.0.0", "jms/metadata": "1.6.0", "jms/serializer": "1.8.1", "goetas-webservices/xsd2php-runtime": "v0.2.7", "authorizenet/authorizenet": "1.9.6", "ircmaxell/password-compat": "v1.0.4", "symfony/polyfill-php55": "v1.5.0", "symfony/polyfill-php54": "v1.5.0", "symfony/http-foundation": "v2.8.7", "bshaffer/oauth2-server-php": "v1.8.0", "bshaffer/oauth2-server-httpfoundation-bridge": "dev-develop", "symfony/filesystem": "v3.3.8", "seld/phar-utils": "1.0.1", "seld/jsonlint": "1.6.1", "seld/cli-prompt": "1.0.3", "justinrainbow/json-schema": "1.6.1", "composer/spdx-licenses": "1.1.6", "composer/semver": "1.4.2", "composer/composer": "1.0.3", "duosecurity/duo_php": "1.0.0", "ezyang/htmlpurifier": "v4.9.2", "facebook/graph-sdk": "5.5.0", "filp/whoops": "2.1.8", "google/recaptcha": "1.1.2", "illuminate/console": "v5.2.37", "illuminate/events": "v5.2.37", "illuminate/validation": "v5.2.45", "knplabs/knp-menu": "v2.1.1", "league/climate": "3.2.1", "league/plates": "3.3.0", "michelf/php-markdown": "1.6.0", "nikic/fast-route": "v1.2.0", "http-interop/http-factory": "0.2.0", "middlewares/utils": "v0.9.0", "middlewares/fast-route": "v0.4.0", "php-imap/php-imap": "2.0.9", "phpmyadmin/sql-parser": "v4.2.4", "phpmailer/phpmailer": "v5.2.26", "phpseclib/mcrypt_compat": "1.0.5", "punic/punic": "1.6.3", "ramsey/uuid": "3.4.1", "smarty/smarty": "v3.1.32", "stripe/stripe-php": "v3.23.0", "symfony/polyfill-iconv": "v1.2.0", "tecnickcom/tcpdf": "6.2.17", "zendframework/zend-diactoros": "1.3.10" }, "extra": {"sha":"042457f0a0374364cf36d1cef07c949921b025bfc18fb1c066fa8792546bb749","sig":"OxQkPMjJChhMAUzLUrrysUVz+5xKqJyMOcBruyewIH86sHMfwn489y\/gAayku7cq1IAsowGMNyfro0\/YkGTAJe+6n6mXaQ3gJo4W0ZGg+wiVqJv7W5gq6kbcn3tybXa\/XyV5pl9dIU+VqQEOeAr3i1j8AO8dBvVi+o8gyluYg5lyWbcvBf7MTUk2EWF5AsTt7YjmY3PjsbqGYgr8TiTMAq4oNqnbfVfQ48DeyxIEf5uNsPsS+xerYbvgmtc2LpjSw\/ouLKfsTz5WrlXRQ+Ohhq7q4gr2woC\/d+nT\/YWKM\/U0d0TvlCuF5295VKhWiZdTmjS7miZE3yU9f9AWpfYn4w==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_7.6.1_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V7.6.1","fileSize":"80445819","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"OF\/FW1YLuZzTOQ663Wb3alM14L3hUuLDoexUs2I1+WxMFwewTJkvDWDuSFFjPBmMIGCSHSCouKM+6qVNmNjTRpKe441yolqyaDHU3JGjlEBuuAD6VnoaujElzb\/oUYkUsUjxlW8rZvrcwbRawTPn\/63Y9BvQH3JNkQKEpZDWRy9jaW7GP964n5RCyvltRz2hktZOtjpQy7vcPbAtkfJMY61pG1LDpaAk7rxmYZuhOCLtFJVjaWd4E1cqhemcfy8Ml3l6xFt4C3mr6A2Z1t8cMWh7tpgwtMdcS8M+QFxpZkRQtzGI1OX1EX33BLCRc6UHGh8if+nrmDwxuKobRR3Fsg=="},"require":{"ionCubeLoader":"10.1.0"}} }, "7.6.0-release.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "7.6.0", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^5.6.0 || ^7.0.0 || ^7.1.0 || ^7.2.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-7.6.0-release.1.zip", "type": "zip" }, "time": "2018-07-31", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "phpseclib/phpseclib": "2.0.10", "psr/log": "1.0.2", "monolog/monolog": "1.18.2", "psr/http-message": "1.0.1", "guzzlehttp/psr7": "1.4.2", "react/promise": "v2.5.1", "guzzlehttp/streams": "3.0.0", "guzzlehttp/ringphp": "1.1.0", "guzzlehttp/guzzle": "5.3.1", "psr/cache": "1.0.1", "firebase/php-jwt": "v3.0.0", "google/auth": "v0.11.1", "google/apiclient": "v2.1.3-p1", "symfony/polyfill-mbstring": "v1.3.0", "symfony/translation": "v2.8.7", "nesbot/carbon": "1.21.0", "paragonie/random_compat": "v1.4.2", "illuminate/contracts": "v5.2.45", "doctrine/inflector": "v1.1.0", "illuminate/support": "v5.2.37", "illuminate/container": "v5.2.37", "illuminate/database": "v5.2.37-p1", "mindplay/readable": "1.1.1", "http-interop/http-middleware": "0.4.1", "psr/container": "1.0.0", "container-interop/container-interop": "1.2.0", "mindplay/middleman": "dev-whmcs_custom", "symfony/yaml": "v2.8.7", "symfony/finder": "v2.8.7", "symfony/console": "v2.8.7", "doctrine/instantiator": "1.0.5", "symfony/process": "v3.3.8", "doctrine/lexer": "v1.0.1", "doctrine/annotations": "v1.4.0", "abraham/twitteroauth": "0.7.4", "phpoption/phpoption": "1.5.0", "phpcollection/phpcollection": "0.5.0", "jms/parser-lib": "1.0.0", "jms/metadata": "1.6.0", "jms/serializer": "1.8.1", "goetas-webservices/xsd2php-runtime": "v0.2.7", "authorizenet/authorizenet": "1.9.6", "ircmaxell/password-compat": "v1.0.4", "symfony/polyfill-php55": "v1.5.0", "symfony/polyfill-php54": "v1.5.0", "symfony/http-foundation": "v2.8.7", "bshaffer/oauth2-server-php": "v1.8.0", "bshaffer/oauth2-server-httpfoundation-bridge": "dev-develop", "symfony/filesystem": "v3.3.8", "seld/phar-utils": "1.0.1", "seld/jsonlint": "1.6.1", "seld/cli-prompt": "1.0.3", "justinrainbow/json-schema": "1.6.1", "composer/spdx-licenses": "1.1.6", "composer/semver": "1.4.2", "composer/composer": "1.0.3", "duosecurity/duo_php": "1.0.0", "ezyang/htmlpurifier": "v4.9.2", "facebook/graph-sdk": "5.5.0", "filp/whoops": "2.1.8", "google/recaptcha": "1.1.2", "illuminate/console": "v5.2.37", "illuminate/events": "v5.2.37", "illuminate/validation": "v5.2.45", "knplabs/knp-menu": "v2.1.1", "league/climate": "3.2.1", "league/plates": "3.3.0", "michelf/php-markdown": "1.6.0", "nikic/fast-route": "v1.2.0", "http-interop/http-factory": "0.2.0", "middlewares/utils": "v0.9.0", "middlewares/fast-route": "v0.4.0", "php-imap/php-imap": "2.0.9", "phpmyadmin/sql-parser": "v4.2.4", "phpmailer/phpmailer": "v5.2.26", "phpseclib/mcrypt_compat": "1.0.5", "punic/punic": "1.6.3", "ramsey/uuid": "3.4.1", "smarty/smarty": "v3.1.32", "stripe/stripe-php": "v3.23.0", "symfony/polyfill-iconv": "v1.2.0", "tecnickcom/tcpdf": "6.2.17", "zendframework/zend-diactoros": "1.3.10" }, "extra": {"sha":"811e342c57c8fdba9018eba5ba7117154ec1538267f34ecfc9791adb302e10c6","sig":"f\/5GIQPlIrEucpGtYI6Z6yuEvvxghXVM5Kq1xV2KKem9cdVxVS+3QSfAbZ5fGoPaW3\/NN4ENx0Xj37Rl58\/gkfR5inA8aNUiEjUcMgyzizljJUeCybbdxdLQDyXSoY9DQjd2mN\/xcf80YbsDObaF\/CF4NQ3zR6ma\/XxFVcjWF+Vt2WE1gQbcVht7O5PK0c5d44HRoYQ9NCWRXtnZAg6hlPZ1mGbcxv2Wdr9mmRFeFj8ZPmu1IiZ\/UbImHxIj6PT8IxZ4Hr\/GQkL2WmAoq2PjkU6n59Y8hoY1xaeWfJo5mksFiFqVYZb\/rC26fJTsinSq3VWeYtSYa7QZmxmDfUssUw==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_7.6.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V7.6.0","fileSize":"80406837","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"nbMhdi0DktZaGAmLKsEzrF+ZHbbUOP3I0sJV0kr1H6TRYA7S8jASnqVjxj3WzqPmqjhbtnXVjiOcvlx1mWO6zHHVVwKGNld9ZKF0yf0ZIfLxxWmdLfrol2bKjq5u3SaCu6jQDRdSaoiLHsVjyNlyY4xcLeIhH\/3QvHYWWy0rbV\/Yu1XazWlIz0vBXPYbS5nKvFrdKnTwDHI3jH\/oz\/fz5QR0Q9t3AeotqRv+Rty7WHkWfBF4Ntsb8VybFoWVQlwC+7qVOM+BdM5WfTYhaHqwZh4T5oDhgexHYqzA925qio2J2kbWUTKWw+iO8+ktotFZhaC89OyKy7zqRKqoabHLxQ=="},"require":{"ionCubeLoader":"10.1.0"}} }, "7.6.0-rc.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "7.6.0-RC.1", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^5.6.0 || ^7.0.0 || ^7.1.0 || ^7.2.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-7.6.0-rc.1.zip", "type": "zip" }, "time": "2018-07-17", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "0.7.4", "symfony/yaml": "v2.8.7", "doctrine/instantiator": "1.0.5", "doctrine/lexer": "v1.0.1", "doctrine/annotations": "v1.4.0", "phpoption/phpoption": "1.5.0", "phpcollection/phpcollection": "0.5.0", "jms/parser-lib": "1.0.0", "jms/metadata": "1.6.0", "jms/serializer": "1.8.1", "goetas-webservices/xsd2php-runtime": "v0.2.7", "authorizenet/authorizenet": "1.9.6", "bshaffer/oauth2-server-php": "v1.8.0", "symfony/polyfill-mbstring": "v1.3.0", "ircmaxell/password-compat": "v1.0.4", "symfony/polyfill-php55": "v1.5.0", "symfony/polyfill-php54": "v1.5.0", "symfony/http-foundation": "v2.8.7", "bshaffer/oauth2-server-httpfoundation-bridge": "dev-develop", "duosecurity/duo_php": "1.0.0", "ezyang/htmlpurifier": "v4.9.2", "facebook/graph-sdk": "5.5.0", "psr/log": "1.0.2", "filp/whoops": "2.1.8", "google/recaptcha": "1.1.2", "phpseclib/phpseclib": "2.0.10", "monolog/monolog": "1.18.2", "psr/http-message": "1.0.1", "guzzlehttp/psr7": "1.4.2", "react/promise": "v2.5.1", "guzzlehttp/streams": "3.0.0", "guzzlehttp/ringphp": "1.1.0", "guzzlehttp/guzzle": "5.3.1", "psr/cache": "1.0.1", "firebase/php-jwt": "v3.0.0", "google/auth": "v0.11.1", "google/apiclient": "v2.1.3-p1", "symfony/console": "v2.8.7", "symfony/translation": "v2.8.7", "nesbot/carbon": "1.21.0", "paragonie/random_compat": "v1.4.2", "illuminate/contracts": "v5.2.45", "doctrine/inflector": "v1.1.0", "illuminate/support": "v5.2.37", "illuminate/console": "v5.2.37", "illuminate/container": "v5.2.37", "illuminate/database": "v5.2.37-p1", "illuminate/events": "v5.2.37", "illuminate/validation": "v5.2.45", "knplabs/knp-menu": "v2.1.1", "seld/cli-prompt": "1.0.3", "league/climate": "3.2.1", "league/plates": "3.3.0", "michelf/php-markdown": "1.6.0", "http-interop/http-middleware": "0.4.1", "http-interop/http-factory": "0.2.0", "middlewares/utils": "v0.9.0", "nikic/fast-route": "v1.2.0", "middlewares/fast-route": "v0.4.0", "mindplay/readable": "1.1.1", "psr/container": "1.0.0", "container-interop/container-interop": "1.2.0", "mindplay/middleman": "dev-whmcs_custom", "php-imap/php-imap": "2.0.9", "phpmyadmin/sql-parser": "v4.2.4", "phpmailer/phpmailer": "v5.2.26", "phpseclib/mcrypt_compat": "1.0.5", "punic/punic": "1.6.3", "ramsey/uuid": "3.4.1", "smarty/smarty": "v3.1.32", "stripe/stripe-php": "v3.23.0", "symfony/polyfill-iconv": "v1.2.0", "tecnickcom/tcpdf": "6.2.17", "zendframework/zend-diactoros": "1.3.10", "symfony/finder": "v2.8.7", "symfony/process": "v3.3.8", "seld/phar-utils": "1.0.1", "symfony/filesystem": "v3.3.8", "seld/jsonlint": "1.6.1", "composer/semver": "1.4.2", "composer/spdx-licenses": "1.1.6", "justinrainbow/json-schema": "1.6.1", "composer/composer": "1.0.3" }, "extra": {"sha":"529c52b7199405c4529299b01456b4b2158d2065852b0a0fa403ee4b5861e8e4","sig":"aShOtJLkzZ1mZnL20kz\/ewiItB6vPVT3sxRE\/5cNb4vJg2W1zFYSZMePLUwYAo74+WMNdC7d9xFMCl14b5hvqcs\/1UNJNZ1+beA7jYz0xM9AXaWGzY4ONHKBXUvw\/Z9ZJMDC+rnVmLkcKYJqoHUbrDKETLSaJkJ4xWEkfc0VgGoiWjCEXZRUBNKpWokOH50wgDR+UU5YVV7rtc7WN8bPybEUNbaiJQPE7wv9DXX8sP4BWKtSYFQ4UKNocbHlfWH3fLUznI1PriXBO\/pYVHIvM6htiK3FtMw4IpFwczcErN6Mqo4yG+xmbkuxBWh5p8dVFQRc9op6Id8UVkjOeFgJPA==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_7.6.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V7.6.0_RC_1","fileSize":"77695220","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"enDj7xHvz+Qmv1rcnsyZ9LHYPqGDbmcR4P0CKGO1cVjnmWVekLCUwqXY0xfR5Y82eta+EvbwkKa2O2NNAoLrf2naFt+AD5buIhnQQ97LjiEdjP8EwYx4IsPPIjN+ZxVJ2Qdkv2NJiLUIAXaKwd8D6vNWcWjIEBjI56zPbtcHKRzu+ht3zMiC0rPmlMiDkYV0nnFlAw8eSWatpl1v\/s18+XoUBYEHd1GJCs+X\/QanBVPmMOsL0fD8CY5eP0aKH5WYCoonLcctNsrgTzJsXaLX8ctBt9ysm06kX8SDGveWA8KIBif7Xm1+ErpBHyd5rzUngrbhB+4Rp00GzMMmBPyOPQ=="},"require":{"ionCubeLoader":"10.1.0"}} }, "7.6.0-beta.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "7.6.0-beta.1", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^5.6.0 || ^7.0.0 || ^7.1.0 || ^7.2.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-7.6.0-beta.1.zip", "type": "zip" }, "time": "2018-06-22", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "0.7.4", "symfony/yaml": "v2.8.7", "doctrine/instantiator": "1.0.5", "doctrine/lexer": "v1.0.1", "doctrine/annotations": "v1.4.0", "phpoption/phpoption": "1.5.0", "phpcollection/phpcollection": "0.5.0", "jms/parser-lib": "1.0.0", "jms/metadata": "1.6.0", "jms/serializer": "1.8.1", "goetas-webservices/xsd2php-runtime": "v0.2.7", "authorizenet/authorizenet": "1.9.6", "bshaffer/oauth2-server-php": "v1.8.0", "symfony/polyfill-mbstring": "v1.3.0", "ircmaxell/password-compat": "v1.0.4", "symfony/polyfill-php55": "v1.5.0", "symfony/polyfill-php54": "v1.5.0", "symfony/http-foundation": "v2.8.7", "bshaffer/oauth2-server-httpfoundation-bridge": "dev-develop", "duosecurity/duo_php": "1.0.0", "ezyang/htmlpurifier": "v4.9.2", "facebook/graph-sdk": "5.5.0", "psr/log": "1.0.2", "filp/whoops": "2.1.8", "google/recaptcha": "1.1.2", "phpseclib/phpseclib": "2.0.10", "monolog/monolog": "1.18.2", "psr/http-message": "1.0.1", "guzzlehttp/psr7": "1.4.2", "react/promise": "v2.5.1", "guzzlehttp/streams": "3.0.0", "guzzlehttp/ringphp": "1.1.0", "guzzlehttp/guzzle": "5.3.1", "psr/cache": "1.0.1", "firebase/php-jwt": "v3.0.0", "google/auth": "v0.11.1", "google/apiclient": "v2.1.3-p1", "symfony/console": "v2.8.7", "symfony/translation": "v2.8.7", "nesbot/carbon": "1.21.0", "paragonie/random_compat": "v1.4.2", "illuminate/contracts": "v5.2.45", "doctrine/inflector": "v1.1.0", "illuminate/support": "v5.2.37", "illuminate/console": "v5.2.37", "illuminate/container": "v5.2.37", "illuminate/database": "v5.2.37-p1", "illuminate/events": "v5.2.37", "illuminate/validation": "v5.2.45", "knplabs/knp-menu": "v2.1.1", "seld/cli-prompt": "1.0.3", "league/climate": "3.2.1", "league/plates": "3.3.0", "michelf/php-markdown": "1.6.0", "http-interop/http-middleware": "0.4.1", "http-interop/http-factory": "0.2.0", "middlewares/utils": "v0.9.0", "nikic/fast-route": "v1.2.0", "middlewares/fast-route": "v0.4.0", "mindplay/readable": "1.1.1", "psr/container": "1.0.0", "container-interop/container-interop": "1.2.0", "mindplay/middleman": "dev-whmcs_custom", "php-imap/php-imap": "2.0.9", "phpmyadmin/sql-parser": "v4.2.4", "phpmailer/phpmailer": "v5.2.26", "phpseclib/mcrypt_compat": "1.0.5", "punic/punic": "1.6.3", "ramsey/uuid": "3.4.1", "smarty/smarty": "v3.1.32", "stripe/stripe-php": "v3.23.0", "symfony/polyfill-iconv": "v1.2.0", "tecnickcom/tcpdf": "6.2.17", "zendframework/zend-diactoros": "1.3.10", "symfony/finder": "v2.8.7", "symfony/process": "v3.3.8", "seld/phar-utils": "1.0.1", "symfony/filesystem": "v3.3.8", "seld/jsonlint": "1.6.1", "composer/semver": "1.4.2", "composer/spdx-licenses": "1.1.6", "justinrainbow/json-schema": "1.6.1", "composer/composer": "1.0.3" }, "extra": {"sha":"3165ae5c8d6d10e9ddb76379edf104e1033a0c2ade3240b13f9c8753c6ed0e56","sig":"AOqyt9eSYOHDt9SLIn+3QZCe072f6V1UKxPyGpSgPXZ7AQ2wP+CzXfCu\/wEIiBAqCZJYbddzXxQXQC7j5f2DFBv2YbHqxy6lrCtHdohBChOyUcIpf983SXh4nR0za8g8sLx4LWk1WpZrSOj+Ii\/7ySVy4gpd+77pRB44ZYbOHhOMLOJJ+siNmlRzlG9ekjoLWJ1DK\/v5kbt1RssA7bLtRICa5vpCNn6B+mSO1+5QmF63b0bOB3lnQOH3nSJ1AJZUR1yfvZr+wBT8Fm7sdYa5bR4VCIXNpiXbUNCs3aK9xZlnTYw2PLSVf\/UqX0vltAaVvNWqX9Wi6NTkXH7vLdy62w==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_7.6.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V7.6.0_Beta_1","fileSize":"77614035","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"At2ORH8VcYXBNK7YfVBOhO+KQZUxPGpwoIYeyGq2sY04lKpLQL5EQwo8wHOf89RR+kBDy56\/NdkzQ0E1XLMjDbdMMFyt6w0SoSu9J4Sc3WHrFy8Oq\/bWfTQlQ2GlLwmmtd3wNsrcJXmTPOVXALo7geU23lRTlRqtREgh0FeSkMoO5GOnAS+2A8M0LT4cmONXYnpKc2Hcuz1yoAMtKTns95u6mIDkmsAcX8M+nIlxsFCjPIn1yUSueR8qcRCO0FOywL\/78H+2ZzAUQoVRAjMROYM4SOKkaF3vm28kg1v57+BHDh5HvCXGuTlZ8avc\/ZzE7XDHSvDoW3AdP0hB5PwifQ=="},"require":{"ionCubeLoader":"10.1.0"}} }, "7.5.3-release.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "7.5.3", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^5.6.0 || ^7.0.0 || ^7.1.0 || ^7.2.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-7.5.3-release.1.zip", "type": "zip" }, "time": "2019-01-15", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "phpseclib/phpseclib": "2.0.10", "psr/log": "1.0.2", "monolog/monolog": "1.18.2", "psr/http-message": "1.0.1", "guzzlehttp/psr7": "1.4.2", "react/promise": "v2.5.1", "guzzlehttp/streams": "3.0.0", "guzzlehttp/ringphp": "1.1.0", "guzzlehttp/guzzle": "5.3.1", "psr/cache": "1.0.1", "firebase/php-jwt": "v3.0.0", "google/auth": "v0.11.1", "google/apiclient": "v2.1.3-p1", "symfony/polyfill-mbstring": "v1.3.0", "symfony/translation": "v2.8.7", "nesbot/carbon": "1.21.0", "paragonie/random_compat": "v1.4.2", "illuminate/contracts": "v5.2.45", "doctrine/inflector": "v1.1.0", "illuminate/support": "v5.2.37", "illuminate/container": "v5.2.37", "illuminate/database": "v5.2.37-p1", "mindplay/readable": "1.1.1", "http-interop/http-middleware": "0.4.1", "psr/container": "1.0.0", "container-interop/container-interop": "1.2.0", "mindplay/middleman": "dev-whmcs_custom", "smarty/smarty": "v3.1.33-p1", "symfony/yaml": "v2.8.7", "symfony/finder": "v2.8.7", "symfony/console": "v2.8.7", "doctrine/instantiator": "1.0.5", "symfony/process": "v3.3.8", "doctrine/lexer": "v1.0.1", "doctrine/annotations": "v1.4.0", "abraham/twitteroauth": "0.7.4", "phpoption/phpoption": "1.5.0", "phpcollection/phpcollection": "0.5.0", "jms/parser-lib": "1.0.0", "jms/metadata": "1.6.0", "jms/serializer": "1.8.1", "goetas-webservices/xsd2php-runtime": "v0.2.7", "authorizenet/authorizenet": "1.9.3", "ircmaxell/password-compat": "v1.0.4", "symfony/polyfill-php55": "v1.5.0", "symfony/polyfill-php54": "v1.5.0", "symfony/http-foundation": "v2.8.7", "bshaffer/oauth2-server-php": "v1.8.0", "bshaffer/oauth2-server-httpfoundation-bridge": "dev-develop", "symfony/filesystem": "v3.3.8", "seld/phar-utils": "1.0.1", "seld/jsonlint": "1.6.1", "seld/cli-prompt": "1.0.3", "justinrainbow/json-schema": "1.6.1", "composer/spdx-licenses": "1.1.6", "composer/semver": "1.4.2", "composer/composer": "1.0.3", "duosecurity/duo_php": "1.0.0", "ezyang/htmlpurifier": "v4.9.2", "facebook/graph-sdk": "5.5.0", "filp/whoops": "2.1.8", "google/recaptcha": "1.1.2", "illuminate/console": "v5.2.37", "illuminate/events": "v5.2.37", "knplabs/knp-menu": "v2.1.1", "league/climate": "3.2.1", "league/plates": "3.3.0", "michelf/php-markdown": "1.6.0", "nikic/fast-route": "v1.2.0", "http-interop/http-factory": "0.2.0", "middlewares/utils": "v0.9.0", "middlewares/fast-route": "v0.4.0", "php-imap/php-imap": "2.0.9", "phpmailer/phpmailer": "v5.2.21", "punic/punic": "1.6.3", "ramsey/uuid": "3.4.1", "stripe/stripe-php": "v3.23.0", "symfony/polyfill-iconv": "v1.2.0", "tecnickcom/tcpdf": "6.2.26", "zendframework/zend-diactoros": "1.3.10" }, "extra": {"sha":"8951efe05c30c79dce2cf86b46e132a327ec032f31bcdb02c933847eb76ef349","sig":"cgq7DTszTBnQO493UtWawSw2A3MBnV\/8iu91JVico0MadZ\/EnntQWSQw8k\/aWMGxQSt9koxHKhQ3uWQoOFYagg\/5osg9FTGfnEYQcFuefODwjYRok9W1QyHBZYJym9kfUvLX745cpm2dKB1hXkP99TYvXjuO8X\/JFDMddP2DkcKQF9qTrgkGWuGpWHxqNSfQRZ+fPYWsO3WvbOTZUpt9xliSDxBmli5Bqam4CJ1rd0hZD8zAeng3rbb4mq+rbJdHJslVxfhDPyPdpZmyaw6uvVesfmltW81cZLlJALrB7EyW6QWxxdl3qThv20qLI1wDFXLpGKDL5439zb1eRm+SaA==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_7.5.3_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V7.5.3","fileSize":"57268363","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"hU+pwC\/gVcwXY5i+HWmNZLt6eW6JRVXG1MqK7BOdXSN4Uh914pzgRT\/FNmO\/N1L2Mmum6H8fPuAE6S7sUDyq+ikScOJV9QWhPPl\/8IdZ8DyjFw\/x+0ImXLalo4nGU6LK0MR\/Xj038HwyGCAKDl2k0xmdlwNchFE81tpoOx5TsZeB3BWxPi4Z3atMAFK1BdfZJVWeOSzLfLcbYBOrf8cQfFkQlUcEMbRcKb5iRHAm47dNS4KCqnKeRNWkNfguzZyCY6r9vfSc1u+1exCNVIOTRiLy5\/ZAjlm42BP2iyVwIS0uFBI8+aoyLYZMwPuxCrJ0O+Q6JoZvQYiIiDDJEKD4Ug=="},"require":{"ionCubeLoader":"10.1.0"}} }, "7.5.2-release.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "7.5.2", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^5.6.0 || ^7.0.0 || ^7.1.0 || ^7.2.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-7.5.2-release.1.zip", "type": "zip" }, "time": "2018-04-02", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "0.7.4", "symfony/yaml": "v2.8.7", "doctrine/instantiator": "1.0.5", "doctrine/lexer": "v1.0.1", "doctrine/annotations": "v1.4.0", "phpoption/phpoption": "1.5.0", "phpcollection/phpcollection": "0.5.0", "jms/parser-lib": "1.0.0", "jms/metadata": "1.6.0", "jms/serializer": "1.8.1", "goetas-webservices/xsd2php-runtime": "v0.2.7", "authorizenet/authorizenet": "1.9.3", "bshaffer/oauth2-server-php": "v1.8.0", "symfony/polyfill-mbstring": "v1.3.0", "ircmaxell/password-compat": "v1.0.4", "symfony/polyfill-php55": "v1.5.0", "symfony/polyfill-php54": "v1.5.0", "symfony/http-foundation": "v2.8.7", "bshaffer/oauth2-server-httpfoundation-bridge": "dev-develop", "duosecurity/duo_php": "1.0.0", "ezyang/htmlpurifier": "v4.9.2", "facebook/graph-sdk": "5.5.0", "psr/log": "1.0.2", "filp/whoops": "2.1.8", "google/recaptcha": "1.1.2", "phpseclib/phpseclib": "2.0.10", "monolog/monolog": "1.18.2", "psr/http-message": "1.0.1", "guzzlehttp/psr7": "1.4.2", "react/promise": "v2.5.1", "guzzlehttp/streams": "3.0.0", "guzzlehttp/ringphp": "1.1.0", "guzzlehttp/guzzle": "5.3.1", "psr/cache": "1.0.1", "firebase/php-jwt": "v3.0.0", "google/auth": "v0.11.1", "google/apiclient": "v2.1.3-p1", "symfony/console": "v2.8.7", "symfony/translation": "v2.8.7", "nesbot/carbon": "1.21.0", "paragonie/random_compat": "v1.4.2", "illuminate/contracts": "v5.2.45", "doctrine/inflector": "v1.1.0", "illuminate/support": "v5.2.37", "illuminate/console": "v5.2.37", "illuminate/container": "v5.2.37", "illuminate/database": "v5.2.37-p1", "illuminate/events": "v5.2.37", "knplabs/knp-menu": "v2.1.1", "seld/cli-prompt": "1.0.3", "league/climate": "3.2.1", "league/plates": "3.3.0", "michelf/php-markdown": "1.6.0", "http-interop/http-middleware": "0.4.1", "http-interop/http-factory": "0.2.0", "middlewares/utils": "v0.9.0", "nikic/fast-route": "v1.2.0", "middlewares/fast-route": "v0.4.0", "mindplay/readable": "1.1.1", "psr/container": "1.0.0", "container-interop/container-interop": "1.2.0", "mindplay/middleman": "dev-whmcs_custom", "php-imap/php-imap": "2.0.9", "phpmailer/phpmailer": "v5.2.21", "punic/punic": "1.6.3", "ramsey/uuid": "3.4.1", "smarty/smarty": "v3.1.29", "stripe/stripe-php": "v3.23.0", "symfony/polyfill-iconv": "v1.2.0", "tecnickcom/tcpdf": "6.2.12", "zendframework/zend-diactoros": "1.3.10", "symfony/finder": "v2.8.7", "symfony/process": "v3.3.8", "seld/phar-utils": "1.0.1", "symfony/filesystem": "v3.3.8", "seld/jsonlint": "1.6.1", "composer/semver": "1.4.2", "composer/spdx-licenses": "1.1.6", "justinrainbow/json-schema": "1.6.1", "composer/composer": "1.0.3" }, "extra": {"sha":"0cb9e8028e5f263d779c42225fe2cd5036f67d7b9693376cf1489b6faafb325c","sig":"iXZOMadXYAErXKPNISqftK9h8Z6+ezhlMz9LfU9FzUr5jR4YmuNTo\/2EOO4BlK\/NQ+EC2zj1OKWV7cef83Vb6kQjdwxYjZT3Y2MrvjAFP09AOPlViU7lwqUWzOyrh57Y4azmLljirKiWZuWG2KATQSagp2Pi34JegcWVr3\/evc67CkG7RA8Jt8OeludvNkr6EXtRHDylWPTS6duANeTr7RdYvtKxVeClnOHIYikPaV\/yrlnNU8jcd9u\/R7zpf6ne4QazIf1DHo3m6ceNUp\/3wu8SM+oRK0yE9YIp01jhGAHP8MEDEwaUQeri3REWwz6EIinihuX7vFaC9WanURulcQ==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_7.5.2_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V7.5.2","fileSize":"68786661","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"FLnqCMeFPyepsuIsgnaPmeYweUXQFkC+FDvjC8QDhtK\/qH8f6l0PPd4+llVJ4WWvBmSRWiV4HYctxS8jbr2H4SMILop4o7u\/iD+bEDHXEn+SBEAs4eSpN20bsVvJvpBgNTw9pP4YaENPp5j2wQU4dAdG6+9Rxjdf6lFGucNZXtMm0qDOrFsuv+4vnP+vJYTg+t0hpP7KZtdItt7lOf4ZyI3BSbQEgUubXsjGsBfyPPyCYPnVz7U7c\/4PKDPdczCM53GFt+L3RgrVD2sWHuE\/DFbCA3lwsfzb2sx5CcHnb2TxZaBPNp2P3topSuQpbSOLMkO8uMAoXLAR9RcVmr5Hlw=="},"require":{"ionCubeLoader":"10.1.0"}} }, "7.5.1-release.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "7.5.1", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^5.6.0 || ^7.0.0 || ^7.1.0 || ^7.2.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-7.5.1-release.1.zip", "type": "zip" }, "time": "2018-04-17", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "0.7.4", "symfony/yaml": "v2.8.7", "doctrine/instantiator": "1.0.5", "doctrine/lexer": "v1.0.1", "doctrine/annotations": "v1.4.0", "phpoption/phpoption": "1.5.0", "phpcollection/phpcollection": "0.5.0", "jms/parser-lib": "1.0.0", "jms/metadata": "1.6.0", "jms/serializer": "1.8.1", "goetas-webservices/xsd2php-runtime": "v0.2.7", "authorizenet/authorizenet": "1.9.3", "bshaffer/oauth2-server-php": "v1.8.0", "symfony/polyfill-mbstring": "v1.3.0", "ircmaxell/password-compat": "v1.0.4", "symfony/polyfill-php55": "v1.5.0", "symfony/polyfill-php54": "v1.5.0", "symfony/http-foundation": "v2.8.7", "bshaffer/oauth2-server-httpfoundation-bridge": "dev-develop", "duosecurity/duo_php": "1.0.0", "ezyang/htmlpurifier": "v4.9.2", "facebook/graph-sdk": "5.5.0", "psr/log": "1.0.2", "filp/whoops": "2.1.8", "google/recaptcha": "1.1.2", "phpseclib/phpseclib": "2.0.10", "monolog/monolog": "1.18.2", "psr/http-message": "1.0.1", "guzzlehttp/psr7": "1.4.2", "react/promise": "v2.5.1", "guzzlehttp/streams": "3.0.0", "guzzlehttp/ringphp": "1.1.0", "guzzlehttp/guzzle": "5.3.1", "psr/cache": "1.0.1", "firebase/php-jwt": "v3.0.0", "google/auth": "v0.11.1", "google/apiclient": "v2.1.3-p1", "symfony/console": "v2.8.7", "symfony/translation": "v2.8.7", "nesbot/carbon": "1.21.0", "paragonie/random_compat": "v1.4.2", "illuminate/contracts": "v5.2.45", "doctrine/inflector": "v1.1.0", "illuminate/support": "v5.2.37", "illuminate/console": "v5.2.37", "illuminate/container": "v5.2.37", "illuminate/database": "v5.2.37-p1", "illuminate/events": "v5.2.37", "knplabs/knp-menu": "v2.1.1", "seld/cli-prompt": "1.0.3", "league/climate": "3.2.1", "league/plates": "3.3.0", "michelf/php-markdown": "1.6.0", "http-interop/http-middleware": "0.4.1", "http-interop/http-factory": "0.2.0", "middlewares/utils": "v0.9.0", "nikic/fast-route": "v1.2.0", "middlewares/fast-route": "v0.4.0", "mindplay/readable": "1.1.1", "psr/container": "1.0.0", "container-interop/container-interop": "1.2.0", "mindplay/middleman": "dev-whmcs_custom", "php-imap/php-imap": "2.0.9", "phpmailer/phpmailer": "v5.2.21", "punic/punic": "1.6.3", "ramsey/uuid": "3.4.1", "smarty/smarty": "v3.1.29", "stripe/stripe-php": "v3.23.0", "symfony/polyfill-iconv": "v1.2.0", "tecnickcom/tcpdf": "6.2.12", "zendframework/zend-diactoros": "1.3.10", "symfony/finder": "v2.8.7", "symfony/process": "v3.3.8", "seld/phar-utils": "1.0.1", "symfony/filesystem": "v3.3.8", "seld/jsonlint": "1.6.1", "composer/semver": "1.4.2", "composer/spdx-licenses": "1.1.6", "justinrainbow/json-schema": "1.6.1", "composer/composer": "1.0.3" }, "extra": {"sha":"39596e29a79a250520c9ef6e084269e0c8f26531a3dd88fe1ed60defca902cdb","sig":"VP5W4onLPqgPQ25KiVcImUd6Qc5\/jmtbpApcCPLG8kajfszFA1fOLONLohHrHqjcUKXmdviYbAF8UbkdFEGqD1y\/3nTT5nCOfyN3GX7SGCftiK38iEyDTE21tVzmyVxPO9CiJMjUkNWmkcbEiBqTUYh3JDKHmoiuzuRm9vTJAt2bAoxCD5UixOmtTatJuX2eaFq9xzMBNX6ACAUGeUFKPo06d1ANpWXahFLOVD8DIGSrmV9E7f6yxeM0XfdQNd7e4WSjBWUVcfBqVFHI3KaoWKiZSH1TM59p9BIbrMvHrA\/+n59xyl86+4+UYvz5ES1193rsXia0e\/vn0XpLeuA59w==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_7.5.1_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V7.5.1","fileSize":"68726736","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"Hbtk5woAwuYezeNJXo+oVFVAnU3+f47OmwafqZYqZLpX8uWm446et\/yEQ7Ka3onNPOGvyzl90AgaGekiyh6uf4\/Jwj3pSI\/c9eZntKLFPZCTF85u984duJxpH+AJzOSybNL8PHT5\/rU83LgucMcfi9FFWNeJfsjkG+KbhFha+Q\/WMAjCY2yiTZvXIyErtWJJo1uoGwUCy5G7REDtPfX9j+Ohvl5uLxnJ12TkYagk5NvGYFpJO6y0hAJamibGOfuA3f8sYR2MQ4WSgxklCrd8JrG9NQyc\/MAu2TNnT6k++Yd92SlQPjMgYb8wDICSLvKyO2OmnYFn32jPPQC3nK2uoA=="},"require":{"ionCubeLoader":"10.1.0"}} }, "7.5.0-release.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "7.5.0", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^5.6.0 || ^7.0.0 || ^7.1.0 || ^7.2.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-7.5.0-release.1.zip", "type": "zip" }, "time": "2018-04-02", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "0.7.4", "symfony/yaml": "v2.8.7", "doctrine/instantiator": "1.0.5", "doctrine/lexer": "v1.0.1", "doctrine/annotations": "v1.4.0", "phpoption/phpoption": "1.5.0", "phpcollection/phpcollection": "0.5.0", "jms/parser-lib": "1.0.0", "jms/metadata": "1.6.0", "jms/serializer": "1.8.1", "goetas-webservices/xsd2php-runtime": "v0.2.7", "authorizenet/authorizenet": "1.9.3", "bshaffer/oauth2-server-php": "v1.8.0", "symfony/polyfill-mbstring": "v1.3.0", "ircmaxell/password-compat": "v1.0.4", "symfony/polyfill-php55": "v1.5.0", "symfony/polyfill-php54": "v1.5.0", "symfony/http-foundation": "v2.8.7", "bshaffer/oauth2-server-httpfoundation-bridge": "dev-develop", "duosecurity/duo_php": "1.0.0", "ezyang/htmlpurifier": "v4.9.2", "facebook/graph-sdk": "5.5.0", "psr/log": "1.0.2", "filp/whoops": "2.1.8", "google/recaptcha": "1.1.2", "phpseclib/phpseclib": "2.0.10", "monolog/monolog": "1.18.2", "psr/http-message": "1.0.1", "guzzlehttp/psr7": "1.4.2", "react/promise": "v2.5.1", "guzzlehttp/streams": "3.0.0", "guzzlehttp/ringphp": "1.1.0", "guzzlehttp/guzzle": "5.3.1", "psr/cache": "1.0.1", "firebase/php-jwt": "v3.0.0", "google/auth": "v0.11.1", "google/apiclient": "v2.1.3-p1", "symfony/console": "v2.8.7", "symfony/translation": "v2.8.7", "nesbot/carbon": "1.21.0", "paragonie/random_compat": "v1.4.2", "illuminate/contracts": "v5.2.45", "doctrine/inflector": "v1.1.0", "illuminate/support": "v5.2.37", "illuminate/console": "v5.2.37", "illuminate/container": "v5.2.37", "illuminate/database": "v5.2.37-p1", "illuminate/events": "v5.2.37", "knplabs/knp-menu": "v2.1.1", "seld/cli-prompt": "1.0.3", "league/climate": "3.2.1", "league/plates": "3.3.0", "michelf/php-markdown": "1.6.0", "http-interop/http-middleware": "0.4.1", "http-interop/http-factory": "0.2.0", "middlewares/utils": "v0.9.0", "nikic/fast-route": "v1.2.0", "middlewares/fast-route": "v0.4.0", "mindplay/readable": "1.1.1", "psr/container": "1.0.0", "container-interop/container-interop": "1.2.0", "mindplay/middleman": "dev-whmcs_custom", "php-imap/php-imap": "2.0.9", "phpmailer/phpmailer": "v5.2.21", "punic/punic": "1.6.3", "ramsey/uuid": "3.4.1", "smarty/smarty": "v3.1.29", "stripe/stripe-php": "v3.23.0", "symfony/polyfill-iconv": "v1.2.0", "tecnickcom/tcpdf": "6.2.12", "zendframework/zend-diactoros": "1.3.10", "symfony/finder": "v2.8.7", "symfony/process": "v3.3.8", "seld/phar-utils": "1.0.1", "symfony/filesystem": "v3.3.8", "seld/jsonlint": "1.6.1", "composer/semver": "1.4.2", "composer/spdx-licenses": "1.1.6", "justinrainbow/json-schema": "1.6.1", "composer/composer": "1.0.3" }, "extra": {"sha":"a66b5dc1a41bc5a13dc08880dab92424d6e36d4f53038a3b26a9474e150d206d","sig":"E+Nl7kyh6PuNYcztlxmwKzm3JnTW2IbVAqlLU6c+DhuCJ2phwacY+s9pZRBfKxBr1\/uLeXrgkm0ZwsJ7UX\/9qWP4QLWRP3Kw5zQ8AZze3fnYASNf1OVZnPRhd\/lUnRNrT81PYooHeaDQdklfIniFxvpDUu+NHrVMXhL++0RMpPtNaIOQDuKWuuwzEOYDa0vn3LDW0zLPXgl7QF2fRPif8oj7r+uxJY0jIFI4KwggwoNl1cJGvjSM5tK9mDY4jMECIHMnY0PcAhk5ccq5BXtRT5FkFZXFrEvshAnAlHFAeks9YCAunFihO8m5Hs9aMoaWFKWW0datmivWFGfWHCevYQ==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_7.5.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V7.5.0","fileSize":"68698152","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"NKbkz+4k1xioVzJC0Va+Fug5tETDieO56Esy1b877UDb2D9+huagGpYaWNLJ+pYedEHsj4+5zRQmZFO6Al+HQCxiwdYIXpRcKMZ8wauhxouzSuUeeCw8XNGFVRcJXQ1iQjW1wARiKH9kKzBYaMHu4yhPHQQutv+wXw+9HnixLlRVF6jUc36fkdX0GCrgG23S7bf4dFomSEp7zlLsX\/LPvHC5uB9rmXLZAWtJKkSe0ij6utZv\/gY3p5V2z2v9B0XZ0fxE3beKteidYl+up6+MBr8K1yq01IvrXc0eFBBfU99mCA\/QQRs5wSX\/c+DxE4X4b88JOKoOtPHq2CLID+tqtg=="},"require":{"ionCubeLoader":"10.1.0"}} }, "7.5.0-rc.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "7.5.0-RC.1", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^5.6.0 || ^7.0.0 || ^7.1.0 || ^7.2.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-7.5.0-rc.1.zip", "type": "zip" }, "time": "2018-03-08", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "0.7.4", "symfony/yaml": "v2.8.7", "doctrine/instantiator": "1.0.5", "doctrine/lexer": "v1.0.1", "doctrine/annotations": "v1.4.0", "phpoption/phpoption": "1.5.0", "phpcollection/phpcollection": "0.5.0", "jms/parser-lib": "1.0.0", "jms/metadata": "1.6.0", "jms/serializer": "1.8.1", "goetas-webservices/xsd2php-runtime": "v0.2.7", "authorizenet/authorizenet": "1.9.3", "bshaffer/oauth2-server-php": "v1.8.0", "symfony/polyfill-mbstring": "v1.3.0", "ircmaxell/password-compat": "v1.0.4", "symfony/polyfill-php55": "v1.5.0", "symfony/polyfill-php54": "v1.5.0", "symfony/http-foundation": "v2.8.7", "bshaffer/oauth2-server-httpfoundation-bridge": "dev-develop", "duosecurity/duo_php": "1.0.0", "ezyang/htmlpurifier": "v4.9.2", "facebook/graph-sdk": "5.5.0", "psr/log": "1.0.2", "filp/whoops": "2.1.8", "google/recaptcha": "1.1.2", "phpseclib/phpseclib": "2.0.2", "monolog/monolog": "1.18.2", "psr/http-message": "1.0.1", "guzzlehttp/psr7": "1.4.2", "react/promise": "v2.5.1", "guzzlehttp/streams": "3.0.0", "guzzlehttp/ringphp": "1.1.0", "guzzlehttp/guzzle": "5.3.1", "psr/cache": "1.0.1", "firebase/php-jwt": "v3.0.0", "google/auth": "v0.11.1", "google/apiclient": "v2.1.3-p1", "symfony/console": "v2.8.7", "symfony/translation": "v2.8.7", "nesbot/carbon": "1.21.0", "paragonie/random_compat": "v1.4.2", "illuminate/contracts": "v5.2.45", "doctrine/inflector": "v1.1.0", "illuminate/support": "v5.2.37", "illuminate/console": "v5.2.37", "illuminate/container": "v5.2.37", "illuminate/database": "v5.2.37-p1", "illuminate/events": "v5.2.37", "knplabs/knp-menu": "v2.1.1", "seld/cli-prompt": "1.0.3", "league/climate": "3.2.1", "league/plates": "3.3.0", "michelf/php-markdown": "1.6.0", "http-interop/http-middleware": "0.4.1", "http-interop/http-factory": "0.2.0", "middlewares/utils": "v0.9.0", "nikic/fast-route": "v1.2.0", "middlewares/fast-route": "v0.4.0", "mindplay/readable": "1.1.1", "psr/container": "1.0.0", "container-interop/container-interop": "1.2.0", "mindplay/middleman": "dev-whmcs_custom", "php-imap/php-imap": "2.0.9", "phpmailer/phpmailer": "v5.2.21", "punic/punic": "1.6.3", "ramsey/uuid": "3.4.1", "smarty/smarty": "v3.1.29", "stripe/stripe-php": "v3.23.0", "symfony/polyfill-iconv": "v1.2.0", "tecnickcom/tcpdf": "6.2.12", "zendframework/zend-diactoros": "1.3.10", "symfony/finder": "v2.8.7", "symfony/process": "v3.3.8", "seld/phar-utils": "1.0.1", "symfony/filesystem": "v3.3.8", "seld/jsonlint": "1.6.1", "composer/semver": "1.4.2", "composer/spdx-licenses": "1.1.6", "justinrainbow/json-schema": "1.6.1", "composer/composer": "1.0.3" }, "extra": {"sha":"5333ba4a16707245739c04ca00de3b9195ce816d37cba5fc5179534c1a08718f","sig":"X\/fTR1u3s1zDtjkqUe3PN7ExAMlylJlwcYjclSl45az18tXUoJ9jseWbQSxtkc7KnS06p7Y4VUWKqRrOX2mg+PWQtX2b0DhFp4eYIUWG9pGsTvAAX79lD3D11kByuM0MmglEblaFwEbf+vxNAMwuBrNCxQQBGjxA3AZTqMC1BpyXjZgRcPq5igCI4xDO\/WBfWg0VmjN\/LbrKWe7zCAUWuQjOJ0pDEOJAE+2dXNYxjMEwSu0HF8CNaY0rE5hKj9bcjJU4633svtzFCbcvPKFd1WBIKw6LD\/dUKkFkKtAg2gCKne26DPHhNvKfsmTTrRnrm51qwYQMir7FhtFGaCGUOA==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_7.5.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V7.5.0_RC_1","fileSize":"68358933","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"AuZO7P1ElEGwDWomq5ouywCkJzPLTxPvg0c7+bo661T5CsfC52\/R4rFrjlHF5+1U+HCCIjKnpETXaYT2RNzB6kwfvW2pgadHTwrP5a3m8O31b2hOkaSYfNBzSEwiSPgQ6\/UOsOmtW5YjbvSJloImtJbx4xjlsV+m7ohiG3eG9YlLAknlZHmQCtBAQ2gVelOJXN299a4njqkyQAP31RY6Nnw2wk\/q3Mb6+Yobzimus59QZ1xoPxAMJYOavAaREvixY5mYq+g6Q6duuiFv\/fo2+HVS\/M\/ufFMlQGwfoSxF2Gd3g5JrZyxI3LqGN8Q7f6AjewPqDebuk9wdsm89uqsNuw=="},"require":{"ionCubeLoader":"10.1.0"}} }, "7.5.0-beta.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "7.5.0-beta.1", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^5.6.0 || ^7.0.0 || ^7.1.0 || ^7.2.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-7.5.0-beta.1.zip", "type": "zip" }, "time": "2018-02-20", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "0.7.4", "symfony/yaml": "v2.8.7", "doctrine/instantiator": "1.0.5", "doctrine/lexer": "v1.0.1", "doctrine/annotations": "v1.4.0", "phpoption/phpoption": "1.5.0", "phpcollection/phpcollection": "0.5.0", "jms/parser-lib": "1.0.0", "jms/metadata": "1.6.0", "jms/serializer": "1.8.1", "goetas-webservices/xsd2php-runtime": "v0.2.7", "authorizenet/authorizenet": "1.9.3", "bshaffer/oauth2-server-php": "v1.8.0", "symfony/polyfill-mbstring": "v1.3.0", "ircmaxell/password-compat": "v1.0.4", "symfony/polyfill-php55": "v1.5.0", "symfony/polyfill-php54": "v1.5.0", "symfony/http-foundation": "v2.8.7", "bshaffer/oauth2-server-httpfoundation-bridge": "dev-develop", "duosecurity/duo_php": "1.0.0", "ezyang/htmlpurifier": "v4.9.2", "facebook/graph-sdk": "5.5.0", "psr/log": "1.0.2", "filp/whoops": "2.1.8", "google/recaptcha": "1.1.2", "phpseclib/phpseclib": "2.0.2", "monolog/monolog": "1.18.2", "psr/http-message": "1.0.1", "guzzlehttp/psr7": "1.4.2", "react/promise": "v2.5.1", "guzzlehttp/streams": "3.0.0", "guzzlehttp/ringphp": "1.1.0", "guzzlehttp/guzzle": "5.3.1", "psr/cache": "1.0.1", "firebase/php-jwt": "v3.0.0", "google/auth": "v0.11.1", "google/apiclient": "v2.1.3-p1", "symfony/console": "v2.8.7", "symfony/translation": "v2.8.7", "nesbot/carbon": "1.21.0", "paragonie/random_compat": "v1.4.2", "illuminate/contracts": "v5.2.45", "doctrine/inflector": "v1.1.0", "illuminate/support": "v5.2.37", "illuminate/console": "v5.2.37", "illuminate/container": "v5.2.37", "illuminate/database": "v5.2.37-p1", "illuminate/events": "v5.2.37", "knplabs/knp-menu": "v2.1.1", "seld/cli-prompt": "1.0.3", "league/climate": "3.2.1", "league/plates": "3.3.0", "michelf/php-markdown": "1.6.0", "http-interop/http-middleware": "0.4.1", "http-interop/http-factory": "0.2.0", "middlewares/utils": "v0.9.0", "nikic/fast-route": "v1.2.0", "middlewares/fast-route": "v0.4.0", "mindplay/readable": "1.1.1", "psr/container": "1.0.0", "container-interop/container-interop": "1.2.0", "mindplay/middleman": "dev-whmcs_custom", "php-imap/php-imap": "2.0.9", "phpmailer/phpmailer": "v5.2.21", "punic/punic": "1.6.3", "ramsey/uuid": "3.4.1", "smarty/smarty": "v3.1.29", "stripe/stripe-php": "v3.23.0", "symfony/polyfill-iconv": "v1.2.0", "tecnickcom/tcpdf": "6.2.12", "zendframework/zend-diactoros": "1.3.10", "symfony/finder": "v2.8.7", "symfony/process": "v3.3.8", "seld/phar-utils": "1.0.1", "symfony/filesystem": "v3.3.8", "seld/jsonlint": "1.6.1", "composer/semver": "1.4.2", "composer/spdx-licenses": "1.1.6", "justinrainbow/json-schema": "1.6.1", "composer/composer": "1.0.3" }, "extra": {"sha":"c433ef7205e55611a16b9d04e9b73937f141ecb137d5546460b94421ab10d2b1","sig":"cLNVuLA\/WfjnVULnmxr06SPl\/EADQMruaxQqPCGet\/cfricuqKBKVHeSVlr2Syfxe+oCINM0Ctj6mWHNiydtzrwN0z377sHOyHA3Dvb7yvxx3JF2LaZEGXVqwL9t3GapZQF+A1swyxNhw9Kf\/PPSB\/HgloX61KIR1yqQ1BbW3Oweugjyu5fTxHL8FGen0GpStGf26c5wxZ9zvUytx+zQpnTzpM6iLWoPVAehLe\/gcTktTIL2hVVOm77sPAWaFY+rvZjcmAXgxwScewZVy3u8OVvXFmwXhK0tCVhmm\/GKkmlmaXOrB5l2g+UteIh0iMaAU5QNNeGvrWvT6s6fGaR3mA==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_7.5.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V7.5.0_Beta_1","fileSize":"68214761","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"QOeOWSo2RiRsPXigs32pOjmbqN\/ROuEQY1erAXrmnEONKvy4UC9+U94j8Q9BU0qbpOfO0C2R6dqOQQ9IGpGOjlQsfqF9xAgy\/VbDMLEMZRZAS3k2RaNk0ACziPNPhu7oORIBAQ1uFz+1BdRuV5NAdOw+5NHRBFpSmdeDnsiFoH3WaVTsSQQWHHM9HpGizXDnQUrQepKm3vZvFvOks16esVtf0hRGYtO1G93er3m\/ayLPAg1LO25AU9p\/o2O9Id5SG0+ZlOnVSbeLMLg1lVnW5AxCFgYt13P+XZc+ZVD9ClQPXTweIy+zVryw1BgXAIftNRYcOuDJ6tB4sR1KjbWbWg=="},"require":{"ionCubeLoader":"10.1.0"}} }, "7.4.3-release.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "7.4.3", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^5.6.0 || ^7.0.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-7.4.3-release.1.zip", "type": "zip" }, "time": "2017-11-14", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "0.7.4", "symfony/yaml": "v2.8.7", "doctrine/instantiator": "1.0.5", "doctrine/lexer": "v1.0.1", "doctrine/annotations": "v1.4.0", "phpoption/phpoption": "1.5.0", "phpcollection/phpcollection": "0.5.0", "jms/parser-lib": "1.0.0", "jms/metadata": "1.6.0", "jms/serializer": "1.8.1", "goetas-webservices/xsd2php-runtime": "v0.2.7", "authorizenet/authorizenet": "1.9.3", "bshaffer/oauth2-server-php": "v1.8.0", "symfony/polyfill-mbstring": "v1.3.0", "ircmaxell/password-compat": "v1.0.4", "symfony/polyfill-php55": "v1.5.0", "symfony/polyfill-php54": "v1.5.0", "symfony/http-foundation": "v2.8.7", "bshaffer/oauth2-server-httpfoundation-bridge": "dev-develop", "ezyang/htmlpurifier": "v4.9.2", "facebook/graph-sdk": "5.5.0", "psr/log": "1.0.2", "filp/whoops": "2.1.8", "google/recaptcha": "1.1.2", "phpseclib/phpseclib": "2.0.2", "monolog/monolog": "1.18.2", "psr/http-message": "1.0.1", "guzzlehttp/psr7": "1.4.2", "react/promise": "v2.5.1", "guzzlehttp/streams": "3.0.0", "guzzlehttp/ringphp": "1.1.0", "guzzlehttp/guzzle": "5.3.1", "psr/cache": "1.0.1", "firebase/php-jwt": "v3.0.0", "google/auth": "v0.11.1", "google/apiclient": "v2.1.3-p1", "symfony/console": "v2.8.7", "symfony/translation": "v2.8.7", "nesbot/carbon": "1.21.0", "paragonie/random_compat": "v1.4.2", "illuminate/contracts": "v5.2.45", "doctrine/inflector": "v1.1.0", "illuminate/support": "v5.2.37", "illuminate/console": "v5.2.37", "illuminate/container": "v5.2.37", "illuminate/events": "v5.2.37", "knplabs/knp-menu": "v2.1.1", "seld/cli-prompt": "1.0.3", "league/climate": "3.2.1", "league/plates": "3.3.0", "michelf/php-markdown": "1.6.0", "http-interop/http-middleware": "0.4.1", "http-interop/http-factory": "0.2.0", "middlewares/utils": "v0.9.0", "nikic/fast-route": "v1.2.0", "middlewares/fast-route": "v0.4.0", "mindplay/readable": "1.1.1", "psr/container": "1.0.0", "container-interop/container-interop": "1.2.0", "mindplay/middleman": "dev-whmcs_custom", "php-imap/php-imap": "2.0.9", "phpmailer/phpmailer": "v5.2.21", "punic/punic": "1.6.3", "ramsey/uuid": "3.4.1", "smarty/smarty": "v3.1.29", "stripe/stripe-php": "v3.23.0", "symfony/polyfill-iconv": "v1.2.0", "tecnickcom/tcpdf": "6.2.12", "zendframework/zend-diactoros": "1.3.10", "symfony/finder": "v2.8.7", "symfony/process": "v3.3.8", "seld/phar-utils": "1.0.1", "symfony/filesystem": "v3.3.8", "seld/jsonlint": "1.6.1", "composer/semver": "1.4.2", "composer/spdx-licenses": "1.1.6", "justinrainbow/json-schema": "1.6.1", "composer/composer": "1.0.3", "illuminate/database": "v5.2.37" }, "extra": {"sha":"dcce2ebad4362f9cc1e30c028169a9afe82f171e142ce37bd6b3c03d3f759fe9","sig":"UQez1zYPQM9vtlBDDwluanhz\/wmszQ4scfVABZ7C4bzVJjqJanJ1Qpb0o+pFLBF9ZeeGyV+agtIic\/B3sxHhsKATe0BNOFSeUwCGMBuq5X9vRu6AUvSmhEWb4ZbAdFc1sKVOWUkjSZthqSycx5WffCIsiPqILtC9KZa+aT5Gny4HdEw8pMq6\/UT5+o9FuIkUpcGMyqGup7PHrhjr0kXWObh5trZ7j9XebYFX86KjOArUY8vADhzZVn1YvreojwGVuuOdBeZMTIW\/QF7jPL+BFfzfzTDJeRJtqrld9g\/TzytJmZZB6\/e+FbJQ+EzhFnODWDGf\/wM\/01wKD4yDzdixYA==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_7.4.3_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V7.4.3","fileSize":"55694888","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":""},"require":{"ionCubeLoader":"5.0.21"}} }, "7.4.2-release.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "7.4.2", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^5.6.0 || ^7.0.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-7.4.2-release.1.zip", "type": "zip" }, "time": "2018-01-09", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "0.7.4", "symfony/yaml": "v2.8.7", "doctrine/instantiator": "1.0.5", "doctrine/lexer": "v1.0.1", "doctrine/annotations": "v1.4.0", "phpoption/phpoption": "1.5.0", "phpcollection/phpcollection": "0.5.0", "jms/parser-lib": "1.0.0", "jms/metadata": "1.6.0", "jms/serializer": "1.8.1", "goetas-webservices/xsd2php-runtime": "v0.2.7", "authorizenet/authorizenet": "1.9.3", "bshaffer/oauth2-server-php": "v1.8.0", "symfony/polyfill-mbstring": "v1.3.0", "ircmaxell/password-compat": "v1.0.4", "symfony/polyfill-php55": "v1.5.0", "symfony/polyfill-php54": "v1.5.0", "symfony/http-foundation": "v2.8.7", "bshaffer/oauth2-server-httpfoundation-bridge": "dev-develop", "ezyang/htmlpurifier": "v4.9.2", "facebook/graph-sdk": "5.5.0", "psr/log": "1.0.2", "filp/whoops": "2.1.8", "google/recaptcha": "1.1.2", "phpseclib/phpseclib": "2.0.2", "monolog/monolog": "1.18.2", "psr/http-message": "1.0.1", "guzzlehttp/psr7": "1.4.2", "react/promise": "v2.5.1", "guzzlehttp/streams": "3.0.0", "guzzlehttp/ringphp": "1.1.0", "guzzlehttp/guzzle": "5.3.1", "psr/cache": "1.0.1", "firebase/php-jwt": "v3.0.0", "google/auth": "v0.11.1", "google/apiclient": "v2.1.3-p1", "symfony/console": "v2.8.7", "symfony/translation": "v2.8.7", "nesbot/carbon": "1.21.0", "paragonie/random_compat": "v1.4.2", "illuminate/contracts": "v5.2.45", "doctrine/inflector": "v1.1.0", "illuminate/support": "v5.2.37", "illuminate/console": "v5.2.37", "illuminate/container": "v5.2.37", "illuminate/events": "v5.2.37", "knplabs/knp-menu": "v2.1.1", "seld/cli-prompt": "1.0.3", "league/climate": "3.2.1", "league/plates": "3.3.0", "michelf/php-markdown": "1.6.0", "http-interop/http-middleware": "0.4.1", "http-interop/http-factory": "0.2.0", "middlewares/utils": "v0.9.0", "nikic/fast-route": "v1.2.0", "middlewares/fast-route": "v0.4.0", "mindplay/readable": "1.1.1", "psr/container": "1.0.0", "container-interop/container-interop": "1.2.0", "mindplay/middleman": "dev-whmcs_custom", "php-imap/php-imap": "2.0.9", "phpmailer/phpmailer": "v5.2.21", "punic/punic": "1.6.3", "ramsey/uuid": "3.4.1", "smarty/smarty": "v3.1.29", "stripe/stripe-php": "v3.23.0", "symfony/polyfill-iconv": "v1.2.0", "tecnickcom/tcpdf": "6.2.12", "zendframework/zend-diactoros": "1.3.10", "symfony/finder": "v2.8.7", "symfony/process": "v3.3.8", "seld/phar-utils": "1.0.1", "symfony/filesystem": "v3.3.8", "seld/jsonlint": "1.6.1", "composer/semver": "1.4.2", "composer/spdx-licenses": "1.1.6", "justinrainbow/json-schema": "1.6.1", "composer/composer": "1.0.3", "illuminate/database": "v5.2.37" }, "extra": {"sha":"d9425515e04d772842a6c9074024934c7b179ad550f02f0f6b7d1c960a2915b4","sig":"maZQM4G1h84L2E2C9mycr7\/BdQFZaN4pNtTOnusS5NYD+AZiEVw5r\/NhiqgT+u4dd+ZVCxnReuw0GkvuHiluRMEfPpfJOsjTkpZnKkSWMHM+Qyqu\/RS38gJjKqYjLy5D0PIXZVeC3c3775Jfdk5fyBJvCgttqfWZeGGNxs\/GCofo0yMKP2423lYORhEP4fBJ\/SaQ3eXe6UJJHhZHoVG6IElUza0pXjJ3feV7sRtw3rLFoQLpQSp1jIjI6MDeg97lzPkmEIdanwTVcZCpgfqXbS\/yXHdV3Q8XDe1HHnxrqDyhXM3DshoSE7y0rkTfkX6+wb\/nfrMjkj8FKVY8afK1VQ==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_7.4.2_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V7.4.2","fileSize":"55707546","minMemoryLimit":"67108864","require":{"ionCubeLoader":"5.0.21"}} }, "7.10.3-release.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "7.10.3", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^5.6.0 || ^7.0.0 || ^7.1.0 || ^7.2.0 || ^7.3.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-7.10.3-release.1.zip", "type": "zip" }, "time": "now", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "0.7.4", "authorizenet/authorizenet": "1.9.7", "aws/aws-sdk-php": "3.69.2", "bitpay/php-client": "v3.0.0-p1", "bshaffer/oauth2-server-httpfoundation-bridge": "dev-develop", "bshaffer/oauth2-server-php": "v1.8.0", "composer/composer": "1.0.3-p1", "composer/semver": "1.4.2", "composer/spdx-licenses": "1.1.6", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "v1.4.0", "doctrine/inflector": "v1.1.0", "doctrine/instantiator": "1.0.5", "doctrine/lexer": "v1.0.1", "duosecurity/duo_php": "1.0.0", "ezyang/htmlpurifier": "v4.9.2", "facebook/graph-sdk": "5.5.0", "filp/whoops": "2.1.8", "firebase/php-jwt": "v3.0.0", "goetas-webservices/xsd2php-runtime": "v0.2.7", "google/apiclient": "v2.1.3-p1", "google/auth": "v0.11.1", "google/recaptcha": "1.1.2", "guzzlehttp/guzzle": "5.3.3", "guzzlehttp/promises": "1.4.0", "guzzlehttp/psr7": "1.4.2", "guzzlehttp/ringphp": "1.1.1", "guzzlehttp/streams": "3.0.0", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v5.2.37", "illuminate/container": "v5.2.37", "illuminate/contracts": "v5.2.45", "illuminate/database": "v5.2.37-p2", "illuminate/events": "v5.2.37", "illuminate/support": "v5.2.37-p1", "illuminate/validation": "v5.2.45", "ircmaxell/password-compat": "v1.0.4", "jms/metadata": "1.6.0", "jms/parser-lib": "1.0.0", "jms/serializer": "1.8.1", "justinrainbow/json-schema": "1.6.1", "knplabs/knp-menu": "v2.1.1", "league/climate": "3.2.1", "league/flysystem": "1.0.45", "league/flysystem-aws-s3-v3": "1.0.21", "league/plates": "3.3.0", "michelf/php-markdown": "1.6.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "1.18.2", "mtdowling/jmespath.php": "2.4.0", "nesbot/carbon": "1.21.0", "nikic/fast-route": "v1.2.0", "paragonie/random_compat": "v1.4.2", "php-imap/php-imap": "2.0.9", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.0.7", "phpmyadmin/sql-parser": "v4.2.4", "phpoption/phpoption": "1.5.0", "phpseclib/mcrypt_compat": "1.0.5", "phpseclib/phpseclib": "2.0.10", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-message": "1.0.1", "psr/log": "1.0.2", "punic/punic": "1.6.3", "ramsey/uuid": "3.4.1", "react/promise": "v2.5.1", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.6.1", "seld/phar-utils": "1.0.1", "smarty/smarty": "v3.1.33-p1", "stripe/stripe-php": "v6.43.1", "symfony/config": "v3.2.14", "symfony/console": "v2.8.7", "symfony/dependency-injection": "v3.1.10", "symfony/filesystem": "v3.3.8", "symfony/finder": "v2.8.7", "symfony/http-foundation": "v2.8.7", "symfony/polyfill-iconv": "v1.2.0", "symfony/polyfill-mbstring": "v1.3.0", "symfony/polyfill-php54": "v1.5.0", "symfony/polyfill-php55": "v1.5.0", "symfony/process": "v3.3.8", "symfony/translation": "v2.8.7", "symfony/yaml": "v2.8.7", "tecnickcom/tcpdf": "6.2.26-p1", "zendframework/zend-diactoros": "1.3.10" }, "extra": {"sha":"2c5b558699d17083cac00100d427e4e0292b9c3119cb8e21e7d979cf7b2f3fac","sig":"fl+fE6ZpWBgBhOXZMZigdxVgOfY6NQusxvJgBolTiuFJe1i0hYE6WD77UM3oxmKk9ZGWFF3HoZuzYSgfJ3WByfEKF99nYMQiELrATsUQxDafivI5e8iG7zwrMQdUGZ+r8km80BvRsdG9qORuCVJDs\/lZ7xUUKOe3hqG306BpejRM+TyHyjLh4fDbtnwo2BXv+0YaaMx3jvMukdMy6UqUbmbNHCx8TdCTAgqVlkGoKcbAoXmrpH9fjWQZlqYFSy\/4q+tWcODMNEMuInx2T+YhJPT6ooeOFGhNMLIBNMXvuYnfLAwjj2Z9Nw6Si2SnjUfYnOsCVo7YRw5JmWOA4AtD1Q==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_7.10.3_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V7.10.3","fileSize":"82531141","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"BX3yYJ1q2x9NpL20ipfovdLEwJn00u5oqroQeo21sixHXVtWC3pDfp8y0O3VqKQUT7uOuqVD67eZAjZEnpJs8sEZlUey3vcLvwIkBTjiZhTcN6YVqM5ivn84EmWHsX1SW\/UQNEHIwLkXcLTI8b6gLGJIyqxcRf2ubV381b8uENvtdfIoeBADhJraz4OXRI\/okN626JLRu158YaaQ3Nh7A2T19HlvCVwrQJt0rPjeEPcBlemx2H6hGiBwmFqNrN5nLVNd9v1adx609bPrNCAElSPuuKAhl4BvKQ3cGa68KveCg43H8ZytM9RMgiLJhLM6XFrwFO+q7SquKGHiTqezzg=="},"require":{"ionCubeLoader":"10.1.0"}} }, "7.10.2-release.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "7.10.2", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^5.6.0 || ^7.0.0 || ^7.1.0 || ^7.2.0 || ^7.3.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-7.10.2-release.1.zip", "type": "zip" }, "time": "now", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "0.7.4", "authorizenet/authorizenet": "1.9.7", "aws/aws-sdk-php": "3.69.2", "bitpay/php-client": "v3.0.0-p1", "bshaffer/oauth2-server-httpfoundation-bridge": "dev-develop", "bshaffer/oauth2-server-php": "v1.8.0", "composer/composer": "1.0.3-p1", "composer/semver": "1.4.2", "composer/spdx-licenses": "1.1.6", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "v1.4.0", "doctrine/inflector": "v1.1.0", "doctrine/instantiator": "1.0.5", "doctrine/lexer": "v1.0.1", "duosecurity/duo_php": "1.0.0", "ezyang/htmlpurifier": "v4.9.2", "facebook/graph-sdk": "5.5.0", "filp/whoops": "2.1.8", "firebase/php-jwt": "v3.0.0", "goetas-webservices/xsd2php-runtime": "v0.2.7", "google/apiclient": "v2.1.3-p1", "google/auth": "v0.11.1", "google/recaptcha": "1.1.2", "guzzlehttp/guzzle": "5.3.3", "guzzlehttp/promises": "v1.3.1", "guzzlehttp/psr7": "1.4.2", "guzzlehttp/ringphp": "1.1.1", "guzzlehttp/streams": "3.0.0", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v5.2.37", "illuminate/container": "v5.2.37", "illuminate/contracts": "v5.2.45", "illuminate/database": "v5.2.37-p2", "illuminate/events": "v5.2.37", "illuminate/support": "v5.2.37-p1", "illuminate/validation": "v5.2.45", "ircmaxell/password-compat": "v1.0.4", "jms/metadata": "1.6.0", "jms/parser-lib": "1.0.0", "jms/serializer": "1.8.1", "justinrainbow/json-schema": "1.6.1", "knplabs/knp-menu": "v2.1.1", "league/climate": "3.2.1", "league/flysystem": "1.0.45", "league/flysystem-aws-s3-v3": "1.0.21", "league/plates": "3.3.0", "michelf/php-markdown": "1.6.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "1.18.2", "mtdowling/jmespath.php": "2.4.0", "nesbot/carbon": "1.21.0", "nikic/fast-route": "v1.2.0", "paragonie/random_compat": "v1.4.2", "php-imap/php-imap": "2.0.9", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.0.7", "phpmyadmin/sql-parser": "v4.2.4", "phpoption/phpoption": "1.5.0", "phpseclib/mcrypt_compat": "1.0.5", "phpseclib/phpseclib": "2.0.10", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-message": "1.0.1", "psr/log": "1.0.2", "punic/punic": "1.6.3", "ramsey/uuid": "3.4.1", "react/promise": "v2.5.1", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.6.1", "seld/phar-utils": "1.0.1", "smarty/smarty": "v3.1.33-p1", "stripe/stripe-php": "v6.43.1", "symfony/config": "v3.2.14", "symfony/console": "v2.8.7", "symfony/dependency-injection": "v3.1.10", "symfony/filesystem": "v3.3.8", "symfony/finder": "v2.8.7", "symfony/http-foundation": "v2.8.7", "symfony/polyfill-iconv": "v1.2.0", "symfony/polyfill-mbstring": "v1.3.0", "symfony/polyfill-php54": "v1.5.0", "symfony/polyfill-php55": "v1.5.0", "symfony/process": "v3.3.8", "symfony/translation": "v2.8.7", "symfony/yaml": "v2.8.7", "tecnickcom/tcpdf": "6.2.26-p1", "zendframework/zend-diactoros": "1.3.10" }, "extra": {"sha":"77df12f773571090a8be8a9dc4e64516269b3b261d0bb9a3a5a0f2ac00417c18","sig":"MypzJWTnbeA7gYe7roqhFaiXc\/j609Yv75bigdtp8HL6lsKNS3o76JUWQ2IDg+TVrulZIeJrGkHYRIehk8pprm+66bLyhCh4A2euX9Hj7by4YtaLtplwudVowsX5g1ATEmRdkA0IPMjUaVznKfpBV5dAp+S7+oSr+GoSD1VtLBmzyJ1yrSWJT19Ik2rGDh2m7rPqFp1CRBgyKF97T8I4Bg57y+jpxvUoDoz3RjDQZswfromEP3Ukg31lLAwNitHR9j9bjKePLMa56YJQjmRNq1DUFYcVgoWcErOsZ9+hRjY\/1o+vtdtnSmFXu9h4ucSGjL+tj4vaJxoa1RguMQFUeg==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_7.10.2_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V7.10.2","fileSize":"73214178","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"osUkj6zdXwG+TQ6qQLnTlC03S9qYTlOUO8VsJR+Oqj01jXPmZHxxwAGSchjDhO5Ip4AtU\/3AArlZRzonTnE47C8XqO7D3iX3jufHCwmZh\/Z2FJJsyyWhVUi2d69OcqyeekgHX9jrsNT0FXAXp7g9NLT\/+cKTLIcDRz1k\/VFn48wVHDxZhcBhPy3P4a8eF+b0Nc2MESNduMRvNoZ3EM2LqJSP3E62CBDDABKI9UMkLz9SD9DKk4jKMuTMqQvZycXbiGLS5PNSjaxT1UazC7SCg7lCkSq5WLCXmkk8tE0zjkW7ttrUQ5OYuj\/LOtbEAvj0wngmp1AXaCdqZJZq\/mYSyA=="},"require":{"ionCubeLoader":"10.1.0"}} }, "7.10.1-release.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "7.10.1", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^5.6.0 || ^7.0.0 || ^7.1.0 || ^7.2.0 || ^7.3.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-7.10.1-release.1.zip", "type": "zip" }, "time": "now", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "0.7.4", "authorizenet/authorizenet": "1.9.7", "aws/aws-sdk-php": "3.69.2", "bitpay/php-client": "v3.0.0-p1", "bshaffer/oauth2-server-httpfoundation-bridge": "dev-develop", "bshaffer/oauth2-server-php": "v1.8.0", "composer/composer": "1.0.3-p1", "composer/semver": "1.4.2", "composer/spdx-licenses": "1.1.6", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "v1.4.0", "doctrine/inflector": "v1.1.0", "doctrine/instantiator": "1.0.5", "doctrine/lexer": "v1.0.1", "duosecurity/duo_php": "1.0.0", "ezyang/htmlpurifier": "v4.9.2", "facebook/graph-sdk": "5.5.0", "filp/whoops": "2.1.8", "firebase/php-jwt": "v3.0.0", "goetas-webservices/xsd2php-runtime": "v0.2.7", "google/apiclient": "v2.1.3-p1", "google/auth": "v0.11.1", "google/recaptcha": "1.1.2", "guzzlehttp/guzzle": "5.3.3", "guzzlehttp/promises": "v1.3.1", "guzzlehttp/psr7": "1.4.2", "guzzlehttp/ringphp": "1.1.1", "guzzlehttp/streams": "3.0.0", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v5.2.37", "illuminate/container": "v5.2.37", "illuminate/contracts": "v5.2.45", "illuminate/database": "v5.2.37-p2", "illuminate/events": "v5.2.37", "illuminate/support": "v5.2.37-p1", "illuminate/validation": "v5.2.45", "ircmaxell/password-compat": "v1.0.4", "jms/metadata": "1.6.0", "jms/parser-lib": "1.0.0", "jms/serializer": "1.8.1", "justinrainbow/json-schema": "1.6.1", "knplabs/knp-menu": "v2.1.1", "league/climate": "3.2.1", "league/flysystem": "1.0.45", "league/flysystem-aws-s3-v3": "1.0.21", "league/plates": "3.3.0", "michelf/php-markdown": "1.6.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "1.18.2", "mtdowling/jmespath.php": "2.4.0", "nesbot/carbon": "1.21.0", "nikic/fast-route": "v1.2.0", "paragonie/random_compat": "v1.4.2", "php-imap/php-imap": "2.0.9", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.0.7", "phpmyadmin/sql-parser": "v4.2.4", "phpoption/phpoption": "1.5.0", "phpseclib/mcrypt_compat": "1.0.5", "phpseclib/phpseclib": "2.0.10", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-message": "1.0.1", "psr/log": "1.0.2", "punic/punic": "1.6.3", "ramsey/uuid": "3.4.1", "react/promise": "v2.5.1", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.6.1", "seld/phar-utils": "1.0.1", "smarty/smarty": "v3.1.33-p1", "stripe/stripe-php": "v6.43.1", "symfony/config": "v3.2.14", "symfony/console": "v2.8.7", "symfony/dependency-injection": "v3.1.10", "symfony/filesystem": "v3.3.8", "symfony/finder": "v2.8.7", "symfony/http-foundation": "v2.8.7", "symfony/polyfill-iconv": "v1.2.0", "symfony/polyfill-mbstring": "v1.3.0", "symfony/polyfill-php54": "v1.5.0", "symfony/polyfill-php55": "v1.5.0", "symfony/process": "v3.3.8", "symfony/translation": "v2.8.7", "symfony/yaml": "v2.8.7", "tecnickcom/tcpdf": "6.2.26-p1", "zendframework/zend-diactoros": "1.3.10" }, "extra": {"sha":"e6952f4e28ea5e15c6497353862de997c75ffa57eb9430db565bd58249abf57f","sig":"G3y3wuRF21P6f6NqI4gpbUxuRqbtyUYMt4QzMxdyptvetwIQsVa7DVonH6g\/yiie\/tM\/lLnHDSIm+CAjac1R1\/m95QEPyhqWY8rAv68H2ys6gqTO8TMMncKXkenFHSKdqLOMb8jSYa5Y9wSAvqUOigZeQ\/p\/dTEucBnzdfgFXcEvuZOJmSduTLXsiOjChwOIQOci4Dam5\/tSADqWuCBIo0lz+vtc3ZJUSQPohMCjQ0oHOhLGCbdAMrwtNXR+5qhA5uH3P\/j7mdMeVRLHIav0J6qaEgtTxQ0sAt3n+7s+eFW22e6ewI24p+COr80tOyyUMwY2Ck8dF18DMKvh+hHA6Q==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_7.10.1_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V7.10.1","fileSize":"73184683","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"hLQTTAtpEceQjMi9c0d23DouMS+IMWNJbNaxharBmarCcB42YmUaurXmqzZxfOHpFwZiV\/J738k6s5ITSquxIuKjS\/cAiAxSws4+wYQc2WV8U+S2+4LXfkgo9jkB5RvHsH5vkg\/H9+KCF8xoJBZPbm+PO30wt7PY7o8gJrATzCyR7NRPoW6rxbkX81xTw3RSK450y8YKvz2LLcM2+i5Vr2vDfg6FVKQn\/PiRKF\/00Gqve3xARh01llKNXuErN0tDFf2HzsPLNRegZL5Ec08caSq3MFdOXeVQqzllKwl9bTi6TKb3Mbe4ldl2DLjixz9YbK6FV5raOpBDSROXAE2NzA=="},"require":{"ionCubeLoader":"10.1.0"}} }, "7.10.0-release.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "7.10.0", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^5.6.0 || ^7.0.0 || ^7.1.0 || ^7.2.0 || ^7.3.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-7.10.0-release.1.zip", "type": "zip" }, "time": "2020-04-07", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "0.7.4", "authorizenet/authorizenet": "1.9.7", "aws/aws-sdk-php": "3.69.2", "bitpay/php-client": "v3.0.0-p1", "bshaffer/oauth2-server-httpfoundation-bridge": "dev-develop", "bshaffer/oauth2-server-php": "v1.8.0", "composer/composer": "1.0.3-p1", "composer/semver": "1.4.2", "composer/spdx-licenses": "1.1.6", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "v1.4.0", "doctrine/inflector": "v1.1.0", "doctrine/instantiator": "1.0.5", "doctrine/lexer": "v1.0.1", "duosecurity/duo_php": "1.0.0", "ezyang/htmlpurifier": "v4.9.2", "facebook/graph-sdk": "5.5.0", "filp/whoops": "2.1.8", "firebase/php-jwt": "v3.0.0", "goetas-webservices/xsd2php-runtime": "v0.2.7", "google/apiclient": "v2.1.3-p1", "google/auth": "v0.11.1", "google/recaptcha": "1.1.2", "guzzlehttp/guzzle": "5.3.3", "guzzlehttp/promises": "v1.3.1", "guzzlehttp/psr7": "1.4.2", "guzzlehttp/ringphp": "1.1.1", "guzzlehttp/streams": "3.0.0", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v5.2.37", "illuminate/container": "v5.2.37", "illuminate/contracts": "v5.2.45", "illuminate/database": "v5.2.37-p2", "illuminate/events": "v5.2.37", "illuminate/support": "v5.2.37-p1", "illuminate/validation": "v5.2.45", "ircmaxell/password-compat": "v1.0.4", "jms/metadata": "1.6.0", "jms/parser-lib": "1.0.0", "jms/serializer": "1.8.1", "justinrainbow/json-schema": "1.6.1", "knplabs/knp-menu": "v2.1.1", "league/climate": "3.2.1", "league/flysystem": "1.0.45", "league/flysystem-aws-s3-v3": "1.0.21", "league/plates": "3.3.0", "michelf/php-markdown": "1.6.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "1.18.2", "mtdowling/jmespath.php": "2.4.0", "nesbot/carbon": "1.21.0", "nikic/fast-route": "v1.2.0", "paragonie/random_compat": "v1.4.2", "php-imap/php-imap": "2.0.9", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.0.7", "phpmyadmin/sql-parser": "v4.2.4", "phpoption/phpoption": "1.5.0", "phpseclib/mcrypt_compat": "1.0.5", "phpseclib/phpseclib": "2.0.10", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-message": "1.0.1", "psr/log": "1.0.2", "punic/punic": "1.6.3", "ramsey/uuid": "3.4.1", "react/promise": "v2.5.1", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.6.1", "seld/phar-utils": "1.0.1", "smarty/smarty": "v3.1.33-p1", "stripe/stripe-php": "v6.43.1", "symfony/config": "v3.2.14", "symfony/console": "v2.8.7", "symfony/dependency-injection": "v3.1.10", "symfony/filesystem": "v3.3.8", "symfony/finder": "v2.8.7", "symfony/http-foundation": "v2.8.7", "symfony/polyfill-iconv": "v1.2.0", "symfony/polyfill-mbstring": "v1.3.0", "symfony/polyfill-php54": "v1.5.0", "symfony/polyfill-php55": "v1.5.0", "symfony/process": "v3.3.8", "symfony/translation": "v2.8.7", "symfony/yaml": "v2.8.7", "tecnickcom/tcpdf": "6.2.26-p1", "zendframework/zend-diactoros": "1.3.10" }, "extra": {"sha":"3639dbf912734a1a6ea93d9faf1bb73445059b98fd7734910e3d66c79642d96a","sig":"n2pTS8ZOCWaH37FZqw7OtJGtdREd\/v8KWpzkKh9W2ZKJffahpxB0Olf9ES8AfwLkNuEoPaDRLwTTpaKY3r3Y9qJDM2VvAW9tcvu9rDZZHcP66l0nF9bHdF1EWDNnW0FDN\/AYDONLomFlOo6MbKwttndaL78b8muQsdTF32ZCvX9MTfQCFQY\/28AMQeLBzQMQJJiLVctjmFt0kqrtTWPAsNfErm3wqVV33PLRwCYPewdChvmpR7xvH+\/8JL0J1gh7XbjM9JJPmmz1J5vhDn+6+zowh13UBcAnwI4z5sfR7WrhWpV1itDheV8ApsLJZoaHb21oGLz2m30dT5bXhpXanA==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_7.10.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V7.10.0_GA","fileSize":"73143950","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"e+epXDvJ2V9QOnLGOp4TjsVhxchylYCeZyyEHaKNFLnTgUUkQ47kdTQNUW1YIPSlrIh77VDIux\/MzZTuLfkE87MghppK\/zbbglmWExQxwacfn8ZvXSLDcjZCfkGqCoyvuIzpRm6iXwH1EXTor38l1K\/DG0np5etppoeBwk+OdGR0UrUMW9Ik7nRTRFpa8ptQyv28s7jhDit6gKjzMSjXtTXQbvSKniPNWO8lExNf3o9iUxkEeipOueUvOsJTRXqFlNBI+pT6Ug0xRjTP6EHM9PC33Biq33Y2XpRi\/gCWQg5Xlr3lZWQFUKXquS+kGyFGC\/UfLoFG8IZknm75t0BbiA=="},"require":{"ionCubeLoader":"10.1.0"}} }, "7.10.0-rc.2": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "7.10.0-RC.2", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^5.6.0 || ^7.0.0 || ^7.1.0 || ^7.2.0 || ^7.3.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-7.10.0-rc.2.zip", "type": "zip" }, "time": "2020-03-25", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "0.7.4", "authorizenet/authorizenet": "1.9.7", "aws/aws-sdk-php": "3.69.2", "bitpay/php-client": "v3.0.0-p1", "bshaffer/oauth2-server-httpfoundation-bridge": "dev-develop", "bshaffer/oauth2-server-php": "v1.8.0", "composer/composer": "1.0.3-p1", "composer/semver": "1.4.2", "composer/spdx-licenses": "1.1.6", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "v1.4.0", "doctrine/inflector": "v1.1.0", "doctrine/instantiator": "1.0.5", "doctrine/lexer": "v1.0.1", "duosecurity/duo_php": "1.0.0", "ezyang/htmlpurifier": "v4.9.2", "facebook/graph-sdk": "5.5.0", "filp/whoops": "2.1.8", "firebase/php-jwt": "v3.0.0", "goetas-webservices/xsd2php-runtime": "v0.2.7", "google/apiclient": "v2.1.3-p1", "google/auth": "v0.11.1", "google/recaptcha": "1.1.2", "guzzlehttp/guzzle": "5.3.3", "guzzlehttp/promises": "v1.3.1", "guzzlehttp/psr7": "1.4.2", "guzzlehttp/ringphp": "1.1.1", "guzzlehttp/streams": "3.0.0", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v5.2.37", "illuminate/container": "v5.2.37", "illuminate/contracts": "v5.2.45", "illuminate/database": "v5.2.37-p2", "illuminate/events": "v5.2.37", "illuminate/support": "v5.2.37-p1", "illuminate/validation": "v5.2.45", "ircmaxell/password-compat": "v1.0.4", "jms/metadata": "1.6.0", "jms/parser-lib": "1.0.0", "jms/serializer": "1.8.1", "justinrainbow/json-schema": "1.6.1", "knplabs/knp-menu": "v2.1.1", "league/climate": "3.2.1", "league/flysystem": "1.0.45", "league/flysystem-aws-s3-v3": "1.0.21", "league/plates": "3.3.0", "michelf/php-markdown": "1.6.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "1.18.2", "mtdowling/jmespath.php": "2.4.0", "nesbot/carbon": "1.21.0", "nikic/fast-route": "v1.2.0", "paragonie/random_compat": "v1.4.2", "php-imap/php-imap": "2.0.9", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.0.7", "phpmyadmin/sql-parser": "v4.2.4", "phpoption/phpoption": "1.5.0", "phpseclib/mcrypt_compat": "1.0.5", "phpseclib/phpseclib": "2.0.10", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-message": "1.0.1", "psr/log": "1.0.2", "punic/punic": "1.6.3", "ramsey/uuid": "3.4.1", "react/promise": "v2.5.1", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.6.1", "seld/phar-utils": "1.0.1", "smarty/smarty": "v3.1.33-p1", "stripe/stripe-php": "v6.43.1", "symfony/config": "v3.2.14", "symfony/console": "v2.8.7", "symfony/dependency-injection": "v3.1.10", "symfony/filesystem": "v3.3.8", "symfony/finder": "v2.8.7", "symfony/http-foundation": "v2.8.7", "symfony/polyfill-iconv": "v1.2.0", "symfony/polyfill-mbstring": "v1.3.0", "symfony/polyfill-php54": "v1.5.0", "symfony/polyfill-php55": "v1.5.0", "symfony/process": "v3.3.8", "symfony/translation": "v2.8.7", "symfony/yaml": "v2.8.7", "tecnickcom/tcpdf": "6.2.26-p1", "zendframework/zend-diactoros": "1.3.10" }, "extra": {"sha":"b94f57023595ca8a8d504c1ec298d187fd3b07f81fbdfca5989ae26d3d3ab4e3","sig":"kiLNyxpk6FFayt\/GUwg3kRAwZs9sBZVyZ+j7LakgXeKrsXG34KuQdJXguYXIT4JcwtMKZPXJBUA9v0mVwFqLwmSdFRCokLLK1\/M7Qfc4gGMfCDJr+2rau++OC45fr+jfrkgFQmQiK5Bi4juVtZFdFUeVxtlijXA26nCmhZM3ae3yHGjFBQPeGqNe+prz8ZlnTQSNh2D9l1BguhMWVrjIGZ0IligpqkZ6LVKdq6yB+ixIGkUcGOoco9oKrWnYJQKThPU8bAcG2Si\/IL13GoXIw7ZOnA5SpyszmjSNC3RcRy110w+XewmYATq59OPso0e3PoO5BWdbDln\/vgQcdRdTyg==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_7.10.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V7.10.0_RC_2","fileSize":"73055789","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"Y0q4zkez5XZi5CwjjtAxBAte3TjX9vVCiXjmEfaix\/hjAV9dJZFMh\/nQXqoa7mPt5GgUyvMSAHD8Q+abWdn\/G8WcFwouJktO+MTvTc3UsZFSIovIyqolO7XWLNgxNu9l3ms+pmEYFpk2AKJvDQqUs5NFndU4rrS1ovhNB2+JCTsU2A31J4yPF573DW0Odswk3CO6aGfpfKEoNYK+HkMMxRAsBUcTQhAuJBcBgVdFwpsOc8fxw9qrpgcDODpNfao0Jbz3sguPhi9L1KL4othAEzMCHSOZL0VHrVsrgqKS13vY9qUPaw747LOwCTxvobm6iGV3NfZMu2d6xksTz2vqYA=="},"require":{"ionCubeLoader":"10.1.0"}} }, "7.10.0-rc.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "7.10.0-RC.1", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^5.6.0 || ^7.0.0 || ^7.1.0 || ^7.2.0 || ^7.3.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-7.10.0-rc.1.zip", "type": "zip" }, "time": "2020-03-24", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "0.7.4", "authorizenet/authorizenet": "1.9.7", "aws/aws-sdk-php": "3.69.2", "bitpay/php-client": "v3.0.0-p1", "bshaffer/oauth2-server-httpfoundation-bridge": "dev-develop", "bshaffer/oauth2-server-php": "v1.8.0", "composer/composer": "1.0.3-p1", "composer/semver": "1.4.2", "composer/spdx-licenses": "1.1.6", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "v1.4.0", "doctrine/inflector": "v1.1.0", "doctrine/instantiator": "1.0.5", "doctrine/lexer": "v1.0.1", "duosecurity/duo_php": "1.0.0", "ezyang/htmlpurifier": "v4.9.2", "facebook/graph-sdk": "5.5.0", "filp/whoops": "2.1.8", "firebase/php-jwt": "v3.0.0", "goetas-webservices/xsd2php-runtime": "v0.2.7", "google/apiclient": "v2.1.3-p1", "google/auth": "v0.11.1", "google/recaptcha": "1.1.2", "guzzlehttp/guzzle": "5.3.3", "guzzlehttp/promises": "v1.3.1", "guzzlehttp/psr7": "1.4.2", "guzzlehttp/ringphp": "1.1.1", "guzzlehttp/streams": "3.0.0", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v5.2.37", "illuminate/container": "v5.2.37", "illuminate/contracts": "v5.2.45", "illuminate/database": "v5.2.37-p2", "illuminate/events": "v5.2.37", "illuminate/support": "v5.2.37-p1", "illuminate/validation": "v5.2.45", "ircmaxell/password-compat": "v1.0.4", "jms/metadata": "1.6.0", "jms/parser-lib": "1.0.0", "jms/serializer": "1.8.1", "justinrainbow/json-schema": "1.6.1", "knplabs/knp-menu": "v2.1.1", "league/climate": "3.2.1", "league/flysystem": "1.0.45", "league/flysystem-aws-s3-v3": "1.0.21", "league/plates": "3.3.0", "michelf/php-markdown": "1.6.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "1.18.2", "mtdowling/jmespath.php": "2.4.0", "nesbot/carbon": "1.21.0", "nikic/fast-route": "v1.2.0", "paragonie/random_compat": "v1.4.2", "php-imap/php-imap": "2.0.9", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.0.7", "phpmyadmin/sql-parser": "v4.2.4", "phpoption/phpoption": "1.5.0", "phpseclib/mcrypt_compat": "1.0.5", "phpseclib/phpseclib": "2.0.10", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-message": "1.0.1", "psr/log": "1.0.2", "punic/punic": "1.6.3", "ramsey/uuid": "3.4.1", "react/promise": "v2.5.1", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.6.1", "seld/phar-utils": "1.0.1", "smarty/smarty": "v3.1.33-p1", "stripe/stripe-php": "v6.43.1", "symfony/config": "v3.2.14", "symfony/console": "v2.8.7", "symfony/dependency-injection": "v3.1.10", "symfony/filesystem": "v3.3.8", "symfony/finder": "v2.8.7", "symfony/http-foundation": "v2.8.7", "symfony/polyfill-iconv": "v1.2.0", "symfony/polyfill-mbstring": "v1.3.0", "symfony/polyfill-php54": "v1.5.0", "symfony/polyfill-php55": "v1.5.0", "symfony/process": "v3.3.8", "symfony/translation": "v2.8.7", "symfony/yaml": "v2.8.7", "tecnickcom/tcpdf": "6.2.26-p1", "zendframework/zend-diactoros": "1.3.10" }, "extra": {"sha":"99f9ece5dd700eeb23b1a5f55048777005fede2a748af6ccebdbd8b057dd1ca4","sig":"DRWdKgrlKi5LjGi\/oOs7Bgy2I8WmF+FPuM0Yt7NZuMezLaMgl2xieogdJg0\/QOHhTfdidE0QVKRR9NRoCA4h4INVnUJ1LC55IEYCPx6jILjC+7egg\/RMg+\/W81gkGcY7Fp5YaZNYWCukMqvptpyWu1KnuBVqgAJWUL6K99fB2715fX\/hcduim7MBDqf7SdELnZcGSG0Kv19WfPA72XpPoblJPIF+x+1ONZIRBH7E4TpPuASZURvlehiDec7qHEYBqHNb07+5DkS63VEGU1zmm3xHeDh5VXZWlxeVzGP2v4KbXVqPnHE7bnegehz7dUK+otf3uxtTE41f5EZNndbiJQ==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_7.10.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V7.10.0_RC_1","fileSize":"73065471","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"fj+hOhQ4exZvqKrISnYPqumTO97S6yC5v5lyHI7JbahibEbWEvcPFgKEGXtvqhgT0GV+Sk70iWnX57XPS\/UI55XX4h9GqJzDdHpPAvrhf8LrUwSDNte5HFWj\/0DegSCo1iXQuO6kAkGroVWsxWbuUA\/kCgEBjBfPwmcuOaoDQbsF2n5B6RMhPUpBZ7a1ybZxoqRNms6IatwpMX4a8WyaGwawDDHVJSa6C5StWwhLjqAlngRWQuImZO0BLh78aCtEdslge\/fZDHTjghnqUz4K9TRsCyYO4qNOUBDF6KRY4J3QvzVl8CFBRc\/bGiFoT+MgIbUUGjs8Nd+tpF8x1m4L8A=="},"require":{"ionCubeLoader":"10.1.0"}} }, "7.10.0-beta.1": { "name": "whmcs/whmcs", "homepage": "https://whmcs.com/", "description": "An all-in-one client management, billing, and support solution for online businesses", "version": "7.10.0-beta.1", "require": { "ext-gd": "*", "lib-curl": "*", "php": "^5.6.0 || ^7.0.0 || ^7.1.0 || ^7.2.0 || ^7.3.0" }, "dist": { "url": "https://releases.whmcs.com/v2/pkgs/whmcs-7.10.0-beta.1.zip", "type": "zip" }, "time": "2020-03-10", "type": "project", "license": [ "Proprietary" ], "authors": [ { "name": "WHMCS Limited", "role" : "Developer", "homepage" : "https://www.whmcs.com/" } ], "support": { "forum": "https://forums.whmcs.com/", "docs": "https://docs.whmcs.com/", "issues": "https://bugs.whmcs.com/" }, "replaces": { "abraham/twitteroauth": "0.7.4", "authorizenet/authorizenet": "1.9.7", "aws/aws-sdk-php": "3.69.2", "bitpay/php-client": "v3.0.0-p1", "bshaffer/oauth2-server-httpfoundation-bridge": "dev-develop", "bshaffer/oauth2-server-php": "v1.8.0", "composer/composer": "1.0.3-p1", "composer/semver": "1.4.2", "composer/spdx-licenses": "1.1.6", "container-interop/container-interop": "1.2.0", "doctrine/annotations": "v1.4.0", "doctrine/inflector": "v1.1.0", "doctrine/instantiator": "1.0.5", "doctrine/lexer": "v1.0.1", "duosecurity/duo_php": "1.0.0", "ezyang/htmlpurifier": "v4.9.2", "facebook/graph-sdk": "5.5.0", "filp/whoops": "2.1.8", "firebase/php-jwt": "v3.0.0", "goetas-webservices/xsd2php-runtime": "v0.2.7", "google/apiclient": "v2.1.3-p1", "google/auth": "v0.11.1", "google/recaptcha": "1.1.2", "guzzlehttp/guzzle": "5.3.3", "guzzlehttp/promises": "v1.3.1", "guzzlehttp/psr7": "1.4.2", "guzzlehttp/ringphp": "1.1.1", "guzzlehttp/streams": "3.0.0", "http-interop/http-factory": "0.2.0", "http-interop/http-middleware": "0.4.1", "illuminate/console": "v5.2.37", "illuminate/container": "v5.2.37", "illuminate/contracts": "v5.2.45", "illuminate/database": "v5.2.37-p2", "illuminate/events": "v5.2.37", "illuminate/support": "v5.2.37-p1", "illuminate/validation": "v5.2.45", "ircmaxell/password-compat": "v1.0.4", "jms/metadata": "1.6.0", "jms/parser-lib": "1.0.0", "jms/serializer": "1.8.1", "justinrainbow/json-schema": "1.6.1", "knplabs/knp-menu": "v2.1.1", "league/climate": "3.2.1", "league/flysystem": "1.0.45", "league/flysystem-aws-s3-v3": "1.0.21", "league/plates": "3.3.0", "michelf/php-markdown": "1.6.0", "middlewares/fast-route": "v0.4.0", "middlewares/utils": "v0.9.0", "mindplay/middleman": "dev-whmcs_custom", "mindplay/readable": "1.1.1", "monolog/monolog": "1.18.2", "mtdowling/jmespath.php": "2.4.0", "nesbot/carbon": "1.21.0", "nikic/fast-route": "v1.2.0", "paragonie/random_compat": "v1.4.2", "php-imap/php-imap": "2.0.9", "phpcollection/phpcollection": "0.5.0", "phpmailer/phpmailer": "v6.0.7", "phpmyadmin/sql-parser": "v4.2.4", "phpoption/phpoption": "1.5.0", "phpseclib/mcrypt_compat": "1.0.5", "phpseclib/phpseclib": "2.0.10", "psr/cache": "1.0.1", "psr/container": "1.0.0", "psr/http-message": "1.0.1", "psr/log": "1.0.2", "punic/punic": "1.6.3", "ramsey/uuid": "3.4.1", "react/promise": "v2.5.1", "seld/cli-prompt": "1.0.3", "seld/jsonlint": "1.6.1", "seld/phar-utils": "1.0.1", "smarty/smarty": "v3.1.33-p1", "stripe/stripe-php": "v6.43.1", "symfony/config": "v3.2.14", "symfony/console": "v2.8.7", "symfony/dependency-injection": "v3.1.10", "symfony/filesystem": "v3.3.8", "symfony/finder": "v2.8.7", "symfony/http-foundation": "v2.8.7", "symfony/polyfill-iconv": "v1.2.0", "symfony/polyfill-mbstring": "v1.3.0", "symfony/polyfill-php54": "v1.5.0", "symfony/polyfill-php55": "v1.5.0", "symfony/process": "v3.3.8", "symfony/translation": "v2.8.7", "symfony/yaml": "v2.8.7", "tecnickcom/tcpdf": "6.2.26-p1", "zendframework/zend-diactoros": "1.3.10" }, "extra": {"sha":"a5d1ee3947d04d3cb8ca6409dd9b295aecec40fa468ac3f29207c938e289c320","sig":"K9J4MtrDRwlkDdsuHPe8ebGat2OH5Ozj1qHED9O92WLeSZwm1KzAikj+L7HwOrEYdCzM3YkRS6i8wRG7mlOo00THPQvbqHkU+laD5Vn4mQm8lSZFEykr4K\/k+m+sfjyNiil0jc1x936+n5E86PFwwy+8AI+N2D5AL8E0XSPFYeDurCfnulluvvNWBqhZPfNE2phIJBQnR9uAKf8aGpkLNq8q7RSPLFDaGtB97Ov0ga0cwEYYJwO526SjY+HDKWMs8FEPDigsfbs4mmHT\/giQzR2xyPJD4BnQBmrLH6EnQyqBkNxZlTOfOLMhxSFTdW3NLwDojMzWJjH\/4oG6u04biA==","keyIdentifier":"0C12A820D7DD9EDBB53BB7B316E02B339A87FFC1","releaseNotesUrl":"https:\/\/docs.whmcs.com\/Version_7.10.0_Release_Notes","changeLogUrl":"https:\/\/docs.whmcs.com\/Changelog:WHMCS_V7.10.0_Beta_1","fileSize":"72902697","minMemoryLimit":"67108864","notifications":{"messages":[],"sig":"REajQT7QmOXTM0aiqX2pMPNVjVZrgEwfUVbTVuac\/X6tT31qrzdI5P9StCmqRIUeGomuNNk+jUWEJOn+b9je5\/skBVe2exs9Ao74P+ud8pQsYEHays2IKVoTqh21MB8jw5WviBT08Yg+J+Penl3zGQjUokqbMub0OtN\/B\/w4okHZXEcsHXXMTZRUG1FD5nBp+hjRssusHz\/Zg\/Xur1QRiyLwmIabnai7XoLL10G8QP4QpIP7NSqpNjq+GHRmC9cuRoj0FYi\/DORB3NTNmaiKH\/OBIbwpyItqfry2rYbx97odtfIFb1kruuHpk\/LKZBxMylFu3PJUDNfD+mcfnzojog=="},"require":{"ionCubeLoader":"10.1.0"}} } } } } installed.php 0000644 00000156626 14736103146 0007261 0 ustar 00 <?php return array( 'root' => array( 'pretty_version' => '1.0.0+no-version-set', 'version' => '1.0.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), 'reference' => NULL, 'name' => '__root__', 'dev' => false, ), 'versions' => array( '__root__' => array( 'pretty_version' => '1.0.0+no-version-set', 'version' => '1.0.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), 'reference' => NULL, 'dev_requirement' => false, ), 'abraham/twitteroauth' => array( 'pretty_version' => '1.1.0', 'version' => '1.1.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../abraham/twitteroauth', 'aliases' => array(), 'reference' => 'd54b71c2eee94252154e7b50656e17422fa0b9e1', 'dev_requirement' => false, ), 'authorizenet/authorizenet' => array( 'pretty_version' => '1.9.9', 'version' => '1.9.9.0', 'type' => 'library', 'install_path' => __DIR__ . '/../authorizenet/authorizenet', 'aliases' => array(), 'reference' => '31bb167baeec86eb87908e40db58a3de0eba406f', 'dev_requirement' => false, ), 'aws/aws-sdk-php' => array( 'pretty_version' => '3.138.0', 'version' => '3.138.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../aws/aws-sdk-php', 'aliases' => array(), 'reference' => '32a4fa88dffc4328d415b922ef74819dfe060696', 'dev_requirement' => false, ), 'bitpay/php-client' => array( 'pretty_version' => 'v3.0.0-p2', 'version' => '3.0.0.0-patch2', 'type' => 'library', 'install_path' => __DIR__ . '/../bitpay/php-client', 'aliases' => array(), 'reference' => '8068951b9b8e11789826dcd74fb12eab94a7a32d', 'dev_requirement' => false, ), 'brick/math' => array( 'pretty_version' => '0.8.15', 'version' => '0.8.15.0', 'type' => 'library', 'install_path' => __DIR__ . '/../brick/math', 'aliases' => array(), 'reference' => '9b08d412b9da9455b210459ff71414de7e6241cd', 'dev_requirement' => false, ), 'bshaffer/oauth2-server-httpfoundation-bridge' => array( 'pretty_version' => 'v1.4-p1', 'version' => '1.4.0.0-patch1', 'type' => 'library', 'install_path' => __DIR__ . '/../bshaffer/oauth2-server-httpfoundation-bridge', 'aliases' => array(), 'reference' => '4b838b63f7ac45b3ab26861a3f0d4f57f35175e6', 'dev_requirement' => false, ), 'bshaffer/oauth2-server-php' => array( 'pretty_version' => 'v1.11.1-p1', 'version' => '1.11.1.0-patch1', 'type' => 'library', 'install_path' => __DIR__ . '/../bshaffer/oauth2-server-php', 'aliases' => array(), 'reference' => '405d83c669437dbf772e52eefef3d3d26136e391', 'dev_requirement' => false, ), 'cebe/php-openapi' => array( 'pretty_version' => '1.5.2', 'version' => '1.5.2.0', 'type' => 'library', 'install_path' => __DIR__ . '/../cebe/php-openapi', 'aliases' => array(), 'reference' => '8f1f70688fd4bea04410718616450a38b7b8c40b', 'dev_requirement' => false, ), 'composer/ca-bundle' => array( 'pretty_version' => '1.2.8', 'version' => '1.2.8.0', 'type' => 'library', 'install_path' => __DIR__ . '/./ca-bundle', 'aliases' => array(), 'reference' => '8a7ecad675253e4654ea05505233285377405215', 'dev_requirement' => false, ), 'composer/composer' => array( 'pretty_version' => 'dev-v1.10.6-php72-php81-compat', 'version' => 'dev-v1.10.6-php72-php81-compat', 'type' => 'library', 'install_path' => __DIR__ . '/./composer', 'aliases' => array(), 'reference' => 'acd35ad3cc3d23a3b0f74035728277406753fde8', 'dev_requirement' => false, ), 'composer/semver' => array( 'pretty_version' => '1.5.1', 'version' => '1.5.1.0', 'type' => 'library', 'install_path' => __DIR__ . '/./semver', 'aliases' => array(), 'reference' => 'c6bea70230ef4dd483e6bbcab6005f682ed3a8de', 'dev_requirement' => false, ), 'composer/spdx-licenses' => array( 'pretty_version' => '1.5.3', 'version' => '1.5.3.0', 'type' => 'library', 'install_path' => __DIR__ . '/./spdx-licenses', 'aliases' => array(), 'reference' => '0c3e51e1880ca149682332770e25977c70cf9dae', 'dev_requirement' => false, ), 'composer/xdebug-handler' => array( 'pretty_version' => '1.4.3', 'version' => '1.4.3.0', 'type' => 'library', 'install_path' => __DIR__ . '/./xdebug-handler', 'aliases' => array(), 'reference' => 'ebd27a9866ae8254e873866f795491f02418c5a5', 'dev_requirement' => false, ), 'container-interop/container-interop' => array( 'pretty_version' => '1.2.0', 'version' => '1.2.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../container-interop/container-interop', 'aliases' => array(), 'reference' => '79cbf1341c22ec75643d841642dd5d6acd83bdb8', 'dev_requirement' => false, ), 'doctrine/annotations' => array( 'pretty_version' => '1.10.4', 'version' => '1.10.4.0', 'type' => 'library', 'install_path' => __DIR__ . '/../doctrine/annotations', 'aliases' => array(), 'reference' => 'bfe91e31984e2ba76df1c1339681770401ec262f', 'dev_requirement' => false, ), 'doctrine/inflector' => array( 'pretty_version' => '1.4.1', 'version' => '1.4.1.0', 'type' => 'library', 'install_path' => __DIR__ . '/../doctrine/inflector', 'aliases' => array(), 'reference' => '915c55a3bad5f319b2396530a9bdef953538da9a', 'dev_requirement' => false, ), 'doctrine/instantiator' => array( 'pretty_version' => '1.4.1', 'version' => '1.4.1.0', 'type' => 'library', 'install_path' => __DIR__ . '/../doctrine/instantiator', 'aliases' => array(), 'reference' => '10dcfce151b967d20fde1b34ae6640712c3891bc', 'dev_requirement' => false, ), 'doctrine/lexer' => array( 'pretty_version' => '1.2.0', 'version' => '1.2.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../doctrine/lexer', 'aliases' => array(), 'reference' => '5242d66dbeb21a30dd8a3e66bf7a73b66e05e1f6', 'dev_requirement' => false, ), 'duosecurity/duo_php' => array( 'pretty_version' => '1.0.1', 'version' => '1.0.1.0', 'type' => 'library', 'install_path' => __DIR__ . '/../duosecurity/duo_php', 'aliases' => array(), 'reference' => '0c6508b42e50c03b98ef8cbea242f26a6295cb16', 'dev_requirement' => false, ), 'egulias/email-validator' => array( 'pretty_version' => '2.1.22', 'version' => '2.1.22.0', 'type' => 'library', 'install_path' => __DIR__ . '/../egulias/email-validator', 'aliases' => array(), 'reference' => '68e418ec08fbfc6f58f6fd2eea70ca8efc8cc7d5', 'dev_requirement' => false, ), 'ezyang/htmlpurifier' => array( 'pretty_version' => 'v4.12.0', 'version' => '4.12.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../ezyang/htmlpurifier', 'aliases' => array(), 'reference' => 'e014ec07ef0d24a9e75d2d62211260acd4cc6f87', 'dev_requirement' => false, ), 'facebook/graph-sdk' => array( 'pretty_version' => '5.7.0', 'version' => '5.7.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../facebook/graph-sdk', 'aliases' => array(), 'reference' => '2d8250638b33d73e7a87add65f47fabf91f8ad9b', 'dev_requirement' => false, ), 'filp/whoops' => array( 'pretty_version' => '2.14.3', 'version' => '2.14.3.0', 'type' => 'library', 'install_path' => __DIR__ . '/../filp/whoops', 'aliases' => array(), 'reference' => '89584ce67dd32307f1063cc43846674f4679feda', 'dev_requirement' => false, ), 'firebase/php-jwt' => array( 'pretty_version' => 'v5.2.0', 'version' => '5.2.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../firebase/php-jwt', 'aliases' => array(), 'reference' => 'feb0e820b8436873675fd3aca04f3728eb2185cb', 'dev_requirement' => false, ), 'goetas-webservices/xsd2php-runtime' => array( 'pretty_version' => 'v0.2.12', 'version' => '0.2.12.0', 'type' => 'library', 'install_path' => __DIR__ . '/../goetas-webservices/xsd2php-runtime', 'aliases' => array(), 'reference' => '306d346eb39720ff6ca6c7108b3d9fe2ae328089', 'dev_requirement' => false, ), 'google/apiclient' => array( 'pretty_version' => '2.7.0-p1', 'version' => '2.7.0.0-patch1', 'type' => 'library', 'install_path' => __DIR__ . '/../google/apiclient', 'aliases' => array(), 'reference' => 'cd5b5f03d50163b558c993cb18751720e9945d91', 'dev_requirement' => false, ), 'google/auth' => array( 'pretty_version' => 'v1.11.1', 'version' => '1.11.1.0', 'type' => 'library', 'install_path' => __DIR__ . '/../google/auth', 'aliases' => array(), 'reference' => 'bb959e91bd8ffbd352ab76cbf11d656ce6435088', 'dev_requirement' => false, ), 'google/recaptcha' => array( 'pretty_version' => '1.2.4', 'version' => '1.2.4.0', 'type' => 'library', 'install_path' => __DIR__ . '/../google/recaptcha', 'aliases' => array(), 'reference' => '7a00e63f5949735ca14f8d2042bca8fe1b681fe2', 'dev_requirement' => false, ), 'guzzlehttp/guzzle' => array( 'pretty_version' => '7.0.1', 'version' => '7.0.1.0', 'type' => 'library', 'install_path' => __DIR__ . '/../guzzlehttp/guzzle', 'aliases' => array(), 'reference' => '2d9d3c186a6637a43193e66b097c50e4451eaab2', 'dev_requirement' => false, ), 'guzzlehttp/promises' => array( 'pretty_version' => '1.4.0', 'version' => '1.4.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../guzzlehttp/promises', 'aliases' => array(), 'reference' => '60d379c243457e073cff02bc323a2a86cb355631', 'dev_requirement' => false, ), 'guzzlehttp/psr7' => array( 'pretty_version' => '1.6.1', 'version' => '1.6.1.0', 'type' => 'library', 'install_path' => __DIR__ . '/../guzzlehttp/psr7', 'aliases' => array(), 'reference' => '239400de7a173fe9901b9ac7c06497751f00727a', 'dev_requirement' => false, ), 'http-interop/http-factory' => array( 'pretty_version' => '0.2.0', 'version' => '0.2.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../http-interop/http-factory', 'aliases' => array(), 'reference' => '403aec5f2451ff83b5ffffea0bfdb588502add3e', 'dev_requirement' => false, ), 'http-interop/http-middleware' => array( 'pretty_version' => '0.4.1', 'version' => '0.4.1.0', 'type' => 'library', 'install_path' => __DIR__ . '/../http-interop/http-middleware', 'aliases' => array(), 'reference' => '9a801fe60e70d5d608b61d56b2dcde29516c81b9', 'dev_requirement' => false, ), 'illuminate/console' => array( 'pretty_version' => 'v7.12.0', 'version' => '7.12.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../illuminate/console', 'aliases' => array(), 'reference' => 'c95fc7f09c968ee346a0484cd82afc08f3d5499f', 'dev_requirement' => false, ), 'illuminate/container' => array( 'pretty_version' => 'dev-v7.12.0-php72-php81-compat', 'version' => 'dev-v7.12.0-php72-php81-compat', 'type' => 'library', 'install_path' => __DIR__ . '/../illuminate/container', 'aliases' => array( 0 => '7.12.0', ), 'reference' => 'd71e49bdfe42b8280e3f6e0665e7523f31e6555e', 'dev_requirement' => false, ), 'illuminate/contracts' => array( 'pretty_version' => 'v7.12.0', 'version' => '7.12.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../illuminate/contracts', 'aliases' => array(), 'reference' => '42792e136e3a77312fb89df29373d6221a1f794e', 'dev_requirement' => false, ), 'illuminate/database' => array( 'pretty_version' => 'dev-v7.12.0-php72-php81-compat', 'version' => 'dev-v7.12.0-php72-php81-compat', 'type' => 'library', 'install_path' => __DIR__ . '/../illuminate/database', 'aliases' => array(), 'reference' => '864b97e1c7dfdefe1965300537039b79e8821146', 'dev_requirement' => false, ), 'illuminate/events' => array( 'pretty_version' => 'v7.12.0', 'version' => '7.12.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../illuminate/events', 'aliases' => array(), 'reference' => '59f6074ff6b14b475c7c97021dcbcd2e2bce2ebd', 'dev_requirement' => false, ), 'illuminate/filesystem' => array( 'pretty_version' => 'v7.28.4', 'version' => '7.28.4.0', 'type' => 'library', 'install_path' => __DIR__ . '/../illuminate/filesystem', 'aliases' => array(), 'reference' => '393756aab086f643fc4e7ee2639bf792b754e767', 'dev_requirement' => false, ), 'illuminate/support' => array( 'pretty_version' => 'v7.12.0', 'version' => '7.12.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../illuminate/support', 'aliases' => array(), 'reference' => 'c06d87c1f2126e32337239163a6ae98b06635aeb', 'dev_requirement' => false, ), 'illuminate/translation' => array( 'pretty_version' => 'v7.28.4', 'version' => '7.28.4.0', 'type' => 'library', 'install_path' => __DIR__ . '/../illuminate/translation', 'aliases' => array(), 'reference' => '6c60b567e86ea84d6a1706a52c9d30c903c8bdf1', 'dev_requirement' => false, ), 'illuminate/validation' => array( 'pretty_version' => 'v7.12.0', 'version' => '7.12.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../illuminate/validation', 'aliases' => array(), 'reference' => 'deebeb721ccd8260022e44be16610775515ce073', 'dev_requirement' => false, ), 'jms/metadata' => array( 'pretty_version' => '1.7.0', 'version' => '1.7.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../jms/metadata', 'aliases' => array(), 'reference' => 'e5854ab1aa643623dc64adde718a8eec32b957a8', 'dev_requirement' => false, ), 'jms/parser-lib' => array( 'pretty_version' => '1.0.0', 'version' => '1.0.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../jms/parser-lib', 'aliases' => array(), 'reference' => 'c509473bc1b4866415627af0e1c6cc8ac97fa51d', 'dev_requirement' => false, ), 'jms/serializer' => array( 'pretty_version' => 'dev-v1.14.1-php72-php81-compat', 'version' => 'dev-v1.14.1-php72-php81-compat', 'type' => 'library', 'install_path' => __DIR__ . '/../jms/serializer', 'aliases' => array( 0 => '1.14.1', ), 'reference' => '901d931f11c57d10dabcee62fbdb5dea3e95c456', 'dev_requirement' => false, ), 'justinrainbow/json-schema' => array( 'pretty_version' => '5.2.9', 'version' => '5.2.9.0', 'type' => 'library', 'install_path' => __DIR__ . '/../justinrainbow/json-schema', 'aliases' => array(), 'reference' => '44c6787311242a979fa15c704327c20e7221a0e4', 'dev_requirement' => false, ), 'knplabs/knp-menu' => array( 'pretty_version' => 'v3.1.1', 'version' => '3.1.1.0', 'type' => 'library', 'install_path' => __DIR__ . '/../knplabs/knp-menu', 'aliases' => array(), 'reference' => '254fb64d545f087451cc197a7fa5d47e03ffb038', 'dev_requirement' => false, ), 'laminas/laminas-diactoros' => array( 'pretty_version' => '2.3.1', 'version' => '2.3.1.0', 'type' => 'library', 'install_path' => __DIR__ . '/../laminas/laminas-diactoros', 'aliases' => array(), 'reference' => '2ffc7cc816f6207b27923ee15edf6fac668390aa', 'dev_requirement' => false, ), 'laminas/laminas-httphandlerrunner' => array( 'pretty_version' => '1.2.0', 'version' => '1.2.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../laminas/laminas-httphandlerrunner', 'aliases' => array(), 'reference' => 'e1a5dad040e0043135e8095ee27d1fbf6fb640e1', 'dev_requirement' => false, ), 'laminas/laminas-loader' => array( 'pretty_version' => '2.6.1', 'version' => '2.6.1.0', 'type' => 'library', 'install_path' => __DIR__ . '/../laminas/laminas-loader', 'aliases' => array(), 'reference' => '5d01c2c237ae9e68bec262f339947e2ea18979bc', 'dev_requirement' => false, ), 'laminas/laminas-mail' => array( 'pretty_version' => '2.14.0-p1', 'version' => '2.14.0.0-patch1', 'type' => 'library', 'install_path' => __DIR__ . '/../laminas/laminas-mail', 'aliases' => array(), 'reference' => '901ab7a822bf377288aa0d1354618ecdd687dafd', 'dev_requirement' => false, ), 'laminas/laminas-mime' => array( 'pretty_version' => '2.7.4', 'version' => '2.7.4.0', 'type' => 'library', 'install_path' => __DIR__ . '/../laminas/laminas-mime', 'aliases' => array(), 'reference' => 'e45a7d856bf7b4a7b5bd00d6371f9961dc233add', 'dev_requirement' => false, ), 'laminas/laminas-stdlib' => array( 'pretty_version' => '3.3.0', 'version' => '3.3.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../laminas/laminas-stdlib', 'aliases' => array(), 'reference' => 'b9d84eaa39fde733356ea948cdef36c631f202b6', 'dev_requirement' => false, ), 'laminas/laminas-validator' => array( 'pretty_version' => '2.13.4', 'version' => '2.13.4.0', 'type' => 'library', 'install_path' => __DIR__ . '/../laminas/laminas-validator', 'aliases' => array(), 'reference' => '93593684e70b8ed1e870cacd34ca32b0c0ace185', 'dev_requirement' => false, ), 'laminas/laminas-zendframework-bridge' => array( 'pretty_version' => '1.1.1', 'version' => '1.1.1.0', 'type' => 'library', 'install_path' => __DIR__ . '/../laminas/laminas-zendframework-bridge', 'aliases' => array(), 'reference' => '6ede70583e101030bcace4dcddd648f760ddf642', 'dev_requirement' => false, ), 'league/climate' => array( 'pretty_version' => '3.5.2', 'version' => '3.5.2.0', 'type' => 'library', 'install_path' => __DIR__ . '/../league/climate', 'aliases' => array(), 'reference' => '6b53a28a58ad9f5f63042e291eb870cf0d02a9c9', 'dev_requirement' => false, ), 'league/flysystem' => array( 'pretty_version' => '1.0.67', 'version' => '1.0.67.0', 'type' => 'library', 'install_path' => __DIR__ . '/../league/flysystem', 'aliases' => array(), 'reference' => '5b1f36c75c4bdde981294c2a0ebdb437ee6f275e', 'dev_requirement' => false, ), 'league/flysystem-aws-s3-v3' => array( 'pretty_version' => '1.0.24', 'version' => '1.0.24.0', 'type' => 'library', 'install_path' => __DIR__ . '/../league/flysystem-aws-s3-v3', 'aliases' => array(), 'reference' => '4382036bde5dc926f9b8b337e5bdb15e5ec7b570', 'dev_requirement' => false, ), 'league/oauth2-client' => array( 'pretty_version' => '2.5.0', 'version' => '2.5.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../league/oauth2-client', 'aliases' => array(), 'reference' => 'd9f2a1e000dc14eb3c02e15d15759385ec7ff0fb', 'dev_requirement' => false, ), 'league/oauth2-google' => array( 'pretty_version' => '3.0.3', 'version' => '3.0.3.0', 'type' => 'library', 'install_path' => __DIR__ . '/../league/oauth2-google', 'aliases' => array(), 'reference' => '18d1889897a8b18d85ecadacf74c9274d678d943', 'dev_requirement' => false, ), 'league/openapi-psr7-validator' => array( 'pretty_version' => '0.16.4', 'version' => '0.16.4.0', 'type' => 'library', 'install_path' => __DIR__ . '/../league/openapi-psr7-validator', 'aliases' => array(), 'reference' => 'a87c402b6c9af07e4638ab542031c606483f75bd', 'dev_requirement' => false, ), 'league/plates' => array( 'pretty_version' => '3.3.0', 'version' => '3.3.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../league/plates', 'aliases' => array(), 'reference' => 'b1684b6f127714497a0ef927ce42c0b44b45a8af', 'dev_requirement' => false, ), 'league/uri' => array( 'pretty_version' => '6.7.1', 'version' => '6.7.1.0', 'type' => 'library', 'install_path' => __DIR__ . '/../league/uri', 'aliases' => array(), 'reference' => '2d7c87a0860f3126a39f44a8a9bf2fed402dcfea', 'dev_requirement' => false, ), 'league/uri-interfaces' => array( 'pretty_version' => '2.3.0', 'version' => '2.3.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../league/uri-interfaces', 'aliases' => array(), 'reference' => '00e7e2943f76d8cb50c7dfdc2f6dee356e15e383', 'dev_requirement' => false, ), 'michelf/php-markdown' => array( 'pretty_version' => '1.9.0', 'version' => '1.9.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../michelf/php-markdown', 'aliases' => array(), 'reference' => 'c83178d49e372ca967d1a8c77ae4e051b3a3c75c', 'dev_requirement' => false, ), 'middlewares/fast-route' => array( 'pretty_version' => 'v0.4.0', 'version' => '0.4.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../middlewares/fast-route', 'aliases' => array(), 'reference' => 'ed3d1313db6e9d0cc7668a6fa655d9f7b6a60e2d', 'dev_requirement' => false, ), 'middlewares/utils' => array( 'pretty_version' => 'v0.9.0', 'version' => '0.9.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../middlewares/utils', 'aliases' => array(), 'reference' => 'eafb1fea07663e7c2fb844e393291cbc9cf14d8e', 'dev_requirement' => false, ), 'mindplay/middleman' => array( 'pretty_version' => 'dev-whmcs_custom', 'version' => 'dev-whmcs_custom', 'type' => 'library', 'install_path' => __DIR__ . '/../mindplay/middleman', 'aliases' => array(), 'reference' => 'ff114e34f0b6620f095fe022857813c79486bfc0', 'dev_requirement' => false, ), 'mindplay/readable' => array( 'pretty_version' => '1.1.1', 'version' => '1.1.1.0', 'type' => 'library', 'install_path' => __DIR__ . '/../mindplay/readable', 'aliases' => array(), 'reference' => '4363be7253d217b287eced3cc4ea55671ee15d0c', 'dev_requirement' => false, ), 'monolog/monolog' => array( 'pretty_version' => '2.0.2', 'version' => '2.0.2.0', 'type' => 'library', 'install_path' => __DIR__ . '/../monolog/monolog', 'aliases' => array(), 'reference' => 'c861fcba2ca29404dc9e617eedd9eff4616986b8', 'dev_requirement' => false, ), 'mtdowling/jmespath.php' => array( 'pretty_version' => '2.6.0', 'version' => '2.6.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../mtdowling/jmespath.php', 'aliases' => array(), 'reference' => '42dae2cbd13154083ca6d70099692fef8ca84bfb', 'dev_requirement' => false, ), 'nesbot/carbon' => array( 'pretty_version' => '2.63.0', 'version' => '2.63.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../nesbot/carbon', 'aliases' => array(), 'reference' => 'ad35dd71a6a212b98e4b87e97389b6fa85f0e347', 'dev_requirement' => false, ), 'nikic/fast-route' => array( 'pretty_version' => 'v1.3.0', 'version' => '1.3.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../nikic/fast-route', 'aliases' => array(), 'reference' => '181d480e08d9476e61381e04a71b34dc0432e812', 'dev_requirement' => false, ), 'paragonie/random_compat' => array( 'pretty_version' => 'v9.99.100', 'version' => '9.99.100.0', 'type' => 'library', 'install_path' => __DIR__ . '/../paragonie/random_compat', 'aliases' => array(), 'reference' => '5ab49d1b4355dc858e52f9cdda22f08cba9b6e1c', 'dev_requirement' => false, ), 'phpcollection/phpcollection' => array( 'pretty_version' => '0.5.0', 'version' => '0.5.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../phpcollection/phpcollection', 'aliases' => array(), 'reference' => 'f2bcff45c0da7c27991bbc1f90f47c4b7fb434a6', 'dev_requirement' => false, ), 'phpmailer/phpmailer' => array( 'pretty_version' => 'v6.2.0', 'version' => '6.2.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../phpmailer/phpmailer', 'aliases' => array(), 'reference' => 'e38888a75c070304ca5514197d4847a59a5c853f', 'dev_requirement' => false, ), 'phpmyadmin/sql-parser' => array( 'pretty_version' => '5.3.1', 'version' => '5.3.1.0', 'type' => 'library', 'install_path' => __DIR__ . '/../phpmyadmin/sql-parser', 'aliases' => array(), 'reference' => '46e00927f5b1bc2b87a56be4547551d9f76167e3', 'dev_requirement' => false, ), 'phpoption/phpoption' => array( 'pretty_version' => '1.7.3', 'version' => '1.7.3.0', 'type' => 'library', 'install_path' => __DIR__ . '/../phpoption/phpoption', 'aliases' => array(), 'reference' => '4acfd6a4b33a509d8c88f50e5222f734b6aeebae', 'dev_requirement' => false, ), 'phpseclib/mcrypt_compat' => array( 'pretty_version' => '1.0.12', 'version' => '1.0.12.0', 'type' => 'library', 'install_path' => __DIR__ . '/../phpseclib/mcrypt_compat', 'aliases' => array(), 'reference' => '1fab24bc53edf9b49268162e7bfb4ce5c16ed4e3', 'dev_requirement' => false, ), 'phpseclib/phpseclib' => array( 'pretty_version' => '2.0.39', 'version' => '2.0.39.0', 'type' => 'library', 'install_path' => __DIR__ . '/../phpseclib/phpseclib', 'aliases' => array(), 'reference' => 'f3a0e2b715c40cf1fd270d444901b63311725d63', 'dev_requirement' => false, ), 'psr/cache' => array( 'pretty_version' => '1.0.1', 'version' => '1.0.1.0', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/cache', 'aliases' => array(), 'reference' => 'db34caee38f66ba1e3560e7d5c2bfd8d5f34bfd8', 'dev_requirement' => false, ), 'psr/cache-implementation' => array( 'dev_requirement' => false, 'provided' => array( 0 => '1.0', ), ), 'psr/container' => array( 'pretty_version' => '1.0.0', 'version' => '1.0.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/container', 'aliases' => array(), 'reference' => 'b7ce3b176482dbbc1245ebf52b181af44c2cf55f', 'dev_requirement' => false, ), 'psr/container-implementation' => array( 'dev_requirement' => false, 'provided' => array( 0 => '1.0', ), ), 'psr/http-client' => array( 'pretty_version' => '1.0.1', 'version' => '1.0.1.0', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/http-client', 'aliases' => array(), 'reference' => '2dfb5f6c5eff0e91e20e913f8c5452ed95b86621', 'dev_requirement' => false, ), 'psr/http-client-implementation' => array( 'dev_requirement' => false, 'provided' => array( 0 => '1.0', ), ), 'psr/http-factory' => array( 'pretty_version' => '1.0.1', 'version' => '1.0.1.0', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/http-factory', 'aliases' => array(), 'reference' => '12ac7fcd07e5b077433f5f2bee95b3a771bf61be', 'dev_requirement' => false, ), 'psr/http-factory-implementation' => array( 'dev_requirement' => false, 'provided' => array( 0 => '1.0', ), ), 'psr/http-message' => array( 'pretty_version' => '1.0.1', 'version' => '1.0.1.0', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/http-message', 'aliases' => array(), 'reference' => '5ffd088ec254f9a393dcfa22531e11f3be9c0d2b', 'dev_requirement' => false, ), 'psr/http-message-implementation' => array( 'dev_requirement' => false, 'provided' => array( 0 => '1.0', ), ), 'psr/http-server-handler' => array( 'pretty_version' => '1.0.1', 'version' => '1.0.1.0', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/http-server-handler', 'aliases' => array(), 'reference' => 'aff2f80e33b7f026ec96bb42f63242dc50ffcae7', 'dev_requirement' => false, ), 'psr/http-server-middleware' => array( 'pretty_version' => '1.0.1', 'version' => '1.0.1.0', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/http-server-middleware', 'aliases' => array(), 'reference' => '2296f45510945530b9dceb8bcedb5cb84d40c5f5', 'dev_requirement' => false, ), 'psr/log' => array( 'pretty_version' => '1.0.2', 'version' => '1.0.2.0', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/log', 'aliases' => array(), 'reference' => '4ebe3a8bf773a19edfe0a84b6585ba3d401b724d', 'dev_requirement' => false, ), 'psr/log-implementation' => array( 'dev_requirement' => false, 'provided' => array( 0 => '1.0|2.0', 1 => '1.0.0', ), ), 'psr/simple-cache' => array( 'pretty_version' => '1.0.1', 'version' => '1.0.1.0', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/simple-cache', 'aliases' => array(), 'reference' => '408d5eafb83c57f6365a3ca330ff23aa4a5fa39b', 'dev_requirement' => false, ), 'psr/simple-cache-implementation' => array( 'dev_requirement' => false, 'provided' => array( 0 => '1.0', ), ), 'punic/calendar' => array( 'dev_requirement' => false, 'replaced' => array( 0 => '*', ), ), 'punic/common' => array( 'dev_requirement' => false, 'replaced' => array( 0 => '*', ), ), 'punic/punic' => array( 'pretty_version' => '3.5.1', 'version' => '3.5.1.0', 'type' => 'library', 'install_path' => __DIR__ . '/../punic/punic', 'aliases' => array(), 'reference' => '1b99a1f0d45e2a6109870fde7a3977d9da68940f', 'dev_requirement' => false, ), 'ralouphie/getallheaders' => array( 'pretty_version' => '3.0.3', 'version' => '3.0.3.0', 'type' => 'library', 'install_path' => __DIR__ . '/../ralouphie/getallheaders', 'aliases' => array(), 'reference' => '120b605dfeb996808c31b6477290a714d356e822', 'dev_requirement' => false, ), 'ramsey/collection' => array( 'pretty_version' => '1.0.1', 'version' => '1.0.1.0', 'type' => 'library', 'install_path' => __DIR__ . '/../ramsey/collection', 'aliases' => array(), 'reference' => '925ad8cf55ba7a3fc92e332c58fd0478ace3e1ca', 'dev_requirement' => false, ), 'ramsey/uuid' => array( 'pretty_version' => '4.0.1', 'version' => '4.0.1.0', 'type' => 'library', 'install_path' => __DIR__ . '/../ramsey/uuid', 'aliases' => array(), 'reference' => 'e0bb69d609686ebda30d35a07cd43955627e3141', 'dev_requirement' => false, ), 'react/promise' => array( 'pretty_version' => 'v2.8.0', 'version' => '2.8.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../react/promise', 'aliases' => array(), 'reference' => '89698dd004dd851a60246397408d12477dfd9d6b', 'dev_requirement' => false, ), 'respect/stringifier' => array( 'pretty_version' => '0.2.0', 'version' => '0.2.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../respect/stringifier', 'aliases' => array(), 'reference' => 'e55af3c8aeaeaa2abb5fa47a58a8e9688cc23b59', 'dev_requirement' => false, ), 'respect/validation' => array( 'pretty_version' => '2.2.3', 'version' => '2.2.3.0', 'type' => 'library', 'install_path' => __DIR__ . '/../respect/validation', 'aliases' => array(), 'reference' => '4c21a7ffc9a4915673cb2c2843963919e664e627', 'dev_requirement' => false, ), 'rhumsaa/uuid' => array( 'dev_requirement' => false, 'replaced' => array( 0 => '4.0.1', ), ), 'riverline/multipart-parser' => array( 'pretty_version' => '2.0.9', 'version' => '2.0.9.0', 'type' => 'library', 'install_path' => __DIR__ . '/../riverline/multipart-parser', 'aliases' => array(), 'reference' => 'ebba10245b5a6e03a673ff52c547d05029caedab', 'dev_requirement' => false, ), 'seld/cli-prompt' => array( 'pretty_version' => '1.0.3', 'version' => '1.0.3.0', 'type' => 'library', 'install_path' => __DIR__ . '/../seld/cli-prompt', 'aliases' => array(), 'reference' => 'a19a7376a4689d4d94cab66ab4f3c816019ba8dd', 'dev_requirement' => false, ), 'seld/jsonlint' => array( 'pretty_version' => '1.8.0', 'version' => '1.8.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../seld/jsonlint', 'aliases' => array(), 'reference' => 'ff2aa5420bfbc296cf6a0bc785fa5b35736de7c1', 'dev_requirement' => false, ), 'seld/phar-utils' => array( 'pretty_version' => '1.1.0', 'version' => '1.1.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../seld/phar-utils', 'aliases' => array(), 'reference' => '8800503d56b9867d43d9c303b9cbcc26016e82f0', 'dev_requirement' => false, ), 'smarty/smarty' => array( 'pretty_version' => 'dev-v3.1.36-php72-php81-compat', 'version' => 'dev-v3.1.36-php72-php81-compat', 'type' => 'library', 'install_path' => __DIR__ . '/../smarty/smarty', 'aliases' => array(), 'reference' => '30afb5f2f0ed3e123ec608d9a4739e9c1fff641d', 'dev_requirement' => false, ), 'sonata-project/google-authenticator' => array( 'pretty_version' => '2.2.0', 'version' => '2.2.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../sonata-project/google-authenticator', 'aliases' => array(), 'reference' => 'feda53899b26af24e3db2fe7a3e5f053ca483762', 'dev_requirement' => false, ), 'stevenmaguire/oauth2-microsoft' => array( 'pretty_version' => '2.2.0', 'version' => '2.2.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../stevenmaguire/oauth2-microsoft', 'aliases' => array(), 'reference' => 'f24f79d8c47224d24a1240270ca3b0a4c1521ed4', 'dev_requirement' => false, ), 'stripe/stripe-php' => array( 'pretty_version' => 'v7.34.0', 'version' => '7.34.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../stripe/stripe-php', 'aliases' => array(), 'reference' => 'efc7ab628be3503e82a0b195bf85ce5a559e2319', 'dev_requirement' => false, ), 'symfony/cache' => array( 'pretty_version' => 'v5.1.11', 'version' => '5.1.11.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/cache', 'aliases' => array(), 'reference' => '6def7595e74b4b0a6b515af964792e2d092f056d', 'dev_requirement' => false, ), 'symfony/cache-contracts' => array( 'pretty_version' => 'v2.5.2', 'version' => '2.5.2.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/cache-contracts', 'aliases' => array(), 'reference' => '64be4a7acb83b6f2bf6de9a02cee6dad41277ebc', 'dev_requirement' => false, ), 'symfony/cache-implementation' => array( 'dev_requirement' => false, 'provided' => array( 0 => '1.0', ), ), 'symfony/config' => array( 'pretty_version' => 'v5.4.9', 'version' => '5.4.9.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/config', 'aliases' => array(), 'reference' => '8f551fe22672ac7ab2c95fe46d899f960ed4d979', 'dev_requirement' => false, ), 'symfony/console' => array( 'pretty_version' => 'v5.4.12', 'version' => '5.4.12.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/console', 'aliases' => array(), 'reference' => 'c072aa8f724c3af64e2c7a96b796a4863d24dba1', 'dev_requirement' => false, ), 'symfony/dependency-injection' => array( 'pretty_version' => 'v5.1.7', 'version' => '5.1.7.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/dependency-injection', 'aliases' => array(), 'reference' => '2dea4a3ef2eb79138354c1d49e9372cc921af20b', 'dev_requirement' => false, ), 'symfony/deprecation-contracts' => array( 'pretty_version' => 'v2.2.0', 'version' => '2.2.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/deprecation-contracts', 'aliases' => array(), 'reference' => '5fa56b4074d1ae755beb55617ddafe6f5d78f665', 'dev_requirement' => false, ), 'symfony/filesystem' => array( 'pretty_version' => 'v5.0.8', 'version' => '5.0.8.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/filesystem', 'aliases' => array(), 'reference' => '7cd0dafc4353a0f62e307df90b48466379c8cc91', 'dev_requirement' => false, ), 'symfony/finder' => array( 'pretty_version' => 'v5.3.7', 'version' => '5.3.7.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/finder', 'aliases' => array(), 'reference' => 'a10000ada1e600d109a6c7632e9ac42e8bf2fb93', 'dev_requirement' => false, ), 'symfony/http-foundation' => array( 'pretty_version' => 'v5.3.7', 'version' => '5.3.7.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/http-foundation', 'aliases' => array(), 'reference' => 'e36c8e5502b4f3f0190c675f1c1f1248a64f04e5', 'dev_requirement' => false, ), 'symfony/mime' => array( 'pretty_version' => 'v5.1.7', 'version' => '5.1.7.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/mime', 'aliases' => array(), 'reference' => '4404d6545125863561721514ad9388db2661eec5', 'dev_requirement' => false, ), 'symfony/polyfill-ctype' => array( 'pretty_version' => 'v1.18.1', 'version' => '1.18.1.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-ctype', 'aliases' => array(), 'reference' => '1c302646f6efc070cd46856e600e5e0684d6b454', 'dev_requirement' => false, ), 'symfony/polyfill-iconv' => array( 'pretty_version' => 'v1.18.1', 'version' => '1.18.1.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-iconv', 'aliases' => array(), 'reference' => '8b0d774b8803da87f06a747e5047008d80809aa5', 'dev_requirement' => false, ), 'symfony/polyfill-intl-grapheme' => array( 'pretty_version' => 'v1.26.0', 'version' => '1.26.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-intl-grapheme', 'aliases' => array(), 'reference' => '433d05519ce6990bf3530fba6957499d327395c2', 'dev_requirement' => false, ), 'symfony/polyfill-intl-idn' => array( 'pretty_version' => 'v1.18.1', 'version' => '1.18.1.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-intl-idn', 'aliases' => array(), 'reference' => '5dcab1bc7146cf8c1beaa4502a3d9be344334251', 'dev_requirement' => false, ), 'symfony/polyfill-intl-normalizer' => array( 'pretty_version' => 'v1.18.1', 'version' => '1.18.1.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-intl-normalizer', 'aliases' => array(), 'reference' => '37078a8dd4a2a1e9ab0231af7c6cb671b2ed5a7e', 'dev_requirement' => false, ), 'symfony/polyfill-mbstring' => array( 'pretty_version' => 'v1.18.1', 'version' => '1.18.1.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-mbstring', 'aliases' => array(), 'reference' => 'a6977d63bf9a0ad4c65cd352709e230876f9904a', 'dev_requirement' => false, ), 'symfony/polyfill-php70' => array( 'pretty_version' => 'v1.20.0', 'version' => '1.20.0.0', 'type' => 'metapackage', 'install_path' => NULL, 'aliases' => array(), 'reference' => '5f03a781d984aae42cebd18e7912fa80f02ee644', 'dev_requirement' => false, ), 'symfony/polyfill-php72' => array( 'pretty_version' => 'v1.18.1', 'version' => '1.18.1.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-php72', 'aliases' => array(), 'reference' => '639447d008615574653fb3bc60d1986d7172eaae', 'dev_requirement' => false, ), 'symfony/polyfill-php73' => array( 'pretty_version' => 'v1.18.1', 'version' => '1.18.1.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-php73', 'aliases' => array(), 'reference' => 'fffa1a52a023e782cdcc221d781fe1ec8f87fcca', 'dev_requirement' => false, ), 'symfony/polyfill-php80' => array( 'pretty_version' => 'v1.18.1', 'version' => '1.18.1.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-php80', 'aliases' => array(), 'reference' => 'd87d5766cbf48d72388a9f6b85f280c8ad51f981', 'dev_requirement' => false, ), 'symfony/polyfill-php81' => array( 'pretty_version' => 'v1.26.0', 'version' => '1.26.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-php81', 'aliases' => array(), 'reference' => '13f6d1271c663dc5ae9fb843a8f16521db7687a1', 'dev_requirement' => false, ), 'symfony/process' => array( 'pretty_version' => 'v5.3.7', 'version' => '5.3.7.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/process', 'aliases' => array(), 'reference' => '38f26c7d6ed535217ea393e05634cb0b244a1967', 'dev_requirement' => false, ), 'symfony/service-contracts' => array( 'pretty_version' => 'v2.2.0', 'version' => '2.2.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/service-contracts', 'aliases' => array(), 'reference' => 'd15da7ba4957ffb8f1747218be9e1a121fd298a1', 'dev_requirement' => false, ), 'symfony/service-implementation' => array( 'dev_requirement' => false, 'provided' => array( 0 => '1.0', ), ), 'symfony/string' => array( 'pretty_version' => 'v5.4.10', 'version' => '5.4.10.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/string', 'aliases' => array(), 'reference' => '4432bc7df82a554b3e413a8570ce2fea90e94097', 'dev_requirement' => false, ), 'symfony/translation' => array( 'pretty_version' => 'v5.0.8', 'version' => '5.0.8.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/translation', 'aliases' => array(), 'reference' => 'c3879db7a68fe3e12b41263b05879412c87b27fd', 'dev_requirement' => false, ), 'symfony/translation-contracts' => array( 'pretty_version' => 'v2.3.0', 'version' => '2.3.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/translation-contracts', 'aliases' => array(), 'reference' => 'e2eaa60b558f26a4b0354e1bbb25636efaaad105', 'dev_requirement' => false, ), 'symfony/translation-implementation' => array( 'dev_requirement' => false, 'provided' => array( 0 => '2.0', ), ), 'symfony/var-exporter' => array( 'pretty_version' => 'v5.4.10', 'version' => '5.4.10.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/var-exporter', 'aliases' => array(), 'reference' => '8fc03ee75eeece3d9be1ef47d26d79bea1afb340', 'dev_requirement' => false, ), 'symfony/yaml' => array( 'pretty_version' => 'v5.0.8', 'version' => '5.0.8.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/yaml', 'aliases' => array(), 'reference' => '1c6db131d0e244a2ff31e4560b6cd6fb2e902251', 'dev_requirement' => false, ), 'tecnickcom/tcpdf' => array( 'pretty_version' => '6.3.5-p1', 'version' => '6.3.5.0-patch1', 'type' => 'library', 'install_path' => __DIR__ . '/../tecnickcom/tcpdf', 'aliases' => array(), 'reference' => '49af61d9c0ca5eaffd8500d0735e9f0ad9cc9577', 'dev_requirement' => false, ), 'true/punycode' => array( 'pretty_version' => 'v2.1.1', 'version' => '2.1.1.0', 'type' => 'library', 'install_path' => __DIR__ . '/../true/punycode', 'aliases' => array(), 'reference' => 'a4d0c11a36dd7f4e7cd7096076cab6d3378a071e', 'dev_requirement' => false, ), 'voku/portable-ascii' => array( 'pretty_version' => '1.5.3', 'version' => '1.5.3.0', 'type' => 'library', 'install_path' => __DIR__ . '/../voku/portable-ascii', 'aliases' => array(), 'reference' => '25bcbf01678930251fd572891447d9e318a6e2b8', 'dev_requirement' => false, ), 'webmozart/assert' => array( 'pretty_version' => '1.11.0', 'version' => '1.11.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../webmozart/assert', 'aliases' => array(), 'reference' => '11cb2199493b2f8a3b53e7f19068fc6aac760991', 'dev_requirement' => false, ), 'zbateson/mail-mime-parser' => array( 'pretty_version' => '1.3.1', 'version' => '1.3.1.0', 'type' => 'library', 'install_path' => __DIR__ . '/../zbateson/mail-mime-parser', 'aliases' => array(), 'reference' => '706964d904798b8c22d63f62f0ec5f5bc84e30d9', 'dev_requirement' => false, ), 'zbateson/mb-wrapper' => array( 'pretty_version' => '1.0.1', 'version' => '1.0.1.0', 'type' => 'library', 'install_path' => __DIR__ . '/../zbateson/mb-wrapper', 'aliases' => array(), 'reference' => '721b3dfbf7ab75fee5ac60a542d7923ffe59ef6d', 'dev_requirement' => false, ), 'zbateson/stream-decorators' => array( 'pretty_version' => '1.0.4', 'version' => '1.0.4.0', 'type' => 'library', 'install_path' => __DIR__ . '/../zbateson/stream-decorators', 'aliases' => array(), 'reference' => '6f54738dfecc65e1d5bfb855035836748083a6dd', 'dev_requirement' => false, ), 'zendframework/zend-diactoros' => array( 'dev_requirement' => false, 'replaced' => array( 0 => '^2.2.1', ), ), 'zendframework/zend-httphandlerrunner' => array( 'dev_requirement' => false, 'replaced' => array( 0 => '^1.1.0', ), ), 'zendframework/zend-loader' => array( 'dev_requirement' => false, 'replaced' => array( 0 => '2.6.1', ), ), 'zendframework/zend-mail' => array( 'dev_requirement' => false, 'replaced' => array( 0 => '^2.10.0', ), ), 'zendframework/zend-mime' => array( 'dev_requirement' => false, 'replaced' => array( 0 => '^2.7.2', ), ), 'zendframework/zend-stdlib' => array( 'dev_requirement' => false, 'replaced' => array( 0 => '^3.2.1', ), ), 'zendframework/zend-validator' => array( 'dev_requirement' => false, 'replaced' => array( 0 => '^2.13.0', ), ), ), ); autoload_classmap.php 0000644 00000225622 14736103146 0010766 0 ustar 00 <?php // autoload_classmap.php @generated by Composer $vendorDir = dirname(dirname(__FILE__)); $baseDir = dirname($vendorDir); return array( 'AuthorizeNetAIM' => $vendorDir . '/authorizenet/authorizenet/lib/deprecated/AuthorizeNetAIM.php', 'AuthorizeNetAIM_Response' => $vendorDir . '/authorizenet/authorizenet/lib/deprecated/AuthorizeNetAIM.php', 'AuthorizeNetARB' => $vendorDir . '/authorizenet/authorizenet/lib/deprecated/AuthorizeNetARB.php', 'AuthorizeNetARB_Response' => $vendorDir . '/authorizenet/authorizenet/lib/deprecated/AuthorizeNetARB.php', 'AuthorizeNetAddress' => $vendorDir . '/authorizenet/authorizenet/lib/deprecated/shared/AuthorizeNetTypes.php', 'AuthorizeNetBankAccount' => $vendorDir . '/authorizenet/authorizenet/lib/deprecated/shared/AuthorizeNetTypes.php', 'AuthorizeNetCIM' => $vendorDir . '/authorizenet/authorizenet/lib/deprecated/AuthorizeNetCIM.php', 'AuthorizeNetCIM_Response' => $vendorDir . '/authorizenet/authorizenet/lib/deprecated/AuthorizeNetCIM.php', 'AuthorizeNetCP' => $vendorDir . '/authorizenet/authorizenet/lib/deprecated/AuthorizeNetCP.php', 'AuthorizeNetCP_Response' => $vendorDir . '/authorizenet/authorizenet/lib/deprecated/AuthorizeNetCP.php', 'AuthorizeNetCreditCard' => $vendorDir . '/authorizenet/authorizenet/lib/deprecated/shared/AuthorizeNetTypes.php', 'AuthorizeNetCustomer' => $vendorDir . '/authorizenet/authorizenet/lib/deprecated/shared/AuthorizeNetTypes.php', 'AuthorizeNetDPM' => $vendorDir . '/authorizenet/authorizenet/lib/deprecated/AuthorizeNetDPM.php', 'AuthorizeNetException' => $vendorDir . '/authorizenet/authorizenet/lib/deprecated/shared/AuthorizeNetException.php', 'AuthorizeNetGetSubscriptionList' => $vendorDir . '/authorizenet/authorizenet/lib/deprecated/shared/AuthorizeNetTypes.php', 'AuthorizeNetLineItem' => $vendorDir . '/authorizenet/authorizenet/lib/deprecated/shared/AuthorizeNetTypes.php', 'AuthorizeNetPayment' => $vendorDir . '/authorizenet/authorizenet/lib/deprecated/shared/AuthorizeNetTypes.php', 'AuthorizeNetPaymentProfile' => $vendorDir . '/authorizenet/authorizenet/lib/deprecated/shared/AuthorizeNetTypes.php', 'AuthorizeNetRequest' => $vendorDir . '/authorizenet/authorizenet/lib/deprecated/shared/AuthorizeNetRequest.php', 'AuthorizeNetResponse' => $vendorDir . '/authorizenet/authorizenet/lib/deprecated/shared/AuthorizeNetResponse.php', 'AuthorizeNetSIM' => $vendorDir . '/authorizenet/authorizenet/lib/deprecated/AuthorizeNetSIM.php', 'AuthorizeNetSIM_Form' => $vendorDir . '/authorizenet/authorizenet/lib/deprecated/AuthorizeNetSIM.php', 'AuthorizeNetSOAP' => $vendorDir . '/authorizenet/authorizenet/lib/deprecated/AuthorizeNetSOAP.php', 'AuthorizeNetSubscriptionListPaging' => $vendorDir . '/authorizenet/authorizenet/lib/deprecated/shared/AuthorizeNetTypes.php', 'AuthorizeNetSubscriptionListSorting' => $vendorDir . '/authorizenet/authorizenet/lib/deprecated/shared/AuthorizeNetTypes.php', 'AuthorizeNetTD' => $vendorDir . '/authorizenet/authorizenet/lib/deprecated/AuthorizeNetTD.php', 'AuthorizeNetTD_Response' => $vendorDir . '/authorizenet/authorizenet/lib/deprecated/AuthorizeNetTD.php', 'AuthorizeNetTransaction' => $vendorDir . '/authorizenet/authorizenet/lib/deprecated/shared/AuthorizeNetTypes.php', 'AuthorizeNetXMLResponse' => $vendorDir . '/authorizenet/authorizenet/lib/deprecated/shared/AuthorizeNetXMLResponse.php', 'AuthorizeNet_Subscription' => $vendorDir . '/authorizenet/authorizenet/lib/deprecated/shared/AuthorizeNetTypes.php', 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php', 'Datamatrix' => $vendorDir . '/tecnickcom/tcpdf/include/barcodes/datamatrix.php', 'Google_Service_Exception' => $vendorDir . '/google/apiclient/src/Google/Service/Exception.php', 'Google_Service_Resource' => $vendorDir . '/google/apiclient/src/Google/Service/Resource.php', 'JsonException' => $vendorDir . '/symfony/polyfill-php73/Resources/stubs/JsonException.php', 'Normalizer' => $vendorDir . '/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php', 'PDF417' => $vendorDir . '/tecnickcom/tcpdf/include/barcodes/pdf417.php', 'QRcode' => $vendorDir . '/tecnickcom/tcpdf/include/barcodes/qrcode.php', 'ReturnTypeWillChange' => $vendorDir . '/symfony/polyfill-php81/Resources/stubs/ReturnTypeWillChange.php', 'Smarty' => $vendorDir . '/smarty/smarty/libs/Smarty.class.php', 'SmartyBC' => $vendorDir . '/smarty/smarty/libs/SmartyBC.class.php', 'SmartyCompilerException' => $vendorDir . '/smarty/smarty/libs/sysplugins/smartycompilerexception.php', 'SmartyException' => $vendorDir . '/smarty/smarty/libs/sysplugins/smartyexception.php', 'Smarty_Autoloader' => $vendorDir . '/smarty/smarty/libs/Autoloader.php', 'Smarty_CacheResource' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_cacheresource.php', 'Smarty_CacheResource_Custom' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_cacheresource_custom.php', 'Smarty_CacheResource_KeyValueStore' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_cacheresource_keyvaluestore.php', 'Smarty_Data' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_data.php', 'Smarty_Internal_Block' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_block.php', 'Smarty_Internal_CacheResource_File' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_cacheresource_file.php', 'Smarty_Internal_CompileBase' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compilebase.php', 'Smarty_Internal_Compile_Append' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_append.php', 'Smarty_Internal_Compile_Assign' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_assign.php', 'Smarty_Internal_Compile_Block' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_block.php', 'Smarty_Internal_Compile_Block_Child' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_block_child.php', 'Smarty_Internal_Compile_Block_Parent' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_block_parent.php', 'Smarty_Internal_Compile_Blockclose' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_block.php', 'Smarty_Internal_Compile_Break' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_break.php', 'Smarty_Internal_Compile_Call' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_call.php', 'Smarty_Internal_Compile_Capture' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_capture.php', 'Smarty_Internal_Compile_CaptureClose' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_capture.php', 'Smarty_Internal_Compile_Child' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_child.php', 'Smarty_Internal_Compile_Config_Load' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_config_load.php', 'Smarty_Internal_Compile_Continue' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_continue.php', 'Smarty_Internal_Compile_Debug' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_debug.php', 'Smarty_Internal_Compile_Else' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_if.php', 'Smarty_Internal_Compile_Elseif' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_if.php', 'Smarty_Internal_Compile_Eval' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_eval.php', 'Smarty_Internal_Compile_Extends' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_extends.php', 'Smarty_Internal_Compile_For' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_for.php', 'Smarty_Internal_Compile_Forclose' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_for.php', 'Smarty_Internal_Compile_Foreach' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_foreach.php', 'Smarty_Internal_Compile_Foreachclose' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_foreach.php', 'Smarty_Internal_Compile_Foreachelse' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_foreach.php', 'Smarty_Internal_Compile_Forelse' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_for.php', 'Smarty_Internal_Compile_Function' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_function.php', 'Smarty_Internal_Compile_Functionclose' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_function.php', 'Smarty_Internal_Compile_If' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_if.php', 'Smarty_Internal_Compile_Ifclose' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_if.php', 'Smarty_Internal_Compile_Include' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_include.php', 'Smarty_Internal_Compile_Include_Php' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_include_php.php', 'Smarty_Internal_Compile_Insert' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_insert.php', 'Smarty_Internal_Compile_Ldelim' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_ldelim.php', 'Smarty_Internal_Compile_Make_Nocache' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_make_nocache.php', 'Smarty_Internal_Compile_Nocache' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_nocache.php', 'Smarty_Internal_Compile_Nocacheclose' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_nocache.php', 'Smarty_Internal_Compile_Parent' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_parent.php', 'Smarty_Internal_Compile_Private_Block_Plugin' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_block_plugin.php', 'Smarty_Internal_Compile_Private_ForeachSection' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_foreachsection.php', 'Smarty_Internal_Compile_Private_Function_Plugin' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_function_plugin.php', 'Smarty_Internal_Compile_Private_Modifier' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_modifier.php', 'Smarty_Internal_Compile_Private_Object_Block_Function' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_object_block_function.php', 'Smarty_Internal_Compile_Private_Object_Function' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_object_function.php', 'Smarty_Internal_Compile_Private_Php' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_php.php', 'Smarty_Internal_Compile_Private_Print_Expression' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_print_expression.php', 'Smarty_Internal_Compile_Private_Registered_Block' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_registered_block.php', 'Smarty_Internal_Compile_Private_Registered_Function' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_registered_function.php', 'Smarty_Internal_Compile_Private_Special_Variable' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_special_variable.php', 'Smarty_Internal_Compile_Rdelim' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_rdelim.php', 'Smarty_Internal_Compile_Section' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_section.php', 'Smarty_Internal_Compile_Sectionclose' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_section.php', 'Smarty_Internal_Compile_Sectionelse' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_section.php', 'Smarty_Internal_Compile_Setfilter' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_setfilter.php', 'Smarty_Internal_Compile_Setfilterclose' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_setfilter.php', 'Smarty_Internal_Compile_Shared_Inheritance' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_shared_inheritance.php', 'Smarty_Internal_Compile_While' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_while.php', 'Smarty_Internal_Compile_Whileclose' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_while.php', 'Smarty_Internal_Config_File_Compiler' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_config_file_compiler.php', 'Smarty_Internal_Configfilelexer' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_configfilelexer.php', 'Smarty_Internal_Configfileparser' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_configfileparser.php', 'Smarty_Internal_Data' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_data.php', 'Smarty_Internal_Debug' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_debug.php', 'Smarty_Internal_ErrorHandler' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_errorhandler.php', 'Smarty_Internal_Extension_Handler' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_extension_handler.php', 'Smarty_Internal_Method_AddAutoloadFilters' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_method_addautoloadfilters.php', 'Smarty_Internal_Method_AddDefaultModifiers' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_method_adddefaultmodifiers.php', 'Smarty_Internal_Method_Append' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_method_append.php', 'Smarty_Internal_Method_AppendByRef' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_method_appendbyref.php', 'Smarty_Internal_Method_AssignByRef' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_method_assignbyref.php', 'Smarty_Internal_Method_AssignGlobal' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_method_assignglobal.php', 'Smarty_Internal_Method_ClearAllAssign' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_method_clearallassign.php', 'Smarty_Internal_Method_ClearAllCache' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_method_clearallcache.php', 'Smarty_Internal_Method_ClearAssign' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_method_clearassign.php', 'Smarty_Internal_Method_ClearCache' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_method_clearcache.php', 'Smarty_Internal_Method_ClearCompiledTemplate' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_method_clearcompiledtemplate.php', 'Smarty_Internal_Method_ClearConfig' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_method_clearconfig.php', 'Smarty_Internal_Method_CompileAllConfig' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_method_compileallconfig.php', 'Smarty_Internal_Method_CompileAllTemplates' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_method_compilealltemplates.php', 'Smarty_Internal_Method_ConfigLoad' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_method_configload.php', 'Smarty_Internal_Method_CreateData' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_method_createdata.php', 'Smarty_Internal_Method_GetAutoloadFilters' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_method_getautoloadfilters.php', 'Smarty_Internal_Method_GetConfigVariable' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_method_getconfigvariable.php', 'Smarty_Internal_Method_GetConfigVars' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_method_getconfigvars.php', 'Smarty_Internal_Method_GetDebugTemplate' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_method_getdebugtemplate.php', 'Smarty_Internal_Method_GetDefaultModifiers' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_method_getdefaultmodifiers.php', 'Smarty_Internal_Method_GetGlobal' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_method_getglobal.php', 'Smarty_Internal_Method_GetRegisteredObject' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_method_getregisteredobject.php', 'Smarty_Internal_Method_GetStreamVariable' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_method_getstreamvariable.php', 'Smarty_Internal_Method_GetTags' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_method_gettags.php', 'Smarty_Internal_Method_GetTemplateVars' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_method_gettemplatevars.php', 'Smarty_Internal_Method_Literals' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_method_literals.php', 'Smarty_Internal_Method_LoadFilter' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_method_loadfilter.php', 'Smarty_Internal_Method_LoadPlugin' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_method_loadplugin.php', 'Smarty_Internal_Method_MustCompile' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_method_mustcompile.php', 'Smarty_Internal_Method_RegisterCacheResource' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_method_registercacheresource.php', 'Smarty_Internal_Method_RegisterClass' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_method_registerclass.php', 'Smarty_Internal_Method_RegisterDefaultConfigHandler' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_method_registerdefaultconfighandler.php', 'Smarty_Internal_Method_RegisterDefaultPluginHandler' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_method_registerdefaultpluginhandler.php', 'Smarty_Internal_Method_RegisterDefaultTemplateHandler' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_method_registerdefaulttemplatehandler.php', 'Smarty_Internal_Method_RegisterFilter' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_method_registerfilter.php', 'Smarty_Internal_Method_RegisterObject' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_method_registerobject.php', 'Smarty_Internal_Method_RegisterPlugin' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_method_registerplugin.php', 'Smarty_Internal_Method_RegisterResource' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_method_registerresource.php', 'Smarty_Internal_Method_SetAutoloadFilters' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_method_setautoloadfilters.php', 'Smarty_Internal_Method_SetDebugTemplate' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_method_setdebugtemplate.php', 'Smarty_Internal_Method_SetDefaultModifiers' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_method_setdefaultmodifiers.php', 'Smarty_Internal_Method_UnloadFilter' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_method_unloadfilter.php', 'Smarty_Internal_Method_UnregisterCacheResource' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_method_unregistercacheresource.php', 'Smarty_Internal_Method_UnregisterFilter' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_method_unregisterfilter.php', 'Smarty_Internal_Method_UnregisterObject' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_method_unregisterobject.php', 'Smarty_Internal_Method_UnregisterPlugin' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_method_unregisterplugin.php', 'Smarty_Internal_Method_UnregisterResource' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_method_unregisterresource.php', 'Smarty_Internal_Nocache_Insert' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_nocache_insert.php', 'Smarty_Internal_ParseTree' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_parsetree.php', 'Smarty_Internal_ParseTree_Code' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_parsetree_code.php', 'Smarty_Internal_ParseTree_Dq' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_parsetree_dq.php', 'Smarty_Internal_ParseTree_DqContent' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_parsetree_dqcontent.php', 'Smarty_Internal_ParseTree_Tag' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_parsetree_tag.php', 'Smarty_Internal_ParseTree_Template' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_parsetree_template.php', 'Smarty_Internal_ParseTree_Text' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_parsetree_text.php', 'Smarty_Internal_Resource_Eval' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_resource_eval.php', 'Smarty_Internal_Resource_Extends' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_resource_extends.php', 'Smarty_Internal_Resource_File' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_resource_file.php', 'Smarty_Internal_Resource_Php' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_resource_php.php', 'Smarty_Internal_Resource_Registered' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_resource_registered.php', 'Smarty_Internal_Resource_Stream' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_resource_stream.php', 'Smarty_Internal_Resource_String' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_resource_string.php', 'Smarty_Internal_Runtime_CacheModify' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_runtime_cachemodify.php', 'Smarty_Internal_Runtime_CacheResourceFile' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_runtime_cacheresourcefile.php', 'Smarty_Internal_Runtime_Capture' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_runtime_capture.php', 'Smarty_Internal_Runtime_CodeFrame' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_runtime_codeframe.php', 'Smarty_Internal_Runtime_FilterHandler' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_runtime_filterhandler.php', 'Smarty_Internal_Runtime_Foreach' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_runtime_foreach.php', 'Smarty_Internal_Runtime_GetIncludePath' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_runtime_getincludepath.php', 'Smarty_Internal_Runtime_Inheritance' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_runtime_inheritance.php', 'Smarty_Internal_Runtime_Make_Nocache' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_runtime_make_nocache.php', 'Smarty_Internal_Runtime_TplFunction' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_runtime_tplfunction.php', 'Smarty_Internal_Runtime_UpdateCache' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_runtime_updatecache.php', 'Smarty_Internal_Runtime_UpdateScope' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_runtime_updatescope.php', 'Smarty_Internal_Runtime_WriteFile' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_runtime_writefile.php', 'Smarty_Internal_SmartyTemplateCompiler' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_smartytemplatecompiler.php', 'Smarty_Internal_Template' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_template.php', 'Smarty_Internal_TemplateBase' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_templatebase.php', 'Smarty_Internal_TemplateCompilerBase' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_templatecompilerbase.php', 'Smarty_Internal_Templatelexer' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_templatelexer.php', 'Smarty_Internal_Templateparser' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_templateparser.php', 'Smarty_Internal_TestInstall' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_testinstall.php', 'Smarty_Internal_Undefined' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_undefined.php', 'Smarty_Resource' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_resource.php', 'Smarty_Resource_Custom' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_resource_custom.php', 'Smarty_Resource_Recompiled' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_resource_recompiled.php', 'Smarty_Resource_Uncompiled' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_resource_uncompiled.php', 'Smarty_Security' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_security.php', 'Smarty_Template_Cached' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_template_cached.php', 'Smarty_Template_Compiled' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_template_compiled.php', 'Smarty_Template_Config' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_template_config.php', 'Smarty_Template_Resource_Base' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_template_resource_base.php', 'Smarty_Template_Source' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_template_source.php', 'Smarty_Undefined_Variable' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_undefined_variable.php', 'Smarty_Variable' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_variable.php', 'Stringable' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Stringable.php', 'TCPDF' => $vendorDir . '/tecnickcom/tcpdf/tcpdf.php', 'TCPDF2DBarcode' => $vendorDir . '/tecnickcom/tcpdf/tcpdf_barcodes_2d.php', 'TCPDFBarcode' => $vendorDir . '/tecnickcom/tcpdf/tcpdf_barcodes_1d.php', 'TCPDF_COLORS' => $vendorDir . '/tecnickcom/tcpdf/include/tcpdf_colors.php', 'TCPDF_FILTERS' => $vendorDir . '/tecnickcom/tcpdf/include/tcpdf_filters.php', 'TCPDF_FONTS' => $vendorDir . '/tecnickcom/tcpdf/include/tcpdf_fonts.php', 'TCPDF_FONT_DATA' => $vendorDir . '/tecnickcom/tcpdf/include/tcpdf_font_data.php', 'TCPDF_IMAGES' => $vendorDir . '/tecnickcom/tcpdf/include/tcpdf_images.php', 'TCPDF_IMPORT' => $vendorDir . '/tecnickcom/tcpdf/tcpdf_import.php', 'TCPDF_PARSER' => $vendorDir . '/tecnickcom/tcpdf/tcpdf_parser.php', 'TCPDF_STATIC' => $vendorDir . '/tecnickcom/tcpdf/include/tcpdf_static.php', 'TPC_yyStackEntry' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_configfileparser.php', 'TP_yyStackEntry' => $vendorDir . '/smarty/smarty/libs/sysplugins/smarty_internal_templateparser.php', 'UnhandledMatchError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php', 'ValueError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/ValueError.php', 'mindplay\\readable' => $vendorDir . '/mindplay/readable/src/readable.php', 'net\\authorize\\api\\constants\\ANetEnvironment' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/constants/ANetEnvironment.php', 'net\\authorize\\api\\contract\\v1\\ANetApiRequestType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ANetApiRequestType.php', 'net\\authorize\\api\\contract\\v1\\ANetApiResponseType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ANetApiResponseType.php', 'net\\authorize\\api\\contract\\v1\\ARBCancelSubscriptionRequest' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ARBCancelSubscriptionRequest.php', 'net\\authorize\\api\\contract\\v1\\ARBCancelSubscriptionResponse' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ARBCancelSubscriptionResponse.php', 'net\\authorize\\api\\contract\\v1\\ARBCreateSubscriptionRequest' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ARBCreateSubscriptionRequest.php', 'net\\authorize\\api\\contract\\v1\\ARBCreateSubscriptionResponse' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ARBCreateSubscriptionResponse.php', 'net\\authorize\\api\\contract\\v1\\ARBGetSubscriptionListRequest' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ARBGetSubscriptionListRequest.php', 'net\\authorize\\api\\contract\\v1\\ARBGetSubscriptionListResponse' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ARBGetSubscriptionListResponse.php', 'net\\authorize\\api\\contract\\v1\\ARBGetSubscriptionListSortingType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ARBGetSubscriptionListSortingType.php', 'net\\authorize\\api\\contract\\v1\\ARBGetSubscriptionRequest' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ARBGetSubscriptionRequest.php', 'net\\authorize\\api\\contract\\v1\\ARBGetSubscriptionResponse' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ARBGetSubscriptionResponse.php', 'net\\authorize\\api\\contract\\v1\\ARBGetSubscriptionStatusRequest' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ARBGetSubscriptionStatusRequest.php', 'net\\authorize\\api\\contract\\v1\\ARBGetSubscriptionStatusResponse' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ARBGetSubscriptionStatusResponse.php', 'net\\authorize\\api\\contract\\v1\\ARBSubscriptionMaskedType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ARBSubscriptionMaskedType.php', 'net\\authorize\\api\\contract\\v1\\ARBSubscriptionType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ARBSubscriptionType.php', 'net\\authorize\\api\\contract\\v1\\ARBUpdateSubscriptionRequest' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ARBUpdateSubscriptionRequest.php', 'net\\authorize\\api\\contract\\v1\\ARBUpdateSubscriptionResponse' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ARBUpdateSubscriptionResponse.php', 'net\\authorize\\api\\contract\\v1\\ArbTransactionType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ArbTransactionType.php', 'net\\authorize\\api\\contract\\v1\\ArrayOfSettingType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ArrayOfSettingType.php', 'net\\authorize\\api\\contract\\v1\\AuDeleteType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/AuDeleteType.php', 'net\\authorize\\api\\contract\\v1\\AuDetailsType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/AuDetailsType.php', 'net\\authorize\\api\\contract\\v1\\AuResponseType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/AuResponseType.php', 'net\\authorize\\api\\contract\\v1\\AuUpdateType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/AuUpdateType.php', 'net\\authorize\\api\\contract\\v1\\AuthenticateTestRequest' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/AuthenticateTestRequest.php', 'net\\authorize\\api\\contract\\v1\\AuthenticateTestResponse' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/AuthenticateTestResponse.php', 'net\\authorize\\api\\contract\\v1\\BankAccountMaskedType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/BankAccountMaskedType.php', 'net\\authorize\\api\\contract\\v1\\BankAccountType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/BankAccountType.php', 'net\\authorize\\api\\contract\\v1\\BatchDetailsType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/BatchDetailsType.php', 'net\\authorize\\api\\contract\\v1\\BatchStatisticType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/BatchStatisticType.php', 'net\\authorize\\api\\contract\\v1\\CardArtType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CardArtType.php', 'net\\authorize\\api\\contract\\v1\\CcAuthenticationType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CcAuthenticationType.php', 'net\\authorize\\api\\contract\\v1\\ContactDetailType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ContactDetailType.php', 'net\\authorize\\api\\contract\\v1\\CreateCustomerPaymentProfileRequest' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CreateCustomerPaymentProfileRequest.php', 'net\\authorize\\api\\contract\\v1\\CreateCustomerPaymentProfileResponse' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CreateCustomerPaymentProfileResponse.php', 'net\\authorize\\api\\contract\\v1\\CreateCustomerProfileFromTransactionRequest' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CreateCustomerProfileFromTransactionRequest.php', 'net\\authorize\\api\\contract\\v1\\CreateCustomerProfileRequest' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CreateCustomerProfileRequest.php', 'net\\authorize\\api\\contract\\v1\\CreateCustomerProfileResponse' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CreateCustomerProfileResponse.php', 'net\\authorize\\api\\contract\\v1\\CreateCustomerProfileTransactionRequest' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CreateCustomerProfileTransactionRequest.php', 'net\\authorize\\api\\contract\\v1\\CreateCustomerProfileTransactionResponse' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CreateCustomerProfileTransactionResponse.php', 'net\\authorize\\api\\contract\\v1\\CreateCustomerShippingAddressRequest' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CreateCustomerShippingAddressRequest.php', 'net\\authorize\\api\\contract\\v1\\CreateCustomerShippingAddressResponse' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CreateCustomerShippingAddressResponse.php', 'net\\authorize\\api\\contract\\v1\\CreateProfileResponseType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CreateProfileResponseType.php', 'net\\authorize\\api\\contract\\v1\\CreateTransactionRequest' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CreateTransactionRequest.php', 'net\\authorize\\api\\contract\\v1\\CreateTransactionResponse' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CreateTransactionResponse.php', 'net\\authorize\\api\\contract\\v1\\CreditCardMaskedType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CreditCardMaskedType.php', 'net\\authorize\\api\\contract\\v1\\CreditCardSimpleType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CreditCardSimpleType.php', 'net\\authorize\\api\\contract\\v1\\CreditCardTrackType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CreditCardTrackType.php', 'net\\authorize\\api\\contract\\v1\\CreditCardType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CreditCardType.php', 'net\\authorize\\api\\contract\\v1\\CustomerAddressExType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CustomerAddressExType.php', 'net\\authorize\\api\\contract\\v1\\CustomerAddressType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CustomerAddressType.php', 'net\\authorize\\api\\contract\\v1\\CustomerDataType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CustomerDataType.php', 'net\\authorize\\api\\contract\\v1\\CustomerPaymentProfileBaseType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CustomerPaymentProfileBaseType.php', 'net\\authorize\\api\\contract\\v1\\CustomerPaymentProfileExType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CustomerPaymentProfileExType.php', 'net\\authorize\\api\\contract\\v1\\CustomerPaymentProfileListItemType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CustomerPaymentProfileListItemType.php', 'net\\authorize\\api\\contract\\v1\\CustomerPaymentProfileMaskedType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CustomerPaymentProfileMaskedType.php', 'net\\authorize\\api\\contract\\v1\\CustomerPaymentProfileSortingType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CustomerPaymentProfileSortingType.php', 'net\\authorize\\api\\contract\\v1\\CustomerPaymentProfileType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CustomerPaymentProfileType.php', 'net\\authorize\\api\\contract\\v1\\CustomerProfileBaseType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CustomerProfileBaseType.php', 'net\\authorize\\api\\contract\\v1\\CustomerProfileExType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CustomerProfileExType.php', 'net\\authorize\\api\\contract\\v1\\CustomerProfileIdType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CustomerProfileIdType.php', 'net\\authorize\\api\\contract\\v1\\CustomerProfileInfoExType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CustomerProfileInfoExType.php', 'net\\authorize\\api\\contract\\v1\\CustomerProfileMaskedType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CustomerProfileMaskedType.php', 'net\\authorize\\api\\contract\\v1\\CustomerProfilePaymentType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CustomerProfilePaymentType.php', 'net\\authorize\\api\\contract\\v1\\CustomerProfileSummaryType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CustomerProfileSummaryType.php', 'net\\authorize\\api\\contract\\v1\\CustomerProfileType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CustomerProfileType.php', 'net\\authorize\\api\\contract\\v1\\CustomerType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CustomerType.php', 'net\\authorize\\api\\contract\\v1\\DecryptPaymentDataRequest' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/DecryptPaymentDataRequest.php', 'net\\authorize\\api\\contract\\v1\\DecryptPaymentDataResponse' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/DecryptPaymentDataResponse.php', 'net\\authorize\\api\\contract\\v1\\DeleteCustomerPaymentProfileRequest' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/DeleteCustomerPaymentProfileRequest.php', 'net\\authorize\\api\\contract\\v1\\DeleteCustomerPaymentProfileResponse' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/DeleteCustomerPaymentProfileResponse.php', 'net\\authorize\\api\\contract\\v1\\DeleteCustomerProfileRequest' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/DeleteCustomerProfileRequest.php', 'net\\authorize\\api\\contract\\v1\\DeleteCustomerProfileResponse' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/DeleteCustomerProfileResponse.php', 'net\\authorize\\api\\contract\\v1\\DeleteCustomerShippingAddressRequest' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/DeleteCustomerShippingAddressRequest.php', 'net\\authorize\\api\\contract\\v1\\DeleteCustomerShippingAddressResponse' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/DeleteCustomerShippingAddressResponse.php', 'net\\authorize\\api\\contract\\v1\\DriversLicenseMaskedType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/DriversLicenseMaskedType.php', 'net\\authorize\\api\\contract\\v1\\DriversLicenseType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/DriversLicenseType.php', 'net\\authorize\\api\\contract\\v1\\EmailSettingsType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/EmailSettingsType.php', 'net\\authorize\\api\\contract\\v1\\EmvTagType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/EmvTagType.php', 'net\\authorize\\api\\contract\\v1\\EncryptedTrackDataType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/EncryptedTrackDataType.php', 'net\\authorize\\api\\contract\\v1\\EnumCollection' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/EnumCollection.php', 'net\\authorize\\api\\contract\\v1\\ErrorResponse' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ErrorResponse.php', 'net\\authorize\\api\\contract\\v1\\ExtendedAmountType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ExtendedAmountType.php', 'net\\authorize\\api\\contract\\v1\\FDSFilterType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/FDSFilterType.php', 'net\\authorize\\api\\contract\\v1\\FingerPrintType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/FingerPrintType.php', 'net\\authorize\\api\\contract\\v1\\FraudInformationType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/FraudInformationType.php', 'net\\authorize\\api\\contract\\v1\\GetAUJobDetailsRequest' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetAUJobDetailsRequest.php', 'net\\authorize\\api\\contract\\v1\\GetAUJobDetailsResponse' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetAUJobDetailsResponse.php', 'net\\authorize\\api\\contract\\v1\\GetAUJobSummaryRequest' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetAUJobSummaryRequest.php', 'net\\authorize\\api\\contract\\v1\\GetAUJobSummaryResponse' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetAUJobSummaryResponse.php', 'net\\authorize\\api\\contract\\v1\\GetBatchStatisticsRequest' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetBatchStatisticsRequest.php', 'net\\authorize\\api\\contract\\v1\\GetBatchStatisticsResponse' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetBatchStatisticsResponse.php', 'net\\authorize\\api\\contract\\v1\\GetCustomerPaymentProfileListRequest' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetCustomerPaymentProfileListRequest.php', 'net\\authorize\\api\\contract\\v1\\GetCustomerPaymentProfileListResponse' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetCustomerPaymentProfileListResponse.php', 'net\\authorize\\api\\contract\\v1\\GetCustomerPaymentProfileNonceRequest' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetCustomerPaymentProfileNonceRequest.php', 'net\\authorize\\api\\contract\\v1\\GetCustomerPaymentProfileNonceResponse' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetCustomerPaymentProfileNonceResponse.php', 'net\\authorize\\api\\contract\\v1\\GetCustomerPaymentProfileRequest' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetCustomerPaymentProfileRequest.php', 'net\\authorize\\api\\contract\\v1\\GetCustomerPaymentProfileResponse' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetCustomerPaymentProfileResponse.php', 'net\\authorize\\api\\contract\\v1\\GetCustomerProfileIdsRequest' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetCustomerProfileIdsRequest.php', 'net\\authorize\\api\\contract\\v1\\GetCustomerProfileIdsResponse' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetCustomerProfileIdsResponse.php', 'net\\authorize\\api\\contract\\v1\\GetCustomerProfileRequest' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetCustomerProfileRequest.php', 'net\\authorize\\api\\contract\\v1\\GetCustomerProfileResponse' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetCustomerProfileResponse.php', 'net\\authorize\\api\\contract\\v1\\GetCustomerShippingAddressRequest' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetCustomerShippingAddressRequest.php', 'net\\authorize\\api\\contract\\v1\\GetCustomerShippingAddressResponse' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetCustomerShippingAddressResponse.php', 'net\\authorize\\api\\contract\\v1\\GetHostedPaymentPageRequest' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetHostedPaymentPageRequest.php', 'net\\authorize\\api\\contract\\v1\\GetHostedPaymentPageResponse' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetHostedPaymentPageResponse.php', 'net\\authorize\\api\\contract\\v1\\GetHostedProfilePageRequest' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetHostedProfilePageRequest.php', 'net\\authorize\\api\\contract\\v1\\GetHostedProfilePageResponse' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetHostedProfilePageResponse.php', 'net\\authorize\\api\\contract\\v1\\GetMerchantDetailsRequest' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetMerchantDetailsRequest.php', 'net\\authorize\\api\\contract\\v1\\GetMerchantDetailsResponse' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetMerchantDetailsResponse.php', 'net\\authorize\\api\\contract\\v1\\GetSettledBatchListRequest' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetSettledBatchListRequest.php', 'net\\authorize\\api\\contract\\v1\\GetSettledBatchListResponse' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetSettledBatchListResponse.php', 'net\\authorize\\api\\contract\\v1\\GetTransactionDetailsRequest' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetTransactionDetailsRequest.php', 'net\\authorize\\api\\contract\\v1\\GetTransactionDetailsResponse' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetTransactionDetailsResponse.php', 'net\\authorize\\api\\contract\\v1\\GetTransactionListForCustomerRequest' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetTransactionListForCustomerRequest.php', 'net\\authorize\\api\\contract\\v1\\GetTransactionListRequest' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetTransactionListRequest.php', 'net\\authorize\\api\\contract\\v1\\GetTransactionListResponse' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetTransactionListResponse.php', 'net\\authorize\\api\\contract\\v1\\GetUnsettledTransactionListRequest' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetUnsettledTransactionListRequest.php', 'net\\authorize\\api\\contract\\v1\\GetUnsettledTransactionListResponse' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetUnsettledTransactionListResponse.php', 'net\\authorize\\api\\contract\\v1\\HeldTransactionRequestType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/HeldTransactionRequestType.php', 'net\\authorize\\api\\contract\\v1\\ImpersonationAuthenticationType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ImpersonationAuthenticationType.php', 'net\\authorize\\api\\contract\\v1\\IsAliveRequest' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/IsAliveRequest.php', 'net\\authorize\\api\\contract\\v1\\IsAliveResponse' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/IsAliveResponse.php', 'net\\authorize\\api\\contract\\v1\\KeyBlockType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/KeyBlockType.php', 'net\\authorize\\api\\contract\\v1\\KeyManagementSchemeType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/KeyManagementSchemeType.php', 'net\\authorize\\api\\contract\\v1\\KeyManagementSchemeType\\DUKPTAType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/KeyManagementSchemeType/DUKPTAType.php', 'net\\authorize\\api\\contract\\v1\\KeyManagementSchemeType\\DUKPTAType\\DeviceInfoAType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/KeyManagementSchemeType/DUKPTAType/DeviceInfoAType.php', 'net\\authorize\\api\\contract\\v1\\KeyManagementSchemeType\\DUKPTAType\\EncryptedDataAType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/KeyManagementSchemeType/DUKPTAType/EncryptedDataAType.php', 'net\\authorize\\api\\contract\\v1\\KeyManagementSchemeType\\DUKPTAType\\ModeAType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/KeyManagementSchemeType/DUKPTAType/ModeAType.php', 'net\\authorize\\api\\contract\\v1\\KeyValueType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/KeyValueType.php', 'net\\authorize\\api\\contract\\v1\\LineItemType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/LineItemType.php', 'net\\authorize\\api\\contract\\v1\\ListOfAUDetailsType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ListOfAUDetailsType.php', 'net\\authorize\\api\\contract\\v1\\LogoutRequest' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/LogoutRequest.php', 'net\\authorize\\api\\contract\\v1\\LogoutResponse' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/LogoutResponse.php', 'net\\authorize\\api\\contract\\v1\\MerchantAuthenticationType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/MerchantAuthenticationType.php', 'net\\authorize\\api\\contract\\v1\\MerchantContactType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/MerchantContactType.php', 'net\\authorize\\api\\contract\\v1\\MessagesType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/MessagesType.php', 'net\\authorize\\api\\contract\\v1\\MessagesType\\MessageAType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/MessagesType/MessageAType.php', 'net\\authorize\\api\\contract\\v1\\MobileDeviceLoginRequest' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/MobileDeviceLoginRequest.php', 'net\\authorize\\api\\contract\\v1\\MobileDeviceLoginResponse' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/MobileDeviceLoginResponse.php', 'net\\authorize\\api\\contract\\v1\\MobileDeviceRegistrationRequest' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/MobileDeviceRegistrationRequest.php', 'net\\authorize\\api\\contract\\v1\\MobileDeviceRegistrationResponse' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/MobileDeviceRegistrationResponse.php', 'net\\authorize\\api\\contract\\v1\\MobileDeviceType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/MobileDeviceType.php', 'net\\authorize\\api\\contract\\v1\\NameAndAddressType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/NameAndAddressType.php', 'net\\authorize\\api\\contract\\v1\\OpaqueDataType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/OpaqueDataType.php', 'net\\authorize\\api\\contract\\v1\\OrderExType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/OrderExType.php', 'net\\authorize\\api\\contract\\v1\\OrderType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/OrderType.php', 'net\\authorize\\api\\contract\\v1\\OtherTaxType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/OtherTaxType.php', 'net\\authorize\\api\\contract\\v1\\PagingType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/PagingType.php', 'net\\authorize\\api\\contract\\v1\\PayPalType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/PayPalType.php', 'net\\authorize\\api\\contract\\v1\\PaymentDetailsType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/PaymentDetailsType.php', 'net\\authorize\\api\\contract\\v1\\PaymentEmvType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/PaymentEmvType.php', 'net\\authorize\\api\\contract\\v1\\PaymentMaskedType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/PaymentMaskedType.php', 'net\\authorize\\api\\contract\\v1\\PaymentProfileType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/PaymentProfileType.php', 'net\\authorize\\api\\contract\\v1\\PaymentScheduleType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/PaymentScheduleType.php', 'net\\authorize\\api\\contract\\v1\\PaymentScheduleType\\IntervalAType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/PaymentScheduleType/IntervalAType.php', 'net\\authorize\\api\\contract\\v1\\PaymentSimpleType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/PaymentSimpleType.php', 'net\\authorize\\api\\contract\\v1\\PaymentType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/PaymentType.php', 'net\\authorize\\api\\contract\\v1\\PermissionType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/PermissionType.php', 'net\\authorize\\api\\contract\\v1\\ProcessingOptionsType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ProcessingOptionsType.php', 'net\\authorize\\api\\contract\\v1\\ProcessorType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ProcessorType.php', 'net\\authorize\\api\\contract\\v1\\ProfileTransAmountType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ProfileTransAmountType.php', 'net\\authorize\\api\\contract\\v1\\ProfileTransAuthCaptureType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ProfileTransAuthCaptureType.php', 'net\\authorize\\api\\contract\\v1\\ProfileTransAuthOnlyType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ProfileTransAuthOnlyType.php', 'net\\authorize\\api\\contract\\v1\\ProfileTransCaptureOnlyType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ProfileTransCaptureOnlyType.php', 'net\\authorize\\api\\contract\\v1\\ProfileTransOrderType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ProfileTransOrderType.php', 'net\\authorize\\api\\contract\\v1\\ProfileTransPriorAuthCaptureType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ProfileTransPriorAuthCaptureType.php', 'net\\authorize\\api\\contract\\v1\\ProfileTransRefundType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ProfileTransRefundType.php', 'net\\authorize\\api\\contract\\v1\\ProfileTransVoidType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ProfileTransVoidType.php', 'net\\authorize\\api\\contract\\v1\\ProfileTransactionType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ProfileTransactionType.php', 'net\\authorize\\api\\contract\\v1\\ReturnedItemType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ReturnedItemType.php', 'net\\authorize\\api\\contract\\v1\\SecurePaymentContainerErrorType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/SecurePaymentContainerErrorType.php', 'net\\authorize\\api\\contract\\v1\\SecurePaymentContainerRequest' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/SecurePaymentContainerRequest.php', 'net\\authorize\\api\\contract\\v1\\SecurePaymentContainerResponse' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/SecurePaymentContainerResponse.php', 'net\\authorize\\api\\contract\\v1\\SendCustomerTransactionReceiptRequest' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/SendCustomerTransactionReceiptRequest.php', 'net\\authorize\\api\\contract\\v1\\SendCustomerTransactionReceiptResponse' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/SendCustomerTransactionReceiptResponse.php', 'net\\authorize\\api\\contract\\v1\\SettingType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/SettingType.php', 'net\\authorize\\api\\contract\\v1\\SolutionType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/SolutionType.php', 'net\\authorize\\api\\contract\\v1\\SubMerchantType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/SubMerchantType.php', 'net\\authorize\\api\\contract\\v1\\SubscriptionCustomerProfileType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/SubscriptionCustomerProfileType.php', 'net\\authorize\\api\\contract\\v1\\SubscriptionDetailType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/SubscriptionDetailType.php', 'net\\authorize\\api\\contract\\v1\\SubscriptionPaymentType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/SubscriptionPaymentType.php', 'net\\authorize\\api\\contract\\v1\\SubsequentAuthInformationType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/SubsequentAuthInformationType.php', 'net\\authorize\\api\\contract\\v1\\TokenMaskedType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/TokenMaskedType.php', 'net\\authorize\\api\\contract\\v1\\TransRetailInfoType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/TransRetailInfoType.php', 'net\\authorize\\api\\contract\\v1\\TransactionDetailsType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/TransactionDetailsType.php', 'net\\authorize\\api\\contract\\v1\\TransactionDetailsType\\EmvDetailsAType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/TransactionDetailsType/EmvDetailsAType.php', 'net\\authorize\\api\\contract\\v1\\TransactionDetailsType\\EmvDetailsAType\\TagAType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/TransactionDetailsType/EmvDetailsAType/TagAType.php', 'net\\authorize\\api\\contract\\v1\\TransactionListSortingType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/TransactionListSortingType.php', 'net\\authorize\\api\\contract\\v1\\TransactionRequestType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/TransactionRequestType.php', 'net\\authorize\\api\\contract\\v1\\TransactionRequestType\\UserFieldsAType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/TransactionRequestType/UserFieldsAType.php', 'net\\authorize\\api\\contract\\v1\\TransactionResponseType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/TransactionResponseType.php', 'net\\authorize\\api\\contract\\v1\\TransactionResponseType\\EmvResponseAType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/TransactionResponseType/EmvResponseAType.php', 'net\\authorize\\api\\contract\\v1\\TransactionResponseType\\EmvResponseAType\\TagsAType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/TransactionResponseType/EmvResponseAType/TagsAType.php', 'net\\authorize\\api\\contract\\v1\\TransactionResponseType\\ErrorsAType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/TransactionResponseType/ErrorsAType.php', 'net\\authorize\\api\\contract\\v1\\TransactionResponseType\\ErrorsAType\\ErrorAType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/TransactionResponseType/ErrorsAType/ErrorAType.php', 'net\\authorize\\api\\contract\\v1\\TransactionResponseType\\MessagesAType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/TransactionResponseType/MessagesAType.php', 'net\\authorize\\api\\contract\\v1\\TransactionResponseType\\MessagesAType\\MessageAType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/TransactionResponseType/MessagesAType/MessageAType.php', 'net\\authorize\\api\\contract\\v1\\TransactionResponseType\\PrePaidCardAType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/TransactionResponseType/PrePaidCardAType.php', 'net\\authorize\\api\\contract\\v1\\TransactionResponseType\\SecureAcceptanceAType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/TransactionResponseType/SecureAcceptanceAType.php', 'net\\authorize\\api\\contract\\v1\\TransactionResponseType\\SplitTenderPaymentsAType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/TransactionResponseType/SplitTenderPaymentsAType.php', 'net\\authorize\\api\\contract\\v1\\TransactionResponseType\\SplitTenderPaymentsAType\\SplitTenderPaymentAType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/TransactionResponseType/SplitTenderPaymentsAType/SplitTenderPaymentAType.php', 'net\\authorize\\api\\contract\\v1\\TransactionResponseType\\UserFieldsAType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/TransactionResponseType/UserFieldsAType.php', 'net\\authorize\\api\\contract\\v1\\TransactionSummaryType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/TransactionSummaryType.php', 'net\\authorize\\api\\contract\\v1\\UpdateCustomerPaymentProfileRequest' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/UpdateCustomerPaymentProfileRequest.php', 'net\\authorize\\api\\contract\\v1\\UpdateCustomerPaymentProfileResponse' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/UpdateCustomerPaymentProfileResponse.php', 'net\\authorize\\api\\contract\\v1\\UpdateCustomerProfileRequest' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/UpdateCustomerProfileRequest.php', 'net\\authorize\\api\\contract\\v1\\UpdateCustomerProfileResponse' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/UpdateCustomerProfileResponse.php', 'net\\authorize\\api\\contract\\v1\\UpdateCustomerShippingAddressRequest' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/UpdateCustomerShippingAddressRequest.php', 'net\\authorize\\api\\contract\\v1\\UpdateCustomerShippingAddressResponse' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/UpdateCustomerShippingAddressResponse.php', 'net\\authorize\\api\\contract\\v1\\UpdateHeldTransactionRequest' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/UpdateHeldTransactionRequest.php', 'net\\authorize\\api\\contract\\v1\\UpdateHeldTransactionResponse' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/UpdateHeldTransactionResponse.php', 'net\\authorize\\api\\contract\\v1\\UpdateSplitTenderGroupRequest' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/UpdateSplitTenderGroupRequest.php', 'net\\authorize\\api\\contract\\v1\\UpdateSplitTenderGroupResponse' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/UpdateSplitTenderGroupResponse.php', 'net\\authorize\\api\\contract\\v1\\UserFieldType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/UserFieldType.php', 'net\\authorize\\api\\contract\\v1\\ValidateCustomerPaymentProfileRequest' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ValidateCustomerPaymentProfileRequest.php', 'net\\authorize\\api\\contract\\v1\\ValidateCustomerPaymentProfileResponse' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ValidateCustomerPaymentProfileResponse.php', 'net\\authorize\\api\\contract\\v1\\WebCheckOutDataType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/WebCheckOutDataType.php', 'net\\authorize\\api\\contract\\v1\\WebCheckOutDataTypeTokenType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/WebCheckOutDataTypeTokenType.php', 'net\\authorize\\api\\controller\\ARBCancelSubscriptionController' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/controller/ARBCancelSubscriptionController.php', 'net\\authorize\\api\\controller\\ARBCreateSubscriptionController' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/controller/ARBCreateSubscriptionController.php', 'net\\authorize\\api\\controller\\ARBGetSubscriptionController' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/controller/ARBGetSubscriptionController.php', 'net\\authorize\\api\\controller\\ARBGetSubscriptionListController' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/controller/ARBGetSubscriptionListController.php', 'net\\authorize\\api\\controller\\ARBGetSubscriptionStatusController' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/controller/ARBGetSubscriptionStatusController.php', 'net\\authorize\\api\\controller\\ARBUpdateSubscriptionController' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/controller/ARBUpdateSubscriptionController.php', 'net\\authorize\\api\\controller\\AuthenticateTestController' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/controller/AuthenticateTestController.php', 'net\\authorize\\api\\controller\\CreateCustomerPaymentProfileController' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/controller/CreateCustomerPaymentProfileController.php', 'net\\authorize\\api\\controller\\CreateCustomerProfileController' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/controller/CreateCustomerProfileController.php', 'net\\authorize\\api\\controller\\CreateCustomerProfileFromTransactionController' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/controller/CreateCustomerProfileFromTransactionController.php', 'net\\authorize\\api\\controller\\CreateCustomerProfileTransactionController' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/controller/CreateCustomerProfileTransactionController.php', 'net\\authorize\\api\\controller\\CreateCustomerShippingAddressController' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/controller/CreateCustomerShippingAddressController.php', 'net\\authorize\\api\\controller\\CreateTransactionController' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/controller/CreateTransactionController.php', 'net\\authorize\\api\\controller\\DecryptPaymentDataController' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/controller/DecryptPaymentDataController.php', 'net\\authorize\\api\\controller\\DeleteCustomerPaymentProfileController' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/controller/DeleteCustomerPaymentProfileController.php', 'net\\authorize\\api\\controller\\DeleteCustomerProfileController' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/controller/DeleteCustomerProfileController.php', 'net\\authorize\\api\\controller\\DeleteCustomerShippingAddressController' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/controller/DeleteCustomerShippingAddressController.php', 'net\\authorize\\api\\controller\\GetAUJobDetailsController' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/controller/GetAUJobDetailsController.php', 'net\\authorize\\api\\controller\\GetAUJobSummaryController' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/controller/GetAUJobSummaryController.php', 'net\\authorize\\api\\controller\\GetBatchStatisticsController' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/controller/GetBatchStatisticsController.php', 'net\\authorize\\api\\controller\\GetCustomerPaymentProfileController' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/controller/GetCustomerPaymentProfileController.php', 'net\\authorize\\api\\controller\\GetCustomerPaymentProfileListController' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/controller/GetCustomerPaymentProfileListController.php', 'net\\authorize\\api\\controller\\GetCustomerPaymentProfileNonceController' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/controller/GetCustomerPaymentProfileNonceController.php', 'net\\authorize\\api\\controller\\GetCustomerProfileController' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/controller/GetCustomerProfileController.php', 'net\\authorize\\api\\controller\\GetCustomerProfileIdsController' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/controller/GetCustomerProfileIdsController.php', 'net\\authorize\\api\\controller\\GetCustomerShippingAddressController' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/controller/GetCustomerShippingAddressController.php', 'net\\authorize\\api\\controller\\GetHostedPaymentPageController' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/controller/GetHostedPaymentPageController.php', 'net\\authorize\\api\\controller\\GetHostedProfilePageController' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/controller/GetHostedProfilePageController.php', 'net\\authorize\\api\\controller\\GetMerchantDetailsController' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/controller/GetMerchantDetailsController.php', 'net\\authorize\\api\\controller\\GetSettledBatchListController' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/controller/GetSettledBatchListController.php', 'net\\authorize\\api\\controller\\GetTransactionDetailsController' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/controller/GetTransactionDetailsController.php', 'net\\authorize\\api\\controller\\GetTransactionListController' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/controller/GetTransactionListController.php', 'net\\authorize\\api\\controller\\GetTransactionListForCustomerController' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/controller/GetTransactionListForCustomerController.php', 'net\\authorize\\api\\controller\\GetUnsettledTransactionListController' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/controller/GetUnsettledTransactionListController.php', 'net\\authorize\\api\\controller\\IsAliveController' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/controller/IsAliveController.php', 'net\\authorize\\api\\controller\\LogoutController' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/controller/LogoutController.php', 'net\\authorize\\api\\controller\\MobileDeviceLoginController' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/controller/MobileDeviceLoginController.php', 'net\\authorize\\api\\controller\\MobileDeviceRegistrationController' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/controller/MobileDeviceRegistrationController.php', 'net\\authorize\\api\\controller\\SecurePaymentContainerController' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/controller/SecurePaymentContainerController.php', 'net\\authorize\\api\\controller\\SendCustomerTransactionReceiptController' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/controller/SendCustomerTransactionReceiptController.php', 'net\\authorize\\api\\controller\\UpdateCustomerPaymentProfileController' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/controller/UpdateCustomerPaymentProfileController.php', 'net\\authorize\\api\\controller\\UpdateCustomerProfileController' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/controller/UpdateCustomerProfileController.php', 'net\\authorize\\api\\controller\\UpdateCustomerShippingAddressController' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/controller/UpdateCustomerShippingAddressController.php', 'net\\authorize\\api\\controller\\UpdateHeldTransactionController' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/controller/UpdateHeldTransactionController.php', 'net\\authorize\\api\\controller\\UpdateSplitTenderGroupController' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/controller/UpdateSplitTenderGroupController.php', 'net\\authorize\\api\\controller\\ValidateCustomerPaymentProfileController' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/controller/ValidateCustomerPaymentProfileController.php', 'net\\authorize\\api\\controller\\base\\ApiOperationBase' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/controller/base/ApiOperationBase.php', 'net\\authorize\\api\\controller\\base\\IApiOperation' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/api/controller/base/IApiOperation.php', 'net\\authorize\\util\\ANetSensitiveFields' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/util/ANetSensitiveFields.php', 'net\\authorize\\util\\Helpers' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/util/Helpers.php', 'net\\authorize\\util\\HttpClient' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/util/HttpClient.php', 'net\\authorize\\util\\Log' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/util/Log.php', 'net\\authorize\\util\\LogFactory' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/util/LogFactory.php', 'net\\authorize\\util\\SensitiveDataConfigType' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/util/SensitiveDataConfigType.php', 'net\\authorize\\util\\SensitiveTag' => $vendorDir . '/authorizenet/authorizenet/lib/net/authorize/util/SensitiveTag.php', ); autoload_psr4.php 0000644 00000023443 14736103146 0010050 0 ustar 00 <?php // autoload_psr4.php @generated by Composer $vendorDir = dirname(dirname(__FILE__)); $baseDir = dirname($vendorDir); return array( 'voku\\' => array($vendorDir . '/voku/portable-ascii/src/voku'), 'phpseclib\\' => array($vendorDir . '/phpseclib/phpseclib/phpseclib'), 'mindplay\\middleman\\' => array($vendorDir . '/mindplay/middleman/src'), 'cebe\\openapi\\' => array($vendorDir . '/cebe/php-openapi/src'), 'ZBateson\\StreamDecorators\\' => array($vendorDir . '/zbateson/stream-decorators/src'), 'ZBateson\\MbWrapper\\' => array($vendorDir . '/zbateson/mb-wrapper/src'), 'ZBateson\\MailMimeParser\\' => array($vendorDir . '/zbateson/mail-mime-parser/src'), 'Whoops\\' => array($vendorDir . '/filp/whoops/src/Whoops'), 'Webmozart\\Assert\\' => array($vendorDir . '/webmozart/assert/src'), 'WHMCS\\' => array($vendorDir . '/whmcs/whmcs-foundation/lib'), 'TrueBV\\' => array($vendorDir . '/true/punycode/src'), 'Symfony\\Polyfill\\Php81\\' => array($vendorDir . '/symfony/polyfill-php81'), 'Symfony\\Polyfill\\Php80\\' => array($vendorDir . '/symfony/polyfill-php80'), 'Symfony\\Polyfill\\Php73\\' => array($vendorDir . '/symfony/polyfill-php73'), 'Symfony\\Polyfill\\Php72\\' => array($vendorDir . '/symfony/polyfill-php72'), 'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'), 'Symfony\\Polyfill\\Intl\\Normalizer\\' => array($vendorDir . '/symfony/polyfill-intl-normalizer'), 'Symfony\\Polyfill\\Intl\\Idn\\' => array($vendorDir . '/symfony/polyfill-intl-idn'), 'Symfony\\Polyfill\\Intl\\Grapheme\\' => array($vendorDir . '/symfony/polyfill-intl-grapheme'), 'Symfony\\Polyfill\\Iconv\\' => array($vendorDir . '/symfony/polyfill-iconv'), 'Symfony\\Polyfill\\Ctype\\' => array($vendorDir . '/symfony/polyfill-ctype'), 'Symfony\\Contracts\\Translation\\' => array($vendorDir . '/symfony/translation-contracts'), 'Symfony\\Contracts\\Service\\' => array($vendorDir . '/symfony/service-contracts'), 'Symfony\\Contracts\\Cache\\' => array($vendorDir . '/symfony/cache-contracts'), 'Symfony\\Component\\Yaml\\' => array($vendorDir . '/symfony/yaml'), 'Symfony\\Component\\VarExporter\\' => array($vendorDir . '/symfony/var-exporter'), 'Symfony\\Component\\Translation\\' => array($vendorDir . '/symfony/translation'), 'Symfony\\Component\\String\\' => array($vendorDir . '/symfony/string'), 'Symfony\\Component\\Process\\' => array($vendorDir . '/symfony/process'), 'Symfony\\Component\\Mime\\' => array($vendorDir . '/symfony/mime'), 'Symfony\\Component\\HttpFoundation\\' => array($vendorDir . '/symfony/http-foundation'), 'Symfony\\Component\\Finder\\' => array($vendorDir . '/symfony/finder'), 'Symfony\\Component\\Filesystem\\' => array($vendorDir . '/symfony/filesystem'), 'Symfony\\Component\\DependencyInjection\\' => array($vendorDir . '/symfony/dependency-injection'), 'Symfony\\Component\\Console\\' => array($vendorDir . '/symfony/console'), 'Symfony\\Component\\Config\\' => array($vendorDir . '/symfony/config'), 'Symfony\\Component\\Cache\\' => array($vendorDir . '/symfony/cache'), 'Stripe\\' => array($vendorDir . '/stripe/stripe-php/lib'), 'Stevenmaguire\\OAuth2\\Client\\' => array($vendorDir . '/stevenmaguire/oauth2-microsoft/src'), 'Sonata\\GoogleAuthenticator\\' => array($vendorDir . '/sonata-project/google-authenticator/src'), 'Seld\\PharUtils\\' => array($vendorDir . '/seld/phar-utils/src'), 'Seld\\JsonLint\\' => array($vendorDir . '/seld/jsonlint/src/Seld/JsonLint'), 'Seld\\CliPrompt\\' => array($vendorDir . '/seld/cli-prompt/src'), 'Riverline\\MultiPartParser\\' => array($vendorDir . '/riverline/multipart-parser/src'), 'Respect\\Validation\\' => array($vendorDir . '/respect/validation/library'), 'Respect\\Stringifier\\' => array($vendorDir . '/respect/stringifier/src'), 'React\\Promise\\' => array($vendorDir . '/react/promise/src'), 'ReCaptcha\\' => array($vendorDir . '/google/recaptcha/src/ReCaptcha'), 'Ramsey\\Uuid\\' => array($vendorDir . '/ramsey/uuid/src'), 'Ramsey\\Collection\\' => array($vendorDir . '/ramsey/collection/src'), 'Punic\\' => array($vendorDir . '/punic/punic/src'), 'Psr\\SimpleCache\\' => array($vendorDir . '/psr/simple-cache/src'), 'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'), 'Psr\\Http\\Server\\' => array($vendorDir . '/psr/http-server-handler/src', $vendorDir . '/psr/http-server-middleware/src'), 'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src', $vendorDir . '/psr/http-factory/src'), 'Psr\\Http\\Client\\' => array($vendorDir . '/psr/http-client/src'), 'Psr\\Container\\' => array($vendorDir . '/psr/container/src'), 'Psr\\Cache\\' => array($vendorDir . '/psr/cache/src'), 'PhpOption\\' => array($vendorDir . '/phpoption/phpoption/src/PhpOption'), 'PhpMyAdmin\\SqlParser\\' => array($vendorDir . '/phpmyadmin/sql-parser/src'), 'PHPMailer\\PHPMailer\\' => array($vendorDir . '/phpmailer/phpmailer/src'), 'Monolog\\' => array($vendorDir . '/monolog/monolog/src/Monolog'), 'Middlewares\\Utils\\' => array($vendorDir . '/middlewares/utils/src'), 'Middlewares\\' => array($vendorDir . '/middlewares/fast-route/src'), 'Michelf\\' => array($vendorDir . '/michelf/php-markdown/Michelf'), 'League\\Uri\\' => array($vendorDir . '/league/uri-interfaces/src', $vendorDir . '/league/uri/src'), 'League\\Plates\\' => array($vendorDir . '/league/plates/src'), 'League\\OpenAPIValidation\\' => array($vendorDir . '/league/openapi-psr7-validator/src'), 'League\\OAuth2\\Client\\' => array($vendorDir . '/league/oauth2-client/src', $vendorDir . '/league/oauth2-google/src'), 'League\\Flysystem\\AwsS3v3\\' => array($vendorDir . '/league/flysystem-aws-s3-v3/src'), 'League\\Flysystem\\' => array($vendorDir . '/league/flysystem/src'), 'League\\CLImate\\' => array($vendorDir . '/league/climate/src'), 'Laminas\\ZendFrameworkBridge\\' => array($vendorDir . '/laminas/laminas-zendframework-bridge/src'), 'Laminas\\Validator\\' => array($vendorDir . '/laminas/laminas-validator/src'), 'Laminas\\Stdlib\\' => array($vendorDir . '/laminas/laminas-stdlib/src'), 'Laminas\\Mime\\' => array($vendorDir . '/laminas/laminas-mime/src'), 'Laminas\\Mail\\' => array($vendorDir . '/laminas/laminas-mail/src'), 'Laminas\\Loader\\' => array($vendorDir . '/laminas/laminas-loader/src'), 'Laminas\\HttpHandlerRunner\\' => array($vendorDir . '/laminas/laminas-httphandlerrunner/src'), 'Laminas\\Diactoros\\' => array($vendorDir . '/laminas/laminas-diactoros/src'), 'Knp\\Menu\\' => array($vendorDir . '/knplabs/knp-menu/src/Knp/Menu'), 'JsonSchema\\' => array($vendorDir . '/justinrainbow/json-schema/src/JsonSchema'), 'JmesPath\\' => array($vendorDir . '/mtdowling/jmespath.php/src'), 'Interop\\Http\\ServerMiddleware\\' => array($vendorDir . '/http-interop/http-middleware/src'), 'Interop\\Http\\Factory\\' => array($vendorDir . '/http-interop/http-factory/src'), 'Interop\\Container\\' => array($vendorDir . '/container-interop/container-interop/src/Interop/Container'), 'Illuminate\\Validation\\' => array($vendorDir . '/illuminate/validation'), 'Illuminate\\Translation\\' => array($vendorDir . '/illuminate/translation'), 'Illuminate\\Support\\' => array($vendorDir . '/illuminate/support'), 'Illuminate\\Filesystem\\' => array($vendorDir . '/illuminate/filesystem'), 'Illuminate\\Events\\' => array($vendorDir . '/illuminate/events'), 'Illuminate\\Database\\' => array($vendorDir . '/illuminate/database'), 'Illuminate\\Contracts\\' => array($vendorDir . '/illuminate/contracts'), 'Illuminate\\Container\\' => array($vendorDir . '/illuminate/container'), 'Illuminate\\Console\\' => array($vendorDir . '/illuminate/console'), 'GuzzleHttp\\Psr7\\' => array($vendorDir . '/guzzlehttp/psr7/src'), 'GuzzleHttp\\Promise\\' => array($vendorDir . '/guzzlehttp/promises/src'), 'GuzzleHttp\\' => array($vendorDir . '/guzzlehttp/guzzle/src'), 'Google\\Authenticator\\' => array($vendorDir . '/sonata-project/google-authenticator/src'), 'Google\\Auth\\' => array($vendorDir . '/google/auth/src'), 'GoetasWebservices\\Xsd\\XsdToPhpRuntime\\' => array($vendorDir . '/goetas-webservices/xsd2php-runtime/src'), 'Firebase\\JWT\\' => array($vendorDir . '/firebase/php-jwt/src'), 'FastRoute\\' => array($vendorDir . '/nikic/fast-route/src'), 'Facebook\\' => array($vendorDir . '/facebook/graph-sdk/src/Facebook'), 'Egulias\\EmailValidator\\' => array($vendorDir . '/egulias/email-validator/src'), 'Duo\\' => array($vendorDir . '/duosecurity/duo_php/src'), 'Doctrine\\Instantiator\\' => array($vendorDir . '/doctrine/instantiator/src/Doctrine/Instantiator'), 'Doctrine\\Inflector\\' => array($vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector'), 'Doctrine\\Common\\Lexer\\' => array($vendorDir . '/doctrine/lexer/lib/Doctrine/Common/Lexer'), 'Doctrine\\Common\\Inflector\\' => array($vendorDir . '/doctrine/inflector/lib/Doctrine/Common/Inflector'), 'Doctrine\\Common\\Annotations\\' => array($vendorDir . '/doctrine/annotations/lib/Doctrine/Common/Annotations'), 'Composer\\XdebugHandler\\' => array($vendorDir . '/composer/xdebug-handler/src'), 'Composer\\Spdx\\' => array($vendorDir . '/composer/spdx-licenses/src'), 'Composer\\Semver\\' => array($vendorDir . '/composer/semver/src'), 'Composer\\CaBundle\\' => array($vendorDir . '/composer/ca-bundle/src'), 'Composer\\' => array($vendorDir . '/composer/composer/src/Composer'), 'Carbon\\' => array($vendorDir . '/nesbot/carbon/src/Carbon'), 'Brick\\Math\\' => array($vendorDir . '/brick/math/src'), 'Aws\\' => array($vendorDir . '/aws/aws-sdk-php/src'), 'Abraham\\TwitterOAuth\\' => array($vendorDir . '/abraham/twitteroauth/src'), '' => array($vendorDir . '/bitpay/php-client/src'), ); autoload_real.php 0000644 00000005023 14736103146 0010075 0 ustar 00 <?php // autoload_real.php @generated by Composer class ComposerAutoloaderInitb3c17cb4854742e046e1a14170163c9a { private static $loader; public static function loadClassLoader($class) { if ('Composer\Autoload\ClassLoader' === $class) { require __DIR__ . '/ClassLoader.php'; } } /** * @return \Composer\Autoload\ClassLoader */ public static function getLoader() { if (null !== self::$loader) { return self::$loader; } spl_autoload_register(array('ComposerAutoloaderInitb3c17cb4854742e046e1a14170163c9a', 'loadClassLoader'), true, true); self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(\dirname(__FILE__))); spl_autoload_unregister(array('ComposerAutoloaderInitb3c17cb4854742e046e1a14170163c9a', 'loadClassLoader')); $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); if ($useStaticLoader) { require __DIR__ . '/autoload_static.php'; call_user_func(\Composer\Autoload\ComposerStaticInitb3c17cb4854742e046e1a14170163c9a::getInitializer($loader)); } else { $map = require __DIR__ . '/autoload_namespaces.php'; foreach ($map as $namespace => $path) { $loader->set($namespace, $path); } $map = require __DIR__ . '/autoload_psr4.php'; foreach ($map as $namespace => $path) { $loader->setPsr4($namespace, $path); } $classMap = require __DIR__ . '/autoload_classmap.php'; if ($classMap) { $loader->addClassMap($classMap); } } $loader->register(true); if ($useStaticLoader) { $includeFiles = Composer\Autoload\ComposerStaticInitb3c17cb4854742e046e1a14170163c9a::$files; } else { $includeFiles = require __DIR__ . '/autoload_files.php'; } foreach ($includeFiles as $fileIdentifier => $file) { composerRequireb3c17cb4854742e046e1a14170163c9a($fileIdentifier, $file); } return $loader; } } /** * @param string $fileIdentifier * @param string $file * @return void */ function composerRequireb3c17cb4854742e046e1a14170163c9a($fileIdentifier, $file) { if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; require $file; } } semver/CONTRIBUTING.md 0000644 00000002000 14736103146 0010273 0 ustar 00 Contributing to composer/semver =============================== Please note that this project is released with a [Contributor Code of Conduct](http://contributor-covenant.org/version/1/1/0/). By participating in this project and its community you agree to abide by those terms. Reporting Issues ---------------- When reporting issues, please try to be as descriptive as possible, and include as much relevant information as you can. A step by step guide on how to reproduce the issue will greatly increase the chances of your issue being resolved in a timely manner. Contributing Policy ------------------- Fork the project, create a feature branch, and send us a pull request. To ensure a consistent code base, you should make sure the code follows the [PSR-2 Coding Standards](http://www.php-fig.org/psr/psr-2/). Run [php-cs-fixer](https://github.com/FriendsOfPHP/PHP-CS-Fixer) to automatically "fix" files. If you would like to help, take a look at the [list of issues](https://github.com/composer/semver/issues). semver/src/Semver.php 0000644 00000006216 14736103146 0010620 0 ustar 00 <?php /* * This file is part of composer/semver. * * (c) Composer <https://github.com/composer> * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace Composer\Semver; use Composer\Semver\Constraint\Constraint; class Semver { const SORT_ASC = 1; const SORT_DESC = -1; /** @var VersionParser */ private static $versionParser; /** * Determine if given version satisfies given constraints. * * @param string $version * @param string $constraints * * @return bool */ public static function satisfies($version, $constraints) { if (null === self::$versionParser) { self::$versionParser = new VersionParser(); } $versionParser = self::$versionParser; $provider = new Constraint('==', $versionParser->normalize($version)); $parsedConstraints = $versionParser->parseConstraints($constraints); return $parsedConstraints->matches($provider); } /** * Return all versions that satisfy given constraints. * * @param array $versions * @param string $constraints * * @return array */ public static function satisfiedBy(array $versions, $constraints) { $versions = array_filter($versions, function ($version) use ($constraints) { return Semver::satisfies($version, $constraints); }); return array_values($versions); } /** * Sort given array of versions. * * @param array $versions * * @return array */ public static function sort(array $versions) { return self::usort($versions, self::SORT_ASC); } /** * Sort given array of versions in reverse. * * @param array $versions * * @return array */ public static function rsort(array $versions) { return self::usort($versions, self::SORT_DESC); } /** * @param array $versions * @param int $direction * * @return array */ private static function usort(array $versions, $direction) { if (null === self::$versionParser) { self::$versionParser = new VersionParser(); } $versionParser = self::$versionParser; $normalized = array(); // Normalize outside of usort() scope for minor performance increase. // Creates an array of arrays: [[normalized, key], ...] foreach ($versions as $key => $version) { $normalized[] = array($versionParser->normalize($version), $key); } usort($normalized, function (array $left, array $right) use ($direction) { if ($left[0] === $right[0]) { return 0; } if (Comparator::lessThan($left[0], $right[0])) { return -$direction; } return $direction; }); // Recreate input array, using the original indexes which are now in sorted order. $sorted = array(); foreach ($normalized as $item) { $sorted[] = $versions[$item[1]]; } return $sorted; } } semver/src/Constraint/Constraint.php 0000644 00000013426 14736103146 0013630 0 ustar 00 <?php /* * This file is part of composer/semver. * * (c) Composer <https://github.com/composer> * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace Composer\Semver\Constraint; /** * Defines a constraint. */ class Constraint implements ConstraintInterface { /* operator integer values */ const OP_EQ = 0; const OP_LT = 1; const OP_LE = 2; const OP_GT = 3; const OP_GE = 4; const OP_NE = 5; /** * Operator to integer translation table. * * @var array */ private static $transOpStr = array( '=' => self::OP_EQ, '==' => self::OP_EQ, '<' => self::OP_LT, '<=' => self::OP_LE, '>' => self::OP_GT, '>=' => self::OP_GE, '<>' => self::OP_NE, '!=' => self::OP_NE, ); /** * Integer to operator translation table. * * @var array */ private static $transOpInt = array( self::OP_EQ => '==', self::OP_LT => '<', self::OP_LE => '<=', self::OP_GT => '>', self::OP_GE => '>=', self::OP_NE => '!=', ); /** @var string */ protected $operator; /** @var string */ protected $version; /** @var string */ protected $prettyString; /** * @param ConstraintInterface $provider * * @return bool */ public function matches(ConstraintInterface $provider) { if ($provider instanceof $this) { return $this->matchSpecific($provider); } // turn matching around to find a match return $provider->matches($this); } /** * @param string $prettyString */ public function setPrettyString($prettyString) { $this->prettyString = $prettyString; } /** * @return string */ public function getPrettyString() { if ($this->prettyString) { return $this->prettyString; } return $this->__toString(); } /** * Get all supported comparison operators. * * @return array */ public static function getSupportedOperators() { return array_keys(self::$transOpStr); } /** * Sets operator and version to compare with. * * @param string $operator * @param string $version * * @throws \InvalidArgumentException if invalid operator is given. */ public function __construct($operator, $version) { if (!isset(self::$transOpStr[$operator])) { throw new \InvalidArgumentException(sprintf( 'Invalid operator "%s" given, expected one of: %s', $operator, implode(', ', self::getSupportedOperators()) )); } $this->operator = self::$transOpStr[$operator]; $this->version = $version; } /** * @param string $a * @param string $b * @param string $operator * @param bool $compareBranches * * @throws \InvalidArgumentException if invalid operator is given. * * @return bool */ public function versionCompare($a, $b, $operator, $compareBranches = false) { if (!isset(self::$transOpStr[$operator])) { throw new \InvalidArgumentException(sprintf( 'Invalid operator "%s" given, expected one of: %s', $operator, implode(', ', self::getSupportedOperators()) )); } $aIsBranch = 'dev-' === substr($a, 0, 4); $bIsBranch = 'dev-' === substr($b, 0, 4); if ($aIsBranch && $bIsBranch) { return $operator === '==' && $a === $b; } // when branches are not comparable, we make sure dev branches never match anything if (!$compareBranches && ($aIsBranch || $bIsBranch)) { return false; } return version_compare($a, $b, $operator); } /** * @param Constraint $provider * @param bool $compareBranches * * @return bool */ public function matchSpecific(Constraint $provider, $compareBranches = false) { $noEqualOp = str_replace('=', '', self::$transOpInt[$this->operator]); $providerNoEqualOp = str_replace('=', '', self::$transOpInt[$provider->operator]); $isEqualOp = self::OP_EQ === $this->operator; $isNonEqualOp = self::OP_NE === $this->operator; $isProviderEqualOp = self::OP_EQ === $provider->operator; $isProviderNonEqualOp = self::OP_NE === $provider->operator; // '!=' operator is match when other operator is not '==' operator or version is not match // these kinds of comparisons always have a solution if ($isNonEqualOp || $isProviderNonEqualOp) { return (!$isEqualOp && !$isProviderEqualOp) || $this->versionCompare($provider->version, $this->version, '!=', $compareBranches); } // an example for the condition is <= 2.0 & < 1.0 // these kinds of comparisons always have a solution if ($this->operator !== self::OP_EQ && $noEqualOp === $providerNoEqualOp) { return true; } if ($this->versionCompare($provider->version, $this->version, self::$transOpInt[$this->operator], $compareBranches)) { // special case, e.g. require >= 1.0 and provide < 1.0 // 1.0 >= 1.0 but 1.0 is outside of the provided interval return !($provider->version === $this->version && self::$transOpInt[$provider->operator] === $providerNoEqualOp && self::$transOpInt[$this->operator] !== $noEqualOp); } return false; } /** * @return string */ public function __toString() { return self::$transOpInt[$this->operator] . ' ' . $this->version; } } semver/src/Constraint/AbstractConstraint.php 0000644 00000003156 14736103146 0015313 0 ustar 00 <?php /* * This file is part of composer/semver. * * (c) Composer <https://github.com/composer> * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace Composer\Semver\Constraint; trigger_error('The ' . __NAMESPACE__ . '\AbstractConstraint abstract class is deprecated, there is no replacement for it, it will be removed in the next major version.', E_USER_DEPRECATED); /** * Base constraint class. */ abstract class AbstractConstraint implements ConstraintInterface { /** @var string */ protected $prettyString; /** * @param ConstraintInterface $provider * * @return bool */ public function matches(ConstraintInterface $provider) { if ($provider instanceof $this) { // see note at bottom of this class declaration return $this->matchSpecific($provider); } // turn matching around to find a match return $provider->matches($this); } /** * @param string $prettyString */ public function setPrettyString($prettyString) { $this->prettyString = $prettyString; } /** * @return string */ public function getPrettyString() { if ($this->prettyString) { return $this->prettyString; } return $this->__toString(); } // implementations must implement a method of this format: // not declared abstract here because type hinting violates parameter coherence (TODO right word?) // public function matchSpecific(<SpecificConstraintType> $provider); } semver/src/Constraint/ConstraintInterface.php 0000644 00000001136 14736103146 0015444 0 ustar 00 <?php /* * This file is part of composer/semver. * * (c) Composer <https://github.com/composer> * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace Composer\Semver\Constraint; interface ConstraintInterface { /** * @param ConstraintInterface $provider * * @return bool */ public function matches(ConstraintInterface $provider); /** * @return string */ public function getPrettyString(); /** * @return string */ public function __toString(); } semver/src/Constraint/MultiConstraint.php 0000644 00000005041 14736103146 0014635 0 ustar 00 <?php /* * This file is part of composer/semver. * * (c) Composer <https://github.com/composer> * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace Composer\Semver\Constraint; /** * Defines a conjunctive or disjunctive set of constraints. */ class MultiConstraint implements ConstraintInterface { /** @var ConstraintInterface[] */ protected $constraints; /** @var string */ protected $prettyString; /** @var bool */ protected $conjunctive; /** * @param ConstraintInterface[] $constraints A set of constraints * @param bool $conjunctive Whether the constraints should be treated as conjunctive or disjunctive */ public function __construct(array $constraints, $conjunctive = true) { $this->constraints = $constraints; $this->conjunctive = $conjunctive; } /** * @return ConstraintInterface[] */ public function getConstraints() { return $this->constraints; } /** * @return bool */ public function isConjunctive() { return $this->conjunctive; } /** * @return bool */ public function isDisjunctive() { return !$this->conjunctive; } /** * @param ConstraintInterface $provider * * @return bool */ public function matches(ConstraintInterface $provider) { if (false === $this->conjunctive) { foreach ($this->constraints as $constraint) { if ($constraint->matches($provider)) { return true; } } return false; } foreach ($this->constraints as $constraint) { if (!$constraint->matches($provider)) { return false; } } return true; } /** * @param string $prettyString */ public function setPrettyString($prettyString) { $this->prettyString = $prettyString; } /** * @return string */ public function getPrettyString() { if ($this->prettyString) { return $this->prettyString; } return (string) $this; } /** * @return string */ public function __toString() { $constraints = array(); foreach ($this->constraints as $constraint) { $constraints[] = (string) $constraint; } return '[' . implode($this->conjunctive ? ' ' : ' || ', $constraints) . ']'; } } semver/src/Constraint/EmptyConstraint.php 0000644 00000002063 14736103146 0014642 0 ustar 00 <?php /* * This file is part of composer/semver. * * (c) Composer <https://github.com/composer> * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace Composer\Semver\Constraint; /** * Defines the absence of a constraint. */ class EmptyConstraint implements ConstraintInterface { /** @var string */ protected $prettyString; /** * @param ConstraintInterface $provider * * @return bool */ public function matches(ConstraintInterface $provider) { return true; } /** * @param $prettyString */ public function setPrettyString($prettyString) { $this->prettyString = $prettyString; } /** * @return string */ public function getPrettyString() { if ($this->prettyString) { return $this->prettyString; } return (string) $this; } /** * @return string */ public function __toString() { return '[]'; } } semver/src/VersionParser.php 0000644 00000046471 14736103146 0012170 0 ustar 00 <?php /* * This file is part of composer/semver. * * (c) Composer <https://github.com/composer> * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace Composer\Semver; use Composer\Semver\Constraint\ConstraintInterface; use Composer\Semver\Constraint\EmptyConstraint; use Composer\Semver\Constraint\MultiConstraint; use Composer\Semver\Constraint\Constraint; /** * Version parser. * * @author Jordi Boggiano <j.boggiano@seld.be> */ class VersionParser { /** * Regex to match pre-release data (sort of). * * Due to backwards compatibility: * - Instead of enforcing hyphen, an underscore, dot or nothing at all are also accepted. * - Only stabilities as recognized by Composer are allowed to precede a numerical identifier. * - Numerical-only pre-release identifiers are not supported, see tests. * * |--------------| * [major].[minor].[patch] -[pre-release] +[build-metadata] * * @var string */ private static $modifierRegex = '[._-]?(?:(stable|beta|b|RC|alpha|a|patch|pl|p)((?:[.-]?\d+)*+)?)?([.-]?dev)?'; /** @var array */ private static $stabilities = array('stable', 'RC', 'beta', 'alpha', 'dev'); /** * Returns the stability of a version. * * @param string $version * * @return string */ public static function parseStability($version) { $version = preg_replace('{#.+$}i', '', $version); if (strpos($version, 'dev-') === 0 || '-dev' === substr($version, -4)) { return 'dev'; } preg_match('{' . self::$modifierRegex . '(?:\+.*)?$}i', strtolower($version), $match); if (!empty($match[3])) { return 'dev'; } if (!empty($match[1])) { if ('beta' === $match[1] || 'b' === $match[1]) { return 'beta'; } if ('alpha' === $match[1] || 'a' === $match[1]) { return 'alpha'; } if ('rc' === $match[1]) { return 'RC'; } } return 'stable'; } /** * @param string $stability * * @return string */ public static function normalizeStability($stability) { $stability = strtolower($stability); return $stability === 'rc' ? 'RC' : $stability; } /** * Normalizes a version string to be able to perform comparisons on it. * * @param string $version * @param string $fullVersion optional complete version string to give more context * * @throws \UnexpectedValueException * * @return string */ public function normalize($version, $fullVersion = null) { $version = trim($version); if (null === $fullVersion) { $fullVersion = $version; } // strip off aliasing if (preg_match('{^([^,\s]++) ++as ++([^,\s]++)$}', $version, $match)) { // verify that the alias is a version without constraint $this->normalize($match[2]); $version = $match[1]; } // match master-like branches if (preg_match('{^(?:dev-)?(?:master|trunk|default)$}i', $version)) { return '9999999-dev'; } // if requirement is branch-like, use full name if (stripos($version, 'dev-') === 0) { return 'dev-' . substr($version, 4); } // strip off build metadata if (preg_match('{^([^,\s+]++)\+[^\s]++$}', $version, $match)) { $version = $match[1]; } // match classical versioning if (preg_match('{^v?(\d{1,5})(\.\d++)?(\.\d++)?(\.\d++)?' . self::$modifierRegex . '$}i', $version, $matches)) { $version = $matches[1] . (!empty($matches[2]) ? $matches[2] : '.0') . (!empty($matches[3]) ? $matches[3] : '.0') . (!empty($matches[4]) ? $matches[4] : '.0'); $index = 5; // match date(time) based versioning } elseif (preg_match('{^v?(\d{4}(?:[.:-]?\d{2}){1,6}(?:[.:-]?\d{1,3})?)' . self::$modifierRegex . '$}i', $version, $matches)) { $version = preg_replace('{\D}', '.', $matches[1]); $index = 2; } // add version modifiers if a version was matched if (isset($index)) { if (!empty($matches[$index])) { if ('stable' === $matches[$index]) { return $version; } $version .= '-' . $this->expandStability($matches[$index]) . (!empty($matches[$index + 1]) ? ltrim($matches[$index + 1], '.-') : ''); } if (!empty($matches[$index + 2])) { $version .= '-dev'; } return $version; } // match dev branches if (preg_match('{(.*?)[.-]?dev$}i', $version, $match)) { try { return $this->normalizeBranch($match[1]); } catch (\Exception $e) { } } $extraMessage = ''; if (preg_match('{ +as +' . preg_quote($version) . '$}', $fullVersion)) { $extraMessage = ' in "' . $fullVersion . '", the alias must be an exact version'; } elseif (preg_match('{^' . preg_quote($version) . ' +as +}', $fullVersion)) { $extraMessage = ' in "' . $fullVersion . '", the alias source must be an exact version, if it is a branch name you should prefix it with dev-'; } throw new \UnexpectedValueException('Invalid version string "' . $version . '"' . $extraMessage); } /** * Extract numeric prefix from alias, if it is in numeric format, suitable for version comparison. * * @param string $branch Branch name (e.g. 2.1.x-dev) * * @return string|false Numeric prefix if present (e.g. 2.1.) or false */ public function parseNumericAliasPrefix($branch) { if (preg_match('{^(?P<version>(\d++\\.)*\d++)(?:\.x)?-dev$}i', $branch, $matches)) { return $matches['version'] . '.'; } return false; } /** * Normalizes a branch name to be able to perform comparisons on it. * * @param string $name * * @return string */ public function normalizeBranch($name) { $name = trim($name); if (in_array($name, array('master', 'trunk', 'default'))) { return $this->normalize($name); } if (preg_match('{^v?(\d++)(\.(?:\d++|[xX*]))?(\.(?:\d++|[xX*]))?(\.(?:\d++|[xX*]))?$}i', $name, $matches)) { $version = ''; for ($i = 1; $i < 5; ++$i) { $version .= isset($matches[$i]) ? str_replace(array('*', 'X'), 'x', $matches[$i]) : '.x'; } return str_replace('x', '9999999', $version) . '-dev'; } return 'dev-' . $name; } /** * Parses a constraint string into MultiConstraint and/or Constraint objects. * * @param string $constraints * * @return ConstraintInterface */ public function parseConstraints($constraints) { $prettyConstraint = $constraints; if (preg_match('{^([^,\s]*?)@(' . implode('|', self::$stabilities) . ')$}i', $constraints, $match)) { $constraints = empty($match[1]) ? '*' : $match[1]; } if (preg_match('{^(dev-[^,\s@]+?|[^,\s@]+?\.x-dev)#.+$}i', $constraints, $match)) { $constraints = $match[1]; } $orConstraints = preg_split('{\s*\|\|?\s*}', trim($constraints)); $orGroups = array(); foreach ($orConstraints as $constraints) { $andConstraints = preg_split('{(?<!^|as|[=>< ,]) *(?<!-)[, ](?!-) *(?!,|as|$)}', $constraints); if (count($andConstraints) > 1) { $constraintObjects = array(); foreach ($andConstraints as $constraint) { foreach ($this->parseConstraint($constraint) as $parsedConstraint) { $constraintObjects[] = $parsedConstraint; } } } else { $constraintObjects = $this->parseConstraint($andConstraints[0]); } if (1 === count($constraintObjects)) { $constraint = $constraintObjects[0]; } else { $constraint = new MultiConstraint($constraintObjects); } $orGroups[] = $constraint; } if (1 === count($orGroups)) { $constraint = $orGroups[0]; } elseif (2 === count($orGroups) // parse the two OR groups and if they are contiguous we collapse // them into one constraint && $orGroups[0] instanceof MultiConstraint && $orGroups[1] instanceof MultiConstraint && 2 === count($orGroups[0]->getConstraints()) && 2 === count($orGroups[1]->getConstraints()) && ($a = (string) $orGroups[0]) && strpos($a, '[>=') === 0 && (false !== ($posA = strpos($a, '<', 4))) && ($b = (string) $orGroups[1]) && strpos($b, '[>=') === 0 && (false !== ($posB = strpos($b, '<', 4))) && substr($a, $posA + 2, -1) === substr($b, 4, $posB - 5) ) { $constraint = new MultiConstraint(array( new Constraint('>=', substr($a, 4, $posA - 5)), new Constraint('<', substr($b, $posB + 2, -1)), )); } else { $constraint = new MultiConstraint($orGroups, false); } $constraint->setPrettyString($prettyConstraint); return $constraint; } /** * @param string $constraint * * @throws \UnexpectedValueException * * @return array */ private function parseConstraint($constraint) { if (preg_match('{^([^,\s]+?)@(' . implode('|', self::$stabilities) . ')$}i', $constraint, $match)) { $constraint = $match[1]; if ($match[2] !== 'stable') { $stabilityModifier = $match[2]; } } if (preg_match('{^v?[xX*](\.[xX*])*$}i', $constraint)) { return array(new EmptyConstraint()); } $versionRegex = 'v?(\d++)(?:\.(\d++))?(?:\.(\d++))?(?:\.(\d++))?' . self::$modifierRegex . '(?:\+[^\s]+)?'; // Tilde Range // // Like wildcard constraints, unsuffixed tilde constraints say that they must be greater than the previous // version, to ensure that unstable instances of the current version are allowed. However, if a stability // suffix is added to the constraint, then a >= match on the current version is used instead. if (preg_match('{^~>?' . $versionRegex . '$}i', $constraint, $matches)) { if (strpos($constraint, '~>') === 0) { throw new \UnexpectedValueException( 'Could not parse version constraint ' . $constraint . ': ' . 'Invalid operator "~>", you probably meant to use the "~" operator' ); } // Work out which position in the version we are operating at if (isset($matches[4]) && '' !== $matches[4] && null !== $matches[4]) { $position = 4; } elseif (isset($matches[3]) && '' !== $matches[3] && null !== $matches[3]) { $position = 3; } elseif (isset($matches[2]) && '' !== $matches[2] && null !== $matches[2]) { $position = 2; } else { $position = 1; } // Calculate the stability suffix $stabilitySuffix = ''; if (empty($matches[5]) && empty($matches[7])) { $stabilitySuffix .= '-dev'; } $lowVersion = $this->normalize(substr($constraint . $stabilitySuffix, 1)); $lowerBound = new Constraint('>=', $lowVersion); // For upper bound, we increment the position of one more significance, // but highPosition = 0 would be illegal $highPosition = max(1, $position - 1); $highVersion = $this->manipulateVersionString($matches, $highPosition, 1) . '-dev'; $upperBound = new Constraint('<', $highVersion); return array( $lowerBound, $upperBound, ); } // Caret Range // // Allows changes that do not modify the left-most non-zero digit in the [major, minor, patch] tuple. // In other words, this allows patch and minor updates for versions 1.0.0 and above, patch updates for // versions 0.X >=0.1.0, and no updates for versions 0.0.X if (preg_match('{^\^' . $versionRegex . '($)}i', $constraint, $matches)) { // Work out which position in the version we are operating at if ('0' !== $matches[1] || '' === $matches[2] || null === $matches[2]) { $position = 1; } elseif ('0' !== $matches[2] || '' === $matches[3] || null === $matches[3]) { $position = 2; } else { $position = 3; } // Calculate the stability suffix $stabilitySuffix = ''; if (empty($matches[5]) && empty($matches[7])) { $stabilitySuffix .= '-dev'; } $lowVersion = $this->normalize(substr($constraint . $stabilitySuffix, 1)); $lowerBound = new Constraint('>=', $lowVersion); // For upper bound, we increment the position of one more significance, // but highPosition = 0 would be illegal $highVersion = $this->manipulateVersionString($matches, $position, 1) . '-dev'; $upperBound = new Constraint('<', $highVersion); return array( $lowerBound, $upperBound, ); } // X Range // // Any of X, x, or * may be used to "stand in" for one of the numeric values in the [major, minor, patch] tuple. // A partial version range is treated as an X-Range, so the special character is in fact optional. if (preg_match('{^v?(\d++)(?:\.(\d++))?(?:\.(\d++))?(?:\.[xX*])++$}', $constraint, $matches)) { if (isset($matches[3]) && '' !== $matches[3] && null !== $matches[3]) { $position = 3; } elseif (isset($matches[2]) && '' !== $matches[2] && null !== $matches[2]) { $position = 2; } else { $position = 1; } $lowVersion = $this->manipulateVersionString($matches, $position) . '-dev'; $highVersion = $this->manipulateVersionString($matches, $position, 1) . '-dev'; if ($lowVersion === '0.0.0.0-dev') { return array(new Constraint('<', $highVersion)); } return array( new Constraint('>=', $lowVersion), new Constraint('<', $highVersion), ); } // Hyphen Range // // Specifies an inclusive set. If a partial version is provided as the first version in the inclusive range, // then the missing pieces are replaced with zeroes. If a partial version is provided as the second version in // the inclusive range, then all versions that start with the supplied parts of the tuple are accepted, but // nothing that would be greater than the provided tuple parts. if (preg_match('{^(?P<from>' . $versionRegex . ') +- +(?P<to>' . $versionRegex . ')($)}i', $constraint, $matches)) { // Calculate the stability suffix $lowStabilitySuffix = ''; if (empty($matches[6]) && empty($matches[8])) { $lowStabilitySuffix = '-dev'; } $lowVersion = $this->normalize($matches['from']); $lowerBound = new Constraint('>=', $lowVersion . $lowStabilitySuffix); $empty = function ($x) { return ($x === 0 || $x === '0') ? false : empty($x); }; if ((!$empty($matches[11]) && !$empty($matches[12])) || !empty($matches[14]) || !empty($matches[16])) { $highVersion = $this->normalize($matches['to']); $upperBound = new Constraint('<=', $highVersion); } else { $highMatch = array('', $matches[10], $matches[11], $matches[12], $matches[13]); $highVersion = $this->manipulateVersionString($highMatch, $empty($matches[11]) ? 1 : 2, 1) . '-dev'; $upperBound = new Constraint('<', $highVersion); } return array( $lowerBound, $upperBound, ); } // Basic Comparators if (preg_match('{^(<>|!=|>=?|<=?|==?)?\s*(.*)}', $constraint, $matches)) { try { $version = $this->normalize($matches[2]); if (!empty($stabilityModifier) && self::parseStability($version) === 'stable') { $version .= '-' . $stabilityModifier; } elseif ('<' === $matches[1] || '>=' === $matches[1]) { if (!preg_match('/-' . self::$modifierRegex . '$/', strtolower($matches[2]))) { if (strpos($matches[2], 'dev-') !== 0) { $version .= '-dev'; } } } return array(new Constraint($matches[1] ?: '=', $version)); } catch (\Exception $e) { } } $message = 'Could not parse version constraint ' . $constraint; if (isset($e)) { $message .= ': ' . $e->getMessage(); } throw new \UnexpectedValueException($message); } /** * Increment, decrement, or simply pad a version number. * * Support function for {@link parseConstraint()} * * @param array $matches Array with version parts in array indexes 1,2,3,4 * @param int $position 1,2,3,4 - which segment of the version to increment/decrement * @param int $increment * @param string $pad The string to pad version parts after $position * * @return string The new version */ private function manipulateVersionString($matches, $position, $increment = 0, $pad = '0') { for ($i = 4; $i > 0; --$i) { if ($i > $position) { $matches[$i] = $pad; } elseif ($i === $position && $increment) { $matches[$i] += $increment; // If $matches[$i] was 0, carry the decrement if ($matches[$i] < 0) { $matches[$i] = $pad; --$position; // Return null on a carry overflow if ($i === 1) { return null; } } } } return $matches[1] . '.' . $matches[2] . '.' . $matches[3] . '.' . $matches[4]; } /** * Expand shorthand stability string to long version. * * @param string $stability * * @return string */ private function expandStability($stability) { $stability = strtolower($stability); switch ($stability) { case 'a': return 'alpha'; case 'b': return 'beta'; case 'p': case 'pl': return 'patch'; case 'rc': return 'RC'; default: return $stability; } } } semver/src/Comparator.php 0000644 00000004773 14736103146 0011474 0 ustar 00 <?php /* * This file is part of composer/semver. * * (c) Composer <https://github.com/composer> * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace Composer\Semver; use Composer\Semver\Constraint\Constraint; class Comparator { /** * Evaluates the expression: $version1 > $version2. * * @param string $version1 * @param string $version2 * * @return bool */ public static function greaterThan($version1, $version2) { return self::compare($version1, '>', $version2); } /** * Evaluates the expression: $version1 >= $version2. * * @param string $version1 * @param string $version2 * * @return bool */ public static function greaterThanOrEqualTo($version1, $version2) { return self::compare($version1, '>=', $version2); } /** * Evaluates the expression: $version1 < $version2. * * @param string $version1 * @param string $version2 * * @return bool */ public static function lessThan($version1, $version2) { return self::compare($version1, '<', $version2); } /** * Evaluates the expression: $version1 <= $version2. * * @param string $version1 * @param string $version2 * * @return bool */ public static function lessThanOrEqualTo($version1, $version2) { return self::compare($version1, '<=', $version2); } /** * Evaluates the expression: $version1 == $version2. * * @param string $version1 * @param string $version2 * * @return bool */ public static function equalTo($version1, $version2) { return self::compare($version1, '==', $version2); } /** * Evaluates the expression: $version1 != $version2. * * @param string $version1 * @param string $version2 * * @return bool */ public static function notEqualTo($version1, $version2) { return self::compare($version1, '!=', $version2); } /** * Evaluates the expression: $version1 $operator $version2. * * @param string $version1 * @param string $operator * @param string $version2 * * @return bool */ public static function compare($version1, $operator, $version2) { $constraint = new Constraint($operator, $version2); return $constraint->matches(new Constraint('==', $version1)); } } semver/README.md 0000644 00000003125 14736103146 0007332 0 ustar 00 composer/semver =============== Semver library that offers utilities, version constraint parsing and validation. Originally written as part of [composer/composer](https://github.com/composer/composer), now extracted and made available as a stand-alone library. [![Build Status](https://travis-ci.org/composer/semver.svg?branch=master)](https://travis-ci.org/composer/semver) Installation ------------ Install the latest version with: ```bash $ composer require composer/semver ``` Requirements ------------ * PHP 5.3.2 is required but using the latest version of PHP is highly recommended. Version Comparison ------------------ For details on how versions are compared, refer to the [Versions](https://getcomposer.org/doc/articles/versions.md) article in the documentation section of the [getcomposer.org](https://getcomposer.org) website. Basic usage ----------- ### Comparator The `Composer\Semver\Comparator` class provides the following methods for comparing versions: * greaterThan($v1, $v2) * greaterThanOrEqualTo($v1, $v2) * lessThan($v1, $v2) * lessThanOrEqualTo($v1, $v2) * equalTo($v1, $v2) * notEqualTo($v1, $v2) Each function takes two version strings as arguments. For example: ```php use Composer\Semver\Comparator; Comparator::greaterThan('1.25.0', '1.24.0'); // 1.25.0 > 1.24.0 ``` ### Semver The `Composer\Semver\Semver` class provides the following methods: * satisfies($version, $constraints) * satisfiedBy(array $versions, $constraint) * sort($versions) * rsort($versions) License ------- composer/semver is licensed under the MIT License, see the LICENSE file for details. semver/.php_cs 0000644 00000003251 14736103146 0007330 0 ustar 00 <?php $header = <<<EOF This file is part of composer/semver. (c) Composer <https://github.com/composer> For the full copyright and license information, please view the LICENSE file that was distributed with this source code. EOF; $finder = Symfony\CS\Finder\DefaultFinder::create() ->files() ->name('*.php') ->in(__DIR__.'/src') ->in(__DIR__.'/tests') ; /* fabpot/php-cs-fixer:^2.0-dev */ return Symfony\CS\Config\Config::create() ->setRules(array( '@PSR2' => true, 'duplicate_semicolon' => true, 'extra_empty_lines' => true, 'header_comment' => array('header' => $header), 'include' => true, 'long_array_syntax' => true, 'method_separation' => true, 'multiline_array_trailing_comma' => true, 'namespace_no_leading_whitespace' => true, 'no_blank_lines_after_class_opening' => true, 'no_empty_lines_after_phpdocs' => true, 'object_operator' => true, 'operators_spaces' => true, 'phpdoc_indent' => true, 'phpdoc_no_access' => true, 'phpdoc_no_package' => true, 'phpdoc_order' => true, 'phpdoc_scalar' => true, 'phpdoc_separation' => true, 'phpdoc_trim' => true, 'phpdoc_type_to_var' => true, 'return' => true, 'remove_leading_slash_use' => true, 'remove_lines_between_uses' => true, 'single_array_no_trailing_comma' => true, 'single_blank_line_before_namespace' => true, 'spaces_cast' => true, 'standardize_not_equal' => true, 'ternary_spaces' => true, 'unused_use' => true, 'whitespacy_lines' => true, )) ->finder($finder) ; semver/CHANGELOG.md 0000644 00000006636 14736103146 0007676 0 ustar 00 # Change Log All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). ### [1.5.1] 2020-01-13 * Fixed: Parsing of aliased version was not validating the alias to be a valid version ### [1.5.0] 2019-03-19 * Added: some support for date versions (e.g. 201903) in `~` operator * Fixed: support for stabilities in `~` operator was inconsistent ### [1.4.2] 2016-08-30 * Fixed: collapsing of complex constraints lead to buggy constraints ### [1.4.1] 2016-06-02 * Changed: branch-like requirements no longer strip build metadata - [composer/semver#38](https://github.com/composer/semver/pull/38). ### [1.4.0] 2016-03-30 * Added: getters on MultiConstraint - [composer/semver#35](https://github.com/composer/semver/pull/35). ### [1.3.0] 2016-02-25 * Fixed: stability parsing - [composer/composer#1234](https://github.com/composer/composer/issues/4889). * Changed: collapse contiguous constraints when possible. ### [1.2.0] 2015-11-10 * Changed: allow multiple numerical identifiers in 'pre-release' version part. * Changed: add more 'v' prefix support. ### [1.1.0] 2015-11-03 * Changed: dropped redundant `test` namespace. * Changed: minor adjustment in datetime parsing normalization. * Changed: `ConstraintInterface` relaxed, setPrettyString is not required anymore. * Changed: `AbstractConstraint` marked deprecated, will be removed in 2.0. * Changed: `Constraint` is now extensible. ### [1.0.0] 2015-09-21 * Break: `VersionConstraint` renamed to `Constraint`. * Break: `SpecificConstraint` renamed to `AbstractConstraint`. * Break: `LinkConstraintInterface` renamed to `ConstraintInterface`. * Break: `VersionParser::parseNameVersionPairs` was removed. * Changed: `VersionParser::parseConstraints` allows (but ignores) build metadata now. * Changed: `VersionParser::parseConstraints` allows (but ignores) prefixing numeric versions with a 'v' now. * Changed: Fixed namespace(s) of test files. * Changed: `Comparator::compare` no longer throws `InvalidArgumentException`. * Changed: `Constraint` now throws `InvalidArgumentException`. ### [0.1.0] 2015-07-23 * Added: `Composer\Semver\Comparator`, various methods to compare versions. * Added: various documents such as README.md, LICENSE, etc. * Added: configuration files for Git, Travis, php-cs-fixer, phpunit. * Break: the following namespaces were renamed: - Namespace: `Composer\Package\Version` -> `Composer\Semver` - Namespace: `Composer\Package\LinkConstraint` -> `Composer\Semver\Constraint` - Namespace: `Composer\Test\Package\Version` -> `Composer\Test\Semver` - Namespace: `Composer\Test\Package\LinkConstraint` -> `Composer\Test\Semver\Constraint` * Changed: code style using php-cs-fixer. [1.5.1]: https://github.com/composer/semver/compare/1.5.0...1.5.1 [1.5.0]: https://github.com/composer/semver/compare/1.4.2...1.5.0 [1.4.2]: https://github.com/composer/semver/compare/1.4.1...1.4.2 [1.4.1]: https://github.com/composer/semver/compare/1.4.0...1.4.1 [1.4.0]: https://github.com/composer/semver/compare/1.3.0...1.4.0 [1.3.0]: https://github.com/composer/semver/compare/1.2.0...1.3.0 [1.2.0]: https://github.com/composer/semver/compare/1.1.0...1.2.0 [1.1.0]: https://github.com/composer/semver/compare/1.0.0...1.1.0 [1.0.0]: https://github.com/composer/semver/compare/0.1.0...1.0.0 [0.1.0]: https://github.com/composer/semver/compare/5e0b9a4da...0.1.0 semver/LICENSE 0000644 00000002034 14736103146 0007056 0 ustar 00 Copyright (C) 2015 Composer Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. autoload_files.php 0000644 00000011753 14736103146 0010263 0 ustar 00 <?php // autoload_files.php @generated by Composer $vendorDir = dirname(dirname(__FILE__)); $baseDir = dirname($vendorDir); return array( '320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php', 'a4a119a56e50fbb293281d9a48007e0e' => $vendorDir . '/symfony/polyfill-php80/bootstrap.php', '6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php', '23c18046f52bef3eea034657bafda50f' => $vendorDir . '/symfony/polyfill-php81/bootstrap.php', '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php', 'e69f7f6ee287b969198c3c9d6777bd38' => $vendorDir . '/symfony/polyfill-intl-normalizer/bootstrap.php', '7b11c4dc42b3b3023073cb14e519683c' => $vendorDir . '/ralouphie/getallheaders/src/getallheaders.php', 'a0edc8309cc5e1d60e3047b5df6b7052' => $vendorDir . '/guzzlehttp/psr7/src/functions_include.php', '7e9bd612cc444b3eed788ebbe46263a0' => $vendorDir . '/laminas/laminas-zendframework-bridge/src/autoload.php', '8825ede83f2f289127722d4e842cf7e8' => $vendorDir . '/symfony/polyfill-intl-grapheme/bootstrap.php', '0d59ee240a4cd96ddbb4ff164fccea4d' => $vendorDir . '/symfony/polyfill-php73/bootstrap.php', 'b6b991a57620e2fb6b2f66f03fe9ddc2' => $vendorDir . '/symfony/string/Resources/functions.php', 'c964ee0ededf28c96ebd9db5099ef910' => $vendorDir . '/guzzlehttp/promises/src/functions_include.php', '25072dd6e2470089de65ae7bf11d3109' => $vendorDir . '/symfony/polyfill-php72/bootstrap.php', 'f598d06aa772fa33d905e87be6398fb1' => $vendorDir . '/symfony/polyfill-intl-idn/bootstrap.php', '37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php', '72579e7bd17821bb1321b87411366eae' => $vendorDir . '/illuminate/support/helpers.php', 'b067bc7112e384b61c701452d53a14a8' => $vendorDir . '/mtdowling/jmespath.php/src/JmesPath.php', '8a9dc1de0ca7e01f3e08231539562f61' => $vendorDir . '/aws/aws-sdk-php/src/functions.php', 'decc78cc4436b1292c6c0d151b19445c' => $vendorDir . '/phpseclib/phpseclib/phpseclib/bootstrap.php', 'def43f6c87e4f8dfd0c9e1b1bab14fe8' => $vendorDir . '/symfony/polyfill-iconv/bootstrap.php', '07d7f1a47144818725fd8d91a907ac57' => $vendorDir . '/laminas/laminas-diactoros/src/functions/create_uploaded_file.php', 'da94ac5d3ca7d2dbab84ce561ce72bfd' => $vendorDir . '/laminas/laminas-diactoros/src/functions/marshal_headers_from_sapi.php', '3d97c8dcdfba8cb85d3b34f116bb248b' => $vendorDir . '/laminas/laminas-diactoros/src/functions/marshal_method_from_sapi.php', 'e6f3bc6883e449ab367280b34158c05b' => $vendorDir . '/laminas/laminas-diactoros/src/functions/marshal_protocol_version_from_sapi.php', 'd59fbae42019aedf227094ac49a46f50' => $vendorDir . '/laminas/laminas-diactoros/src/functions/marshal_uri_from_sapi.php', 'de95e0ac670b27c84ef8c5ac41fc1b34' => $vendorDir . '/laminas/laminas-diactoros/src/functions/normalize_server.php', 'b6c2870932b0250c10334a86dcb33c7f' => $vendorDir . '/laminas/laminas-diactoros/src/functions/normalize_uploaded_files.php', 'd02cf21124526632320d6f20b1bbf905' => $vendorDir . '/laminas/laminas-diactoros/src/functions/parse_cookie_header.php', 'd919fc9d5ad52cfb7f322f7fe36458ab' => $vendorDir . '/laminas/laminas-diactoros/src/functions/create_uploaded_file.legacy.php', 'e397f74f8af3b1e56166a6e99f216ee7' => $vendorDir . '/laminas/laminas-diactoros/src/functions/marshal_headers_from_sapi.legacy.php', 'd154b49fab8e4da34fb553a2d644918c' => $vendorDir . '/laminas/laminas-diactoros/src/functions/marshal_method_from_sapi.legacy.php', '9d3db23ca418094bcf0b641a0c9559ed' => $vendorDir . '/laminas/laminas-diactoros/src/functions/marshal_protocol_version_from_sapi.legacy.php', 'b0b88a3b89caae681462c58ff19a7059' => $vendorDir . '/laminas/laminas-diactoros/src/functions/marshal_uri_from_sapi.legacy.php', 'cc8e14526dc240491e17a838cb78508c' => $vendorDir . '/laminas/laminas-diactoros/src/functions/normalize_server.legacy.php', '786bf90caabc9e09b6ad4cc5ca8f0e30' => $vendorDir . '/laminas/laminas-diactoros/src/functions/normalize_uploaded_files.legacy.php', '751a5a3f463e4be759be31748b61737c' => $vendorDir . '/laminas/laminas-diactoros/src/functions/parse_cookie_header.legacy.php', '2df68f9e79c919e2d88506611769ed2e' => $vendorDir . '/respect/stringifier/src/stringify.php', '253c157292f75eb38082b5acb06f3f01' => $vendorDir . '/nikic/fast-route/src/functions.php', '2cffec82183ee1cea088009cef9a6fc3' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier.composer.php', 'c65d09b6820da036953a371c8c73a9b1' => $vendorDir . '/facebook/graph-sdk/src/Facebook/polyfills.php', 'aa75ea0761a2f40c1f3b32ad314f86c4' => $vendorDir . '/phpseclib/mcrypt_compat/lib/mcrypt.php', 'e39a8b23c42d4e1452234d762b03835a' => $vendorDir . '/ramsey/uuid/src/functions.php', 'ad155f8f1cf0d418fe49e248db8c661b' => $vendorDir . '/react/promise/src/functions_include.php', 'f239dbcecbaa0e5f4dfcbe823d65013a' => $baseDir . '/modules/autoload.php', ); xdebug-handler/src/Status.php 0000644 00000010035 14736103146 0012224 0 ustar 00 <?php /* * This file is part of composer/xdebug-handler. * * (c) Composer <https://github.com/composer> * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace Composer\XdebugHandler; use Psr\Log\LoggerInterface; use Psr\Log\LogLevel; /** * @author John Stevenson <john-stevenson@blueyonder.co.uk> * @internal */ class Status { const ENV_RESTART = 'XDEBUG_HANDLER_RESTART'; const CHECK = 'Check'; const ERROR = 'Error'; const INFO = 'Info'; const NORESTART = 'NoRestart'; const RESTART = 'Restart'; const RESTARTING = 'Restarting'; const RESTARTED = 'Restarted'; private $debug; private $envAllowXdebug; private $loaded; private $logger; private $time; /** * Constructor * * @param string $envAllowXdebug Prefixed _ALLOW_XDEBUG name * @param bool $debug Whether debug output is required */ public function __construct($envAllowXdebug, $debug) { $start = getenv(self::ENV_RESTART); Process::setEnv(self::ENV_RESTART); $this->time = $start ? round((microtime(true) - $start) * 1000) : 0; $this->envAllowXdebug = $envAllowXdebug; $this->debug = $debug && defined('STDERR'); } /** * @param LoggerInterface $logger */ public function setLogger(LoggerInterface $logger) { $this->logger = $logger; } /** * Calls a handler method to report a message * * @param string $op The handler constant * @param null|string $data Data required by the handler */ public function report($op, $data) { if ($this->logger || $this->debug) { call_user_func(array($this, 'report'.$op), $data); } } /** * Outputs a status message * * @param string $text * @param string $level */ private function output($text, $level = null) { if ($this->logger) { $this->logger->log($level ?: LogLevel::DEBUG, $text); } if ($this->debug) { fwrite(STDERR, sprintf('xdebug-handler[%d] %s', getmypid(), $text.PHP_EOL)); } } private function reportCheck($loaded) { $this->loaded = $loaded; $this->output('Checking '.$this->envAllowXdebug); } private function reportError($error) { $this->output(sprintf('No restart (%s)', $error), LogLevel::WARNING); } private function reportInfo($info) { $this->output($info); } private function reportNoRestart() { $this->output($this->getLoadedMessage()); if ($this->loaded) { $text = sprintf('No restart (%s)', $this->getEnvAllow()); if (!getenv($this->envAllowXdebug)) { $text .= ' Allowed by application'; } $this->output($text); } } private function reportRestart() { $this->output($this->getLoadedMessage()); Process::setEnv(self::ENV_RESTART, (string) microtime(true)); } private function reportRestarted() { $loaded = $this->getLoadedMessage(); $text = sprintf('Restarted (%d ms). %s', $this->time, $loaded); $level = $this->loaded ? LogLevel::WARNING : null; $this->output($text, $level); } private function reportRestarting($command) { $text = sprintf('Process restarting (%s)', $this->getEnvAllow()); $this->output($text); $text = 'Running '.$command; $this->output($text); } /** * Returns the _ALLOW_XDEBUG environment variable as name=value * * @return string */ private function getEnvAllow() { return $this->envAllowXdebug.'='.getenv($this->envAllowXdebug); } /** * Returns the Xdebug status and version * * @return string */ private function getLoadedMessage() { $loaded = $this->loaded ? sprintf('loaded (%s)', $this->loaded) : 'not loaded'; return 'The Xdebug extension is '.$loaded; } } xdebug-handler/src/XdebugHandler.php 0000644 00000042265 14736103146 0013467 0 ustar 00 <?php /* * This file is part of composer/xdebug-handler. * * (c) Composer <https://github.com/composer> * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace Composer\XdebugHandler; use Psr\Log\LoggerInterface; /** * @author John Stevenson <john-stevenson@blueyonder.co.uk> */ class XdebugHandler { const SUFFIX_ALLOW = '_ALLOW_XDEBUG'; const SUFFIX_INIS = '_ORIGINAL_INIS'; const RESTART_ID = 'internal'; const RESTART_SETTINGS = 'XDEBUG_HANDLER_SETTINGS'; const DEBUG = 'XDEBUG_HANDLER_DEBUG'; /** @var string|null */ protected $tmpIni; private static $inRestart; private static $name; private static $skipped; private $cli; private $colorOption; private $debug; private $envAllowXdebug; private $envOriginalInis; private $loaded; private $persistent; private $script; /** @var Status|null */ private $statusWriter; /** * Constructor * * The $envPrefix is used to create distinct environment variables. It is * uppercased and prepended to the default base values. For example 'myapp' * would result in MYAPP_ALLOW_XDEBUG and MYAPP_ORIGINAL_INIS. * * @param string $envPrefix Value used in environment variables * @param string $colorOption Command-line long option to force color output * @throws \RuntimeException If a parameter is invalid */ public function __construct($envPrefix, $colorOption = '') { if (!is_string($envPrefix) || empty($envPrefix) || !is_string($colorOption)) { throw new \RuntimeException('Invalid constructor parameter'); } self::$name = strtoupper($envPrefix); $this->envAllowXdebug = self::$name.self::SUFFIX_ALLOW; $this->envOriginalInis = self::$name.self::SUFFIX_INIS; $this->colorOption = $colorOption; if (extension_loaded('xdebug')) { $ext = new \ReflectionExtension('xdebug'); $this->loaded = $ext->getVersion() ?: 'unknown'; } if ($this->cli = PHP_SAPI === 'cli') { $this->debug = getenv(self::DEBUG); } $this->statusWriter = new Status($this->envAllowXdebug, (bool) $this->debug); } /** * Activates status message output to a PSR3 logger * * @param LoggerInterface $logger * * @return $this */ public function setLogger(LoggerInterface $logger) { $this->statusWriter->setLogger($logger); return $this; } /** * Sets the main script location if it cannot be called from argv * * @param string $script * * @return $this */ public function setMainScript($script) { $this->script = $script; return $this; } /** * Persist the settings to keep Xdebug out of sub-processes * * @return $this */ public function setPersistent() { $this->persistent = true; return $this; } /** * Checks if Xdebug is loaded and the process needs to be restarted * * This behaviour can be disabled by setting the MYAPP_ALLOW_XDEBUG * environment variable to 1. This variable is used internally so that * the restarted process is created only once. */ public function check() { $this->notify(Status::CHECK, $this->loaded); $envArgs = explode('|', (string) getenv($this->envAllowXdebug)); if (empty($envArgs[0]) && $this->requiresRestart((bool) $this->loaded)) { // Restart required $this->notify(Status::RESTART); if ($this->prepareRestart()) { $command = $this->getCommand(); $this->restart($command); } return; } if (self::RESTART_ID === $envArgs[0] && count($envArgs) === 5) { // Restarted, so unset environment variable and use saved values $this->notify(Status::RESTARTED); Process::setEnv($this->envAllowXdebug); self::$inRestart = true; if (!$this->loaded) { // Skipped version is only set if Xdebug is not loaded self::$skipped = $envArgs[1]; } $this->tryEnableSignals(); // Put restart settings in the environment $this->setEnvRestartSettings($envArgs); return; } $this->notify(Status::NORESTART); if ($settings = self::getRestartSettings()) { // Called with existing settings, so sync our settings $this->syncSettings($settings); } } /** * Returns an array of php.ini locations with at least one entry * * The equivalent of calling php_ini_loaded_file then php_ini_scanned_files. * The loaded ini location is the first entry and may be empty. * * @return array */ public static function getAllIniFiles() { if (!empty(self::$name)) { $env = getenv(self::$name.self::SUFFIX_INIS); if (false !== $env) { return explode(PATH_SEPARATOR, $env); } } $paths = array((string) php_ini_loaded_file()); if ($scanned = php_ini_scanned_files()) { $paths = array_merge($paths, array_map('trim', explode(',', $scanned))); } return $paths; } /** * Returns an array of restart settings or null * * Settings will be available if the current process was restarted, or * called with the settings from an existing restart. * * @return array|null */ public static function getRestartSettings() { $envArgs = explode('|', (string) getenv(self::RESTART_SETTINGS)); if (count($envArgs) !== 6 || (!self::$inRestart && php_ini_loaded_file() !== $envArgs[0])) { return; } return array( 'tmpIni' => $envArgs[0], 'scannedInis' => (bool) $envArgs[1], 'scanDir' => '*' === $envArgs[2] ? false : $envArgs[2], 'phprc' => '*' === $envArgs[3] ? false : $envArgs[3], 'inis' => explode(PATH_SEPARATOR, $envArgs[4]), 'skipped' => $envArgs[5], ); } /** * Returns the Xdebug version that triggered a successful restart * * @return string */ public static function getSkippedVersion() { return (string) self::$skipped; } /** * Returns true if Xdebug is loaded, or as directed by an extending class * * @param bool $isLoaded Whether Xdebug is loaded * * @return bool */ protected function requiresRestart($isLoaded) { return $isLoaded; } /** * Allows an extending class to access the tmpIni * * @param string $command */ protected function restart($command) { $this->doRestart($command); } /** * Executes the restarted command then deletes the tmp ini * * @param string $command */ private function doRestart($command) { $this->tryEnableSignals(); $this->notify(Status::RESTARTING, $command); passthru($command, $exitCode); $this->notify(Status::INFO, 'Restarted process exited '.$exitCode); if ($this->debug === '2') { $this->notify(Status::INFO, 'Temp ini saved: '.$this->tmpIni); } else { @unlink($this->tmpIni); } exit($exitCode); } /** * Returns true if everything was written for the restart * * If any of the following fails (however unlikely) we must return false to * stop potential recursion: * - tmp ini file creation * - environment variable creation * * @return bool */ private function prepareRestart() { $error = ''; $iniFiles = self::getAllIniFiles(); $scannedInis = count($iniFiles) > 1; $tmpDir = sys_get_temp_dir(); if (!$this->cli) { $error = 'Unsupported SAPI: '.PHP_SAPI; } elseif (!defined('PHP_BINARY')) { $error = 'PHP version is too old: '.PHP_VERSION; } elseif (!$this->checkConfiguration($info)) { $error = $info; } elseif (!$this->checkScanDirConfig()) { $error = 'PHP version does not report scanned inis: '.PHP_VERSION; } elseif (!$this->checkMainScript()) { $error = 'Unable to access main script: '.$this->script; } elseif (!$this->writeTmpIni($iniFiles, $tmpDir, $error)) { $error = $error ?: 'Unable to create temp ini file at: '.$tmpDir; } elseif (!$this->setEnvironment($scannedInis, $iniFiles)) { $error = 'Unable to set environment variables'; } if ($error) { $this->notify(Status::ERROR, $error); } return empty($error); } /** * Returns true if the tmp ini file was written * * @param array $iniFiles All ini files used in the current process * @param string $tmpDir The system temporary directory * @param string $error Set by method if ini file cannot be read * * @return bool */ private function writeTmpIni(array $iniFiles, $tmpDir, &$error) { if (!$this->tmpIni = @tempnam($tmpDir, '')) { return false; } // $iniFiles has at least one item and it may be empty if (empty($iniFiles[0])) { array_shift($iniFiles); } $content = ''; $regex = '/^\s*(zend_extension\s*=.*xdebug.*)$/mi'; foreach ($iniFiles as $file) { // Check for inaccessible ini files if (($data = @file_get_contents($file)) === false) { $error = 'Unable to read ini: '.$file; return false; } $content .= preg_replace($regex, ';$1', $data).PHP_EOL; } // Merge loaded settings into our ini content, if it is valid if ($config = parse_ini_string($content)) { $loaded = ini_get_all(null, false); $content .= $this->mergeLoadedConfig($loaded, $config); } // Work-around for https://bugs.php.net/bug.php?id=75932 $content .= 'opcache.enable_cli=0'.PHP_EOL; return @file_put_contents($this->tmpIni, $content); } /** * Returns the restart command line * * @return string */ private function getCommand() { $php = array(PHP_BINARY); $args = array_slice($_SERVER['argv'], 1); if (!$this->persistent) { // Use command-line options array_push($php, '-n', '-c', $this->tmpIni); } if (defined('STDOUT') && Process::supportsColor(STDOUT)) { $args = Process::addColorOption($args, $this->colorOption); } $args = array_merge($php, array($this->script), $args); $cmd = Process::escape(array_shift($args), true, true); foreach ($args as $arg) { $cmd .= ' '.Process::escape($arg); } return $cmd; } /** * Returns true if the restart environment variables were set * * No need to update $_SERVER since this is set in the restarted process. * * @param bool $scannedInis Whether there were scanned ini files * @param array $iniFiles All ini files used in the current process * * @return bool */ private function setEnvironment($scannedInis, array $iniFiles) { $scanDir = getenv('PHP_INI_SCAN_DIR'); $phprc = getenv('PHPRC'); // Make original inis available to restarted process if (!putenv($this->envOriginalInis.'='.implode(PATH_SEPARATOR, $iniFiles))) { return false; } if ($this->persistent) { // Use the environment to persist the settings if (!putenv('PHP_INI_SCAN_DIR=') || !putenv('PHPRC='.$this->tmpIni)) { return false; } } // Flag restarted process and save values for it to use $envArgs = array( self::RESTART_ID, $this->loaded, (int) $scannedInis, false === $scanDir ? '*' : $scanDir, false === $phprc ? '*' : $phprc, ); return putenv($this->envAllowXdebug.'='.implode('|', $envArgs)); } /** * Logs status messages * * @param string $op Status handler constant * @param null|string $data Optional data */ private function notify($op, $data = null) { $this->statusWriter->report($op, $data); } /** * Returns default, changed and command-line ini settings * * @param array $loadedConfig All current ini settings * @param array $iniConfig Settings from user ini files * * @return string */ private function mergeLoadedConfig(array $loadedConfig, array $iniConfig) { $content = ''; foreach ($loadedConfig as $name => $value) { // Value will either be null, string or array (HHVM only) if (!is_string($value) || strpos($name, 'xdebug') === 0 || $name === 'apc.mmap_file_mask') { continue; } if (!isset($iniConfig[$name]) || $iniConfig[$name] !== $value) { // Double-quote escape each value $content .= $name.'="'.addcslashes($value, '\\"').'"'.PHP_EOL; } } return $content; } /** * Returns true if the script name can be used * * @return bool */ private function checkMainScript() { if (null !== $this->script) { // Allow an application to set -- for standard input return file_exists($this->script) || '--' === $this->script; } if (file_exists($this->script = $_SERVER['argv'][0])) { return true; } // Use a backtrace to resolve Phar and chdir issues $options = PHP_VERSION_ID >= 50306 ? DEBUG_BACKTRACE_IGNORE_ARGS : false; $trace = debug_backtrace($options); if (($main = end($trace)) && isset($main['file'])) { return file_exists($this->script = $main['file']); } return false; } /** * Adds restart settings to the environment * * @param string $envArgs */ private function setEnvRestartSettings($envArgs) { $settings = array( php_ini_loaded_file(), $envArgs[2], $envArgs[3], $envArgs[4], getenv($this->envOriginalInis), self::$skipped, ); Process::setEnv(self::RESTART_SETTINGS, implode('|', $settings)); } /** * Syncs settings and the environment if called with existing settings * * @param array $settings */ private function syncSettings(array $settings) { if (false === getenv($this->envOriginalInis)) { // Called by another app, so make original inis available Process::setEnv($this->envOriginalInis, implode(PATH_SEPARATOR, $settings['inis'])); } self::$skipped = $settings['skipped']; $this->notify(Status::INFO, 'Process called with existing restart settings'); } /** * Returns true if there are scanned inis and PHP is able to report them * * php_ini_scanned_files will fail when PHP_CONFIG_FILE_SCAN_DIR is empty. * Fixed in 7.1.13 and 7.2.1 * * @return bool */ private function checkScanDirConfig() { return !(getenv('PHP_INI_SCAN_DIR') && !PHP_CONFIG_FILE_SCAN_DIR && (PHP_VERSION_ID < 70113 || PHP_VERSION_ID === 70200)); } /** * Returns true if there are no known configuration issues * * @param string $info Set by method */ private function checkConfiguration(&$info) { if (false !== strpos(ini_get('disable_functions'), 'passthru')) { $info = 'passthru function is disabled'; return false; } if (extension_loaded('uopz') && !ini_get('uopz.disable')) { // uopz works at opcode level and disables exit calls if (function_exists('uopz_allow_exit')) { @uopz_allow_exit(true); } else { $info = 'uopz extension is not compatible'; return false; } } return true; } /** * Enables async signals and control interrupts in the restarted process * * Only available on Unix PHP 7.1+ with the pcntl extension. To replicate on * Windows would require PHP 7.4+ using proc_open rather than passthru. */ private function tryEnableSignals() { if (!function_exists('pcntl_async_signals')) { return; } pcntl_async_signals(true); $message = 'Async signals enabled'; if (!self::$inRestart) { // Restarting, so ignore SIGINT in parent pcntl_signal(SIGINT, SIG_IGN); $message .= ' (SIGINT = SIG_IGN)'; } elseif (is_int(pcntl_signal_get_handler(SIGINT))) { // Restarted, no handler set so force default action pcntl_signal(SIGINT, SIG_DFL); $message .= ' (SIGINT = SIG_DFL)'; } $this->notify(Status::INFO, $message); } } xdebug-handler/src/Process.php 0000644 00000012232 14736103146 0012360 0 ustar 00 <?php /* * This file is part of composer/xdebug-handler. * * (c) Composer <https://github.com/composer> * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace Composer\XdebugHandler; /** * Provides utility functions to prepare a child process command-line and set * environment variables in that process. * * @author John Stevenson <john-stevenson@blueyonder.co.uk> * @internal */ class Process { /** * Returns an array of parameters, including a color option if required * * A color option is needed because child process output is piped. * * @param array $args The script parameters * @param string $colorOption The long option to force color output * * @return array */ public static function addColorOption(array $args, $colorOption) { if (!$colorOption || in_array($colorOption, $args) || !preg_match('/^--([a-z]+$)|(^--[a-z]+=)/', $colorOption, $matches)) { return $args; } if (isset($matches[2])) { // Handle --color(s)= options if (false !== ($index = array_search($matches[2].'auto', $args))) { $args[$index] = $colorOption; return $args; } elseif (preg_grep('/^'.$matches[2].'/', $args)) { return $args; } } elseif (in_array('--no-'.$matches[1], $args)) { return $args; } // Check for NO_COLOR variable (https://no-color.org/) if (false !== getenv('NO_COLOR')) { return $args; } if (false !== ($index = array_search('--', $args))) { // Position option before double-dash delimiter array_splice($args, $index, 0, $colorOption); } else { $args[] = $colorOption; } return $args; } /** * Escapes a string to be used as a shell argument. * * From https://github.com/johnstevenson/winbox-args * MIT Licensed (c) John Stevenson <john-stevenson@blueyonder.co.uk> * * @param string $arg The argument to be escaped * @param bool $meta Additionally escape cmd.exe meta characters * @param bool $module The argument is the module to invoke * * @return string The escaped argument */ public static function escape($arg, $meta = true, $module = false) { if (!defined('PHP_WINDOWS_VERSION_BUILD')) { return "'".str_replace("'", "'\\''", $arg)."'"; } $quote = strpbrk($arg, " \t") !== false || $arg === ''; $arg = preg_replace('/(\\\\*)"/', '$1$1\\"', $arg, -1, $dquotes); if ($meta) { $meta = $dquotes || preg_match('/%[^%]+%/', $arg); if (!$meta) { $quote = $quote || strpbrk($arg, '^&|<>()') !== false; } elseif ($module && !$dquotes && $quote) { $meta = false; } } if ($quote) { $arg = '"'.preg_replace('/(\\\\*)$/', '$1$1', $arg).'"'; } if ($meta) { $arg = preg_replace('/(["^&|<>()%])/', '^$1', $arg); } return $arg; } /** * Returns true if the output stream supports colors * * This is tricky on Windows, because Cygwin, Msys2 etc emulate pseudo * terminals via named pipes, so we can only check the environment. * * @param mixed $output A valid CLI output stream * * @return bool */ public static function supportsColor($output) { if ('Hyper' === getenv('TERM_PROGRAM')) { return true; } if (defined('PHP_WINDOWS_VERSION_BUILD')) { return (function_exists('sapi_windows_vt100_support') && sapi_windows_vt100_support($output)) || false !== getenv('ANSICON') || 'ON' === getenv('ConEmuANSI') || 'xterm' === getenv('TERM'); } if (function_exists('stream_isatty')) { return stream_isatty($output); } if (function_exists('posix_isatty')) { return posix_isatty($output); } $stat = fstat($output); // Check if formatted mode is S_IFCHR return $stat ? 0020000 === ($stat['mode'] & 0170000) : false; } /** * Makes putenv environment changes available in $_SERVER and $_ENV * * @param string $name * @param string|false $value A false value unsets the variable * * @return bool Whether the environment variable was set */ public static function setEnv($name, $value = false) { $unset = false === $value; if (!putenv($unset ? $name : $name.'='.$value)) { return false; } if ($unset) { unset($_SERVER[$name]); } else { $_SERVER[$name] = $value; } // Update $_ENV if it is being used if (false !== stripos((string) ini_get('variables_order'), 'E')) { if ($unset) { unset($_ENV[$name]); } else { $_ENV[$name] = $value; } } return true; } } xdebug-handler/src/PhpConfig.php 0000644 00000003065 14736103146 0012623 0 ustar 00 <?php /* * This file is part of composer/xdebug-handler. * * (c) Composer <https://github.com/composer> * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace Composer\XdebugHandler; /** * @author John Stevenson <john-stevenson@blueyonder.co.uk> */ class PhpConfig { /** * Use the original PHP configuration * * @return array PHP cli options */ public function useOriginal() { $this->getDataAndReset(); return array(); } /** * Use standard restart settings * * @return array PHP cli options */ public function useStandard() { if ($data = $this->getDataAndReset()) { return array('-n', '-c', $data['tmpIni']); } return array(); } /** * Use environment variables to persist settings * * @return array PHP cli options */ public function usePersistent() { if ($data = $this->getDataAndReset()) { Process::setEnv('PHPRC', $data['tmpIni']); Process::setEnv('PHP_INI_SCAN_DIR', ''); } return array(); } /** * Returns restart data if available and resets the environment * * @return array|null */ private function getDataAndReset() { if ($data = XdebugHandler::getRestartSettings()) { Process::setEnv('PHPRC', $data['phprc']); Process::setEnv('PHP_INI_SCAN_DIR', $data['scanDir']); } return $data; } } xdebug-handler/README.md 0000644 00000031513 14736103146 0010724 0 ustar 00 # composer/xdebug-handler [![packagist](https://img.shields.io/packagist/v/composer/xdebug-handler.svg)](https://packagist.org/packages/composer/xdebug-handler) [![linux build](https://img.shields.io/travis/composer/xdebug-handler/master.svg?label=linux+build)](https://travis-ci.org/composer/xdebug-handler) [![windows build](https://img.shields.io/appveyor/ci/Seldaek/xdebug-handler/master.svg?label=windows+build)](https://ci.appveyor.com/project/Seldaek/xdebug-handler) ![license](https://img.shields.io/github/license/composer/xdebug-handler.svg) ![php](https://img.shields.io/packagist/php-v/composer/xdebug-handler.svg?colorB=8892BF&label=php) Restart a CLI process without loading the Xdebug extension. Originally written as part of [composer/composer](https://github.com/composer/composer), now extracted and made available as a stand-alone library. ## Installation Install the latest version with: ```bash $ composer require composer/xdebug-handler ``` ## Requirements * PHP 5.3.2 minimum, although functionality is disabled below PHP 5.4.0. Using the latest PHP version is highly recommended. ## Basic Usage ```php use Composer\XdebugHandler\XdebugHandler; $xdebug = new XdebugHandler('myapp'); $xdebug->check(); unset($xdebug); ``` The constructor takes two parameters: #### _$envPrefix_ This is used to create distinct environment variables and is upper-cased and prepended to default base values. The above example enables the use of: - `MYAPP_ALLOW_XDEBUG=1` to override automatic restart and allow Xdebug - `MYAPP_ORIGINAL_INIS` to obtain ini file locations in a restarted process #### _$colorOption_ This optional value is added to the restart command-line and is needed to force color output in a piped child process. Only long-options are supported, for example `--ansi` or `--colors=always` etc. If the original command-line contains an argument that pattern matches this value (for example `--no-ansi`, `--colors=never`) then _$colorOption_ is ignored. If the pattern match ends with `=auto` (for example `--colors=auto`), the argument is replaced by _$colorOption_. Otherwise it is added at either the end of the command-line, or preceding the first double-dash `--` delimiter. ## Advanced Usage * [How it works](#how-it-works) * [Limitations](#limitations) * [Helper methods](#helper-methods) * [Setter methods](#setter-methods) * [Process configuration](#process-configuration) * [Troubleshooting](#troubleshooting) * [Extending the library](#extending-the-library) ### How it works A temporary ini file is created from the loaded (and scanned) ini files, with any references to the Xdebug extension commented out. Current ini settings are merged, so that most ini settings made on the command-line or by the application are included (see [Limitations](#limitations)) * `MYAPP_ALLOW_XDEBUG` is set with internal data to flag and use in the restart. * The command-line and environment are [configured](#process-configuration) for the restart. * The application is restarted in a new process using `passthru`. * The restart settings are stored in the environment. * `MYAPP_ALLOW_XDEBUG` is unset. * The application runs and exits. * The main process exits with the exit code from the restarted process. #### Signal handling From PHP 7.1 with the pcntl extension loaded, asynchronous signal handling is automatically enabled. `SIGINT` is set to `SIG_IGN` in the parent process and restored to `SIG_DFL` in the restarted process (if no other handler has been set). ### Limitations There are a few things to be aware of when running inside a restarted process. * Extensions set on the command-line will not be loaded. * Ini file locations will be reported as per the restart - see [getAllIniFiles()](#getallinifiles). * Php sub-processes may be loaded with Xdebug enabled - see [Process configuration](#process-configuration). * On Windows `sapi_windows_set_ctrl_handler` handlers will not receive CTRL events. ### Helper methods These static methods provide information from the current process, regardless of whether it has been restarted or not. #### _getAllIniFiles()_ Returns an array of the original ini file locations. Use this instead of calling `php_ini_loaded_file` and `php_ini_scanned_files`, which will report the wrong values in a restarted process. ```php use Composer\XdebugHandler\XdebugHandler; $files = XdebugHandler::getAllIniFiles(); # $files[0] always exists, it could be an empty string $loadedIni = array_shift($files); $scannedInis = $files; ``` These locations are also available in the `MYAPP_ORIGINAL_INIS` environment variable. This is a path-separated string comprising the location returned from `php_ini_loaded_file`, which could be empty, followed by locations parsed from calling `php_ini_scanned_files`. #### _getRestartSettings()_ Returns an array of settings that can be used with PHP [sub-processes](#sub-processes), or null if the process was not restarted. ```php use Composer\XdebugHandler\XdebugHandler; $settings = XdebugHandler::getRestartSettings(); /** * $settings: array (if the current process was restarted, * or called with the settings from a previous restart), or null * * 'tmpIni' => the temporary ini file used in the restart (string) * 'scannedInis' => if there were any scanned inis (bool) * 'scanDir' => the original PHP_INI_SCAN_DIR value (false|string) * 'phprc' => the original PHPRC value (false|string) * 'inis' => the original inis from getAllIniFiles (array) * 'skipped' => the skipped version from getSkippedVersion (string) */ ``` #### _getSkippedVersion()_ Returns the Xdebug version string that was skipped by the restart, or an empty value if there was no restart (or Xdebug is still loaded, perhaps by an extending class restarting for a reason other than removing Xdebug). ```php use Composer\XdebugHandler\XdebugHandler; $version = XdebugHandler::getSkippedVersion(); # $version: '2.6.0' (for example), or an empty string ``` ### Setter methods These methods implement a fluent interface and must be called before the main `check()` method. #### _setLogger($logger)_ Enables the output of status messages to an external PSR3 logger. All messages are reported with either `DEBUG` or `WARNING` log levels. For example (showing the level and message): ``` // Restart overridden DEBUG Checking MYAPP_ALLOW_XDEBUG DEBUG The Xdebug extension is loaded (2.5.0) DEBUG No restart (MYAPP_ALLOW_XDEBUG=1) // Failed restart DEBUG Checking MYAPP_ALLOW_XDEBUG DEBUG The Xdebug extension is loaded (2.5.0) WARNING No restart (Unable to create temp ini file at: ...) ``` Status messages can also be output with `XDEBUG_HANDLER_DEBUG`. See [Troubleshooting](#troubleshooting). #### _setMainScript($script)_ Sets the location of the main script to run in the restart. This is only needed in more esoteric use-cases, or if the `argv[0]` location is inaccessible. The script name `--` is supported for standard input. #### _setPersistent()_ Configures the restart using [persistent settings](#persistent-settings), so that Xdebug is not loaded in any sub-process. Use this method if your application invokes one or more PHP sub-process and the Xdebug extension is not needed. This avoids the overhead of implementing specific [sub-process](#sub-processes) strategies. Alternatively, this method can be used to set up a default _Xdebug-free_ environment which can be changed if a sub-process requires Xdebug, then restored afterwards: ```php function SubProcessWithXdebug() { $phpConfig = new Composer\XdebugHandler\PhpConfig(); # Set the environment to the original configuration $phpConfig->useOriginal(); # run the process with Xdebug loaded ... # Restore Xdebug-free environment $phpConfig->usePersistent(); } ``` ### Process configuration The library offers two strategies to invoke a new PHP process without loading Xdebug, using either _standard_ or _persistent_ settings. Note that this is only important if the application calls a PHP sub-process. #### Standard settings Uses command-line options to remove Xdebug from the new process only. * The -n option is added to the command-line. This tells PHP not to scan for additional inis. * The temporary ini is added to the command-line with the -c option. >_If the new process calls a PHP sub-process, Xdebug will be loaded in that sub-process (unless it implements xdebug-handler, in which case there will be another restart)._ This is the default strategy used in the restart. #### Persistent settings Uses environment variables to remove Xdebug from the new process and persist these settings to any sub-process. * `PHP_INI_SCAN_DIR` is set to an empty string. This tells PHP not to scan for additional inis. * `PHPRC` is set to the temporary ini. >_If the new process calls a PHP sub-process, Xdebug will not be loaded in that sub-process._ This strategy can be used in the restart by calling [setPersistent()](#setpersistent). #### Sub-processes The `PhpConfig` helper class makes it easy to invoke a PHP sub-process (with or without Xdebug loaded), regardless of whether there has been a restart. Each of its methods returns an array of PHP options (to add to the command-line) and sets up the environment for the required strategy. The [getRestartSettings()](#getrestartsettings) method is used internally. * `useOriginal()` - Xdebug will be loaded in the new process. * `useStandard()` - Xdebug will **not** be loaded in the new process - see [standard settings](#standard-settings). * `userPersistent()` - Xdebug will **not** be loaded in the new process - see [persistent settings](#persistent-settings) If there was no restart, an empty options array is returned and the environment is not changed. ```php use Composer\XdebugHandler\PhpConfig; $config = new PhpConfig; $options = $config->useOriginal(); # $options: empty array # environment: PHPRC and PHP_INI_SCAN_DIR set to original values $options = $config->useStandard(); # $options: [-n, -c, tmpIni] # environment: PHPRC and PHP_INI_SCAN_DIR set to original values $options = $config->usePersistent(); # $options: empty array # environment: PHPRC=tmpIni, PHP_INI_SCAN_DIR='' ``` ### Troubleshooting The following environment settings can be used to troubleshoot unexpected behavior: * `XDEBUG_HANDLER_DEBUG=1` Outputs status messages to `STDERR`, if it is defined, irrespective of any PSR3 logger. Each message is prefixed `xdebug-handler[pid]`, where pid is the process identifier. * `XDEBUG_HANDLER_DEBUG=2` As above, but additionally saves the temporary ini file and reports its location in a status message. ### Extending the library The API is defined by classes and their accessible elements that are not annotated as @internal. The main class has two protected methods that can be overridden to provide additional functionality: #### _requiresRestart($isLoaded)_ By default the process will restart if Xdebug is loaded. Extending this method allows an application to decide, by returning a boolean (or equivalent) value. It is only called if `MYAPP_ALLOW_XDEBUG` is empty, so it will not be called in the restarted process (where this variable contains internal data), or if the restart has been overridden. Note that the [setMainScript()](#setmainscriptscript) and [setPersistent()](#setpersistent) setters can be used here, if required. #### _restart($command)_ An application can extend this to modify the temporary ini file, its location given in the `tmpIni` property. New settings can be safely appended to the end of the data, which is `PHP_EOL` terminated. Note that the `$command` parameter is the escaped command-line string that will be used for the new process and must be treated accordingly. Remember to finish with `parent::restart($command)`. #### Example This example demonstrates two ways to extend basic functionality: * To avoid the overhead of spinning up a new process, the restart is skipped if a simple help command is requested. * The application needs write-access to phar files, so it will force a restart if `phar.readonly` is set (regardless of whether Xdebug is loaded) and change this value in the temporary ini file. ```php use Composer\XdebugHandler\XdebugHandler; use MyApp\Command; class MyRestarter extends XdebugHandler { private $required; protected function requiresRestart($isLoaded) { if (Command::isHelp()) { # No need to disable Xdebug for this return false; } $this->required = (bool) ini_get('phar.readonly'); return $isLoaded || $this->required; } protected function restart($command) { if ($this->required) { # Add required ini setting to tmpIni $content = file_get_contents($this->tmpIni); $content .= 'phar.readonly=0'.PHP_EOL; file_put_contents($this->tmpIni, $content); } parent::restart($command); } } ``` ## License composer/xdebug-handler is licensed under the MIT License, see the LICENSE file for details. xdebug-handler/CHANGELOG.md 0000644 00000007731 14736103146 0011263 0 ustar 00 ## [Unreleased] ## [1.4.3] - 2020-08-19 * Fixed: restore SIGINT to default handler in restarted process if no other handler exists. ## [1.4.2] - 2020-06-04 * Fixed: ignore SIGINTs to let the restarted process handle them. ## [1.4.1] - 2020-03-01 * Fixed: restart fails if an ini file is empty. ## [1.4.0] - 2019-11-06 * Added: support for `NO_COLOR` environment variable: https://no-color.org * Added: color support for Hyper terminal: https://github.com/zeit/hyper * Fixed: correct capitalization of Xdebug (apparently). * Fixed: improved handling for uopz extension. ## [1.3.3] - 2019-05-27 * Fixed: add environment changes to `$_ENV` if it is being used. ## [1.3.2] - 2019-01-28 * Fixed: exit call being blocked by uopz extension, resulting in application code running twice. ## [1.3.1] - 2018-11-29 * Fixed: fail restart if `passthru` has been disabled in `disable_functions`. * Fixed: fail restart if an ini file cannot be opened, otherwise settings will be missing. ## [1.3.0] - 2018-08-31 * Added: `setPersistent` method to use environment variables for the restart. * Fixed: improved debugging by writing output to stderr. * Fixed: no restart when `php_ini_scanned_files` is not functional and is needed. ## [1.2.1] - 2018-08-23 * Fixed: fatal error with apc, when using `apc.mmap_file_mask`. ## [1.2.0] - 2018-08-16 * Added: debug information using `XDEBUG_HANDLER_DEBUG`. * Added: fluent interface for setters. * Added: `PhpConfig` helper class for calling PHP sub-processes. * Added: `PHPRC` original value to restart stettings, for use in a restarted process. * Changed: internal procedure to disable ini-scanning, using `-n` command-line option. * Fixed: replaced `escapeshellarg` usage to avoid locale problems. * Fixed: improved color-option handling to respect double-dash delimiter. * Fixed: color-option handling regression from main script changes. * Fixed: improved handling when checking main script. * Fixed: handling for standard input, that never actually did anything. * Fixed: fatal error when ctype extension is not available. ## [1.1.0] - 2018-04-11 * Added: `getRestartSettings` method for calling PHP processes in a restarted process. * Added: API definition and @internal class annotations. * Added: protected `requiresRestart` method for extending classes. * Added: `setMainScript` method for applications that change the working directory. * Changed: private `tmpIni` variable to protected for extending classes. * Fixed: environment variables not available in $_SERVER when restored in the restart. * Fixed: relative path problems caused by Phar::interceptFileFuncs. * Fixed: incorrect handling when script file cannot be found. ## [1.0.0] - 2018-03-08 * Added: PSR3 logging for optional status output. * Added: existing ini settings are merged to catch command-line overrides. * Added: code, tests and other artefacts to decouple from Composer. * Break: the following class was renamed: - `Composer\XdebugHandler` -> `Composer\XdebugHandler\XdebugHandler` [Unreleased]: https://github.com/composer/xdebug-handler/compare/1.4.3...HEAD [1.4.3]: https://github.com/composer/xdebug-handler/compare/1.4.2...1.4.3 [1.4.2]: https://github.com/composer/xdebug-handler/compare/1.4.1...1.4.2 [1.4.1]: https://github.com/composer/xdebug-handler/compare/1.4.0...1.4.1 [1.4.0]: https://github.com/composer/xdebug-handler/compare/1.3.3...1.4.0 [1.3.3]: https://github.com/composer/xdebug-handler/compare/1.3.2...1.3.3 [1.3.2]: https://github.com/composer/xdebug-handler/compare/1.3.1...1.3.2 [1.3.1]: https://github.com/composer/xdebug-handler/compare/1.3.0...1.3.1 [1.3.0]: https://github.com/composer/xdebug-handler/compare/1.2.1...1.3.0 [1.2.1]: https://github.com/composer/xdebug-handler/compare/1.2.0...1.2.1 [1.2.0]: https://github.com/composer/xdebug-handler/compare/1.1.0...1.2.0 [1.1.0]: https://github.com/composer/xdebug-handler/compare/1.0.0...1.1.0 [1.0.0]: https://github.com/composer/xdebug-handler/compare/d66f0d15cb57...1.0.0 xdebug-handler/LICENSE 0000644 00000002051 14736103146 0010445 0 ustar 00 MIT License Copyright (c) 2017 Composer Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. spdx-licenses/CONTRIBUTING.md 0000644 00000002025 14736103146 0011562 0 ustar 00 Contributing to composer/spdx-licenses ====================================== Please note that this project is released with a [Contributor Code of Conduct](http://contributor-covenant.org/version/1/1/0/). By participating in this project and its community you agree to abide by those terms. Reporting Issues ---------------- When reporting issues, please try to be as descriptive as possible, and include as much relevant information as you can. A step by step guide on how to reproduce the issue will greatly increase the chances of your issue being resolved in a timely manner. Contributing Policy ------------------- Fork the project, create a feature branch, and send us a pull request. To ensure a consistent code base, you should make sure the code follows the [PSR-2 Coding Standards](http://www.php-fig.org/psr/psr-2/). Run [php-cs-fixer](https://github.com/FriendsOfPHP/PHP-CS-Fixer) to automatically "fix" files. If you would like to help, take a look at the [list of issues](https://github.com/composer/spdx-licenses/issues). spdx-licenses/res/spdx-licenses.json 0000644 00000117034 14736103146 0013605 0 ustar 00 { "0BSD": [ "BSD Zero Clause License", true, false ], "AAL": [ "Attribution Assurance License", true, false ], "Abstyles": [ "Abstyles License", false, false ], "Adobe-2006": [ "Adobe Systems Incorporated Source Code License Agreement", false, false ], "Adobe-Glyph": [ "Adobe Glyph List License", false, false ], "ADSL": [ "Amazon Digital Services License", false, false ], "AFL-1.1": [ "Academic Free License v1.1", true, false ], "AFL-1.2": [ "Academic Free License v1.2", true, false ], "AFL-2.0": [ "Academic Free License v2.0", true, false ], "AFL-2.1": [ "Academic Free License v2.1", true, false ], "AFL-3.0": [ "Academic Free License v3.0", true, false ], "Afmparse": [ "Afmparse License", false, false ], "AGPL-1.0": [ "Affero General Public License v1.0", false, true ], "AGPL-1.0-only": [ "Affero General Public License v1.0 only", false, false ], "AGPL-1.0-or-later": [ "Affero General Public License v1.0 or later", false, false ], "AGPL-3.0": [ "GNU Affero General Public License v3.0", true, true ], "AGPL-3.0-only": [ "GNU Affero General Public License v3.0 only", true, false ], "AGPL-3.0-or-later": [ "GNU Affero General Public License v3.0 or later", true, false ], "Aladdin": [ "Aladdin Free Public License", false, false ], "AMDPLPA": [ "AMD's plpa_map.c License", false, false ], "AML": [ "Apple MIT License", false, false ], "AMPAS": [ "Academy of Motion Picture Arts and Sciences BSD", false, false ], "ANTLR-PD": [ "ANTLR Software Rights Notice", false, false ], "Apache-1.0": [ "Apache License 1.0", false, false ], "Apache-1.1": [ "Apache License 1.1", true, false ], "Apache-2.0": [ "Apache License 2.0", true, false ], "APAFML": [ "Adobe Postscript AFM License", false, false ], "APL-1.0": [ "Adaptive Public License 1.0", true, false ], "APSL-1.0": [ "Apple Public Source License 1.0", true, false ], "APSL-1.1": [ "Apple Public Source License 1.1", true, false ], "APSL-1.2": [ "Apple Public Source License 1.2", true, false ], "APSL-2.0": [ "Apple Public Source License 2.0", true, false ], "Artistic-1.0": [ "Artistic License 1.0", true, false ], "Artistic-1.0-cl8": [ "Artistic License 1.0 w/clause 8", true, false ], "Artistic-1.0-Perl": [ "Artistic License 1.0 (Perl)", true, false ], "Artistic-2.0": [ "Artistic License 2.0", true, false ], "Bahyph": [ "Bahyph License", false, false ], "Barr": [ "Barr License", false, false ], "Beerware": [ "Beerware License", false, false ], "BitTorrent-1.0": [ "BitTorrent Open Source License v1.0", false, false ], "BitTorrent-1.1": [ "BitTorrent Open Source License v1.1", false, false ], "blessing": [ "SQLite Blessing", false, false ], "BlueOak-1.0.0": [ "Blue Oak Model License 1.0.0", false, false ], "Borceux": [ "Borceux license", false, false ], "BSD-1-Clause": [ "BSD 1-Clause License", false, false ], "BSD-2-Clause": [ "BSD 2-Clause \"Simplified\" License", true, false ], "BSD-2-Clause-FreeBSD": [ "BSD 2-Clause FreeBSD License", false, false ], "BSD-2-Clause-NetBSD": [ "BSD 2-Clause NetBSD License", false, false ], "BSD-2-Clause-Patent": [ "BSD-2-Clause Plus Patent License", true, false ], "BSD-3-Clause": [ "BSD 3-Clause \"New\" or \"Revised\" License", true, false ], "BSD-3-Clause-Attribution": [ "BSD with attribution", false, false ], "BSD-3-Clause-Clear": [ "BSD 3-Clause Clear License", false, false ], "BSD-3-Clause-LBNL": [ "Lawrence Berkeley National Labs BSD variant license", true, false ], "BSD-3-Clause-No-Nuclear-License": [ "BSD 3-Clause No Nuclear License", false, false ], "BSD-3-Clause-No-Nuclear-License-2014": [ "BSD 3-Clause No Nuclear License 2014", false, false ], "BSD-3-Clause-No-Nuclear-Warranty": [ "BSD 3-Clause No Nuclear Warranty", false, false ], "BSD-3-Clause-Open-MPI": [ "BSD 3-Clause Open MPI variant", false, false ], "BSD-4-Clause": [ "BSD 4-Clause \"Original\" or \"Old\" License", false, false ], "BSD-4-Clause-UC": [ "BSD-4-Clause (University of California-Specific)", false, false ], "BSD-Protection": [ "BSD Protection License", false, false ], "BSD-Source-Code": [ "BSD Source Code Attribution", false, false ], "BSL-1.0": [ "Boost Software License 1.0", true, false ], "bzip2-1.0.5": [ "bzip2 and libbzip2 License v1.0.5", false, false ], "bzip2-1.0.6": [ "bzip2 and libbzip2 License v1.0.6", false, false ], "Caldera": [ "Caldera License", false, false ], "CATOSL-1.1": [ "Computer Associates Trusted Open Source License 1.1", true, false ], "CC-BY-1.0": [ "Creative Commons Attribution 1.0 Generic", false, false ], "CC-BY-2.0": [ "Creative Commons Attribution 2.0 Generic", false, false ], "CC-BY-2.5": [ "Creative Commons Attribution 2.5 Generic", false, false ], "CC-BY-3.0": [ "Creative Commons Attribution 3.0 Unported", false, false ], "CC-BY-4.0": [ "Creative Commons Attribution 4.0 International", false, false ], "CC-BY-NC-1.0": [ "Creative Commons Attribution Non Commercial 1.0 Generic", false, false ], "CC-BY-NC-2.0": [ "Creative Commons Attribution Non Commercial 2.0 Generic", false, false ], "CC-BY-NC-2.5": [ "Creative Commons Attribution Non Commercial 2.5 Generic", false, false ], "CC-BY-NC-3.0": [ "Creative Commons Attribution Non Commercial 3.0 Unported", false, false ], "CC-BY-NC-4.0": [ "Creative Commons Attribution Non Commercial 4.0 International", false, false ], "CC-BY-NC-ND-1.0": [ "Creative Commons Attribution Non Commercial No Derivatives 1.0 Generic", false, false ], "CC-BY-NC-ND-2.0": [ "Creative Commons Attribution Non Commercial No Derivatives 2.0 Generic", false, false ], "CC-BY-NC-ND-2.5": [ "Creative Commons Attribution Non Commercial No Derivatives 2.5 Generic", false, false ], "CC-BY-NC-ND-3.0": [ "Creative Commons Attribution Non Commercial No Derivatives 3.0 Unported", false, false ], "CC-BY-NC-ND-4.0": [ "Creative Commons Attribution Non Commercial No Derivatives 4.0 International", false, false ], "CC-BY-NC-SA-1.0": [ "Creative Commons Attribution Non Commercial Share Alike 1.0 Generic", false, false ], "CC-BY-NC-SA-2.0": [ "Creative Commons Attribution Non Commercial Share Alike 2.0 Generic", false, false ], "CC-BY-NC-SA-2.5": [ "Creative Commons Attribution Non Commercial Share Alike 2.5 Generic", false, false ], "CC-BY-NC-SA-3.0": [ "Creative Commons Attribution Non Commercial Share Alike 3.0 Unported", false, false ], "CC-BY-NC-SA-4.0": [ "Creative Commons Attribution Non Commercial Share Alike 4.0 International", false, false ], "CC-BY-ND-1.0": [ "Creative Commons Attribution No Derivatives 1.0 Generic", false, false ], "CC-BY-ND-2.0": [ "Creative Commons Attribution No Derivatives 2.0 Generic", false, false ], "CC-BY-ND-2.5": [ "Creative Commons Attribution No Derivatives 2.5 Generic", false, false ], "CC-BY-ND-3.0": [ "Creative Commons Attribution No Derivatives 3.0 Unported", false, false ], "CC-BY-ND-4.0": [ "Creative Commons Attribution No Derivatives 4.0 International", false, false ], "CC-BY-SA-1.0": [ "Creative Commons Attribution Share Alike 1.0 Generic", false, false ], "CC-BY-SA-2.0": [ "Creative Commons Attribution Share Alike 2.0 Generic", false, false ], "CC-BY-SA-2.5": [ "Creative Commons Attribution Share Alike 2.5 Generic", false, false ], "CC-BY-SA-3.0": [ "Creative Commons Attribution Share Alike 3.0 Unported", false, false ], "CC-BY-SA-4.0": [ "Creative Commons Attribution Share Alike 4.0 International", false, false ], "CC-PDDC": [ "Creative Commons Public Domain Dedication and Certification", false, false ], "CC0-1.0": [ "Creative Commons Zero v1.0 Universal", false, false ], "CDDL-1.0": [ "Common Development and Distribution License 1.0", true, false ], "CDDL-1.1": [ "Common Development and Distribution License 1.1", false, false ], "CDLA-Permissive-1.0": [ "Community Data License Agreement Permissive 1.0", false, false ], "CDLA-Sharing-1.0": [ "Community Data License Agreement Sharing 1.0", false, false ], "CECILL-1.0": [ "CeCILL Free Software License Agreement v1.0", false, false ], "CECILL-1.1": [ "CeCILL Free Software License Agreement v1.1", false, false ], "CECILL-2.0": [ "CeCILL Free Software License Agreement v2.0", false, false ], "CECILL-2.1": [ "CeCILL Free Software License Agreement v2.1", true, false ], "CECILL-B": [ "CeCILL-B Free Software License Agreement", false, false ], "CECILL-C": [ "CeCILL-C Free Software License Agreement", false, false ], "CERN-OHL-1.1": [ "CERN Open Hardware Licence v1.1", false, false ], "CERN-OHL-1.2": [ "CERN Open Hardware Licence v1.2", false, false ], "ClArtistic": [ "Clarified Artistic License", false, false ], "CNRI-Jython": [ "CNRI Jython License", false, false ], "CNRI-Python": [ "CNRI Python License", true, false ], "CNRI-Python-GPL-Compatible": [ "CNRI Python Open Source GPL Compatible License Agreement", false, false ], "Condor-1.1": [ "Condor Public License v1.1", false, false ], "copyleft-next-0.3.0": [ "copyleft-next 0.3.0", false, false ], "copyleft-next-0.3.1": [ "copyleft-next 0.3.1", false, false ], "CPAL-1.0": [ "Common Public Attribution License 1.0", true, false ], "CPL-1.0": [ "Common Public License 1.0", true, false ], "CPOL-1.02": [ "Code Project Open License 1.02", false, false ], "Crossword": [ "Crossword License", false, false ], "CrystalStacker": [ "CrystalStacker License", false, false ], "CUA-OPL-1.0": [ "CUA Office Public License v1.0", true, false ], "Cube": [ "Cube License", false, false ], "curl": [ "curl License", false, false ], "D-FSL-1.0": [ "Deutsche Freie Software Lizenz", false, false ], "diffmark": [ "diffmark license", false, false ], "DOC": [ "DOC License", false, false ], "Dotseqn": [ "Dotseqn License", false, false ], "DSDP": [ "DSDP License", false, false ], "dvipdfm": [ "dvipdfm License", false, false ], "ECL-1.0": [ "Educational Community License v1.0", true, false ], "ECL-2.0": [ "Educational Community License v2.0", true, false ], "eCos-2.0": [ "eCos license version 2.0", false, true ], "EFL-1.0": [ "Eiffel Forum License v1.0", true, false ], "EFL-2.0": [ "Eiffel Forum License v2.0", true, false ], "eGenix": [ "eGenix.com Public License 1.1.0", false, false ], "Entessa": [ "Entessa Public License v1.0", true, false ], "EPL-1.0": [ "Eclipse Public License 1.0", true, false ], "EPL-2.0": [ "Eclipse Public License 2.0", true, false ], "ErlPL-1.1": [ "Erlang Public License v1.1", false, false ], "etalab-2.0": [ "Etalab Open License 2.0", false, false ], "EUDatagrid": [ "EU DataGrid Software License", true, false ], "EUPL-1.0": [ "European Union Public License 1.0", false, false ], "EUPL-1.1": [ "European Union Public License 1.1", true, false ], "EUPL-1.2": [ "European Union Public License 1.2", true, false ], "Eurosym": [ "Eurosym License", false, false ], "Fair": [ "Fair License", true, false ], "Frameworx-1.0": [ "Frameworx Open License 1.0", true, false ], "FreeImage": [ "FreeImage Public License v1.0", false, false ], "FSFAP": [ "FSF All Permissive License", false, false ], "FSFUL": [ "FSF Unlimited License", false, false ], "FSFULLR": [ "FSF Unlimited License (with License Retention)", false, false ], "FTL": [ "Freetype Project License", false, false ], "GFDL-1.1": [ "GNU Free Documentation License v1.1", false, true ], "GFDL-1.1-only": [ "GNU Free Documentation License v1.1 only", false, false ], "GFDL-1.1-or-later": [ "GNU Free Documentation License v1.1 or later", false, false ], "GFDL-1.2": [ "GNU Free Documentation License v1.2", false, true ], "GFDL-1.2-only": [ "GNU Free Documentation License v1.2 only", false, false ], "GFDL-1.2-or-later": [ "GNU Free Documentation License v1.2 or later", false, false ], "GFDL-1.3": [ "GNU Free Documentation License v1.3", false, true ], "GFDL-1.3-only": [ "GNU Free Documentation License v1.3 only", false, false ], "GFDL-1.3-or-later": [ "GNU Free Documentation License v1.3 or later", false, false ], "Giftware": [ "Giftware License", false, false ], "GL2PS": [ "GL2PS License", false, false ], "Glide": [ "3dfx Glide License", false, false ], "Glulxe": [ "Glulxe License", false, false ], "gnuplot": [ "gnuplot License", false, false ], "GPL-1.0": [ "GNU General Public License v1.0 only", false, true ], "GPL-1.0+": [ "GNU General Public License v1.0 or later", false, true ], "GPL-1.0-only": [ "GNU General Public License v1.0 only", false, false ], "GPL-1.0-or-later": [ "GNU General Public License v1.0 or later", false, false ], "GPL-2.0": [ "GNU General Public License v2.0 only", true, true ], "GPL-2.0+": [ "GNU General Public License v2.0 or later", true, true ], "GPL-2.0-only": [ "GNU General Public License v2.0 only", true, false ], "GPL-2.0-or-later": [ "GNU General Public License v2.0 or later", true, false ], "GPL-2.0-with-autoconf-exception": [ "GNU General Public License v2.0 w/Autoconf exception", false, true ], "GPL-2.0-with-bison-exception": [ "GNU General Public License v2.0 w/Bison exception", false, true ], "GPL-2.0-with-classpath-exception": [ "GNU General Public License v2.0 w/Classpath exception", false, true ], "GPL-2.0-with-font-exception": [ "GNU General Public License v2.0 w/Font exception", false, true ], "GPL-2.0-with-GCC-exception": [ "GNU General Public License v2.0 w/GCC Runtime Library exception", false, true ], "GPL-3.0": [ "GNU General Public License v3.0 only", true, true ], "GPL-3.0+": [ "GNU General Public License v3.0 or later", true, true ], "GPL-3.0-only": [ "GNU General Public License v3.0 only", true, false ], "GPL-3.0-or-later": [ "GNU General Public License v3.0 or later", true, false ], "GPL-3.0-with-autoconf-exception": [ "GNU General Public License v3.0 w/Autoconf exception", false, true ], "GPL-3.0-with-GCC-exception": [ "GNU General Public License v3.0 w/GCC Runtime Library exception", true, true ], "gSOAP-1.3b": [ "gSOAP Public License v1.3b", false, false ], "HaskellReport": [ "Haskell Language Report License", false, false ], "HPND": [ "Historical Permission Notice and Disclaimer", true, false ], "HPND-sell-variant": [ "Historical Permission Notice and Disclaimer - sell variant", false, false ], "IBM-pibs": [ "IBM PowerPC Initialization and Boot Software", false, false ], "ICU": [ "ICU License", false, false ], "IJG": [ "Independent JPEG Group License", false, false ], "ImageMagick": [ "ImageMagick License", false, false ], "iMatix": [ "iMatix Standard Function Library Agreement", false, false ], "Imlib2": [ "Imlib2 License", false, false ], "Info-ZIP": [ "Info-ZIP License", false, false ], "Intel": [ "Intel Open Source License", true, false ], "Intel-ACPI": [ "Intel ACPI Software License Agreement", false, false ], "Interbase-1.0": [ "Interbase Public License v1.0", false, false ], "IPA": [ "IPA Font License", true, false ], "IPL-1.0": [ "IBM Public License v1.0", true, false ], "ISC": [ "ISC License", true, false ], "JasPer-2.0": [ "JasPer License", false, false ], "JPNIC": [ "Japan Network Information Center License", false, false ], "JSON": [ "JSON License", false, false ], "LAL-1.2": [ "Licence Art Libre 1.2", false, false ], "LAL-1.3": [ "Licence Art Libre 1.3", false, false ], "Latex2e": [ "Latex2e License", false, false ], "Leptonica": [ "Leptonica License", false, false ], "LGPL-2.0": [ "GNU Library General Public License v2 only", true, true ], "LGPL-2.0+": [ "GNU Library General Public License v2 or later", true, true ], "LGPL-2.0-only": [ "GNU Library General Public License v2 only", true, false ], "LGPL-2.0-or-later": [ "GNU Library General Public License v2 or later", true, false ], "LGPL-2.1": [ "GNU Lesser General Public License v2.1 only", true, true ], "LGPL-2.1+": [ "GNU Library General Public License v2.1 or later", true, true ], "LGPL-2.1-only": [ "GNU Lesser General Public License v2.1 only", true, false ], "LGPL-2.1-or-later": [ "GNU Lesser General Public License v2.1 or later", true, false ], "LGPL-3.0": [ "GNU Lesser General Public License v3.0 only", true, true ], "LGPL-3.0+": [ "GNU Lesser General Public License v3.0 or later", true, true ], "LGPL-3.0-only": [ "GNU Lesser General Public License v3.0 only", true, false ], "LGPL-3.0-or-later": [ "GNU Lesser General Public License v3.0 or later", true, false ], "LGPLLR": [ "Lesser General Public License For Linguistic Resources", false, false ], "Libpng": [ "libpng License", false, false ], "libpng-2.0": [ "PNG Reference Library version 2", false, false ], "libselinux-1.0": [ "libselinux public domain notice", false, false ], "libtiff": [ "libtiff License", false, false ], "LiLiQ-P-1.1": [ "Licence Libre du Qu\u00e9bec \u2013 Permissive version 1.1", true, false ], "LiLiQ-R-1.1": [ "Licence Libre du Qu\u00e9bec \u2013 R\u00e9ciprocit\u00e9 version 1.1", true, false ], "LiLiQ-Rplus-1.1": [ "Licence Libre du Qu\u00e9bec \u2013 R\u00e9ciprocit\u00e9 forte version 1.1", true, false ], "Linux-OpenIB": [ "Linux Kernel Variant of OpenIB.org license", false, false ], "LPL-1.0": [ "Lucent Public License Version 1.0", true, false ], "LPL-1.02": [ "Lucent Public License v1.02", true, false ], "LPPL-1.0": [ "LaTeX Project Public License v1.0", false, false ], "LPPL-1.1": [ "LaTeX Project Public License v1.1", false, false ], "LPPL-1.2": [ "LaTeX Project Public License v1.2", false, false ], "LPPL-1.3a": [ "LaTeX Project Public License v1.3a", false, false ], "LPPL-1.3c": [ "LaTeX Project Public License v1.3c", true, false ], "MakeIndex": [ "MakeIndex License", false, false ], "MirOS": [ "The MirOS Licence", true, false ], "MIT": [ "MIT License", true, false ], "MIT-0": [ "MIT No Attribution", false, false ], "MIT-advertising": [ "Enlightenment License (e16)", false, false ], "MIT-CMU": [ "CMU License", false, false ], "MIT-enna": [ "enna License", false, false ], "MIT-feh": [ "feh License", false, false ], "MITNFA": [ "MIT +no-false-attribs license", false, false ], "Motosoto": [ "Motosoto License", true, false ], "mpich2": [ "mpich2 License", false, false ], "MPL-1.0": [ "Mozilla Public License 1.0", true, false ], "MPL-1.1": [ "Mozilla Public License 1.1", true, false ], "MPL-2.0": [ "Mozilla Public License 2.0", true, false ], "MPL-2.0-no-copyleft-exception": [ "Mozilla Public License 2.0 (no copyleft exception)", true, false ], "MS-PL": [ "Microsoft Public License", true, false ], "MS-RL": [ "Microsoft Reciprocal License", true, false ], "MTLL": [ "Matrix Template Library License", false, false ], "MulanPSL-1.0": [ "Mulan Permissive Software License, Version 1", false, false ], "Multics": [ "Multics License", true, false ], "Mup": [ "Mup License", false, false ], "NASA-1.3": [ "NASA Open Source Agreement 1.3", true, false ], "Naumen": [ "Naumen Public License", true, false ], "NBPL-1.0": [ "Net Boolean Public License v1", false, false ], "NCSA": [ "University of Illinois/NCSA Open Source License", true, false ], "Net-SNMP": [ "Net-SNMP License", false, false ], "NetCDF": [ "NetCDF license", false, false ], "Newsletr": [ "Newsletr License", false, false ], "NGPL": [ "Nethack General Public License", true, false ], "NLOD-1.0": [ "Norwegian Licence for Open Government Data", false, false ], "NLPL": [ "No Limit Public License", false, false ], "Nokia": [ "Nokia Open Source License", true, false ], "NOSL": [ "Netizen Open Source License", false, false ], "Noweb": [ "Noweb License", false, false ], "NPL-1.0": [ "Netscape Public License v1.0", false, false ], "NPL-1.1": [ "Netscape Public License v1.1", false, false ], "NPOSL-3.0": [ "Non-Profit Open Software License 3.0", true, false ], "NRL": [ "NRL License", false, false ], "NTP": [ "NTP License", true, false ], "NTP-0": [ "NTP No Attribution", false, false ], "Nunit": [ "Nunit License", false, true ], "OCCT-PL": [ "Open CASCADE Technology Public License", false, false ], "OCLC-2.0": [ "OCLC Research Public License 2.0", true, false ], "ODbL-1.0": [ "ODC Open Database License v1.0", false, false ], "ODC-By-1.0": [ "Open Data Commons Attribution License v1.0", false, false ], "OFL-1.0": [ "SIL Open Font License 1.0", false, false ], "OFL-1.0-no-RFN": [ "SIL Open Font License 1.0 with no Reserved Font Name", false, false ], "OFL-1.0-RFN": [ "SIL Open Font License 1.0 with Reserved Font Name", false, false ], "OFL-1.1": [ "SIL Open Font License 1.1", true, false ], "OFL-1.1-no-RFN": [ "SIL Open Font License 1.1 with no Reserved Font Name", true, false ], "OFL-1.1-RFN": [ "SIL Open Font License 1.1 with Reserved Font Name", true, false ], "OGL-Canada-2.0": [ "Open Government Licence - Canada", false, false ], "OGL-UK-1.0": [ "Open Government Licence v1.0", false, false ], "OGL-UK-2.0": [ "Open Government Licence v2.0", false, false ], "OGL-UK-3.0": [ "Open Government Licence v3.0", false, false ], "OGTSL": [ "Open Group Test Suite License", true, false ], "OLDAP-1.1": [ "Open LDAP Public License v1.1", false, false ], "OLDAP-1.2": [ "Open LDAP Public License v1.2", false, false ], "OLDAP-1.3": [ "Open LDAP Public License v1.3", false, false ], "OLDAP-1.4": [ "Open LDAP Public License v1.4", false, false ], "OLDAP-2.0": [ "Open LDAP Public License v2.0 (or possibly 2.0A and 2.0B)", false, false ], "OLDAP-2.0.1": [ "Open LDAP Public License v2.0.1", false, false ], "OLDAP-2.1": [ "Open LDAP Public License v2.1", false, false ], "OLDAP-2.2": [ "Open LDAP Public License v2.2", false, false ], "OLDAP-2.2.1": [ "Open LDAP Public License v2.2.1", false, false ], "OLDAP-2.2.2": [ "Open LDAP Public License 2.2.2", false, false ], "OLDAP-2.3": [ "Open LDAP Public License v2.3", false, false ], "OLDAP-2.4": [ "Open LDAP Public License v2.4", false, false ], "OLDAP-2.5": [ "Open LDAP Public License v2.5", false, false ], "OLDAP-2.6": [ "Open LDAP Public License v2.6", false, false ], "OLDAP-2.7": [ "Open LDAP Public License v2.7", false, false ], "OLDAP-2.8": [ "Open LDAP Public License v2.8", false, false ], "OML": [ "Open Market License", false, false ], "OpenSSL": [ "OpenSSL License", false, false ], "OPL-1.0": [ "Open Public License v1.0", false, false ], "OSET-PL-2.1": [ "OSET Public License version 2.1", true, false ], "OSL-1.0": [ "Open Software License 1.0", true, false ], "OSL-1.1": [ "Open Software License 1.1", false, false ], "OSL-2.0": [ "Open Software License 2.0", true, false ], "OSL-2.1": [ "Open Software License 2.1", true, false ], "OSL-3.0": [ "Open Software License 3.0", true, false ], "Parity-6.0.0": [ "The Parity Public License 6.0.0", false, false ], "PDDL-1.0": [ "ODC Public Domain Dedication & License 1.0", false, false ], "PHP-3.0": [ "PHP License v3.0", true, false ], "PHP-3.01": [ "PHP License v3.01", false, false ], "Plexus": [ "Plexus Classworlds License", false, false ], "PostgreSQL": [ "PostgreSQL License", true, false ], "PSF-2.0": [ "Python Software Foundation License 2.0", false, false ], "psfrag": [ "psfrag License", false, false ], "psutils": [ "psutils License", false, false ], "Python-2.0": [ "Python License 2.0", true, false ], "Qhull": [ "Qhull License", false, false ], "QPL-1.0": [ "Q Public License 1.0", true, false ], "Rdisc": [ "Rdisc License", false, false ], "RHeCos-1.1": [ "Red Hat eCos Public License v1.1", false, false ], "RPL-1.1": [ "Reciprocal Public License 1.1", true, false ], "RPL-1.5": [ "Reciprocal Public License 1.5", true, false ], "RPSL-1.0": [ "RealNetworks Public Source License v1.0", true, false ], "RSA-MD": [ "RSA Message-Digest License", false, false ], "RSCPL": [ "Ricoh Source Code Public License", true, false ], "Ruby": [ "Ruby License", false, false ], "SAX-PD": [ "Sax Public Domain Notice", false, false ], "Saxpath": [ "Saxpath License", false, false ], "SCEA": [ "SCEA Shared Source License", false, false ], "Sendmail": [ "Sendmail License", false, false ], "Sendmail-8.23": [ "Sendmail License 8.23", false, false ], "SGI-B-1.0": [ "SGI Free Software License B v1.0", false, false ], "SGI-B-1.1": [ "SGI Free Software License B v1.1", false, false ], "SGI-B-2.0": [ "SGI Free Software License B v2.0", false, false ], "SHL-0.5": [ "Solderpad Hardware License v0.5", false, false ], "SHL-0.51": [ "Solderpad Hardware License, Version 0.51", false, false ], "SimPL-2.0": [ "Simple Public License 2.0", true, false ], "SISSL": [ "Sun Industry Standards Source License v1.1", true, false ], "SISSL-1.2": [ "Sun Industry Standards Source License v1.2", false, false ], "Sleepycat": [ "Sleepycat License", true, false ], "SMLNJ": [ "Standard ML of New Jersey License", false, false ], "SMPPL": [ "Secure Messaging Protocol Public License", false, false ], "SNIA": [ "SNIA Public License 1.1", false, false ], "Spencer-86": [ "Spencer License 86", false, false ], "Spencer-94": [ "Spencer License 94", false, false ], "Spencer-99": [ "Spencer License 99", false, false ], "SPL-1.0": [ "Sun Public License v1.0", true, false ], "SSH-OpenSSH": [ "SSH OpenSSH license", false, false ], "SSH-short": [ "SSH short notice", false, false ], "SSPL-1.0": [ "Server Side Public License, v 1", false, false ], "StandardML-NJ": [ "Standard ML of New Jersey License", false, true ], "SugarCRM-1.1.3": [ "SugarCRM Public License v1.1.3", false, false ], "SWL": [ "Scheme Widget Library (SWL) Software License Agreement", false, false ], "TAPR-OHL-1.0": [ "TAPR Open Hardware License v1.0", false, false ], "TCL": [ "TCL/TK License", false, false ], "TCP-wrappers": [ "TCP Wrappers License", false, false ], "TMate": [ "TMate Open Source License", false, false ], "TORQUE-1.1": [ "TORQUE v2.5+ Software License v1.1", false, false ], "TOSL": [ "Trusster Open Source License", false, false ], "TU-Berlin-1.0": [ "Technische Universitaet Berlin License 1.0", false, false ], "TU-Berlin-2.0": [ "Technische Universitaet Berlin License 2.0", false, false ], "UCL-1.0": [ "Upstream Compatibility License v1.0", true, false ], "Unicode-DFS-2015": [ "Unicode License Agreement - Data Files and Software (2015)", false, false ], "Unicode-DFS-2016": [ "Unicode License Agreement - Data Files and Software (2016)", false, false ], "Unicode-TOU": [ "Unicode Terms of Use", false, false ], "Unlicense": [ "The Unlicense", false, false ], "UPL-1.0": [ "Universal Permissive License v1.0", true, false ], "Vim": [ "Vim License", false, false ], "VOSTROM": [ "VOSTROM Public License for Open Source", false, false ], "VSL-1.0": [ "Vovida Software License v1.0", true, false ], "W3C": [ "W3C Software Notice and License (2002-12-31)", true, false ], "W3C-19980720": [ "W3C Software Notice and License (1998-07-20)", false, false ], "W3C-20150513": [ "W3C Software Notice and Document License (2015-05-13)", false, false ], "Watcom-1.0": [ "Sybase Open Watcom Public License 1.0", true, false ], "Wsuipa": [ "Wsuipa License", false, false ], "WTFPL": [ "Do What The F*ck You Want To Public License", false, false ], "wxWindows": [ "wxWindows Library License", false, true ], "X11": [ "X11 License", false, false ], "Xerox": [ "Xerox License", false, false ], "XFree86-1.1": [ "XFree86 License 1.1", false, false ], "xinetd": [ "xinetd License", false, false ], "Xnet": [ "X.Net License", true, false ], "xpp": [ "XPP License", false, false ], "XSkat": [ "XSkat License", false, false ], "YPL-1.0": [ "Yahoo! Public License v1.0", false, false ], "YPL-1.1": [ "Yahoo! Public License v1.1", false, false ], "Zed": [ "Zed License", false, false ], "Zend-2.0": [ "Zend License v2.0", false, false ], "Zimbra-1.3": [ "Zimbra Public License v1.3", false, false ], "Zimbra-1.4": [ "Zimbra Public License v1.4", false, false ], "Zlib": [ "zlib License", true, false ], "zlib-acknowledgement": [ "zlib/libpng License with Acknowledgement", false, false ], "ZPL-1.1": [ "Zope Public License 1.1", false, false ], "ZPL-2.0": [ "Zope Public License 2.0", true, false ], "ZPL-2.1": [ "Zope Public License 2.1", false, false ] } spdx-licenses/res/spdx-exceptions.json 0000644 00000005344 14736103146 0014161 0 ustar 00 { "389-exception": [ "389 Directory Server Exception" ], "Autoconf-exception-2.0": [ "Autoconf exception 2.0" ], "Autoconf-exception-3.0": [ "Autoconf exception 3.0" ], "Bison-exception-2.2": [ "Bison exception 2.2" ], "Bootloader-exception": [ "Bootloader Distribution Exception" ], "Classpath-exception-2.0": [ "Classpath exception 2.0" ], "CLISP-exception-2.0": [ "CLISP exception 2.0" ], "DigiRule-FOSS-exception": [ "DigiRule FOSS License Exception" ], "eCos-exception-2.0": [ "eCos exception 2.0" ], "Fawkes-Runtime-exception": [ "Fawkes Runtime Exception" ], "FLTK-exception": [ "FLTK exception" ], "Font-exception-2.0": [ "Font exception 2.0" ], "freertos-exception-2.0": [ "FreeRTOS Exception 2.0" ], "GCC-exception-2.0": [ "GCC Runtime Library exception 2.0" ], "GCC-exception-3.1": [ "GCC Runtime Library exception 3.1" ], "gnu-javamail-exception": [ "GNU JavaMail exception" ], "GPL-3.0-linking-exception": [ "GPL-3.0 Linking Exception" ], "GPL-3.0-linking-source-exception": [ "GPL-3.0 Linking Exception (with Corresponding Source)" ], "GPL-CC-1.0": [ "GPL Cooperation Commitment 1.0" ], "i2p-gpl-java-exception": [ "i2p GPL+Java Exception" ], "Libtool-exception": [ "Libtool Exception" ], "Linux-syscall-note": [ "Linux Syscall Note" ], "LLVM-exception": [ "LLVM Exception" ], "LZMA-exception": [ "LZMA exception" ], "mif-exception": [ "Macros and Inline Functions Exception" ], "Nokia-Qt-exception-1.1": [ "Nokia Qt LGPL exception 1.1" ], "OCaml-LGPL-linking-exception": [ "OCaml LGPL Linking Exception" ], "OCCT-exception-1.0": [ "Open CASCADE Exception 1.0" ], "OpenJDK-assembly-exception-1.0": [ "OpenJDK Assembly exception 1.0" ], "openvpn-openssl-exception": [ "OpenVPN OpenSSL Exception" ], "PS-or-PDF-font-exception-20170817": [ "PS/PDF font exception (2017-08-17)" ], "Qt-GPL-exception-1.0": [ "Qt GPL exception 1.0" ], "Qt-LGPL-exception-1.1": [ "Qt LGPL exception 1.1" ], "Qwt-exception-1.0": [ "Qwt exception 1.0" ], "Swift-exception": [ "Swift Exception" ], "u-boot-exception-2.0": [ "U-Boot exception 2.0" ], "Universal-FOSS-exception-1.0": [ "Universal FOSS Exception, Version 1.0" ], "WxWindows-exception-3.1": [ "WxWindows Library Exception 3.1" ] } spdx-licenses/bin/update-spdx-licenses 0000644 00000000312 14736103146 0014062 0 ustar 00 #!/usr/bin/env php <?php require __DIR__ . '/../vendor/autoload.php'; use Composer\Spdx\SpdxLicensesUpdater; $updater = new SpdxLicensesUpdater; $updater->dumpLicenses(); $updater->dumpExceptions(); spdx-licenses/src/SpdxLicenses.php 0000644 00000021775 14736103146 0013252 0 ustar 00 <?php /* * This file is part of composer/spdx-licenses. * * (c) Composer <https://github.com/composer> * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace Composer\Spdx; class SpdxLicenses { /** @var string */ const LICENSES_FILE = 'spdx-licenses.json'; /** @var string */ const EXCEPTIONS_FILE = 'spdx-exceptions.json'; /** * Contains all the licenses. * * The array is indexed by license identifiers, which contain * a numerically indexed array with license details. * * [ lowercased license identifier => * [ 0 => identifier (string), 1 => full name (string), 2 => osi certified (bool), 3 => deprecated (bool) ] * , ... * ] * * @var array */ private $licenses; /** * @var string */ private $licensesExpression; /** * Contains all the license exceptions. * * The array is indexed by license exception identifiers, which contain * a numerically indexed array with license exception details. * * [ lowercased exception identifier => * [ 0 => exception identifier (string), 1 => full name (string) ] * , ... * ] * * @var array */ private $exceptions; /** * @var string */ private $exceptionsExpression; public function __construct() { $this->loadLicenses(); $this->loadExceptions(); } /** * Returns license metadata by license identifier. * * This function adds a link to the full license text to the license metadata. * The array returned is in the form of: * * [ 0 => full name (string), 1 => osi certified, 2 => link to license text (string), 3 => deprecation status (bool) ] * * @param string $identifier * * @return array|null */ public function getLicenseByIdentifier($identifier) { $key = strtolower($identifier); if (!isset($this->licenses[$key])) { return; } list($identifier, $name, $isOsiApproved, $isDeprecatedLicenseId) = $this->licenses[$key]; return array( $name, $isOsiApproved, 'https://spdx.org/licenses/' . $identifier . '.html#licenseText', $isDeprecatedLicenseId, ); } /** * Returns all licenses information, keyed by the lowercased license identifier. * * @return array[] Each item is [ 0 => identifier (string), 1 => full name (string), 2 => osi certified (bool), 3 => deprecated (bool) ] */ public function getLicenses() { return $this->licenses; } /** * Returns license exception metadata by license exception identifier. * * This function adds a link to the full license exception text to the license exception metadata. * The array returned is in the form of: * * [ 0 => full name (string), 1 => link to license text (string) ] * * @param string $identifier * * @return array|null */ public function getExceptionByIdentifier($identifier) { $key = strtolower($identifier); if (!isset($this->exceptions[$key])) { return; } list($identifier, $name) = $this->exceptions[$key]; return array( $name, 'https://spdx.org/licenses/' . $identifier . '.html#licenseExceptionText', ); } /** * Returns the short identifier of a license (or license exception) by full name. * * @param string $name * * @return string|null */ public function getIdentifierByName($name) { foreach ($this->licenses as $licenseData) { if ($licenseData[1] === $name) { return $licenseData[0]; } } foreach ($this->exceptions as $licenseData) { if ($licenseData[1] === $name) { return $licenseData[0]; } } } /** * Returns the OSI Approved status for a license by identifier. * * @param string $identifier * * @return bool */ public function isOsiApprovedByIdentifier($identifier) { return $this->licenses[strtolower($identifier)][2]; } /** * Returns the deprecation status for a license by identifier. * * @param string $identifier * * @return bool */ public function isDeprecatedByIdentifier($identifier) { return $this->licenses[strtolower($identifier)][3]; } /** * @param array|string $license * * @throws \InvalidArgumentException * * @return bool */ public function validate($license) { if (is_array($license)) { $count = count($license); if ($count !== count(array_filter($license, 'is_string'))) { throw new \InvalidArgumentException('Array of strings expected.'); } $license = $count > 1 ? '(' . implode(' OR ', $license) . ')' : (string) reset($license); } if (!is_string($license)) { throw new \InvalidArgumentException(sprintf( 'Array or String expected, %s given.', gettype($license) )); } return $this->isValidLicenseString($license); } /** * @return string */ public static function getResourcesDir() { return dirname(__DIR__) . '/res'; } private function loadLicenses() { if (null !== $this->licenses) { return; } $json = file_get_contents(self::getResourcesDir() . '/' . self::LICENSES_FILE); $this->licenses = array(); foreach (json_decode($json, true) as $identifier => $license) { $this->licenses[strtolower($identifier)] = array($identifier, $license[0], $license[1], $license[2]); } } private function loadExceptions() { if (null !== $this->exceptions) { return; } $json = file_get_contents(self::getResourcesDir() . '/' . self::EXCEPTIONS_FILE); $this->exceptions = array(); foreach (json_decode($json, true) as $identifier => $exception) { $this->exceptions[strtolower($identifier)] = array($identifier, $exception[0]); } } /** * @return string */ private function getLicensesExpression() { if (null === $this->licensesExpression) { $licenses = array_map('preg_quote', array_keys($this->licenses)); rsort($licenses); $licenses = implode('|', $licenses); $this->licensesExpression = $licenses; } return $this->licensesExpression; } /** * @return string */ private function getExceptionsExpression() { if (null === $this->exceptionsExpression) { $exceptions = array_map('preg_quote', array_keys($this->exceptions)); rsort($exceptions); $exceptions = implode('|', $exceptions); $this->exceptionsExpression = $exceptions; } return $this->exceptionsExpression; } /** * @param string $license * * @throws \RuntimeException * * @return bool */ private function isValidLicenseString($license) { if (isset($this->licenses[strtolower($license)])) { return true; } $licenses = $this->getLicensesExpression(); $exceptions = $this->getExceptionsExpression(); $regex = <<<REGEX { (?(DEFINE) # idstring: 1*( ALPHA / DIGIT / - / . ) (?<idstring>[\pL\pN.-]{1,}) # license-id: taken from list (?<licenseid>${licenses}) # license-exception-id: taken from list (?<licenseexceptionid>${exceptions}) # license-ref: [DocumentRef-1*(idstring):]LicenseRef-1*(idstring) (?<licenseref>(?:DocumentRef-(?&idstring):)?LicenseRef-(?&idstring)) # simple-expresssion: license-id / license-id+ / license-ref (?<simple_expression>(?&licenseid)\+? | (?&licenseid) | (?&licenseref)) # compound-expression: 1*( # simple-expression / # simple-expression WITH license-exception-id / # compound-expression AND compound-expression / # compound-expression OR compound-expression # ) / ( compound-expression ) ) (?<compound_head> (?&simple_expression) ( \s+ WITH \s+ (?&licenseexceptionid))? | \( \s* (?&compound_expression) \s* \) ) (?<compound_expression> (?&compound_head) (?: \s+ (?:AND|OR) \s+ (?&compound_expression))? ) # license-expression: 1*1(simple-expression / compound-expression) (?<license_expression>(?&compound_expression) | (?&simple_expression)) ) # end of define ^(NONE | NOASSERTION | (?&license_expression))$ }xi REGEX; $match = preg_match($regex, $license); if (0 === $match) { return false; } if (false === $match) { throw new \RuntimeException('Regex failed to compile/run.'); } return true; } } spdx-licenses/src/SpdxLicensesUpdater.php 0000644 00000005413 14736103146 0014566 0 ustar 00 <?php /* * This file is part of composer/spdx-licenses. * * (c) Composer <https://github.com/composer> * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace Composer\Spdx; /** * The SPDX Licenses Updater scrapes licenses from the spdx website * and updates the "res/*.json" file accordingly. * * The class is used by the update script "bin/update-spdx-licenses". */ class SpdxLicensesUpdater { /** * @param string $file * @param string $url */ public function dumpLicenses($file = null, $url = 'https://raw.githubusercontent.com/spdx/license-list-data/master/json/licenses.json') { if (null === $file) { $file = SpdxLicenses::getResourcesDir() . '/' . SpdxLicenses::LICENSES_FILE; } $options = 0; if (defined('JSON_PRETTY_PRINT')) { $options |= JSON_PRETTY_PRINT; } if (defined('JSON_UNESCAPED_SLASHES')) { $options |= JSON_UNESCAPED_SLASHES; } $licenses = json_encode($this->getLicenses($url), $options); file_put_contents($file, $licenses); } /** * @param string $file * @param string $url */ public function dumpExceptions($file = null, $url = 'https://raw.githubusercontent.com/spdx/license-list-data/master/json/exceptions.json') { if (null === $file) { $file = SpdxLicenses::getResourcesDir() . '/' . SpdxLicenses::EXCEPTIONS_FILE; } $options = 0; if (defined('JSON_PRETTY_PRINT')) { $options |= JSON_PRETTY_PRINT; } if (defined('JSON_UNESCAPED_SLASHES')) { $options |= JSON_UNESCAPED_SLASHES; } $exceptions = json_encode($this->getExceptions($url), $options); file_put_contents($file, $exceptions); } /** * @param string $url * * @return array */ private function getLicenses($url) { $licenses = array(); $data = json_decode(file_get_contents($url), true); foreach ($data['licenses'] as $info) { $licenses[$info['licenseId']] = array( trim($info['name']), $info['isOsiApproved'], $info['isDeprecatedLicenseId'] ); } uksort($licenses, 'strcasecmp'); return $licenses; } /** * @param string $url * * @return array */ private function getExceptions($url) { $exceptions = array(); $data = json_decode(file_get_contents($url), true); foreach ($data['exceptions'] as $info) { $exceptions[$info['licenseExceptionId']] = array(trim($info['name'])); } uksort($exceptions, 'strcasecmp'); return $exceptions; } } spdx-licenses/README.md 0000644 00000003411 14736103146 0010610 0 ustar 00 composer/spdx-licenses ====================== SPDX (Software Package Data Exchange) licenses list and validation library. Originally written as part of [composer/composer](https://github.com/composer/composer), now extracted and made available as a stand-alone library. [![Build Status](https://travis-ci.org/composer/spdx-licenses.svg?branch=master)](https://travis-ci.org/composer/spdx-licenses) Installation ------------ Install the latest version with: ```bash $ composer require composer/spdx-licenses ``` Basic Usage ----------- ```php <?php use Composer\Spdx\SpdxLicenses; $licenses = new SpdxLicenses(); // get a license by identifier $licenses->getLicenseByIdentifier('MIT'); // get a license exception by identifier $licenses->getExceptionByIdentifier('Autoconf-exception-3.0'); // get a license identifier by name $licenses->getIdentifierByName('MIT License'); // check if a license is OSI approved by identifier $licenses->isOsiApprovedByIdentifier('MIT'); // check if a license identifier is deprecated $licenses->isDeprecatedByIdentifier('MIT'); // check if input is a valid SPDX license expression $licenses->validate($input); ``` > Read the [specifications](https://spdx.org/specifications) > to find out more about valid license expressions. Requirements ------------ * PHP 5.3.2 is required but using the latest version of PHP is highly recommended. License ------- composer/spdx-licenses is licensed under the MIT License, see the LICENSE file for details. Source ------ License information is curated by [SPDX](https://spdx.org/). The data is pulled from the [License List Data](https://github.com/spdx/license-list-data) repository. * [Licenses](https://spdx.org/licenses/index.html) * [License Exceptions](https://spdx.org/licenses/exceptions-index.html) spdx-licenses/CHANGELOG.md 0000644 00000006117 14736103146 0011150 0 ustar 00 # Change Log All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). ## [master] ... ## [1.5.2] 2019-07-29 * Changed: updated licenses list to SPDX 3.6 ## [1.5.1] 2019-03-26 * Changed: updated licenses list to SPDX 3.4 ## [1.5.0] 2018-11-01 * Changed: updated licenses list to SPDX 3.3 ## [1.4.0] 2018-05-04 * Changed: updated licenses list to SPDX 3.1 ## [1.3.0] 2018-01-31 * Added: `SpdxLicenses::getLicenses` to get the whole list of methods. * Changed: license identifiers are now case insensitive. ## [1.2.0] 2018-01-03 * Added: deprecation status for all licenses and a `SpdxLicenses::isDeprecatedByIdentifier` method. * Changed: updated licenses list to SPDX 3.0. ## [1.1.6] 2017-04-03 * Changed: updated licenses list. ## [1.1.5] 2016-09-28 * Changed: updated licenses list. ## [1.1.4] 2016-05-04 * Changed: updated licenses list. ## [1.1.3] 2016-03-25 * Changed: updated licenses list. * Changed: dropped `test` namespace. * Changed: tedious small things. ## [1.1.2] 2015-10-05 * Changed: updated licenses list. ## [1.1.1] 2015-09-07 * Changed: improved performance when looking up just one license. * Changed: updated licenses list. ## [1.1.0] 2015-07-17 * Changed: updater now sorts licenses and exceptions by key. * Changed: filenames now class constants of SpdxLicenses (`LICENSES_FILE` and `EXCEPTIONS_FILE`). * Changed: resources directory now available via static method `SpdxLicenses::getResourcesDir()`. * Changed: updated licenses list. * Changed: removed json-schema requirement. ## [1.0.0] 2015-07-15 * Break: the following classes and namespaces were renamed: - Namespace: `Composer\Util` -> `Composer\Spdx` - Classname: `SpdxLicense` -> `SpdxLicenses` - Classname: `SpdxLicenseTest` -> `SpdxLicensesTest` - Classname: `Updater` -> `SpdxLicensesUpdater` * Changed: validation via regex implementation instead of lexer. [master]: https://github.com/composer/spdx-licenses/compare/1.5.2...master [1.5.2]: https://github.com/composer/spdx-licenses/compare/1.5.1...1.5.2 [1.5.1]: https://github.com/composer/spdx-licenses/compare/1.5.0...1.5.1 [1.5.0]: https://github.com/composer/spdx-licenses/compare/1.4.0...1.5.0 [1.4.0]: https://github.com/composer/spdx-licenses/compare/1.3.0...1.4.0 [1.3.0]: https://github.com/composer/spdx-licenses/compare/1.2.0...1.3.0 [1.2.0]: https://github.com/composer/spdx-licenses/compare/1.1.6...1.2.0 [1.1.6]: https://github.com/composer/spdx-licenses/compare/1.1.5...1.1.6 [1.1.5]: https://github.com/composer/spdx-licenses/compare/1.1.4...1.1.5 [1.1.4]: https://github.com/composer/spdx-licenses/compare/1.1.3...1.1.4 [1.1.3]: https://github.com/composer/spdx-licenses/compare/1.1.2...1.1.3 [1.1.2]: https://github.com/composer/spdx-licenses/compare/1.1.1...1.1.2 [1.1.1]: https://github.com/composer/spdx-licenses/compare/1.1.0...1.1.1 [1.1.0]: https://github.com/composer/spdx-licenses/compare/1.0.0...1.1.0 [1.0.0]: https://github.com/composer/spdx-licenses/compare/0281a7fe7820c990db3058844e7d448d7b70e3ac...1.0.0 spdx-licenses/LICENSE 0000644 00000002034 14736103146 0010336 0 ustar 00 Copyright (C) 2015 Composer Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. spdx-licenses/.php_cs.dist 0000644 00000003547 14736103146 0011562 0 ustar 00 <?php $header = <<<EOF This file is part of composer/spdx-licenses. (c) Composer <https://github.com/composer> For the full copyright and license information, please view the LICENSE file that was distributed with this source code. EOF; $finder = PhpCsFixer\Finder::create() ->files() ->name('*.php') ->in(__DIR__.'/src') ->in(__DIR__.'/tests') ; /* fabpot/php-cs-fixer:^2.0-dev */ return PhpCsFixer\Config::create() ->setUsingCache(true) //->setUsingLinter(false) ->setRiskyAllowed(true) ->setRules(array( '@PSR2' => true, 'binary_operator_spaces' => true, 'blank_line_before_return' => true, 'cast_spaces' => true, 'header_comment' => array('header' => $header), 'include' => true, 'long_array_syntax' => true, 'method_separation' => true, 'no_blank_lines_after_class_opening' => true, 'no_blank_lines_after_phpdoc' => true, 'no_blank_lines_between_uses' => true, 'no_duplicate_semicolons' => true, 'no_extra_consecutive_blank_lines' => true, 'no_leading_import_slash' => true, 'no_leading_namespace_whitespace' => true, 'no_trailing_comma_in_singleline_array' => true, 'no_unused_imports' => true, 'no_whitespace_in_blank_lines' => true, 'object_operator_without_whitespace' => true, 'phpdoc_align' => true, 'phpdoc_indent' => true, 'phpdoc_no_access' => true, 'phpdoc_no_package' => true, 'phpdoc_order' => true, 'phpdoc_scalar' => true, 'phpdoc_trim' => true, 'phpdoc_type_to_var' => true, 'psr0' => true, 'single_blank_line_before_namespace' => true, 'standardize_not_equals' => true, 'ternary_operator_spaces' => true, 'trailing_comma_in_multiline_array' => true, )) ->finder($finder) ; autoload_static.php 0000644 00000327772 14736103146 0010463 0 ustar 00 <?php // autoload_static.php @generated by Composer namespace Composer\Autoload; class ComposerStaticInitb3c17cb4854742e046e1a14170163c9a { public static $files = array ( '320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php', 'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php', '6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php', '23c18046f52bef3eea034657bafda50f' => __DIR__ . '/..' . '/symfony/polyfill-php81/bootstrap.php', '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php', 'e69f7f6ee287b969198c3c9d6777bd38' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/bootstrap.php', '7b11c4dc42b3b3023073cb14e519683c' => __DIR__ . '/..' . '/ralouphie/getallheaders/src/getallheaders.php', 'a0edc8309cc5e1d60e3047b5df6b7052' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/functions_include.php', '7e9bd612cc444b3eed788ebbe46263a0' => __DIR__ . '/..' . '/laminas/laminas-zendframework-bridge/src/autoload.php', '8825ede83f2f289127722d4e842cf7e8' => __DIR__ . '/..' . '/symfony/polyfill-intl-grapheme/bootstrap.php', '0d59ee240a4cd96ddbb4ff164fccea4d' => __DIR__ . '/..' . '/symfony/polyfill-php73/bootstrap.php', 'b6b991a57620e2fb6b2f66f03fe9ddc2' => __DIR__ . '/..' . '/symfony/string/Resources/functions.php', 'c964ee0ededf28c96ebd9db5099ef910' => __DIR__ . '/..' . '/guzzlehttp/promises/src/functions_include.php', '25072dd6e2470089de65ae7bf11d3109' => __DIR__ . '/..' . '/symfony/polyfill-php72/bootstrap.php', 'f598d06aa772fa33d905e87be6398fb1' => __DIR__ . '/..' . '/symfony/polyfill-intl-idn/bootstrap.php', '37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php', '72579e7bd17821bb1321b87411366eae' => __DIR__ . '/..' . '/illuminate/support/helpers.php', 'b067bc7112e384b61c701452d53a14a8' => __DIR__ . '/..' . '/mtdowling/jmespath.php/src/JmesPath.php', '8a9dc1de0ca7e01f3e08231539562f61' => __DIR__ . '/..' . '/aws/aws-sdk-php/src/functions.php', 'decc78cc4436b1292c6c0d151b19445c' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/bootstrap.php', 'def43f6c87e4f8dfd0c9e1b1bab14fe8' => __DIR__ . '/..' . '/symfony/polyfill-iconv/bootstrap.php', '07d7f1a47144818725fd8d91a907ac57' => __DIR__ . '/..' . '/laminas/laminas-diactoros/src/functions/create_uploaded_file.php', 'da94ac5d3ca7d2dbab84ce561ce72bfd' => __DIR__ . '/..' . '/laminas/laminas-diactoros/src/functions/marshal_headers_from_sapi.php', '3d97c8dcdfba8cb85d3b34f116bb248b' => __DIR__ . '/..' . '/laminas/laminas-diactoros/src/functions/marshal_method_from_sapi.php', 'e6f3bc6883e449ab367280b34158c05b' => __DIR__ . '/..' . '/laminas/laminas-diactoros/src/functions/marshal_protocol_version_from_sapi.php', 'd59fbae42019aedf227094ac49a46f50' => __DIR__ . '/..' . '/laminas/laminas-diactoros/src/functions/marshal_uri_from_sapi.php', 'de95e0ac670b27c84ef8c5ac41fc1b34' => __DIR__ . '/..' . '/laminas/laminas-diactoros/src/functions/normalize_server.php', 'b6c2870932b0250c10334a86dcb33c7f' => __DIR__ . '/..' . '/laminas/laminas-diactoros/src/functions/normalize_uploaded_files.php', 'd02cf21124526632320d6f20b1bbf905' => __DIR__ . '/..' . '/laminas/laminas-diactoros/src/functions/parse_cookie_header.php', 'd919fc9d5ad52cfb7f322f7fe36458ab' => __DIR__ . '/..' . '/laminas/laminas-diactoros/src/functions/create_uploaded_file.legacy.php', 'e397f74f8af3b1e56166a6e99f216ee7' => __DIR__ . '/..' . '/laminas/laminas-diactoros/src/functions/marshal_headers_from_sapi.legacy.php', 'd154b49fab8e4da34fb553a2d644918c' => __DIR__ . '/..' . '/laminas/laminas-diactoros/src/functions/marshal_method_from_sapi.legacy.php', '9d3db23ca418094bcf0b641a0c9559ed' => __DIR__ . '/..' . '/laminas/laminas-diactoros/src/functions/marshal_protocol_version_from_sapi.legacy.php', 'b0b88a3b89caae681462c58ff19a7059' => __DIR__ . '/..' . '/laminas/laminas-diactoros/src/functions/marshal_uri_from_sapi.legacy.php', 'cc8e14526dc240491e17a838cb78508c' => __DIR__ . '/..' . '/laminas/laminas-diactoros/src/functions/normalize_server.legacy.php', '786bf90caabc9e09b6ad4cc5ca8f0e30' => __DIR__ . '/..' . '/laminas/laminas-diactoros/src/functions/normalize_uploaded_files.legacy.php', '751a5a3f463e4be759be31748b61737c' => __DIR__ . '/..' . '/laminas/laminas-diactoros/src/functions/parse_cookie_header.legacy.php', '2df68f9e79c919e2d88506611769ed2e' => __DIR__ . '/..' . '/respect/stringifier/src/stringify.php', '253c157292f75eb38082b5acb06f3f01' => __DIR__ . '/..' . '/nikic/fast-route/src/functions.php', '2cffec82183ee1cea088009cef9a6fc3' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier.composer.php', 'c65d09b6820da036953a371c8c73a9b1' => __DIR__ . '/..' . '/facebook/graph-sdk/src/Facebook/polyfills.php', 'aa75ea0761a2f40c1f3b32ad314f86c4' => __DIR__ . '/..' . '/phpseclib/mcrypt_compat/lib/mcrypt.php', 'e39a8b23c42d4e1452234d762b03835a' => __DIR__ . '/..' . '/ramsey/uuid/src/functions.php', 'ad155f8f1cf0d418fe49e248db8c661b' => __DIR__ . '/..' . '/react/promise/src/functions_include.php', 'f239dbcecbaa0e5f4dfcbe823d65013a' => __DIR__ . '/../..' . '/modules/autoload.php', ); public static $prefixLengthsPsr4 = array ( 'v' => array ( 'voku\\' => 5, ), 'p' => array ( 'phpseclib\\' => 10, ), 'm' => array ( 'mindplay\\middleman\\' => 19, ), 'c' => array ( 'cebe\\openapi\\' => 13, ), 'Z' => array ( 'ZBateson\\StreamDecorators\\' => 26, 'ZBateson\\MbWrapper\\' => 19, 'ZBateson\\MailMimeParser\\' => 24, ), 'W' => array ( 'Whoops\\' => 7, 'Webmozart\\Assert\\' => 17, 'WHMCS\\' => 6, ), 'T' => array ( 'TrueBV\\' => 7, ), 'S' => array ( 'Symfony\\Polyfill\\Php81\\' => 23, 'Symfony\\Polyfill\\Php80\\' => 23, 'Symfony\\Polyfill\\Php73\\' => 23, 'Symfony\\Polyfill\\Php72\\' => 23, 'Symfony\\Polyfill\\Mbstring\\' => 26, 'Symfony\\Polyfill\\Intl\\Normalizer\\' => 33, 'Symfony\\Polyfill\\Intl\\Idn\\' => 26, 'Symfony\\Polyfill\\Intl\\Grapheme\\' => 31, 'Symfony\\Polyfill\\Iconv\\' => 23, 'Symfony\\Polyfill\\Ctype\\' => 23, 'Symfony\\Contracts\\Translation\\' => 30, 'Symfony\\Contracts\\Service\\' => 26, 'Symfony\\Contracts\\Cache\\' => 24, 'Symfony\\Component\\Yaml\\' => 23, 'Symfony\\Component\\VarExporter\\' => 30, 'Symfony\\Component\\Translation\\' => 30, 'Symfony\\Component\\String\\' => 25, 'Symfony\\Component\\Process\\' => 26, 'Symfony\\Component\\Mime\\' => 23, 'Symfony\\Component\\HttpFoundation\\' => 33, 'Symfony\\Component\\Finder\\' => 25, 'Symfony\\Component\\Filesystem\\' => 29, 'Symfony\\Component\\DependencyInjection\\' => 38, 'Symfony\\Component\\Console\\' => 26, 'Symfony\\Component\\Config\\' => 25, 'Symfony\\Component\\Cache\\' => 24, 'Stripe\\' => 7, 'Stevenmaguire\\OAuth2\\Client\\' => 28, 'Sonata\\GoogleAuthenticator\\' => 27, 'Seld\\PharUtils\\' => 15, 'Seld\\JsonLint\\' => 14, 'Seld\\CliPrompt\\' => 15, ), 'R' => array ( 'Riverline\\MultiPartParser\\' => 26, 'Respect\\Validation\\' => 19, 'Respect\\Stringifier\\' => 20, 'React\\Promise\\' => 14, 'ReCaptcha\\' => 10, 'Ramsey\\Uuid\\' => 12, 'Ramsey\\Collection\\' => 18, ), 'P' => array ( 'Punic\\' => 6, 'Psr\\SimpleCache\\' => 16, 'Psr\\Log\\' => 8, 'Psr\\Http\\Server\\' => 16, 'Psr\\Http\\Message\\' => 17, 'Psr\\Http\\Client\\' => 16, 'Psr\\Container\\' => 14, 'Psr\\Cache\\' => 10, 'PhpOption\\' => 10, 'PhpMyAdmin\\SqlParser\\' => 21, 'PHPMailer\\PHPMailer\\' => 20, ), 'M' => array ( 'Monolog\\' => 8, 'Middlewares\\Utils\\' => 18, 'Middlewares\\' => 12, 'Michelf\\' => 8, ), 'L' => array ( 'League\\Uri\\' => 11, 'League\\Plates\\' => 14, 'League\\OpenAPIValidation\\' => 25, 'League\\OAuth2\\Client\\' => 21, 'League\\Flysystem\\AwsS3v3\\' => 25, 'League\\Flysystem\\' => 17, 'League\\CLImate\\' => 15, 'Laminas\\ZendFrameworkBridge\\' => 28, 'Laminas\\Validator\\' => 18, 'Laminas\\Stdlib\\' => 15, 'Laminas\\Mime\\' => 13, 'Laminas\\Mail\\' => 13, 'Laminas\\Loader\\' => 15, 'Laminas\\HttpHandlerRunner\\' => 26, 'Laminas\\Diactoros\\' => 18, ), 'K' => array ( 'Knp\\Menu\\' => 9, ), 'J' => array ( 'JsonSchema\\' => 11, 'JmesPath\\' => 9, ), 'I' => array ( 'Interop\\Http\\ServerMiddleware\\' => 30, 'Interop\\Http\\Factory\\' => 21, 'Interop\\Container\\' => 18, 'Illuminate\\Validation\\' => 22, 'Illuminate\\Translation\\' => 23, 'Illuminate\\Support\\' => 19, 'Illuminate\\Filesystem\\' => 22, 'Illuminate\\Events\\' => 18, 'Illuminate\\Database\\' => 20, 'Illuminate\\Contracts\\' => 21, 'Illuminate\\Container\\' => 21, 'Illuminate\\Console\\' => 19, ), 'G' => array ( 'GuzzleHttp\\Psr7\\' => 16, 'GuzzleHttp\\Promise\\' => 19, 'GuzzleHttp\\' => 11, 'Google\\Authenticator\\' => 21, 'Google\\Auth\\' => 12, 'GoetasWebservices\\Xsd\\XsdToPhpRuntime\\' => 38, ), 'F' => array ( 'Firebase\\JWT\\' => 13, 'FastRoute\\' => 10, 'Facebook\\' => 9, ), 'E' => array ( 'Egulias\\EmailValidator\\' => 23, ), 'D' => array ( 'Duo\\' => 4, 'Doctrine\\Instantiator\\' => 22, 'Doctrine\\Inflector\\' => 19, 'Doctrine\\Common\\Lexer\\' => 22, 'Doctrine\\Common\\Inflector\\' => 26, 'Doctrine\\Common\\Annotations\\' => 28, ), 'C' => array ( 'Composer\\XdebugHandler\\' => 23, 'Composer\\Spdx\\' => 14, 'Composer\\Semver\\' => 16, 'Composer\\CaBundle\\' => 18, 'Composer\\' => 9, 'Carbon\\' => 7, ), 'B' => array ( 'Brick\\Math\\' => 11, ), 'A' => array ( 'Aws\\' => 4, 'Abraham\\TwitterOAuth\\' => 21, ), ); public static $prefixDirsPsr4 = array ( 'voku\\' => array ( 0 => __DIR__ . '/..' . '/voku/portable-ascii/src/voku', ), 'phpseclib\\' => array ( 0 => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib', ), 'mindplay\\middleman\\' => array ( 0 => __DIR__ . '/..' . '/mindplay/middleman/src', ), 'cebe\\openapi\\' => array ( 0 => __DIR__ . '/..' . '/cebe/php-openapi/src', ), 'ZBateson\\StreamDecorators\\' => array ( 0 => __DIR__ . '/..' . '/zbateson/stream-decorators/src', ), 'ZBateson\\MbWrapper\\' => array ( 0 => __DIR__ . '/..' . '/zbateson/mb-wrapper/src', ), 'ZBateson\\MailMimeParser\\' => array ( 0 => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src', ), 'Whoops\\' => array ( 0 => __DIR__ . '/..' . '/filp/whoops/src/Whoops', ), 'Webmozart\\Assert\\' => array ( 0 => __DIR__ . '/..' . '/webmozart/assert/src', ), 'WHMCS\\' => array ( 0 => __DIR__ . '/..' . '/whmcs/whmcs-foundation/lib', ), 'TrueBV\\' => array ( 0 => __DIR__ . '/..' . '/true/punycode/src', ), 'Symfony\\Polyfill\\Php81\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-php81', ), 'Symfony\\Polyfill\\Php80\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-php80', ), 'Symfony\\Polyfill\\Php73\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-php73', ), 'Symfony\\Polyfill\\Php72\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-php72', ), 'Symfony\\Polyfill\\Mbstring\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring', ), 'Symfony\\Polyfill\\Intl\\Normalizer\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer', ), 'Symfony\\Polyfill\\Intl\\Idn\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-intl-idn', ), 'Symfony\\Polyfill\\Intl\\Grapheme\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-intl-grapheme', ), 'Symfony\\Polyfill\\Iconv\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-iconv', ), 'Symfony\\Polyfill\\Ctype\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-ctype', ), 'Symfony\\Contracts\\Translation\\' => array ( 0 => __DIR__ . '/..' . '/symfony/translation-contracts', ), 'Symfony\\Contracts\\Service\\' => array ( 0 => __DIR__ . '/..' . '/symfony/service-contracts', ), 'Symfony\\Contracts\\Cache\\' => array ( 0 => __DIR__ . '/..' . '/symfony/cache-contracts', ), 'Symfony\\Component\\Yaml\\' => array ( 0 => __DIR__ . '/..' . '/symfony/yaml', ), 'Symfony\\Component\\VarExporter\\' => array ( 0 => __DIR__ . '/..' . '/symfony/var-exporter', ), 'Symfony\\Component\\Translation\\' => array ( 0 => __DIR__ . '/..' . '/symfony/translation', ), 'Symfony\\Component\\String\\' => array ( 0 => __DIR__ . '/..' . '/symfony/string', ), 'Symfony\\Component\\Process\\' => array ( 0 => __DIR__ . '/..' . '/symfony/process', ), 'Symfony\\Component\\Mime\\' => array ( 0 => __DIR__ . '/..' . '/symfony/mime', ), 'Symfony\\Component\\HttpFoundation\\' => array ( 0 => __DIR__ . '/..' . '/symfony/http-foundation', ), 'Symfony\\Component\\Finder\\' => array ( 0 => __DIR__ . '/..' . '/symfony/finder', ), 'Symfony\\Component\\Filesystem\\' => array ( 0 => __DIR__ . '/..' . '/symfony/filesystem', ), 'Symfony\\Component\\DependencyInjection\\' => array ( 0 => __DIR__ . '/..' . '/symfony/dependency-injection', ), 'Symfony\\Component\\Console\\' => array ( 0 => __DIR__ . '/..' . '/symfony/console', ), 'Symfony\\Component\\Config\\' => array ( 0 => __DIR__ . '/..' . '/symfony/config', ), 'Symfony\\Component\\Cache\\' => array ( 0 => __DIR__ . '/..' . '/symfony/cache', ), 'Stripe\\' => array ( 0 => __DIR__ . '/..' . '/stripe/stripe-php/lib', ), 'Stevenmaguire\\OAuth2\\Client\\' => array ( 0 => __DIR__ . '/..' . '/stevenmaguire/oauth2-microsoft/src', ), 'Sonata\\GoogleAuthenticator\\' => array ( 0 => __DIR__ . '/..' . '/sonata-project/google-authenticator/src', ), 'Seld\\PharUtils\\' => array ( 0 => __DIR__ . '/..' . '/seld/phar-utils/src', ), 'Seld\\JsonLint\\' => array ( 0 => __DIR__ . '/..' . '/seld/jsonlint/src/Seld/JsonLint', ), 'Seld\\CliPrompt\\' => array ( 0 => __DIR__ . '/..' . '/seld/cli-prompt/src', ), 'Riverline\\MultiPartParser\\' => array ( 0 => __DIR__ . '/..' . '/riverline/multipart-parser/src', ), 'Respect\\Validation\\' => array ( 0 => __DIR__ . '/..' . '/respect/validation/library', ), 'Respect\\Stringifier\\' => array ( 0 => __DIR__ . '/..' . '/respect/stringifier/src', ), 'React\\Promise\\' => array ( 0 => __DIR__ . '/..' . '/react/promise/src', ), 'ReCaptcha\\' => array ( 0 => __DIR__ . '/..' . '/google/recaptcha/src/ReCaptcha', ), 'Ramsey\\Uuid\\' => array ( 0 => __DIR__ . '/..' . '/ramsey/uuid/src', ), 'Ramsey\\Collection\\' => array ( 0 => __DIR__ . '/..' . '/ramsey/collection/src', ), 'Punic\\' => array ( 0 => __DIR__ . '/..' . '/punic/punic/src', ), 'Psr\\SimpleCache\\' => array ( 0 => __DIR__ . '/..' . '/psr/simple-cache/src', ), 'Psr\\Log\\' => array ( 0 => __DIR__ . '/..' . '/psr/log/Psr/Log', ), 'Psr\\Http\\Server\\' => array ( 0 => __DIR__ . '/..' . '/psr/http-server-handler/src', 1 => __DIR__ . '/..' . '/psr/http-server-middleware/src', ), 'Psr\\Http\\Message\\' => array ( 0 => __DIR__ . '/..' . '/psr/http-message/src', 1 => __DIR__ . '/..' . '/psr/http-factory/src', ), 'Psr\\Http\\Client\\' => array ( 0 => __DIR__ . '/..' . '/psr/http-client/src', ), 'Psr\\Container\\' => array ( 0 => __DIR__ . '/..' . '/psr/container/src', ), 'Psr\\Cache\\' => array ( 0 => __DIR__ . '/..' . '/psr/cache/src', ), 'PhpOption\\' => array ( 0 => __DIR__ . '/..' . '/phpoption/phpoption/src/PhpOption', ), 'PhpMyAdmin\\SqlParser\\' => array ( 0 => __DIR__ . '/..' . '/phpmyadmin/sql-parser/src', ), 'PHPMailer\\PHPMailer\\' => array ( 0 => __DIR__ . '/..' . '/phpmailer/phpmailer/src', ), 'Monolog\\' => array ( 0 => __DIR__ . '/..' . '/monolog/monolog/src/Monolog', ), 'Middlewares\\Utils\\' => array ( 0 => __DIR__ . '/..' . '/middlewares/utils/src', ), 'Middlewares\\' => array ( 0 => __DIR__ . '/..' . '/middlewares/fast-route/src', ), 'Michelf\\' => array ( 0 => __DIR__ . '/..' . '/michelf/php-markdown/Michelf', ), 'League\\Uri\\' => array ( 0 => __DIR__ . '/..' . '/league/uri-interfaces/src', 1 => __DIR__ . '/..' . '/league/uri/src', ), 'League\\Plates\\' => array ( 0 => __DIR__ . '/..' . '/league/plates/src', ), 'League\\OpenAPIValidation\\' => array ( 0 => __DIR__ . '/..' . '/league/openapi-psr7-validator/src', ), 'League\\OAuth2\\Client\\' => array ( 0 => __DIR__ . '/..' . '/league/oauth2-client/src', 1 => __DIR__ . '/..' . '/league/oauth2-google/src', ), 'League\\Flysystem\\AwsS3v3\\' => array ( 0 => __DIR__ . '/..' . '/league/flysystem-aws-s3-v3/src', ), 'League\\Flysystem\\' => array ( 0 => __DIR__ . '/..' . '/league/flysystem/src', ), 'League\\CLImate\\' => array ( 0 => __DIR__ . '/..' . '/league/climate/src', ), 'Laminas\\ZendFrameworkBridge\\' => array ( 0 => __DIR__ . '/..' . '/laminas/laminas-zendframework-bridge/src', ), 'Laminas\\Validator\\' => array ( 0 => __DIR__ . '/..' . '/laminas/laminas-validator/src', ), 'Laminas\\Stdlib\\' => array ( 0 => __DIR__ . '/..' . '/laminas/laminas-stdlib/src', ), 'Laminas\\Mime\\' => array ( 0 => __DIR__ . '/..' . '/laminas/laminas-mime/src', ), 'Laminas\\Mail\\' => array ( 0 => __DIR__ . '/..' . '/laminas/laminas-mail/src', ), 'Laminas\\Loader\\' => array ( 0 => __DIR__ . '/..' . '/laminas/laminas-loader/src', ), 'Laminas\\HttpHandlerRunner\\' => array ( 0 => __DIR__ . '/..' . '/laminas/laminas-httphandlerrunner/src', ), 'Laminas\\Diactoros\\' => array ( 0 => __DIR__ . '/..' . '/laminas/laminas-diactoros/src', ), 'Knp\\Menu\\' => array ( 0 => __DIR__ . '/..' . '/knplabs/knp-menu/src/Knp/Menu', ), 'JsonSchema\\' => array ( 0 => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema', ), 'JmesPath\\' => array ( 0 => __DIR__ . '/..' . '/mtdowling/jmespath.php/src', ), 'Interop\\Http\\ServerMiddleware\\' => array ( 0 => __DIR__ . '/..' . '/http-interop/http-middleware/src', ), 'Interop\\Http\\Factory\\' => array ( 0 => __DIR__ . '/..' . '/http-interop/http-factory/src', ), 'Interop\\Container\\' => array ( 0 => __DIR__ . '/..' . '/container-interop/container-interop/src/Interop/Container', ), 'Illuminate\\Validation\\' => array ( 0 => __DIR__ . '/..' . '/illuminate/validation', ), 'Illuminate\\Translation\\' => array ( 0 => __DIR__ . '/..' . '/illuminate/translation', ), 'Illuminate\\Support\\' => array ( 0 => __DIR__ . '/..' . '/illuminate/support', ), 'Illuminate\\Filesystem\\' => array ( 0 => __DIR__ . '/..' . '/illuminate/filesystem', ), 'Illuminate\\Events\\' => array ( 0 => __DIR__ . '/..' . '/illuminate/events', ), 'Illuminate\\Database\\' => array ( 0 => __DIR__ . '/..' . '/illuminate/database', ), 'Illuminate\\Contracts\\' => array ( 0 => __DIR__ . '/..' . '/illuminate/contracts', ), 'Illuminate\\Container\\' => array ( 0 => __DIR__ . '/..' . '/illuminate/container', ), 'Illuminate\\Console\\' => array ( 0 => __DIR__ . '/..' . '/illuminate/console', ), 'GuzzleHttp\\Psr7\\' => array ( 0 => __DIR__ . '/..' . '/guzzlehttp/psr7/src', ), 'GuzzleHttp\\Promise\\' => array ( 0 => __DIR__ . '/..' . '/guzzlehttp/promises/src', ), 'GuzzleHttp\\' => array ( 0 => __DIR__ . '/..' . '/guzzlehttp/guzzle/src', ), 'Google\\Authenticator\\' => array ( 0 => __DIR__ . '/..' . '/sonata-project/google-authenticator/src', ), 'Google\\Auth\\' => array ( 0 => __DIR__ . '/..' . '/google/auth/src', ), 'GoetasWebservices\\Xsd\\XsdToPhpRuntime\\' => array ( 0 => __DIR__ . '/..' . '/goetas-webservices/xsd2php-runtime/src', ), 'Firebase\\JWT\\' => array ( 0 => __DIR__ . '/..' . '/firebase/php-jwt/src', ), 'FastRoute\\' => array ( 0 => __DIR__ . '/..' . '/nikic/fast-route/src', ), 'Facebook\\' => array ( 0 => __DIR__ . '/..' . '/facebook/graph-sdk/src/Facebook', ), 'Egulias\\EmailValidator\\' => array ( 0 => __DIR__ . '/..' . '/egulias/email-validator/src', ), 'Duo\\' => array ( 0 => __DIR__ . '/..' . '/duosecurity/duo_php/src', ), 'Doctrine\\Instantiator\\' => array ( 0 => __DIR__ . '/..' . '/doctrine/instantiator/src/Doctrine/Instantiator', ), 'Doctrine\\Inflector\\' => array ( 0 => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector', ), 'Doctrine\\Common\\Lexer\\' => array ( 0 => __DIR__ . '/..' . '/doctrine/lexer/lib/Doctrine/Common/Lexer', ), 'Doctrine\\Common\\Inflector\\' => array ( 0 => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Common/Inflector', ), 'Doctrine\\Common\\Annotations\\' => array ( 0 => __DIR__ . '/..' . '/doctrine/annotations/lib/Doctrine/Common/Annotations', ), 'Composer\\XdebugHandler\\' => array ( 0 => __DIR__ . '/..' . '/composer/xdebug-handler/src', ), 'Composer\\Spdx\\' => array ( 0 => __DIR__ . '/..' . '/composer/spdx-licenses/src', ), 'Composer\\Semver\\' => array ( 0 => __DIR__ . '/..' . '/composer/semver/src', ), 'Composer\\CaBundle\\' => array ( 0 => __DIR__ . '/..' . '/composer/ca-bundle/src', ), 'Composer\\' => array ( 0 => __DIR__ . '/..' . '/composer/composer/src/Composer', ), 'Carbon\\' => array ( 0 => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon', ), 'Brick\\Math\\' => array ( 0 => __DIR__ . '/..' . '/brick/math/src', ), 'Aws\\' => array ( 0 => __DIR__ . '/..' . '/aws/aws-sdk-php/src', ), 'Abraham\\TwitterOAuth\\' => array ( 0 => __DIR__ . '/..' . '/abraham/twitteroauth/src', ), ); public static $fallbackDirsPsr4 = array ( 0 => __DIR__ . '/..' . '/bitpay/php-client/src', ); public static $prefixesPsr0 = array ( 'P' => array ( 'PhpCollection' => array ( 0 => __DIR__ . '/..' . '/phpcollection/phpcollection/src', ), ), 'O' => array ( 'OAuth2\\HttpFoundationBridge' => array ( 0 => __DIR__ . '/..' . '/bshaffer/oauth2-server-httpfoundation-bridge/src', ), 'OAuth2' => array ( 0 => __DIR__ . '/..' . '/bshaffer/oauth2-server-php/src', ), ), 'M' => array ( 'Metadata\\' => array ( 0 => __DIR__ . '/..' . '/jms/metadata/src', ), ), 'J' => array ( 'JMS\\Serializer' => array ( 0 => __DIR__ . '/..' . '/jms/serializer/src', ), 'JMS\\' => array ( 0 => __DIR__ . '/..' . '/jms/parser-lib/src', ), ), 'H' => array ( 'HTMLPurifier' => array ( 0 => __DIR__ . '/..' . '/ezyang/htmlpurifier/library', ), ), 'G' => array ( 'Google_' => array ( 0 => __DIR__ . '/..' . '/google/apiclient/src', ), ), ); public static $classMap = array ( 'AuthorizeNetAIM' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/deprecated/AuthorizeNetAIM.php', 'AuthorizeNetAIM_Response' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/deprecated/AuthorizeNetAIM.php', 'AuthorizeNetARB' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/deprecated/AuthorizeNetARB.php', 'AuthorizeNetARB_Response' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/deprecated/AuthorizeNetARB.php', 'AuthorizeNetAddress' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/deprecated/shared/AuthorizeNetTypes.php', 'AuthorizeNetBankAccount' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/deprecated/shared/AuthorizeNetTypes.php', 'AuthorizeNetCIM' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/deprecated/AuthorizeNetCIM.php', 'AuthorizeNetCIM_Response' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/deprecated/AuthorizeNetCIM.php', 'AuthorizeNetCP' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/deprecated/AuthorizeNetCP.php', 'AuthorizeNetCP_Response' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/deprecated/AuthorizeNetCP.php', 'AuthorizeNetCreditCard' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/deprecated/shared/AuthorizeNetTypes.php', 'AuthorizeNetCustomer' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/deprecated/shared/AuthorizeNetTypes.php', 'AuthorizeNetDPM' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/deprecated/AuthorizeNetDPM.php', 'AuthorizeNetException' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/deprecated/shared/AuthorizeNetException.php', 'AuthorizeNetGetSubscriptionList' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/deprecated/shared/AuthorizeNetTypes.php', 'AuthorizeNetLineItem' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/deprecated/shared/AuthorizeNetTypes.php', 'AuthorizeNetPayment' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/deprecated/shared/AuthorizeNetTypes.php', 'AuthorizeNetPaymentProfile' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/deprecated/shared/AuthorizeNetTypes.php', 'AuthorizeNetRequest' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/deprecated/shared/AuthorizeNetRequest.php', 'AuthorizeNetResponse' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/deprecated/shared/AuthorizeNetResponse.php', 'AuthorizeNetSIM' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/deprecated/AuthorizeNetSIM.php', 'AuthorizeNetSIM_Form' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/deprecated/AuthorizeNetSIM.php', 'AuthorizeNetSOAP' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/deprecated/AuthorizeNetSOAP.php', 'AuthorizeNetSubscriptionListPaging' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/deprecated/shared/AuthorizeNetTypes.php', 'AuthorizeNetSubscriptionListSorting' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/deprecated/shared/AuthorizeNetTypes.php', 'AuthorizeNetTD' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/deprecated/AuthorizeNetTD.php', 'AuthorizeNetTD_Response' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/deprecated/AuthorizeNetTD.php', 'AuthorizeNetTransaction' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/deprecated/shared/AuthorizeNetTypes.php', 'AuthorizeNetXMLResponse' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/deprecated/shared/AuthorizeNetXMLResponse.php', 'AuthorizeNet_Subscription' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/deprecated/shared/AuthorizeNetTypes.php', 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', 'Datamatrix' => __DIR__ . '/..' . '/tecnickcom/tcpdf/include/barcodes/datamatrix.php', 'Google_Service_Exception' => __DIR__ . '/..' . '/google/apiclient/src/Google/Service/Exception.php', 'Google_Service_Resource' => __DIR__ . '/..' . '/google/apiclient/src/Google/Service/Resource.php', 'JsonException' => __DIR__ . '/..' . '/symfony/polyfill-php73/Resources/stubs/JsonException.php', 'Normalizer' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php', 'PDF417' => __DIR__ . '/..' . '/tecnickcom/tcpdf/include/barcodes/pdf417.php', 'QRcode' => __DIR__ . '/..' . '/tecnickcom/tcpdf/include/barcodes/qrcode.php', 'ReturnTypeWillChange' => __DIR__ . '/..' . '/symfony/polyfill-php81/Resources/stubs/ReturnTypeWillChange.php', 'Smarty' => __DIR__ . '/..' . '/smarty/smarty/libs/Smarty.class.php', 'SmartyBC' => __DIR__ . '/..' . '/smarty/smarty/libs/SmartyBC.class.php', 'SmartyCompilerException' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smartycompilerexception.php', 'SmartyException' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smartyexception.php', 'Smarty_Autoloader' => __DIR__ . '/..' . '/smarty/smarty/libs/Autoloader.php', 'Smarty_CacheResource' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_cacheresource.php', 'Smarty_CacheResource_Custom' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_cacheresource_custom.php', 'Smarty_CacheResource_KeyValueStore' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_cacheresource_keyvaluestore.php', 'Smarty_Data' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_data.php', 'Smarty_Internal_Block' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_block.php', 'Smarty_Internal_CacheResource_File' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_cacheresource_file.php', 'Smarty_Internal_CompileBase' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compilebase.php', 'Smarty_Internal_Compile_Append' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_append.php', 'Smarty_Internal_Compile_Assign' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_assign.php', 'Smarty_Internal_Compile_Block' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_block.php', 'Smarty_Internal_Compile_Block_Child' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_block_child.php', 'Smarty_Internal_Compile_Block_Parent' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_block_parent.php', 'Smarty_Internal_Compile_Blockclose' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_block.php', 'Smarty_Internal_Compile_Break' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_break.php', 'Smarty_Internal_Compile_Call' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_call.php', 'Smarty_Internal_Compile_Capture' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_capture.php', 'Smarty_Internal_Compile_CaptureClose' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_capture.php', 'Smarty_Internal_Compile_Child' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_child.php', 'Smarty_Internal_Compile_Config_Load' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_config_load.php', 'Smarty_Internal_Compile_Continue' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_continue.php', 'Smarty_Internal_Compile_Debug' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_debug.php', 'Smarty_Internal_Compile_Else' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_if.php', 'Smarty_Internal_Compile_Elseif' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_if.php', 'Smarty_Internal_Compile_Eval' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_eval.php', 'Smarty_Internal_Compile_Extends' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_extends.php', 'Smarty_Internal_Compile_For' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_for.php', 'Smarty_Internal_Compile_Forclose' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_for.php', 'Smarty_Internal_Compile_Foreach' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_foreach.php', 'Smarty_Internal_Compile_Foreachclose' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_foreach.php', 'Smarty_Internal_Compile_Foreachelse' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_foreach.php', 'Smarty_Internal_Compile_Forelse' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_for.php', 'Smarty_Internal_Compile_Function' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_function.php', 'Smarty_Internal_Compile_Functionclose' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_function.php', 'Smarty_Internal_Compile_If' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_if.php', 'Smarty_Internal_Compile_Ifclose' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_if.php', 'Smarty_Internal_Compile_Include' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_include.php', 'Smarty_Internal_Compile_Include_Php' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_include_php.php', 'Smarty_Internal_Compile_Insert' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_insert.php', 'Smarty_Internal_Compile_Ldelim' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_ldelim.php', 'Smarty_Internal_Compile_Make_Nocache' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_make_nocache.php', 'Smarty_Internal_Compile_Nocache' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_nocache.php', 'Smarty_Internal_Compile_Nocacheclose' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_nocache.php', 'Smarty_Internal_Compile_Parent' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_parent.php', 'Smarty_Internal_Compile_Private_Block_Plugin' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_block_plugin.php', 'Smarty_Internal_Compile_Private_ForeachSection' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_foreachsection.php', 'Smarty_Internal_Compile_Private_Function_Plugin' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_function_plugin.php', 'Smarty_Internal_Compile_Private_Modifier' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_modifier.php', 'Smarty_Internal_Compile_Private_Object_Block_Function' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_object_block_function.php', 'Smarty_Internal_Compile_Private_Object_Function' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_object_function.php', 'Smarty_Internal_Compile_Private_Php' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_php.php', 'Smarty_Internal_Compile_Private_Print_Expression' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_print_expression.php', 'Smarty_Internal_Compile_Private_Registered_Block' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_registered_block.php', 'Smarty_Internal_Compile_Private_Registered_Function' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_registered_function.php', 'Smarty_Internal_Compile_Private_Special_Variable' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_private_special_variable.php', 'Smarty_Internal_Compile_Rdelim' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_rdelim.php', 'Smarty_Internal_Compile_Section' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_section.php', 'Smarty_Internal_Compile_Sectionclose' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_section.php', 'Smarty_Internal_Compile_Sectionelse' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_section.php', 'Smarty_Internal_Compile_Setfilter' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_setfilter.php', 'Smarty_Internal_Compile_Setfilterclose' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_setfilter.php', 'Smarty_Internal_Compile_Shared_Inheritance' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_shared_inheritance.php', 'Smarty_Internal_Compile_While' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_while.php', 'Smarty_Internal_Compile_Whileclose' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_compile_while.php', 'Smarty_Internal_Config_File_Compiler' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_config_file_compiler.php', 'Smarty_Internal_Configfilelexer' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_configfilelexer.php', 'Smarty_Internal_Configfileparser' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_configfileparser.php', 'Smarty_Internal_Data' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_data.php', 'Smarty_Internal_Debug' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_debug.php', 'Smarty_Internal_ErrorHandler' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_errorhandler.php', 'Smarty_Internal_Extension_Handler' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_extension_handler.php', 'Smarty_Internal_Method_AddAutoloadFilters' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_method_addautoloadfilters.php', 'Smarty_Internal_Method_AddDefaultModifiers' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_method_adddefaultmodifiers.php', 'Smarty_Internal_Method_Append' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_method_append.php', 'Smarty_Internal_Method_AppendByRef' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_method_appendbyref.php', 'Smarty_Internal_Method_AssignByRef' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_method_assignbyref.php', 'Smarty_Internal_Method_AssignGlobal' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_method_assignglobal.php', 'Smarty_Internal_Method_ClearAllAssign' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_method_clearallassign.php', 'Smarty_Internal_Method_ClearAllCache' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_method_clearallcache.php', 'Smarty_Internal_Method_ClearAssign' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_method_clearassign.php', 'Smarty_Internal_Method_ClearCache' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_method_clearcache.php', 'Smarty_Internal_Method_ClearCompiledTemplate' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_method_clearcompiledtemplate.php', 'Smarty_Internal_Method_ClearConfig' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_method_clearconfig.php', 'Smarty_Internal_Method_CompileAllConfig' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_method_compileallconfig.php', 'Smarty_Internal_Method_CompileAllTemplates' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_method_compilealltemplates.php', 'Smarty_Internal_Method_ConfigLoad' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_method_configload.php', 'Smarty_Internal_Method_CreateData' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_method_createdata.php', 'Smarty_Internal_Method_GetAutoloadFilters' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_method_getautoloadfilters.php', 'Smarty_Internal_Method_GetConfigVariable' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_method_getconfigvariable.php', 'Smarty_Internal_Method_GetConfigVars' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_method_getconfigvars.php', 'Smarty_Internal_Method_GetDebugTemplate' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_method_getdebugtemplate.php', 'Smarty_Internal_Method_GetDefaultModifiers' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_method_getdefaultmodifiers.php', 'Smarty_Internal_Method_GetGlobal' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_method_getglobal.php', 'Smarty_Internal_Method_GetRegisteredObject' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_method_getregisteredobject.php', 'Smarty_Internal_Method_GetStreamVariable' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_method_getstreamvariable.php', 'Smarty_Internal_Method_GetTags' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_method_gettags.php', 'Smarty_Internal_Method_GetTemplateVars' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_method_gettemplatevars.php', 'Smarty_Internal_Method_Literals' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_method_literals.php', 'Smarty_Internal_Method_LoadFilter' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_method_loadfilter.php', 'Smarty_Internal_Method_LoadPlugin' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_method_loadplugin.php', 'Smarty_Internal_Method_MustCompile' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_method_mustcompile.php', 'Smarty_Internal_Method_RegisterCacheResource' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_method_registercacheresource.php', 'Smarty_Internal_Method_RegisterClass' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_method_registerclass.php', 'Smarty_Internal_Method_RegisterDefaultConfigHandler' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_method_registerdefaultconfighandler.php', 'Smarty_Internal_Method_RegisterDefaultPluginHandler' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_method_registerdefaultpluginhandler.php', 'Smarty_Internal_Method_RegisterDefaultTemplateHandler' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_method_registerdefaulttemplatehandler.php', 'Smarty_Internal_Method_RegisterFilter' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_method_registerfilter.php', 'Smarty_Internal_Method_RegisterObject' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_method_registerobject.php', 'Smarty_Internal_Method_RegisterPlugin' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_method_registerplugin.php', 'Smarty_Internal_Method_RegisterResource' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_method_registerresource.php', 'Smarty_Internal_Method_SetAutoloadFilters' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_method_setautoloadfilters.php', 'Smarty_Internal_Method_SetDebugTemplate' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_method_setdebugtemplate.php', 'Smarty_Internal_Method_SetDefaultModifiers' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_method_setdefaultmodifiers.php', 'Smarty_Internal_Method_UnloadFilter' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_method_unloadfilter.php', 'Smarty_Internal_Method_UnregisterCacheResource' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_method_unregistercacheresource.php', 'Smarty_Internal_Method_UnregisterFilter' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_method_unregisterfilter.php', 'Smarty_Internal_Method_UnregisterObject' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_method_unregisterobject.php', 'Smarty_Internal_Method_UnregisterPlugin' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_method_unregisterplugin.php', 'Smarty_Internal_Method_UnregisterResource' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_method_unregisterresource.php', 'Smarty_Internal_Nocache_Insert' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_nocache_insert.php', 'Smarty_Internal_ParseTree' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_parsetree.php', 'Smarty_Internal_ParseTree_Code' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_parsetree_code.php', 'Smarty_Internal_ParseTree_Dq' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_parsetree_dq.php', 'Smarty_Internal_ParseTree_DqContent' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_parsetree_dqcontent.php', 'Smarty_Internal_ParseTree_Tag' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_parsetree_tag.php', 'Smarty_Internal_ParseTree_Template' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_parsetree_template.php', 'Smarty_Internal_ParseTree_Text' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_parsetree_text.php', 'Smarty_Internal_Resource_Eval' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_resource_eval.php', 'Smarty_Internal_Resource_Extends' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_resource_extends.php', 'Smarty_Internal_Resource_File' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_resource_file.php', 'Smarty_Internal_Resource_Php' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_resource_php.php', 'Smarty_Internal_Resource_Registered' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_resource_registered.php', 'Smarty_Internal_Resource_Stream' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_resource_stream.php', 'Smarty_Internal_Resource_String' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_resource_string.php', 'Smarty_Internal_Runtime_CacheModify' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_runtime_cachemodify.php', 'Smarty_Internal_Runtime_CacheResourceFile' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_runtime_cacheresourcefile.php', 'Smarty_Internal_Runtime_Capture' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_runtime_capture.php', 'Smarty_Internal_Runtime_CodeFrame' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_runtime_codeframe.php', 'Smarty_Internal_Runtime_FilterHandler' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_runtime_filterhandler.php', 'Smarty_Internal_Runtime_Foreach' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_runtime_foreach.php', 'Smarty_Internal_Runtime_GetIncludePath' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_runtime_getincludepath.php', 'Smarty_Internal_Runtime_Inheritance' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_runtime_inheritance.php', 'Smarty_Internal_Runtime_Make_Nocache' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_runtime_make_nocache.php', 'Smarty_Internal_Runtime_TplFunction' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_runtime_tplfunction.php', 'Smarty_Internal_Runtime_UpdateCache' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_runtime_updatecache.php', 'Smarty_Internal_Runtime_UpdateScope' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_runtime_updatescope.php', 'Smarty_Internal_Runtime_WriteFile' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_runtime_writefile.php', 'Smarty_Internal_SmartyTemplateCompiler' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_smartytemplatecompiler.php', 'Smarty_Internal_Template' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_template.php', 'Smarty_Internal_TemplateBase' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_templatebase.php', 'Smarty_Internal_TemplateCompilerBase' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_templatecompilerbase.php', 'Smarty_Internal_Templatelexer' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_templatelexer.php', 'Smarty_Internal_Templateparser' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_templateparser.php', 'Smarty_Internal_TestInstall' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_testinstall.php', 'Smarty_Internal_Undefined' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_undefined.php', 'Smarty_Resource' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_resource.php', 'Smarty_Resource_Custom' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_resource_custom.php', 'Smarty_Resource_Recompiled' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_resource_recompiled.php', 'Smarty_Resource_Uncompiled' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_resource_uncompiled.php', 'Smarty_Security' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_security.php', 'Smarty_Template_Cached' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_template_cached.php', 'Smarty_Template_Compiled' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_template_compiled.php', 'Smarty_Template_Config' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_template_config.php', 'Smarty_Template_Resource_Base' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_template_resource_base.php', 'Smarty_Template_Source' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_template_source.php', 'Smarty_Undefined_Variable' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_undefined_variable.php', 'Smarty_Variable' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_variable.php', 'Stringable' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Stringable.php', 'TCPDF' => __DIR__ . '/..' . '/tecnickcom/tcpdf/tcpdf.php', 'TCPDF2DBarcode' => __DIR__ . '/..' . '/tecnickcom/tcpdf/tcpdf_barcodes_2d.php', 'TCPDFBarcode' => __DIR__ . '/..' . '/tecnickcom/tcpdf/tcpdf_barcodes_1d.php', 'TCPDF_COLORS' => __DIR__ . '/..' . '/tecnickcom/tcpdf/include/tcpdf_colors.php', 'TCPDF_FILTERS' => __DIR__ . '/..' . '/tecnickcom/tcpdf/include/tcpdf_filters.php', 'TCPDF_FONTS' => __DIR__ . '/..' . '/tecnickcom/tcpdf/include/tcpdf_fonts.php', 'TCPDF_FONT_DATA' => __DIR__ . '/..' . '/tecnickcom/tcpdf/include/tcpdf_font_data.php', 'TCPDF_IMAGES' => __DIR__ . '/..' . '/tecnickcom/tcpdf/include/tcpdf_images.php', 'TCPDF_IMPORT' => __DIR__ . '/..' . '/tecnickcom/tcpdf/tcpdf_import.php', 'TCPDF_PARSER' => __DIR__ . '/..' . '/tecnickcom/tcpdf/tcpdf_parser.php', 'TCPDF_STATIC' => __DIR__ . '/..' . '/tecnickcom/tcpdf/include/tcpdf_static.php', 'TPC_yyStackEntry' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_configfileparser.php', 'TP_yyStackEntry' => __DIR__ . '/..' . '/smarty/smarty/libs/sysplugins/smarty_internal_templateparser.php', 'UnhandledMatchError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php', 'ValueError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/ValueError.php', 'mindplay\\readable' => __DIR__ . '/..' . '/mindplay/readable/src/readable.php', 'net\\authorize\\api\\constants\\ANetEnvironment' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/constants/ANetEnvironment.php', 'net\\authorize\\api\\contract\\v1\\ANetApiRequestType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ANetApiRequestType.php', 'net\\authorize\\api\\contract\\v1\\ANetApiResponseType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ANetApiResponseType.php', 'net\\authorize\\api\\contract\\v1\\ARBCancelSubscriptionRequest' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ARBCancelSubscriptionRequest.php', 'net\\authorize\\api\\contract\\v1\\ARBCancelSubscriptionResponse' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ARBCancelSubscriptionResponse.php', 'net\\authorize\\api\\contract\\v1\\ARBCreateSubscriptionRequest' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ARBCreateSubscriptionRequest.php', 'net\\authorize\\api\\contract\\v1\\ARBCreateSubscriptionResponse' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ARBCreateSubscriptionResponse.php', 'net\\authorize\\api\\contract\\v1\\ARBGetSubscriptionListRequest' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ARBGetSubscriptionListRequest.php', 'net\\authorize\\api\\contract\\v1\\ARBGetSubscriptionListResponse' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ARBGetSubscriptionListResponse.php', 'net\\authorize\\api\\contract\\v1\\ARBGetSubscriptionListSortingType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ARBGetSubscriptionListSortingType.php', 'net\\authorize\\api\\contract\\v1\\ARBGetSubscriptionRequest' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ARBGetSubscriptionRequest.php', 'net\\authorize\\api\\contract\\v1\\ARBGetSubscriptionResponse' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ARBGetSubscriptionResponse.php', 'net\\authorize\\api\\contract\\v1\\ARBGetSubscriptionStatusRequest' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ARBGetSubscriptionStatusRequest.php', 'net\\authorize\\api\\contract\\v1\\ARBGetSubscriptionStatusResponse' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ARBGetSubscriptionStatusResponse.php', 'net\\authorize\\api\\contract\\v1\\ARBSubscriptionMaskedType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ARBSubscriptionMaskedType.php', 'net\\authorize\\api\\contract\\v1\\ARBSubscriptionType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ARBSubscriptionType.php', 'net\\authorize\\api\\contract\\v1\\ARBUpdateSubscriptionRequest' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ARBUpdateSubscriptionRequest.php', 'net\\authorize\\api\\contract\\v1\\ARBUpdateSubscriptionResponse' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ARBUpdateSubscriptionResponse.php', 'net\\authorize\\api\\contract\\v1\\ArbTransactionType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ArbTransactionType.php', 'net\\authorize\\api\\contract\\v1\\ArrayOfSettingType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ArrayOfSettingType.php', 'net\\authorize\\api\\contract\\v1\\AuDeleteType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/AuDeleteType.php', 'net\\authorize\\api\\contract\\v1\\AuDetailsType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/AuDetailsType.php', 'net\\authorize\\api\\contract\\v1\\AuResponseType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/AuResponseType.php', 'net\\authorize\\api\\contract\\v1\\AuUpdateType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/AuUpdateType.php', 'net\\authorize\\api\\contract\\v1\\AuthenticateTestRequest' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/AuthenticateTestRequest.php', 'net\\authorize\\api\\contract\\v1\\AuthenticateTestResponse' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/AuthenticateTestResponse.php', 'net\\authorize\\api\\contract\\v1\\BankAccountMaskedType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/BankAccountMaskedType.php', 'net\\authorize\\api\\contract\\v1\\BankAccountType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/BankAccountType.php', 'net\\authorize\\api\\contract\\v1\\BatchDetailsType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/BatchDetailsType.php', 'net\\authorize\\api\\contract\\v1\\BatchStatisticType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/BatchStatisticType.php', 'net\\authorize\\api\\contract\\v1\\CardArtType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CardArtType.php', 'net\\authorize\\api\\contract\\v1\\CcAuthenticationType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CcAuthenticationType.php', 'net\\authorize\\api\\contract\\v1\\ContactDetailType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ContactDetailType.php', 'net\\authorize\\api\\contract\\v1\\CreateCustomerPaymentProfileRequest' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CreateCustomerPaymentProfileRequest.php', 'net\\authorize\\api\\contract\\v1\\CreateCustomerPaymentProfileResponse' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CreateCustomerPaymentProfileResponse.php', 'net\\authorize\\api\\contract\\v1\\CreateCustomerProfileFromTransactionRequest' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CreateCustomerProfileFromTransactionRequest.php', 'net\\authorize\\api\\contract\\v1\\CreateCustomerProfileRequest' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CreateCustomerProfileRequest.php', 'net\\authorize\\api\\contract\\v1\\CreateCustomerProfileResponse' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CreateCustomerProfileResponse.php', 'net\\authorize\\api\\contract\\v1\\CreateCustomerProfileTransactionRequest' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CreateCustomerProfileTransactionRequest.php', 'net\\authorize\\api\\contract\\v1\\CreateCustomerProfileTransactionResponse' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CreateCustomerProfileTransactionResponse.php', 'net\\authorize\\api\\contract\\v1\\CreateCustomerShippingAddressRequest' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CreateCustomerShippingAddressRequest.php', 'net\\authorize\\api\\contract\\v1\\CreateCustomerShippingAddressResponse' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CreateCustomerShippingAddressResponse.php', 'net\\authorize\\api\\contract\\v1\\CreateProfileResponseType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CreateProfileResponseType.php', 'net\\authorize\\api\\contract\\v1\\CreateTransactionRequest' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CreateTransactionRequest.php', 'net\\authorize\\api\\contract\\v1\\CreateTransactionResponse' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CreateTransactionResponse.php', 'net\\authorize\\api\\contract\\v1\\CreditCardMaskedType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CreditCardMaskedType.php', 'net\\authorize\\api\\contract\\v1\\CreditCardSimpleType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CreditCardSimpleType.php', 'net\\authorize\\api\\contract\\v1\\CreditCardTrackType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CreditCardTrackType.php', 'net\\authorize\\api\\contract\\v1\\CreditCardType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CreditCardType.php', 'net\\authorize\\api\\contract\\v1\\CustomerAddressExType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CustomerAddressExType.php', 'net\\authorize\\api\\contract\\v1\\CustomerAddressType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CustomerAddressType.php', 'net\\authorize\\api\\contract\\v1\\CustomerDataType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CustomerDataType.php', 'net\\authorize\\api\\contract\\v1\\CustomerPaymentProfileBaseType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CustomerPaymentProfileBaseType.php', 'net\\authorize\\api\\contract\\v1\\CustomerPaymentProfileExType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CustomerPaymentProfileExType.php', 'net\\authorize\\api\\contract\\v1\\CustomerPaymentProfileListItemType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CustomerPaymentProfileListItemType.php', 'net\\authorize\\api\\contract\\v1\\CustomerPaymentProfileMaskedType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CustomerPaymentProfileMaskedType.php', 'net\\authorize\\api\\contract\\v1\\CustomerPaymentProfileSortingType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CustomerPaymentProfileSortingType.php', 'net\\authorize\\api\\contract\\v1\\CustomerPaymentProfileType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CustomerPaymentProfileType.php', 'net\\authorize\\api\\contract\\v1\\CustomerProfileBaseType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CustomerProfileBaseType.php', 'net\\authorize\\api\\contract\\v1\\CustomerProfileExType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CustomerProfileExType.php', 'net\\authorize\\api\\contract\\v1\\CustomerProfileIdType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CustomerProfileIdType.php', 'net\\authorize\\api\\contract\\v1\\CustomerProfileInfoExType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CustomerProfileInfoExType.php', 'net\\authorize\\api\\contract\\v1\\CustomerProfileMaskedType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CustomerProfileMaskedType.php', 'net\\authorize\\api\\contract\\v1\\CustomerProfilePaymentType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CustomerProfilePaymentType.php', 'net\\authorize\\api\\contract\\v1\\CustomerProfileSummaryType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CustomerProfileSummaryType.php', 'net\\authorize\\api\\contract\\v1\\CustomerProfileType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CustomerProfileType.php', 'net\\authorize\\api\\contract\\v1\\CustomerType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/CustomerType.php', 'net\\authorize\\api\\contract\\v1\\DecryptPaymentDataRequest' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/DecryptPaymentDataRequest.php', 'net\\authorize\\api\\contract\\v1\\DecryptPaymentDataResponse' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/DecryptPaymentDataResponse.php', 'net\\authorize\\api\\contract\\v1\\DeleteCustomerPaymentProfileRequest' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/DeleteCustomerPaymentProfileRequest.php', 'net\\authorize\\api\\contract\\v1\\DeleteCustomerPaymentProfileResponse' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/DeleteCustomerPaymentProfileResponse.php', 'net\\authorize\\api\\contract\\v1\\DeleteCustomerProfileRequest' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/DeleteCustomerProfileRequest.php', 'net\\authorize\\api\\contract\\v1\\DeleteCustomerProfileResponse' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/DeleteCustomerProfileResponse.php', 'net\\authorize\\api\\contract\\v1\\DeleteCustomerShippingAddressRequest' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/DeleteCustomerShippingAddressRequest.php', 'net\\authorize\\api\\contract\\v1\\DeleteCustomerShippingAddressResponse' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/DeleteCustomerShippingAddressResponse.php', 'net\\authorize\\api\\contract\\v1\\DriversLicenseMaskedType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/DriversLicenseMaskedType.php', 'net\\authorize\\api\\contract\\v1\\DriversLicenseType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/DriversLicenseType.php', 'net\\authorize\\api\\contract\\v1\\EmailSettingsType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/EmailSettingsType.php', 'net\\authorize\\api\\contract\\v1\\EmvTagType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/EmvTagType.php', 'net\\authorize\\api\\contract\\v1\\EncryptedTrackDataType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/EncryptedTrackDataType.php', 'net\\authorize\\api\\contract\\v1\\EnumCollection' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/EnumCollection.php', 'net\\authorize\\api\\contract\\v1\\ErrorResponse' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ErrorResponse.php', 'net\\authorize\\api\\contract\\v1\\ExtendedAmountType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ExtendedAmountType.php', 'net\\authorize\\api\\contract\\v1\\FDSFilterType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/FDSFilterType.php', 'net\\authorize\\api\\contract\\v1\\FingerPrintType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/FingerPrintType.php', 'net\\authorize\\api\\contract\\v1\\FraudInformationType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/FraudInformationType.php', 'net\\authorize\\api\\contract\\v1\\GetAUJobDetailsRequest' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetAUJobDetailsRequest.php', 'net\\authorize\\api\\contract\\v1\\GetAUJobDetailsResponse' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetAUJobDetailsResponse.php', 'net\\authorize\\api\\contract\\v1\\GetAUJobSummaryRequest' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetAUJobSummaryRequest.php', 'net\\authorize\\api\\contract\\v1\\GetAUJobSummaryResponse' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetAUJobSummaryResponse.php', 'net\\authorize\\api\\contract\\v1\\GetBatchStatisticsRequest' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetBatchStatisticsRequest.php', 'net\\authorize\\api\\contract\\v1\\GetBatchStatisticsResponse' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetBatchStatisticsResponse.php', 'net\\authorize\\api\\contract\\v1\\GetCustomerPaymentProfileListRequest' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetCustomerPaymentProfileListRequest.php', 'net\\authorize\\api\\contract\\v1\\GetCustomerPaymentProfileListResponse' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetCustomerPaymentProfileListResponse.php', 'net\\authorize\\api\\contract\\v1\\GetCustomerPaymentProfileNonceRequest' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetCustomerPaymentProfileNonceRequest.php', 'net\\authorize\\api\\contract\\v1\\GetCustomerPaymentProfileNonceResponse' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetCustomerPaymentProfileNonceResponse.php', 'net\\authorize\\api\\contract\\v1\\GetCustomerPaymentProfileRequest' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetCustomerPaymentProfileRequest.php', 'net\\authorize\\api\\contract\\v1\\GetCustomerPaymentProfileResponse' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetCustomerPaymentProfileResponse.php', 'net\\authorize\\api\\contract\\v1\\GetCustomerProfileIdsRequest' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetCustomerProfileIdsRequest.php', 'net\\authorize\\api\\contract\\v1\\GetCustomerProfileIdsResponse' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetCustomerProfileIdsResponse.php', 'net\\authorize\\api\\contract\\v1\\GetCustomerProfileRequest' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetCustomerProfileRequest.php', 'net\\authorize\\api\\contract\\v1\\GetCustomerProfileResponse' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetCustomerProfileResponse.php', 'net\\authorize\\api\\contract\\v1\\GetCustomerShippingAddressRequest' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetCustomerShippingAddressRequest.php', 'net\\authorize\\api\\contract\\v1\\GetCustomerShippingAddressResponse' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetCustomerShippingAddressResponse.php', 'net\\authorize\\api\\contract\\v1\\GetHostedPaymentPageRequest' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetHostedPaymentPageRequest.php', 'net\\authorize\\api\\contract\\v1\\GetHostedPaymentPageResponse' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetHostedPaymentPageResponse.php', 'net\\authorize\\api\\contract\\v1\\GetHostedProfilePageRequest' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetHostedProfilePageRequest.php', 'net\\authorize\\api\\contract\\v1\\GetHostedProfilePageResponse' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetHostedProfilePageResponse.php', 'net\\authorize\\api\\contract\\v1\\GetMerchantDetailsRequest' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetMerchantDetailsRequest.php', 'net\\authorize\\api\\contract\\v1\\GetMerchantDetailsResponse' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetMerchantDetailsResponse.php', 'net\\authorize\\api\\contract\\v1\\GetSettledBatchListRequest' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetSettledBatchListRequest.php', 'net\\authorize\\api\\contract\\v1\\GetSettledBatchListResponse' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetSettledBatchListResponse.php', 'net\\authorize\\api\\contract\\v1\\GetTransactionDetailsRequest' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetTransactionDetailsRequest.php', 'net\\authorize\\api\\contract\\v1\\GetTransactionDetailsResponse' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetTransactionDetailsResponse.php', 'net\\authorize\\api\\contract\\v1\\GetTransactionListForCustomerRequest' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetTransactionListForCustomerRequest.php', 'net\\authorize\\api\\contract\\v1\\GetTransactionListRequest' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetTransactionListRequest.php', 'net\\authorize\\api\\contract\\v1\\GetTransactionListResponse' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetTransactionListResponse.php', 'net\\authorize\\api\\contract\\v1\\GetUnsettledTransactionListRequest' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetUnsettledTransactionListRequest.php', 'net\\authorize\\api\\contract\\v1\\GetUnsettledTransactionListResponse' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/GetUnsettledTransactionListResponse.php', 'net\\authorize\\api\\contract\\v1\\HeldTransactionRequestType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/HeldTransactionRequestType.php', 'net\\authorize\\api\\contract\\v1\\ImpersonationAuthenticationType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ImpersonationAuthenticationType.php', 'net\\authorize\\api\\contract\\v1\\IsAliveRequest' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/IsAliveRequest.php', 'net\\authorize\\api\\contract\\v1\\IsAliveResponse' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/IsAliveResponse.php', 'net\\authorize\\api\\contract\\v1\\KeyBlockType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/KeyBlockType.php', 'net\\authorize\\api\\contract\\v1\\KeyManagementSchemeType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/KeyManagementSchemeType.php', 'net\\authorize\\api\\contract\\v1\\KeyManagementSchemeType\\DUKPTAType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/KeyManagementSchemeType/DUKPTAType.php', 'net\\authorize\\api\\contract\\v1\\KeyManagementSchemeType\\DUKPTAType\\DeviceInfoAType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/KeyManagementSchemeType/DUKPTAType/DeviceInfoAType.php', 'net\\authorize\\api\\contract\\v1\\KeyManagementSchemeType\\DUKPTAType\\EncryptedDataAType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/KeyManagementSchemeType/DUKPTAType/EncryptedDataAType.php', 'net\\authorize\\api\\contract\\v1\\KeyManagementSchemeType\\DUKPTAType\\ModeAType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/KeyManagementSchemeType/DUKPTAType/ModeAType.php', 'net\\authorize\\api\\contract\\v1\\KeyValueType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/KeyValueType.php', 'net\\authorize\\api\\contract\\v1\\LineItemType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/LineItemType.php', 'net\\authorize\\api\\contract\\v1\\ListOfAUDetailsType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ListOfAUDetailsType.php', 'net\\authorize\\api\\contract\\v1\\LogoutRequest' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/LogoutRequest.php', 'net\\authorize\\api\\contract\\v1\\LogoutResponse' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/LogoutResponse.php', 'net\\authorize\\api\\contract\\v1\\MerchantAuthenticationType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/MerchantAuthenticationType.php', 'net\\authorize\\api\\contract\\v1\\MerchantContactType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/MerchantContactType.php', 'net\\authorize\\api\\contract\\v1\\MessagesType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/MessagesType.php', 'net\\authorize\\api\\contract\\v1\\MessagesType\\MessageAType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/MessagesType/MessageAType.php', 'net\\authorize\\api\\contract\\v1\\MobileDeviceLoginRequest' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/MobileDeviceLoginRequest.php', 'net\\authorize\\api\\contract\\v1\\MobileDeviceLoginResponse' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/MobileDeviceLoginResponse.php', 'net\\authorize\\api\\contract\\v1\\MobileDeviceRegistrationRequest' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/MobileDeviceRegistrationRequest.php', 'net\\authorize\\api\\contract\\v1\\MobileDeviceRegistrationResponse' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/MobileDeviceRegistrationResponse.php', 'net\\authorize\\api\\contract\\v1\\MobileDeviceType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/MobileDeviceType.php', 'net\\authorize\\api\\contract\\v1\\NameAndAddressType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/NameAndAddressType.php', 'net\\authorize\\api\\contract\\v1\\OpaqueDataType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/OpaqueDataType.php', 'net\\authorize\\api\\contract\\v1\\OrderExType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/OrderExType.php', 'net\\authorize\\api\\contract\\v1\\OrderType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/OrderType.php', 'net\\authorize\\api\\contract\\v1\\OtherTaxType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/OtherTaxType.php', 'net\\authorize\\api\\contract\\v1\\PagingType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/PagingType.php', 'net\\authorize\\api\\contract\\v1\\PayPalType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/PayPalType.php', 'net\\authorize\\api\\contract\\v1\\PaymentDetailsType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/PaymentDetailsType.php', 'net\\authorize\\api\\contract\\v1\\PaymentEmvType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/PaymentEmvType.php', 'net\\authorize\\api\\contract\\v1\\PaymentMaskedType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/PaymentMaskedType.php', 'net\\authorize\\api\\contract\\v1\\PaymentProfileType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/PaymentProfileType.php', 'net\\authorize\\api\\contract\\v1\\PaymentScheduleType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/PaymentScheduleType.php', 'net\\authorize\\api\\contract\\v1\\PaymentScheduleType\\IntervalAType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/PaymentScheduleType/IntervalAType.php', 'net\\authorize\\api\\contract\\v1\\PaymentSimpleType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/PaymentSimpleType.php', 'net\\authorize\\api\\contract\\v1\\PaymentType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/PaymentType.php', 'net\\authorize\\api\\contract\\v1\\PermissionType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/PermissionType.php', 'net\\authorize\\api\\contract\\v1\\ProcessingOptionsType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ProcessingOptionsType.php', 'net\\authorize\\api\\contract\\v1\\ProcessorType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ProcessorType.php', 'net\\authorize\\api\\contract\\v1\\ProfileTransAmountType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ProfileTransAmountType.php', 'net\\authorize\\api\\contract\\v1\\ProfileTransAuthCaptureType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ProfileTransAuthCaptureType.php', 'net\\authorize\\api\\contract\\v1\\ProfileTransAuthOnlyType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ProfileTransAuthOnlyType.php', 'net\\authorize\\api\\contract\\v1\\ProfileTransCaptureOnlyType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ProfileTransCaptureOnlyType.php', 'net\\authorize\\api\\contract\\v1\\ProfileTransOrderType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ProfileTransOrderType.php', 'net\\authorize\\api\\contract\\v1\\ProfileTransPriorAuthCaptureType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ProfileTransPriorAuthCaptureType.php', 'net\\authorize\\api\\contract\\v1\\ProfileTransRefundType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ProfileTransRefundType.php', 'net\\authorize\\api\\contract\\v1\\ProfileTransVoidType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ProfileTransVoidType.php', 'net\\authorize\\api\\contract\\v1\\ProfileTransactionType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ProfileTransactionType.php', 'net\\authorize\\api\\contract\\v1\\ReturnedItemType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ReturnedItemType.php', 'net\\authorize\\api\\contract\\v1\\SecurePaymentContainerErrorType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/SecurePaymentContainerErrorType.php', 'net\\authorize\\api\\contract\\v1\\SecurePaymentContainerRequest' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/SecurePaymentContainerRequest.php', 'net\\authorize\\api\\contract\\v1\\SecurePaymentContainerResponse' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/SecurePaymentContainerResponse.php', 'net\\authorize\\api\\contract\\v1\\SendCustomerTransactionReceiptRequest' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/SendCustomerTransactionReceiptRequest.php', 'net\\authorize\\api\\contract\\v1\\SendCustomerTransactionReceiptResponse' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/SendCustomerTransactionReceiptResponse.php', 'net\\authorize\\api\\contract\\v1\\SettingType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/SettingType.php', 'net\\authorize\\api\\contract\\v1\\SolutionType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/SolutionType.php', 'net\\authorize\\api\\contract\\v1\\SubMerchantType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/SubMerchantType.php', 'net\\authorize\\api\\contract\\v1\\SubscriptionCustomerProfileType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/SubscriptionCustomerProfileType.php', 'net\\authorize\\api\\contract\\v1\\SubscriptionDetailType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/SubscriptionDetailType.php', 'net\\authorize\\api\\contract\\v1\\SubscriptionPaymentType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/SubscriptionPaymentType.php', 'net\\authorize\\api\\contract\\v1\\SubsequentAuthInformationType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/SubsequentAuthInformationType.php', 'net\\authorize\\api\\contract\\v1\\TokenMaskedType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/TokenMaskedType.php', 'net\\authorize\\api\\contract\\v1\\TransRetailInfoType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/TransRetailInfoType.php', 'net\\authorize\\api\\contract\\v1\\TransactionDetailsType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/TransactionDetailsType.php', 'net\\authorize\\api\\contract\\v1\\TransactionDetailsType\\EmvDetailsAType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/TransactionDetailsType/EmvDetailsAType.php', 'net\\authorize\\api\\contract\\v1\\TransactionDetailsType\\EmvDetailsAType\\TagAType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/TransactionDetailsType/EmvDetailsAType/TagAType.php', 'net\\authorize\\api\\contract\\v1\\TransactionListSortingType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/TransactionListSortingType.php', 'net\\authorize\\api\\contract\\v1\\TransactionRequestType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/TransactionRequestType.php', 'net\\authorize\\api\\contract\\v1\\TransactionRequestType\\UserFieldsAType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/TransactionRequestType/UserFieldsAType.php', 'net\\authorize\\api\\contract\\v1\\TransactionResponseType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/TransactionResponseType.php', 'net\\authorize\\api\\contract\\v1\\TransactionResponseType\\EmvResponseAType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/TransactionResponseType/EmvResponseAType.php', 'net\\authorize\\api\\contract\\v1\\TransactionResponseType\\EmvResponseAType\\TagsAType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/TransactionResponseType/EmvResponseAType/TagsAType.php', 'net\\authorize\\api\\contract\\v1\\TransactionResponseType\\ErrorsAType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/TransactionResponseType/ErrorsAType.php', 'net\\authorize\\api\\contract\\v1\\TransactionResponseType\\ErrorsAType\\ErrorAType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/TransactionResponseType/ErrorsAType/ErrorAType.php', 'net\\authorize\\api\\contract\\v1\\TransactionResponseType\\MessagesAType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/TransactionResponseType/MessagesAType.php', 'net\\authorize\\api\\contract\\v1\\TransactionResponseType\\MessagesAType\\MessageAType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/TransactionResponseType/MessagesAType/MessageAType.php', 'net\\authorize\\api\\contract\\v1\\TransactionResponseType\\PrePaidCardAType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/TransactionResponseType/PrePaidCardAType.php', 'net\\authorize\\api\\contract\\v1\\TransactionResponseType\\SecureAcceptanceAType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/TransactionResponseType/SecureAcceptanceAType.php', 'net\\authorize\\api\\contract\\v1\\TransactionResponseType\\SplitTenderPaymentsAType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/TransactionResponseType/SplitTenderPaymentsAType.php', 'net\\authorize\\api\\contract\\v1\\TransactionResponseType\\SplitTenderPaymentsAType\\SplitTenderPaymentAType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/TransactionResponseType/SplitTenderPaymentsAType/SplitTenderPaymentAType.php', 'net\\authorize\\api\\contract\\v1\\TransactionResponseType\\UserFieldsAType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/TransactionResponseType/UserFieldsAType.php', 'net\\authorize\\api\\contract\\v1\\TransactionSummaryType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/TransactionSummaryType.php', 'net\\authorize\\api\\contract\\v1\\UpdateCustomerPaymentProfileRequest' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/UpdateCustomerPaymentProfileRequest.php', 'net\\authorize\\api\\contract\\v1\\UpdateCustomerPaymentProfileResponse' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/UpdateCustomerPaymentProfileResponse.php', 'net\\authorize\\api\\contract\\v1\\UpdateCustomerProfileRequest' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/UpdateCustomerProfileRequest.php', 'net\\authorize\\api\\contract\\v1\\UpdateCustomerProfileResponse' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/UpdateCustomerProfileResponse.php', 'net\\authorize\\api\\contract\\v1\\UpdateCustomerShippingAddressRequest' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/UpdateCustomerShippingAddressRequest.php', 'net\\authorize\\api\\contract\\v1\\UpdateCustomerShippingAddressResponse' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/UpdateCustomerShippingAddressResponse.php', 'net\\authorize\\api\\contract\\v1\\UpdateHeldTransactionRequest' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/UpdateHeldTransactionRequest.php', 'net\\authorize\\api\\contract\\v1\\UpdateHeldTransactionResponse' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/UpdateHeldTransactionResponse.php', 'net\\authorize\\api\\contract\\v1\\UpdateSplitTenderGroupRequest' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/UpdateSplitTenderGroupRequest.php', 'net\\authorize\\api\\contract\\v1\\UpdateSplitTenderGroupResponse' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/UpdateSplitTenderGroupResponse.php', 'net\\authorize\\api\\contract\\v1\\UserFieldType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/UserFieldType.php', 'net\\authorize\\api\\contract\\v1\\ValidateCustomerPaymentProfileRequest' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ValidateCustomerPaymentProfileRequest.php', 'net\\authorize\\api\\contract\\v1\\ValidateCustomerPaymentProfileResponse' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/ValidateCustomerPaymentProfileResponse.php', 'net\\authorize\\api\\contract\\v1\\WebCheckOutDataType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/WebCheckOutDataType.php', 'net\\authorize\\api\\contract\\v1\\WebCheckOutDataTypeTokenType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/contract/v1/WebCheckOutDataTypeTokenType.php', 'net\\authorize\\api\\controller\\ARBCancelSubscriptionController' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/controller/ARBCancelSubscriptionController.php', 'net\\authorize\\api\\controller\\ARBCreateSubscriptionController' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/controller/ARBCreateSubscriptionController.php', 'net\\authorize\\api\\controller\\ARBGetSubscriptionController' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/controller/ARBGetSubscriptionController.php', 'net\\authorize\\api\\controller\\ARBGetSubscriptionListController' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/controller/ARBGetSubscriptionListController.php', 'net\\authorize\\api\\controller\\ARBGetSubscriptionStatusController' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/controller/ARBGetSubscriptionStatusController.php', 'net\\authorize\\api\\controller\\ARBUpdateSubscriptionController' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/controller/ARBUpdateSubscriptionController.php', 'net\\authorize\\api\\controller\\AuthenticateTestController' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/controller/AuthenticateTestController.php', 'net\\authorize\\api\\controller\\CreateCustomerPaymentProfileController' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/controller/CreateCustomerPaymentProfileController.php', 'net\\authorize\\api\\controller\\CreateCustomerProfileController' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/controller/CreateCustomerProfileController.php', 'net\\authorize\\api\\controller\\CreateCustomerProfileFromTransactionController' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/controller/CreateCustomerProfileFromTransactionController.php', 'net\\authorize\\api\\controller\\CreateCustomerProfileTransactionController' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/controller/CreateCustomerProfileTransactionController.php', 'net\\authorize\\api\\controller\\CreateCustomerShippingAddressController' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/controller/CreateCustomerShippingAddressController.php', 'net\\authorize\\api\\controller\\CreateTransactionController' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/controller/CreateTransactionController.php', 'net\\authorize\\api\\controller\\DecryptPaymentDataController' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/controller/DecryptPaymentDataController.php', 'net\\authorize\\api\\controller\\DeleteCustomerPaymentProfileController' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/controller/DeleteCustomerPaymentProfileController.php', 'net\\authorize\\api\\controller\\DeleteCustomerProfileController' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/controller/DeleteCustomerProfileController.php', 'net\\authorize\\api\\controller\\DeleteCustomerShippingAddressController' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/controller/DeleteCustomerShippingAddressController.php', 'net\\authorize\\api\\controller\\GetAUJobDetailsController' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/controller/GetAUJobDetailsController.php', 'net\\authorize\\api\\controller\\GetAUJobSummaryController' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/controller/GetAUJobSummaryController.php', 'net\\authorize\\api\\controller\\GetBatchStatisticsController' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/controller/GetBatchStatisticsController.php', 'net\\authorize\\api\\controller\\GetCustomerPaymentProfileController' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/controller/GetCustomerPaymentProfileController.php', 'net\\authorize\\api\\controller\\GetCustomerPaymentProfileListController' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/controller/GetCustomerPaymentProfileListController.php', 'net\\authorize\\api\\controller\\GetCustomerPaymentProfileNonceController' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/controller/GetCustomerPaymentProfileNonceController.php', 'net\\authorize\\api\\controller\\GetCustomerProfileController' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/controller/GetCustomerProfileController.php', 'net\\authorize\\api\\controller\\GetCustomerProfileIdsController' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/controller/GetCustomerProfileIdsController.php', 'net\\authorize\\api\\controller\\GetCustomerShippingAddressController' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/controller/GetCustomerShippingAddressController.php', 'net\\authorize\\api\\controller\\GetHostedPaymentPageController' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/controller/GetHostedPaymentPageController.php', 'net\\authorize\\api\\controller\\GetHostedProfilePageController' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/controller/GetHostedProfilePageController.php', 'net\\authorize\\api\\controller\\GetMerchantDetailsController' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/controller/GetMerchantDetailsController.php', 'net\\authorize\\api\\controller\\GetSettledBatchListController' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/controller/GetSettledBatchListController.php', 'net\\authorize\\api\\controller\\GetTransactionDetailsController' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/controller/GetTransactionDetailsController.php', 'net\\authorize\\api\\controller\\GetTransactionListController' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/controller/GetTransactionListController.php', 'net\\authorize\\api\\controller\\GetTransactionListForCustomerController' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/controller/GetTransactionListForCustomerController.php', 'net\\authorize\\api\\controller\\GetUnsettledTransactionListController' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/controller/GetUnsettledTransactionListController.php', 'net\\authorize\\api\\controller\\IsAliveController' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/controller/IsAliveController.php', 'net\\authorize\\api\\controller\\LogoutController' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/controller/LogoutController.php', 'net\\authorize\\api\\controller\\MobileDeviceLoginController' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/controller/MobileDeviceLoginController.php', 'net\\authorize\\api\\controller\\MobileDeviceRegistrationController' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/controller/MobileDeviceRegistrationController.php', 'net\\authorize\\api\\controller\\SecurePaymentContainerController' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/controller/SecurePaymentContainerController.php', 'net\\authorize\\api\\controller\\SendCustomerTransactionReceiptController' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/controller/SendCustomerTransactionReceiptController.php', 'net\\authorize\\api\\controller\\UpdateCustomerPaymentProfileController' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/controller/UpdateCustomerPaymentProfileController.php', 'net\\authorize\\api\\controller\\UpdateCustomerProfileController' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/controller/UpdateCustomerProfileController.php', 'net\\authorize\\api\\controller\\UpdateCustomerShippingAddressController' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/controller/UpdateCustomerShippingAddressController.php', 'net\\authorize\\api\\controller\\UpdateHeldTransactionController' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/controller/UpdateHeldTransactionController.php', 'net\\authorize\\api\\controller\\UpdateSplitTenderGroupController' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/controller/UpdateSplitTenderGroupController.php', 'net\\authorize\\api\\controller\\ValidateCustomerPaymentProfileController' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/controller/ValidateCustomerPaymentProfileController.php', 'net\\authorize\\api\\controller\\base\\ApiOperationBase' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/controller/base/ApiOperationBase.php', 'net\\authorize\\api\\controller\\base\\IApiOperation' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/api/controller/base/IApiOperation.php', 'net\\authorize\\util\\ANetSensitiveFields' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/util/ANetSensitiveFields.php', 'net\\authorize\\util\\Helpers' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/util/Helpers.php', 'net\\authorize\\util\\HttpClient' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/util/HttpClient.php', 'net\\authorize\\util\\Log' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/util/Log.php', 'net\\authorize\\util\\LogFactory' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/util/LogFactory.php', 'net\\authorize\\util\\SensitiveDataConfigType' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/util/SensitiveDataConfigType.php', 'net\\authorize\\util\\SensitiveTag' => __DIR__ . '/..' . '/authorizenet/authorizenet/lib/net/authorize/util/SensitiveTag.php', ); public static function getInitializer(ClassLoader $loader) { return \Closure::bind(function () use ($loader) { $loader->prefixLengthsPsr4 = ComposerStaticInitb3c17cb4854742e046e1a14170163c9a::$prefixLengthsPsr4; $loader->prefixDirsPsr4 = ComposerStaticInitb3c17cb4854742e046e1a14170163c9a::$prefixDirsPsr4; $loader->fallbackDirsPsr4 = ComposerStaticInitb3c17cb4854742e046e1a14170163c9a::$fallbackDirsPsr4; $loader->prefixesPsr0 = ComposerStaticInitb3c17cb4854742e046e1a14170163c9a::$prefixesPsr0; $loader->classMap = ComposerStaticInitb3c17cb4854742e046e1a14170163c9a::$classMap; }, null, ClassLoader::class); } } ClassLoader.php 0000644 00000037304 14736103146 0007465 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Autoload; /** * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. * * $loader = new \Composer\Autoload\ClassLoader(); * * // register classes with namespaces * $loader->add('Symfony\Component', __DIR__.'/component'); * $loader->add('Symfony', __DIR__.'/framework'); * * // activate the autoloader * $loader->register(); * * // to enable searching the include path (eg. for PEAR packages) * $loader->setUseIncludePath(true); * * In this example, if you try to use a class in the Symfony\Component * namespace or one of its children (Symfony\Component\Console for instance), * the autoloader will first look for the class under the component/ * directory, and it will then fallback to the framework/ directory if not * found before giving up. * * This class is loosely based on the Symfony UniversalClassLoader. * * @author Fabien Potencier <fabien@symfony.com> * @author Jordi Boggiano <j.boggiano@seld.be> * @see https://www.php-fig.org/psr/psr-0/ * @see https://www.php-fig.org/psr/psr-4/ */ class ClassLoader { /** @var ?string */ private $vendorDir; // PSR-4 /** * @var array[] * @psalm-var array<string, array<string, int>> */ private $prefixLengthsPsr4 = array(); /** * @var array[] * @psalm-var array<string, array<int, string>> */ private $prefixDirsPsr4 = array(); /** * @var array[] * @psalm-var array<string, string> */ private $fallbackDirsPsr4 = array(); // PSR-0 /** * @var array[] * @psalm-var array<string, array<string, string[]>> */ private $prefixesPsr0 = array(); /** * @var array[] * @psalm-var array<string, string> */ private $fallbackDirsPsr0 = array(); /** @var bool */ private $useIncludePath = false; /** * @var string[] * @psalm-var array<string, string> */ private $classMap = array(); /** @var bool */ private $classMapAuthoritative = false; /** * @var bool[] * @psalm-var array<string, bool> */ private $missingClasses = array(); /** @var ?string */ private $apcuPrefix; /** * @var self[] */ private static $registeredLoaders = array(); /** * @param ?string $vendorDir */ public function __construct($vendorDir = null) { $this->vendorDir = $vendorDir; } /** * @return string[] */ public function getPrefixes() { if (!empty($this->prefixesPsr0)) { return call_user_func_array('array_merge', array_values($this->prefixesPsr0)); } return array(); } /** * @return array[] * @psalm-return array<string, array<int, string>> */ public function getPrefixesPsr4() { return $this->prefixDirsPsr4; } /** * @return array[] * @psalm-return array<string, string> */ public function getFallbackDirs() { return $this->fallbackDirsPsr0; } /** * @return array[] * @psalm-return array<string, string> */ public function getFallbackDirsPsr4() { return $this->fallbackDirsPsr4; } /** * @return string[] Array of classname => path * @psalm-return array<string, string> */ public function getClassMap() { return $this->classMap; } /** * @param string[] $classMap Class to filename map * @psalm-param array<string, string> $classMap * * @return void */ public function addClassMap(array $classMap) { if ($this->classMap) { $this->classMap = array_merge($this->classMap, $classMap); } else { $this->classMap = $classMap; } } /** * Registers a set of PSR-0 directories for a given prefix, either * appending or prepending to the ones previously set for this prefix. * * @param string $prefix The prefix * @param string[]|string $paths The PSR-0 root directories * @param bool $prepend Whether to prepend the directories * * @return void */ public function add($prefix, $paths, $prepend = false) { if (!$prefix) { if ($prepend) { $this->fallbackDirsPsr0 = array_merge( (array) $paths, $this->fallbackDirsPsr0 ); } else { $this->fallbackDirsPsr0 = array_merge( $this->fallbackDirsPsr0, (array) $paths ); } return; } $first = $prefix[0]; if (!isset($this->prefixesPsr0[$first][$prefix])) { $this->prefixesPsr0[$first][$prefix] = (array) $paths; return; } if ($prepend) { $this->prefixesPsr0[$first][$prefix] = array_merge( (array) $paths, $this->prefixesPsr0[$first][$prefix] ); } else { $this->prefixesPsr0[$first][$prefix] = array_merge( $this->prefixesPsr0[$first][$prefix], (array) $paths ); } } /** * Registers a set of PSR-4 directories for a given namespace, either * appending or prepending to the ones previously set for this namespace. * * @param string $prefix The prefix/namespace, with trailing '\\' * @param string[]|string $paths The PSR-4 base directories * @param bool $prepend Whether to prepend the directories * * @throws \InvalidArgumentException * * @return void */ public function addPsr4($prefix, $paths, $prepend = false) { if (!$prefix) { // Register directories for the root namespace. if ($prepend) { $this->fallbackDirsPsr4 = array_merge( (array) $paths, $this->fallbackDirsPsr4 ); } else { $this->fallbackDirsPsr4 = array_merge( $this->fallbackDirsPsr4, (array) $paths ); } } elseif (!isset($this->prefixDirsPsr4[$prefix])) { // Register directories for a new namespace. $length = strlen($prefix); if ('\\' !== $prefix[$length - 1]) { throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); } $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; $this->prefixDirsPsr4[$prefix] = (array) $paths; } elseif ($prepend) { // Prepend directories for an already registered namespace. $this->prefixDirsPsr4[$prefix] = array_merge( (array) $paths, $this->prefixDirsPsr4[$prefix] ); } else { // Append directories for an already registered namespace. $this->prefixDirsPsr4[$prefix] = array_merge( $this->prefixDirsPsr4[$prefix], (array) $paths ); } } /** * Registers a set of PSR-0 directories for a given prefix, * replacing any others previously set for this prefix. * * @param string $prefix The prefix * @param string[]|string $paths The PSR-0 base directories * * @return void */ public function set($prefix, $paths) { if (!$prefix) { $this->fallbackDirsPsr0 = (array) $paths; } else { $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; } } /** * Registers a set of PSR-4 directories for a given namespace, * replacing any others previously set for this namespace. * * @param string $prefix The prefix/namespace, with trailing '\\' * @param string[]|string $paths The PSR-4 base directories * * @throws \InvalidArgumentException * * @return void */ public function setPsr4($prefix, $paths) { if (!$prefix) { $this->fallbackDirsPsr4 = (array) $paths; } else { $length = strlen($prefix); if ('\\' !== $prefix[$length - 1]) { throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); } $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; $this->prefixDirsPsr4[$prefix] = (array) $paths; } } /** * Turns on searching the include path for class files. * * @param bool $useIncludePath * * @return void */ public function setUseIncludePath($useIncludePath) { $this->useIncludePath = $useIncludePath; } /** * Can be used to check if the autoloader uses the include path to check * for classes. * * @return bool */ public function getUseIncludePath() { return $this->useIncludePath; } /** * Turns off searching the prefix and fallback directories for classes * that have not been registered with the class map. * * @param bool $classMapAuthoritative * * @return void */ public function setClassMapAuthoritative($classMapAuthoritative) { $this->classMapAuthoritative = $classMapAuthoritative; } /** * Should class lookup fail if not found in the current class map? * * @return bool */ public function isClassMapAuthoritative() { return $this->classMapAuthoritative; } /** * APCu prefix to use to cache found/not-found classes, if the extension is enabled. * * @param string|null $apcuPrefix * * @return void */ public function setApcuPrefix($apcuPrefix) { $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; } /** * The APCu prefix in use, or null if APCu caching is not enabled. * * @return string|null */ public function getApcuPrefix() { return $this->apcuPrefix; } /** * Registers this instance as an autoloader. * * @param bool $prepend Whether to prepend the autoloader or not * * @return void */ public function register($prepend = false) { spl_autoload_register(array($this, 'loadClass'), true, $prepend); if (null === $this->vendorDir) { return; } if ($prepend) { self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders; } else { unset(self::$registeredLoaders[$this->vendorDir]); self::$registeredLoaders[$this->vendorDir] = $this; } } /** * Unregisters this instance as an autoloader. * * @return void */ public function unregister() { spl_autoload_unregister(array($this, 'loadClass')); if (null !== $this->vendorDir) { unset(self::$registeredLoaders[$this->vendorDir]); } } /** * Loads the given class or interface. * * @param string $class The name of the class * @return true|null True if loaded, null otherwise */ public function loadClass($class) { if ($file = $this->findFile($class)) { includeFile($file); return true; } return null; } /** * Finds the path to the file where the class is defined. * * @param string $class The name of the class * * @return string|false The path if found, false otherwise */ public function findFile($class) { // class map lookup if (isset($this->classMap[$class])) { return $this->classMap[$class]; } if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { return false; } if (null !== $this->apcuPrefix) { $file = apcu_fetch($this->apcuPrefix.$class, $hit); if ($hit) { return $file; } } $file = $this->findFileWithExtension($class, '.php'); // Search for Hack files if we are running on HHVM if (false === $file && defined('HHVM_VERSION')) { $file = $this->findFileWithExtension($class, '.hh'); } if (null !== $this->apcuPrefix) { apcu_add($this->apcuPrefix.$class, $file); } if (false === $file) { // Remember that this class does not exist. $this->missingClasses[$class] = true; } return $file; } /** * Returns the currently registered loaders indexed by their corresponding vendor directories. * * @return self[] */ public static function getRegisteredLoaders() { return self::$registeredLoaders; } /** * @param string $class * @param string $ext * @return string|false */ private function findFileWithExtension($class, $ext) { // PSR-4 lookup $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; $first = $class[0]; if (isset($this->prefixLengthsPsr4[$first])) { $subPath = $class; while (false !== $lastPos = strrpos($subPath, '\\')) { $subPath = substr($subPath, 0, $lastPos); $search = $subPath . '\\'; if (isset($this->prefixDirsPsr4[$search])) { $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); foreach ($this->prefixDirsPsr4[$search] as $dir) { if (file_exists($file = $dir . $pathEnd)) { return $file; } } } } } // PSR-4 fallback dirs foreach ($this->fallbackDirsPsr4 as $dir) { if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { return $file; } } // PSR-0 lookup if (false !== $pos = strrpos($class, '\\')) { // namespaced class name $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); } else { // PEAR-like class name $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; } if (isset($this->prefixesPsr0[$first])) { foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { if (0 === strpos($class, $prefix)) { foreach ($dirs as $dir) { if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { return $file; } } } } } // PSR-0 fallback dirs foreach ($this->fallbackDirsPsr0 as $dir) { if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { return $file; } } // PSR-0 include paths. if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { return $file; } return false; } } /** * Scope isolated include. * * Prevents access to $this/self from included files. * * @param string $file * @return void * @private */ function includeFile($file) { include $file; } LICENSE 0000644 00000002056 14736103146 0005561 0 ustar 00 Copyright (c) Nils Adermann, Jordi Boggiano Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. InstalledVersions.php 0000644 00000035217 14736103146 0010742 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer; use Composer\Autoload\ClassLoader; use Composer\Semver\VersionParser; /** * This class is copied in every Composer installed project and available to all * * See also https://getcomposer.org/doc/07-runtime.md#installed-versions * * To require its presence, you can require `composer-runtime-api ^2.0` */ class InstalledVersions { /** * @var mixed[]|null * @psalm-var array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}|array{}|null */ private static $installed; /** * @var bool|null */ private static $canGetVendors; /** * @var array[] * @psalm-var array<string, array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}> */ private static $installedByVendor = array(); /** * Returns a list of all package names which are present, either by being installed, replaced or provided * * @return string[] * @psalm-return list<string> */ public static function getInstalledPackages() { $packages = array(); foreach (self::getInstalled() as $installed) { $packages[] = array_keys($installed['versions']); } if (1 === \count($packages)) { return $packages[0]; } return array_keys(array_flip(\call_user_func_array('array_merge', $packages))); } /** * Returns a list of all package names with a specific type e.g. 'library' * * @param string $type * @return string[] * @psalm-return list<string> */ public static function getInstalledPackagesByType($type) { $packagesByType = array(); foreach (self::getInstalled() as $installed) { foreach ($installed['versions'] as $name => $package) { if (isset($package['type']) && $package['type'] === $type) { $packagesByType[] = $name; } } } return $packagesByType; } /** * Checks whether the given package is installed * * This also returns true if the package name is provided or replaced by another package * * @param string $packageName * @param bool $includeDevRequirements * @return bool */ public static function isInstalled($packageName, $includeDevRequirements = true) { foreach (self::getInstalled() as $installed) { if (isset($installed['versions'][$packageName])) { return $includeDevRequirements || empty($installed['versions'][$packageName]['dev_requirement']); } } return false; } /** * Checks whether the given package satisfies a version constraint * * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call: * * Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3') * * @param VersionParser $parser Install composer/semver to have access to this class and functionality * @param string $packageName * @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package * @return bool */ public static function satisfies(VersionParser $parser, $packageName, $constraint) { $constraint = $parser->parseConstraints($constraint); $provided = $parser->parseConstraints(self::getVersionRanges($packageName)); return $provided->matches($constraint); } /** * Returns a version constraint representing all the range(s) which are installed for a given package * * It is easier to use this via isInstalled() with the $constraint argument if you need to check * whether a given version of a package is installed, and not just whether it exists * * @param string $packageName * @return string Version constraint usable with composer/semver */ public static function getVersionRanges($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } $ranges = array(); if (isset($installed['versions'][$packageName]['pretty_version'])) { $ranges[] = $installed['versions'][$packageName]['pretty_version']; } if (array_key_exists('aliases', $installed['versions'][$packageName])) { $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']); } if (array_key_exists('replaced', $installed['versions'][$packageName])) { $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']); } if (array_key_exists('provided', $installed['versions'][$packageName])) { $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']); } return implode(' || ', $ranges); } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } /** * @param string $packageName * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present */ public static function getVersion($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } if (!isset($installed['versions'][$packageName]['version'])) { return null; } return $installed['versions'][$packageName]['version']; } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } /** * @param string $packageName * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present */ public static function getPrettyVersion($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } if (!isset($installed['versions'][$packageName]['pretty_version'])) { return null; } return $installed['versions'][$packageName]['pretty_version']; } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } /** * @param string $packageName * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference */ public static function getReference($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } if (!isset($installed['versions'][$packageName]['reference'])) { return null; } return $installed['versions'][$packageName]['reference']; } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } /** * @param string $packageName * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path. */ public static function getInstallPath($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null; } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } /** * @return array * @psalm-return array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string} */ public static function getRootPackage() { $installed = self::getInstalled(); return $installed[0]['root']; } /** * Returns the raw installed.php data for custom implementations * * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect. * @return array[] * @psalm-return array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>} */ public static function getRawData() { @trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED); if (null === self::$installed) { // only require the installed.php file if this file is loaded from its dumped location, // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 if (substr(__DIR__, -8, 1) !== 'C') { self::$installed = include __DIR__ . '/installed.php'; } else { self::$installed = array(); } } return self::$installed; } /** * Returns the raw data of all installed.php which are currently loaded for custom implementations * * @return array[] * @psalm-return list<array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}> */ public static function getAllRawData() { return self::getInstalled(); } /** * Lets you reload the static array from another file * * This is only useful for complex integrations in which a project needs to use * this class but then also needs to execute another project's autoloader in process, * and wants to ensure both projects have access to their version of installed.php. * * A typical case would be PHPUnit, where it would need to make sure it reads all * the data it needs from this class, then call reload() with * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure * the project in which it runs can then also use this class safely, without * interference between PHPUnit's dependencies and the project's dependencies. * * @param array[] $data A vendor/composer/installed.php data set * @return void * * @psalm-param array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>} $data */ public static function reload($data) { self::$installed = $data; self::$installedByVendor = array(); } /** * @return array[] * @psalm-return list<array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}> */ private static function getInstalled() { if (null === self::$canGetVendors) { self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders'); } $installed = array(); if (self::$canGetVendors) { foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { if (isset(self::$installedByVendor[$vendorDir])) { $installed[] = self::$installedByVendor[$vendorDir]; } elseif (is_file($vendorDir.'/composer/installed.php')) { $installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php'; if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) { self::$installed = $installed[count($installed) - 1]; } } } } if (null === self::$installed) { // only require the installed.php file if this file is loaded from its dumped location, // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 if (substr(__DIR__, -8, 1) !== 'C') { self::$installed = require __DIR__ . '/installed.php'; } else { self::$installed = array(); } } $installed[] = self::$installed; return $installed; } } composer/res/composer-repository-schema.json 0000644 00000007760 14736103146 0015400 0 ustar 00 { "$schema": "http://json-schema.org/draft-04/schema#", "description": "A representation of packages metadata.", "type": "object", "oneOf": [ { "required": [ "packages" ] }, { "required": [ "providers" ] }, { "required": [ "provider-includes", "providers-url" ] } ], "properties": { "packages": { "type": ["object", "array"], "description": "A hashmap of package names in the form of <vendor>/<name>.", "additionalProperties": { "$ref": "#/definitions/versions" } }, "providers-url": { "type": "string", "description": "Endpoint to retrieve provider data from, e.g. '/p/%package%$%hash%.json'." }, "provider-includes": { "type": "object", "description": "A hashmap of provider listings.", "additionalProperties": { "$ref": "#/definitions/provider" } }, "providers": { "type": "object", "description": "A hashmap of package names in the form of <vendor>/<name>.", "additionalProperties": { "$ref": "#/definitions/provider" } }, "notify-batch": { "type": "string", "description": "Endpoint to call after multiple packages have been installed, e.g. '/downloads/'." }, "search": { "type": "string", "description": "Endpoint that provides search capabilities, e.g. '/search.json?q=%query%&type=%type%'." }, "warning": { "type": "string", "description": "A message that will be output by Composer as a warning when this source is consulted." } }, "definitions": { "versions": { "type": "object", "description": "A hashmap of versions and their metadata.", "additionalProperties": { "$ref": "#/definitions/version" } }, "version": { "type": "object", "oneOf": [ { "$ref": "#/definitions/package" }, { "$ref": "#/definitions/metapackage" } ] }, "package-base": { "properties": { "name": { "type": "string" }, "type": { "type": "string" }, "version": { "type": "string" }, "version_normalized": { "type": "string", "description": "Normalized version, optional but can save computational time on client side." }, "autoload": { "type": "object" }, "require": { "type": "object" }, "replace": { "type": "object" }, "conflict": { "type": "object" }, "provide": { "type": "object" }, "time": { "type": "string" } }, "additionalProperties": true }, "package": { "allOf": [ { "$ref": "#/definitions/package-base" }, { "properties": { "dist": { "type": "object" }, "source": { "type": "object" } } }, { "oneOf": [ { "required": [ "name", "version", "source" ] }, { "required": [ "name", "version", "dist" ] } ] } ] }, "metapackage": { "allOf": [ { "$ref": "#/definitions/package-base" }, { "properties": { "type": { "type": "string", "enum": [ "metapackage" ] } }, "required": [ "name", "version", "type" ] } ] }, "provider": { "type": "object", "properties": { "sha256": { "type": "string", "description": "Hash value that can be used to validate the resource." } } } } } composer/res/composer-schema.json 0000644 00000116515 14736103146 0013162 0 ustar 00 { "$schema": "http://json-schema.org/draft-04/schema#", "name": "Package", "type": "object", "additionalProperties": false, "required": [ "name", "description" ], "properties": { "name": { "type": "string", "description": "Package name, including 'vendor-name/' prefix." }, "type": { "description": "Package type, either 'library' for common packages, 'composer-plugin' for plugins, 'metapackage' for empty packages, or a custom type ([a-z0-9-]+) defined by whatever project this package applies to.", "type": "string", "pattern": "^[a-z0-9-]+$" }, "target-dir": { "description": "DEPRECATED: Forces the package to be installed into the given subdirectory path. This is used for autoloading PSR-0 packages that do not contain their full path. Use forward slashes for cross-platform compatibility.", "type": "string" }, "description": { "type": "string", "description": "Short package description." }, "keywords": { "type": "array", "items": { "type": "string", "description": "A tag/keyword that this package relates to." } }, "homepage": { "type": "string", "description": "Homepage URL for the project.", "format": "uri" }, "readme": { "type": "string", "description": "Relative path to the readme document." }, "version": { "type": "string", "description": "Package version, see https://getcomposer.org/doc/04-schema.md#version for more info on valid schemes.", "pattern": "^v?\\d+(((\\.\\d+)?\\.\\d+)?\\.\\d+)?|^dev-" }, "time": { "type": "string", "description": "Package release date, in 'YYYY-MM-DD', 'YYYY-MM-DD HH:MM:SS' or 'YYYY-MM-DDTHH:MM:SSZ' format." }, "license": { "type": ["string", "array"], "description": "License name. Or an array of license names." }, "authors": { "$ref": "#/definitions/authors" }, "require": { "type": "object", "description": "This is a hash of package name (keys) and version constraints (values) that are required to run this package.", "additionalProperties": { "type": "string" } }, "replace": { "type": "object", "description": "This is a hash of package name (keys) and version constraints (values) that can be replaced by this package.", "additionalProperties": { "type": "string" } }, "conflict": { "type": "object", "description": "This is a hash of package name (keys) and version constraints (values) that conflict with this package.", "additionalProperties": { "type": "string" } }, "provide": { "type": "object", "description": "This is a hash of package name (keys) and version constraints (values) that this package provides in addition to this package's name.", "additionalProperties": { "type": "string" } }, "require-dev": { "type": "object", "description": "This is a hash of package name (keys) and version constraints (values) that this package requires for developing it (testing tools and such).", "additionalProperties": { "type": "string" } }, "suggest": { "type": "object", "description": "This is a hash of package name (keys) and descriptions (values) that this package suggests work well with it (this will be suggested to the user during installation).", "additionalProperties": { "type": "string" } }, "config": { "type": "object", "description": "Composer options.", "properties": { "process-timeout": { "type": "integer", "description": "The timeout in seconds for process executions, defaults to 300 (5mins)." }, "use-include-path": { "type": "boolean", "description": "If true, the Composer autoloader will also look for classes in the PHP include path." }, "preferred-install": { "type": ["string", "object"], "description": "The install method Composer will prefer to use, defaults to auto and can be any of source, dist, auto, or a hash of {\"pattern\": \"preference\"}." }, "notify-on-install": { "type": "boolean", "description": "Composer allows repositories to define a notification URL, so that they get notified whenever a package from that repository is installed. This option allows you to disable that behaviour, defaults to true." }, "github-protocols": { "type": "array", "description": "A list of protocols to use for github.com clones, in priority order, defaults to [\"git\", \"https\", \"http\"].", "items": { "type": "string" } }, "github-oauth": { "type": "object", "description": "A hash of domain name => github API oauth tokens, typically {\"github.com\":\"<token>\"}.", "additionalProperties": { "type": "string" } }, "gitlab-oauth": { "type": "object", "description": "A hash of domain name => gitlab API oauth tokens, typically {\"gitlab.com\":\"<token>\"}.", "additionalProperties": { "type": "string" } }, "gitlab-token": { "type": "object", "description": "A hash of domain name => gitlab private tokens, typically {\"gitlab.com\":\"<token>\"}.", "additionalProperties": { "type": "string" } }, "bearer": { "type": "object", "description": "A hash of domain name => bearer authentication token, for example {\"example.com\":\"<token>\"}.", "additionalProperties": { "type": "string" } }, "disable-tls": { "type": "boolean", "description": "Defaults to `false`. If set to true all HTTPS URLs will be tried with HTTP instead and no network level encryption is performed. Enabling this is a security risk and is NOT recommended. The better way is to enable the php_openssl extension in php.ini." }, "secure-http": { "type": "boolean", "description": "Defaults to `true`. If set to true only HTTPS URLs are allowed to be downloaded via Composer. If you really absolutely need HTTP access to something then you can disable it, but using \"Let's Encrypt\" to get a free SSL certificate is generally a better alternative." }, "cafile": { "type": "string", "description": "A way to set the path to the openssl CA file. In PHP 5.6+ you should rather set this via openssl.cafile in php.ini, although PHP 5.6+ should be able to detect your system CA file automatically." }, "capath": { "type": "string", "description": "If cafile is not specified or if the certificate is not found there, the directory pointed to by capath is searched for a suitable certificate. capath must be a correctly hashed certificate directory." }, "http-basic": { "type": "object", "description": "A hash of domain name => {\"username\": \"...\", \"password\": \"...\"}.", "additionalProperties": { "type": "object", "required": ["username", "password"], "properties": { "username": { "type": "string", "description": "The username used for HTTP Basic authentication" }, "password": { "type": "string", "description": "The password used for HTTP Basic authentication" } } } }, "store-auths": { "type": ["string", "boolean"], "description": "What to do after prompting for authentication, one of: true (store), false (do not store) or \"prompt\" (ask every time), defaults to prompt." }, "platform": { "type": "object", "description": "This is a hash of package name (keys) and version (values) that will be used to mock the platform packages on this machine.", "additionalProperties": { "type": "string" } }, "vendor-dir": { "type": "string", "description": "The location where all packages are installed, defaults to \"vendor\"." }, "bin-dir": { "type": "string", "description": "The location where all binaries are linked, defaults to \"vendor/bin\"." }, "data-dir": { "type": "string", "description": "The location where old phar files are stored, defaults to \"$home\" except on XDG Base Directory compliant unixes." }, "cache-dir": { "type": "string", "description": "The location where all caches are located, defaults to \"~/.composer/cache\" on *nix and \"%LOCALAPPDATA%\\Composer\" on windows." }, "cache-files-dir": { "type": "string", "description": "The location where files (zip downloads) are cached, defaults to \"{$cache-dir}/files\"." }, "cache-repo-dir": { "type": "string", "description": "The location where repo (git/hg repo clones) are cached, defaults to \"{$cache-dir}/repo\"." }, "cache-vcs-dir": { "type": "string", "description": "The location where vcs infos (git clones, github api calls, etc. when reading vcs repos) are cached, defaults to \"{$cache-dir}/vcs\"." }, "cache-ttl": { "type": "integer", "description": "The default cache time-to-live, defaults to 15552000 (6 months)." }, "cache-files-ttl": { "type": "integer", "description": "The cache time-to-live for files, defaults to the value of cache-ttl." }, "cache-files-maxsize": { "type": ["string", "integer"], "description": "The cache max size for the files cache, defaults to \"300MiB\"." }, "bin-compat": { "enum": ["auto", "full"], "description": "The compatibility of the binaries, defaults to \"auto\" (automatically guessed) and can be \"full\" (compatible with both Windows and Unix-based systems)." }, "discard-changes": { "type": ["string", "boolean"], "description": "The default style of handling dirty updates, defaults to false and can be any of true, false or \"stash\"." }, "autoloader-suffix": { "type": "string", "description": "Optional string to be used as a suffix for the generated Composer autoloader. When null a random one will be generated." }, "optimize-autoloader": { "type": "boolean", "description": "Always optimize when dumping the autoloader." }, "prepend-autoloader": { "type": "boolean", "description": "If false, the composer autoloader will not be prepended to existing autoloaders, defaults to true." }, "classmap-authoritative": { "type": "boolean", "description": "If true, the composer autoloader will not scan the filesystem for classes that are not found in the class map, defaults to false." }, "apcu-autoloader": { "type": "boolean", "description": "If true, the Composer autoloader will check for APCu and use it to cache found/not-found classes when the extension is enabled, defaults to false." }, "github-domains": { "type": "array", "description": "A list of domains to use in github mode. This is used for GitHub Enterprise setups, defaults to [\"github.com\"].", "items": { "type": "string" } }, "github-expose-hostname": { "type": "boolean", "description": "Defaults to true. If set to false, the OAuth tokens created to access the github API will have a date instead of the machine hostname." }, "gitlab-domains": { "type": "array", "description": "A list of domains to use in gitlab mode. This is used for custom GitLab setups, defaults to [\"gitlab.com\"].", "items": { "type": "string" } }, "use-github-api": { "type": "boolean", "description": "Defaults to true. If set to false, globally disables the use of the GitHub API for all GitHub repositories and clones the repository as it would for any other repository." }, "archive-format": { "type": "string", "description": "The default archiving format when not provided on cli, defaults to \"tar\"." }, "archive-dir": { "type": "string", "description": "The default archive path when not provided on cli, defaults to \".\"." }, "htaccess-protect": { "type": "boolean", "description": "Defaults to true. If set to false, Composer will not create .htaccess files in the composer home, cache, and data directories." }, "sort-packages": { "type": "boolean", "description": "Defaults to false. If set to true, Composer will sort packages when adding/updating a new dependency." }, "lock": { "type": "boolean", "description": "Defaults to true. If set to false, Composer will not create a composer.lock file." } } }, "extra": { "type": ["object", "array"], "description": "Arbitrary extra data that can be used by plugins, for example, package of type composer-plugin may have a 'class' key defining an installer class name.", "additionalProperties": true }, "autoload": { "$ref": "#/definitions/autoload" }, "autoload-dev": { "type": "object", "description": "Description of additional autoload rules for development purpose (eg. a test suite).", "properties": { "psr-0": { "type": "object", "description": "This is a hash of namespaces (keys) and the directories they can be found into (values, can be arrays of paths) by the autoloader.", "additionalProperties": { "type": ["string", "array"], "items": { "type": "string" } } }, "psr-4": { "type": "object", "description": "This is a hash of namespaces (keys) and the PSR-4 directories they can map to (values, can be arrays of paths) by the autoloader.", "additionalProperties": { "type": ["string", "array"], "items": { "type": "string" } } }, "classmap": { "type": "array", "description": "This is an array of directories that contain classes to be included in the class-map generation process." }, "files": { "type": "array", "description": "This is an array of files that are always required on every request." } } }, "archive": { "type": ["object"], "description": "Options for creating package archives for distribution.", "properties": { "exclude": { "type": "array", "description": "A list of patterns for paths to exclude or include if prefixed with an exclamation mark." } } }, "repositories": { "type": ["object", "array"], "description": "A set of additional repositories where packages can be found.", "additionalProperties": { "oneOf": [ { "$ref": "#/definitions/repository" }, { "type": "boolean", "enum": [false] } ] }, "items": { "oneOf": [ { "$ref": "#/definitions/repository" }, { "type": "object", "additionalProperties": { "type": "boolean", "enum": [false] }, "minProperties": 1, "maxProperties": 1 } ] } }, "minimum-stability": { "type": ["string"], "description": "The minimum stability the packages must have to be install-able. Possible values are: dev, alpha, beta, RC, stable.", "pattern": "^dev|alpha|beta|rc|RC|stable$" }, "prefer-stable": { "type": ["boolean"], "description": "If set to true, stable packages will be preferred to dev packages when possible, even if the minimum-stability allows unstable packages." }, "bin": { "type": ["string", "array"], "description": "A set of files, or a single file, that should be treated as binaries and symlinked into bin-dir (from config).", "items": { "type": "string" } }, "include-path": { "type": ["array"], "description": "DEPRECATED: A list of directories which should get added to PHP's include path. This is only present to support legacy projects, and all new code should preferably use autoloading.", "items": { "type": "string" } }, "scripts": { "type": ["object"], "description": "Script listeners that will be executed before/after some events.", "properties": { "pre-install-cmd": { "type": ["array", "string"], "description": "Occurs before the install command is executed, contains one or more Class::method callables or shell commands." }, "post-install-cmd": { "type": ["array", "string"], "description": "Occurs after the install command is executed, contains one or more Class::method callables or shell commands." }, "pre-update-cmd": { "type": ["array", "string"], "description": "Occurs before the update command is executed, contains one or more Class::method callables or shell commands." }, "post-update-cmd": { "type": ["array", "string"], "description": "Occurs after the update command is executed, contains one or more Class::method callables or shell commands." }, "pre-status-cmd": { "type": ["array", "string"], "description": "Occurs before the status command is executed, contains one or more Class::method callables or shell commands." }, "post-status-cmd": { "type": ["array", "string"], "description": "Occurs after the status command is executed, contains one or more Class::method callables or shell commands." }, "pre-package-install": { "type": ["array", "string"], "description": "Occurs before a package is installed, contains one or more Class::method callables or shell commands." }, "post-package-install": { "type": ["array", "string"], "description": "Occurs after a package is installed, contains one or more Class::method callables or shell commands." }, "pre-package-update": { "type": ["array", "string"], "description": "Occurs before a package is updated, contains one or more Class::method callables or shell commands." }, "post-package-update": { "type": ["array", "string"], "description": "Occurs after a package is updated, contains one or more Class::method callables or shell commands." }, "pre-package-uninstall": { "type": ["array", "string"], "description": "Occurs before a package has been uninstalled, contains one or more Class::method callables or shell commands." }, "post-package-uninstall": { "type": ["array", "string"], "description": "Occurs after a package has been uninstalled, contains one or more Class::method callables or shell commands." }, "pre-autoload-dump": { "type": ["array", "string"], "description": "Occurs before the autoloader is dumped, contains one or more Class::method callables or shell commands." }, "post-autoload-dump": { "type": ["array", "string"], "description": "Occurs after the autoloader is dumped, contains one or more Class::method callables or shell commands." }, "post-root-package-install": { "type": ["array", "string"], "description": "Occurs after the root-package is installed, contains one or more Class::method callables or shell commands." }, "post-create-project-cmd": { "type": ["array", "string"], "description": "Occurs after the create-project command is executed, contains one or more Class::method callables or shell commands." } } }, "scripts-descriptions": { "type": ["object"], "description": "Descriptions for custom commands, shown in console help.", "additionalProperties": { "type": "string" } }, "support": { "type": "object", "properties": { "email": { "type": "string", "description": "Email address for support.", "format": "email" }, "issues": { "type": "string", "description": "URL to the issue tracker.", "format": "uri" }, "forum": { "type": "string", "description": "URL to the forum.", "format": "uri" }, "wiki": { "type": "string", "description": "URL to the wiki.", "format": "uri" }, "irc": { "type": "string", "description": "IRC channel for support, as irc://server/channel.", "format": "uri" }, "chat": { "type": "string", "description": "URL to the support chat.", "format": "uri" }, "source": { "type": "string", "description": "URL to browse or download the sources.", "format": "uri" }, "docs": { "type": "string", "description": "URL to the documentation.", "format": "uri" }, "rss": { "type": "string", "description": "URL to the RSS feed.", "format": "uri" } } }, "funding": { "type": "array", "description": "A list of options to fund the development and maintenance of the package.", "items": { "type": "object", "properties": { "type": { "type": "string", "description": "Type of funding or platform through which funding is possible." }, "url": { "type": "string", "description": "URL to a website with details on funding and a way to fund the package.", "format": "uri" } } } }, "non-feature-branches": { "type": ["array"], "description": "A set of string or regex patterns for non-numeric branch names that will not be handled as feature branches.", "items": { "type": "string" } }, "abandoned": { "type": ["boolean", "string"], "description": "Indicates whether this package has been abandoned, it can be boolean or a package name/URL pointing to a recommended alternative. Defaults to false." }, "_comment": { "type": ["array", "string"], "description": "A key to store comments in" } }, "definitions": { "authors": { "type": "array", "description": "List of authors that contributed to the package. This is typically the main maintainers, not the full list.", "items": { "type": "object", "additionalProperties": false, "required": [ "name"], "properties": { "name": { "type": "string", "description": "Full name of the author." }, "email": { "type": "string", "description": "Email address of the author.", "format": "email" }, "homepage": { "type": "string", "description": "Homepage URL for the author.", "format": "uri" }, "role": { "type": "string", "description": "Author's role in the project." } } } }, "autoload": { "type": "object", "description": "Description of how the package can be autoloaded.", "properties": { "psr-0": { "type": "object", "description": "This is a hash of namespaces (keys) and the directories they can be found in (values, can be arrays of paths) by the autoloader.", "additionalProperties": { "type": ["string", "array"], "items": { "type": "string" } } }, "psr-4": { "type": "object", "description": "This is a hash of namespaces (keys) and the PSR-4 directories they can map to (values, can be arrays of paths) by the autoloader.", "additionalProperties": { "type": ["string", "array"], "items": { "type": "string" } } }, "classmap": { "type": "array", "description": "This is an array of directories that contain classes to be included in the class-map generation process." }, "files": { "type": "array", "description": "This is an array of files that are always required on every request." }, "exclude-from-classmap": { "type": "array", "description": "This is an array of patterns to exclude from autoload classmap generation. (e.g. \"exclude-from-classmap\": [\"/test/\", \"/tests/\", \"/Tests/\"]" } } }, "repository": { "type": "object", "oneOf": [ { "$ref": "#/definitions/composer-repository" }, { "$ref": "#/definitions/vcs-repository" }, { "$ref": "#/definitions/path-repository" }, { "$ref": "#/definitions/artifact-repository" }, { "$ref": "#/definitions/pear-repository" }, { "$ref": "#/definitions/package-repository" } ] }, "composer-repository": { "type": "object", "required": ["type", "url"], "properties": { "type": { "type": "string", "enum": ["composer"] }, "url": { "type": "string" }, "options": { "type": "object", "additionalProperties": true }, "allow_ssl_downgrade": { "type": "boolean" }, "force-lazy-providers": { "type": "boolean" } } }, "vcs-repository": { "type": "object", "required": ["type", "url"], "properties": { "type": { "type": "string", "enum": ["vcs", "github", "git", "gitlab", "git-bitbucket", "hg", "hg-bitbucket", "fossil", "perforce", "svn"] }, "url": { "type": "string" }, "no-api": { "type": "boolean" }, "secure-http": { "type": "boolean" }, "svn-cache-credentials": { "type": "boolean" }, "trunk-path": { "type": ["string", "boolean"] }, "branches-path": { "type": ["string", "boolean"] }, "tags-path": { "type": ["string", "boolean"] }, "package-path": { "type": "string" }, "depot": { "type": "string" }, "branch": { "type": "string" }, "unique_perforce_client_name": { "type": "string" }, "p4user": { "type": "string" }, "p4password": { "type": "string" } } }, "path-repository": { "type": "object", "required": ["type", "url"], "properties": { "type": { "type": "string", "enum": ["path"] }, "url": { "type": "string" }, "options": { "type": "object", "properties": { "symlink": { "type": ["boolean", "null"] } }, "additionalProperties": true } } }, "artifact-repository": { "type": "object", "required": ["type", "url"], "properties": { "type": { "type": "string", "enum": ["artifact"] }, "url": { "type": "string" } } }, "pear-repository": { "type": "object", "required": ["type", "url"], "properties": { "type": { "type": "string", "enum": ["pear"] }, "url": { "type": "string" }, "vendor-alias": { "type": "string" } } }, "package-repository": { "type": "object", "required": ["type", "package"], "properties": { "type": { "type": "string", "enum": ["package"] }, "package": { "oneOf": [ { "$ref": "#/definitions/inline-package" }, { "type": "array", "items": { "$ref": "#/definitions/inline-package" } } ] } } }, "inline-package": { "type": "object", "required": ["name", "version"], "properties": { "name": { "type": "string", "description": "Package name, including 'vendor-name/' prefix." }, "type": { "type": "string" }, "target-dir": { "description": "DEPRECATED: Forces the package to be installed into the given subdirectory path. This is used for autoloading PSR-0 packages that do not contain their full path. Use forward slashes for cross-platform compatibility.", "type": "string" }, "description": { "type": "string" }, "keywords": { "type": "array", "items": { "type": "string" } }, "homepage": { "type": "string", "format": "uri" }, "version": { "type": "string" }, "time": { "type": "string" }, "license": { "type": [ "string", "array" ] }, "authors": { "$ref": "#/definitions/authors" }, "require": { "type": "object", "additionalProperties": { "type": "string" } }, "replace": { "type": "object", "additionalProperties": { "type": "string" } }, "conflict": { "type": "object", "additionalProperties": { "type": "string" } }, "provide": { "type": "object", "additionalProperties": { "type": "string" } }, "require-dev": { "type": "object", "additionalProperties": { "type": "string" } }, "suggest": { "type": "object", "additionalProperties": { "type": "string" } }, "extra": { "type": ["object", "array"], "additionalProperties": true }, "autoload": { "$ref": "#/definitions/autoload" }, "archive": { "type": ["object"], "properties": { "exclude": { "type": "array" } } }, "bin": { "type": ["string", "array"], "description": "A set of files, or a single file, that should be treated as binaries and symlinked into bin-dir (from config).", "items": { "type": "string" } }, "include-path": { "type": ["array"], "description": "DEPRECATED: A list of directories which should get added to PHP's include path. This is only present to support legacy projects, and all new code should preferably use autoloading.", "items": { "type": "string" } }, "source": { "type": "object", "required": ["type", "url", "reference"], "properties": { "type": { "type": "string" }, "url": { "type": "string" }, "reference": { "type": "string" }, "mirrors": { "type": "array" } } }, "dist": { "type": "object", "required": ["type", "url"], "properties": { "type": { "type": "string" }, "url": { "type": "string" }, "reference": { "type": "string" }, "shasum": { "type": "string" }, "mirrors": { "type": "array" } } } }, "additionalProperties": true } } } composer/res/cacert.pem 0000644 00000755043 14736103146 0011153 0 ustar 00 ## ## Bundle of CA Root Certificates ## ## Certificate data from Mozilla as of: Wed Jan 20 04:12:04 2016 ## ## 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: ## http://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.25. ## SHA1: 0ab47e2f41518f8d223eab517cb799e5b071231e ## 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----- Staat der Nederlanden Root CA ============================= -----BEGIN CERTIFICATE----- MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6 22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== -----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----- NetLock Notary (Class A) Root ============================= -----BEGIN CERTIFICATE----- MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC /tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7 tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6 4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0 ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5 ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM 8CgHrTwXZoi1/baI -----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----- CA Disig ======== -----BEGIN CERTIFICATE----- MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK QnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw MzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz bGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm GErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD Pw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo hwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt ymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w gfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P AQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz aWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff ZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa BgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t WDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3 mkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/ CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K ezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA 4Z7CRneC9VkGjCFMhwnN5ag= -----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----- composer/PORTING_INFO 0000644 00000003100 14736103146 0010252 0 ustar 00 * add rule * p = direct literal; always < 0 for installed rpm rules * d, if < 0 direct literal, if > 0 offset into whatprovides, if == 0 rule is assertion (look at p only) * * * A requires b, b provided by B1,B2,B3 => (-A|B1|B2|B3) * * p < 0 : pkg id of A * d > 0 : Offset in whatprovidesdata (list of providers of b) * * A conflicts b, b provided by B1,B2,B3 => (-A|-B1), (-A|-B2), (-A|-B3) * p < 0 : pkg id of A * d < 0 : Id of solvable (e.g. B1) * * d == 0: unary rule, assertion => (A) or (-A) * * Install: p > 0, d = 0 (A) user requested install * Remove: p < 0, d = 0 (-A) user requested remove (also: uninstallable) * Requires: p < 0, d > 0 (-A|B1|B2|...) d: <list of providers for requirement of p> * Updates: p > 0, d > 0 (A|B1|B2|...) d: <list of updates for solvable p> * Conflicts: p < 0, d < 0 (-A|-B) either p (conflict issuer) or d (conflict provider) (binary rule) * also used for obsoletes * ?: p > 0, d < 0 (A|-B) * No-op ?: p = 0, d = 0 (null) (used as policy rule placeholder) * * resulting watches: * ------------------ * Direct assertion (no watch needed)( if d <0 ) --> d = 0, w1 = p, w2 = 0 * Binary rule: p = first literal, d = 0, w2 = second literal, w1 = p * every other : w1 = p, w2 = whatprovidesdata[d]; * Disabled rule: w1 = 0 * * always returns a rule for non-rpm rules p > 0, d = 0, (A), w1 = p, w2 = 0 p < 0, d = 0, (-A), w1 = p, w2 = 0 p !=0, d = 0, (p|q), w1 = p, w2 = q composer/appveyor.yml 0000644 00000002064 14736103146 0010772 0 ustar 00 build: false shallow_clone: true platform: - x86 - x64 clone_folder: c:\projects\composer cache: - c:\tools\php -> appveyor.yml init: - SET PATH=C:\Program Files\OpenSSL;c:\tools\php;%PATH% - SET COMPOSER_NO_INTERACTION=1 - SET PHP=1 - SET ANSICON=121x90 (121x90) install: - IF EXIST c:\tools\php (SET PHP=0) - IF %PHP%==1 cinst -y OpenSSL.Light - IF %PHP%==1 cinst -y php - cd c:\tools\php - IF %PHP%==1 copy php.ini-production php.ini /Y - IF %PHP%==1 echo date.timezone="UTC" >> php.ini - IF %PHP%==1 echo extension_dir=ext >> php.ini - IF %PHP%==1 echo extension=php_openssl.dll >> php.ini - IF %PHP%==1 echo extension=php_mbstring.dll >> php.ini - IF %PHP%==1 echo extension=php_fileinfo.dll >> php.ini - IF %PHP%==1 echo @php %%~dp0composer.phar %%* > composer.bat - appveyor DownloadFile https://getcomposer.org/composer.phar - cd c:\projects\composer - composer install --prefer-source --no-progress test_script: - cd c:\projects\composer - vendor/bin/phpunit --colors=always composer/bin/compile 0000644 00000001706 14736103146 0010527 0 ustar 00 #!/usr/bin/env php <?php $cwd = getcwd(); chdir(__DIR__.'/../'); $ts = rtrim(shell_exec('git log -n1 --pretty=%ct HEAD')); if (!is_numeric($ts)) { echo 'Could not detect date using "git log -n1 --pretty=%ct HEAD"'.PHP_EOL; exit(1); } // Install with the current version to force it having the right ClassLoader version // Install without dev packages to clean up the included classmap from phpunit classes shell_exec('php bin/composer config autoloader-suffix ComposerPhar' . $ts); shell_exec('php bin/composer install -q --no-dev'); shell_exec('php bin/composer config autoloader-suffix --unset'); chdir($cwd); require __DIR__.'/../src/bootstrap.php'; use Composer\Compiler; error_reporting(-1); ini_set('display_errors', 1); try { $compiler = new Compiler(); $compiler->compile(); } catch (\Exception $e) { echo 'Failed to compile phar: ['.get_class($e).'] '.$e->getMessage().' at '.$e->getFile().':'.$e->getLine().PHP_EOL; exit(1); } composer/bin/composer 0000644 00000003335 14736103146 0010726 0 ustar 00 #!/usr/bin/env php <?php if (PHP_SAPI !== 'cli' && PHP_SAPI !== 'phpdbg') { echo 'Warning: Composer should be invoked via the CLI version of PHP, not the '.PHP_SAPI.' SAPI'.PHP_EOL; } setlocale(LC_ALL, 'C'); require __DIR__.'/../src/bootstrap.php'; use Composer\Console\Application; use Composer\XdebugHandler\XdebugHandler; error_reporting(-1); // Restart without Xdebug $xdebug = new XdebugHandler('Composer', '--ansi'); $xdebug->check(); unset($xdebug); if (defined('HHVM_VERSION') && version_compare(HHVM_VERSION, '4.0', '>=')) { echo 'HHVM 4.0 has dropped support for Composer, please use PHP instead. Aborting.'.PHP_EOL; exit(1); } if (function_exists('ini_set')) { @ini_set('display_errors', 1); $memoryInBytes = function ($value) { $unit = strtolower(substr($value, -1, 1)); $value = (int) $value; switch($unit) { case 'g': $value *= 1024; // no break (cumulative multiplier) case 'm': $value *= 1024; // no break (cumulative multiplier) case 'k': $value *= 1024; } return $value; }; $memoryLimit = trim(ini_get('memory_limit')); // Increase memory_limit if it is lower than 1.5GB if ($memoryLimit != -1 && $memoryInBytes($memoryLimit) < 1024 * 1024 * 1536) { @ini_set('memory_limit', '1536M'); } // Set user defined memory limit if ($memoryLimit = getenv('COMPOSER_MEMORY_LIMIT')) { @ini_set('memory_limit', $memoryLimit); } unset($memoryInBytes, $memoryLimit); } putenv('COMPOSER_BINARY='.realpath($_SERVER['argv'][0])); // run the command application $application = new Application(); $application->run(); composer/src/bootstrap.php 0000644 00000001311 14736103146 0011711 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ function includeIfExists($file) { return file_exists($file) ? include $file : false; } if ((!$loader = includeIfExists(__DIR__.'/../vendor/autoload.php')) && (!$loader = includeIfExists(__DIR__.'/../../../autoload.php'))) { echo 'You must set up the project dependencies using `composer install`'.PHP_EOL. 'See https://getcomposer.org/download/ for instructions on installing Composer'.PHP_EOL; exit(1); } return $loader; composer/src/Composer/Installer/PackageEvent.php 0000644 00000003524 14736103146 0015765 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Installer; use Composer\Composer; use Composer\IO\IOInterface; use Composer\DependencyResolver\Operation\OperationInterface; use Composer\DependencyResolver\PolicyInterface; use Composer\DependencyResolver\Pool; use Composer\DependencyResolver\Request; use Composer\Repository\CompositeRepository; /** * The Package Event. * * @author Jordi Boggiano <j.boggiano@seld.be> */ class PackageEvent extends InstallerEvent { /** * @var OperationInterface The package instance */ private $operation; /** * Constructor. * * @param string $eventName * @param Composer $composer * @param IOInterface $io * @param bool $devMode * @param PolicyInterface $policy * @param Pool $pool * @param CompositeRepository $installedRepo * @param Request $request * @param OperationInterface[] $operations * @param OperationInterface $operation */ public function __construct($eventName, Composer $composer, IOInterface $io, $devMode, PolicyInterface $policy, Pool $pool, CompositeRepository $installedRepo, Request $request, array $operations, OperationInterface $operation) { parent::__construct($eventName, $composer, $io, $devMode, $policy, $pool, $installedRepo, $request, $operations); $this->operation = $operation; } /** * Returns the package instance. * * @return OperationInterface */ public function getOperation() { return $this->operation; } } composer/src/Composer/Installer/SuggestedPackagesReporter.php 0000644 00000007677 14736103146 0020561 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Installer; use Composer\IO\IOInterface; use Composer\Package\PackageInterface; use Composer\Repository\RepositoryInterface; use Symfony\Component\Console\Formatter\OutputFormatter; /** * Add suggested packages from different places to output them in the end. * * @author Haralan Dobrev <hkdobrev@gmail.com> */ class SuggestedPackagesReporter { /** * @var array */ protected $suggestedPackages = array(); /** * @var IOInterface */ private $io; public function __construct(IOInterface $io) { $this->io = $io; } /** * @return array Suggested packages with source, target and reason keys. */ public function getPackages() { return $this->suggestedPackages; } /** * Add suggested packages to be listed after install * * Could be used to add suggested packages both from the installer * or from CreateProjectCommand. * * @param string $source Source package which made the suggestion * @param string $target Target package to be suggested * @param string $reason Reason the target package to be suggested * @return SuggestedPackagesReporter */ public function addPackage($source, $target, $reason) { $this->suggestedPackages[] = array( 'source' => $source, 'target' => $target, 'reason' => $reason, ); return $this; } /** * Add all suggestions from a package. * * @param PackageInterface $package * @return SuggestedPackagesReporter */ public function addSuggestionsFromPackage(PackageInterface $package) { $source = $package->getPrettyName(); foreach ($package->getSuggests() as $target => $reason) { $this->addPackage( $source, $target, $reason ); } return $this; } /** * Output suggested packages. * Do not list the ones already installed if installed repository provided. * * @param RepositoryInterface $installedRepo Installed packages * @return SuggestedPackagesReporter */ public function output(RepositoryInterface $installedRepo = null) { $suggestedPackages = $this->getPackages(); $installedPackages = array(); if (null !== $installedRepo && ! empty($suggestedPackages)) { foreach ($installedRepo->getPackages() as $package) { $installedPackages = array_merge( $installedPackages, $package->getNames() ); } } foreach ($suggestedPackages as $suggestion) { if (in_array($suggestion['target'], $installedPackages)) { continue; } $this->io->writeError(sprintf( '%s suggests installing %s%s', $suggestion['source'], $this->escapeOutput($suggestion['target']), $this->escapeOutput('' !== $suggestion['reason'] ? ' ('.$suggestion['reason'].')' : '') )); } return $this; } /** * @param string $string * @return string */ private function escapeOutput($string) { return OutputFormatter::escape( $this->removeControlCharacters($string) ); } /** * @param string $string * @return string */ private function removeControlCharacters($string) { return preg_replace( '/[[:cntrl:]]/', '', str_replace("\n", ' ', $string) ); } } composer/src/Composer/Installer/InstallationManager.php 0000644 00000025017 14736103146 0017365 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Installer; use Composer\IO\IOInterface; use Composer\Package\PackageInterface; use Composer\Package\AliasPackage; use Composer\Repository\RepositoryInterface; use Composer\Repository\InstalledRepositoryInterface; use Composer\DependencyResolver\Operation\OperationInterface; use Composer\DependencyResolver\Operation\InstallOperation; use Composer\DependencyResolver\Operation\UpdateOperation; use Composer\DependencyResolver\Operation\UninstallOperation; use Composer\DependencyResolver\Operation\MarkAliasInstalledOperation; use Composer\DependencyResolver\Operation\MarkAliasUninstalledOperation; use Composer\Util\StreamContextFactory; /** * Package operation manager. * * @author Konstantin Kudryashov <ever.zet@gmail.com> * @author Jordi Boggiano <j.boggiano@seld.be> * @author Nils Adermann <naderman@naderman.de> */ class InstallationManager { private $installers = array(); private $cache = array(); private $notifiablePackages = array(); public function reset() { $this->notifiablePackages = array(); } /** * Adds installer * * @param InstallerInterface $installer installer instance */ public function addInstaller(InstallerInterface $installer) { array_unshift($this->installers, $installer); $this->cache = array(); } /** * Removes installer * * @param InstallerInterface $installer installer instance */ public function removeInstaller(InstallerInterface $installer) { if (false !== ($key = array_search($installer, $this->installers, true))) { array_splice($this->installers, $key, 1); $this->cache = array(); } } /** * Disables plugins. * * We prevent any plugins from being instantiated by simply * deactivating the installer for them. This ensure that no third-party * code is ever executed. */ public function disablePlugins() { foreach ($this->installers as $i => $installer) { if (!$installer instanceof PluginInstaller) { continue; } unset($this->installers[$i]); } } /** * Returns installer for a specific package type. * * @param string $type package type * * @throws \InvalidArgumentException if installer for provided type is not registered * @return InstallerInterface */ public function getInstaller($type) { $type = strtolower($type); if (isset($this->cache[$type])) { return $this->cache[$type]; } foreach ($this->installers as $installer) { if ($installer->supports($type)) { return $this->cache[$type] = $installer; } } throw new \InvalidArgumentException('Unknown installer type: '.$type); } /** * Checks whether provided package is installed in one of the registered installers. * * @param InstalledRepositoryInterface $repo repository in which to check * @param PackageInterface $package package instance * * @return bool */ public function isPackageInstalled(InstalledRepositoryInterface $repo, PackageInterface $package) { if ($package instanceof AliasPackage) { return $repo->hasPackage($package) && $this->isPackageInstalled($repo, $package->getAliasOf()); } return $this->getInstaller($package->getType())->isInstalled($repo, $package); } /** * Install binary for the given package. * If the installer associated to this package doesn't handle that function, it'll do nothing. * * @param PackageInterface $package Package instance */ public function ensureBinariesPresence(PackageInterface $package) { try { $installer = $this->getInstaller($package->getType()); } catch (\InvalidArgumentException $e) { // no installer found for the current package type (@see `getInstaller()`) return; } // if the given installer support installing binaries if ($installer instanceof BinaryPresenceInterface) { $installer->ensureBinariesPresence($package); } } /** * Executes solver operation. * * @param RepositoryInterface $repo repository in which to check * @param OperationInterface $operation operation instance */ public function execute(RepositoryInterface $repo, OperationInterface $operation) { $method = $operation->getJobType(); $this->$method($repo, $operation); } /** * Executes install operation. * * @param RepositoryInterface $repo repository in which to check * @param InstallOperation $operation operation instance */ public function install(RepositoryInterface $repo, InstallOperation $operation) { $package = $operation->getPackage(); $installer = $this->getInstaller($package->getType()); $installer->install($repo, $package); $this->markForNotification($package); } /** * Executes update operation. * * @param RepositoryInterface $repo repository in which to check * @param UpdateOperation $operation operation instance */ public function update(RepositoryInterface $repo, UpdateOperation $operation) { $initial = $operation->getInitialPackage(); $target = $operation->getTargetPackage(); $initialType = $initial->getType(); $targetType = $target->getType(); if ($initialType === $targetType) { $installer = $this->getInstaller($initialType); $installer->update($repo, $initial, $target); $this->markForNotification($target); } else { $this->getInstaller($initialType)->uninstall($repo, $initial); $this->getInstaller($targetType)->install($repo, $target); } } /** * Uninstalls package. * * @param RepositoryInterface $repo repository in which to check * @param UninstallOperation $operation operation instance */ public function uninstall(RepositoryInterface $repo, UninstallOperation $operation) { $package = $operation->getPackage(); $installer = $this->getInstaller($package->getType()); $installer->uninstall($repo, $package); } /** * Executes markAliasInstalled operation. * * @param RepositoryInterface $repo repository in which to check * @param MarkAliasInstalledOperation $operation operation instance */ public function markAliasInstalled(RepositoryInterface $repo, MarkAliasInstalledOperation $operation) { $package = $operation->getPackage(); if (!$repo->hasPackage($package)) { $repo->addPackage(clone $package); } } /** * Executes markAlias operation. * * @param RepositoryInterface $repo repository in which to check * @param MarkAliasUninstalledOperation $operation operation instance */ public function markAliasUninstalled(RepositoryInterface $repo, MarkAliasUninstalledOperation $operation) { $package = $operation->getPackage(); $repo->removePackage($package); } /** * Returns the installation path of a package * * @param PackageInterface $package * @return string path */ public function getInstallPath(PackageInterface $package) { $installer = $this->getInstaller($package->getType()); return $installer->getInstallPath($package); } public function notifyInstalls(IOInterface $io) { foreach ($this->notifiablePackages as $repoUrl => $packages) { $repositoryName = parse_url($repoUrl, PHP_URL_HOST); if ($io->hasAuthentication($repositoryName)) { $auth = $io->getAuthentication($repositoryName); $authStr = base64_encode($auth['username'] . ':' . $auth['password']); $authHeader = 'Authorization: Basic '.$authStr; } // non-batch API, deprecated if (strpos($repoUrl, '%package%')) { foreach ($packages as $package) { $url = str_replace('%package%', $package->getPrettyName(), $repoUrl); $params = array( 'version' => $package->getPrettyVersion(), 'version_normalized' => $package->getVersion(), ); $opts = array('http' => array( 'method' => 'POST', 'header' => array('Content-type: application/x-www-form-urlencoded'), 'content' => http_build_query($params, '', '&'), 'timeout' => 3, ), ); if (isset($authHeader)) { $opts['http']['header'][] = $authHeader; } $context = StreamContextFactory::getContext($url, $opts); @file_get_contents($url, false, $context); } continue; } $postData = array('downloads' => array()); foreach ($packages as $package) { $postData['downloads'][] = array( 'name' => $package->getPrettyName(), 'version' => $package->getVersion(), ); } $opts = array('http' => array( 'method' => 'POST', 'header' => array('Content-Type: application/json'), 'content' => json_encode($postData), 'timeout' => 6, ), ); if (isset($authHeader)) { $opts['http']['header'][] = $authHeader; } $context = StreamContextFactory::getContext($repoUrl, $opts); @file_get_contents($repoUrl, false, $context); } $this->reset(); } private function markForNotification(PackageInterface $package) { if ($package->getNotificationUrl()) { $this->notifiablePackages[$package->getNotificationUrl()][$package->getName()] = $package; } } } composer/src/Composer/Installer/InstallerInterface.php 0000644 00000004631 14736103146 0017206 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Installer; use Composer\Package\PackageInterface; use Composer\Repository\InstalledRepositoryInterface; use InvalidArgumentException; /** * Interface for the package installation manager. * * @author Konstantin Kudryashov <ever.zet@gmail.com> * @author Jordi Boggiano <j.boggiano@seld.be> */ interface InstallerInterface { /** * Decides if the installer supports the given type * * @param string $packageType * @return bool */ public function supports($packageType); /** * Checks that provided package is installed. * * @param InstalledRepositoryInterface $repo repository in which to check * @param PackageInterface $package package instance * * @return bool */ public function isInstalled(InstalledRepositoryInterface $repo, PackageInterface $package); /** * Installs specific package. * * @param InstalledRepositoryInterface $repo repository in which to check * @param PackageInterface $package package instance */ public function install(InstalledRepositoryInterface $repo, PackageInterface $package); /** * Updates specific package. * * @param InstalledRepositoryInterface $repo repository in which to check * @param PackageInterface $initial already installed package version * @param PackageInterface $target updated version * * @throws InvalidArgumentException if $initial package is not installed */ public function update(InstalledRepositoryInterface $repo, PackageInterface $initial, PackageInterface $target); /** * Uninstalls specific package. * * @param InstalledRepositoryInterface $repo repository in which to check * @param PackageInterface $package package instance */ public function uninstall(InstalledRepositoryInterface $repo, PackageInterface $package); /** * Returns the installation path of a package * * @param PackageInterface $package * @return string path */ public function getInstallPath(PackageInterface $package); } composer/src/Composer/Installer/PackageEvents.php 0000644 00000003744 14736103146 0016154 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Installer; /** * Package Events. * * @author Jordi Boggiano <j.boggiano@seld.be> */ class PackageEvents { /** * The PRE_PACKAGE_INSTALL event occurs before a package is installed. * * The event listener method receives a Composer\Installer\PackageEvent instance. * * @var string */ const PRE_PACKAGE_INSTALL = 'pre-package-install'; /** * The POST_PACKAGE_INSTALL event occurs after a package is installed. * * The event listener method receives a Composer\Installer\PackageEvent instance. * * @var string */ const POST_PACKAGE_INSTALL = 'post-package-install'; /** * The PRE_PACKAGE_UPDATE event occurs before a package is updated. * * The event listener method receives a Composer\Installer\PackageEvent instance. * * @var string */ const PRE_PACKAGE_UPDATE = 'pre-package-update'; /** * The POST_PACKAGE_UPDATE event occurs after a package is updated. * * The event listener method receives a Composer\Installer\PackageEvent instance. * * @var string */ const POST_PACKAGE_UPDATE = 'post-package-update'; /** * The PRE_PACKAGE_UNINSTALL event occurs before a package has been uninstalled. * * The event listener method receives a Composer\Installer\PackageEvent instance. * * @var string */ const PRE_PACKAGE_UNINSTALL = 'pre-package-uninstall'; /** * The POST_PACKAGE_UNINSTALL event occurs after a package has been uninstalled. * * The event listener method receives a Composer\Installer\PackageEvent instance. * * @var string */ const POST_PACKAGE_UNINSTALL = 'post-package-uninstall'; } composer/src/Composer/Installer/InstallerEvents.php 0000644 00000002017 14736103146 0016546 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Installer; /** * The Installer Events. * * @author François Pluchino <francois.pluchino@gmail.com> */ class InstallerEvents { /** * The PRE_DEPENDENCIES_SOLVING event occurs as a installer begins * resolve operations. * * The event listener method receives a * Composer\Installer\InstallerEvent instance. * * @var string */ const PRE_DEPENDENCIES_SOLVING = 'pre-dependencies-solving'; /** * The POST_DEPENDENCIES_SOLVING event occurs as a installer after * resolve operations. * * The event listener method receives a * Composer\Installer\InstallerEvent instance. * * @var string */ const POST_DEPENDENCIES_SOLVING = 'post-dependencies-solving'; } composer/src/Composer/Installer/BinaryInstaller.php 0000644 00000015546 14736103146 0016541 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Installer; use Composer\IO\IOInterface; use Composer\Package\PackageInterface; use Composer\Util\Filesystem; use Composer\Util\Platform; use Composer\Util\ProcessExecutor; use Composer\Util\Silencer; /** * Utility to handle installation of package "bin"/binaries * * @author Jordi Boggiano <j.boggiano@seld.be> * @author Konstantin Kudryashov <ever.zet@gmail.com> * @author Helmut Hummel <info@helhum.io> */ class BinaryInstaller { protected $binDir; protected $binCompat; protected $io; protected $filesystem; /** * @param IOInterface $io * @param string $binDir * @param string $binCompat * @param Filesystem $filesystem */ public function __construct(IOInterface $io, $binDir, $binCompat, Filesystem $filesystem = null) { $this->binDir = $binDir; $this->binCompat = $binCompat; $this->io = $io; $this->filesystem = $filesystem ?: new Filesystem(); } public function installBinaries(PackageInterface $package, $installPath, $warnOnOverwrite = true) { $binaries = $this->getBinaries($package); if (!$binaries) { return; } foreach ($binaries as $bin) { $binPath = $installPath.'/'.$bin; if (!file_exists($binPath)) { $this->io->writeError(' <warning>Skipped installation of bin '.$bin.' for package '.$package->getName().': file not found in package</warning>'); continue; } // in case a custom installer returned a relative path for the // $package, we can now safely turn it into a absolute path (as we // already checked the binary's existence). The following helpers // will require absolute paths to work properly. $binPath = realpath($binPath); $this->initializeBinDir(); $link = $this->binDir.'/'.basename($bin); if (file_exists($link)) { if (is_link($link)) { // likely leftover from a previous install, make sure // that the target is still executable in case this // is a fresh install of the vendor. Silencer::call('chmod', $link, 0777 & ~umask()); } if ($warnOnOverwrite) { $this->io->writeError(' Skipped installation of bin '.$bin.' for package '.$package->getName().': name conflicts with an existing file'); } continue; } if ($this->binCompat === "auto") { if (Platform::isWindows()) { $this->installFullBinaries($binPath, $link, $bin, $package); } else { $this->installSymlinkBinaries($binPath, $link); } } elseif ($this->binCompat === "full") { $this->installFullBinaries($binPath, $link, $bin, $package); } Silencer::call('chmod', $link, 0777 & ~umask()); } } public function removeBinaries(PackageInterface $package) { $this->initializeBinDir(); $binaries = $this->getBinaries($package); if (!$binaries) { return; } foreach ($binaries as $bin) { $link = $this->binDir.'/'.basename($bin); if (is_link($link) || file_exists($link)) { $this->filesystem->unlink($link); } if (file_exists($link.'.bat')) { $this->filesystem->unlink($link.'.bat'); } } // attempt removing the bin dir in case it is left empty if (is_dir($this->binDir) && $this->filesystem->isDirEmpty($this->binDir)) { Silencer::call('rmdir', $this->binDir); } } public static function determineBinaryCaller($bin) { if ('.bat' === substr($bin, -4) || '.exe' === substr($bin, -4)) { return 'call'; } $handle = fopen($bin, 'r'); $line = fgets($handle); fclose($handle); if (preg_match('{^#!/(?:usr/bin/env )?(?:[^/]+/)*(.+)$}m', $line, $match)) { return trim($match[1]); } return 'php'; } protected function getBinaries(PackageInterface $package) { return $package->getBinaries(); } protected function installFullBinaries($binPath, $link, $bin, PackageInterface $package) { // add unixy support for cygwin and similar environments if ('.bat' !== substr($binPath, -4)) { $this->installUnixyProxyBinaries($binPath, $link); @chmod($link, 0777 & ~umask()); $link .= '.bat'; if (file_exists($link)) { $this->io->writeError(' Skipped installation of bin '.$bin.'.bat proxy for package '.$package->getName().': a .bat proxy was already installed'); } } if (!file_exists($link)) { file_put_contents($link, $this->generateWindowsProxyCode($binPath, $link)); } } protected function installSymlinkBinaries($binPath, $link) { if (!$this->filesystem->relativeSymlink($binPath, $link)) { $this->installUnixyProxyBinaries($binPath, $link); } } protected function installUnixyProxyBinaries($binPath, $link) { file_put_contents($link, $this->generateUnixyProxyCode($binPath, $link)); } protected function initializeBinDir() { $this->filesystem->ensureDirectoryExists($this->binDir); $this->binDir = realpath($this->binDir); } protected function generateWindowsProxyCode($bin, $link) { $binPath = $this->filesystem->findShortestPath($link, $bin); $caller = self::determineBinaryCaller($bin); return "@ECHO OFF\r\n". "setlocal DISABLEDELAYEDEXPANSION\r\n". "SET BIN_TARGET=%~dp0/".trim(ProcessExecutor::escape($binPath), '"\'')."\r\n". "{$caller} \"%BIN_TARGET%\" %*\r\n"; } protected function generateUnixyProxyCode($bin, $link) { $binPath = $this->filesystem->findShortestPath($link, $bin); $binDir = ProcessExecutor::escape(dirname($binPath)); $binFile = basename($binPath); $proxyCode = <<<PROXY #!/usr/bin/env sh dir=\$(cd "\${0%[/\\\\]*}" > /dev/null; cd $binDir && pwd) if [ -d /proc/cygdrive ]; then case \$(which php) in \$(readlink -n /proc/cygdrive)/*) # We are in Cygwin using Windows php, so the path must be translated dir=\$(cygpath -m "\$dir"); ;; esac fi "\${dir}/$binFile" "\$@" PROXY; return $proxyCode; } } composer/src/Composer/Installer/PearBinaryInstaller.php 0000644 00000011524 14736103146 0017341 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Installer; use Composer\IO\IOInterface; use Composer\Package\PackageInterface; use Composer\Util\Filesystem; use Composer\Util\ProcessExecutor; /** * Utility to handle installation of package "bin"/binaries for PEAR packages * * @author Jordi Boggiano <j.boggiano@seld.be> */ class PearBinaryInstaller extends BinaryInstaller { private $installer; private $vendorDir; /** * @param IOInterface $io * @param string $binDir * @param string $vendorDir * @param string $binCompat * @param Filesystem $filesystem * @param PearInstaller $installer */ public function __construct(IOInterface $io, $binDir, $vendorDir, $binCompat, Filesystem $filesystem, PearInstaller $installer) { parent::__construct($io, $binDir, $binCompat, $filesystem); $this->installer = $installer; $this->vendorDir = $vendorDir; } protected function getBinaries(PackageInterface $package) { $binariesPath = $this->installer->getInstallPath($package) . '/bin/'; $binaries = array(); if (file_exists($binariesPath)) { foreach (new \FilesystemIterator($binariesPath, \FilesystemIterator::KEY_AS_FILENAME | \FilesystemIterator::CURRENT_AS_FILEINFO) as $fileName => $value) { if (!$value->isDir()) { $binaries[] = 'bin/'.$fileName; } } } return $binaries; } protected function initializeBinDir() { parent::initializeBinDir(); file_put_contents($this->binDir.'/composer-php', $this->generateUnixyPhpProxyCode()); @chmod($this->binDir.'/composer-php', 0777 & ~umask()); file_put_contents($this->binDir.'/composer-php.bat', $this->generateWindowsPhpProxyCode()); @chmod($this->binDir.'/composer-php.bat', 0777 & ~umask()); } protected function generateWindowsProxyCode($bin, $link) { $binPath = $this->filesystem->findShortestPath($link, $bin); if ('.bat' === substr($bin, -4)) { $caller = 'call'; } else { $handle = fopen($bin, 'r'); $line = fgets($handle); fclose($handle); if (preg_match('{^#!/(?:usr/bin/env )?(?:[^/]+/)*(.+)$}m', $line, $match)) { $caller = trim($match[1]); } else { $caller = 'php'; } if ($caller === 'php') { return "@echo off\r\n". "pushd .\r\n". "cd %~dp0\r\n". "set PHP_PROXY=%CD%\\composer-php.bat\r\n". "cd ".ProcessExecutor::escape(dirname($binPath))."\r\n". "set BIN_TARGET=%CD%\\".basename($binPath)."\r\n". "popd\r\n". "%PHP_PROXY% \"%BIN_TARGET%\" %*\r\n"; } } return "@echo off\r\n". "pushd .\r\n". "cd %~dp0\r\n". "cd ".ProcessExecutor::escape(dirname($binPath))."\r\n". "set BIN_TARGET=%CD%\\".basename($binPath)."\r\n". "popd\r\n". $caller." \"%BIN_TARGET%\" %*\r\n"; } private function generateWindowsPhpProxyCode() { $binToVendor = $this->filesystem->findShortestPath($this->binDir, $this->vendorDir, true); return "@echo off\r\n" . "setlocal enabledelayedexpansion\r\n" . "set BIN_DIR=%~dp0\r\n" . "set VENDOR_DIR=%BIN_DIR%\\".$binToVendor."\r\n" . "set DIRS=.\r\n" . "FOR /D %%V IN (%VENDOR_DIR%\\*) DO (\r\n" . " FOR /D %%P IN (%%V\\*) DO (\r\n" . " set DIRS=!DIRS!;%%~fP\r\n" . " )\r\n" . ")\r\n" . "php.exe -d include_path=!DIRS! %*\r\n"; } private function generateUnixyPhpProxyCode() { $binToVendor = $this->filesystem->findShortestPath($this->binDir, $this->vendorDir, true); return "#!/usr/bin/env sh\n". "SRC_DIR=`pwd`\n". "BIN_DIR=`dirname $0`\n". "VENDOR_DIR=\$BIN_DIR/".escapeshellarg($binToVendor)."\n". "DIRS=\"\"\n". "for vendor in \$VENDOR_DIR/*; do\n". " if [ -d \"\$vendor\" ]; then\n". " for package in \$vendor/*; do\n". " if [ -d \"\$package\" ]; then\n". " DIRS=\"\${DIRS}:\${package}\"\n". " fi\n". " done\n". " fi\n". "done\n". "php -d include_path=\".\$DIRS\" $@\n"; } } composer/src/Composer/Installer/MetapackageInstaller.php 0000644 00000005367 14736103146 0017517 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Installer; use Composer\Repository\InstalledRepositoryInterface; use Composer\Package\PackageInterface; use Composer\Package\Version\VersionParser; use Composer\IO\IOInterface; /** * Metapackage installation manager. * * @author Martin Hasoň <martin.hason@gmail.com> */ class MetapackageInstaller implements InstallerInterface { private $io; public function __construct(IOInterface $io) { $this->io = $io; } /** * {@inheritDoc} */ public function supports($packageType) { return $packageType === 'metapackage'; } /** * {@inheritDoc} */ public function isInstalled(InstalledRepositoryInterface $repo, PackageInterface $package) { return $repo->hasPackage($package); } /** * {@inheritDoc} */ public function install(InstalledRepositoryInterface $repo, PackageInterface $package) { $this->io->writeError(" - Installing <info>" . $package->getName() . "</info> (<comment>" . $package->getFullPrettyVersion() . "</comment>)"); $repo->addPackage(clone $package); } /** * {@inheritDoc} */ public function update(InstalledRepositoryInterface $repo, PackageInterface $initial, PackageInterface $target) { if (!$repo->hasPackage($initial)) { throw new \InvalidArgumentException('Package is not installed: '.$initial); } $name = $target->getName(); $from = $initial->getFullPrettyVersion(); $to = $target->getFullPrettyVersion(); $actionName = VersionParser::isUpgrade($initial->getVersion(), $target->getVersion()) ? 'Updating' : 'Downgrading'; $this->io->writeError(" - " . $actionName . " <info>" . $name . "</info> (<comment>" . $from . "</comment> => <comment>" . $to . "</comment>)"); $repo->removePackage($initial); $repo->addPackage(clone $target); } /** * {@inheritDoc} */ public function uninstall(InstalledRepositoryInterface $repo, PackageInterface $package) { if (!$repo->hasPackage($package)) { throw new \InvalidArgumentException('Package is not installed: '.$package); } $this->io->writeError(" - Removing <info>" . $package->getName() . "</info> (<comment>" . $package->getFullPrettyVersion() . "</comment>)"); $repo->removePackage($package); } /** * {@inheritDoc} */ public function getInstallPath(PackageInterface $package) { return ''; } } composer/src/Composer/Installer/ProjectInstaller.php 0000644 00000005057 14736103146 0016717 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Installer; use Composer\Package\PackageInterface; use Composer\Downloader\DownloadManager; use Composer\Repository\InstalledRepositoryInterface; use Composer\Util\Filesystem; /** * Project Installer is used to install a single package into a directory as * root project. * * @author Benjamin Eberlei <kontakt@beberlei.de> */ class ProjectInstaller implements InstallerInterface { private $installPath; private $downloadManager; private $filesystem; public function __construct($installPath, DownloadManager $dm) { $this->installPath = rtrim(strtr($installPath, '\\', '/'), '/').'/'; $this->downloadManager = $dm; $this->filesystem = new Filesystem; } /** * Decides if the installer supports the given type * * @param string $packageType * @return bool */ public function supports($packageType) { return true; } /** * {@inheritDoc} */ public function isInstalled(InstalledRepositoryInterface $repo, PackageInterface $package) { return false; } /** * {@inheritDoc} */ public function install(InstalledRepositoryInterface $repo, PackageInterface $package) { $installPath = $this->installPath; if (file_exists($installPath) && !$this->filesystem->isDirEmpty($installPath)) { throw new \InvalidArgumentException("Project directory $installPath is not empty."); } if (!is_dir($installPath)) { mkdir($installPath, 0777, true); } $this->downloadManager->download($package, $installPath); } /** * {@inheritDoc} */ public function update(InstalledRepositoryInterface $repo, PackageInterface $initial, PackageInterface $target) { throw new \InvalidArgumentException("not supported"); } /** * {@inheritDoc} */ public function uninstall(InstalledRepositoryInterface $repo, PackageInterface $package) { throw new \InvalidArgumentException("not supported"); } /** * Returns the installation path of a package * * @param PackageInterface $package * @return string path */ public function getInstallPath(PackageInterface $package) { return $this->installPath; } } composer/src/Composer/Installer/InstallerEvent.php 0000644 00000006224 14736103146 0016367 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Installer; use Composer\Composer; use Composer\DependencyResolver\PolicyInterface; use Composer\DependencyResolver\Operation\OperationInterface; use Composer\DependencyResolver\Pool; use Composer\DependencyResolver\Request; use Composer\EventDispatcher\Event; use Composer\IO\IOInterface; use Composer\Repository\CompositeRepository; /** * An event for all installer. * * @author François Pluchino <francois.pluchino@gmail.com> */ class InstallerEvent extends Event { /** * @var Composer */ private $composer; /** * @var IOInterface */ private $io; /** * @var bool */ private $devMode; /** * @var PolicyInterface */ private $policy; /** * @var Pool */ private $pool; /** * @var CompositeRepository */ private $installedRepo; /** * @var Request */ private $request; /** * @var OperationInterface[] */ private $operations; /** * Constructor. * * @param string $eventName * @param Composer $composer * @param IOInterface $io * @param bool $devMode * @param PolicyInterface $policy * @param Pool $pool * @param CompositeRepository $installedRepo * @param Request $request * @param OperationInterface[] $operations */ public function __construct($eventName, Composer $composer, IOInterface $io, $devMode, PolicyInterface $policy, Pool $pool, CompositeRepository $installedRepo, Request $request, array $operations = array()) { parent::__construct($eventName); $this->composer = $composer; $this->io = $io; $this->devMode = $devMode; $this->policy = $policy; $this->pool = $pool; $this->installedRepo = $installedRepo; $this->request = $request; $this->operations = $operations; } /** * @return Composer */ public function getComposer() { return $this->composer; } /** * @return IOInterface */ public function getIO() { return $this->io; } /** * @return bool */ public function isDevMode() { return $this->devMode; } /** * @return PolicyInterface */ public function getPolicy() { return $this->policy; } /** * @return Pool */ public function getPool() { return $this->pool; } /** * @return CompositeRepository */ public function getInstalledRepo() { return $this->installedRepo; } /** * @return Request */ public function getRequest() { return $this->request; } /** * @return OperationInterface[] */ public function getOperations() { return $this->operations; } } composer/src/Composer/Installer/BinaryPresenceInterface.php 0000644 00000001333 14736103146 0020156 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Installer; use Composer\Package\PackageInterface; /** * Interface for the package installation manager that handle binary installation. * * @author Jordi Boggiano <j.boggiano@seld.be> */ interface BinaryPresenceInterface { /** * Make sure binaries are installed for a given package. * * @param PackageInterface $package package instance */ public function ensureBinariesPresence(PackageInterface $package); } composer/src/Composer/Installer/NoopInstaller.php 0000644 00000004156 14736103146 0016223 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Installer; use Composer\Repository\InstalledRepositoryInterface; use Composer\Package\PackageInterface; /** * Does not install anything but marks packages installed in the repo * * Useful for dry runs * * @author Jordi Boggiano <j.boggiano@seld.be> */ class NoopInstaller implements InstallerInterface { /** * {@inheritDoc} */ public function supports($packageType) { return true; } /** * {@inheritDoc} */ public function isInstalled(InstalledRepositoryInterface $repo, PackageInterface $package) { return $repo->hasPackage($package); } /** * {@inheritDoc} */ public function install(InstalledRepositoryInterface $repo, PackageInterface $package) { if (!$repo->hasPackage($package)) { $repo->addPackage(clone $package); } } /** * {@inheritDoc} */ public function update(InstalledRepositoryInterface $repo, PackageInterface $initial, PackageInterface $target) { if (!$repo->hasPackage($initial)) { throw new \InvalidArgumentException('Package is not installed: '.$initial); } $repo->removePackage($initial); if (!$repo->hasPackage($target)) { $repo->addPackage(clone $target); } } /** * {@inheritDoc} */ public function uninstall(InstalledRepositoryInterface $repo, PackageInterface $package) { if (!$repo->hasPackage($package)) { throw new \InvalidArgumentException('Package is not installed: '.$package); } $repo->removePackage($package); } /** * {@inheritDoc} */ public function getInstallPath(PackageInterface $package) { $targetDir = $package->getTargetDir(); return $package->getPrettyName() . ($targetDir ? '/'.$targetDir : ''); } } composer/src/Composer/Installer/PluginInstaller.php 0000644 00000005030 14736103146 0016536 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Installer; use Composer\Composer; use Composer\IO\IOInterface; use Composer\Repository\InstalledRepositoryInterface; use Composer\Package\PackageInterface; /** * Installer for plugin packages * * @author Jordi Boggiano <j.boggiano@seld.be> * @author Nils Adermann <naderman@naderman.de> */ class PluginInstaller extends LibraryInstaller { private $installationManager; /** * Initializes Plugin installer. * * @param IOInterface $io * @param Composer $composer */ public function __construct(IOInterface $io, Composer $composer) { parent::__construct($io, $composer, 'composer-plugin'); $this->installationManager = $composer->getInstallationManager(); } /** * {@inheritDoc} */ public function supports($packageType) { return $packageType === 'composer-plugin' || $packageType === 'composer-installer'; } /** * {@inheritDoc} */ public function install(InstalledRepositoryInterface $repo, PackageInterface $package) { $extra = $package->getExtra(); if (empty($extra['class'])) { throw new \UnexpectedValueException('Error while installing '.$package->getPrettyName().', composer-plugin packages should have a class defined in their extra key to be usable.'); } parent::install($repo, $package); try { $this->composer->getPluginManager()->registerPackage($package, true); } catch (\Exception $e) { // Rollback installation $this->io->writeError('Plugin installation failed ('.$e->getMessage().'), rolling back'); parent::uninstall($repo, $package); throw $e; } } /** * {@inheritDoc} */ public function update(InstalledRepositoryInterface $repo, PackageInterface $initial, PackageInterface $target) { $extra = $target->getExtra(); if (empty($extra['class'])) { throw new \UnexpectedValueException('Error while installing '.$target->getPrettyName().', composer-plugin packages should have a class defined in their extra key to be usable.'); } parent::update($repo, $initial, $target); $this->composer->getPluginManager()->registerPackage($target, true); } } composer/src/Composer/Installer/PearInstaller.php 0000644 00000005466 14736103146 0016204 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Installer; use Composer\IO\IOInterface; use Composer\Composer; use Composer\Downloader\PearPackageExtractor; use Composer\Repository\InstalledRepositoryInterface; use Composer\Package\PackageInterface; use Composer\Util\Platform; use Composer\Util\Filesystem; /** * Package installation manager. * * @author Jordi Boggiano <j.boggiano@seld.be> * @author Konstantin Kudryashov <ever.zet@gmail.com> */ class PearInstaller extends LibraryInstaller { /** * Initializes library installer. * * @param IOInterface $io io instance * @param Composer $composer * @param string $type package type that this installer handles */ public function __construct(IOInterface $io, Composer $composer, $type = 'pear-library') { $filesystem = new Filesystem(); $binaryInstaller = new PearBinaryInstaller($io, rtrim($composer->getConfig()->get('bin-dir'), '/'), rtrim($composer->getConfig()->get('vendor-dir'), '/'), $composer->getConfig()->get('bin-compat'), $filesystem, $this); parent::__construct($io, $composer, $type, $filesystem, $binaryInstaller); } /** * {@inheritDoc} */ public function update(InstalledRepositoryInterface $repo, PackageInterface $initial, PackageInterface $target) { $this->uninstall($repo, $initial); $this->install($repo, $target); } protected function installCode(PackageInterface $package) { parent::installCode($package); $isWindows = Platform::isWindows(); $php_bin = $this->binDir . ($isWindows ? '/composer-php.bat' : '/composer-php'); if (!$isWindows) { $php_bin = '/usr/bin/env ' . $php_bin; } $installPath = $this->getInstallPath($package); $vars = array( 'os' => $isWindows ? 'windows' : 'linux', 'php_bin' => $php_bin, 'pear_php' => $installPath, 'php_dir' => $installPath, 'bin_dir' => $installPath . '/bin', 'data_dir' => $installPath . '/data', 'version' => $package->getPrettyVersion(), ); $packageArchive = $this->getInstallPath($package).'/'.pathinfo($package->getDistUrl(), PATHINFO_BASENAME); $pearExtractor = new PearPackageExtractor($packageArchive); $pearExtractor->extractTo($this->getInstallPath($package), array('php' => '/', 'script' => '/bin', 'data' => '/data'), $vars); $this->io->writeError(' Cleaning up', true, IOInterface::VERBOSE); $this->filesystem->unlink($packageArchive); } } composer/src/Composer/Installer/LibraryInstaller.php 0000644 00000016646 14736103146 0016723 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Installer; use Composer\Composer; use Composer\IO\IOInterface; use Composer\Repository\InstalledRepositoryInterface; use Composer\Package\PackageInterface; use Composer\Util\Filesystem; use Composer\Util\Silencer; use Composer\Util\Platform; /** * Package installation manager. * * @author Jordi Boggiano <j.boggiano@seld.be> * @author Konstantin Kudryashov <ever.zet@gmail.com> */ class LibraryInstaller implements InstallerInterface, BinaryPresenceInterface { protected $composer; protected $vendorDir; protected $binDir; protected $downloadManager; protected $io; protected $type; protected $filesystem; protected $binCompat; protected $binaryInstaller; /** * Initializes library installer. * * @param IOInterface $io * @param Composer $composer * @param string $type * @param Filesystem $filesystem * @param BinaryInstaller $binaryInstaller */ public function __construct(IOInterface $io, Composer $composer, $type = 'library', Filesystem $filesystem = null, BinaryInstaller $binaryInstaller = null) { $this->composer = $composer; $this->downloadManager = $composer->getDownloadManager(); $this->io = $io; $this->type = $type; $this->filesystem = $filesystem ?: new Filesystem(); $this->vendorDir = rtrim($composer->getConfig()->get('vendor-dir'), '/'); $this->binaryInstaller = $binaryInstaller ?: new BinaryInstaller($this->io, rtrim($composer->getConfig()->get('bin-dir'), '/'), $composer->getConfig()->get('bin-compat'), $this->filesystem); } /** * {@inheritDoc} */ public function supports($packageType) { return $packageType === $this->type || null === $this->type; } /** * {@inheritDoc} */ public function isInstalled(InstalledRepositoryInterface $repo, PackageInterface $package) { if (!$repo->hasPackage($package)) { return false; } $installPath = $this->getInstallPath($package); if (is_readable($installPath)) { return true; } return (Platform::isWindows() && $this->filesystem->isJunction($installPath)) || is_link($installPath); } /** * {@inheritDoc} */ public function install(InstalledRepositoryInterface $repo, PackageInterface $package) { $this->initializeVendorDir(); $downloadPath = $this->getInstallPath($package); // remove the binaries if it appears the package files are missing if (!is_readable($downloadPath) && $repo->hasPackage($package)) { $this->binaryInstaller->removeBinaries($package); } $this->installCode($package); $this->binaryInstaller->installBinaries($package, $this->getInstallPath($package)); if (!$repo->hasPackage($package)) { $repo->addPackage(clone $package); } } /** * {@inheritDoc} */ public function update(InstalledRepositoryInterface $repo, PackageInterface $initial, PackageInterface $target) { if (!$repo->hasPackage($initial)) { throw new \InvalidArgumentException('Package is not installed: '.$initial); } $this->initializeVendorDir(); $this->binaryInstaller->removeBinaries($initial); $this->updateCode($initial, $target); $this->binaryInstaller->installBinaries($target, $this->getInstallPath($target)); $repo->removePackage($initial); if (!$repo->hasPackage($target)) { $repo->addPackage(clone $target); } } /** * {@inheritDoc} */ public function uninstall(InstalledRepositoryInterface $repo, PackageInterface $package) { if (!$repo->hasPackage($package)) { throw new \InvalidArgumentException('Package is not installed: '.$package); } $this->removeCode($package); $this->binaryInstaller->removeBinaries($package); $repo->removePackage($package); $downloadPath = $this->getPackageBasePath($package); if (strpos($package->getName(), '/')) { $packageVendorDir = dirname($downloadPath); if (is_dir($packageVendorDir) && $this->filesystem->isDirEmpty($packageVendorDir)) { Silencer::call('rmdir', $packageVendorDir); } } } /** * {@inheritDoc} */ public function getInstallPath(PackageInterface $package) { $this->initializeVendorDir(); $basePath = ($this->vendorDir ? $this->vendorDir.'/' : '') . $package->getPrettyName(); $targetDir = $package->getTargetDir(); return $basePath . ($targetDir ? '/'.$targetDir : ''); } /** * Make sure binaries are installed for a given package. * * @param PackageInterface $package Package instance */ public function ensureBinariesPresence(PackageInterface $package) { $this->binaryInstaller->installBinaries($package, $this->getInstallPath($package), false); } /** * Returns the base path of the package without target-dir path * * It is used for BC as getInstallPath tends to be overridden by * installer plugins but not getPackageBasePath * * @param PackageInterface $package * @return string */ protected function getPackageBasePath(PackageInterface $package) { $installPath = $this->getInstallPath($package); $targetDir = $package->getTargetDir(); if ($targetDir) { return preg_replace('{/*'.str_replace('/', '/+', preg_quote($targetDir)).'/?$}', '', $installPath); } return $installPath; } protected function installCode(PackageInterface $package) { $downloadPath = $this->getInstallPath($package); $this->downloadManager->download($package, $downloadPath); } protected function updateCode(PackageInterface $initial, PackageInterface $target) { $initialDownloadPath = $this->getInstallPath($initial); $targetDownloadPath = $this->getInstallPath($target); if ($targetDownloadPath !== $initialDownloadPath) { // if the target and initial dirs intersect, we force a remove + install // to avoid the rename wiping the target dir as part of the initial dir cleanup if (substr($initialDownloadPath, 0, strlen($targetDownloadPath)) === $targetDownloadPath || substr($targetDownloadPath, 0, strlen($initialDownloadPath)) === $initialDownloadPath ) { $this->removeCode($initial); $this->installCode($target); return; } $this->filesystem->rename($initialDownloadPath, $targetDownloadPath); } $this->downloadManager->update($initial, $target, $targetDownloadPath); } protected function removeCode(PackageInterface $package) { $downloadPath = $this->getPackageBasePath($package); $this->downloadManager->remove($package, $downloadPath); } protected function initializeVendorDir() { $this->filesystem->ensureDirectoryExists($this->vendorDir); $this->vendorDir = realpath($this->vendorDir); } } composer/src/Composer/DependencyResolver/RuleSetGenerator.php 0000644 00000033566 14736103146 0020536 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver; use Composer\Package\PackageInterface; use Composer\Package\AliasPackage; use Composer\Repository\PlatformRepository; /** * @author Nils Adermann <naderman@naderman.de> */ class RuleSetGenerator { protected $policy; protected $pool; protected $rules; protected $jobs; protected $installedMap; protected $whitelistedMap; protected $addedMap; protected $conflictAddedMap; protected $addedPackages; protected $addedPackagesByNames; public function __construct(PolicyInterface $policy, Pool $pool) { $this->policy = $policy; $this->pool = $pool; } /** * Creates a new rule for the requirements of a package * * This rule is of the form (-A|B|C), where B and C are the providers of * one requirement of the package A. * * @param PackageInterface $package The package with a requirement * @param array $providers The providers of the requirement * @param int $reason A RULE_* constant describing the * reason for generating this rule * @param mixed $reasonData Any data, e.g. the requirement name, * that goes with the reason * @return Rule|null The generated rule or null if tautological */ protected function createRequireRule(PackageInterface $package, array $providers, $reason, $reasonData = null) { $literals = array(-$package->id); foreach ($providers as $provider) { // self fulfilling rule? if ($provider === $package) { return null; } $literals[] = $provider->id; } return new GenericRule($literals, $reason, $reasonData); } /** * Creates a rule to install at least one of a set of packages * * The rule is (A|B|C) with A, B and C different packages. If the given * set of packages is empty an impossible rule is generated. * * @param array $packages The set of packages to choose from * @param int $reason A RULE_* constant describing the reason for * generating this rule * @param array $job The job this rule was created from * @return Rule The generated rule */ protected function createInstallOneOfRule(array $packages, $reason, $job) { $literals = array(); foreach ($packages as $package) { $literals[] = $package->id; } return new GenericRule($literals, $reason, $job['packageName'], $job); } /** * Creates a rule to remove a package * * The rule for a package A is (-A). * * @param PackageInterface $package The package to be removed * @param int $reason A RULE_* constant describing the * reason for generating this rule * @param array $job The job this rule was created from * @return Rule The generated rule */ protected function createRemoveRule(PackageInterface $package, $reason, $job) { return new GenericRule(array(-$package->id), $reason, $job['packageName'], $job); } /** * Creates a rule for two conflicting packages * * The rule for conflicting packages A and B is (-A|-B). A is called the issuer * and B the provider. * * @param PackageInterface $issuer The package declaring the conflict * @param PackageInterface $provider The package causing the conflict * @param int $reason A RULE_* constant describing the * reason for generating this rule * @param mixed $reasonData Any data, e.g. the package name, that * goes with the reason * @return Rule|null The generated rule */ protected function createRule2Literals(PackageInterface $issuer, PackageInterface $provider, $reason, $reasonData = null) { // ignore self conflict if ($issuer === $provider) { return null; } return new Rule2Literals(-$issuer->id, -$provider->id, $reason, $reasonData); } /** * Adds a rule unless it duplicates an existing one of any type * * To be able to directly pass in the result of one of the rule creation * methods null is allowed which will not insert a rule. * * @param int $type A TYPE_* constant defining the rule type * @param Rule $newRule The rule about to be added */ private function addRule($type, Rule $newRule = null) { if (!$newRule) { return; } $this->rules->add($newRule, $type); } protected function whitelistFromPackage(PackageInterface $package) { $workQueue = new \SplQueue; $workQueue->enqueue($package); while (!$workQueue->isEmpty()) { $package = $workQueue->dequeue(); if (isset($this->whitelistedMap[$package->id])) { continue; } $this->whitelistedMap[$package->id] = true; foreach ($package->getRequires() as $link) { $possibleRequires = $this->pool->whatProvides($link->getTarget(), $link->getConstraint(), true); foreach ($possibleRequires as $require) { $workQueue->enqueue($require); } } $obsoleteProviders = $this->pool->whatProvides($package->getName(), null, true); foreach ($obsoleteProviders as $provider) { if ($provider === $package) { continue; } if (($package instanceof AliasPackage) && $package->getAliasOf() === $provider) { $workQueue->enqueue($provider); } } } } protected function addRulesForPackage(PackageInterface $package, $ignorePlatformReqs) { $workQueue = new \SplQueue; $workQueue->enqueue($package); while (!$workQueue->isEmpty()) { /** @var PackageInterface $package */ $package = $workQueue->dequeue(); if (isset($this->addedMap[$package->id])) { continue; } $this->addedMap[$package->id] = true; $this->addedPackages[] = $package; foreach ($package->getNames() as $name) { $this->addedPackagesByNames[$name][] = $package; } foreach ($package->getRequires() as $link) { if ($ignorePlatformReqs && preg_match(PlatformRepository::PLATFORM_PACKAGE_REGEX, $link->getTarget())) { continue; } $possibleRequires = $this->pool->whatProvides($link->getTarget(), $link->getConstraint()); $this->addRule(RuleSet::TYPE_PACKAGE, $this->createRequireRule($package, $possibleRequires, Rule::RULE_PACKAGE_REQUIRES, $link)); foreach ($possibleRequires as $require) { $workQueue->enqueue($require); } } $packageName = $package->getName(); $obsoleteProviders = $this->pool->whatProvides($packageName, null); foreach ($obsoleteProviders as $provider) { if ($provider === $package) { continue; } if (($package instanceof AliasPackage) && $package->getAliasOf() === $provider) { $this->addRule(RuleSet::TYPE_PACKAGE, $this->createRequireRule($package, array($provider), Rule::RULE_PACKAGE_ALIAS, $package)); } elseif (!$this->obsoleteImpossibleForAlias($package, $provider)) { $reason = ($packageName == $provider->getName()) ? Rule::RULE_PACKAGE_SAME_NAME : Rule::RULE_PACKAGE_IMPLICIT_OBSOLETES; $this->addRule(RuleSet::TYPE_PACKAGE, $this->createRule2Literals($package, $provider, $reason, $package)); } } } } protected function addConflictRules($ignorePlatformReqs = false) { /** @var PackageInterface $package */ foreach ($this->addedPackages as $package) { foreach ($package->getConflicts() as $link) { if (!isset($this->addedPackagesByNames[$link->getTarget()])) { continue; } if ($ignorePlatformReqs && preg_match(PlatformRepository::PLATFORM_PACKAGE_REGEX, $link->getTarget())) { continue; } /** @var PackageInterface $possibleConflict */ foreach ($this->addedPackagesByNames[$link->getTarget()] as $possibleConflict) { $conflictMatch = $this->pool->match($possibleConflict, $link->getTarget(), $link->getConstraint(), true); if ($conflictMatch === Pool::MATCH || $conflictMatch === Pool::MATCH_REPLACE) { $this->addRule(RuleSet::TYPE_PACKAGE, $this->createRule2Literals($package, $possibleConflict, Rule::RULE_PACKAGE_CONFLICT, $link)); } } } // check obsoletes and implicit obsoletes of a package $isInstalled = isset($this->installedMap[$package->id]); foreach ($package->getReplaces() as $link) { if (!isset($this->addedPackagesByNames[$link->getTarget()])) { continue; } /** @var PackageInterface $possibleConflict */ foreach ($this->addedPackagesByNames[$link->getTarget()] as $provider) { if ($provider === $package) { continue; } if (!$this->obsoleteImpossibleForAlias($package, $provider)) { $reason = $isInstalled ? Rule::RULE_INSTALLED_PACKAGE_OBSOLETES : Rule::RULE_PACKAGE_OBSOLETES; $this->addRule(RuleSet::TYPE_PACKAGE, $this->createRule2Literals($package, $provider, $reason, $link)); } } } } } protected function obsoleteImpossibleForAlias($package, $provider) { $packageIsAlias = $package instanceof AliasPackage; $providerIsAlias = $provider instanceof AliasPackage; $impossible = ( ($packageIsAlias && $package->getAliasOf() === $provider) || ($providerIsAlias && $provider->getAliasOf() === $package) || ($packageIsAlias && $providerIsAlias && $provider->getAliasOf() === $package->getAliasOf()) ); return $impossible; } protected function whitelistFromJobs() { foreach ($this->jobs as $job) { switch ($job['cmd']) { case 'install': $packages = $this->pool->whatProvides($job['packageName'], $job['constraint'], true); foreach ($packages as $package) { $this->whitelistFromPackage($package); } break; } } } protected function addRulesForJobs($ignorePlatformReqs) { foreach ($this->jobs as $job) { switch ($job['cmd']) { case 'install': if (!$job['fixed'] && $ignorePlatformReqs && preg_match(PlatformRepository::PLATFORM_PACKAGE_REGEX, $job['packageName'])) { break; } $packages = $this->pool->whatProvides($job['packageName'], $job['constraint']); if ($packages) { foreach ($packages as $package) { if (!isset($this->installedMap[$package->id])) { $this->addRulesForPackage($package, $ignorePlatformReqs); } } $rule = $this->createInstallOneOfRule($packages, Rule::RULE_JOB_INSTALL, $job); $this->addRule(RuleSet::TYPE_JOB, $rule); } break; case 'remove': // remove all packages with this name including uninstalled // ones to make sure none of them are picked as replacements $packages = $this->pool->whatProvides($job['packageName'], $job['constraint']); foreach ($packages as $package) { $rule = $this->createRemoveRule($package, Rule::RULE_JOB_REMOVE, $job); $this->addRule(RuleSet::TYPE_JOB, $rule); } break; } } } public function getRulesFor($jobs, $installedMap, $ignorePlatformReqs = false) { $this->jobs = $jobs; $this->rules = new RuleSet; $this->installedMap = $installedMap; $this->whitelistedMap = array(); foreach ($this->installedMap as $package) { $this->whitelistFromPackage($package); } $this->whitelistFromJobs(); $this->pool->setWhitelist($this->whitelistedMap); $this->addedMap = array(); $this->conflictAddedMap = array(); $this->addedPackages = array(); $this->addedPackagesByNames = array(); foreach ($this->installedMap as $package) { $this->addRulesForPackage($package, $ignorePlatformReqs); } $this->addRulesForJobs($ignorePlatformReqs); $this->addConflictRules($ignorePlatformReqs); // Remove references to packages $this->addedPackages = $this->addedPackagesByNames = null; return $this->rules; } } composer/src/Composer/DependencyResolver/GenericRule.php 0000644 00000004172 14736103146 0017477 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver; use Composer\Package\PackageInterface; use Composer\Package\Link; /** * @author Nils Adermann <naderman@naderman.de> */ class GenericRule extends Rule { protected $literals; /** * @param array $literals * @param int $reason A RULE_* constant describing the reason for generating this rule * @param Link|PackageInterface $reasonData * @param array $job The job this rule was created from */ public function __construct(array $literals, $reason, $reasonData, $job = null) { parent::__construct($reason, $reasonData, $job); // sort all packages ascending by id sort($literals); $this->literals = $literals; } public function getLiterals() { return $this->literals; } public function getHash() { $data = unpack('ihash', md5(implode(',', $this->literals), true)); return $data['hash']; } /** * Checks if this rule is equal to another one * * Ignores whether either of the rules is disabled. * * @param Rule $rule The rule to check against * @return bool Whether the rules are equal */ public function equals(Rule $rule) { return $this->literals === $rule->getLiterals(); } public function isAssertion() { return 1 === count($this->literals); } /** * Formats a rule as a string of the format (Literal1|Literal2|...) * * @return string */ public function __toString() { $result = $this->isDisabled() ? 'disabled(' : '('; foreach ($this->literals as $i => $literal) { if ($i != 0) { $result .= '|'; } $result .= $literal; } $result .= ')'; return $result; } } composer/src/Composer/DependencyResolver/Pool.php 0000644 00000033644 14736103146 0016212 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver; use Composer\Package\BasePackage; use Composer\Package\AliasPackage; use Composer\Package\Version\VersionParser; use Composer\Semver\Constraint\ConstraintInterface; use Composer\Semver\Constraint\Constraint; use Composer\Semver\Constraint\EmptyConstraint; use Composer\Repository\RepositoryInterface; use Composer\Repository\CompositeRepository; use Composer\Repository\ComposerRepository; use Composer\Repository\InstalledRepositoryInterface; use Composer\Repository\PlatformRepository; use Composer\Package\PackageInterface; /** * A package pool contains repositories that provide packages. * * @author Nils Adermann <naderman@naderman.de> * @author Jordi Boggiano <j.boggiano@seld.be> */ class Pool implements \Countable { const MATCH_NAME = -1; const MATCH_NONE = 0; const MATCH = 1; const MATCH_PROVIDE = 2; const MATCH_REPLACE = 3; const MATCH_FILTERED = 4; protected $repositories = array(); protected $providerRepos = array(); protected $packages = array(); protected $packageByName = array(); protected $packageByExactName = array(); protected $acceptableStabilities; protected $stabilityFlags; protected $versionParser; protected $providerCache = array(); protected $filterRequires; protected $whitelist = null; protected $id = 1; public function __construct($minimumStability = 'stable', array $stabilityFlags = array(), array $filterRequires = array()) { $this->versionParser = new VersionParser; $this->acceptableStabilities = array(); foreach (BasePackage::$stabilities as $stability => $value) { if ($value <= BasePackage::$stabilities[$minimumStability]) { $this->acceptableStabilities[$stability] = $value; } } $this->stabilityFlags = $stabilityFlags; $this->filterRequires = $filterRequires; foreach ($filterRequires as $name => $constraint) { if (preg_match(PlatformRepository::PLATFORM_PACKAGE_REGEX, $name)) { unset($this->filterRequires[$name]); } } } public function setWhitelist($whitelist) { $this->whitelist = $whitelist; $this->providerCache = array(); } /** * Adds a repository and its packages to this package pool * * @param RepositoryInterface $repo A package repository * @param array $rootAliases */ public function addRepository(RepositoryInterface $repo, $rootAliases = array()) { if ($repo instanceof CompositeRepository) { $repos = $repo->getRepositories(); } else { $repos = array($repo); } foreach ($repos as $repo) { $this->repositories[] = $repo; $exempt = $repo instanceof PlatformRepository || $repo instanceof InstalledRepositoryInterface; if ($repo instanceof ComposerRepository && $repo->hasProviders()) { $this->providerRepos[] = $repo; $repo->setRootAliases($rootAliases); $repo->resetPackageIds(); } else { foreach ($repo->getPackages() as $package) { $names = $package->getNames(); $stability = $package->getStability(); if ($exempt || $this->isPackageAcceptable($names, $stability)) { $package->setId($this->id++); $this->packages[] = $package; $this->packageByExactName[$package->getName()][$package->id] = $package; foreach ($names as $provided) { $this->packageByName[$provided][] = $package; } // handle root package aliases $name = $package->getName(); if (isset($rootAliases[$name][$package->getVersion()])) { $alias = $rootAliases[$name][$package->getVersion()]; if ($package instanceof AliasPackage) { $package = $package->getAliasOf(); } $aliasPackage = new AliasPackage($package, $alias['alias_normalized'], $alias['alias']); $aliasPackage->setRootPackageAlias(true); $aliasPackage->setId($this->id++); $package->getRepository()->addPackage($aliasPackage); $this->packages[] = $aliasPackage; $this->packageByExactName[$aliasPackage->getName()][$aliasPackage->id] = $aliasPackage; foreach ($aliasPackage->getNames() as $name) { $this->packageByName[$name][] = $aliasPackage; } } } } } } } public function getPriority(RepositoryInterface $repo) { $priority = array_search($repo, $this->repositories, true); if (false === $priority) { throw new \RuntimeException("Could not determine repository priority. The repository was not registered in the pool."); } return -$priority; } /** * Retrieves the package object for a given package id. * * @param int $id * @return PackageInterface */ public function packageById($id) { return $this->packages[$id - 1]; } /** * Returns how many packages have been loaded into the pool */ #[\ReturnTypeWillChange] public function count() { return count($this->packages); } /** * Searches all packages providing the given package name and match the constraint * * @param string $name The package name to be searched for * @param ConstraintInterface $constraint A constraint that all returned * packages must match or null to return all * @param bool $mustMatchName Whether the name of returned packages * must match the given name * @param bool $bypassFilters If enabled, filterRequires and stability matching is ignored * @return PackageInterface[] A set of packages */ public function whatProvides($name, ConstraintInterface $constraint = null, $mustMatchName = false, $bypassFilters = false) { if ($bypassFilters) { return $this->computeWhatProvides($name, $constraint, $mustMatchName, true); } $key = ((int) $mustMatchName).$constraint; if (isset($this->providerCache[$name][$key])) { return $this->providerCache[$name][$key]; } return $this->providerCache[$name][$key] = $this->computeWhatProvides($name, $constraint, $mustMatchName, $bypassFilters); } /** * @see whatProvides */ private function computeWhatProvides($name, $constraint, $mustMatchName = false, $bypassFilters = false) { $candidates = array(); foreach ($this->providerRepos as $repo) { foreach ($repo->whatProvides($this, $name, $bypassFilters) as $candidate) { $candidates[] = $candidate; if ($candidate->id < 1) { $candidate->setId($this->id++); $this->packages[$this->id - 2] = $candidate; } } } if ($mustMatchName) { $candidates = array_filter($candidates, function ($candidate) use ($name) { return $candidate->getName() == $name; }); if (isset($this->packageByExactName[$name])) { $candidates = array_merge($candidates, $this->packageByExactName[$name]); } } elseif (isset($this->packageByName[$name])) { $candidates = array_merge($candidates, $this->packageByName[$name]); } $matches = $provideMatches = array(); $nameMatch = false; foreach ($candidates as $candidate) { $aliasOfCandidate = null; // alias packages are not white listed, make sure that the package // being aliased is white listed if ($candidate instanceof AliasPackage) { $aliasOfCandidate = $candidate->getAliasOf(); } if ($this->whitelist !== null && !$bypassFilters && ( (!($candidate instanceof AliasPackage) && !isset($this->whitelist[$candidate->id])) || ($candidate instanceof AliasPackage && !isset($this->whitelist[$aliasOfCandidate->id])) )) { continue; } switch ($this->match($candidate, $name, $constraint, $bypassFilters)) { case self::MATCH_NONE: break; case self::MATCH_NAME: $nameMatch = true; break; case self::MATCH: $nameMatch = true; $matches[] = $candidate; break; case self::MATCH_PROVIDE: $provideMatches[] = $candidate; break; case self::MATCH_REPLACE: $matches[] = $candidate; break; case self::MATCH_FILTERED: break; default: throw new \UnexpectedValueException('Unexpected match type'); } } // if a package with the required name exists, we ignore providers if ($nameMatch) { return $matches; } return array_merge($matches, $provideMatches); } public function literalToPackage($literal) { $packageId = abs($literal); return $this->packageById($packageId); } public function literalToPrettyString($literal, $installedMap) { $package = $this->literalToPackage($literal); if (isset($installedMap[$package->id])) { $prefix = ($literal > 0 ? 'keep' : 'remove'); } else { $prefix = ($literal > 0 ? 'install' : 'don\'t install'); } return $prefix.' '.$package->getPrettyString(); } public function isPackageAcceptable($name, $stability) { foreach ((array) $name as $n) { // allow if package matches the global stability requirement and has no exception if (!isset($this->stabilityFlags[$n]) && isset($this->acceptableStabilities[$stability])) { return true; } // allow if package matches the package-specific stability flag if (isset($this->stabilityFlags[$n]) && BasePackage::$stabilities[$stability] <= $this->stabilityFlags[$n]) { return true; } } return false; } /** * Checks if the package matches the given constraint directly or through * provided or replaced packages * * @param PackageInterface $candidate * @param string $name Name of the package to be matched * @param ConstraintInterface $constraint The constraint to verify * @return int One of the MATCH* constants of this class or 0 if there is no match */ public function match($candidate, $name, ConstraintInterface $constraint = null, $bypassFilters) { $candidateName = $candidate->getName(); $candidateVersion = $candidate->getVersion(); $isDev = $candidate->getStability() === 'dev'; $isAlias = $candidate instanceof AliasPackage; if (!$bypassFilters && !$isDev && !$isAlias && isset($this->filterRequires[$name])) { $requireFilter = $this->filterRequires[$name]; } else { $requireFilter = new EmptyConstraint; } if ($candidateName === $name) { $pkgConstraint = new Constraint('==', $candidateVersion); if ($constraint === null || $constraint->matches($pkgConstraint)) { return $requireFilter->matches($pkgConstraint) ? self::MATCH : self::MATCH_FILTERED; } return self::MATCH_NAME; } $provides = $candidate->getProvides(); $replaces = $candidate->getReplaces(); // aliases create multiple replaces/provides for one target so they can not use the shortcut below if (isset($replaces[0]) || isset($provides[0])) { foreach ($provides as $link) { if ($link->getTarget() === $name && ($constraint === null || $constraint->matches($link->getConstraint()))) { return $requireFilter->matches($link->getConstraint()) ? self::MATCH_PROVIDE : self::MATCH_FILTERED; } } foreach ($replaces as $link) { if ($link->getTarget() === $name && ($constraint === null || $constraint->matches($link->getConstraint()))) { return $requireFilter->matches($link->getConstraint()) ? self::MATCH_REPLACE : self::MATCH_FILTERED; } } return self::MATCH_NONE; } if (isset($provides[$name]) && ($constraint === null || $constraint->matches($provides[$name]->getConstraint()))) { return $requireFilter->matches($provides[$name]->getConstraint()) ? self::MATCH_PROVIDE : self::MATCH_FILTERED; } if (isset($replaces[$name]) && ($constraint === null || $constraint->matches($replaces[$name]->getConstraint()))) { return $requireFilter->matches($replaces[$name]->getConstraint()) ? self::MATCH_REPLACE : self::MATCH_FILTERED; } return self::MATCH_NONE; } } composer/src/Composer/DependencyResolver/RuleWatchNode.php 0000644 00000005334 14736103146 0020000 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver; /** * Wrapper around a Rule which keeps track of the two literals it watches * * Used by RuleWatchGraph to store rules in two RuleWatchChains. * * @author Nils Adermann <naderman@naderman.de> */ class RuleWatchNode { public $watch1; public $watch2; protected $rule; /** * Creates a new node watching the first and second literals of the rule. * * @param Rule $rule The rule to wrap */ public function __construct($rule) { $this->rule = $rule; $literals = $rule->getLiterals(); $literalCount = count($literals); $this->watch1 = $literalCount > 0 ? $literals[0] : 0; $this->watch2 = $literalCount > 1 ? $literals[1] : 0; } /** * Places the second watch on the rule's literal, decided at the highest level * * Useful for learned rules where the literal for the highest rule is most * likely to quickly lead to further decisions. * * @param Decisions $decisions The decisions made so far by the solver */ public function watch2OnHighest(Decisions $decisions) { $literals = $this->rule->getLiterals(); // if there are only 2 elements, both are being watched anyway if (count($literals) < 3) { return; } $watchLevel = 0; foreach ($literals as $literal) { $level = $decisions->decisionLevel($literal); if ($level > $watchLevel) { $this->watch2 = $literal; $watchLevel = $level; } } } /** * Returns the rule this node wraps * * @return Rule */ public function getRule() { return $this->rule; } /** * Given one watched literal, this method returns the other watched literal * * @param int $literal The watched literal that should not be returned * @return int A literal */ public function getOtherWatch($literal) { if ($this->watch1 == $literal) { return $this->watch2; } return $this->watch1; } /** * Moves a watch from one literal to another * * @param int $from The previously watched literal * @param int $to The literal to be watched now */ public function moveWatch($from, $to) { if ($this->watch1 == $from) { $this->watch1 = $to; } else { $this->watch2 = $to; } } } composer/src/Composer/DependencyResolver/RuleSet.php 0000644 00000010166 14736103146 0016656 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver; /** * @author Nils Adermann <naderman@naderman.de> */ class RuleSet implements \IteratorAggregate, \Countable { // highest priority => lowest number const TYPE_PACKAGE = 0; const TYPE_JOB = 1; const TYPE_LEARNED = 4; /** * READ-ONLY: Lookup table for rule id to rule object * * @var Rule[] */ public $ruleById; protected static $types = array( 255 => 'UNKNOWN', self::TYPE_PACKAGE => 'PACKAGE', self::TYPE_JOB => 'JOB', self::TYPE_LEARNED => 'LEARNED', ); protected $rules; protected $nextRuleId; protected $rulesByHash; public function __construct() { $this->nextRuleId = 0; foreach ($this->getTypes() as $type) { $this->rules[$type] = array(); } $this->rulesByHash = array(); } public function add(Rule $rule, $type) { if (!isset(self::$types[$type])) { throw new \OutOfBoundsException('Unknown rule type: ' . $type); } $hash = $rule->getHash(); // Do not add if rule already exists if (isset($this->rulesByHash[$hash])) { $potentialDuplicates = $this->rulesByHash[$hash]; if (is_array($potentialDuplicates)) { foreach ($potentialDuplicates as $potentialDuplicate) { if ($rule->equals($potentialDuplicate)) { return; } } } else { if ($rule->equals($potentialDuplicates)) { return; } } } if (!isset($this->rules[$type])) { $this->rules[$type] = array(); } $this->rules[$type][] = $rule; $this->ruleById[$this->nextRuleId] = $rule; $rule->setType($type); $this->nextRuleId++; if (!isset($this->rulesByHash[$hash])) { $this->rulesByHash[$hash] = $rule; } elseif (is_array($this->rulesByHash[$hash])) { $this->rulesByHash[$hash][] = $rule; } else { $originalRule = $this->rulesByHash[$hash]; $this->rulesByHash[$hash] = array($originalRule, $rule); } } #[\ReturnTypeWillChange] public function count() { return $this->nextRuleId; } public function ruleById($id) { return $this->ruleById[$id]; } public function getRules() { return $this->rules; } #[\ReturnTypeWillChange] public function getIterator() { return new RuleSetIterator($this->getRules()); } public function getIteratorFor($types) { if (!is_array($types)) { $types = array($types); } $allRules = $this->getRules(); $rules = array(); foreach ($types as $type) { $rules[$type] = $allRules[$type]; } return new RuleSetIterator($rules); } public function getIteratorWithout($types) { if (!is_array($types)) { $types = array($types); } $rules = $this->getRules(); foreach ($types as $type) { unset($rules[$type]); } return new RuleSetIterator($rules); } public function getTypes() { $types = self::$types; unset($types[255]); return array_keys($types); } public function getPrettyString(Pool $pool = null) { $string = "\n"; foreach ($this->rules as $type => $rules) { $string .= str_pad(self::$types[$type], 8, ' ') . ": "; foreach ($rules as $rule) { $string .= ($pool ? $rule->getPrettyString($pool) : $rule)."\n"; } $string .= "\n\n"; } return $string; } public function __toString() { return $this->getPrettyString(null); } } composer/src/Composer/DependencyResolver/Rule.php 0000644 00000022371 14736103146 0016203 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver; use Composer\Package\CompletePackage; use Composer\Package\Link; use Composer\Package\PackageInterface; /** * @author Nils Adermann <naderman@naderman.de> * @author Ruben Gonzalez <rubenrua@gmail.com> */ abstract class Rule { // reason constants const RULE_INTERNAL_ALLOW_UPDATE = 1; const RULE_JOB_INSTALL = 2; const RULE_JOB_REMOVE = 3; const RULE_PACKAGE_CONFLICT = 6; const RULE_PACKAGE_REQUIRES = 7; const RULE_PACKAGE_OBSOLETES = 8; const RULE_INSTALLED_PACKAGE_OBSOLETES = 9; const RULE_PACKAGE_SAME_NAME = 10; const RULE_PACKAGE_IMPLICIT_OBSOLETES = 11; const RULE_LEARNED = 12; const RULE_PACKAGE_ALIAS = 13; // bitfield defs const BITFIELD_TYPE = 0; const BITFIELD_REASON = 8; const BITFIELD_DISABLED = 16; protected $bitfield; protected $job; protected $reasonData; /** * @param int $reason A RULE_* constant describing the reason for generating this rule * @param Link|PackageInterface $reasonData * @param array $job The job this rule was created from */ public function __construct($reason, $reasonData, $job = null) { $this->reasonData = $reasonData; if ($job) { $this->job = $job; } $this->bitfield = (0 << self::BITFIELD_DISABLED) | ($reason << self::BITFIELD_REASON) | (255 << self::BITFIELD_TYPE); } abstract public function getLiterals(); abstract public function getHash(); public function getJob() { return $this->job; } abstract public function equals(Rule $rule); public function getReason() { return ($this->bitfield & (255 << self::BITFIELD_REASON)) >> self::BITFIELD_REASON; } public function getReasonData() { return $this->reasonData; } public function getRequiredPackage() { if ($this->getReason() === self::RULE_JOB_INSTALL) { return $this->reasonData; } if ($this->getReason() === self::RULE_PACKAGE_REQUIRES) { return $this->reasonData->getTarget(); } } public function setType($type) { $this->bitfield = ($this->bitfield & ~(255 << self::BITFIELD_TYPE)) | ((255 & $type) << self::BITFIELD_TYPE); } public function getType() { return ($this->bitfield & (255 << self::BITFIELD_TYPE)) >> self::BITFIELD_TYPE; } public function disable() { $this->bitfield = ($this->bitfield & ~(255 << self::BITFIELD_DISABLED)) | (1 << self::BITFIELD_DISABLED); } public function enable() { $this->bitfield &= ~(255 << self::BITFIELD_DISABLED); } public function isDisabled() { return (bool) (($this->bitfield & (255 << self::BITFIELD_DISABLED)) >> self::BITFIELD_DISABLED); } public function isEnabled() { return !(($this->bitfield & (255 << self::BITFIELD_DISABLED)) >> self::BITFIELD_DISABLED); } abstract public function isAssertion(); public function getPrettyString(Pool $pool, array $installedMap = array()) { $literals = $this->getLiterals(); $ruleText = ''; foreach ($literals as $i => $literal) { if ($i != 0) { $ruleText .= '|'; } $ruleText .= $pool->literalToPrettyString($literal, $installedMap); } switch ($this->getReason()) { case self::RULE_INTERNAL_ALLOW_UPDATE: return $ruleText; case self::RULE_JOB_INSTALL: return "Install command rule ($ruleText)"; case self::RULE_JOB_REMOVE: return "Remove command rule ($ruleText)"; case self::RULE_PACKAGE_CONFLICT: $package1 = $pool->literalToPackage($literals[0]); $package2 = $pool->literalToPackage($literals[1]); return $package1->getPrettyString().' conflicts with '.$this->formatPackagesUnique($pool, array($package2)).'.'; case self::RULE_PACKAGE_REQUIRES: $sourceLiteral = array_shift($literals); $sourcePackage = $pool->literalToPackage($sourceLiteral); $requires = array(); foreach ($literals as $literal) { $requires[] = $pool->literalToPackage($literal); } $text = $this->reasonData->getPrettyString($sourcePackage); if ($requires) { $text .= ' -> satisfiable by ' . $this->formatPackagesUnique($pool, $requires) . '.'; } else { $targetName = $this->reasonData->getTarget(); if ($targetName === 'php' || $targetName === 'php-64bit' || $targetName === 'hhvm') { // handle php/hhvm if (defined('HHVM_VERSION')) { return $text . ' -> your HHVM version does not satisfy that requirement.'; } $packages = $pool->whatProvides($targetName); $package = count($packages) ? current($packages) : phpversion(); if ($targetName === 'hhvm') { if ($package instanceof CompletePackage) { return $text . ' -> your HHVM version ('.$package->getPrettyVersion().') does not satisfy that requirement.'; } else { return $text . ' -> you are running this with PHP and not HHVM.'; } } if (!($package instanceof CompletePackage)) { return $text . ' -> your PHP version ('.phpversion().') does not satisfy that requirement.'; } $extra = $package->getExtra(); if (!empty($extra['config.platform'])) { $text .= ' -> your PHP version ('.phpversion().') overridden by "config.platform.php" version ('.$package->getPrettyVersion().') does not satisfy that requirement.'; } else { $text .= ' -> your PHP version ('.$package->getPrettyVersion().') does not satisfy that requirement.'; } return $text; } if (0 === strpos($targetName, 'ext-')) { // handle php extensions $ext = substr($targetName, 4); $error = extension_loaded($ext) ? 'has the wrong version ('.(phpversion($ext) ?: '0').') installed' : 'is missing from your system'; return $text . ' -> the requested PHP extension '.$ext.' '.$error.'.'; } if (0 === strpos($targetName, 'lib-')) { // handle linked libs $lib = substr($targetName, 4); return $text . ' -> the requested linked library '.$lib.' has the wrong version installed or is missing from your system, make sure to have the extension providing it.'; } if ($providers = $pool->whatProvides($targetName, $this->reasonData->getConstraint(), true, true)) { return $text . ' -> satisfiable by ' . $this->formatPackagesUnique($pool, $providers) .' but these conflict with your requirements or minimum-stability.'; } return $text . ' -> no matching package found.'; } return $text; case self::RULE_PACKAGE_OBSOLETES: return $ruleText; case self::RULE_INSTALLED_PACKAGE_OBSOLETES: return $ruleText; case self::RULE_PACKAGE_SAME_NAME: return 'Can only install one of: ' . $this->formatPackagesUnique($pool, $literals) . '.'; case self::RULE_PACKAGE_IMPLICIT_OBSOLETES: return $ruleText; case self::RULE_LEARNED: return 'Conclusion: '.$ruleText; case self::RULE_PACKAGE_ALIAS: return $ruleText; default: return '('.$ruleText.')'; } } /** * @param Pool $pool * @param array $packages * * @return string */ protected function formatPackagesUnique($pool, array $packages) { $prepared = array(); foreach ($packages as $package) { if (!is_object($package)) { $package = $pool->literalToPackage($package); } $prepared[$package->getName()]['name'] = $package->getPrettyName(); $prepared[$package->getName()]['versions'][$package->getVersion()] = $package->getPrettyVersion(); } foreach ($prepared as $name => $package) { $prepared[$name] = $package['name'].'['.implode(', ', $package['versions']).']'; } return implode(', ', $prepared); } } composer/src/Composer/DependencyResolver/RuleWatchGraph.php 0000644 00000012345 14736103146 0020154 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver; /** * The RuleWatchGraph efficiently propagates decisions to other rules * * All rules generated for solving a SAT problem should be inserted into the * graph. When a decision on a literal is made, the graph can be used to * propagate the decision to all other rules involving the literal, leading to * other trivial decisions resulting from unit clauses. * * @author Nils Adermann <naderman@naderman.de> */ class RuleWatchGraph { protected $watchChains = array(); /** * Inserts a rule node into the appropriate chains within the graph * * The node is prepended to the watch chains for each of the two literals it * watches. * * Assertions are skipped because they only depend on a single package and * have no alternative literal that could be true, so there is no need to * watch changes in any literals. * * @param RuleWatchNode $node The rule node to be inserted into the graph */ public function insert(RuleWatchNode $node) { if ($node->getRule()->isAssertion()) { return; } foreach (array($node->watch1, $node->watch2) as $literal) { if (!isset($this->watchChains[$literal])) { $this->watchChains[$literal] = new RuleWatchChain; } $this->watchChains[$literal]->unshift($node); } } /** * Propagates a decision on a literal to all rules watching the literal * * If a decision, e.g. +A has been made, then all rules containing -A, e.g. * (-A|+B|+C) now need to satisfy at least one of the other literals, so * that the rule as a whole becomes true, since with +A applied the rule * is now (false|+B|+C) so essentially (+B|+C). * * This means that all rules watching the literal -A need to be updated to * watch 2 other literals which can still be satisfied instead. So literals * that conflict with previously made decisions are not an option. * * Alternatively it can occur that a unit clause results: e.g. if in the * above example the rule was (-A|+B), then A turning true means that * B must now be decided true as well. * * @param int $decidedLiteral The literal which was decided (A in our example) * @param int $level The level at which the decision took place and at which * all resulting decisions should be made. * @param Decisions $decisions Used to check previous decisions and to * register decisions resulting from propagation * @return Rule|null If a conflict is found the conflicting rule is returned */ public function propagateLiteral($decidedLiteral, $level, $decisions) { // we invert the decided literal here, example: // A was decided => (-A|B) now requires B to be true, so we look for // rules which are fulfilled by -A, rather than A. $literal = -$decidedLiteral; if (!isset($this->watchChains[$literal])) { return null; } $chain = $this->watchChains[$literal]; $chain->rewind(); while ($chain->valid()) { $node = $chain->current(); $otherWatch = $node->getOtherWatch($literal); if (!$node->getRule()->isDisabled() && !$decisions->satisfy($otherWatch)) { $ruleLiterals = $node->getRule()->getLiterals(); $alternativeLiterals = array_filter($ruleLiterals, function ($ruleLiteral) use ($literal, $otherWatch, $decisions) { return $literal !== $ruleLiteral && $otherWatch !== $ruleLiteral && !$decisions->conflict($ruleLiteral); }); if ($alternativeLiterals) { reset($alternativeLiterals); $this->moveWatch($literal, current($alternativeLiterals), $node); continue; } if ($decisions->conflict($otherWatch)) { return $node->getRule(); } $decisions->decide($otherWatch, $level, $node->getRule()); } $chain->next(); } return null; } /** * Moves a rule node from one watch chain to another * * The rule node's watched literals are updated accordingly. * * @param int $fromLiteral A literal the node used to watch * @param int $toLiteral A literal the node should watch now * @param RuleWatchNode $node The rule node to be moved */ protected function moveWatch($fromLiteral, $toLiteral, $node) { if (!isset($this->watchChains[$toLiteral])) { $this->watchChains[$toLiteral] = new RuleWatchChain; } $node->moveWatch($fromLiteral, $toLiteral); $this->watchChains[$fromLiteral]->remove(); $this->watchChains[$toLiteral]->unshift($node); } } composer/src/Composer/DependencyResolver/RuleWatchChain.php 0000644 00000002572 14736103146 0020136 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver; /** * An extension of SplDoublyLinkedList with seek and removal of current element * * SplDoublyLinkedList only allows deleting a particular offset and has no * method to set the internal iterator to a particular offset. * * @author Nils Adermann <naderman@naderman.de> */ class RuleWatchChain extends \SplDoublyLinkedList { protected $offset = 0; /** * Moves the internal iterator to the specified offset * * @param int $offset The offset to seek to. */ public function seek($offset) { $this->rewind(); for ($i = 0; $i < $offset; $i++, $this->next()); } /** * Removes the current element from the list * * As SplDoublyLinkedList only allows deleting a particular offset and * incorrectly sets the internal iterator if you delete the current value * this method sets the internal iterator back to the following element * using the seek method. */ public function remove() { $offset = $this->key(); $this->offsetUnset($offset); $this->seek($offset); } } composer/src/Composer/DependencyResolver/DefaultPolicy.php 0000644 00000022207 14736103146 0020036 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver; use Composer\Package\PackageInterface; use Composer\Package\AliasPackage; use Composer\Package\BasePackage; use Composer\Semver\Constraint\Constraint; /** * @author Nils Adermann <naderman@naderman.de> * @author Jordi Boggiano <j.boggiano@seld.be> */ class DefaultPolicy implements PolicyInterface { private $preferStable; private $preferLowest; public function __construct($preferStable = false, $preferLowest = false) { $this->preferStable = $preferStable; $this->preferLowest = $preferLowest; } public function versionCompare(PackageInterface $a, PackageInterface $b, $operator) { if ($this->preferStable && ($stabA = $a->getStability()) !== ($stabB = $b->getStability())) { return BasePackage::$stabilities[$stabA] < BasePackage::$stabilities[$stabB]; } $constraint = new Constraint($operator, $b->getVersion()); $version = new Constraint('==', $a->getVersion()); return $constraint->matchSpecific($version, true); } public function findUpdatePackages(Pool $pool, array $installedMap, PackageInterface $package, $mustMatchName = false) { $packages = array(); foreach ($pool->whatProvides($package->getName(), null, $mustMatchName) as $candidate) { if ($candidate !== $package) { $packages[] = $candidate; } } return $packages; } public function getPriority(Pool $pool, PackageInterface $package) { return $pool->getPriority($package->getRepository()); } public function selectPreferredPackages(Pool $pool, array $installedMap, array $literals, $requiredPackage = null) { $packages = $this->groupLiteralsByNamePreferInstalled($pool, $installedMap, $literals); foreach ($packages as &$literals) { $policy = $this; usort($literals, function ($a, $b) use ($policy, $pool, $installedMap, $requiredPackage) { return $policy->compareByPriorityPreferInstalled($pool, $installedMap, $pool->literalToPackage($a), $pool->literalToPackage($b), $requiredPackage, true); }); } foreach ($packages as &$literals) { $literals = $this->pruneToHighestPriorityOrInstalled($pool, $installedMap, $literals); $literals = $this->pruneToBestVersion($pool, $literals); $literals = $this->pruneRemoteAliases($pool, $literals); } $selected = call_user_func_array('array_merge', array_values($packages)); // now sort the result across all packages to respect replaces across packages usort($selected, function ($a, $b) use ($policy, $pool, $installedMap, $requiredPackage) { return $policy->compareByPriorityPreferInstalled($pool, $installedMap, $pool->literalToPackage($a), $pool->literalToPackage($b), $requiredPackage); }); return $selected; } protected function groupLiteralsByNamePreferInstalled(Pool $pool, array $installedMap, $literals) { $packages = array(); foreach ($literals as $literal) { $packageName = $pool->literalToPackage($literal)->getName(); if (!isset($packages[$packageName])) { $packages[$packageName] = array(); } if (isset($installedMap[abs($literal)])) { array_unshift($packages[$packageName], $literal); } else { $packages[$packageName][] = $literal; } } return $packages; } /** * @protected */ public function compareByPriorityPreferInstalled(Pool $pool, array $installedMap, PackageInterface $a, PackageInterface $b, $requiredPackage = null, $ignoreReplace = false) { if ($a->getRepository() === $b->getRepository()) { // prefer aliases to the original package if ($a->getName() === $b->getName()) { $aAliased = $a instanceof AliasPackage; $bAliased = $b instanceof AliasPackage; if ($aAliased && !$bAliased) { return -1; // use a } if (!$aAliased && $bAliased) { return 1; // use b } } if (!$ignoreReplace) { // return original, not replaced if ($this->replaces($a, $b)) { return 1; // use b } if ($this->replaces($b, $a)) { return -1; // use a } // for replacers not replacing each other, put a higher prio on replacing // packages with the same vendor as the required package if ($requiredPackage && false !== ($pos = strpos($requiredPackage, '/'))) { $requiredVendor = substr($requiredPackage, 0, $pos); $aIsSameVendor = substr($a->getName(), 0, $pos) === $requiredVendor; $bIsSameVendor = substr($b->getName(), 0, $pos) === $requiredVendor; if ($bIsSameVendor !== $aIsSameVendor) { return $aIsSameVendor ? -1 : 1; } } } // priority equal, sort by package id to make reproducible if ($a->id === $b->id) { return 0; } return ($a->id < $b->id) ? -1 : 1; } if (isset($installedMap[$a->id])) { return -1; } if (isset($installedMap[$b->id])) { return 1; } return ($this->getPriority($pool, $a) > $this->getPriority($pool, $b)) ? -1 : 1; } /** * Checks if source replaces a package with the same name as target. * * Replace constraints are ignored. This method should only be used for * prioritisation, not for actual constraint verification. * * @param PackageInterface $source * @param PackageInterface $target * @return bool */ protected function replaces(PackageInterface $source, PackageInterface $target) { foreach ($source->getReplaces() as $link) { if ($link->getTarget() === $target->getName() // && (null === $link->getConstraint() || // $link->getConstraint()->matches(new Constraint('==', $target->getVersion())))) { ) { return true; } } return false; } protected function pruneToBestVersion(Pool $pool, $literals) { $operator = $this->preferLowest ? '<' : '>'; $bestLiterals = array($literals[0]); $bestPackage = $pool->literalToPackage($literals[0]); foreach ($literals as $i => $literal) { if (0 === $i) { continue; } $package = $pool->literalToPackage($literal); if ($this->versionCompare($package, $bestPackage, $operator)) { $bestPackage = $package; $bestLiterals = array($literal); } elseif ($this->versionCompare($package, $bestPackage, '==')) { $bestLiterals[] = $literal; } } return $bestLiterals; } /** * Assumes that installed packages come first and then all highest priority packages */ protected function pruneToHighestPriorityOrInstalled(Pool $pool, array $installedMap, array $literals) { $selected = array(); $priority = null; foreach ($literals as $literal) { $package = $pool->literalToPackage($literal); if (isset($installedMap[$package->id])) { $selected[] = $literal; continue; } if (null === $priority) { $priority = $this->getPriority($pool, $package); } if ($this->getPriority($pool, $package) != $priority) { break; } $selected[] = $literal; } return $selected; } /** * Assumes that locally aliased (in root package requires) packages take priority over branch-alias ones * * If no package is a local alias, nothing happens */ protected function pruneRemoteAliases(Pool $pool, array $literals) { $hasLocalAlias = false; foreach ($literals as $literal) { $package = $pool->literalToPackage($literal); if ($package instanceof AliasPackage && $package->isRootPackageAlias()) { $hasLocalAlias = true; break; } } if (!$hasLocalAlias) { return $literals; } $selected = array(); foreach ($literals as $literal) { $package = $pool->literalToPackage($literal); if ($package instanceof AliasPackage && $package->isRootPackageAlias()) { $selected[] = $literal; } } return $selected; } } composer/src/Composer/DependencyResolver/Rule2Literals.php 0000644 00000005266 14736103146 0017771 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver; use Composer\Package\PackageInterface; use Composer\Package\Link; /** * @author Nils Adermann <naderman@naderman.de> */ class Rule2Literals extends Rule { protected $literal1; protected $literal2; /** * @param int $literal1 * @param int $literal2 * @param int $reason A RULE_* constant describing the reason for generating this rule * @param Link|PackageInterface $reasonData * @param array $job The job this rule was created from */ public function __construct($literal1, $literal2, $reason, $reasonData, $job = null) { parent::__construct($reason, $reasonData, $job); if ($literal1 < $literal2) { $this->literal1 = $literal1; $this->literal2 = $literal2; } else { $this->literal1 = $literal2; $this->literal2 = $literal1; } } public function getLiterals() { return array($this->literal1, $this->literal2); } public function getHash() { return $this->literal1.','.$this->literal2; } /** * Checks if this rule is equal to another one * * Ignores whether either of the rules is disabled. * * @param Rule $rule The rule to check against * @return bool Whether the rules are equal */ public function equals(Rule $rule) { // specialized fast-case if ($rule instanceof self) { if ($this->literal1 !== $rule->literal1) { return false; } if ($this->literal2 !== $rule->literal2) { return false; } return true; } $literals = $rule->getLiterals(); if (2 != count($literals)) { return false; } if ($this->literal1 !== $literals[0]) { return false; } if ($this->literal2 !== $literals[1]) { return false; } return true; } public function isAssertion() { return false; } /** * Formats a rule as a string of the format (Literal1|Literal2|...) * * @return string */ public function __toString() { $result = $this->isDisabled() ? 'disabled(' : '('; $result .= $this->literal1 . '|' . $this->literal2 . ')'; return $result; } } composer/src/Composer/DependencyResolver/Operation/InstallOperation.php 0000644 00000002513 14736103146 0022517 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver\Operation; use Composer\Package\PackageInterface; /** * Solver install operation. * * @author Konstantin Kudryashov <ever.zet@gmail.com> */ class InstallOperation extends SolverOperation { protected $package; /** * Initializes operation. * * @param PackageInterface $package package instance * @param string $reason operation reason */ public function __construct(PackageInterface $package, $reason = null) { parent::__construct($reason); $this->package = $package; } /** * Returns package instance. * * @return PackageInterface */ public function getPackage() { return $this->package; } /** * Returns job type. * * @return string */ public function getJobType() { return 'install'; } /** * {@inheritDoc} */ public function __toString() { return 'Installing '.$this->package->getPrettyName().' ('.$this->formatVersion($this->package).')'; } } composer/src/Composer/DependencyResolver/Operation/MarkAliasInstalledOperation.php 0000644 00000002761 14736103146 0024622 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver\Operation; use Composer\Package\AliasPackage; use Composer\Package\PackageInterface; /** * Solver install operation. * * @author Nils Adermann <naderman@naderman.de> */ class MarkAliasInstalledOperation extends SolverOperation { protected $package; /** * Initializes operation. * * @param AliasPackage $package package instance * @param string $reason operation reason */ public function __construct(AliasPackage $package, $reason = null) { parent::__construct($reason); $this->package = $package; } /** * Returns package instance. * * @return PackageInterface */ public function getPackage() { return $this->package; } /** * Returns job type. * * @return string */ public function getJobType() { return 'markAliasInstalled'; } /** * {@inheritDoc} */ public function __toString() { return 'Marking '.$this->package->getPrettyName().' ('.$this->formatVersion($this->package).') as installed, alias of '.$this->package->getAliasOf()->getPrettyName().' ('.$this->formatVersion($this->package->getAliasOf()).')'; } } composer/src/Composer/DependencyResolver/Operation/UninstallOperation.php 0000644 00000002523 14736103146 0023063 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver\Operation; use Composer\Package\PackageInterface; /** * Solver uninstall operation. * * @author Konstantin Kudryashov <ever.zet@gmail.com> */ class UninstallOperation extends SolverOperation { protected $package; /** * Initializes operation. * * @param PackageInterface $package package instance * @param string $reason operation reason */ public function __construct(PackageInterface $package, $reason = null) { parent::__construct($reason); $this->package = $package; } /** * Returns package instance. * * @return PackageInterface */ public function getPackage() { return $this->package; } /** * Returns job type. * * @return string */ public function getJobType() { return 'uninstall'; } /** * {@inheritDoc} */ public function __toString() { return 'Uninstalling '.$this->package->getPrettyName().' ('.$this->formatVersion($this->package).')'; } } composer/src/Composer/DependencyResolver/Operation/OperationInterface.php 0000644 00000001443 14736103146 0023012 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver\Operation; /** * Solver operation interface. * * @author Konstantin Kudryashov <ever.zet@gmail.com> */ interface OperationInterface { /** * Returns job type. * * @return string */ public function getJobType(); /** * Returns operation reason. * * @return string */ public function getReason(); /** * Serializes the operation in a human readable format * * @return string */ public function __toString(); } composer/src/Composer/DependencyResolver/Operation/UpdateOperation.php 0000644 00000003765 14736103146 0022345 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver\Operation; use Composer\Package\PackageInterface; use Composer\Package\Version\VersionParser; /** * Solver update operation. * * @author Konstantin Kudryashov <ever.zet@gmail.com> */ class UpdateOperation extends SolverOperation { protected $initialPackage; protected $targetPackage; /** * Initializes update operation. * * @param PackageInterface $initial initial package * @param PackageInterface $target target package (updated) * @param string $reason update reason */ public function __construct(PackageInterface $initial, PackageInterface $target, $reason = null) { parent::__construct($reason); $this->initialPackage = $initial; $this->targetPackage = $target; } /** * Returns initial package. * * @return PackageInterface */ public function getInitialPackage() { return $this->initialPackage; } /** * Returns target package. * * @return PackageInterface */ public function getTargetPackage() { return $this->targetPackage; } /** * Returns job type. * * @return string */ public function getJobType() { return 'update'; } /** * {@inheritDoc} */ public function __toString() { $actionName = VersionParser::isUpgrade($this->initialPackage->getVersion(), $this->targetPackage->getVersion()) ? 'Updating' : 'Downgrading'; return $actionName.' '.$this->initialPackage->getPrettyName().' ('.$this->formatVersion($this->initialPackage).') to '. $this->targetPackage->getPrettyName(). ' ('.$this->formatVersion($this->targetPackage).')'; } } composer/src/Composer/DependencyResolver/Operation/MarkAliasUninstalledOperation.php 0000644 00000002767 14736103146 0025173 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver\Operation; use Composer\Package\AliasPackage; use Composer\Package\PackageInterface; /** * Solver install operation. * * @author Nils Adermann <naderman@naderman.de> */ class MarkAliasUninstalledOperation extends SolverOperation { protected $package; /** * Initializes operation. * * @param AliasPackage $package package instance * @param string $reason operation reason */ public function __construct(AliasPackage $package, $reason = null) { parent::__construct($reason); $this->package = $package; } /** * Returns package instance. * * @return PackageInterface */ public function getPackage() { return $this->package; } /** * Returns job type. * * @return string */ public function getJobType() { return 'markAliasUninstalled'; } /** * {@inheritDoc} */ public function __toString() { return 'Marking '.$this->package->getPrettyName().' ('.$this->formatVersion($this->package).') as uninstalled, alias of '.$this->package->getAliasOf()->getPrettyName().' ('.$this->formatVersion($this->package->getAliasOf()).')'; } } composer/src/Composer/DependencyResolver/Operation/SolverOperation.php 0000644 00000001774 14736103146 0022373 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver\Operation; use Composer\Package\PackageInterface; /** * Abstract solver operation class. * * @author Konstantin Kudryashov <ever.zet@gmail.com> */ abstract class SolverOperation implements OperationInterface { protected $reason; /** * Initializes operation. * * @param string $reason operation reason */ public function __construct($reason = null) { $this->reason = $reason; } /** * Returns operation reason. * * @return string */ public function getReason() { return $this->reason; } protected function formatVersion(PackageInterface $package) { return $package->getFullPrettyVersion(); } } composer/src/Composer/DependencyResolver/RuleSetIterator.php 0000644 00000004656 14736103146 0020377 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver; /** * @author Nils Adermann <naderman@naderman.de> */ class RuleSetIterator implements \Iterator { protected $rules; protected $types; protected $currentOffset; protected $currentType; protected $currentTypeOffset; public function __construct(array $rules) { $this->rules = $rules; $this->types = array_keys($rules); sort($this->types); $this->rewind(); } #[\ReturnTypeWillChange] public function current() { return $this->rules[$this->currentType][$this->currentOffset]; } #[\ReturnTypeWillChange] public function key() { return $this->currentType; } #[\ReturnTypeWillChange] public function next() { $this->currentOffset++; if (!isset($this->rules[$this->currentType])) { return; } if ($this->currentOffset >= count($this->rules[$this->currentType])) { $this->currentOffset = 0; do { $this->currentTypeOffset++; if (!isset($this->types[$this->currentTypeOffset])) { $this->currentType = -1; break; } $this->currentType = $this->types[$this->currentTypeOffset]; } while (isset($this->types[$this->currentTypeOffset]) && !count($this->rules[$this->currentType])); } } #[\ReturnTypeWillChange] public function rewind() { $this->currentOffset = 0; $this->currentTypeOffset = -1; $this->currentType = -1; do { $this->currentTypeOffset++; if (!isset($this->types[$this->currentTypeOffset])) { $this->currentType = -1; break; } $this->currentType = $this->types[$this->currentTypeOffset]; } while (isset($this->types[$this->currentTypeOffset]) && !count($this->rules[$this->currentType])); } #[\ReturnTypeWillChange] public function valid() { return isset($this->rules[$this->currentType]) && isset($this->rules[$this->currentType][$this->currentOffset]); } } composer/src/Composer/DependencyResolver/SolverProblemsException.php 0000644 00000005305 14736103146 0022127 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver; use Composer\Util\IniHelper; /** * @author Nils Adermann <naderman@naderman.de> */ class SolverProblemsException extends \RuntimeException { protected $problems; protected $installedMap; public function __construct(array $problems, array $installedMap) { $this->problems = $problems; $this->installedMap = $installedMap; parent::__construct($this->createMessage(), 2); } protected function createMessage() { $text = "\n"; $hasExtensionProblems = false; foreach ($this->problems as $i => $problem) { $text .= " Problem ".($i + 1).$problem->getPrettyString($this->installedMap)."\n"; if (!$hasExtensionProblems && $this->hasExtensionProblems($problem->getReasons())) { $hasExtensionProblems = true; } } if (strpos($text, 'could not be found') || strpos($text, 'no matching package found')) { $text .= "\nPotential causes:\n - A typo in the package name\n - The package is not available in a stable-enough version according to your minimum-stability setting\n see <https://getcomposer.org/doc/04-schema.md#minimum-stability> for more details.\n - It's a private package and you forgot to add a custom repository to find it\n\nRead <https://getcomposer.org/doc/articles/troubleshooting.md> for further common problems."; } if ($hasExtensionProblems) { $text .= $this->createExtensionHint(); } return $text; } public function getProblems() { return $this->problems; } private function createExtensionHint() { $paths = IniHelper::getAll(); if (count($paths) === 1 && empty($paths[0])) { return ''; } $text = "\n To enable extensions, verify that they are enabled in your .ini files:\n - "; $text .= implode("\n - ", $paths); $text .= "\n You can also run `php --ini` inside terminal to see which files are used by PHP in CLI mode."; return $text; } private function hasExtensionProblems(array $reasonSets) { foreach ($reasonSets as $reasonSet) { foreach ($reasonSet as $reason) { if (isset($reason["rule"]) && 0 === strpos($reason["rule"]->getRequiredPackage(), 'ext-')) { return true; } } } return false; } } composer/src/Composer/DependencyResolver/PolicyInterface.php 0000644 00000001352 14736103146 0020350 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver; use Composer\Package\PackageInterface; /** * @author Nils Adermann <naderman@naderman.de> */ interface PolicyInterface { public function versionCompare(PackageInterface $a, PackageInterface $b, $operator); public function findUpdatePackages(Pool $pool, array $installedMap, PackageInterface $package); public function selectPreferredPackages(Pool $pool, array $installedMap, array $literals, $requiredPackage = null); } composer/src/Composer/DependencyResolver/Decisions.php 0000644 00000013112 14736103146 0017205 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver; /** * Stores decisions on installing, removing or keeping packages * * @author Nils Adermann <naderman@naderman.de> */ class Decisions implements \Iterator, \Countable { const DECISION_LITERAL = 0; const DECISION_REASON = 1; protected $pool; protected $decisionMap; protected $decisionQueue = array(); public function __construct($pool) { $this->pool = $pool; $this->decisionMap = array(); } public function decide($literal, $level, $why) { $this->addDecision($literal, $level); $this->decisionQueue[] = array( self::DECISION_LITERAL => $literal, self::DECISION_REASON => $why, ); } public function satisfy($literal) { $packageId = abs($literal); return ( $literal > 0 && isset($this->decisionMap[$packageId]) && $this->decisionMap[$packageId] > 0 || $literal < 0 && isset($this->decisionMap[$packageId]) && $this->decisionMap[$packageId] < 0 ); } public function conflict($literal) { $packageId = abs($literal); return ( (isset($this->decisionMap[$packageId]) && $this->decisionMap[$packageId] > 0 && $literal < 0) || (isset($this->decisionMap[$packageId]) && $this->decisionMap[$packageId] < 0 && $literal > 0) ); } public function decided($literalOrPackageId) { return !empty($this->decisionMap[abs($literalOrPackageId)]); } public function undecided($literalOrPackageId) { return empty($this->decisionMap[abs($literalOrPackageId)]); } public function decidedInstall($literalOrPackageId) { $packageId = abs($literalOrPackageId); return isset($this->decisionMap[$packageId]) && $this->decisionMap[$packageId] > 0; } public function decisionLevel($literalOrPackageId) { $packageId = abs($literalOrPackageId); if (isset($this->decisionMap[$packageId])) { return abs($this->decisionMap[$packageId]); } return 0; } public function decisionRule($literalOrPackageId) { $packageId = abs($literalOrPackageId); foreach ($this->decisionQueue as $i => $decision) { if ($packageId === abs($decision[self::DECISION_LITERAL])) { return $decision[self::DECISION_REASON]; } } return null; } public function atOffset($queueOffset) { return $this->decisionQueue[$queueOffset]; } public function validOffset($queueOffset) { return $queueOffset >= 0 && $queueOffset < count($this->decisionQueue); } public function lastReason() { return $this->decisionQueue[count($this->decisionQueue) - 1][self::DECISION_REASON]; } public function lastLiteral() { return $this->decisionQueue[count($this->decisionQueue) - 1][self::DECISION_LITERAL]; } public function reset() { while ($decision = array_pop($this->decisionQueue)) { $this->decisionMap[abs($decision[self::DECISION_LITERAL])] = 0; } } public function resetToOffset($offset) { while (count($this->decisionQueue) > $offset + 1) { $decision = array_pop($this->decisionQueue); $this->decisionMap[abs($decision[self::DECISION_LITERAL])] = 0; } } public function revertLast() { $this->decisionMap[abs($this->lastLiteral())] = 0; array_pop($this->decisionQueue); } #[\ReturnTypeWillChange] public function count() { return count($this->decisionQueue); } #[\ReturnTypeWillChange] public function rewind() { end($this->decisionQueue); } #[\ReturnTypeWillChange] public function current() { return current($this->decisionQueue); } #[\ReturnTypeWillChange] public function key() { return key($this->decisionQueue); } #[\ReturnTypeWillChange] public function next() { return prev($this->decisionQueue); } #[\ReturnTypeWillChange] public function valid() { return false !== current($this->decisionQueue); } public function isEmpty() { return count($this->decisionQueue) === 0; } protected function addDecision($literal, $level) { $packageId = abs($literal); $previousDecision = isset($this->decisionMap[$packageId]) ? $this->decisionMap[$packageId] : null; if ($previousDecision != 0) { $literalString = $this->pool->literalToPrettyString($literal, array()); $package = $this->pool->literalToPackage($literal); throw new SolverBugException( "Trying to decide $literalString on level $level, even though $package was previously decided as ".(int) $previousDecision."." ); } if ($literal > 0) { $this->decisionMap[$packageId] = $level; } else { $this->decisionMap[$packageId] = -$level; } } public function __toString() { $decisionMap = $this->decisionMap; ksort($decisionMap); $str = '['; foreach ($decisionMap as $packageId => $level) { $str .= $packageId.':'.$level.','; } $str .= ']'; return $str; } } composer/src/Composer/DependencyResolver/Solver.php 0000644 00000065513 14736103146 0016553 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver; use Composer\IO\IOInterface; use Composer\Repository\RepositoryInterface; use Composer\Repository\PlatformRepository; /** * @author Nils Adermann <naderman@naderman.de> */ class Solver { const BRANCH_LITERALS = 0; const BRANCH_LEVEL = 1; /** @var PolicyInterface */ protected $policy; /** @var Pool */ protected $pool; /** @var RepositoryInterface */ protected $installed; /** @var RuleSet */ protected $rules; /** @var RuleSetGenerator */ protected $ruleSetGenerator; /** @var array */ protected $jobs; /** @var int[] */ protected $updateMap = array(); /** @var RuleWatchGraph */ protected $watchGraph; /** @var Decisions */ protected $decisions; /** @var int[] */ protected $installedMap; /** @var int */ protected $propagateIndex; /** @var array[] */ protected $branches = array(); /** @var Problem[] */ protected $problems = array(); /** @var array */ protected $learnedPool = array(); /** @var array */ protected $learnedWhy = array(); /** @var bool */ public $testFlagLearnedPositiveLiteral = false; /** @var IOInterface */ protected $io; /** * @param PolicyInterface $policy * @param Pool $pool * @param RepositoryInterface $installed * @param IOInterface $io */ public function __construct(PolicyInterface $policy, Pool $pool, RepositoryInterface $installed, IOInterface $io) { $this->io = $io; $this->policy = $policy; $this->pool = $pool; $this->installed = $installed; $this->ruleSetGenerator = new RuleSetGenerator($policy, $pool); } /** * @return int */ public function getRuleSetSize() { return count($this->rules); } // aka solver_makeruledecisions private function makeAssertionRuleDecisions() { $decisionStart = count($this->decisions) - 1; $rulesCount = count($this->rules); for ($ruleIndex = 0; $ruleIndex < $rulesCount; $ruleIndex++) { $rule = $this->rules->ruleById[$ruleIndex]; if (!$rule->isAssertion() || $rule->isDisabled()) { continue; } $literals = $rule->getLiterals(); $literal = $literals[0]; if (!$this->decisions->decided($literal)) { $this->decisions->decide($literal, 1, $rule); continue; } if ($this->decisions->satisfy($literal)) { continue; } // found a conflict if (RuleSet::TYPE_LEARNED === $rule->getType()) { $rule->disable(); continue; } $conflict = $this->decisions->decisionRule($literal); if ($conflict && RuleSet::TYPE_PACKAGE === $conflict->getType()) { $problem = new Problem($this->pool); $problem->addRule($rule); $problem->addRule($conflict); $this->disableProblem($rule); $this->problems[] = $problem; continue; } // conflict with another job $problem = new Problem($this->pool); $problem->addRule($rule); $problem->addRule($conflict); // push all of our rules (can only be job rules) // asserting this literal on the problem stack foreach ($this->rules->getIteratorFor(RuleSet::TYPE_JOB) as $assertRule) { if ($assertRule->isDisabled() || !$assertRule->isAssertion()) { continue; } $assertRuleLiterals = $assertRule->getLiterals(); $assertRuleLiteral = $assertRuleLiterals[0]; if (abs($literal) !== abs($assertRuleLiteral)) { continue; } $problem->addRule($assertRule); $this->disableProblem($assertRule); } $this->problems[] = $problem; $this->decisions->resetToOffset($decisionStart); $ruleIndex = -1; } } protected function setupInstalledMap() { $this->installedMap = array(); foreach ($this->installed->getPackages() as $package) { $this->installedMap[$package->id] = $package; } } /** * @param bool $ignorePlatformReqs */ protected function checkForRootRequireProblems($ignorePlatformReqs) { foreach ($this->jobs as $job) { switch ($job['cmd']) { case 'update': $packages = $this->pool->whatProvides($job['packageName'], $job['constraint']); foreach ($packages as $package) { if (isset($this->installedMap[$package->id])) { $this->updateMap[$package->id] = true; } } break; case 'update-all': foreach ($this->installedMap as $package) { $this->updateMap[$package->id] = true; } break; case 'install': if ($ignorePlatformReqs && preg_match(PlatformRepository::PLATFORM_PACKAGE_REGEX, $job['packageName'])) { break; } if (!$this->pool->whatProvides($job['packageName'], $job['constraint'])) { $problem = new Problem($this->pool); $problem->addRule(new GenericRule(array(), null, null, $job)); $this->problems[] = $problem; } break; } } } /** * @param Request $request * @param bool $ignorePlatformReqs * @return array */ public function solve(Request $request, $ignorePlatformReqs = false) { $this->jobs = $request->getJobs(); $this->setupInstalledMap(); $this->rules = $this->ruleSetGenerator->getRulesFor($this->jobs, $this->installedMap, $ignorePlatformReqs); $this->checkForRootRequireProblems($ignorePlatformReqs); $this->decisions = new Decisions($this->pool); $this->watchGraph = new RuleWatchGraph; foreach ($this->rules as $rule) { $this->watchGraph->insert(new RuleWatchNode($rule)); } /* make decisions based on job/update assertions */ $this->makeAssertionRuleDecisions(); $this->io->writeError('Resolving dependencies through SAT', true, IOInterface::DEBUG); $before = microtime(true); $this->runSat(true); $this->io->writeError('', true, IOInterface::DEBUG); $this->io->writeError(sprintf('Dependency resolution completed in %.3f seconds', microtime(true) - $before), true, IOInterface::VERBOSE); // decide to remove everything that's installed and undecided foreach ($this->installedMap as $packageId => $void) { if ($this->decisions->undecided($packageId)) { $this->decisions->decide(-$packageId, 1, null); } } if ($this->problems) { throw new SolverProblemsException($this->problems, $this->installedMap); } $transaction = new Transaction($this->policy, $this->pool, $this->installedMap, $this->decisions); return $transaction->getOperations(); } /** * Makes a decision and propagates it to all rules. * * Evaluates each term affected by the decision (linked through watches) * If we find unit rules we make new decisions based on them * * @param int $level * @return Rule|null A rule on conflict, otherwise null. */ protected function propagate($level) { while ($this->decisions->validOffset($this->propagateIndex)) { $decision = $this->decisions->atOffset($this->propagateIndex); $conflict = $this->watchGraph->propagateLiteral( $decision[Decisions::DECISION_LITERAL], $level, $this->decisions ); $this->propagateIndex++; if ($conflict) { return $conflict; } } return null; } /** * Reverts a decision at the given level. * * @param int $level */ private function revert($level) { while (!$this->decisions->isEmpty()) { $literal = $this->decisions->lastLiteral(); if ($this->decisions->undecided($literal)) { break; } $decisionLevel = $this->decisions->decisionLevel($literal); if ($decisionLevel <= $level) { break; } $this->decisions->revertLast(); $this->propagateIndex = count($this->decisions); } while (!empty($this->branches) && $this->branches[count($this->branches) - 1][self::BRANCH_LEVEL] >= $level) { array_pop($this->branches); } } /** * setpropagatelearn * * add free decision (a positive literal) to decision queue * increase level and propagate decision * return if no conflict. * * in conflict case, analyze conflict rule, add resulting * rule to learnt rule set, make decision from learnt * rule (always unit) and re-propagate. * * returns the new solver level or 0 if unsolvable * * @param int $level * @param string|int $literal * @param bool $disableRules * @param Rule $rule * @return int */ private function setPropagateLearn($level, $literal, $disableRules, Rule $rule) { $level++; $this->decisions->decide($literal, $level, $rule); while (true) { $rule = $this->propagate($level); if (!$rule) { break; } if ($level == 1) { return $this->analyzeUnsolvable($rule, $disableRules); } // conflict list($learnLiteral, $newLevel, $newRule, $why) = $this->analyze($level, $rule); if ($newLevel <= 0 || $newLevel >= $level) { throw new SolverBugException( "Trying to revert to invalid level ".(int) $newLevel." from level ".(int) $level."." ); } elseif (!$newRule) { throw new SolverBugException( "No rule was learned from analyzing $rule at level $level." ); } $level = $newLevel; $this->revert($level); $this->rules->add($newRule, RuleSet::TYPE_LEARNED); $this->learnedWhy[spl_object_hash($newRule)] = $why; $ruleNode = new RuleWatchNode($newRule); $ruleNode->watch2OnHighest($this->decisions); $this->watchGraph->insert($ruleNode); $this->decisions->decide($learnLiteral, $level, $newRule); } return $level; } /** * @param int $level * @param array $decisionQueue * @param bool $disableRules * @param Rule $rule * @return int */ private function selectAndInstall($level, array $decisionQueue, $disableRules, Rule $rule) { // choose best package to install from decisionQueue $literals = $this->policy->selectPreferredPackages($this->pool, $this->installedMap, $decisionQueue, $rule->getRequiredPackage()); $selectedLiteral = array_shift($literals); // if there are multiple candidates, then branch if (count($literals)) { $this->branches[] = array($literals, $level); } return $this->setPropagateLearn($level, $selectedLiteral, $disableRules, $rule); } /** * @param int $level * @param Rule $rule * @return array */ protected function analyze($level, Rule $rule) { $analyzedRule = $rule; $ruleLevel = 1; $num = 0; $l1num = 0; $seen = array(); $learnedLiterals = array(null); $decisionId = count($this->decisions); $this->learnedPool[] = array(); while (true) { $this->learnedPool[count($this->learnedPool) - 1][] = $rule; foreach ($rule->getLiterals() as $literal) { // skip the one true literal if ($this->decisions->satisfy($literal)) { continue; } if (isset($seen[abs($literal)])) { continue; } $seen[abs($literal)] = true; $l = $this->decisions->decisionLevel($literal); if (1 === $l) { $l1num++; } elseif ($level === $l) { $num++; } else { // not level1 or conflict level, add to new rule $learnedLiterals[] = $literal; if ($l > $ruleLevel) { $ruleLevel = $l; } } } $l1retry = true; while ($l1retry) { $l1retry = false; if (!$num && !--$l1num) { // all level 1 literals done break 2; } while (true) { if ($decisionId <= 0) { throw new SolverBugException( "Reached invalid decision id $decisionId while looking through $rule for a literal present in the analyzed rule $analyzedRule." ); } $decisionId--; $decision = $this->decisions->atOffset($decisionId); $literal = $decision[Decisions::DECISION_LITERAL]; if (isset($seen[abs($literal)])) { break; } } unset($seen[abs($literal)]); if ($num && 0 === --$num) { if ($literal < 0) { $this->testFlagLearnedPositiveLiteral = true; } $learnedLiterals[0] = -$literal; if (!$l1num) { break 2; } foreach ($learnedLiterals as $i => $learnedLiteral) { if ($i !== 0) { unset($seen[abs($learnedLiteral)]); } } // only level 1 marks left $l1num++; $l1retry = true; } } $decision = $this->decisions->atOffset($decisionId); $rule = $decision[Decisions::DECISION_REASON]; } $why = count($this->learnedPool) - 1; if (!$learnedLiterals[0]) { throw new SolverBugException( "Did not find a learnable literal in analyzed rule $analyzedRule." ); } $newRule = new GenericRule($learnedLiterals, Rule::RULE_LEARNED, $why); return array($learnedLiterals[0], $ruleLevel, $newRule, $why); } /** * @param Problem $problem * @param Rule $conflictRule */ private function analyzeUnsolvableRule(Problem $problem, Rule $conflictRule) { if ($conflictRule->getType() == RuleSet::TYPE_LEARNED) { $why = spl_object_hash($conflictRule); $learnedWhy = $this->learnedWhy[$why]; $problemRules = $this->learnedPool[$learnedWhy]; foreach ($problemRules as $problemRule) { $this->analyzeUnsolvableRule($problem, $problemRule); } return; } if ($conflictRule->getType() == RuleSet::TYPE_PACKAGE) { // package rules cannot be part of a problem return; } $problem->nextSection(); $problem->addRule($conflictRule); } /** * @param Rule $conflictRule * @param bool $disableRules * @return int */ private function analyzeUnsolvable(Rule $conflictRule, $disableRules) { $problem = new Problem($this->pool); $problem->addRule($conflictRule); $this->analyzeUnsolvableRule($problem, $conflictRule); $this->problems[] = $problem; $seen = array(); $literals = $conflictRule->getLiterals(); foreach ($literals as $literal) { // skip the one true literal if ($this->decisions->satisfy($literal)) { continue; } $seen[abs($literal)] = true; } foreach ($this->decisions as $decision) { $literal = $decision[Decisions::DECISION_LITERAL]; // skip literals that are not in this rule if (!isset($seen[abs($literal)])) { continue; } $why = $decision[Decisions::DECISION_REASON]; $problem->addRule($why); $this->analyzeUnsolvableRule($problem, $why); $literals = $why->getLiterals(); foreach ($literals as $literal) { // skip the one true literal if ($this->decisions->satisfy($literal)) { continue; } $seen[abs($literal)] = true; } } if ($disableRules) { foreach ($this->problems[count($this->problems) - 1] as $reason) { $this->disableProblem($reason['rule']); } $this->resetSolver(); return 1; } return 0; } /** * @param Rule $why */ private function disableProblem(Rule $why) { $job = $why->getJob(); if (!$job) { $why->disable(); return; } // disable all rules of this job foreach ($this->rules as $rule) { /** @var Rule $rule */ if ($job === $rule->getJob()) { $rule->disable(); } } } private function resetSolver() { $this->decisions->reset(); $this->propagateIndex = 0; $this->branches = array(); $this->enableDisableLearnedRules(); $this->makeAssertionRuleDecisions(); } /** * enable/disable learnt rules * * we have enabled or disabled some of our rules. We now re-enable all * of our learnt rules except the ones that were learnt from rules that * are now disabled. */ private function enableDisableLearnedRules() { foreach ($this->rules->getIteratorFor(RuleSet::TYPE_LEARNED) as $rule) { $why = $this->learnedWhy[spl_object_hash($rule)]; $problemRules = $this->learnedPool[$why]; $foundDisabled = false; foreach ($problemRules as $problemRule) { if ($problemRule->isDisabled()) { $foundDisabled = true; break; } } if ($foundDisabled && $rule->isEnabled()) { $rule->disable(); } elseif (!$foundDisabled && $rule->isDisabled()) { $rule->enable(); } } } /** * @param bool $disableRules */ private function runSat($disableRules = true) { $this->propagateIndex = 0; /* * here's the main loop: * 1) propagate new decisions (only needed once) * 2) fulfill jobs * 3) fulfill all unresolved rules * 4) minimalize solution if we had choices * if we encounter a problem, we rewind to a safe level and restart * with step 1 */ $decisionQueue = array(); /** * @todo this makes $disableRules always false; determine the rationale and possibly remove dead code? */ $disableRules = array(); $level = 1; $systemLevel = $level + 1; while (true) { if (1 === $level) { $conflictRule = $this->propagate($level); if (null !== $conflictRule) { if ($this->analyzeUnsolvable($conflictRule, $disableRules)) { continue; } return; } } // handle job rules if ($level < $systemLevel) { $iterator = $this->rules->getIteratorFor(RuleSet::TYPE_JOB); foreach ($iterator as $rule) { if ($rule->isEnabled()) { $decisionQueue = array(); $noneSatisfied = true; foreach ($rule->getLiterals() as $literal) { if ($this->decisions->satisfy($literal)) { $noneSatisfied = false; break; } if ($literal > 0 && $this->decisions->undecided($literal)) { $decisionQueue[] = $literal; } } if ($noneSatisfied && count($decisionQueue)) { // prune all update packages until installed version // except for requested updates if (count($this->installed) != count($this->updateMap)) { $prunedQueue = array(); foreach ($decisionQueue as $literal) { if (isset($this->installedMap[abs($literal)])) { $prunedQueue[] = $literal; if (isset($this->updateMap[abs($literal)])) { $prunedQueue = $decisionQueue; break; } } } $decisionQueue = $prunedQueue; } } if ($noneSatisfied && count($decisionQueue)) { $oLevel = $level; $level = $this->selectAndInstall($level, $decisionQueue, $disableRules, $rule); if (0 === $level) { return; } if ($level <= $oLevel) { break; } } } } $systemLevel = $level + 1; // jobs left $iterator->next(); if ($iterator->valid()) { continue; } } if ($level < $systemLevel) { $systemLevel = $level; } $rulesCount = count($this->rules); $pass = 1; $this->io->writeError('Looking at all rules.', true, IOInterface::DEBUG); for ($i = 0, $n = 0; $n < $rulesCount; $i++, $n++) { if ($i == $rulesCount) { if (1 === $pass) { $this->io->writeError("Something's changed, looking at all rules again (pass #$pass)", false, IOInterface::DEBUG); } else { $this->io->overwriteError("Something's changed, looking at all rules again (pass #$pass)", false, null, IOInterface::DEBUG); } $i = 0; $pass++; } $rule = $this->rules->ruleById[$i]; $literals = $rule->getLiterals(); if ($rule->isDisabled()) { continue; } $decisionQueue = array(); // make sure that // * all negative literals are installed // * no positive literal is installed // i.e. the rule is not fulfilled and we // just need to decide on the positive literals // foreach ($literals as $literal) { if ($literal <= 0) { if (!$this->decisions->decidedInstall($literal)) { continue 2; // next rule } } else { if ($this->decisions->decidedInstall($literal)) { continue 2; // next rule } if ($this->decisions->undecided($literal)) { $decisionQueue[] = $literal; } } } // need to have at least 2 item to pick from if (count($decisionQueue) < 2) { continue; } $level = $this->selectAndInstall($level, $decisionQueue, $disableRules, $rule); if (0 === $level) { return; } // something changed, so look at all rules again $rulesCount = count($this->rules); $n = -1; } if ($level < $systemLevel) { continue; } // minimization step if (count($this->branches)) { $lastLiteral = null; $lastLevel = null; $lastBranchIndex = 0; $lastBranchOffset = 0; for ($i = count($this->branches) - 1; $i >= 0; $i--) { list($literals, $l) = $this->branches[$i]; foreach ($literals as $offset => $literal) { if ($literal && $literal > 0 && $this->decisions->decisionLevel($literal) > $l + 1) { $lastLiteral = $literal; $lastBranchIndex = $i; $lastBranchOffset = $offset; $lastLevel = $l; } } } if ($lastLiteral) { unset($this->branches[$lastBranchIndex][self::BRANCH_LITERALS][$lastBranchOffset]); $level = $lastLevel; $this->revert($level); $why = $this->decisions->lastReason(); $level = $this->setPropagateLearn($level, $lastLiteral, $disableRules, $why); if ($level == 0) { return; } continue; } } break; } } } composer/src/Composer/DependencyResolver/Transaction.php 0000644 00000017055 14736103146 0017564 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver; use Composer\Package\AliasPackage; /** * @author Nils Adermann <naderman@naderman.de> */ class Transaction { protected $policy; protected $pool; protected $installedMap; protected $decisions; protected $transaction; public function __construct($policy, $pool, $installedMap, $decisions) { $this->policy = $policy; $this->pool = $pool; $this->installedMap = $installedMap; $this->decisions = $decisions; $this->transaction = array(); } public function getOperations() { $installMeansUpdateMap = $this->findUpdates(); $updateMap = array(); $installMap = array(); $uninstallMap = array(); foreach ($this->decisions as $i => $decision) { $literal = $decision[Decisions::DECISION_LITERAL]; $reason = $decision[Decisions::DECISION_REASON]; $package = $this->pool->literalToPackage($literal); // wanted & installed || !wanted & !installed if (($literal > 0) == isset($this->installedMap[$package->id])) { continue; } if ($literal > 0) { if (isset($installMeansUpdateMap[abs($literal)]) && !$package instanceof AliasPackage) { $source = $installMeansUpdateMap[abs($literal)]; $updateMap[$package->id] = array( 'package' => $package, 'source' => $source, 'reason' => $reason, ); // avoid updates to one package from multiple origins unset($installMeansUpdateMap[abs($literal)]); $ignoreRemove[$source->id] = true; } else { $installMap[$package->id] = array( 'package' => $package, 'reason' => $reason, ); } } } foreach ($this->decisions as $i => $decision) { $literal = $decision[Decisions::DECISION_LITERAL]; $reason = $decision[Decisions::DECISION_REASON]; $package = $this->pool->literalToPackage($literal); if ($literal <= 0 && isset($this->installedMap[$package->id]) && !isset($ignoreRemove[$package->id])) { $uninstallMap[$package->id] = array( 'package' => $package, 'reason' => $reason, ); } } $this->transactionFromMaps($installMap, $updateMap, $uninstallMap); return $this->transaction; } protected function transactionFromMaps($installMap, $updateMap, $uninstallMap) { $queue = array_map( function ($operation) { return $operation['package']; }, $this->findRootPackages($installMap, $updateMap) ); $visited = array(); while (!empty($queue)) { $package = array_pop($queue); $packageId = $package->id; if (!isset($visited[$packageId])) { $queue[] = $package; if ($package instanceof AliasPackage) { $queue[] = $package->getAliasOf(); } else { foreach ($package->getRequires() as $link) { $possibleRequires = $this->pool->whatProvides($link->getTarget(), $link->getConstraint()); foreach ($possibleRequires as $require) { $queue[] = $require; } } } $visited[$package->id] = true; } else { if (isset($installMap[$packageId])) { $this->install( $installMap[$packageId]['package'], $installMap[$packageId]['reason'] ); unset($installMap[$packageId]); } if (isset($updateMap[$packageId])) { $this->update( $updateMap[$packageId]['source'], $updateMap[$packageId]['package'], $updateMap[$packageId]['reason'] ); unset($updateMap[$packageId]); } } } foreach ($uninstallMap as $uninstall) { $this->uninstall($uninstall['package'], $uninstall['reason']); } } protected function findRootPackages($installMap, $updateMap) { $packages = $installMap + $updateMap; $roots = $packages; foreach ($packages as $packageId => $operation) { $package = $operation['package']; if (!isset($roots[$packageId])) { continue; } foreach ($package->getRequires() as $link) { $possibleRequires = $this->pool->whatProvides($link->getTarget(), $link->getConstraint()); foreach ($possibleRequires as $require) { if ($require !== $package) { unset($roots[$require->id]); } } } } return $roots; } protected function findUpdates() { $installMeansUpdateMap = array(); foreach ($this->decisions as $i => $decision) { $literal = $decision[Decisions::DECISION_LITERAL]; $package = $this->pool->literalToPackage($literal); if ($package instanceof AliasPackage) { continue; } // !wanted & installed if ($literal <= 0 && isset($this->installedMap[$package->id])) { $updates = $this->policy->findUpdatePackages($this->pool, $this->installedMap, $package); $literals = array($package->id); foreach ($updates as $update) { $literals[] = $update->id; } foreach ($literals as $updateLiteral) { if ($updateLiteral !== $literal) { $installMeansUpdateMap[abs($updateLiteral)] = $package; } } } } return $installMeansUpdateMap; } protected function install($package, $reason) { if ($package instanceof AliasPackage) { return $this->markAliasInstalled($package, $reason); } $this->transaction[] = new Operation\InstallOperation($package, $reason); } protected function update($from, $to, $reason) { $this->transaction[] = new Operation\UpdateOperation($from, $to, $reason); } protected function uninstall($package, $reason) { if ($package instanceof AliasPackage) { return $this->markAliasUninstalled($package, $reason); } $this->transaction[] = new Operation\UninstallOperation($package, $reason); } protected function markAliasInstalled($package, $reason) { $this->transaction[] = new Operation\MarkAliasInstalledOperation($package, $reason); } protected function markAliasUninstalled($package, $reason) { $this->transaction[] = new Operation\MarkAliasUninstalledOperation($package, $reason); } } composer/src/Composer/DependencyResolver/Request.php 0000644 00000003641 14736103146 0016723 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver; use Composer\Semver\Constraint\ConstraintInterface; /** * @author Nils Adermann <naderman@naderman.de> */ class Request { protected $jobs; public function __construct() { $this->jobs = array(); } public function install($packageName, ConstraintInterface $constraint = null) { $this->addJob($packageName, 'install', $constraint); } public function update($packageName, ConstraintInterface $constraint = null) { $this->addJob($packageName, 'update', $constraint); } public function remove($packageName, ConstraintInterface $constraint = null) { $this->addJob($packageName, 'remove', $constraint); } /** * Mark an existing package as being installed and having to remain installed * * These jobs will not be tempered with by the solver * * @param string $packageName * @param ConstraintInterface|null $constraint */ public function fix($packageName, ConstraintInterface $constraint = null) { $this->addJob($packageName, 'install', $constraint, true); } protected function addJob($packageName, $cmd, ConstraintInterface $constraint = null, $fixed = false) { $packageName = strtolower($packageName); $this->jobs[] = array( 'cmd' => $cmd, 'packageName' => $packageName, 'constraint' => $constraint, 'fixed' => $fixed, ); } public function updateAll() { $this->jobs[] = array('cmd' => 'update-all'); } public function getJobs() { return $this->jobs; } } composer/src/Composer/DependencyResolver/SolverBugException.php 0000644 00000001376 14736103146 0021065 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver; /** * @author Nils Adermann <naderman@naderman.de> */ class SolverBugException extends \RuntimeException { public function __construct($message) { parent::__construct( $message."\nThis exception was most likely caused by a bug in Composer.\n". "Please report the command you ran, the exact error you received, and your composer.json on https://github.com/composer/composer/issues - thank you!\n" ); } } composer/src/Composer/DependencyResolver/Problem.php 0000644 00000022473 14736103146 0016677 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\DependencyResolver; use Composer\Package\CompletePackageInterface; /** * Represents a problem detected while solving dependencies * * @author Nils Adermann <naderman@naderman.de> */ class Problem { /** * A map containing the id of each rule part of this problem as a key * @var array */ protected $reasonSeen; /** * A set of reasons for the problem, each is a rule or a job and a rule * @var array */ protected $reasons = array(); protected $section = 0; protected $pool; public function __construct(Pool $pool) { $this->pool = $pool; } /** * Add a rule as a reason * * @param Rule $rule A rule which is a reason for this problem */ public function addRule(Rule $rule) { $this->addReason(spl_object_hash($rule), array( 'rule' => $rule, 'job' => $rule->getJob(), )); } /** * Retrieve all reasons for this problem * * @return array The problem's reasons */ public function getReasons() { return $this->reasons; } /** * A human readable textual representation of the problem's reasons * * @param array $installedMap A map of all installed packages * @return string */ public function getPrettyString(array $installedMap = array()) { $reasons = call_user_func_array('array_merge', array_reverse($this->reasons)); if (count($reasons) === 1) { reset($reasons); $reason = current($reasons); $job = $reason['job']; $packageName = $job['packageName']; $constraint = $job['constraint']; if (isset($constraint)) { $packages = $this->pool->whatProvides($packageName, $constraint); } else { $packages = array(); } if ($job && $job['cmd'] === 'install' && empty($packages)) { // handle php/hhvm if ($packageName === 'php' || $packageName === 'php-64bit' || $packageName === 'hhvm') { $version = phpversion(); $available = $this->pool->whatProvides($packageName); if (count($available)) { $firstAvailable = reset($available); $version = $firstAvailable->getPrettyVersion(); $extra = $firstAvailable->getExtra(); if ($firstAvailable instanceof CompletePackageInterface && isset($extra['config.platform']) && $extra['config.platform'] === true) { $version .= '; ' . $firstAvailable->getDescription(); } } $msg = "\n - This package requires ".$packageName.$this->constraintToText($constraint).' but '; if (defined('HHVM_VERSION') || (count($available) && $packageName === 'hhvm')) { return $msg . 'your HHVM version does not satisfy that requirement.'; } if ($packageName === 'hhvm') { return $msg . 'you are running this with PHP and not HHVM.'; } return $msg . 'your PHP version ('. $version .') does not satisfy that requirement.'; } // handle php extensions if (0 === stripos($packageName, 'ext-')) { if (false !== strpos($packageName, ' ')) { return "\n - The requested PHP extension ".$packageName.' should be required as '.str_replace(' ', '-', $packageName).'.'; } $ext = substr($packageName, 4); $error = extension_loaded($ext) ? 'has the wrong version ('.(phpversion($ext) ?: '0').') installed' : 'is missing from your system'; return "\n - The requested PHP extension ".$packageName.$this->constraintToText($constraint).' '.$error.'. Install or enable PHP\'s '.$ext.' extension.'; } // handle linked libs if (0 === stripos($packageName, 'lib-')) { if (strtolower($packageName) === 'lib-icu') { $error = extension_loaded('intl') ? 'has the wrong version installed, try upgrading the intl extension.' : 'is missing from your system, make sure the intl extension is loaded.'; return "\n - The requested linked library ".$packageName.$this->constraintToText($constraint).' '.$error; } return "\n - The requested linked library ".$packageName.$this->constraintToText($constraint).' has the wrong version installed or is missing from your system, make sure to load the extension providing it.'; } if (!preg_match('{^[A-Za-z0-9_./-]+$}', $packageName)) { $illegalChars = preg_replace('{[A-Za-z0-9_./-]+}', '', $packageName); return "\n - The requested package ".$packageName.' could not be found, it looks like its name is invalid, "'.$illegalChars.'" is not allowed in package names.'; } if ($providers = $this->pool->whatProvides($packageName, $constraint, true, true)) { return "\n - The requested package ".$packageName.$this->constraintToText($constraint).' is satisfiable by '.$this->getPackageList($providers).' but these conflict with your requirements or minimum-stability.'; } if ($providers = $this->pool->whatProvides($packageName, null, true, true)) { return "\n - The requested package ".$packageName.$this->constraintToText($constraint).' exists as '.$this->getPackageList($providers).' but these are rejected by your constraint.'; } return "\n - The requested package ".$packageName.' could not be found in any version, there may be a typo in the package name.'; } } $messages = array(); foreach ($reasons as $reason) { $rule = $reason['rule']; $job = $reason['job']; if ($job) { $messages[] = $this->jobToText($job); } elseif ($rule) { if ($rule instanceof Rule) { $messages[] = $rule->getPrettyString($this->pool, $installedMap); } } } return "\n - ".implode("\n - ", $messages); } /** * Store a reason descriptor but ignore duplicates * * @param string $id A canonical identifier for the reason * @param string $reason The reason descriptor */ protected function addReason($id, $reason) { if (!isset($this->reasonSeen[$id])) { $this->reasonSeen[$id] = true; $this->reasons[$this->section][] = $reason; } } public function nextSection() { $this->section++; } /** * Turns a job into a human readable description * * @param array $job * @return string */ protected function jobToText($job) { $packageName = $job['packageName']; $constraint = $job['constraint']; switch ($job['cmd']) { case 'install': $packages = $this->pool->whatProvides($packageName, $constraint); if (!$packages) { return 'No package found to satisfy install request for '.$packageName.$this->constraintToText($constraint); } return 'Installation request for '.$packageName.$this->constraintToText($constraint).' -> satisfiable by '.$this->getPackageList($packages).'.'; case 'update': return 'Update request for '.$packageName.$this->constraintToText($constraint).'.'; case 'remove': return 'Removal request for '.$packageName.$this->constraintToText($constraint).''; } if (isset($constraint)) { $packages = $this->pool->whatProvides($packageName, $constraint); } else { $packages = array(); } return 'Job(cmd='.$job['cmd'].', target='.$packageName.', packages=['.$this->getPackageList($packages).'])'; } protected function getPackageList($packages) { $prepared = array(); foreach ($packages as $package) { $prepared[$package->getName()]['name'] = $package->getPrettyName(); $prepared[$package->getName()]['versions'][$package->getVersion()] = $package->getPrettyVersion(); } foreach ($prepared as $name => $package) { $prepared[$name] = $package['name'].'['.implode(', ', $package['versions']).']'; } return implode(', ', $prepared); } /** * Turns a constraint into text usable in a sentence describing a job * * @param \Composer\Semver\Constraint\ConstraintInterface $constraint * @return string */ protected function constraintToText($constraint) { return $constraint ? ' '.$constraint->getPrettyString() : ''; } } composer/src/Composer/SelfUpdate/Versions.php 0000644 00000004335 14736103146 0015340 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\SelfUpdate; use Composer\Util\RemoteFilesystem; use Composer\Config; use Composer\Json\JsonFile; /** * @author Jordi Boggiano <j.boggiano@seld.be> */ class Versions { public static $channels = array('stable', 'preview', 'snapshot', '1', '2'); private $rfs; private $config; private $channel; public function __construct(Config $config, RemoteFilesystem $rfs) { $this->rfs = $rfs; $this->config = $config; } public function getChannel() { if ($this->channel) { return $this->channel; } $channelFile = $this->config->get('home').'/update-channel'; if (file_exists($channelFile)) { $channel = trim(file_get_contents($channelFile)); if (in_array($channel, array('stable', 'preview', 'snapshot'), true)) { return $this->channel = $channel; } } return $this->channel = 'stable'; } public function setChannel($channel) { if (!in_array($channel, self::$channels, true)) { throw new \InvalidArgumentException('Invalid channel '.$channel.', must be one of: ' . implode(', ', self::$channels)); } $channelFile = $this->config->get('home').'/update-channel'; $this->channel = $channel; file_put_contents($channelFile, (is_numeric($channel) ? 'stable' : $channel).PHP_EOL); } public function getLatest($channel = null) { $protocol = extension_loaded('openssl') ? 'https' : 'http'; $versions = JsonFile::parseJson($this->rfs->getContents('getcomposer.org', $protocol . '://getcomposer.org/versions', false)); foreach ($versions[$channel ?: $this->getChannel()] as $version) { if ($version['min-php'] <= PHP_VERSION_ID) { return $version; } } throw new \LogicException('There is no version of Composer available for your PHP version ('.PHP_VERSION.')'); } } composer/src/Composer/SelfUpdate/Keys.php 0000644 00000001552 14736103146 0014441 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\SelfUpdate; /** * @author Jordi Boggiano <j.boggiano@seld.be> */ class Keys { public static function fingerprint($path) { $hash = strtoupper(hash('sha256', preg_replace('{\s}', '', file_get_contents($path)))); return implode(' ', array( substr($hash, 0, 8), substr($hash, 8, 8), substr($hash, 16, 8), substr($hash, 24, 8), '', // Extra space substr($hash, 32, 8), substr($hash, 40, 8), substr($hash, 48, 8), substr($hash, 56, 8), )); } } composer/src/Composer/Question/StrictConfirmationQuestion.php 0000644 00000005153 14736103146 0020653 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Question; use Symfony\Component\Console\Exception\InvalidArgumentException; use Symfony\Component\Console\Question\Question; /** * Represents a yes/no question * Enforces strict responses rather than non-standard answers counting as default * Based on Symfony\Component\Console\Question\ConfirmationQuestion * * @author Theo Tonge <theo@theotonge.co.uk> */ class StrictConfirmationQuestion extends Question { private $trueAnswerRegex; private $falseAnswerRegex; /** * Constructor.s * * @param string $question The question to ask to the user * @param bool $default The default answer to return, true or false * @param string $trueAnswerRegex A regex to match the "yes" answer * @param string $falseAnswerRegex A regex to match the "no" answer */ public function __construct($question, $default = true, $trueAnswerRegex = '/^y(?:es)?$/i', $falseAnswerRegex = '/^no?$/i') { parent::__construct($question, (bool) $default); $this->trueAnswerRegex = $trueAnswerRegex; $this->falseAnswerRegex = $falseAnswerRegex; $this->setNormalizer($this->getDefaultNormalizer()); $this->setValidator($this->getDefaultValidator()); } /** * Returns the default answer normalizer. * * @return callable */ private function getDefaultNormalizer() { $default = $this->getDefault(); $trueRegex = $this->trueAnswerRegex; $falseRegex = $this->falseAnswerRegex; return function ($answer) use ($default, $trueRegex, $falseRegex) { if (is_bool($answer)) { return $answer; } if (empty($answer) && !empty($default)) { return $default; } if (preg_match($trueRegex, $answer)) { return true; } if (preg_match($falseRegex, $answer)) { return false; } return null; }; } /** * Returns the default answer validator. * * @return callable */ private function getDefaultValidator() { return function ($answer) { if (!is_bool($answer)) { throw new InvalidArgumentException('Please answer yes, y, no, or n.'); } return $answer; }; } } composer/src/Composer/Package/BasePackage.php 0000644 00000013765 14736103146 0015164 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package; use Composer\Repository\RepositoryInterface; use Composer\Repository\PlatformRepository; /** * Base class for packages providing name storage and default match implementation * * @author Nils Adermann <naderman@naderman.de> */ abstract class BasePackage implements PackageInterface { public static $supportedLinkTypes = array( 'require' => array('description' => 'requires', 'method' => 'requires'), 'conflict' => array('description' => 'conflicts', 'method' => 'conflicts'), 'provide' => array('description' => 'provides', 'method' => 'provides'), 'replace' => array('description' => 'replaces', 'method' => 'replaces'), 'require-dev' => array('description' => 'requires (for development)', 'method' => 'devRequires'), ); const STABILITY_STABLE = 0; const STABILITY_RC = 5; const STABILITY_BETA = 10; const STABILITY_ALPHA = 15; const STABILITY_DEV = 20; public static $stabilities = array( 'stable' => self::STABILITY_STABLE, 'RC' => self::STABILITY_RC, 'beta' => self::STABILITY_BETA, 'alpha' => self::STABILITY_ALPHA, 'dev' => self::STABILITY_DEV, ); /** * READ-ONLY: The package id, public for fast access in dependency solver * @var int */ public $id; /** @var string */ protected $name; /** @var string */ protected $prettyName; /** @var RepositoryInterface */ protected $repository; /** @var array */ protected $transportOptions = array(); /** * All descendants' constructors should call this parent constructor * * @param string $name The package's name */ public function __construct($name) { $this->prettyName = $name; $this->name = strtolower($name); $this->id = -1; } /** * {@inheritDoc} */ public function getName() { return $this->name; } /** * {@inheritDoc} */ public function getPrettyName() { return $this->prettyName; } /** * {@inheritDoc} */ public function getNames() { $names = array( $this->getName() => true, ); foreach ($this->getProvides() as $link) { $names[$link->getTarget()] = true; } foreach ($this->getReplaces() as $link) { $names[$link->getTarget()] = true; } return array_keys($names); } /** * {@inheritDoc} */ public function setId($id) { $this->id = $id; } /** * {@inheritDoc} */ public function getId() { return $this->id; } /** * {@inheritDoc} */ public function setRepository(RepositoryInterface $repository) { if ($this->repository && $repository !== $this->repository) { throw new \LogicException('A package can only be added to one repository'); } $this->repository = $repository; } /** * {@inheritDoc} */ public function getRepository() { return $this->repository; } /** * {@inheritDoc} */ public function getTransportOptions() { return $this->transportOptions; } /** * Configures the list of options to download package dist files * * @param array $options */ public function setTransportOptions(array $options) { $this->transportOptions = $options; } /** * checks if this package is a platform package * * @return bool */ public function isPlatform() { return $this->getRepository() instanceof PlatformRepository; } /** * Returns package unique name, constructed from name, version and release type. * * @return string */ public function getUniqueName() { return $this->getName().'-'.$this->getVersion(); } public function equals(PackageInterface $package) { $self = $this; if ($this instanceof AliasPackage) { $self = $this->getAliasOf(); } if ($package instanceof AliasPackage) { $package = $package->getAliasOf(); } return $package === $self; } /** * Converts the package into a readable and unique string * * @return string */ public function __toString() { return $this->getUniqueName(); } public function getPrettyString() { return $this->getPrettyName().' '.$this->getPrettyVersion(); } /** * {@inheritDoc} */ public function getFullPrettyVersion($truncate = true) { if (!$this->isDev() || !in_array($this->getSourceType(), array('hg', 'git'))) { return $this->getPrettyVersion(); } // if source reference is a sha1 hash -- truncate if ($truncate && strlen($this->getSourceReference()) === 40) { return $this->getPrettyVersion() . ' ' . substr($this->getSourceReference(), 0, 7); } return $this->getPrettyVersion() . ' ' . $this->getSourceReference(); } public function getStabilityPriority() { return self::$stabilities[$this->getStability()]; } public function __clone() { $this->repository = null; $this->id = -1; } /** * Build a regexp from a package name, expanding * globs as required * * @param string $whiteListedPattern * @param string $wrap Wrap the cleaned string by the given string * @return string */ public static function packageNameToRegexp($whiteListedPattern, $wrap = '{^%s$}i') { $cleanedWhiteListedPattern = str_replace('\\*', '.*', preg_quote($whiteListedPattern)); return sprintf($wrap, $cleanedWhiteListedPattern); } } composer/src/Composer/Package/Version/VersionGuesser.php 0000644 00000031452 14736103146 0017437 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package\Version; use Composer\Config; use Composer\Repository\Vcs\HgDriver; use Composer\IO\NullIO; use Composer\Semver\VersionParser as SemverVersionParser; use Composer\Util\Git as GitUtil; use Composer\Util\ProcessExecutor; use Composer\Util\Svn as SvnUtil; /** * Try to guess the current version number based on different VCS configuration. * * @author Jordi Boggiano <j.boggiano@seld.be> * @author Samuel Roze <samuel.roze@gmail.com> */ class VersionGuesser { /** * @var Config */ private $config; /** * @var ProcessExecutor */ private $process; /** * @var SemverVersionParser */ private $versionParser; /** * @param Config $config * @param ProcessExecutor $process * @param SemverVersionParser $versionParser */ public function __construct(Config $config, ProcessExecutor $process, SemverVersionParser $versionParser) { $this->config = $config; $this->process = $process; $this->versionParser = $versionParser; } /** * @param array $packageConfig * @param string $path Path to guess into * * @return null|array versionData, 'version', 'pretty_version' and 'commit' keys, if the version is a feature branch, 'feature_version' and 'feature_pretty_version' keys may also be returned */ public function guessVersion(array $packageConfig, $path) { if (!function_exists('proc_open')) { return null; } $versionData = $this->guessGitVersion($packageConfig, $path); if (null !== $versionData && null !== $versionData['version']) { return $this->postprocess($versionData); } $versionData = $this->guessHgVersion($packageConfig, $path); if (null !== $versionData && null !== $versionData['version']) { return $this->postprocess($versionData); } $versionData = $this->guessFossilVersion($packageConfig, $path); if (null !== $versionData && null !== $versionData['version']) { return $this->postprocess($versionData); } $versionData = $this->guessSvnVersion($packageConfig, $path); if (null !== $versionData && null !== $versionData['version']) { return $this->postprocess($versionData); } return null; } private function postprocess(array $versionData) { if (!empty($versionData['feature_version']) && $versionData['feature_version'] === $versionData['version'] && $versionData['feature_pretty_version'] === $versionData['feature_pretty_version']) { unset($versionData['feature_version'], $versionData['feature_pretty_version']); } if ('-dev' === substr($versionData['version'], -4) && preg_match('{\.9{7}}', $versionData['version'])) { $versionData['pretty_version'] = preg_replace('{(\.9{7})+}', '.x', $versionData['version']); } if (!empty($versionData['feature_version']) && '-dev' === substr($versionData['feature_version'], -4) && preg_match('{\.9{7}}', $versionData['feature_version'])) { $versionData['feature_pretty_version'] = preg_replace('{(\.9{7})+}', '.x', $versionData['feature_version']); } return $versionData; } private function guessGitVersion(array $packageConfig, $path) { GitUtil::cleanEnv(); $commit = null; $version = null; $prettyVersion = null; $featureVersion = null; $featurePrettyVersion = null; $isDetached = false; // try to fetch current version from git branch if (0 === $this->process->execute('git branch --no-color --no-abbrev -v', $output, $path)) { $branches = array(); $isFeatureBranch = false; // find current branch and collect all branch names foreach ($this->process->splitLines($output) as $branch) { if ($branch && preg_match('{^(?:\* ) *(\(no branch\)|\(detached from \S+\)|\(HEAD detached at \S+\)|\S+) *([a-f0-9]+) .*$}', $branch, $match)) { if ($match[1] === '(no branch)' || substr($match[1], 0, 10) === '(detached ' || substr($match[1], 0, 17) === '(HEAD detached at') { $version = 'dev-' . $match[2]; $prettyVersion = $version; $isFeatureBranch = true; $isDetached = true; } else { $version = $this->versionParser->normalizeBranch($match[1]); $prettyVersion = 'dev-' . $match[1]; $isFeatureBranch = 0 === strpos($version, 'dev-'); } if ($match[2]) { $commit = $match[2]; } } if ($branch && !preg_match('{^ *[^/]+/HEAD }', $branch)) { if (preg_match('{^(?:\* )? *(\S+) *([a-f0-9]+) .*$}', $branch, $match)) { $branches[] = $match[1]; } } } if ($isFeatureBranch) { $featureVersion = $version; $featurePrettyVersion = $prettyVersion; // try to find the best (nearest) version branch to assume this feature's version $result = $this->guessFeatureVersion($packageConfig, $version, $branches, 'git rev-list %candidate%..%branch%', $path); $version = $result['version']; $prettyVersion = $result['pretty_version']; } } if (!$version || $isDetached) { $result = $this->versionFromGitTags($path); if ($result) { $version = $result['version']; $prettyVersion = $result['pretty_version']; $featureVersion = null; $featurePrettyVersion = null; } } if (!$commit) { $command = 'git log --pretty="%H" -n1 HEAD'; if (0 === $this->process->execute($command, $output, $path)) { $commit = trim($output) ?: null; } } if ($featureVersion) { return array('version' => $version, 'commit' => $commit, 'pretty_version' => $prettyVersion, 'feature_version' => $featureVersion, 'feature_pretty_version' => $featurePrettyVersion); } return array('version' => $version, 'commit' => $commit, 'pretty_version' => $prettyVersion); } private function versionFromGitTags($path) { // try to fetch current version from git tags if (0 === $this->process->execute('git describe --exact-match --tags', $output, $path)) { try { $version = $this->versionParser->normalize(trim($output)); return array('version' => $version, 'pretty_version' => trim($output)); } catch (\Exception $e) { } } return null; } private function guessHgVersion(array $packageConfig, $path) { // try to fetch current version from hg branch if (0 === $this->process->execute('hg branch', $output, $path)) { $branch = trim($output); $version = $this->versionParser->normalizeBranch($branch); $isFeatureBranch = 0 === strpos($version, 'dev-'); if ('9999999-dev' === $version) { return array('version' => $version, 'commit' => null, 'pretty_version' => 'dev-'.$branch); } if (!$isFeatureBranch) { return array('version' => $version, 'commit' => null, 'pretty_version' => $version); } // re-use the HgDriver to fetch branches (this properly includes bookmarks) $driver = new HgDriver(array('url' => $path), new NullIO(), $this->config, $this->process); $branches = array_keys($driver->getBranches()); // try to find the best (nearest) version branch to assume this feature's version $result = $this->guessFeatureVersion($packageConfig, $version, $branches, 'hg log -r "not ancestors(\'%candidate%\') and ancestors(\'%branch%\')" --template "{node}\\n"', $path); $result['commit'] = ''; $result['feature_version'] = $version; $result['feature_pretty_version'] = $version; return $result; } } private function guessFeatureVersion(array $packageConfig, $version, array $branches, $scmCmdline, $path) { $prettyVersion = $version; // ignore feature branches if they have no branch-alias or self.version is used // and find the branch they came from to use as a version instead if ((isset($packageConfig['extra']['branch-alias']) && !isset($packageConfig['extra']['branch-alias'][$version])) || strpos(json_encode($packageConfig), '"self.version"') ) { $branch = preg_replace('{^dev-}', '', $version); $length = PHP_INT_MAX; $nonFeatureBranches = ''; if (!empty($packageConfig['non-feature-branches'])) { $nonFeatureBranches = implode('|', $packageConfig['non-feature-branches']); } foreach ($branches as $candidate) { // return directly, if branch is configured to be non-feature branch if ($candidate === $branch && preg_match('{^(' . $nonFeatureBranches . ')$}', $candidate)) { break; } // do not compare against itself or other feature branches if ($candidate === $branch || !preg_match('{^(' . $nonFeatureBranches . '|master|trunk|default|develop|\d+\..+)$}', $candidate, $match)) { continue; } $cmdLine = str_replace(array('%candidate%', '%branch%'), array($candidate, $branch), $scmCmdline); if (0 !== $this->process->execute($cmdLine, $output, $path)) { continue; } if (strlen($output) < $length) { $length = strlen($output); $version = $this->versionParser->normalizeBranch($candidate); $prettyVersion = 'dev-' . $match[1]; } } } return array('version' => $version, 'pretty_version' => $prettyVersion); } private function guessFossilVersion(array $packageConfig, $path) { $version = null; $prettyVersion = null; // try to fetch current version from fossil if (0 === $this->process->execute('fossil branch list', $output, $path)) { $branch = trim($output); $version = $this->versionParser->normalizeBranch($branch); $prettyVersion = 'dev-' . $branch; } // try to fetch current version from fossil tags if (0 === $this->process->execute('fossil tag list', $output, $path)) { try { $version = $this->versionParser->normalize(trim($output)); $prettyVersion = trim($output); } catch (\Exception $e) { } } return array('version' => $version, 'commit' => '', 'pretty_version' => $prettyVersion); } private function guessSvnVersion(array $packageConfig, $path) { SvnUtil::cleanEnv(); // try to fetch current version from svn if (0 === $this->process->execute('svn info --xml', $output, $path)) { $trunkPath = isset($packageConfig['trunk-path']) ? preg_quote($packageConfig['trunk-path'], '#') : 'trunk'; $branchesPath = isset($packageConfig['branches-path']) ? preg_quote($packageConfig['branches-path'], '#') : 'branches'; $tagsPath = isset($packageConfig['tags-path']) ? preg_quote($packageConfig['tags-path'], '#') : 'tags'; $urlPattern = '#<url>.*/(' . $trunkPath . '|(' . $branchesPath . '|' . $tagsPath . ')/(.*))</url>#'; if (preg_match($urlPattern, $output, $matches)) { if (isset($matches[2]) && ($branchesPath === $matches[2] || $tagsPath === $matches[2])) { // we are in a branches path $version = $this->versionParser->normalizeBranch($matches[3]); $prettyVersion = 'dev-' . $matches[3]; return array('version' => $version, 'commit' => '', 'pretty_version' => $prettyVersion); } $prettyVersion = trim($matches[1]); $version = $this->versionParser->normalize($prettyVersion); return array('version' => $version, 'commit' => '', 'pretty_version' => $prettyVersion); } } } } composer/src/Composer/Package/Version/VersionSelector.php 0000644 00000015147 14736103146 0017605 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package\Version; use Composer\DependencyResolver\Pool; use Composer\Package\BasePackage; use Composer\Package\PackageInterface; use Composer\Plugin\PluginInterface; use Composer\Composer; use Composer\Package\Loader\ArrayLoader; use Composer\Package\Dumper\ArrayDumper; use Composer\Semver\Constraint\Constraint; /** * Selects the best possible version for a package * * @author Ryan Weaver <ryan@knpuniversity.com> * @author Jordi Boggiano <j.boggiano@seld.be> */ class VersionSelector { private $pool; private $parser; public function __construct(Pool $pool) { $this->pool = $pool; } /** * Given a package name and optional version, returns the latest PackageInterface * that matches. * * @param string $packageName * @param string $targetPackageVersion * @param string $targetPhpVersion * @param string $preferredStability * @return PackageInterface|bool */ public function findBestCandidate($packageName, $targetPackageVersion = null, $targetPhpVersion = null, $preferredStability = 'stable') { $constraint = $targetPackageVersion ? $this->getParser()->parseConstraints($targetPackageVersion) : null; $candidates = $this->pool->whatProvides(strtolower($packageName), $constraint, true); if ($targetPhpVersion) { $phpConstraint = new Constraint('==', $this->getParser()->normalize($targetPhpVersion)); $composerRuntimeConstraint = new Constraint('==', $this->getParser()->normalize(Composer::RUNTIME_API_VERSION)); $composerPluginConstraint = new Constraint('==', $this->getParser()->normalize(PluginInterface::PLUGIN_API_VERSION)); $candidates = array_filter($candidates, function ($pkg) use ($phpConstraint, $composerPluginConstraint, $composerRuntimeConstraint) { $reqs = $pkg->getRequires(); return (!isset($reqs['php']) || $reqs['php']->getConstraint()->matches($phpConstraint)) && (!isset($reqs['composer-plugin-api']) || $reqs['composer-plugin-api']->getConstraint()->matches($composerPluginConstraint)) && (!isset($reqs['composer-runtime-api']) || $reqs['composer-runtime-api']->getConstraint()->matches($composerRuntimeConstraint)); }); } if (!$candidates) { return false; } // select highest version if we have many $package = reset($candidates); $minPriority = BasePackage::$stabilities[$preferredStability]; foreach ($candidates as $candidate) { $candidatePriority = $candidate->getStabilityPriority(); $currentPriority = $package->getStabilityPriority(); // candidate is less stable than our preferred stability, // and current package is more stable than candidate, skip it if ($minPriority < $candidatePriority && $currentPriority < $candidatePriority) { continue; } // candidate is less stable than our preferred stability, // and current package is less stable than candidate, select candidate if ($minPriority < $candidatePriority && $candidatePriority < $currentPriority) { $package = $candidate; continue; } // candidate is more stable than our preferred stability, // and current package is less stable than preferred stability, select candidate if ($minPriority >= $candidatePriority && $minPriority < $currentPriority) { $package = $candidate; continue; } // select highest version of the two if (version_compare($package->getVersion(), $candidate->getVersion(), '<')) { $package = $candidate; } } return $package; } /** * Given a concrete version, this returns a ~ constraint (when possible) * that should be used, for example, in composer.json. * * For example: * * 1.2.1 -> ^1.2 * * 1.2 -> ^1.2 * * v3.2.1 -> ^3.2 * * 2.0-beta.1 -> ^2.0@beta * * dev-master -> ^2.1@dev (dev version with alias) * * dev-master -> dev-master (dev versions are untouched) * * @param PackageInterface $package * @return string */ public function findRecommendedRequireVersion(PackageInterface $package) { $version = $package->getVersion(); if (!$package->isDev()) { return $this->transformVersion($version, $package->getPrettyVersion(), $package->getStability()); } $loader = new ArrayLoader($this->getParser()); $dumper = new ArrayDumper(); $extra = $loader->getBranchAlias($dumper->dump($package)); if ($extra) { $extra = preg_replace('{^(\d+\.\d+\.\d+)(\.9999999)-dev$}', '$1.0', $extra, -1, $count); if ($count) { $extra = str_replace('.9999999', '.0', $extra); return $this->transformVersion($extra, $extra, 'dev'); } } return $package->getPrettyVersion(); } private function transformVersion($version, $prettyVersion, $stability) { // attempt to transform 2.1.1 to 2.1 // this allows you to upgrade through minor versions $semanticVersionParts = explode('.', $version); // check to see if we have a semver-looking version if (count($semanticVersionParts) == 4 && preg_match('{^0\D?}', $semanticVersionParts[3])) { // remove the last parts (i.e. the patch version number and any extra) if ($semanticVersionParts[0] === '0') { unset($semanticVersionParts[3]); } else { unset($semanticVersionParts[2], $semanticVersionParts[3]); } $version = implode('.', $semanticVersionParts); } else { return $prettyVersion; } // append stability flag if not default if ($stability != 'stable') { $version .= '@'.$stability; } // 2.1 -> ^2.1 return '^' . $version; } private function getParser() { if ($this->parser === null) { $this->parser = new VersionParser(); } return $this->parser; } } composer/src/Composer/Package/Version/VersionParser.php 0000644 00000004673 14736103146 0017263 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package\Version; use Composer\Repository\PlatformRepository; use Composer\Semver\VersionParser as SemverVersionParser; use Composer\Semver\Semver; class VersionParser extends SemverVersionParser { private static $constraints = array(); /** * {@inheritDoc} */ public function parseConstraints($constraints) { if (!isset(self::$constraints[$constraints])) { self::$constraints[$constraints] = parent::parseConstraints($constraints); } return self::$constraints[$constraints]; } /** * Parses an array of strings representing package/version pairs. * * The parsing results in an array of arrays, each of which * contain a 'name' key with value and optionally a 'version' key with value. * * @param array $pairs a set of package/version pairs separated by ":", "=" or " " * * @return array[] array of arrays containing a name and (if provided) a version */ public function parseNameVersionPairs(array $pairs) { $pairs = array_values($pairs); $result = array(); for ($i = 0, $count = count($pairs); $i < $count; $i++) { $pair = preg_replace('{^([^=: ]+)[=: ](.*)$}', '$1 $2', trim($pairs[$i])); if (false === strpos($pair, ' ') && isset($pairs[$i + 1]) && false === strpos($pairs[$i + 1], '/') && !preg_match(PlatformRepository::PLATFORM_PACKAGE_REGEX, $pairs[$i + 1])) { $pair .= ' '.$pairs[$i + 1]; $i++; } if (strpos($pair, ' ')) { list($name, $version) = explode(' ', $pair, 2); $result[] = array('name' => $name, 'version' => $version); } else { $result[] = array('name' => $pair); } } return $result; } /** * @return bool */ public static function isUpgrade($normalizedFrom, $normalizedTo) { if (substr($normalizedFrom, 0, 4) === 'dev-' || substr($normalizedTo, 0, 4) === 'dev-') { return true; } $sorted = Semver::sort(array($normalizedTo, $normalizedFrom)); return $sorted[0] === $normalizedFrom; } } composer/src/Composer/Package/LinkConstraint/SpecificConstraint.php 0000644 00000001263 14736103146 0021560 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package\LinkConstraint; use Composer\Semver\Constraint\AbstractConstraint; trigger_error('The ' . __NAMESPACE__ . '\SpecificConstraint abstract class is deprecated, there is no replacement for it.', E_USER_DEPRECATED); /** * @deprecated use Composer\Semver\Constraint\AbstractConstraint instead */ abstract class SpecificConstraint extends AbstractConstraint implements LinkConstraintInterface { } composer/src/Composer/Package/LinkConstraint/LinkConstraintInterface.php 0000644 00000001257 14736103146 0022554 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package\LinkConstraint; use Composer\Semver\Constraint\ConstraintInterface; trigger_error('The ' . __NAMESPACE__ . '\LinkConstraintInterface interface is deprecated, use Composer\Semver\Constraint\ConstraintInterface instead.', E_USER_DEPRECATED); /** * @deprecated use Composer\Semver\Constraint\ConstraintInterface instead */ interface LinkConstraintInterface extends ConstraintInterface { } composer/src/Composer/Package/LinkConstraint/MultiConstraint.php 0000644 00000001311 14736103146 0021117 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package\LinkConstraint; use Composer\Semver\Constraint\MultiConstraint as SemverMultiConstraint; trigger_error('The ' . __NAMESPACE__ . '\MultiConstraint class is deprecated, use Composer\Semver\Constraint\MultiConstraint instead.', E_USER_DEPRECATED); /** * @deprecated use Composer\Semver\Constraint\MultiConstraint instead */ class MultiConstraint extends SemverMultiConstraint implements LinkConstraintInterface { } composer/src/Composer/Package/LinkConstraint/EmptyConstraint.php 0000644 00000001311 14736103146 0021123 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package\LinkConstraint; use Composer\Semver\Constraint\EmptyConstraint as SemverEmptyConstraint; trigger_error('The ' . __NAMESPACE__ . '\EmptyConstraint class is deprecated, use Composer\Semver\Constraint\EmptyConstraint instead.', E_USER_DEPRECATED); /** * @deprecated use Composer\Semver\Constraint\EmptyConstraint instead */ class EmptyConstraint extends SemverEmptyConstraint implements LinkConstraintInterface { } composer/src/Composer/Package/LinkConstraint/VersionConstraint.php 0000644 00000001232 14736103146 0021454 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package\LinkConstraint; use Composer\Semver\Constraint\Constraint; trigger_error('The ' . __NAMESPACE__ . '\VersionConstraint class is deprecated, use Composer\Semver\Constraint\Constraint instead.', E_USER_DEPRECATED); /** * @deprecated use Composer\Semver\Constraint\Constraint instead */ class VersionConstraint extends Constraint implements LinkConstraintInterface { } composer/src/Composer/Package/RootPackageInterface.php 0000644 00000006210 14736103146 0017041 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package; /** * Defines additional fields that are only needed for the root package * * @author Jordi Boggiano <j.boggiano@seld.be> */ interface RootPackageInterface extends CompletePackageInterface { /** * Returns a set of package names and their aliases * * @return array */ public function getAliases(); /** * Returns the minimum stability of the package * * @return string */ public function getMinimumStability(); /** * Returns the stability flags to apply to dependencies * * array('foo/bar' => 'dev') * * @return array */ public function getStabilityFlags(); /** * Returns a set of package names and source references that must be enforced on them * * array('foo/bar' => 'abcd1234') * * @return array */ public function getReferences(); /** * Returns true if the root package prefers picking stable packages over unstable ones * * @return bool */ public function getPreferStable(); /** * Returns the root package's configuration * * @return array */ public function getConfig(); /** * Set the required packages * * @param Link[] $requires A set of package links */ public function setRequires(array $requires); /** * Set the recommended packages * * @param Link[] $devRequires A set of package links */ public function setDevRequires(array $devRequires); /** * Set the conflicting packages * * @param Link[] $conflicts A set of package links */ public function setConflicts(array $conflicts); /** * Set the provided virtual packages * * @param Link[] $provides A set of package links */ public function setProvides(array $provides); /** * Set the packages this one replaces * * @param Link[] $replaces A set of package links */ public function setReplaces(array $replaces); /** * Set the repositories * * @param array $repositories */ public function setRepositories($repositories); /** * Set the autoload mapping * * @param array $autoload Mapping of autoloading rules */ public function setAutoload(array $autoload); /** * Set the dev autoload mapping * * @param array $devAutoload Mapping of dev autoloading rules */ public function setDevAutoload(array $devAutoload); /** * Set the stabilityFlags * * @param array $stabilityFlags */ public function setStabilityFlags(array $stabilityFlags); /** * Set the suggested packages * * @param array $suggests A set of package names/comments */ public function setSuggests(array $suggests); /** * @param array $extra */ public function setExtra(array $extra); } composer/src/Composer/Package/Package.php 0000644 00000030402 14736103146 0014354 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package; use Composer\Package\Version\VersionParser; use Composer\Util\ComposerMirror; /** * Core package definitions that are needed to resolve dependencies and install packages * * @author Nils Adermann <naderman@naderman.de> */ class Package extends BasePackage { protected $type; protected $targetDir; protected $installationSource; protected $sourceType; protected $sourceUrl; protected $sourceReference; protected $sourceMirrors; protected $distType; protected $distUrl; protected $distReference; protected $distSha1Checksum; protected $distMirrors; protected $version; protected $prettyVersion; protected $releaseDate; protected $extra = array(); protected $binaries = array(); protected $dev; protected $stability; protected $notificationUrl; /** @var Link[] */ protected $requires = array(); /** @var Link[] */ protected $conflicts = array(); /** @var Link[] */ protected $provides = array(); /** @var Link[] */ protected $replaces = array(); /** @var Link[] */ protected $devRequires = array(); protected $suggests = array(); protected $autoload = array(); protected $devAutoload = array(); protected $includePaths = array(); protected $archiveExcludes = array(); /** * Creates a new in memory package. * * @param string $name The package's name * @param string $version The package's version * @param string $prettyVersion The package's non-normalized version */ public function __construct($name, $version, $prettyVersion) { parent::__construct($name); $this->version = $version; $this->prettyVersion = $prettyVersion; $this->stability = VersionParser::parseStability($version); $this->dev = $this->stability === 'dev'; } /** * {@inheritDoc} */ public function isDev() { return $this->dev; } /** * @param string $type */ public function setType($type) { $this->type = $type; } /** * {@inheritDoc} */ public function getType() { return $this->type ?: 'library'; } /** * {@inheritDoc} */ public function getStability() { return $this->stability; } /** * @param string $targetDir */ public function setTargetDir($targetDir) { $this->targetDir = $targetDir; } /** * {@inheritDoc} */ public function getTargetDir() { if (null === $this->targetDir) { return; } return ltrim(preg_replace('{ (?:^|[\\\\/]+) \.\.? (?:[\\\\/]+|$) (?:\.\.? (?:[\\\\/]+|$) )*}x', '/', $this->targetDir), '/'); } /** * @param array $extra */ public function setExtra(array $extra) { $this->extra = $extra; } /** * {@inheritDoc} */ public function getExtra() { return $this->extra; } /** * @param array $binaries */ public function setBinaries(array $binaries) { $this->binaries = $binaries; } /** * {@inheritDoc} */ public function getBinaries() { return $this->binaries; } /** * {@inheritDoc} */ public function setInstallationSource($type) { $this->installationSource = $type; } /** * {@inheritDoc} */ public function getInstallationSource() { return $this->installationSource; } /** * @param string $type */ public function setSourceType($type) { $this->sourceType = $type; } /** * {@inheritDoc} */ public function getSourceType() { return $this->sourceType; } /** * @param string $url */ public function setSourceUrl($url) { $this->sourceUrl = $url; } /** * {@inheritDoc} */ public function getSourceUrl() { return $this->sourceUrl; } /** * @param string $reference */ public function setSourceReference($reference) { $this->sourceReference = $reference; } /** * {@inheritDoc} */ public function getSourceReference() { return $this->sourceReference; } /** * @param array|null $mirrors */ public function setSourceMirrors($mirrors) { $this->sourceMirrors = $mirrors; } /** * {@inheritDoc} */ public function getSourceMirrors() { return $this->sourceMirrors; } /** * {@inheritDoc} */ public function getSourceUrls() { return $this->getUrls($this->sourceUrl, $this->sourceMirrors, $this->sourceReference, $this->sourceType, 'source'); } /** * @param string $type */ public function setDistType($type) { $this->distType = $type; } /** * {@inheritDoc} */ public function getDistType() { return $this->distType; } /** * @param string $url */ public function setDistUrl($url) { $this->distUrl = $url; } /** * {@inheritDoc} */ public function getDistUrl() { return $this->distUrl; } /** * @param string $reference */ public function setDistReference($reference) { $this->distReference = $reference; } /** * {@inheritDoc} */ public function getDistReference() { return $this->distReference; } /** * @param string $sha1checksum */ public function setDistSha1Checksum($sha1checksum) { $this->distSha1Checksum = $sha1checksum; } /** * {@inheritDoc} */ public function getDistSha1Checksum() { return $this->distSha1Checksum; } /** * @param array|null $mirrors */ public function setDistMirrors($mirrors) { $this->distMirrors = $mirrors; } /** * {@inheritDoc} */ public function getDistMirrors() { return $this->distMirrors; } /** * {@inheritDoc} */ public function getDistUrls() { return $this->getUrls($this->distUrl, $this->distMirrors, $this->distReference, $this->distType, 'dist'); } /** * {@inheritDoc} */ public function getVersion() { return $this->version; } /** * {@inheritDoc} */ public function getPrettyVersion() { return $this->prettyVersion; } /** * Set the releaseDate * * @param \DateTime $releaseDate */ public function setReleaseDate(\DateTime $releaseDate) { $this->releaseDate = $releaseDate; } /** * {@inheritDoc} */ public function getReleaseDate() { return $this->releaseDate; } /** * Set the required packages * * @param Link[] $requires A set of package links */ public function setRequires(array $requires) { $this->requires = $requires; } /** * {@inheritDoc} */ public function getRequires() { return $this->requires; } /** * Set the conflicting packages * * @param Link[] $conflicts A set of package links */ public function setConflicts(array $conflicts) { $this->conflicts = $conflicts; } /** * {@inheritDoc} */ public function getConflicts() { return $this->conflicts; } /** * Set the provided virtual packages * * @param Link[] $provides A set of package links */ public function setProvides(array $provides) { $this->provides = $provides; } /** * {@inheritDoc} */ public function getProvides() { return $this->provides; } /** * Set the packages this one replaces * * @param Link[] $replaces A set of package links */ public function setReplaces(array $replaces) { $this->replaces = $replaces; } /** * {@inheritDoc} */ public function getReplaces() { return $this->replaces; } /** * Set the recommended packages * * @param Link[] $devRequires A set of package links */ public function setDevRequires(array $devRequires) { $this->devRequires = $devRequires; } /** * {@inheritDoc} */ public function getDevRequires() { return $this->devRequires; } /** * Set the suggested packages * * @param array $suggests A set of package names/comments */ public function setSuggests(array $suggests) { $this->suggests = $suggests; } /** * {@inheritDoc} */ public function getSuggests() { return $this->suggests; } /** * Set the autoload mapping * * @param array $autoload Mapping of autoloading rules */ public function setAutoload(array $autoload) { $this->autoload = $autoload; } /** * {@inheritDoc} */ public function getAutoload() { return $this->autoload; } /** * Set the dev autoload mapping * * @param array $devAutoload Mapping of dev autoloading rules */ public function setDevAutoload(array $devAutoload) { $this->devAutoload = $devAutoload; } /** * {@inheritDoc} */ public function getDevAutoload() { return $this->devAutoload; } /** * Sets the list of paths added to PHP's include path. * * @param array $includePaths List of directories. */ public function setIncludePaths(array $includePaths) { $this->includePaths = $includePaths; } /** * {@inheritDoc} */ public function getIncludePaths() { return $this->includePaths; } /** * Sets the notification URL * * @param string $notificationUrl */ public function setNotificationUrl($notificationUrl) { $this->notificationUrl = $notificationUrl; } /** * {@inheritDoc} */ public function getNotificationUrl() { return $this->notificationUrl; } /** * Sets a list of patterns to be excluded from archives * * @param array $excludes */ public function setArchiveExcludes(array $excludes) { $this->archiveExcludes = $excludes; } /** * {@inheritDoc} */ public function getArchiveExcludes() { return $this->archiveExcludes; } /** * Replaces current version and pretty version with passed values. * It also sets stability. * * @param string $version The package's normalized version * @param string $prettyVersion The package's non-normalized version */ public function replaceVersion($version, $prettyVersion) { $this->version = $version; $this->prettyVersion = $prettyVersion; $this->stability = VersionParser::parseStability($version); $this->dev = $this->stability === 'dev'; } protected function getUrls($url, $mirrors, $ref, $type, $urlType) { if (!$url) { return array(); } $urls = array($url); if ($mirrors) { foreach ($mirrors as $mirror) { if ($urlType === 'dist') { $mirrorUrl = ComposerMirror::processUrl($mirror['url'], $this->name, $this->version, $ref, $type); } elseif ($urlType === 'source' && $type === 'git') { $mirrorUrl = ComposerMirror::processGitUrl($mirror['url'], $this->name, $url, $type); } elseif ($urlType === 'source' && $type === 'hg') { $mirrorUrl = ComposerMirror::processHgUrl($mirror['url'], $this->name, $url, $type); } if (!in_array($mirrorUrl, $urls)) { $func = $mirror['preferred'] ? 'array_unshift' : 'array_push'; $func($urls, $mirrorUrl); } } } return $urls; } } composer/src/Composer/Package/Comparer/Comparer.php 0000644 00000007064 14736103146 0016351 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package\Comparer; /** * class Comparer * * @author Hector Prats <hectorpratsortega@gmail.com> */ class Comparer { private $source; private $update; private $changed; public function setSource($source) { $this->source = $source; } public function setUpdate($update) { $this->update = $update; } public function getChanged($toString = false, $explicated = false) { $changed = $this->changed; if (!count($changed)) { return false; } if ($explicated) { foreach ($changed as $sectionKey => $itemSection) { foreach ($itemSection as $itemKey => $item) { $changed[$sectionKey][$itemKey] = $item.' ('.$sectionKey.')'; } } } if ($toString) { foreach ($changed as $sectionKey => $itemSection) { foreach ($itemSection as $itemKey => $item) { $changed['string'][] = $item."\r\n"; } } $changed = implode("\r\n", $changed['string']); } return $changed; } public function doCompare() { $source = array(); $destination = array(); $this->changed = array(); $currentDirectory = getcwd(); chdir($this->source); $source = $this->doTree('.', $source); if (!is_array($source)) { return; } chdir($currentDirectory); chdir($this->update); $destination = $this->doTree('.', $destination); if (!is_array($destination)) { exit; } chdir($currentDirectory); foreach ($source as $dir => $value) { foreach ($value as $file => $hash) { if (isset($destination[$dir][$file])) { if ($hash !== $destination[$dir][$file]) { $this->changed['changed'][] = $dir.'/'.$file; } } else { $this->changed['removed'][] = $dir.'/'.$file; } } } foreach ($destination as $dir => $value) { foreach ($value as $file => $hash) { if (!isset($source[$dir][$file])) { $this->changed['added'][] = $dir.'/'.$file; } } } } private function doTree($dir, &$array) { if ($dh = opendir($dir)) { while ($file = readdir($dh)) { if ($file !== '.' && $file !== '..') { if (is_dir($dir.'/'.$file)) { if (!count($array)) { $array[0] = 'Temp'; } if (!$this->doTree($dir.'/'.$file, $array)) { return false; } } else { if (filesize($dir.'/'.$file)) { set_time_limit(30); $array[$dir][$file] = md5_file($dir.'/'.$file); } } } } if (count($array) > 1 && isset($array['0'])) { unset($array['0']); } return $array; } return false; } } composer/src/Composer/Package/PackageInterface.php 0000644 00000022554 14736103146 0016206 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package; use Composer\Repository\RepositoryInterface; /** * Defines the essential information a package has that is used during solving/installation * * @author Jordi Boggiano <j.boggiano@seld.be> */ interface PackageInterface { /** * Returns the package's name without version info, thus not a unique identifier * * @return string package name */ public function getName(); /** * Returns the package's pretty (i.e. with proper case) name * * @return string package name */ public function getPrettyName(); /** * Returns a set of names that could refer to this package * * No version or release type information should be included in any of the * names. Provided or replaced package names need to be returned as well. * * @return array An array of strings referring to this package */ public function getNames(); /** * Allows the solver to set an id for this package to refer to it. * * @param int $id */ public function setId($id); /** * Retrieves the package's id set through setId * * @return int The previously set package id */ public function getId(); /** * Returns whether the package is a development virtual package or a concrete one * * @return bool */ public function isDev(); /** * Returns the package type, e.g. library * * @return string The package type */ public function getType(); /** * Returns the package targetDir property * * @return string The package targetDir */ public function getTargetDir(); /** * Returns the package extra data * * @return array The package extra data */ public function getExtra(); /** * Sets source from which this package was installed (source/dist). * * @param string $type source/dist */ public function setInstallationSource($type); /** * Returns source from which this package was installed (source/dist). * * @return string source/dist */ public function getInstallationSource(); /** * Returns the repository type of this package, e.g. git, svn * * @return string The repository type */ public function getSourceType(); /** * Returns the repository url of this package, e.g. git://github.com/naderman/composer.git * * @return string The repository url */ public function getSourceUrl(); /** * Returns the repository urls of this package including mirrors, e.g. git://github.com/naderman/composer.git * * @return array */ public function getSourceUrls(); /** * Returns the repository reference of this package, e.g. master, 1.0.0 or a commit hash for git * * @return string The repository reference */ public function getSourceReference(); /** * Returns the source mirrors of this package * * @return array|null */ public function getSourceMirrors(); /** * Returns the type of the distribution archive of this version, e.g. zip, tarball * * @return string The repository type */ public function getDistType(); /** * Returns the url of the distribution archive of this version * * @return string */ public function getDistUrl(); /** * Returns the urls of the distribution archive of this version, including mirrors * * @return array */ public function getDistUrls(); /** * Returns the reference of the distribution archive of this version, e.g. master, 1.0.0 or a commit hash for git * * @return string */ public function getDistReference(); /** * Returns the sha1 checksum for the distribution archive of this version * * @return string */ public function getDistSha1Checksum(); /** * Returns the dist mirrors of this package * * @return array|null */ public function getDistMirrors(); /** * Returns the version of this package * * @return string version */ public function getVersion(); /** * Returns the pretty (i.e. non-normalized) version string of this package * * @return string version */ public function getPrettyVersion(); /** * Returns the pretty version string plus a git or hg commit hash of this package * * @see getPrettyVersion * * @param bool $truncate If the source reference is a sha1 hash, truncate it * @return string version */ public function getFullPrettyVersion($truncate = true); /** * Returns the release date of the package * * @return \DateTime */ public function getReleaseDate(); /** * Returns the stability of this package: one of (dev, alpha, beta, RC, stable) * * @return string */ public function getStability(); /** * Returns a set of links to packages which need to be installed before * this package can be installed * * @return Link[] An array of package links defining required packages */ public function getRequires(); /** * Returns a set of links to packages which must not be installed at the * same time as this package * * @return Link[] An array of package links defining conflicting packages */ public function getConflicts(); /** * Returns a set of links to virtual packages that are provided through * this package * * @return Link[] An array of package links defining provided packages */ public function getProvides(); /** * Returns a set of links to packages which can alternatively be * satisfied by installing this package * * @return Link[] An array of package links defining replaced packages */ public function getReplaces(); /** * Returns a set of links to packages which are required to develop * this package. These are installed if in dev mode. * * @return Link[] An array of package links defining packages required for development */ public function getDevRequires(); /** * Returns a set of package names and reasons why they are useful in * combination with this package. * * @return array An array of package suggestions with descriptions */ public function getSuggests(); /** * Returns an associative array of autoloading rules * * {"<type>": {"<namespace": "<directory>"}} * * Type is either "psr-4", "psr-0", "classmap" or "files". Namespaces are mapped to * directories for autoloading using the type specified. * * @return array Mapping of autoloading rules */ public function getAutoload(); /** * Returns an associative array of dev autoloading rules * * {"<type>": {"<namespace": "<directory>"}} * * Type is either "psr-4", "psr-0", "classmap" or "files". Namespaces are mapped to * directories for autoloading using the type specified. * * @return array Mapping of dev autoloading rules */ public function getDevAutoload(); /** * Returns a list of directories which should get added to PHP's * include path. * * @return array */ public function getIncludePaths(); /** * Stores a reference to the repository that owns the package * * @param RepositoryInterface $repository */ public function setRepository(RepositoryInterface $repository); /** * Returns a reference to the repository that owns the package * * @return RepositoryInterface */ public function getRepository(); /** * Returns the package binaries * * @return array */ public function getBinaries(); /** * Returns package unique name, constructed from name and version. * * @return string */ public function getUniqueName(); /** * Returns the package notification url * * @return string */ public function getNotificationUrl(); /** * Converts the package into a readable and unique string * * @return string */ public function __toString(); /** * Converts the package into a pretty readable string * * @return string */ public function getPrettyString(); /** * Returns a list of patterns to exclude from package archives * * @return array */ public function getArchiveExcludes(); /** * Returns a list of options to download package dist files * * @return array */ public function getTransportOptions(); /** * @param string $reference * * @return void */ public function setSourceReference($reference); /** * @param string $url * * @return void */ public function setDistUrl($url); /** * @param string $type * * @return void */ public function setDistType($type); /** * @param string $reference * * @return void */ public function setDistReference($reference); } composer/src/Composer/Package/Loader/ValidatingArrayLoader.php 0000644 00000056171 14736103146 0020452 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package\Loader; use Composer\Package\BasePackage; use Composer\Semver\Constraint\Constraint; use Composer\Package\Version\VersionParser; use Composer\Repository\PlatformRepository; use Composer\Spdx\SpdxLicenses; /** * @author Jordi Boggiano <j.boggiano@seld.be> */ class ValidatingArrayLoader implements LoaderInterface { const CHECK_ALL = 3; const CHECK_UNBOUND_CONSTRAINTS = 1; const CHECK_STRICT_CONSTRAINTS = 2; private $loader; private $versionParser; private $errors; private $warnings; private $config; private $strictName; private $flags; public function __construct(LoaderInterface $loader, $strictName = true, VersionParser $parser = null, $flags = 0) { $this->loader = $loader; $this->versionParser = $parser ?: new VersionParser(); $this->strictName = $strictName; $this->flags = $flags; } public function load(array $config, $class = 'Composer\Package\CompletePackage') { $this->errors = array(); $this->warnings = array(); $this->config = $config; if ($err = self::hasPackageNamingError($config['name'])) { $this->warnings[] = 'Deprecation warning: Your package name '.$err.' Make sure you fix this as Composer 2.0 will error.'; } if ($this->strictName) { $this->validateRegex('name', '[A-Za-z0-9][A-Za-z0-9_.-]*/[A-Za-z0-9][A-Za-z0-9_.-]*', true); } else { $this->validateString('name', true); } if (!empty($this->config['version'])) { try { $this->versionParser->normalize($this->config['version']); } catch (\Exception $e) { $this->errors[] = 'version : invalid value ('.$this->config['version'].'): '.$e->getMessage(); unset($this->config['version']); } } if (!empty($this->config['config']['platform'])) { foreach ((array) $this->config['config']['platform'] as $key => $platform) { try { $this->versionParser->normalize($platform); } catch (\Exception $e) { $this->errors[] = 'config.platform.' . $key . ' : invalid value ('.$platform.'): '.$e->getMessage(); } } } $this->validateRegex('type', '[A-Za-z0-9-]+'); $this->validateString('target-dir'); $this->validateArray('extra'); if (isset($this->config['bin'])) { if (is_string($this->config['bin'])) { $this->validateString('bin'); } else { $this->validateFlatArray('bin'); } } $this->validateArray('scripts'); // TODO validate event names & listener syntax $this->validateString('description'); $this->validateUrl('homepage'); $this->validateFlatArray('keywords', '[\p{N}\p{L} ._-]+'); $releaseDate = null; $this->validateString('time'); if (!empty($this->config['time'])) { try { $releaseDate = new \DateTime($this->config['time'], new \DateTimeZone('UTC')); } catch (\Exception $e) { $this->errors[] = 'time : invalid value ('.$this->config['time'].'): '.$e->getMessage(); unset($this->config['time']); } } // check for license validity on newly updated branches if (isset($this->config['license']) && (!$releaseDate || $releaseDate->getTimestamp() >= strtotime('-8days'))) { if (is_array($this->config['license']) || is_string($this->config['license'])) { $licenses = (array) $this->config['license']; // strip proprietary since it's not a valid SPDX identifier, but is accepted by composer foreach ($licenses as $key => $license) { if ('proprietary' === $license) { unset($licenses[$key]); } } $licenseValidator = new SpdxLicenses(); if (count($licenses) === 1 && !$licenseValidator->validate($licenses) && $licenseValidator->validate(trim($licenses[0]))) { $this->warnings[] = sprintf( 'License %s must not contain extra spaces, make sure to trim it.', json_encode($this->config['license']) ); } elseif (array() !== $licenses && !$licenseValidator->validate($licenses)) { $this->warnings[] = sprintf( 'License %s is not a valid SPDX license identifier, see https://spdx.org/licenses/ if you use an open license.' . PHP_EOL . 'If the software is closed-source, you may use "proprietary" as license.', json_encode($this->config['license']) ); } } } if ($this->validateArray('authors') && !empty($this->config['authors'])) { foreach ($this->config['authors'] as $key => $author) { if (!is_array($author)) { $this->errors[] = 'authors.'.$key.' : should be an array, '.gettype($author).' given'; unset($this->config['authors'][$key]); continue; } foreach (array('homepage', 'email', 'name', 'role') as $authorData) { if (isset($author[$authorData]) && !is_string($author[$authorData])) { $this->errors[] = 'authors.'.$key.'.'.$authorData.' : invalid value, must be a string'; unset($this->config['authors'][$key][$authorData]); } } if (isset($author['homepage']) && !$this->filterUrl($author['homepage'])) { $this->warnings[] = 'authors.'.$key.'.homepage : invalid value ('.$author['homepage'].'), must be an http/https URL'; unset($this->config['authors'][$key]['homepage']); } if (isset($author['email']) && !filter_var($author['email'], FILTER_VALIDATE_EMAIL)) { $this->warnings[] = 'authors.'.$key.'.email : invalid value ('.$author['email'].'), must be a valid email address'; unset($this->config['authors'][$key]['email']); } if (empty($this->config['authors'][$key])) { unset($this->config['authors'][$key]); } } if (empty($this->config['authors'])) { unset($this->config['authors']); } } if ($this->validateArray('support') && !empty($this->config['support'])) { foreach (array('issues', 'forum', 'wiki', 'source', 'email', 'irc', 'docs', 'rss', 'chat') as $key) { if (isset($this->config['support'][$key]) && !is_string($this->config['support'][$key])) { $this->errors[] = 'support.'.$key.' : invalid value, must be a string'; unset($this->config['support'][$key]); } } if (isset($this->config['support']['email']) && !filter_var($this->config['support']['email'], FILTER_VALIDATE_EMAIL)) { $this->warnings[] = 'support.email : invalid value ('.$this->config['support']['email'].'), must be a valid email address'; unset($this->config['support']['email']); } if (isset($this->config['support']['irc']) && !$this->filterUrl($this->config['support']['irc'], array('irc'))) { $this->warnings[] = 'support.irc : invalid value ('.$this->config['support']['irc'].'), must be a irc://<server>/<channel> URL'; unset($this->config['support']['irc']); } foreach (array('issues', 'forum', 'wiki', 'source', 'docs', 'chat') as $key) { if (isset($this->config['support'][$key]) && !$this->filterUrl($this->config['support'][$key])) { $this->warnings[] = 'support.'.$key.' : invalid value ('.$this->config['support'][$key].'), must be an http/https URL'; unset($this->config['support'][$key]); } } if (empty($this->config['support'])) { unset($this->config['support']); } } if ($this->validateArray('funding') && !empty($this->config['funding'])) { foreach ($this->config['funding'] as $key => $fundingOption) { if (!is_array($fundingOption)) { $this->errors[] = 'funding.'.$key.' : should be an array, '.gettype($fundingOption).' given'; unset($this->config['funding'][$key]); continue; } foreach (array('type', 'url') as $fundingData) { if (isset($fundingOption[$fundingData]) && !is_string($fundingOption[$fundingData])) { $this->errors[] = 'funding.'.$key.'.'.$fundingData.' : invalid value, must be a string'; unset($this->config['funding'][$key][$fundingData]); } } if (isset($fundingOption['url']) && !$this->filterUrl($fundingOption['url'])) { $this->warnings[] = 'funding.'.$key.'.url : invalid value ('.$fundingOption['url'].'), must be an http/https URL'; unset($this->config['funding'][$key]['url']); } if (empty($this->config['funding'][$key])) { unset($this->config['funding'][$key]); } } if (empty($this->config['funding'])) { unset($this->config['funding']); } } $unboundConstraint = new Constraint('=', $this->versionParser->normalize('dev-master')); $stableConstraint = new Constraint('=', '1.0.0'); foreach (array_keys(BasePackage::$supportedLinkTypes) as $linkType) { if ($this->validateArray($linkType) && isset($this->config[$linkType])) { foreach ($this->config[$linkType] as $package => $constraint) { if ($err = self::hasPackageNamingError($package, true)) { $this->warnings[] = 'Deprecation warning: '.$linkType.'.'.$err.' Make sure you fix this as Composer 2.0 will error.'; } elseif (!preg_match('{^[A-Za-z0-9_./-]+$}', $package)) { $this->warnings[] = $linkType.'.'.$package.' : invalid key, package names must be strings containing only [A-Za-z0-9_./-]'; } if (!is_string($constraint)) { $this->errors[] = $linkType.'.'.$package.' : invalid value, must be a string containing a version constraint'; unset($this->config[$linkType][$package]); } elseif ('self.version' !== $constraint) { try { $linkConstraint = $this->versionParser->parseConstraints($constraint); } catch (\Exception $e) { $this->errors[] = $linkType.'.'.$package.' : invalid version constraint ('.$e->getMessage().')'; unset($this->config[$linkType][$package]); continue; } // check requires for unbound constraints on non-platform packages if ( ($this->flags & self::CHECK_UNBOUND_CONSTRAINTS) && 'require' === $linkType && $linkConstraint->matches($unboundConstraint) && !preg_match(PlatformRepository::PLATFORM_PACKAGE_REGEX, $package) ) { $this->warnings[] = $linkType.'.'.$package.' : unbound version constraints ('.$constraint.') should be avoided'; } elseif ( // check requires for exact constraints ($this->flags & self::CHECK_STRICT_CONSTRAINTS) && 'require' === $linkType && substr($linkConstraint, 0, 1) === '=' && $stableConstraint->versionCompare($stableConstraint, $linkConstraint, '<=') ) { $this->warnings[] = $linkType.'.'.$package.' : exact version constraints ('.$constraint.') should be avoided if the package follows semantic versioning'; } } } } } if ($this->validateArray('suggest') && !empty($this->config['suggest'])) { foreach ($this->config['suggest'] as $package => $description) { if (!is_string($description)) { $this->errors[] = 'suggest.'.$package.' : invalid value, must be a string describing why the package is suggested'; unset($this->config['suggest'][$package]); } } } if ($this->validateString('minimum-stability') && !empty($this->config['minimum-stability'])) { if (!isset(BasePackage::$stabilities[$this->config['minimum-stability']])) { $this->errors[] = 'minimum-stability : invalid value ('.$this->config['minimum-stability'].'), must be one of '.implode(', ', array_keys(BasePackage::$stabilities)); unset($this->config['minimum-stability']); } } if ($this->validateArray('autoload') && !empty($this->config['autoload'])) { $types = array('psr-0', 'psr-4', 'classmap', 'files', 'exclude-from-classmap'); foreach ($this->config['autoload'] as $type => $typeConfig) { if (!in_array($type, $types)) { $this->errors[] = 'autoload : invalid value ('.$type.'), must be one of '.implode(', ', $types); unset($this->config['autoload'][$type]); } if ($type === 'psr-4') { foreach ($typeConfig as $namespace => $dirs) { if ($namespace !== '' && '\\' !== substr($namespace, -1)) { $this->errors[] = 'autoload.psr-4 : invalid value ('.$namespace.'), namespaces must end with a namespace separator, should be '.$namespace.'\\\\'; } } } } } if (!empty($this->config['autoload']['psr-4']) && !empty($this->config['target-dir'])) { $this->errors[] = 'target-dir : this can not be used together with the autoload.psr-4 setting, remove target-dir to upgrade to psr-4'; // Unset the psr-4 setting, since unsetting target-dir might // interfere with other settings. unset($this->config['autoload']['psr-4']); } // TODO validate dist // TODO validate source // TODO validate repositories // TODO validate package repositories' packages using this recursively $this->validateFlatArray('include-path'); $this->validateArray('transport-options'); // branch alias validation if (isset($this->config['extra']['branch-alias'])) { if (!is_array($this->config['extra']['branch-alias'])) { $this->errors[] = 'extra.branch-alias : must be an array of versions => aliases'; } else { foreach ($this->config['extra']['branch-alias'] as $sourceBranch => $targetBranch) { // ensure it is an alias to a -dev package if ('-dev' !== substr($targetBranch, -4)) { $this->warnings[] = 'extra.branch-alias.'.$sourceBranch.' : the target branch ('.$targetBranch.') must end in -dev'; unset($this->config['extra']['branch-alias'][$sourceBranch]); continue; } // normalize without -dev and ensure it's a numeric branch that is parseable $validatedTargetBranch = $this->versionParser->normalizeBranch(substr($targetBranch, 0, -4)); if ('-dev' !== substr($validatedTargetBranch, -4)) { $this->warnings[] = 'extra.branch-alias.'.$sourceBranch.' : the target branch ('.$targetBranch.') must be a parseable number like 2.0-dev'; unset($this->config['extra']['branch-alias'][$sourceBranch]); continue; } // If using numeric aliases ensure the alias is a valid subversion if (($sourcePrefix = $this->versionParser->parseNumericAliasPrefix($sourceBranch)) && ($targetPrefix = $this->versionParser->parseNumericAliasPrefix($targetBranch)) && (stripos($targetPrefix, $sourcePrefix) !== 0) ) { $this->warnings[] = 'extra.branch-alias.'.$sourceBranch.' : the target branch ('.$targetBranch.') is not a valid numeric alias for this version'; unset($this->config['extra']['branch-alias'][$sourceBranch]); } } } } if ($this->errors) { throw new InvalidPackageException($this->errors, $this->warnings, $config); } $package = $this->loader->load($this->config, $class); $this->config = null; return $package; } public function getWarnings() { return $this->warnings; } public function getErrors() { return $this->errors; } public static function hasPackageNamingError($name, $isLink = false) { if (preg_match(PlatformRepository::PLATFORM_PACKAGE_REGEX, $name)) { return; } if (!preg_match('{^[a-z0-9](?:[_.-]?[a-z0-9]+)*/[a-z0-9](?:(?:[_.]?|-{0,2})[a-z0-9]+)*$}iD', $name)) { return $name.' is invalid, it should have a vendor name, a forward slash, and a package name. The vendor and package name can be words separated by -, . or _. The complete name should match "^[a-z0-9]([_.-]?[a-z0-9]+)*/[a-z0-9](([_.]?|-{0,2})[a-z0-9]+)*$".'; } $reservedNames = array('nul', 'con', 'prn', 'aux', 'com1', 'com2', 'com3', 'com4', 'com5', 'com6', 'com7', 'com8', 'com9', 'lpt1', 'lpt2', 'lpt3', 'lpt4', 'lpt5', 'lpt6', 'lpt7', 'lpt8', 'lpt9'); $bits = explode('/', strtolower($name)); if (in_array($bits[0], $reservedNames, true) || in_array($bits[1], $reservedNames, true)) { return $name.' is reserved, package and vendor names can not match any of: '.implode(', ', $reservedNames).'.'; } if (preg_match('{\.json$}', $name)) { return $name.' is invalid, package names can not end in .json, consider renaming it or perhaps using a -json suffix instead.'; } if (preg_match('{[A-Z]}', $name)) { if ($isLink) { return $name.' is invalid, it should not contain uppercase characters. Please use '.strtolower($name).' instead.'; } $suggestName = preg_replace('{(?:([a-z])([A-Z])|([A-Z])([A-Z][a-z]))}', '\\1\\3-\\2\\4', $name); $suggestName = strtolower($suggestName); return $name.' is invalid, it should not contain uppercase characters. We suggest using '.$suggestName.' instead.'; } } private function validateRegex($property, $regex, $mandatory = false) { if (!$this->validateString($property, $mandatory)) { return false; } if (!preg_match('{^'.$regex.'$}u', $this->config[$property])) { $message = $property.' : invalid value ('.$this->config[$property].'), must match '.$regex; if ($mandatory) { $this->errors[] = $message; } else { $this->warnings[] = $message; } unset($this->config[$property]); return false; } return true; } private function validateString($property, $mandatory = false) { if (isset($this->config[$property]) && !is_string($this->config[$property])) { $this->errors[] = $property.' : should be a string, '.gettype($this->config[$property]).' given'; unset($this->config[$property]); return false; } if (!isset($this->config[$property]) || trim($this->config[$property]) === '') { if ($mandatory) { $this->errors[] = $property.' : must be present'; } unset($this->config[$property]); return false; } return true; } private function validateArray($property, $mandatory = false) { if (isset($this->config[$property]) && !is_array($this->config[$property])) { $this->errors[] = $property.' : should be an array, '.gettype($this->config[$property]).' given'; unset($this->config[$property]); return false; } if (!isset($this->config[$property]) || !count($this->config[$property])) { if ($mandatory) { $this->errors[] = $property.' : must be present and contain at least one element'; } unset($this->config[$property]); return false; } return true; } private function validateFlatArray($property, $regex = null, $mandatory = false) { if (!$this->validateArray($property, $mandatory)) { return false; } $pass = true; foreach ($this->config[$property] as $key => $value) { if (!is_string($value) && !is_numeric($value)) { $this->errors[] = $property.'.'.$key.' : must be a string or int, '.gettype($value).' given'; unset($this->config[$property][$key]); $pass = false; continue; } if ($regex && !preg_match('{^'.$regex.'$}u', $value)) { $this->warnings[] = $property.'.'.$key.' : invalid value ('.$value.'), must match '.$regex; unset($this->config[$property][$key]); $pass = false; } } return $pass; } private function validateUrl($property, $mandatory = false) { if (!$this->validateString($property, $mandatory)) { return false; } if (!$this->filterUrl($this->config[$property])) { $this->warnings[] = $property.' : invalid value ('.$this->config[$property].'), must be an http/https URL'; unset($this->config[$property]); return false; } return true; } private function filterUrl($value, array $schemes = array('http', 'https')) { if ($value === '') { return true; } $bits = parse_url($value); if (empty($bits['scheme']) || empty($bits['host'])) { return false; } if (!in_array($bits['scheme'], $schemes, true)) { return false; } return true; } } composer/src/Composer/Package/Loader/InvalidPackageException.php 0000644 00000001751 14736103146 0020755 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package\Loader; /** * @author Jordi Boggiano <j.boggiano@seld.be> */ class InvalidPackageException extends \Exception { private $errors; private $warnings; private $data; public function __construct(array $errors, array $warnings, array $data) { $this->errors = $errors; $this->warnings = $warnings; $this->data = $data; parent::__construct("Invalid package information: \n".implode("\n", array_merge($errors, $warnings))); } public function getData() { return $this->data; } public function getErrors() { return $this->errors; } public function getWarnings() { return $this->warnings; } } composer/src/Composer/Package/Loader/LoaderInterface.php 0000644 00000001502 14736103146 0017255 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package\Loader; /** * Defines a loader that takes an array to create package instances * * @author Jordi Boggiano <j.boggiano@seld.be> */ interface LoaderInterface { /** * Converts a package from an array to a real instance * * @param array $package Package config * @param string $class Package class to use * @return \Composer\Package\PackageInterface */ public function load(array $package, $class = 'Composer\Package\CompletePackage'); } composer/src/Composer/Package/Loader/ArrayLoader.php 0000644 00000026515 14736103146 0016446 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package\Loader; use Composer\Package; use Composer\Package\AliasPackage; use Composer\Package\Link; use Composer\Package\RootAliasPackage; use Composer\Package\RootPackageInterface; use Composer\Package\Version\VersionParser; use Composer\Semver\VersionParser as SemverVersionParser; /** * @author Konstantin Kudryashiv <ever.zet@gmail.com> * @author Jordi Boggiano <j.boggiano@seld.be> */ class ArrayLoader implements LoaderInterface { protected $versionParser; protected $loadOptions; public function __construct(SemverVersionParser $parser = null, $loadOptions = false) { if (!$parser) { $parser = new VersionParser; } $this->versionParser = $parser; $this->loadOptions = $loadOptions; } public function load(array $config, $class = 'Composer\Package\CompletePackage') { if (!isset($config['name'])) { throw new \UnexpectedValueException('Unknown package has no name defined ('.json_encode($config).').'); } if (!isset($config['version'])) { throw new \UnexpectedValueException('Package '.$config['name'].' has no version defined.'); } // handle already normalized versions if (isset($config['version_normalized'])) { $version = $config['version_normalized']; } else { $version = $this->versionParser->normalize($config['version']); } $package = new $class($config['name'], $version, $config['version']); $package->setType(isset($config['type']) ? strtolower($config['type']) : 'library'); if (isset($config['target-dir'])) { $package->setTargetDir($config['target-dir']); } if (isset($config['extra']) && is_array($config['extra'])) { $package->setExtra($config['extra']); } if (isset($config['bin'])) { foreach ((array) $config['bin'] as $key => $bin) { $config['bin'][$key] = ltrim($bin, '/'); } $package->setBinaries((array) $config['bin']); } if (isset($config['installation-source'])) { $package->setInstallationSource($config['installation-source']); } if (isset($config['source'])) { if (!isset($config['source']['type']) || !isset($config['source']['url']) || !isset($config['source']['reference'])) { throw new \UnexpectedValueException(sprintf( "Package %s's source key should be specified as {\"type\": ..., \"url\": ..., \"reference\": ...},\n%s given.", $config['name'], json_encode($config['source']) )); } $package->setSourceType($config['source']['type']); $package->setSourceUrl($config['source']['url']); $package->setSourceReference(isset($config['source']['reference']) ? $config['source']['reference'] : null); if (isset($config['source']['mirrors'])) { $package->setSourceMirrors($config['source']['mirrors']); } } if (isset($config['dist'])) { if (!isset($config['dist']['type']) || !isset($config['dist']['url'])) { throw new \UnexpectedValueException(sprintf( "Package %s's dist key should be specified as ". "{\"type\": ..., \"url\": ..., \"reference\": ..., \"shasum\": ...},\n%s given.", $config['name'], json_encode($config['dist']) )); } $package->setDistType($config['dist']['type']); $package->setDistUrl($config['dist']['url']); $package->setDistReference(isset($config['dist']['reference']) ? $config['dist']['reference'] : null); $package->setDistSha1Checksum(isset($config['dist']['shasum']) ? $config['dist']['shasum'] : null); if (isset($config['dist']['mirrors'])) { $package->setDistMirrors($config['dist']['mirrors']); } } foreach (Package\BasePackage::$supportedLinkTypes as $type => $opts) { if (isset($config[$type])) { $method = 'set'.ucfirst($opts['method']); $package->{$method}( $this->parseLinks( $package->getName(), $package->getPrettyVersion(), $opts['description'], $config[$type] ) ); } } if (isset($config['suggest']) && is_array($config['suggest'])) { foreach ($config['suggest'] as $target => $reason) { if ('self.version' === trim($reason)) { $config['suggest'][$target] = $package->getPrettyVersion(); } } $package->setSuggests($config['suggest']); } if (isset($config['autoload'])) { $package->setAutoload($config['autoload']); } if (isset($config['autoload-dev'])) { $package->setDevAutoload($config['autoload-dev']); } if (isset($config['include-path'])) { $package->setIncludePaths($config['include-path']); } if (!empty($config['time'])) { $time = preg_match('/^\d++$/D', $config['time']) ? '@'.$config['time'] : $config['time']; try { $date = new \DateTime($time, new \DateTimeZone('UTC')); $package->setReleaseDate($date); } catch (\Exception $e) { } } if (!empty($config['notification-url'])) { $package->setNotificationUrl($config['notification-url']); } if (!empty($config['archive']['exclude'])) { $package->setArchiveExcludes($config['archive']['exclude']); } if ($package instanceof Package\CompletePackageInterface) { if (isset($config['scripts']) && is_array($config['scripts'])) { foreach ($config['scripts'] as $event => $listeners) { $config['scripts'][$event] = (array) $listeners; } if (isset($config['scripts']['composer'])) { trigger_error('The `composer` script name is reserved for internal use, please avoid defining it', E_USER_DEPRECATED); } $package->setScripts($config['scripts']); } if (!empty($config['description']) && is_string($config['description'])) { $package->setDescription($config['description']); } if (!empty($config['homepage']) && is_string($config['homepage'])) { $package->setHomepage($config['homepage']); } if (!empty($config['keywords']) && is_array($config['keywords'])) { $package->setKeywords($config['keywords']); } if (!empty($config['license'])) { $package->setLicense(is_array($config['license']) ? $config['license'] : array($config['license'])); } if (!empty($config['authors']) && is_array($config['authors'])) { $package->setAuthors($config['authors']); } if (isset($config['support'])) { $package->setSupport($config['support']); } if (!empty($config['funding']) && is_array($config['funding'])) { $package->setFunding($config['funding']); } if (isset($config['abandoned'])) { $package->setAbandoned($config['abandoned']); } } if ($aliasNormalized = $this->getBranchAlias($config)) { if ($package instanceof RootPackageInterface) { $package = new RootAliasPackage($package, $aliasNormalized, preg_replace('{(\.9{7})+}', '.x', $aliasNormalized)); } else { $package = new AliasPackage($package, $aliasNormalized, preg_replace('{(\.9{7})+}', '.x', $aliasNormalized)); } } if ($this->loadOptions && isset($config['transport-options'])) { $package->setTransportOptions($config['transport-options']); } return $package; } /** * @param string $source source package name * @param string $sourceVersion source package version (pretty version ideally) * @param string $description link description (e.g. requires, replaces, ..) * @param array $links array of package name => constraint mappings * @return Link[] */ public function parseLinks($source, $sourceVersion, $description, $links) { $res = array(); foreach ($links as $target => $constraint) { if (!is_string($constraint)) { throw new \UnexpectedValueException('Link constraint in '.$source.' '.$description.' > '.$target.' should be a string, got '.gettype($constraint) . ' (' . var_export($constraint, true) . ')'); } if ('self.version' === $constraint) { $parsedConstraint = $this->versionParser->parseConstraints($sourceVersion); } else { $parsedConstraint = $this->versionParser->parseConstraints($constraint); } $res[strtolower($target)] = new Link($source, $target, $parsedConstraint, $description, $constraint); } return $res; } /** * Retrieves a branch alias (dev-master => 1.0.x-dev for example) if it exists * * @param array $config the entire package config * @return string|null normalized version of the branch alias or null if there is none */ public function getBranchAlias(array $config) { if (('dev-' !== substr($config['version'], 0, 4) && '-dev' !== substr($config['version'], -4)) || !isset($config['extra']['branch-alias']) || !is_array($config['extra']['branch-alias']) ) { return; } foreach ($config['extra']['branch-alias'] as $sourceBranch => $targetBranch) { // ensure it is an alias to a -dev package if ('-dev' !== substr($targetBranch, -4)) { continue; } // normalize without -dev and ensure it's a numeric branch that is parseable $validatedTargetBranch = $this->versionParser->normalizeBranch(substr($targetBranch, 0, -4)); if ('-dev' !== substr($validatedTargetBranch, -4)) { continue; } // ensure that it is the current branch aliasing itself if (strtolower($config['version']) !== strtolower($sourceBranch)) { continue; } // If using numeric aliases ensure the alias is a valid subversion if (($sourcePrefix = $this->versionParser->parseNumericAliasPrefix($sourceBranch)) && ($targetPrefix = $this->versionParser->parseNumericAliasPrefix($targetBranch)) && (stripos($targetPrefix, $sourcePrefix) !== 0) ) { continue; } return $validatedTargetBranch; } } } composer/src/Composer/Package/Loader/RootPackageLoader.php 0000644 00000023611 14736103146 0017561 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package\Loader; use Composer\Package\BasePackage; use Composer\Package\AliasPackage; use Composer\Config; use Composer\IO\IOInterface; use Composer\Package\RootPackageInterface; use Composer\Repository\RepositoryFactory; use Composer\Package\Version\VersionGuesser; use Composer\Package\Version\VersionParser; use Composer\Repository\RepositoryManager; use Composer\Util\ProcessExecutor; /** * ArrayLoader built for the sole purpose of loading the root package * * Sets additional defaults and loads repositories * * @author Jordi Boggiano <j.boggiano@seld.be> */ class RootPackageLoader extends ArrayLoader { /** * @var RepositoryManager */ private $manager; /** * @var Config */ private $config; /** * @var VersionGuesser */ private $versionGuesser; /** * @var IOInterface */ private $io; public function __construct(RepositoryManager $manager, Config $config, VersionParser $parser = null, VersionGuesser $versionGuesser = null, IOInterface $io = null) { parent::__construct($parser); $this->manager = $manager; $this->config = $config; $this->versionGuesser = $versionGuesser ?: new VersionGuesser($config, new ProcessExecutor(), $this->versionParser); $this->io = $io; } /** * @param array $config package data * @param string $class FQCN to be instantiated * @param string $cwd cwd of the root package to be used to guess the version if it is not provided * @return RootPackageInterface */ public function load(array $config, $class = 'Composer\Package\RootPackage', $cwd = null) { if (!isset($config['name'])) { $config['name'] = '__root__'; } elseif ($this->io) { if ($err = ValidatingArrayLoader::hasPackageNamingError($config['name'])) { $this->io->writeError('<warning>Deprecation warning: Your package name '.$err.' Make sure you fix this as Composer 2.0 will error.</warning>'); } } $autoVersioned = false; if (!isset($config['version'])) { $commit = null; // override with env var if available if (getenv('COMPOSER_ROOT_VERSION')) { $config['version'] = getenv('COMPOSER_ROOT_VERSION'); } else { $versionData = $this->versionGuesser->guessVersion($config, $cwd ?: getcwd()); if ($versionData) { $config['version'] = $versionData['pretty_version']; $config['version_normalized'] = $versionData['version']; $commit = $versionData['commit']; } } if (!isset($config['version'])) { $config['version'] = '1.0.0'; $autoVersioned = true; } if ($commit) { $config['source'] = array( 'type' => '', 'url' => '', 'reference' => $commit, ); $config['dist'] = array( 'type' => '', 'url' => '', 'reference' => $commit, ); } } $realPackage = $package = parent::load($config, $class); if ($realPackage instanceof AliasPackage) { $realPackage = $package->getAliasOf(); } if ($autoVersioned) { $realPackage->replaceVersion($realPackage->getVersion(), 'No version set (parsed as 1.0.0)'); } if (isset($config['minimum-stability'])) { $realPackage->setMinimumStability(VersionParser::normalizeStability($config['minimum-stability'])); } $aliases = array(); $stabilityFlags = array(); $references = array(); foreach (array('require', 'require-dev') as $linkType) { if (isset($config[$linkType])) { $linkInfo = BasePackage::$supportedLinkTypes[$linkType]; $method = 'get'.ucfirst($linkInfo['method']); $links = array(); foreach ($realPackage->$method() as $link) { $links[$link->getTarget()] = $link->getConstraint()->getPrettyString(); } $aliases = $this->extractAliases($links, $aliases); $stabilityFlags = $this->extractStabilityFlags($links, $stabilityFlags, $realPackage->getMinimumStability()); $references = $this->extractReferences($links, $references); if (isset($links[$config['name']])) { throw new \RuntimeException(sprintf('Root package \'%s\' cannot require itself in its composer.json' . PHP_EOL . 'Did you accidentally name your root package after an external package?', $config['name'])); } } } if ($this->io) { foreach (array_keys(BasePackage::$supportedLinkTypes) as $linkType) { if (isset($config[$linkType])) { foreach ($config[$linkType] as $linkName => $constraint) { if ($err = ValidatingArrayLoader::hasPackageNamingError($linkName, true)) { $this->io->writeError('<warning>Deprecation warning: '.$linkType.'.'.$err.' Make sure you fix this as Composer 2.0 will error.</warning>'); } } } } } $realPackage->setAliases($aliases); $realPackage->setStabilityFlags($stabilityFlags); $realPackage->setReferences($references); if (isset($config['prefer-stable'])) { $realPackage->setPreferStable((bool) $config['prefer-stable']); } if (isset($config['config'])) { $realPackage->setConfig($config['config']); } $repos = RepositoryFactory::defaultRepos(null, $this->config, $this->manager); foreach ($repos as $repo) { $this->manager->addRepository($repo); } $realPackage->setRepositories($this->config->getRepositories()); return $package; } private function extractAliases(array $requires, array $aliases) { foreach ($requires as $reqName => $reqVersion) { if (preg_match('{^([^,\s#]+)(?:#[^ ]+)? +as +([^,\s]+)$}', $reqVersion, $match)) { $aliases[] = array( 'package' => strtolower($reqName), 'version' => $this->versionParser->normalize($match[1], $reqVersion), 'alias' => $match[2], 'alias_normalized' => $this->versionParser->normalize($match[2], $reqVersion), ); } } return $aliases; } private function extractStabilityFlags(array $requires, array $stabilityFlags, $minimumStability) { $stabilities = BasePackage::$stabilities; $minimumStability = $stabilities[$minimumStability]; foreach ($requires as $reqName => $reqVersion) { $constraints = array(); // extract all sub-constraints in case it is an OR/AND multi-constraint $orSplit = preg_split('{\s*\|\|?\s*}', trim($reqVersion)); foreach ($orSplit as $orConstraint) { $andSplit = preg_split('{(?<!^|as|[=>< ,]) *(?<!-)[, ](?!-) *(?!,|as|$)}', $orConstraint); foreach ($andSplit as $andConstraint) { $constraints[] = $andConstraint; } } // parse explicit stability flags to the most unstable $match = false; foreach ($constraints as $constraint) { if (preg_match('{^[^@]*?@('.implode('|', array_keys($stabilities)).')$}i', $constraint, $match)) { $name = strtolower($reqName); $stability = $stabilities[VersionParser::normalizeStability($match[1])]; if (isset($stabilityFlags[$name]) && $stabilityFlags[$name] > $stability) { continue; } $stabilityFlags[$name] = $stability; $match = true; } } if ($match) { continue; } foreach ($constraints as $constraint) { // infer flags for requirements that have an explicit -dev or -beta version specified but only // for those that are more unstable than the minimumStability or existing flags $reqVersion = preg_replace('{^([^,\s@]+) as .+$}', '$1', $constraint); if (preg_match('{^[^,\s@]+$}', $reqVersion) && 'stable' !== ($stabilityName = VersionParser::parseStability($reqVersion))) { $name = strtolower($reqName); $stability = $stabilities[$stabilityName]; if ((isset($stabilityFlags[$name]) && $stabilityFlags[$name] > $stability) || ($minimumStability > $stability)) { continue; } $stabilityFlags[$name] = $stability; } } } return $stabilityFlags; } private function extractReferences(array $requires, array $references) { foreach ($requires as $reqName => $reqVersion) { $reqVersion = preg_replace('{^([^,\s@]+) as .+$}', '$1', $reqVersion); if (preg_match('{^[^,\s@]+?#([a-f0-9]+)$}', $reqVersion, $match) && 'dev' === VersionParser::parseStability($reqVersion)) { $name = strtolower($reqName); $references[$name] = $match[1]; } } return $references; } } composer/src/Composer/Package/Loader/JsonLoader.php 0000644 00000002134 14736103146 0016270 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package\Loader; use Composer\Json\JsonFile; /** * @author Konstantin Kudryashiv <ever.zet@gmail.com> */ class JsonLoader { private $loader; public function __construct(LoaderInterface $loader) { $this->loader = $loader; } /** * @param string|JsonFile $json A filename, json string or JsonFile instance to load the package from * @return \Composer\Package\PackageInterface */ public function load($json) { if ($json instanceof JsonFile) { $config = $json->read(); } elseif (file_exists($json)) { $config = JsonFile::parseJson(file_get_contents($json), $json); } elseif (is_string($json)) { $config = JsonFile::parseJson($json); } return $this->loader->load($config); } } composer/src/Composer/Package/AliasPackage.php 0000644 00000022254 14736103146 0015334 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package; use Composer\Semver\Constraint\Constraint; use Composer\Package\Version\VersionParser; /** * @author Jordi Boggiano <j.boggiano@seld.be> */ class AliasPackage extends BasePackage implements CompletePackageInterface { protected $version; protected $prettyVersion; protected $dev; protected $rootPackageAlias = false; protected $stability; /** @var PackageInterface */ protected $aliasOf; /** @var Link[] */ protected $requires; /** @var Link[] */ protected $devRequires; /** @var Link[] */ protected $conflicts; /** @var Link[] */ protected $provides; /** @var Link[] */ protected $replaces; /** * All descendants' constructors should call this parent constructor * * @param PackageInterface $aliasOf The package this package is an alias of * @param string $version The version the alias must report * @param string $prettyVersion The alias's non-normalized version */ public function __construct(PackageInterface $aliasOf, $version, $prettyVersion) { parent::__construct($aliasOf->getName()); $this->version = $version; $this->prettyVersion = $prettyVersion; $this->aliasOf = $aliasOf; $this->stability = VersionParser::parseStability($version); $this->dev = $this->stability === 'dev'; foreach (array('requires', 'devRequires', 'conflicts', 'provides', 'replaces') as $type) { $links = $aliasOf->{'get' . ucfirst($type)}(); $this->$type = $this->replaceSelfVersionDependencies($links, $type); } } /** * @return PackageInterface */ public function getAliasOf() { return $this->aliasOf; } /** * {@inheritDoc} */ public function getVersion() { return $this->version; } /** * {@inheritDoc} */ public function getStability() { return $this->stability; } /** * {@inheritDoc} */ public function getPrettyVersion() { return $this->prettyVersion; } /** * {@inheritDoc} */ public function isDev() { return $this->dev; } /** * {@inheritDoc} */ public function getRequires() { return $this->requires; } /** * {@inheritDoc} */ public function getConflicts() { return $this->conflicts; } /** * {@inheritDoc} */ public function getProvides() { return $this->provides; } /** * {@inheritDoc} */ public function getReplaces() { return $this->replaces; } /** * {@inheritDoc} */ public function getDevRequires() { return $this->devRequires; } /** * Stores whether this is an alias created by an aliasing in the requirements of the root package or not * * Use by the policy for sorting manually aliased packages first, see #576 * * @param bool $value * * @return mixed */ public function setRootPackageAlias($value) { return $this->rootPackageAlias = $value; } /** * @see setRootPackageAlias * @return bool */ public function isRootPackageAlias() { return $this->rootPackageAlias; } /** * @param Link[] $links * @param string $linkType * * @return Link[] */ protected function replaceSelfVersionDependencies(array $links, $linkType) { if (in_array($linkType, array('conflicts', 'provides', 'replaces'), true)) { $newLinks = array(); foreach ($links as $link) { // link is self.version, but must be replacing also the replaced version if ('self.version' === $link->getPrettyConstraint()) { $newLinks[] = new Link($link->getSource(), $link->getTarget(), new Constraint('=', $this->version), $linkType, $this->prettyVersion); } } $links = array_merge($links, $newLinks); } else { foreach ($links as $index => $link) { if ('self.version' === $link->getPrettyConstraint()) { $links[$index] = new Link($link->getSource(), $link->getTarget(), new Constraint('=', $this->version), $linkType, $this->prettyVersion); } } } return $links; } /*************************************** * Wrappers around the aliased package * ***************************************/ public function getType() { return $this->aliasOf->getType(); } public function getTargetDir() { return $this->aliasOf->getTargetDir(); } public function getExtra() { return $this->aliasOf->getExtra(); } public function setInstallationSource($type) { $this->aliasOf->setInstallationSource($type); } public function getInstallationSource() { return $this->aliasOf->getInstallationSource(); } public function getSourceType() { return $this->aliasOf->getSourceType(); } public function getSourceUrl() { return $this->aliasOf->getSourceUrl(); } public function getSourceUrls() { return $this->aliasOf->getSourceUrls(); } public function getSourceReference() { return $this->aliasOf->getSourceReference(); } public function setSourceReference($reference) { return $this->aliasOf->setSourceReference($reference); } public function setSourceMirrors($mirrors) { return $this->aliasOf->setSourceMirrors($mirrors); } public function getSourceMirrors() { return $this->aliasOf->getSourceMirrors(); } public function getDistType() { return $this->aliasOf->getDistType(); } public function getDistUrl() { return $this->aliasOf->getDistUrl(); } public function getDistUrls() { return $this->aliasOf->getDistUrls(); } public function getDistReference() { return $this->aliasOf->getDistReference(); } public function setDistReference($reference) { return $this->aliasOf->setDistReference($reference); } public function getDistSha1Checksum() { return $this->aliasOf->getDistSha1Checksum(); } public function setTransportOptions(array $options) { return $this->aliasOf->setTransportOptions($options); } public function getTransportOptions() { return $this->aliasOf->getTransportOptions(); } public function setDistMirrors($mirrors) { return $this->aliasOf->setDistMirrors($mirrors); } public function getDistMirrors() { return $this->aliasOf->getDistMirrors(); } public function getScripts() { return $this->aliasOf->getScripts(); } public function getLicense() { return $this->aliasOf->getLicense(); } public function getAutoload() { return $this->aliasOf->getAutoload(); } public function getDevAutoload() { return $this->aliasOf->getDevAutoload(); } public function getIncludePaths() { return $this->aliasOf->getIncludePaths(); } public function getRepositories() { return $this->aliasOf->getRepositories(); } public function getReleaseDate() { return $this->aliasOf->getReleaseDate(); } public function getBinaries() { return $this->aliasOf->getBinaries(); } public function getKeywords() { return $this->aliasOf->getKeywords(); } public function getDescription() { return $this->aliasOf->getDescription(); } public function getHomepage() { return $this->aliasOf->getHomepage(); } public function getSuggests() { return $this->aliasOf->getSuggests(); } public function getAuthors() { return $this->aliasOf->getAuthors(); } public function getSupport() { return $this->aliasOf->getSupport(); } public function getFunding() { return $this->aliasOf->getFunding(); } public function getNotificationUrl() { return $this->aliasOf->getNotificationUrl(); } public function getArchiveExcludes() { return $this->aliasOf->getArchiveExcludes(); } public function isAbandoned() { return $this->aliasOf->isAbandoned(); } public function getReplacementPackage() { return $this->aliasOf->getReplacementPackage(); } public function __toString() { return parent::__toString().' (alias of '.$this->aliasOf->getVersion().')'; } public function setDistUrl($url) { return $this->aliasOf->setDistUrl($url); } public function setDistType($type) { return $this->aliasOf->setDistType($type); } } composer/src/Composer/Package/Dumper/ArrayDumper.php 0000644 00000011163 14736103146 0016513 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package\Dumper; use Composer\Package\BasePackage; use Composer\Package\PackageInterface; use Composer\Package\CompletePackageInterface; use Composer\Package\RootPackageInterface; /** * @author Konstantin Kudryashiv <ever.zet@gmail.com> * @author Jordi Boggiano <j.boggiano@seld.be> */ class ArrayDumper { public function dump(PackageInterface $package) { $keys = array( 'binaries' => 'bin', 'type', 'extra', 'installationSource' => 'installation-source', 'autoload', 'devAutoload' => 'autoload-dev', 'notificationUrl' => 'notification-url', 'includePaths' => 'include-path', ); $data = array(); $data['name'] = $package->getPrettyName(); $data['version'] = $package->getPrettyVersion(); $data['version_normalized'] = $package->getVersion(); if ($package->getTargetDir()) { $data['target-dir'] = $package->getTargetDir(); } if ($package->getSourceType()) { $data['source']['type'] = $package->getSourceType(); $data['source']['url'] = $package->getSourceUrl(); if (null !== ($value = $package->getSourceReference())) { $data['source']['reference'] = $value; } if ($mirrors = $package->getSourceMirrors()) { $data['source']['mirrors'] = $mirrors; } } if ($package->getDistType()) { $data['dist']['type'] = $package->getDistType(); $data['dist']['url'] = $package->getDistUrl(); if (null !== ($value = $package->getDistReference())) { $data['dist']['reference'] = $value; } if (null !== ($value = $package->getDistSha1Checksum())) { $data['dist']['shasum'] = $value; } if ($mirrors = $package->getDistMirrors()) { $data['dist']['mirrors'] = $mirrors; } } if ($package->getArchiveExcludes()) { $data['archive']['exclude'] = $package->getArchiveExcludes(); } foreach (BasePackage::$supportedLinkTypes as $type => $opts) { if ($links = $package->{'get'.ucfirst($opts['method'])}()) { foreach ($links as $link) { $data[$type][$link->getTarget()] = $link->getPrettyConstraint(); } ksort($data[$type]); } } if ($packages = $package->getSuggests()) { ksort($packages); $data['suggest'] = $packages; } if ($package->getReleaseDate()) { $data['time'] = $package->getReleaseDate()->format(DATE_RFC3339); } $data = $this->dumpValues($package, $keys, $data); if ($package instanceof CompletePackageInterface) { $keys = array( 'scripts', 'license', 'authors', 'description', 'homepage', 'keywords', 'repositories', 'support', 'funding', ); $data = $this->dumpValues($package, $keys, $data); if (isset($data['keywords']) && is_array($data['keywords'])) { sort($data['keywords']); } if ($package->isAbandoned()) { $data['abandoned'] = $package->getReplacementPackage() ?: true; } } if ($package instanceof RootPackageInterface) { $minimumStability = $package->getMinimumStability(); if ($minimumStability) { $data['minimum-stability'] = $minimumStability; } } if (count($package->getTransportOptions()) > 0) { $data['transport-options'] = $package->getTransportOptions(); } return $data; } private function dumpValues(PackageInterface $package, array $keys, array $data) { foreach ($keys as $method => $key) { if (is_numeric($method)) { $method = $key; } $getter = 'get'.ucfirst($method); $value = $package->$getter(); if (null !== $value && !(is_array($value) && 0 === count($value))) { $data[$key] = $value; } } return $data; } } composer/src/Composer/Package/Locker.php 0000644 00000034731 14736103146 0014251 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package; use Composer\Json\JsonFile; use Composer\Installer\InstallationManager; use Composer\Repository\RepositoryManager; use Composer\Util\ProcessExecutor; use Composer\Repository\ArrayRepository; use Composer\Package\Dumper\ArrayDumper; use Composer\Package\Loader\ArrayLoader; use Composer\Plugin\PluginInterface; use Composer\Util\Git as GitUtil; use Composer\IO\IOInterface; use Seld\JsonLint\ParsingException; /** * Reads/writes project lockfile (composer.lock). * * @author Konstantin Kudryashiv <ever.zet@gmail.com> * @author Jordi Boggiano <j.boggiano@seld.be> */ class Locker { private $lockFile; private $repositoryManager; private $installationManager; private $hash; private $contentHash; private $loader; private $dumper; private $process; private $lockDataCache; /** * Initializes packages locker. * * @param IOInterface $io * @param JsonFile $lockFile lockfile loader * @param RepositoryManager $repositoryManager repository manager instance * @param InstallationManager $installationManager installation manager instance * @param string $composerFileContents The contents of the composer file */ public function __construct(IOInterface $io, JsonFile $lockFile, RepositoryManager $repositoryManager, InstallationManager $installationManager, $composerFileContents) { $this->lockFile = $lockFile; $this->repositoryManager = $repositoryManager; $this->installationManager = $installationManager; $this->hash = md5($composerFileContents); $this->contentHash = self::getContentHash($composerFileContents); $this->loader = new ArrayLoader(null, true); $this->dumper = new ArrayDumper(); $this->process = new ProcessExecutor($io); } /** * Returns the md5 hash of the sorted content of the composer file. * * @param string $composerFileContents The contents of the composer file. * * @return string */ public static function getContentHash($composerFileContents) { $content = json_decode($composerFileContents, true); $relevantKeys = array( 'name', 'version', 'require', 'require-dev', 'conflict', 'replace', 'provide', 'minimum-stability', 'prefer-stable', 'repositories', 'extra', ); $relevantContent = array(); foreach (array_intersect($relevantKeys, array_keys($content)) as $key) { $relevantContent[$key] = $content[$key]; } if (isset($content['config']['platform'])) { $relevantContent['config']['platform'] = $content['config']['platform']; } ksort($relevantContent); return md5(json_encode($relevantContent)); } /** * Checks whether locker has been locked (lockfile found). * * @return bool */ public function isLocked() { if (!$this->lockFile->exists()) { return false; } $data = $this->getLockData(); return isset($data['packages']); } /** * Checks whether the lock file is still up to date with the current hash * * @return bool */ public function isFresh() { $lock = $this->lockFile->read(); if (!empty($lock['content-hash'])) { // There is a content hash key, use that instead of the file hash return $this->contentHash === $lock['content-hash']; } // BC support for old lock files without content-hash if (!empty($lock['hash'])) { return $this->hash === $lock['hash']; } // should not be reached unless the lock file is corrupted, so assume it's out of date return false; } /** * Searches and returns an array of locked packages, retrieved from registered repositories. * * @param bool $withDevReqs true to retrieve the locked dev packages * @throws \RuntimeException * @return \Composer\Repository\RepositoryInterface */ public function getLockedRepository($withDevReqs = false) { $lockData = $this->getLockData(); $packages = new ArrayRepository(); $lockedPackages = $lockData['packages']; if ($withDevReqs) { if (isset($lockData['packages-dev'])) { $lockedPackages = array_merge($lockedPackages, $lockData['packages-dev']); } else { throw new \RuntimeException('The lock file does not contain require-dev information, run install with the --no-dev option or run update to install those packages.'); } } if (empty($lockedPackages)) { return $packages; } if (isset($lockedPackages[0]['name'])) { foreach ($lockedPackages as $info) { $packages->addPackage($this->loader->load($info)); } return $packages; } throw new \RuntimeException('Your composer.lock was created before 2012-09-15, and is not supported anymore. Run "composer update" to generate a new one.'); } /** * Returns the platform requirements stored in the lock file * * @param bool $withDevReqs if true, the platform requirements from the require-dev block are also returned * @return \Composer\Package\Link[] */ public function getPlatformRequirements($withDevReqs = false) { $lockData = $this->getLockData(); $requirements = array(); if (!empty($lockData['platform'])) { $requirements = $this->loader->parseLinks( '__ROOT__', '1.0.0', 'requires', isset($lockData['platform']) ? $lockData['platform'] : array() ); } if ($withDevReqs && !empty($lockData['platform-dev'])) { $devRequirements = $this->loader->parseLinks( '__ROOT__', '1.0.0', 'requires', isset($lockData['platform-dev']) ? $lockData['platform-dev'] : array() ); $requirements = array_merge($requirements, $devRequirements); } return $requirements; } public function getMinimumStability() { $lockData = $this->getLockData(); return isset($lockData['minimum-stability']) ? $lockData['minimum-stability'] : 'stable'; } public function getStabilityFlags() { $lockData = $this->getLockData(); return isset($lockData['stability-flags']) ? $lockData['stability-flags'] : array(); } public function getPreferStable() { $lockData = $this->getLockData(); // return null if not set to allow caller logic to choose the // right behavior since old lock files have no prefer-stable return isset($lockData['prefer-stable']) ? $lockData['prefer-stable'] : null; } public function getPreferLowest() { $lockData = $this->getLockData(); // return null if not set to allow caller logic to choose the // right behavior since old lock files have no prefer-lowest return isset($lockData['prefer-lowest']) ? $lockData['prefer-lowest'] : null; } public function getPlatformOverrides() { $lockData = $this->getLockData(); return isset($lockData['platform-overrides']) ? $lockData['platform-overrides'] : array(); } public function getAliases() { $lockData = $this->getLockData(); return isset($lockData['aliases']) ? $lockData['aliases'] : array(); } public function getLockData() { if (null !== $this->lockDataCache) { return $this->lockDataCache; } if (!$this->lockFile->exists()) { throw new \LogicException('No lockfile found. Unable to read locked packages'); } return $this->lockDataCache = $this->lockFile->read(); } /** * Locks provided data into lockfile. * * @param array $packages array of packages * @param mixed $devPackages array of dev packages or null if installed without --dev * @param array $platformReqs array of package name => constraint for required platform packages * @param mixed $platformDevReqs array of package name => constraint for dev-required platform packages * @param array $aliases array of aliases * @param string $minimumStability * @param array $stabilityFlags * @param bool $preferStable * @param bool $preferLowest * @param array $platformOverrides * * @return bool */ public function setLockData(array $packages, $devPackages, array $platformReqs, $platformDevReqs, array $aliases, $minimumStability, array $stabilityFlags, $preferStable, $preferLowest, array $platformOverrides) { $lock = array( '_readme' => array('This file locks the dependencies of your project to a known state', 'Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies', 'This file is @gener'.'ated automatically', ), 'content-hash' => $this->contentHash, 'packages' => null, 'packages-dev' => null, 'aliases' => array(), 'minimum-stability' => $minimumStability, 'stability-flags' => $stabilityFlags, 'prefer-stable' => $preferStable, 'prefer-lowest' => $preferLowest, ); foreach ($aliases as $package => $versions) { foreach ($versions as $version => $alias) { $lock['aliases'][] = array( 'alias' => $alias['alias'], 'alias_normalized' => $alias['alias_normalized'], 'version' => $version, 'package' => $package, ); } } $lock['packages'] = $this->lockPackages($packages); if (null !== $devPackages) { $lock['packages-dev'] = $this->lockPackages($devPackages); } $lock['platform'] = $platformReqs; $lock['platform-dev'] = $platformDevReqs; if ($platformOverrides) { $lock['platform-overrides'] = $platformOverrides; } $lock['plugin-api-version'] = PluginInterface::PLUGIN_API_VERSION; if (empty($lock['packages']) && empty($lock['packages-dev']) && empty($lock['platform']) && empty($lock['platform-dev'])) { if ($this->lockFile->exists()) { unlink($this->lockFile->getPath()); } return false; } try { $isLocked = $this->isLocked(); } catch (ParsingException $e) { $isLocked = false; } if (!$isLocked || $lock !== $this->getLockData()) { $this->lockFile->write($lock); $this->lockDataCache = null; return true; } return false; } private function lockPackages(array $packages) { $locked = array(); foreach ($packages as $package) { if ($package instanceof AliasPackage) { continue; } $name = $package->getPrettyName(); $version = $package->getPrettyVersion(); if (!$name || !$version) { throw new \LogicException(sprintf( 'Package "%s" has no version or name and can not be locked', $package )); } $spec = $this->dumper->dump($package); unset($spec['version_normalized']); // always move time to the end of the package definition $time = isset($spec['time']) ? $spec['time'] : null; unset($spec['time']); if ($package->isDev() && $package->getInstallationSource() === 'source') { // use the exact commit time of the current reference if it's a dev package $time = $this->getPackageTime($package) ?: $time; } if (null !== $time) { $spec['time'] = $time; } unset($spec['installation-source']); $locked[] = $spec; } usort($locked, function ($a, $b) { $comparison = strcmp($a['name'], $b['name']); if (0 !== $comparison) { return $comparison; } // If it is the same package, compare the versions to make the order deterministic return strcmp($a['version'], $b['version']); }); return $locked; } /** * Returns the packages's datetime for its source reference. * * @param PackageInterface $package The package to scan. * @return string|null The formatted datetime or null if none was found. */ private function getPackageTime(PackageInterface $package) { if (!function_exists('proc_open')) { return null; } $path = realpath($this->installationManager->getInstallPath($package)); $sourceType = $package->getSourceType(); $datetime = null; if ($path && in_array($sourceType, array('git', 'hg'))) { $sourceRef = $package->getSourceReference() ?: $package->getDistReference(); switch ($sourceType) { case 'git': GitUtil::cleanEnv(); if (0 === $this->process->execute('git log -n1 --pretty=%ct '.ProcessExecutor::escape($sourceRef), $output, $path) && preg_match('{^\s*\d+\s*$}', $output)) { $datetime = new \DateTime('@'.trim($output), new \DateTimeZone('UTC')); } break; case 'hg': if (0 === $this->process->execute('hg log --template "{date|hgdate}" -r '.ProcessExecutor::escape($sourceRef), $output, $path) && preg_match('{^\s*(\d+)\s*}', $output, $match)) { $datetime = new \DateTime('@'.$match[1], new \DateTimeZone('UTC')); } break; } } return $datetime ? $datetime->format(DATE_RFC3339) : null; } } composer/src/Composer/Package/Archiver/HgExcludeFilter.php 0000644 00000005362 14736103146 0017611 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package\Archiver; use Symfony\Component\Finder; /** * An exclude filter that processes hgignore files * * @author Nils Adermann <naderman@naderman.de> */ class HgExcludeFilter extends BaseExcludeFilter { const HG_IGNORE_REGEX = 1; const HG_IGNORE_GLOB = 2; /** * Either HG_IGNORE_REGEX or HG_IGNORE_GLOB * @var int */ protected $patternMode; /** * Parses .hgignore file if it exist * * @param string $sourcePath */ public function __construct($sourcePath) { parent::__construct($sourcePath); $this->patternMode = self::HG_IGNORE_REGEX; if (file_exists($sourcePath.'/.hgignore')) { $this->excludePatterns = $this->parseLines( file($sourcePath.'/.hgignore'), array($this, 'parseHgIgnoreLine') ); } } /** * Callback line parser which process hgignore lines * * @param string $line A line from .hgignore * * @return array|null An exclude pattern for filter() */ public function parseHgIgnoreLine($line) { if (preg_match('#^syntax\s*:\s*(glob|regexp)$#', $line, $matches)) { if ($matches[1] === 'glob') { $this->patternMode = self::HG_IGNORE_GLOB; } else { $this->patternMode = self::HG_IGNORE_REGEX; } return null; } if ($this->patternMode == self::HG_IGNORE_GLOB) { return $this->patternFromGlob($line); } return $this->patternFromRegex($line); } /** * Generates an exclude pattern for filter() from a hg glob expression * * @param string $line A line from .hgignore in glob mode * * @return array An exclude pattern for filter() */ protected function patternFromGlob($line) { $pattern = '#'.substr(Finder\Glob::toRegex($line), 2, -1).'#'; $pattern = str_replace('[^/]*', '.*', $pattern); return array($pattern, false, true); } /** * Generates an exclude pattern for filter() from a hg regexp expression * * @param string $line A line from .hgignore in regexp mode * * @return array An exclude pattern for filter() */ public function patternFromRegex($line) { // WTF need to escape the delimiter safely $pattern = '#'.preg_replace('/((?:\\\\\\\\)*)(\\\\?)#/', '\1\2\2\\#', $line).'#'; return array($pattern, false, true); } } composer/src/Composer/Package/Archiver/BaseExcludeFilter.php 0000644 00000007627 14736103146 0020133 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package\Archiver; use Symfony\Component\Finder; /** * @author Nils Adermann <naderman@naderman.de> */ abstract class BaseExcludeFilter { /** * @var string */ protected $sourcePath; /** * @var array */ protected $excludePatterns; /** * @param string $sourcePath Directory containing sources to be filtered */ public function __construct($sourcePath) { $this->sourcePath = $sourcePath; $this->excludePatterns = array(); } /** * Checks the given path against all exclude patterns in this filter * * Negated patterns overwrite exclude decisions of previous filters. * * @param string $relativePath The file's path relative to the sourcePath * @param bool $exclude Whether a previous filter wants to exclude this file * * @return bool Whether the file should be excluded */ public function filter($relativePath, $exclude) { foreach ($this->excludePatterns as $patternData) { list($pattern, $negate, $stripLeadingSlash) = $patternData; if ($stripLeadingSlash) { $path = substr($relativePath, 1); } else { $path = $relativePath; } if (preg_match($pattern, $path)) { $exclude = !$negate; } } return $exclude; } /** * Processes a file containing exclude rules of different formats per line * * @param array $lines A set of lines to be parsed * @param callable $lineParser The parser to be used on each line * * @return array Exclude patterns to be used in filter() */ protected function parseLines(array $lines, $lineParser) { return array_filter( array_map( function ($line) use ($lineParser) { $line = trim($line); if (!$line || 0 === strpos($line, '#')) { return null; } return call_user_func($lineParser, $line); }, $lines ), function ($pattern) { return $pattern !== null; } ); } /** * Generates a set of exclude patterns for filter() from gitignore rules * * @param array $rules A list of exclude rules in gitignore syntax * * @return array Exclude patterns */ protected function generatePatterns($rules) { $patterns = array(); foreach ($rules as $rule) { $patterns[] = $this->generatePattern($rule); } return $patterns; } /** * Generates an exclude pattern for filter() from a gitignore rule * * @param string $rule An exclude rule in gitignore syntax * * @return array An exclude pattern */ protected function generatePattern($rule) { $negate = false; $pattern = '{'; if (strlen($rule) && $rule[0] === '!') { $negate = true; $rule = substr($rule, 1); } if (strlen($rule) && $rule[0] === '/') { $pattern .= '^/'; $rule = substr($rule, 1); } elseif (strlen($rule) - 1 === strpos($rule, '/')) { $pattern .= '/'; $rule = substr($rule, 0, -1); } elseif (false === strpos($rule, '/')) { $pattern .= '/'; } // remove delimiters as well as caret (^) and dollar sign ($) from the regex $pattern .= substr(Finder\Glob::toRegex($rule), 2, -2) . '(?=$|/)'; return array($pattern . '}', $negate, false); } } composer/src/Composer/Package/Archiver/PharArchiver.php 0000644 00000005506 14736103146 0017151 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package\Archiver; /** * @author Till Klampaeckel <till@php.net> * @author Nils Adermann <naderman@naderman.de> * @author Matthieu Moquet <matthieu@moquet.net> */ class PharArchiver implements ArchiverInterface { protected static $formats = array( 'zip' => \Phar::ZIP, 'tar' => \Phar::TAR, 'tar.gz' => \Phar::TAR, 'tar.bz2' => \Phar::TAR, ); protected static $compressFormats = array( 'tar.gz' => \Phar::GZ, 'tar.bz2' => \Phar::BZ2, ); /** * {@inheritdoc} */ public function archive($sources, $target, $format, array $excludes = array(), $ignoreFilters = false) { $sources = realpath($sources); // Phar would otherwise load the file which we don't want if (file_exists($target)) { unlink($target); } try { $filename = substr($target, 0, strrpos($target, $format) - 1); // Check if compress format if (isset(static::$compressFormats[$format])) { // Current compress format supported base on tar $target = $filename . '.tar'; } $phar = new \PharData($target, null, null, static::$formats[$format]); $files = new ArchivableFilesFinder($sources, $excludes, $ignoreFilters); $filesOnly = new ArchivableFilesFilter($files); $phar->buildFromIterator($filesOnly, $sources); $filesOnly->addEmptyDir($phar, $sources); if (isset(static::$compressFormats[$format])) { // Check can be compressed? if (!$phar->canCompress(static::$compressFormats[$format])) { throw new \RuntimeException(sprintf('Can not compress to %s format', $format)); } // Delete old tar unlink($target); // Compress the new tar $phar->compress(static::$compressFormats[$format]); // Make the correct filename $target = $filename . '.' . $format; } return $target; } catch (\UnexpectedValueException $e) { $message = sprintf( "Could not create archive '%s' from '%s': %s", $target, $sources, $e->getMessage() ); throw new \RuntimeException($message, $e->getCode(), $e); } } /** * {@inheritdoc} */ public function supports($format, $sourceType) { return isset(static::$formats[$format]); } } composer/src/Composer/Package/Archiver/GitExcludeFilter.php 0000644 00000004071 14736103146 0017772 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package\Archiver; /** * An exclude filter that processes gitignore and gitattributes * * It respects export-ignore git attributes * * @author Nils Adermann <naderman@naderman.de> */ class GitExcludeFilter extends BaseExcludeFilter { /** * Parses .gitignore and .gitattributes files if they exist * * @param string $sourcePath */ public function __construct($sourcePath) { parent::__construct($sourcePath); if (file_exists($sourcePath.'/.gitignore')) { $this->excludePatterns = $this->parseLines( file($sourcePath.'/.gitignore'), array($this, 'parseGitIgnoreLine') ); } if (file_exists($sourcePath.'/.gitattributes')) { $this->excludePatterns = array_merge( $this->excludePatterns, $this->parseLines( file($sourcePath.'/.gitattributes'), array($this, 'parseGitAttributesLine') ) ); } } /** * Callback line parser which process gitignore lines * * @param string $line A line from .gitignore * * @return array An exclude pattern for filter() */ public function parseGitIgnoreLine($line) { return $this->generatePattern($line); } /** * Callback parser which finds export-ignore rules in git attribute lines * * @param string $line A line from .gitattributes * * @return array|null An exclude pattern for filter() */ public function parseGitAttributesLine($line) { $parts = preg_split('#\s+#', $line); if (count($parts) == 2 && $parts[1] === 'export-ignore') { return $this->generatePattern($parts[0]); } return null; } } composer/src/Composer/Package/Archiver/ZipArchiver.php 0000644 00000004705 14736103146 0017021 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package\Archiver; use ZipArchive; use Composer\Util\Filesystem; /** * @author Jan Prieser <jan@prieser.net> */ class ZipArchiver implements ArchiverInterface { protected static $formats = array( 'zip' => 1, ); /** * {@inheritdoc} */ public function archive($sources, $target, $format, array $excludes = array(), $ignoreFilters = false) { $fs = new Filesystem(); $sources = $fs->normalizePath($sources); $zip = new ZipArchive(); $res = $zip->open($target, ZipArchive::CREATE); if ($res === true) { $files = new ArchivableFilesFinder($sources, $excludes, $ignoreFilters); foreach ($files as $file) { /** @var \SplFileInfo $file */ $filepath = strtr($file->getPath()."/".$file->getFilename(), '\\', '/'); $localname = str_replace($sources.'/', '', $filepath); if ($file->isDir()) { $zip->addEmptyDir($localname); } else { $zip->addFile($filepath, $localname); } /** * ZipArchive::setExternalAttributesName is available from >= PHP 5.6 */ if (PHP_VERSION_ID >= 50600) { $perms = fileperms($filepath); /** * Ensure to preserve the permission umasks for the filepath in the archive. */ $zip->setExternalAttributesName($localname, ZipArchive::OPSYS_UNIX, $perms << 16); } } if ($zip->close()) { return $target; } } $message = sprintf( "Could not create archive '%s' from '%s': %s", $target, $sources, $zip->getStatusString() ); throw new \RuntimeException($message); } /** * {@inheritdoc} */ public function supports($format, $sourceType) { return isset(static::$formats[$format]) && $this->compressionAvailable(); } private function compressionAvailable() { return class_exists('ZipArchive'); } } composer/src/Composer/Package/Archiver/ArchiverInterface.php 0000644 00000002367 14736103146 0020161 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package\Archiver; /** * @author Till Klampaeckel <till@php.net> * @author Matthieu Moquet <matthieu@moquet.net> * @author Nils Adermann <naderman@naderman.de> */ interface ArchiverInterface { /** * Create an archive from the sources. * * @param string $sources The sources directory * @param string $target The target file * @param string $format The format used for archive * @param array $excludes A list of patterns for files to exclude * * @return string The path to the written archive file */ public function archive($sources, $target, $format, array $excludes = array(), $ignoreFilters = false); /** * Format supported by the archiver. * * @param string $format The archive format * @param string $sourceType The source type (git, svn, hg, etc.) * * @return bool true if the format is supported by the archiver */ public function supports($format, $sourceType); } composer/src/Composer/Package/Archiver/ArchivableFilesFinder.php 0000644 00000005513 14736103146 0020744 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package\Archiver; use Composer\Util\Filesystem; use FilesystemIterator; use Symfony\Component\Finder\Finder; use Symfony\Component\Finder\SplFileInfo; /** * A Symfony Finder wrapper which locates files that should go into archives * * Handles .gitignore, .gitattributes and .hgignore files as well as composer's * own exclude rules from composer.json * * @author Nils Adermann <naderman@naderman.de> */ class ArchivableFilesFinder extends \FilterIterator { /** * @var Finder */ protected $finder; /** * Initializes the internal Symfony Finder with appropriate filters * * @param string $sources Path to source files to be archived * @param array $excludes Composer's own exclude rules from composer.json * @param bool $ignoreFilters Ignore filters when looking for files */ public function __construct($sources, array $excludes, $ignoreFilters = false) { $fs = new Filesystem(); $sources = $fs->normalizePath($sources); if ($ignoreFilters) { $filters = array(); } else { $filters = array( new HgExcludeFilter($sources), new GitExcludeFilter($sources), new ComposerExcludeFilter($sources, $excludes), ); } $this->finder = new Finder(); $filter = function (\SplFileInfo $file) use ($sources, $filters, $fs) { if ($file->isLink() && strpos($file->getLinkTarget(), $sources) !== 0) { return false; } $relativePath = preg_replace( '#^'.preg_quote($sources, '#').'#', '', $fs->normalizePath($file->getRealPath()) ); $exclude = false; foreach ($filters as $filter) { $exclude = $filter->filter($relativePath, $exclude); } return !$exclude; }; if (method_exists($filter, 'bindTo')) { $filter = $filter->bindTo(null); } $this->finder ->in($sources) ->filter($filter) ->ignoreVCS(true) ->ignoreDotFiles(false); parent::__construct($this->finder->getIterator()); } public function accept() { /** @var SplFileInfo $current */ $current = $this->getInnerIterator()->current(); if (!$current->isDir()) { return true; } $iterator = new FilesystemIterator($current, FilesystemIterator::SKIP_DOTS); return !$iterator->valid(); } } composer/src/Composer/Package/Archiver/ArchiveManager.php 0000644 00000014074 14736103146 0017447 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package\Archiver; use Composer\Downloader\DownloadManager; use Composer\Package\PackageInterface; use Composer\Package\RootPackageInterface; use Composer\Util\Filesystem; use Composer\Json\JsonFile; /** * @author Matthieu Moquet <matthieu@moquet.net> * @author Till Klampaeckel <till@php.net> */ class ArchiveManager { protected $downloadManager; protected $archivers = array(); /** * @var bool */ protected $overwriteFiles = true; /** * @param DownloadManager $downloadManager A manager used to download package sources */ public function __construct(DownloadManager $downloadManager) { $this->downloadManager = $downloadManager; } /** * @param ArchiverInterface $archiver */ public function addArchiver(ArchiverInterface $archiver) { $this->archivers[] = $archiver; } /** * Set whether existing archives should be overwritten * * @param bool $overwriteFiles New setting * * @return $this */ public function setOverwriteFiles($overwriteFiles) { $this->overwriteFiles = $overwriteFiles; return $this; } /** * Generate a distinct filename for a particular version of a package. * * @param PackageInterface $package The package to get a name for * * @return string A filename without an extension */ public function getPackageFilename(PackageInterface $package) { $nameParts = array(preg_replace('#[^a-z0-9-_]#i', '-', $package->getName())); if (preg_match('{^[a-f0-9]{40}$}', $package->getDistReference())) { array_push($nameParts, $package->getDistReference(), $package->getDistType()); } else { array_push($nameParts, $package->getPrettyVersion(), $package->getDistReference()); } if ($package->getSourceReference()) { $nameParts[] = substr(sha1($package->getSourceReference()), 0, 6); } $name = implode('-', array_filter($nameParts, function ($p) { return !empty($p); })); return str_replace('/', '-', $name); } /** * Create an archive of the specified package. * * @param PackageInterface $package The package to archive * @param string $format The format of the archive (zip, tar, ...) * @param string $targetDir The directory where to build the archive * @param string|null $fileName The relative file name to use for the archive, or null to generate * the package name. Note that the format will be appended to this name * @param bool $ignoreFilters Ignore filters when looking for files in the package * @throws \InvalidArgumentException * @throws \RuntimeException * @return string The path of the created archive */ public function archive(PackageInterface $package, $format, $targetDir, $fileName = null, $ignoreFilters = false) { if (empty($format)) { throw new \InvalidArgumentException('Format must be specified'); } // Search for the most appropriate archiver $usableArchiver = null; foreach ($this->archivers as $archiver) { if ($archiver->supports($format, $package->getSourceType())) { $usableArchiver = $archiver; break; } } // Checks the format/source type are supported before downloading the package if (null === $usableArchiver) { throw new \RuntimeException(sprintf('No archiver found to support %s format', $format)); } $filesystem = new Filesystem(); if (null === $fileName) { $packageName = $this->getPackageFilename($package); } else { $packageName = $fileName; } // Archive filename $filesystem->ensureDirectoryExists($targetDir); $target = realpath($targetDir).'/'.$packageName.'.'.$format; $filesystem->ensureDirectoryExists(dirname($target)); if (!$this->overwriteFiles && file_exists($target)) { return $target; } if ($package instanceof RootPackageInterface) { $sourcePath = realpath('.'); } else { // Directory used to download the sources $sourcePath = sys_get_temp_dir().'/composer_archive'.uniqid(); $filesystem->ensureDirectoryExists($sourcePath); try { // Download sources $this->downloadManager->download($package, $sourcePath); } catch (\Exception $e) { $filesystem->removeDirectory($sourcePath); throw $e; } // Check exclude from downloaded composer.json if (file_exists($composerJsonPath = $sourcePath.'/composer.json')) { $jsonFile = new JsonFile($composerJsonPath); $jsonData = $jsonFile->read(); if (!empty($jsonData['archive']['exclude'])) { $package->setArchiveExcludes($jsonData['archive']['exclude']); } } } // Create the archive $tempTarget = sys_get_temp_dir().'/composer_archive'.uniqid().'.'.$format; $filesystem->ensureDirectoryExists(dirname($tempTarget)); $archivePath = $usableArchiver->archive($sourcePath, $tempTarget, $format, $package->getArchiveExcludes(), $ignoreFilters); $filesystem->rename($archivePath, $target); // cleanup temporary download if (!$package instanceof RootPackageInterface) { $filesystem->removeDirectory($sourcePath); } $filesystem->remove($tempTarget); return $target; } } composer/src/Composer/Package/Archiver/ComposerExcludeFilter.php 0000644 00000001532 14736103146 0021035 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package\Archiver; /** * An exclude filter which processes composer's own exclude rules * * @author Nils Adermann <naderman@naderman.de> */ class ComposerExcludeFilter extends BaseExcludeFilter { /** * @param string $sourcePath Directory containing sources to be filtered * @param array $excludeRules An array of exclude rules from composer.json */ public function __construct($sourcePath, array $excludeRules) { parent::__construct($sourcePath); $this->excludePatterns = $this->generatePatterns($excludeRules); } } composer/src/Composer/Package/Archiver/ArchivableFilesFilter.php 0000644 00000001736 14736103146 0020765 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package\Archiver; use FilterIterator; use PharData; class ArchivableFilesFilter extends FilterIterator { private $dirs = array(); /** * @return bool true if the current element is acceptable, otherwise false. */ public function accept() { $file = $this->getInnerIterator()->current(); if ($file->isDir()) { $this->dirs[] = (string) $file; return false; } return true; } public function addEmptyDir(PharData $phar, $sources) { foreach ($this->dirs as $filepath) { $localname = str_replace($sources . "/", '', $filepath); $phar->addEmptyDir($localname); } } } composer/src/Composer/Package/RootPackage.php 0000644 00000005104 14736103146 0015221 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package; /** * The root package represents the project's composer.json and contains additional metadata * * @author Jordi Boggiano <j.boggiano@seld.be> */ class RootPackage extends CompletePackage implements RootPackageInterface { protected $minimumStability = 'stable'; protected $preferStable = false; protected $stabilityFlags = array(); protected $config = array(); protected $references = array(); protected $aliases = array(); /** * Set the minimumStability * * @param string $minimumStability */ public function setMinimumStability($minimumStability) { $this->minimumStability = $minimumStability; } /** * {@inheritDoc} */ public function getMinimumStability() { return $this->minimumStability; } /** * Set the stabilityFlags * * @param array $stabilityFlags */ public function setStabilityFlags(array $stabilityFlags) { $this->stabilityFlags = $stabilityFlags; } /** * {@inheritDoc} */ public function getStabilityFlags() { return $this->stabilityFlags; } /** * Set the preferStable * * @param bool $preferStable */ public function setPreferStable($preferStable) { $this->preferStable = $preferStable; } /** * {@inheritDoc} */ public function getPreferStable() { return $this->preferStable; } /** * Set the config * * @param array $config */ public function setConfig(array $config) { $this->config = $config; } /** * {@inheritDoc} */ public function getConfig() { return $this->config; } /** * Set the references * * @param array $references */ public function setReferences(array $references) { $this->references = $references; } /** * {@inheritDoc} */ public function getReferences() { return $this->references; } /** * Set the aliases * * @param array $aliases */ public function setAliases(array $aliases) { $this->aliases = $aliases; } /** * {@inheritDoc} */ public function getAliases() { return $this->aliases; } } composer/src/Composer/Package/CompletePackage.php 0000644 00000007570 14736103146 0016057 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package; /** * Package containing additional metadata that is not used by the solver * * @author Nils Adermann <naderman@naderman.de> */ class CompletePackage extends Package implements CompletePackageInterface { protected $repositories; protected $license = array(); protected $keywords; protected $authors; protected $description; protected $homepage; protected $scripts = array(); protected $support = array(); protected $funding = array(); protected $abandoned = false; /** * @param array $scripts */ public function setScripts(array $scripts) { $this->scripts = $scripts; } /** * {@inheritDoc} */ public function getScripts() { return $this->scripts; } /** * Set the repositories * * @param array $repositories */ public function setRepositories($repositories) { $this->repositories = $repositories; } /** * {@inheritDoc} */ public function getRepositories() { return $this->repositories; } /** * Set the license * * @param array $license */ public function setLicense(array $license) { $this->license = $license; } /** * {@inheritDoc} */ public function getLicense() { return $this->license; } /** * Set the keywords * * @param array $keywords */ public function setKeywords(array $keywords) { $this->keywords = $keywords; } /** * {@inheritDoc} */ public function getKeywords() { return $this->keywords; } /** * Set the authors * * @param array $authors */ public function setAuthors(array $authors) { $this->authors = $authors; } /** * {@inheritDoc} */ public function getAuthors() { return $this->authors; } /** * Set the description * * @param string $description */ public function setDescription($description) { $this->description = $description; } /** * {@inheritDoc} */ public function getDescription() { return $this->description; } /** * Set the homepage * * @param string $homepage */ public function setHomepage($homepage) { $this->homepage = $homepage; } /** * {@inheritDoc} */ public function getHomepage() { return $this->homepage; } /** * Set the support information * * @param array $support */ public function setSupport(array $support) { $this->support = $support; } /** * {@inheritDoc} */ public function getSupport() { return $this->support; } /** * Set the funding * * @param array $funding */ public function setFunding(array $funding) { $this->funding = $funding; } /** * {@inheritDoc} */ public function getFunding() { return $this->funding; } /** * @return bool */ public function isAbandoned() { return (bool) $this->abandoned; } /** * @param bool|string $abandoned */ public function setAbandoned($abandoned) { $this->abandoned = $abandoned; } /** * If the package is abandoned and has a suggested replacement, this method returns it * * @return string|null */ public function getReplacementPackage() { return is_string($this->abandoned) ? $this->abandoned : null; } } composer/src/Composer/Package/RootAliasPackage.php 0000644 00000007075 14736103146 0016204 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package; /** * @author Jordi Boggiano <j.boggiano@seld.be> */ class RootAliasPackage extends AliasPackage implements RootPackageInterface { public function __construct(RootPackageInterface $aliasOf, $version, $prettyVersion) { parent::__construct($aliasOf, $version, $prettyVersion); } /** * {@inheritDoc} */ public function getAliases() { return $this->aliasOf->getAliases(); } /** * {@inheritDoc} */ public function getMinimumStability() { return $this->aliasOf->getMinimumStability(); } /** * {@inheritDoc} */ public function getStabilityFlags() { return $this->aliasOf->getStabilityFlags(); } /** * {@inheritDoc} */ public function getReferences() { return $this->aliasOf->getReferences(); } /** * {@inheritDoc} */ public function getPreferStable() { return $this->aliasOf->getPreferStable(); } /** * {@inheritDoc} */ public function getConfig() { return $this->aliasOf->getConfig(); } /** * {@inheritDoc} */ public function setRequires(array $require) { $this->requires = $this->replaceSelfVersionDependencies($require, 'requires'); $this->aliasOf->setRequires($require); } /** * {@inheritDoc} */ public function setDevRequires(array $devRequire) { $this->devRequires = $this->replaceSelfVersionDependencies($devRequire, 'devRequires'); $this->aliasOf->setDevRequires($devRequire); } /** * {@inheritDoc} */ public function setConflicts(array $conflicts) { $this->conflicts = $this->replaceSelfVersionDependencies($conflicts, 'conflicts'); $this->aliasOf->setConflicts($conflicts); } /** * {@inheritDoc} */ public function setProvides(array $provides) { $this->provides = $this->replaceSelfVersionDependencies($provides, 'provides'); $this->aliasOf->setProvides($provides); } /** * {@inheritDoc} */ public function setReplaces(array $replaces) { $this->replaces = $this->replaceSelfVersionDependencies($replaces, 'replaces'); $this->aliasOf->setReplaces($replaces); } /** * {@inheritDoc} */ public function setRepositories($repositories) { $this->aliasOf->setRepositories($repositories); } /** * {@inheritDoc} */ public function setAutoload(array $autoload) { $this->aliasOf->setAutoload($autoload); } /** * {@inheritDoc} */ public function setDevAutoload(array $devAutoload) { $this->aliasOf->setDevAutoload($devAutoload); } /** * {@inheritDoc} */ public function setStabilityFlags(array $stabilityFlags) { $this->aliasOf->setStabilityFlags($stabilityFlags); } /** * {@inheritDoc} */ public function setSuggests(array $suggests) { $this->aliasOf->setSuggests($suggests); } /** * {@inheritDoc} */ public function setExtra(array $extra) { $this->aliasOf->setExtra($extra); } public function __clone() { parent::__clone(); $this->aliasOf = clone $this->aliasOf; } } composer/src/Composer/Package/CompletePackageInterface.php 0000644 00000004244 14736103146 0017673 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package; /** * Defines package metadata that is not necessarily needed for solving and installing packages * * @author Nils Adermann <naderman@naderman.de> */ interface CompletePackageInterface extends PackageInterface { /** * Returns the scripts of this package * * @return array array('script name' => array('listeners')) */ public function getScripts(); /** * Returns an array of repositories * * {"<type>": {<config key/values>}} * * @return array Repositories */ public function getRepositories(); /** * Returns the package license, e.g. MIT, BSD, GPL * * @return array The package licenses */ public function getLicense(); /** * Returns an array of keywords relating to the package * * @return array */ public function getKeywords(); /** * Returns the package description * * @return string */ public function getDescription(); /** * Returns the package homepage * * @return string */ public function getHomepage(); /** * Returns an array of authors of the package * * Each item can contain name/homepage/email keys * * @return array */ public function getAuthors(); /** * Returns the support information * * @return array */ public function getSupport(); /** * Returns an array of funding options for the package * * Each item will contain type and url keys * * @return array */ public function getFunding(); /** * Returns if the package is abandoned or not * * @return bool */ public function isAbandoned(); /** * If the package is abandoned and has a suggested replacement, this method returns it * * @return string */ public function getReplacementPackage(); } composer/src/Composer/Package/Link.php 0000644 00000005705 14736103146 0013726 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Package; use Composer\Semver\Constraint\ConstraintInterface; /** * Represents a link between two packages, represented by their names * * @author Nils Adermann <naderman@naderman.de> */ class Link { /** * @var string */ protected $source; /** * @var string */ protected $target; /** * @var ConstraintInterface|null */ protected $constraint; /** * @var string */ protected $description; /** * @var string|null */ protected $prettyConstraint; /** * Creates a new package link. * * @param string $source * @param string $target * @param ConstraintInterface|null $constraint Constraint applying to the target of this link * @param string $description Used to create a descriptive string representation * @param string|null $prettyConstraint */ public function __construct($source, $target, ConstraintInterface $constraint = null, $description = 'relates to', $prettyConstraint = null) { $this->source = strtolower($source); $this->target = strtolower($target); $this->constraint = $constraint; $this->description = $description; $this->prettyConstraint = $prettyConstraint; } /** * @return string */ public function getDescription() { return $this->description; } /** * @return string */ public function getSource() { return $this->source; } /** * @return string */ public function getTarget() { return $this->target; } /** * @return ConstraintInterface|null */ public function getConstraint() { return $this->constraint; } /** * @throws \UnexpectedValueException If no pretty constraint was provided * @return string */ public function getPrettyConstraint() { if (null === $this->prettyConstraint) { throw new \UnexpectedValueException(sprintf('Link %s has been misconfigured and had no prettyConstraint given.', $this)); } return $this->prettyConstraint; } /** * @return string */ public function __toString() { return $this->source.' '.$this->description.' '.$this->target.' ('.$this->constraint.')'; } /** * @param PackageInterface $sourcePackage * @return string */ public function getPrettyString(PackageInterface $sourcePackage) { return $sourcePackage->getPrettyString().' '.$this->description.' '.$this->target.' '.$this->constraint->getPrettyString().''; } } composer/src/Composer/Console/Application.php 0000644 00000050631 14736103146 0015341 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Console; use Composer\IO\NullIO; use Composer\Util\Platform; use Composer\Util\Silencer; use Symfony\Component\Console\Application as BaseApplication; use Symfony\Component\Console\Exception\CommandNotFoundException; use Symfony\Component\Console\Helper\HelperSet; use Symfony\Component\Console\Helper\QuestionHelper; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Composer\Command; use Composer\Composer; use Composer\Factory; use Composer\IO\IOInterface; use Composer\IO\ConsoleIO; use Composer\Json\JsonValidationException; use Composer\Util\ErrorHandler; use Composer\EventDispatcher\ScriptExecutionException; use Composer\Exception\NoSslException; /** * The console application that handles the commands * * @author Ryan Weaver <ryan@knplabs.com> * @author Jordi Boggiano <j.boggiano@seld.be> * @author François Pluchino <francois.pluchino@opendisplay.com> */ class Application extends BaseApplication { /** * @var Composer */ protected $composer; /** * @var IOInterface */ protected $io; private static $logo = ' ______ / ____/___ ____ ___ ____ ____ ________ _____ / / / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/ / /___/ /_/ / / / / / / /_/ / /_/ (__ ) __/ / \____/\____/_/ /_/ /_/ .___/\____/____/\___/_/ /_/ '; private $hasPluginCommands = false; private $disablePluginsByDefault = false; /** * @var string Store the initial working directory at startup time */ private $initialWorkingDirectory = ''; public function __construct() { static $shutdownRegistered = false; if (function_exists('ini_set') && extension_loaded('xdebug')) { ini_set('xdebug.show_exception_trace', false); ini_set('xdebug.scream', false); } if (function_exists('date_default_timezone_set') && function_exists('date_default_timezone_get')) { date_default_timezone_set(Silencer::call('date_default_timezone_get')); } if (!$shutdownRegistered) { $shutdownRegistered = true; register_shutdown_function(function () { $lastError = error_get_last(); if ($lastError && $lastError['message'] && (strpos($lastError['message'], 'Allowed memory') !== false /*Zend PHP out of memory error*/ || strpos($lastError['message'], 'exceeded memory') !== false /*HHVM out of memory errors*/)) { echo "\n". 'Check https://getcomposer.org/doc/articles/troubleshooting.md#memory-limit-errors for more info on how to handle out of memory errors.'; } }); } $this->io = new NullIO(); $this->initialWorkingDirectory = getcwd(); parent::__construct('Composer', Composer::getVersion()); } /** * {@inheritDoc} */ public function run(InputInterface $input = null, OutputInterface $output = null) { if (null === $output) { $output = Factory::createOutput(); } return parent::run($input, $output); } /** * {@inheritDoc} */ public function doRun(InputInterface $input, OutputInterface $output) { $this->disablePluginsByDefault = $input->hasParameterOption('--no-plugins'); if (getenv('COMPOSER_NO_INTERACTION')) { $input->setInteractive(false); } $io = $this->io = new ConsoleIO($input, $output, new HelperSet(array( new QuestionHelper(), ))); ErrorHandler::register($io); if ($input->hasParameterOption('--no-cache')) { $io->writeError('Disabling cache usage', true, IOInterface::DEBUG); $_SERVER['COMPOSER_CACHE_DIR'] = Platform::isWindows() ? 'nul' : '/dev/null'; putenv('COMPOSER_CACHE_DIR='.$_SERVER['COMPOSER_CACHE_DIR']); } // switch working dir if ($newWorkDir = $this->getNewWorkingDir($input)) { $oldWorkingDir = getcwd(); chdir($newWorkDir); $this->initialWorkingDirectory = $newWorkDir; $io->writeError('Changed CWD to ' . getcwd(), true, IOInterface::DEBUG); } // determine command name to be executed without including plugin commands $commandName = ''; if ($name = $this->getCommandName($input)) { try { $commandName = $this->find($name)->getName(); } catch (CommandNotFoundException $e) { // we'll check command validity again later after plugins are loaded $commandName = false; } catch (\InvalidArgumentException $e) { } } // prompt user for dir change if no composer.json is present in current dir if ($io->isInteractive() && !$newWorkDir && !in_array($commandName, array('', 'list', 'init', 'about', 'help', 'diagnose', 'self-update', 'global', 'create-project'), true) && !file_exists(Factory::getComposerFile())) { $dir = dirname(getcwd()); $home = realpath(getenv('HOME') ?: getenv('USERPROFILE') ?: '/'); // abort when we reach the home dir or top of the filesystem while (dirname($dir) !== $dir && $dir !== $home) { if (file_exists($dir.'/'.Factory::getComposerFile())) { if ($io->askConfirmation('<info>No composer.json in current directory, do you want to use the one at '.$dir.'?</info> [<comment>Y,n</comment>]? ', true)) { $oldWorkingDir = getcwd(); chdir($dir); } break; } $dir = dirname($dir); } } if (!$this->disablePluginsByDefault && !$this->hasPluginCommands && 'global' !== $commandName) { try { foreach ($this->getPluginCommands() as $command) { if ($this->has($command->getName())) { $io->writeError('<warning>Plugin command '.$command->getName().' ('.get_class($command).') would override a Composer command and has been skipped</warning>'); } else { $this->add($command); } } } catch (NoSslException $e) { // suppress these as they are not relevant at this point } $this->hasPluginCommands = true; } // determine command name to be executed incl plugin commands, and check if it's a proxy command $isProxyCommand = false; if ($name = $this->getCommandName($input)) { try { $command = $this->find($name); $commandName = $command->getName(); $isProxyCommand = ($command instanceof Command\BaseCommand && $command->isProxyCommand()); } catch (\InvalidArgumentException $e) { } } if (!$isProxyCommand) { $io->writeError(sprintf( 'Running %s (%s) with %s on %s', Composer::getVersion(), Composer::RELEASE_DATE, defined('HHVM_VERSION') ? 'HHVM '.HHVM_VERSION : 'PHP '.PHP_VERSION, function_exists('php_uname') ? php_uname('s') . ' / ' . php_uname('r') : 'Unknown OS' ), true, IOInterface::DEBUG); if (PHP_VERSION_ID < 50302) { $io->writeError('<warning>Composer only officially supports PHP 5.3.2 and above, you will most likely encounter problems with your PHP '.PHP_VERSION.', upgrading is strongly recommended.</warning>'); } if (extension_loaded('xdebug') && !getenv('COMPOSER_DISABLE_XDEBUG_WARN')) { $io->writeError('<warning>You are running composer with Xdebug enabled. This has a major impact on runtime performance. See https://getcomposer.org/xdebug</warning>'); } if (defined('COMPOSER_DEV_WARNING_TIME') && $commandName !== 'self-update' && $commandName !== 'selfupdate' && time() > COMPOSER_DEV_WARNING_TIME) { $io->writeError(sprintf('<warning>Warning: This development build of composer is over 60 days old. It is recommended to update it by running "%s self-update" to get the latest version.</warning>', $_SERVER['PHP_SELF'])); } if ( !Platform::isWindows() && function_exists('exec') && !getenv('COMPOSER_ALLOW_SUPERUSER') && (ini_get('open_basedir') || !file_exists('/.dockerenv')) ) { if (function_exists('posix_getuid') && posix_getuid() === 0) { if ($commandName !== 'self-update' && $commandName !== 'selfupdate') { $io->writeError('<warning>Do not run Composer as root/super user! See https://getcomposer.org/root for details</warning>'); } if ($uid = (int) getenv('SUDO_UID')) { // Silently clobber any sudo credentials on the invoking user to avoid privilege escalations later on // ref. https://github.com/composer/composer/issues/5119 Silencer::call('exec', "sudo -u \\#{$uid} sudo -K > /dev/null 2>&1"); } } // Silently clobber any remaining sudo leases on the current user as well to avoid privilege escalations Silencer::call('exec', 'sudo -K > /dev/null 2>&1'); } // Check system temp folder for usability as it can cause weird runtime issues otherwise Silencer::call(function () use ($io) { $tempfile = sys_get_temp_dir() . '/temp-' . md5(microtime()); if (!(file_put_contents($tempfile, __FILE__) && (file_get_contents($tempfile) == __FILE__) && unlink($tempfile) && !file_exists($tempfile))) { $io->writeError(sprintf('<error>PHP temp directory (%s) does not exist or is not writable to Composer. Set sys_temp_dir in your php.ini</error>', sys_get_temp_dir())); } }); // add non-standard scripts as own commands $file = Factory::getComposerFile(); if (is_file($file) && is_readable($file) && is_array($composer = json_decode(file_get_contents($file), true))) { if (isset($composer['scripts']) && is_array($composer['scripts'])) { foreach ($composer['scripts'] as $script => $dummy) { if (!defined('Composer\Script\ScriptEvents::'.str_replace('-', '_', strtoupper($script)))) { if ($this->has($script)) { $io->writeError('<warning>A script named '.$script.' would override a Composer command and has been skipped</warning>'); } else { $description = null; if (isset($composer['scripts-descriptions'][$script])) { $description = $composer['scripts-descriptions'][$script]; } $this->add(new Command\ScriptAliasCommand($script, $description)); } } } } } } try { if ($input->hasParameterOption('--profile')) { $startTime = microtime(true); $this->io->enableDebugging($startTime); } $result = parent::doRun($input, $output); if (isset($oldWorkingDir)) { chdir($oldWorkingDir); } if (isset($startTime)) { $io->writeError('<info>Memory usage: '.round(memory_get_usage() / 1024 / 1024, 2).'MiB (peak: '.round(memory_get_peak_usage() / 1024 / 1024, 2).'MiB), time: '.round(microtime(true) - $startTime, 2).'s'); } restore_error_handler(); return $result; } catch (ScriptExecutionException $e) { return $e->getCode(); } catch (\Exception $e) { $this->hintCommonErrors($e); restore_error_handler(); throw $e; } } /** * @param InputInterface $input * @throws \RuntimeException * @return string */ private function getNewWorkingDir(InputInterface $input) { $workingDir = $input->getParameterOption(array('--working-dir', '-d')); if (false !== $workingDir && !is_dir($workingDir)) { throw new \RuntimeException('Invalid working directory specified, '.$workingDir.' does not exist.'); } return $workingDir; } /** * {@inheritDoc} */ private function hintCommonErrors($exception) { $io = $this->getIO(); Silencer::suppress(); try { $composer = $this->getComposer(false, true); if ($composer) { $config = $composer->getConfig(); $minSpaceFree = 1024 * 1024; if ((($df = disk_free_space($dir = $config->get('home'))) !== false && $df < $minSpaceFree) || (($df = disk_free_space($dir = $config->get('vendor-dir'))) !== false && $df < $minSpaceFree) || (($df = disk_free_space($dir = sys_get_temp_dir())) !== false && $df < $minSpaceFree) ) { $io->writeError('<error>The disk hosting '.$dir.' is full, this may be the cause of the following exception</error>', true, IOInterface::QUIET); } } } catch (\Exception $e) { } Silencer::restore(); if (Platform::isWindows() && false !== strpos($exception->getMessage(), 'The system cannot find the path specified')) { $io->writeError('<error>The following exception may be caused by a stale entry in your cmd.exe AutoRun</error>', true, IOInterface::QUIET); $io->writeError('<error>Check https://getcomposer.org/doc/articles/troubleshooting.md#-the-system-cannot-find-the-path-specified-windows- for details</error>', true, IOInterface::QUIET); } if (false !== strpos($exception->getMessage(), 'fork failed - Cannot allocate memory')) { $io->writeError('<error>The following exception is caused by a lack of memory or swap, or not having swap configured</error>', true, IOInterface::QUIET); $io->writeError('<error>Check https://getcomposer.org/doc/articles/troubleshooting.md#proc-open-fork-failed-errors for details</error>', true, IOInterface::QUIET); } } /** * @param bool $required * @param bool|null $disablePlugins * @throws JsonValidationException * @return \Composer\Composer */ public function getComposer($required = true, $disablePlugins = null) { if (null === $disablePlugins) { $disablePlugins = $this->disablePluginsByDefault; } if (null === $this->composer) { try { $this->composer = Factory::create($this->io, null, $disablePlugins); } catch (\InvalidArgumentException $e) { if ($required) { $this->io->writeError($e->getMessage()); exit(1); } } catch (JsonValidationException $e) { $errors = ' - ' . implode(PHP_EOL . ' - ', $e->getErrors()); $message = $e->getMessage() . ':' . PHP_EOL . $errors; throw new JsonValidationException($message); } } return $this->composer; } /** * Removes the cached composer instance */ public function resetComposer() { $this->composer = null; if ($this->getIO() && method_exists($this->getIO(), 'resetAuthentications')) { $this->getIO()->resetAuthentications(); } } /** * @return IOInterface */ public function getIO() { return $this->io; } public function getHelp() { return self::$logo . parent::getHelp(); } /** * Initializes all the composer commands. */ protected function getDefaultCommands() { $commands = array_merge(parent::getDefaultCommands(), array( new Command\AboutCommand(), new Command\ConfigCommand(), new Command\DependsCommand(), new Command\ProhibitsCommand(), new Command\InitCommand(), new Command\InstallCommand(), new Command\CreateProjectCommand(), new Command\UpdateCommand(), new Command\SearchCommand(), new Command\ValidateCommand(), new Command\ShowCommand(), new Command\SuggestsCommand(), new Command\RequireCommand(), new Command\DumpAutoloadCommand(), new Command\StatusCommand(), new Command\ArchiveCommand(), new Command\DiagnoseCommand(), new Command\RunScriptCommand(), new Command\LicensesCommand(), new Command\GlobalCommand(), new Command\ClearCacheCommand(), new Command\RemoveCommand(), new Command\HomeCommand(), new Command\ExecCommand(), new Command\OutdatedCommand(), new Command\CheckPlatformReqsCommand(), new Command\FundCommand(), )); if ('phar:' === substr(__FILE__, 0, 5)) { $commands[] = new Command\SelfUpdateCommand(); } return $commands; } /** * {@inheritDoc} */ public function getLongVersion() { if (Composer::BRANCH_ALIAS_VERSION && Composer::BRANCH_ALIAS_VERSION !== '@package_branch_alias_version'.'@') { return sprintf( '<info>%s</info> version <comment>%s (%s)</comment> %s', $this->getName(), Composer::BRANCH_ALIAS_VERSION, $this->getVersion(), Composer::RELEASE_DATE ); } return parent::getLongVersion() . ' ' . Composer::RELEASE_DATE; } /** * {@inheritDoc} */ protected function getDefaultInputDefinition() { $definition = parent::getDefaultInputDefinition(); $definition->addOption(new InputOption('--profile', null, InputOption::VALUE_NONE, 'Display timing and memory usage information')); $definition->addOption(new InputOption('--no-plugins', null, InputOption::VALUE_NONE, 'Whether to disable plugins.')); $definition->addOption(new InputOption('--working-dir', '-d', InputOption::VALUE_REQUIRED, 'If specified, use the given directory as working directory.')); $definition->addOption(new InputOption('--no-cache', null, InputOption::VALUE_NONE, 'Prevent use of the cache')); return $definition; } private function getPluginCommands() { $commands = array(); $composer = $this->getComposer(false, false); if (null === $composer) { $composer = Factory::createGlobal($this->io, false); } if (null !== $composer) { $pm = $composer->getPluginManager(); foreach ($pm->getPluginCapabilities('Composer\Plugin\Capability\CommandProvider', array('composer' => $composer, 'io' => $this->io)) as $capability) { $newCommands = $capability->getCommands(); if (!is_array($newCommands)) { throw new \UnexpectedValueException('Plugin capability '.get_class($capability).' failed to return an array from getCommands'); } foreach ($newCommands as $command) { if (!$command instanceof Command\BaseCommand) { throw new \UnexpectedValueException('Plugin capability '.get_class($capability).' returned an invalid value, we expected an array of Composer\Command\BaseCommand objects'); } } $commands = array_merge($commands, $newCommands); } } return $commands; } /** * Get the working directoy at startup time * * @return string */ public function getInitialWorkingDirectory() { return $this->initialWorkingDirectory; } } composer/src/Composer/Console/HtmlOutputFormatter.php 0000644 00000005001 14736103146 0017076 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Console; use Symfony\Component\Console\Formatter\OutputFormatter; /** * @author Jordi Boggiano <j.boggiano@seld.be> */ class HtmlOutputFormatter extends OutputFormatter { private static $availableForegroundColors = array( 30 => 'black', 31 => 'red', 32 => 'green', 33 => 'yellow', 34 => 'blue', 35 => 'magenta', 36 => 'cyan', 37 => 'white', ); private static $availableBackgroundColors = array( 40 => 'black', 41 => 'red', 42 => 'green', 43 => 'yellow', 44 => 'blue', 45 => 'magenta', 46 => 'cyan', 47 => 'white', ); private static $availableOptions = array( 1 => 'bold', 4 => 'underscore', //5 => 'blink', //7 => 'reverse', //8 => 'conceal' ); /** * @param array $styles Array of "name => FormatterStyle" instances */ public function __construct(array $styles = array()) { parent::__construct(true, $styles); } public function format($message) { $formatted = parent::format($message); $clearEscapeCodes = '(?:39|49|0|22|24|25|27|28)'; return preg_replace_callback("{\033\[([0-9;]+)m(.*?)\033\[(?:".$clearEscapeCodes.";)*?".$clearEscapeCodes."m}s", array($this, 'formatHtml'), $formatted); } private function formatHtml($matches) { $out = '<span style="'; foreach (explode(';', $matches[1]) as $code) { if (isset(self::$availableForegroundColors[$code])) { $out .= 'color:'.self::$availableForegroundColors[$code].';'; } elseif (isset(self::$availableBackgroundColors[$code])) { $out .= 'background-color:'.self::$availableBackgroundColors[$code].';'; } elseif (isset(self::$availableOptions[$code])) { switch (self::$availableOptions[$code]) { case 'bold': $out .= 'font-weight:bold;'; break; case 'underscore': $out .= 'text-decoration:underline;'; break; } } } return $out.'">'.$matches[2].'</span>'; } } composer/src/Composer/Config/ConfigSourceInterface.php 0000644 00000003677 14736103146 0017120 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Config; /** * Configuration Source Interface * * @author Jordi Boggiano <j.boggiano@seld.be> * @author Beau Simensen <beau@dflydev.com> */ interface ConfigSourceInterface { /** * Add a repository * * @param string $name Name * @param array $config Configuration */ public function addRepository($name, $config); /** * Remove a repository * * @param string $name */ public function removeRepository($name); /** * Add a config setting * * @param string $name Name * @param string|array $value Value */ public function addConfigSetting($name, $value); /** * Remove a config setting * * @param string $name */ public function removeConfigSetting($name); /** * Add a property * * @param string $name Name * @param string $value Value */ public function addProperty($name, $value); /** * Remove a property * * @param string $name */ public function removeProperty($name); /** * Add a package link * * @param string $type Type (require, require-dev, provide, suggest, replace, conflict) * @param string $name Name * @param string $value Value */ public function addLink($type, $name, $value); /** * Remove a package link * * @param string $type Type (require, require-dev, provide, suggest, replace, conflict) * @param string $name Name */ public function removeLink($type, $name); /** * Gives a user-friendly name to this source (file path or so) * * @return string */ public function getName(); } composer/src/Composer/Config/JsonConfigSource.php 0000644 00000021050 14736103146 0016112 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Config; use Composer\Json\JsonFile; use Composer\Json\JsonManipulator; use Composer\Util\Silencer; /** * JSON Configuration Source * * @author Jordi Boggiano <j.boggiano@seld.be> * @author Beau Simensen <beau@dflydev.com> */ class JsonConfigSource implements ConfigSourceInterface { /** * @var JsonFile */ private $file; /** * @var bool */ private $authConfig; /** * Constructor * * @param JsonFile $file * @param bool $authConfig */ public function __construct(JsonFile $file, $authConfig = false) { $this->file = $file; $this->authConfig = $authConfig; } /** * {@inheritdoc} */ public function getName() { return $this->file->getPath(); } /** * {@inheritdoc} */ public function addRepository($name, $config) { $this->manipulateJson('addRepository', $name, $config, function (&$config, $repo, $repoConfig) { // if converting from an array format to hashmap format, and there is a {"packagist.org":false} repo, we have // to convert it to "packagist.org": false key on the hashmap otherwise it fails schema validation if (isset($config['repositories'])) { foreach ($config['repositories'] as $index => $val) { if ($index === $repo) { continue; } if (is_numeric($index) && ($val === array('packagist' => false) || $val === array('packagist.org' => false))) { unset($config['repositories'][$index]); $config['repositories']['packagist.org'] = false; break; } } } $config['repositories'][$repo] = $repoConfig; }); } /** * {@inheritdoc} */ public function removeRepository($name) { $this->manipulateJson('removeRepository', $name, function (&$config, $repo) { unset($config['repositories'][$repo]); }); } /** * {@inheritdoc} */ public function addConfigSetting($name, $value) { $authConfig = $this->authConfig; $this->manipulateJson('addConfigSetting', $name, $value, function (&$config, $key, $val) use ($authConfig) { if (preg_match('{^(bitbucket-oauth|github-oauth|gitlab-oauth|gitlab-token|bearer|http-basic|platform)\.}', $key)) { list($key, $host) = explode('.', $key, 2); if ($authConfig) { $config[$key][$host] = $val; } else { $config['config'][$key][$host] = $val; } } else { $config['config'][$key] = $val; } }); } /** * {@inheritdoc} */ public function removeConfigSetting($name) { $authConfig = $this->authConfig; $this->manipulateJson('removeConfigSetting', $name, function (&$config, $key) use ($authConfig) { if (preg_match('{^(bitbucket-oauth|github-oauth|gitlab-oauth|gitlab-token|bearer|http-basic|platform)\.}', $key)) { list($key, $host) = explode('.', $key, 2); if ($authConfig) { unset($config[$key][$host]); } else { unset($config['config'][$key][$host]); } } else { unset($config['config'][$key]); } }); } /** * {@inheritdoc} */ public function addProperty($name, $value) { $this->manipulateJson('addProperty', $name, $value, function (&$config, $key, $val) { if (substr($key, 0, 6) === 'extra.' || substr($key, 0, 8) === 'scripts.') { $bits = explode('.', $key); $last = array_pop($bits); $arr = &$config[reset($bits)]; foreach ($bits as $bit) { if (!isset($arr[$bit])) { $arr[$bit] = array(); } $arr = &$arr[$bit]; } $arr[$last] = $val; } else { $config[$key] = $val; } }); } /** * {@inheritdoc} */ public function removeProperty($name) { $authConfig = $this->authConfig; $this->manipulateJson('removeProperty', $name, function (&$config, $key) { if (substr($key, 0, 6) === 'extra.' || substr($key, 0, 8) === 'scripts.') { $bits = explode('.', $key); $last = array_pop($bits); $arr = &$config[reset($bits)]; foreach ($bits as $bit) { if (!isset($arr[$bit])) { return; } $arr = &$arr[$bit]; } unset($arr[$last]); } else { unset($config[$key]); } }); } /** * {@inheritdoc} */ public function addLink($type, $name, $value) { $this->manipulateJson('addLink', $type, $name, $value, function (&$config, $type, $name, $value) { $config[$type][$name] = $value; }); } /** * {@inheritdoc} */ public function removeLink($type, $name) { $this->manipulateJson('removeSubNode', $type, $name, function (&$config, $type, $name) { unset($config[$type][$name]); if (0 === count($config[$type])) { unset($config[$type]); } }); } protected function manipulateJson($method, $args, $fallback) { $args = func_get_args(); // remove method & fallback array_shift($args); $fallback = array_pop($args); if ($this->file->exists()) { if (!is_writable($this->file->getPath())) { throw new \RuntimeException(sprintf('The file "%s" is not writable.', $this->file->getPath())); } if (!is_readable($this->file->getPath())) { throw new \RuntimeException(sprintf('The file "%s" is not readable.', $this->file->getPath())); } $contents = file_get_contents($this->file->getPath()); } elseif ($this->authConfig) { $contents = "{\n}\n"; } else { $contents = "{\n \"config\": {\n }\n}\n"; } $manipulator = new JsonManipulator($contents); $newFile = !$this->file->exists(); // override manipulator method for auth config files if ($this->authConfig && $method === 'addConfigSetting') { $method = 'addSubNode'; list($mainNode, $name) = explode('.', $args[0], 2); $args = array($mainNode, $name, $args[1]); } elseif ($this->authConfig && $method === 'removeConfigSetting') { $method = 'removeSubNode'; list($mainNode, $name) = explode('.', $args[0], 2); $args = array($mainNode, $name); } // try to update cleanly if (call_user_func_array(array($manipulator, $method), $args)) { file_put_contents($this->file->getPath(), $manipulator->getContents()); } else { // on failed clean update, call the fallback and rewrite the whole file $config = $this->file->read(); $this->arrayUnshiftRef($args, $config); call_user_func_array($fallback, $args); // avoid ending up with arrays for keys that should be objects foreach (array('require', 'require-dev', 'conflict', 'provide', 'replace', 'suggest', 'config', 'autoload', 'autoload-dev') as $linkType) { if (isset($config[$linkType]) && $config[$linkType] === array()) { $config[$linkType] = new \stdClass; } } $this->file->write($config); } if ($newFile) { Silencer::call('chmod', $this->file->getPath(), 0600); } } /** * Prepend a reference to an element to the beginning of an array. * * @param array $array * @param mixed $value * @return array */ private function arrayUnshiftRef(&$array, &$value) { $return = array_unshift($array, ''); $array[0] = &$value; return $return; } } composer/src/Composer/Util/StreamContextFactory.php 0000644 00000016177 14736103146 0016550 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util; use Composer\Composer; /** * Allows the creation of a basic context supporting http proxy * * @author Jordan Alliot <jordan.alliot@gmail.com> * @author Markus Tacker <m@coderbyheart.de> */ final class StreamContextFactory { /** * Creates a context supporting HTTP proxies * * @param string $url URL the context is to be used for * @param array $defaultOptions Options to merge with the default * @param array $defaultParams Parameters to specify on the context * @throws \RuntimeException if https proxy required and OpenSSL uninstalled * @return resource Default context */ public static function getContext($url, array $defaultOptions = array(), array $defaultParams = array()) { $options = array('http' => array( // specify defaults again to try and work better with curlwrappers enabled 'follow_location' => 1, 'max_redirects' => 20, )); // Handle HTTP_PROXY/http_proxy on CLI only for security reasons if ((PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') && (!empty($_SERVER['HTTP_PROXY']) || !empty($_SERVER['http_proxy']))) { $proxy = parse_url(!empty($_SERVER['http_proxy']) ? $_SERVER['http_proxy'] : $_SERVER['HTTP_PROXY']); } // Prefer CGI_HTTP_PROXY if available if (!empty($_SERVER['CGI_HTTP_PROXY'])) { $proxy = parse_url($_SERVER['CGI_HTTP_PROXY']); } // Override with HTTPS proxy if present and URL is https if (preg_match('{^https://}i', $url) && (!empty($_SERVER['HTTPS_PROXY']) || !empty($_SERVER['https_proxy']))) { $proxy = parse_url(!empty($_SERVER['https_proxy']) ? $_SERVER['https_proxy'] : $_SERVER['HTTPS_PROXY']); } // Remove proxy if URL matches no_proxy directive if (!empty($_SERVER['NO_PROXY']) || !empty($_SERVER['no_proxy']) && parse_url($url, PHP_URL_HOST)) { $pattern = new NoProxyPattern(!empty($_SERVER['no_proxy']) ? $_SERVER['no_proxy'] : $_SERVER['NO_PROXY']); if ($pattern->test($url)) { unset($proxy); } } if (!empty($proxy)) { $proxyURL = isset($proxy['scheme']) ? $proxy['scheme'] . '://' : ''; $proxyURL .= isset($proxy['host']) ? $proxy['host'] : ''; if (isset($proxy['port'])) { $proxyURL .= ":" . $proxy['port']; } elseif ('http://' == substr($proxyURL, 0, 7)) { $proxyURL .= ":80"; } elseif ('https://' == substr($proxyURL, 0, 8)) { $proxyURL .= ":443"; } // http(s):// is not supported in proxy $proxyURL = str_replace(array('http://', 'https://'), array('tcp://', 'ssl://'), $proxyURL); if (0 === strpos($proxyURL, 'ssl:') && !extension_loaded('openssl')) { throw new \RuntimeException('You must enable the openssl extension to use a proxy over https'); } $options['http']['proxy'] = $proxyURL; // enabled request_fulluri unless it is explicitly disabled switch (parse_url($url, PHP_URL_SCHEME)) { case 'http': // default request_fulluri to true $reqFullUriEnv = getenv('HTTP_PROXY_REQUEST_FULLURI'); if ($reqFullUriEnv === false || $reqFullUriEnv === '' || (strtolower($reqFullUriEnv) !== 'false' && (bool) $reqFullUriEnv)) { $options['http']['request_fulluri'] = true; } break; case 'https': // default request_fulluri to true $reqFullUriEnv = getenv('HTTPS_PROXY_REQUEST_FULLURI'); if ($reqFullUriEnv === false || $reqFullUriEnv === '' || (strtolower($reqFullUriEnv) !== 'false' && (bool) $reqFullUriEnv)) { $options['http']['request_fulluri'] = true; } break; } // add SNI opts for https URLs if ('https' === parse_url($url, PHP_URL_SCHEME)) { $options['ssl']['SNI_enabled'] = true; if (PHP_VERSION_ID < 50600) { $options['ssl']['SNI_server_name'] = parse_url($url, PHP_URL_HOST); } } // handle proxy auth if present if (isset($proxy['user'])) { $auth = rawurldecode($proxy['user']); if (isset($proxy['pass'])) { $auth .= ':' . rawurldecode($proxy['pass']); } $auth = base64_encode($auth); // Preserve headers if already set in default options if (isset($defaultOptions['http']['header'])) { if (is_string($defaultOptions['http']['header'])) { $defaultOptions['http']['header'] = array($defaultOptions['http']['header']); } $defaultOptions['http']['header'][] = "Proxy-Authorization: Basic {$auth}"; } else { $options['http']['header'] = array("Proxy-Authorization: Basic {$auth}"); } } } $options = array_replace_recursive($options, $defaultOptions); if (isset($options['http']['header'])) { $options['http']['header'] = self::fixHttpHeaderField($options['http']['header']); } if (defined('HHVM_VERSION')) { $phpVersion = 'HHVM ' . HHVM_VERSION; } else { $phpVersion = 'PHP ' . PHP_MAJOR_VERSION . '.' . PHP_MINOR_VERSION . '.' . PHP_RELEASE_VERSION; } if (!isset($options['http']['header']) || false === stripos(implode('', $options['http']['header']), 'user-agent')) { $options['http']['header'][] = sprintf( 'User-Agent: Composer/%s (%s; %s; %s%s)', Composer::getVersion(), function_exists('php_uname') ? php_uname('s') : 'Unknown', function_exists('php_uname') ? php_uname('r') : 'Unknown', $phpVersion, getenv('CI') ? '; CI' : '' ); } return stream_context_create($options, $defaultParams); } /** * A bug in PHP prevents the headers from correctly being sent when a content-type header is present and * NOT at the end of the array * * This method fixes the array by moving the content-type header to the end * * @link https://bugs.php.net/bug.php?id=61548 * @param string|array $header * @return array */ private static function fixHttpHeaderField($header) { if (!is_array($header)) { $header = explode("\r\n", $header); } uasort($header, function ($el) { return stripos($el, 'content-type') === 0 ? 1 : -1; }); return $header; } } composer/src/Composer/Util/AuthHelper.php 0000644 00000003237 14736103146 0014452 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util; use Composer\Config; use Composer\IO\IOInterface; /** * @author Jordi Boggiano <j.boggiano@seld.be> */ class AuthHelper { protected $io; protected $config; public function __construct(IOInterface $io, Config $config) { $this->io = $io; $this->config = $config; } public function storeAuth($originUrl, $storeAuth) { $store = false; $configSource = $this->config->getAuthConfigSource(); if ($storeAuth === true) { $store = $configSource; } elseif ($storeAuth === 'prompt') { $answer = $this->io->askAndValidate( 'Do you want to store credentials for '.$originUrl.' in '.$configSource->getName().' ? [Yn] ', function ($value) { $input = strtolower(substr(trim($value), 0, 1)); if (in_array($input, array('y','n'))) { return $input; } throw new \RuntimeException('Please answer (y)es or (n)o'); }, null, 'y' ); if ($answer === 'y') { $store = $configSource; } } if ($store) { $store->addConfigSetting( 'http-basic.'.$originUrl, $this->io->getAuthentication($originUrl) ); } } } composer/src/Composer/Util/ErrorHandler.php 0000644 00000004503 14736103146 0014775 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util; use Composer\IO\IOInterface; /** * Convert PHP errors into exceptions * * @author Artem Lopata <biozshock@gmail.com> */ class ErrorHandler { private static $io; /** * Error handler * * @param int $level Level of the error raised * @param string $message Error message * @param string $file Filename that the error was raised in * @param int $line Line number the error was raised at * * @static * @throws \ErrorException * @return bool */ public static function handle($level, $message, $file, $line) { // error code is not included in error_reporting if (!(error_reporting() & $level)) { return; } if (filter_var(ini_get('xdebug.scream'), FILTER_VALIDATE_BOOLEAN)) { $message .= "\n\nWarning: You have xdebug.scream enabled, the warning above may be". "\na legitimately suppressed error that you were not supposed to see."; } if ($level !== E_DEPRECATED && $level !== E_USER_DEPRECATED) { throw new \ErrorException($message, 0, $level, $file, $line); } if (self::$io) { self::$io->writeError('<warning>Deprecation Notice: '.$message.' in '.$file.':'.$line.'</warning>'); if (self::$io->isVerbose()) { self::$io->writeError('<warning>Stack trace:</warning>'); self::$io->writeError(array_filter(array_map(function ($a) { if (isset($a['line'], $a['file'])) { return '<warning> '.$a['file'].':'.$a['line'].'</warning>'; } return null; }, array_slice(debug_backtrace(), 2)))); } } return true; } /** * Register error handler. * * @param IOInterface|null $io */ public static function register(IOInterface $io = null) { set_error_handler(array(__CLASS__, 'handle')); error_reporting(E_ALL | E_STRICT); self::$io = $io; } } composer/src/Composer/Util/GitHub.php 0000644 00000013654 14736103146 0013577 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util; use Composer\Factory; use Composer\IO\IOInterface; use Composer\Config; use Composer\Downloader\TransportException; /** * @author Jordi Boggiano <j.boggiano@seld.be> */ class GitHub { protected $io; protected $config; protected $process; protected $remoteFilesystem; /** * Constructor. * * @param IOInterface $io The IO instance * @param Config $config The composer configuration * @param ProcessExecutor $process Process instance, injectable for mocking * @param RemoteFilesystem $remoteFilesystem Remote Filesystem, injectable for mocking */ public function __construct(IOInterface $io, Config $config, ProcessExecutor $process = null, RemoteFilesystem $remoteFilesystem = null) { $this->io = $io; $this->config = $config; $this->process = $process ?: new ProcessExecutor($io); $this->remoteFilesystem = $remoteFilesystem ?: Factory::createRemoteFilesystem($this->io, $config); } /** * Attempts to authorize a GitHub domain via OAuth * * @param string $originUrl The host this GitHub instance is located at * @return bool true on success */ public function authorizeOAuth($originUrl) { if (!in_array($originUrl, $this->config->get('github-domains'))) { return false; } // if available use token from git config if (0 === $this->process->execute('git config github.accesstoken', $output)) { $this->io->setAuthentication($originUrl, trim($output), 'x-oauth-basic'); return true; } return false; } /** * Authorizes a GitHub domain interactively via OAuth * * @param string $originUrl The host this GitHub instance is located at * @param string $message The reason this authorization is required * @throws \RuntimeException * @throws TransportException|\Exception * @return bool true on success */ public function authorizeOAuthInteractively($originUrl, $message = null) { if ($message) { $this->io->writeError($message); } $note = 'Composer'; if ($this->config->get('github-expose-hostname') === true && 0 === $this->process->execute('hostname', $output)) { $note .= ' on ' . trim($output); } $note .= ' ' . date('Y-m-d Hi'); $url = 'https://'.$originUrl.'/settings/tokens/new?scopes=repo&description=' . str_replace('%20', '+', rawurlencode($note)); $this->io->writeError(sprintf('Head to %s', $url)); $this->io->writeError(sprintf('to retrieve a token. It will be stored in "%s" for future use by Composer.', $this->config->getAuthConfigSource()->getName())); $token = trim($this->io->askAndHideAnswer('Token (hidden): ')); if (!$token) { $this->io->writeError('<warning>No token given, aborting.</warning>'); $this->io->writeError('You can also add it manually later by using "composer config --global --auth github-oauth.github.com <token>"'); return false; } $this->io->setAuthentication($originUrl, $token, 'x-oauth-basic'); try { $apiUrl = ('github.com' === $originUrl) ? 'api.github.com/' : $originUrl . '/api/v3/'; $this->remoteFilesystem->getContents($originUrl, 'https://'. $apiUrl, false, array( 'retry-auth-failure' => false, )); } catch (TransportException $e) { if (in_array($e->getCode(), array(403, 401))) { $this->io->writeError('<error>Invalid token provided.</error>'); $this->io->writeError('You can also add it manually later by using "composer config --global --auth github-oauth.github.com <token>"'); return false; } throw $e; } // store value in user config $this->config->getConfigSource()->removeConfigSetting('github-oauth.'.$originUrl); $this->config->getAuthConfigSource()->addConfigSetting('github-oauth.'.$originUrl, $token); $this->io->writeError('<info>Token stored successfully.</info>'); return true; } /** * Extract ratelimit from response. * * @param array $headers Headers from Composer\Downloader\TransportException. * * @return array Associative array with the keys limit and reset. */ public function getRateLimit(array $headers) { $rateLimit = array( 'limit' => '?', 'reset' => '?', ); foreach ($headers as $header) { $header = trim($header); if (false === strpos($header, 'X-RateLimit-')) { continue; } list($type, $value) = explode(':', $header, 2); switch ($type) { case 'X-RateLimit-Limit': $rateLimit['limit'] = (int) trim($value); break; case 'X-RateLimit-Reset': $rateLimit['reset'] = date('Y-m-d H:i:s', (int) trim($value)); break; } } return $rateLimit; } /** * Finds whether a request failed due to rate limiting * * @param array $headers Headers from Composer\Downloader\TransportException. * * @return bool */ public function isRateLimited(array $headers) { foreach ($headers as $header) { if (preg_match('{^X-RateLimit-Remaining: *0$}i', trim($header))) { return true; } } return false; } } composer/src/Composer/Util/Platform.php 0000644 00000005050 14736103146 0014170 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util; /** * Platform helper for uniform platform-specific tests. * * @author Niels Keurentjes <niels.keurentjes@omines.com> */ class Platform { /** * Parses tildes and environment variables in paths. * * @param string $path * @return string */ public static function expandPath($path) { if (preg_match('#^~[\\/]#', $path)) { return self::getUserDirectory() . substr($path, 1); } return preg_replace_callback('#^(\$|(?P<percent>%))(?P<var>\w++)(?(percent)%)(?P<path>.*)#', function ($matches) { // Treat HOME as an alias for USERPROFILE on Windows for legacy reasons if (Platform::isWindows() && $matches['var'] == 'HOME') { return (getenv('HOME') ?: getenv('USERPROFILE')) . $matches['path']; } return getenv($matches['var']) . $matches['path']; }, $path); } /** * @throws \RuntimeException If the user home could not reliably be determined * @return string The formal user home as detected from environment parameters */ public static function getUserDirectory() { if (false !== ($home = getenv('HOME'))) { return $home; } if (self::isWindows() && false !== ($home = getenv('USERPROFILE'))) { return $home; } if (function_exists('posix_getuid') && function_exists('posix_getpwuid')) { $info = posix_getpwuid(posix_getuid()); return $info['dir']; } throw new \RuntimeException('Could not determine user directory'); } /** * @return bool Whether the host machine is running a Windows OS */ public static function isWindows() { return defined('PHP_WINDOWS_VERSION_BUILD'); } /** * @param string $str * @return int return a guaranteed binary length of the string, regardless of silly mbstring configs */ public static function strlen($str) { static $useMbString = null; if (null === $useMbString) { $useMbString = function_exists('mb_strlen') && ini_get('mbstring.func_overload'); } if ($useMbString) { return mb_strlen($str, '8bit'); } return strlen($str); } } composer/src/Composer/Util/Perforce.php 0000644 00000042145 14736103146 0014157 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util; use Composer\IO\IOInterface; use Symfony\Component\Process\Process; /** * @author Matt Whittom <Matt.Whittom@veteransunited.com> */ class Perforce { protected $path; protected $p4Depot; protected $p4Client; protected $p4User; protected $p4Password; protected $p4Port; protected $p4Stream; protected $p4ClientSpec; protected $p4DepotType; protected $p4Branch; protected $process; protected $uniquePerforceClientName; protected $windowsFlag; protected $commandResult; protected $io; protected $filesystem; public function __construct($repoConfig, $port, $path, ProcessExecutor $process, $isWindows, IOInterface $io) { $this->windowsFlag = $isWindows; $this->p4Port = $port; $this->initializePath($path); $this->process = $process; $this->initialize($repoConfig); $this->io = $io; } public static function create($repoConfig, $port, $path, ProcessExecutor $process, IOInterface $io) { return new Perforce($repoConfig, $port, $path, $process, Platform::isWindows(), $io); } public static function checkServerExists($url, ProcessExecutor $processExecutor) { $output = null; return 0 === $processExecutor->execute('p4 -p ' . ProcessExecutor::escape($url) . ' info -s', $output); } public function initialize($repoConfig) { $this->uniquePerforceClientName = $this->generateUniquePerforceClientName(); if (!$repoConfig) { return; } if (isset($repoConfig['unique_perforce_client_name'])) { $this->uniquePerforceClientName = $repoConfig['unique_perforce_client_name']; } if (isset($repoConfig['depot'])) { $this->p4Depot = $repoConfig['depot']; } if (isset($repoConfig['branch'])) { $this->p4Branch = $repoConfig['branch']; } if (isset($repoConfig['p4user'])) { $this->p4User = $repoConfig['p4user']; } else { $this->p4User = $this->getP4variable('P4USER'); } if (isset($repoConfig['p4password'])) { $this->p4Password = $repoConfig['p4password']; } } public function initializeDepotAndBranch($depot, $branch) { if (isset($depot)) { $this->p4Depot = $depot; } if (isset($branch)) { $this->p4Branch = $branch; } } public function generateUniquePerforceClientName() { return gethostname() . "_" . time(); } public function cleanupClientSpec() { $client = $this->getClient(); $task = 'client -d ' . ProcessExecutor::escape($client); $useP4Client = false; $command = $this->generateP4Command($task, $useP4Client); $this->executeCommand($command); $clientSpec = $this->getP4ClientSpec(); $fileSystem = $this->getFilesystem(); $fileSystem->remove($clientSpec); } protected function executeCommand($command) { $this->commandResult = ''; return $this->process->execute($command, $this->commandResult); } public function getClient() { if (!isset($this->p4Client)) { $cleanStreamName = str_replace(array('//', '/', '@'), array('', '_', ''), $this->getStream()); $this->p4Client = 'composer_perforce_' . $this->uniquePerforceClientName . '_' . $cleanStreamName; } return $this->p4Client; } protected function getPath() { return $this->path; } public function initializePath($path) { $this->path = $path; $fs = $this->getFilesystem(); $fs->ensureDirectoryExists($path); } protected function getPort() { return $this->p4Port; } public function setStream($stream) { $this->p4Stream = $stream; $index = strrpos($stream, '/'); //Stream format is //depot/stream, while non-streaming depot is //depot if ($index > 2) { $this->p4DepotType = 'stream'; } } public function isStream() { return (strcmp($this->p4DepotType, 'stream') === 0); } public function getStream() { if (!isset($this->p4Stream)) { if ($this->isStream()) { $this->p4Stream = '//' . $this->p4Depot . '/' . $this->p4Branch; } else { $this->p4Stream = '//' . $this->p4Depot; } } return $this->p4Stream; } public function getStreamWithoutLabel($stream) { $index = strpos($stream, '@'); if ($index === false) { return $stream; } return substr($stream, 0, $index); } public function getP4ClientSpec() { return $this->path . '/' . $this->getClient() . '.p4.spec'; } public function getUser() { return $this->p4User; } public function setUser($user) { $this->p4User = $user; } public function queryP4User() { $this->getUser(); if (strlen($this->p4User) > 0) { return; } $this->p4User = $this->getP4variable('P4USER'); if (strlen($this->p4User) > 0) { return; } $this->p4User = $this->io->ask('Enter P4 User:'); if ($this->windowsFlag) { $command = 'p4 set P4USER=' . $this->p4User; } else { $command = 'export P4USER=' . $this->p4User; } $this->executeCommand($command); } protected function getP4variable($name) { if ($this->windowsFlag) { $command = 'p4 set'; $this->executeCommand($command); $result = trim($this->commandResult); $resArray = explode(PHP_EOL, $result); foreach ($resArray as $line) { $fields = explode('=', $line); if (strcmp($name, $fields[0]) == 0) { $index = strpos($fields[1], ' '); if ($index === false) { $value = $fields[1]; } else { $value = substr($fields[1], 0, $index); } $value = trim($value); return $value; } } return null; } $command = 'echo $' . $name; $this->executeCommand($command); $result = trim($this->commandResult); return $result; } public function queryP4Password() { if (isset($this->p4Password)) { return $this->p4Password; } $password = $this->getP4variable('P4PASSWD'); if (strlen($password) <= 0) { $password = $this->io->askAndHideAnswer('Enter password for Perforce user ' . $this->getUser() . ': '); } $this->p4Password = $password; return $password; } public function generateP4Command($command, $useClient = true) { $p4Command = 'p4 '; $p4Command .= '-u ' . $this->getUser() . ' '; if ($useClient) { $p4Command .= '-c ' . $this->getClient() . ' '; } $p4Command = $p4Command . '-p ' . $this->getPort() . ' ' . $command; return $p4Command; } public function isLoggedIn() { $command = $this->generateP4Command('login -s', false); $exitCode = $this->executeCommand($command); if ($exitCode) { $errorOutput = $this->process->getErrorOutput(); $index = strpos($errorOutput, $this->getUser()); if ($index === false) { $index = strpos($errorOutput, 'p4'); if ($index === false) { return false; } throw new \Exception('p4 command not found in path: ' . $errorOutput); } throw new \Exception('Invalid user name: ' . $this->getUser()); } return true; } public function connectClient() { $p4CreateClientCommand = $this->generateP4Command( 'client -i < ' . str_replace(" ", "\\ ", $this->getP4ClientSpec()) ); $this->executeCommand($p4CreateClientCommand); } public function syncCodeBase($sourceReference) { $prevDir = getcwd(); chdir($this->path); $p4SyncCommand = $this->generateP4Command('sync -f '); if (null !== $sourceReference) { $p4SyncCommand .= '@' . $sourceReference; } $this->executeCommand($p4SyncCommand); chdir($prevDir); } public function writeClientSpecToFile($spec) { fwrite($spec, 'Client: ' . $this->getClient() . PHP_EOL . PHP_EOL); fwrite($spec, 'Update: ' . date('Y/m/d H:i:s') . PHP_EOL . PHP_EOL); fwrite($spec, 'Access: ' . date('Y/m/d H:i:s') . PHP_EOL); fwrite($spec, 'Owner: ' . $this->getUser() . PHP_EOL . PHP_EOL); fwrite($spec, 'Description:' . PHP_EOL); fwrite($spec, ' Created by ' . $this->getUser() . ' from composer.' . PHP_EOL . PHP_EOL); fwrite($spec, 'Root: ' . $this->getPath() . PHP_EOL . PHP_EOL); fwrite($spec, 'Options: noallwrite noclobber nocompress unlocked modtime rmdir' . PHP_EOL . PHP_EOL); fwrite($spec, 'SubmitOptions: revertunchanged' . PHP_EOL . PHP_EOL); fwrite($spec, 'LineEnd: local' . PHP_EOL . PHP_EOL); if ($this->isStream()) { fwrite($spec, 'Stream:' . PHP_EOL); fwrite($spec, ' ' . $this->getStreamWithoutLabel($this->p4Stream) . PHP_EOL); } else { fwrite( $spec, 'View: ' . $this->getStream() . '/... //' . $this->getClient() . '/... ' . PHP_EOL ); } } public function writeP4ClientSpec() { $clientSpec = $this->getP4ClientSpec(); $spec = fopen($clientSpec, 'w'); try { $this->writeClientSpecToFile($spec); } catch (\Exception $e) { fclose($spec); throw $e; } fclose($spec); } protected function read($pipe, $name) { if (feof($pipe)) { return; } $line = fgets($pipe); while ($line !== false) { $line = fgets($pipe); } } public function windowsLogin($password) { $command = $this->generateP4Command(' login -a'); // TODO in v3 generate command as an array if (method_exists('Symfony\Component\Process\Process', 'fromShellCommandline')) { $process = Process::fromShellCommandline($command, null, null, $password); } else { $process = new Process($command, null, null, $password); } return $process->run(); } public function p4Login() { $this->queryP4User(); if (!$this->isLoggedIn()) { $password = $this->queryP4Password(); if ($this->windowsFlag) { $this->windowsLogin($password); } else { $command = 'echo ' . ProcessExecutor::escape($password) . ' | ' . $this->generateP4Command(' login -a', false); $exitCode = $this->executeCommand($command); $result = trim($this->commandResult); if ($exitCode) { throw new \Exception("Error logging in:" . $this->process->getErrorOutput()); } } } } public function getComposerInformation($identifier) { $composerFileContent = $this->getFileContent('composer.json', $identifier); if (!$composerFileContent) { return; } return json_decode($composerFileContent, true); } public function getFileContent($file, $identifier) { $path = $this->getFilePath($file, $identifier); $command = $this->generateP4Command(' print ' . ProcessExecutor::escape($path)); $this->executeCommand($command); $result = $this->commandResult; if (!trim($result)) { return null; } return $result; } public function getFilePath($file, $identifier) { $index = strpos($identifier, '@'); if ($index === false) { $path = $identifier. '/' . $file; return $path; } $path = substr($identifier, 0, $index) . '/' . $file . substr($identifier, $index); $command = $this->generateP4Command(' files ' . ProcessExecutor::escape($path), false); $this->executeCommand($command); $result = $this->commandResult; $index2 = strpos($result, 'no such file(s).'); if ($index2 === false) { $index3 = strpos($result, 'change'); if ($index3 !== false) { $phrase = trim(substr($result, $index3)); $fields = explode(' ', $phrase); return substr($identifier, 0, $index) . '/' . $file . '@' . $fields[1]; } } return null; } public function getBranches() { $possibleBranches = array(); if (!$this->isStream()) { $possibleBranches[$this->p4Branch] = $this->getStream(); } else { $command = $this->generateP4Command('streams '.ProcessExecutor::escape('//' . $this->p4Depot . '/...')); $this->executeCommand($command); $result = $this->commandResult; $resArray = explode(PHP_EOL, $result); foreach ($resArray as $line) { $resBits = explode(' ', $line); if (count($resBits) > 4) { $branch = preg_replace('/[^A-Za-z0-9 ]/', '', $resBits[4]); $possibleBranches[$branch] = $resBits[1]; } } } $command = $this->generateP4Command('changes '. ProcessExecutor::escape($this->getStream() . '/...'), false); $this->executeCommand($command); $result = $this->commandResult; $resArray = explode(PHP_EOL, $result); $lastCommit = $resArray[0]; $lastCommitArr = explode(' ', $lastCommit); $lastCommitNum = $lastCommitArr[1]; $branches = array('master' => $possibleBranches[$this->p4Branch] . '@'. $lastCommitNum); return $branches; } public function getTags() { $command = $this->generateP4Command('labels'); $this->executeCommand($command); $result = $this->commandResult; $resArray = explode(PHP_EOL, $result); $tags = array(); foreach ($resArray as $line) { if (strpos($line, 'Label') !== false) { $fields = explode(' ', $line); $tags[$fields[1]] = $this->getStream() . '@' . $fields[1]; } } return $tags; } public function checkStream() { $command = $this->generateP4Command('depots', false); $this->executeCommand($command); $result = $this->commandResult; $resArray = explode(PHP_EOL, $result); foreach ($resArray as $line) { if (strpos($line, 'Depot') !== false) { $fields = explode(' ', $line); if (strcmp($this->p4Depot, $fields[1]) === 0) { $this->p4DepotType = $fields[3]; return $this->isStream(); } } } return false; } /** * @param string $reference * @return mixed|null */ protected function getChangeList($reference) { $index = strpos($reference, '@'); if ($index === false) { return null; } $label = substr($reference, $index); $command = $this->generateP4Command(' changes -m1 ' . ProcessExecutor::escape($label)); $this->executeCommand($command); $changes = $this->commandResult; if (strpos($changes, 'Change') !== 0) { return null; } $fields = explode(' ', $changes); return $fields[1]; } /** * @param string $fromReference * @param string $toReference * @return mixed|null */ public function getCommitLogs($fromReference, $toReference) { $fromChangeList = $this->getChangeList($fromReference); if ($fromChangeList === null) { return null; } $toChangeList = $this->getChangeList($toReference); if ($toChangeList === null) { return null; } $index = strpos($fromReference, '@'); $main = substr($fromReference, 0, $index) . '/...'; $command = $this->generateP4Command('filelog ' . ProcessExecutor::escape($main . '@' . $fromChangeList. ',' . $toChangeList)); $this->executeCommand($command); return $this->commandResult; } public function getFilesystem() { if (empty($this->filesystem)) { $this->filesystem = new Filesystem($this->process); } return $this->filesystem; } public function setFilesystem(Filesystem $fs) { $this->filesystem = $fs; } } composer/src/Composer/Util/NoProxyPattern.php 0000644 00000024673 14736103146 0015374 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util; use stdClass; /** * Tests URLs against NO_PROXY patterns */ class NoProxyPattern { /** * @var string[] */ protected $hostNames = array(); /** * @var object[] */ protected $rules = array(); /** * @var bool */ protected $noproxy; /** * @param string $pattern NO_PROXY pattern */ public function __construct($pattern) { $this->hostNames = preg_split('{[\s,]+}', $pattern, null, PREG_SPLIT_NO_EMPTY); $this->noproxy = empty($this->hostNames) || '*' === $this->hostNames[0]; } /** * Returns true if a URL matches the NO_PROXY pattern * * @param string $url * * @return bool */ public function test($url) { if ($this->noproxy) { return true; } if (!$urlData = $this->getUrlData($url)) { return false; } foreach ($this->hostNames as $index => $hostName) { if ($this->match($index, $hostName, $urlData)) { return true; } } return false; } /** * Returns false is the url cannot be parsed, otherwise a data object * * @param string $url * * @return bool|stdclass */ protected function getUrlData($url) { if (!$host = parse_url($url, PHP_URL_HOST)) { return false; } $port = parse_url($url, PHP_URL_PORT); if (empty($port)) { switch (parse_url($url, PHP_URL_SCHEME)) { case 'http': $port = 80; break; case 'https': $port = 443; break; } } $hostName = $host . ($port ? ':' . $port : ''); list($host, $port, $err) = $this->splitHostPort($hostName); if ($err || !$this->ipCheckData($host, $ipdata)) { return false; } return $this->makeData($host, $port, $ipdata); } /** * Returns true if the url is matched by a rule * * @param int $index * @param string $hostName * @param string $url * * @return bool */ protected function match($index, $hostName, $url) { if (!$rule = $this->getRule($index, $hostName)) { // Data must have been misformatted return false; } if ($rule->ipdata) { // Match ipdata first if (!$url->ipdata) { return false; } if ($rule->ipdata->netmask) { return $this->matchRange($rule->ipdata, $url->ipdata); } $match = $rule->ipdata->ip === $url->ipdata->ip; } else { // Match host and port $haystack = substr($url->name, - strlen($rule->name)); $match = stripos($haystack, $rule->name) === 0; } if ($match && $rule->port) { $match = $rule->port === $url->port; } return $match; } /** * Returns true if the target ip is in the network range * * @param stdClass $network * @param stdClass $target * * @return bool */ protected function matchRange(stdClass $network, stdClass $target) { $net = unpack('C*', $network->ip); $mask = unpack('C*', $network->netmask); $ip = unpack('C*', $target->ip); for ($i = 1; $i < 17; ++$i) { if (($net[$i] & $mask[$i]) !== ($ip[$i] & $mask[$i])) { return false; } } return true; } /** * Finds or creates rule data for a hostname * * @param int $index * @param string $hostName * * @return {null|stdClass} Null if the hostname is invalid */ private function getRule($index, $hostName) { if (array_key_exists($index, $this->rules)) { return $this->rules[$index]; } $this->rules[$index] = null; list($host, $port, $err) = $this->splitHostPort($hostName); if ($err || !$this->ipCheckData($host, $ipdata, true)) { return null; } $this->rules[$index] = $this->makeData($host, $port, $ipdata); return $this->rules[$index]; } /** * Creates an object containing IP data if the host is an IP address * * @param string $host * @param null|stdclass $ipdata Set by method if IP address found * @param bool $allowPrefix Whether a CIDR prefix-length is expected * * @return bool False if the host contains invalid data */ private function ipCheckData($host, &$ipdata, $allowPrefix = false) { $ipdata = null; $netmask = null; $prefix = null; $modified = false; // Check for a CIDR prefix-length if (strpos($host, '/') !== false) { list($host, $prefix) = explode('/', $host); if (!$allowPrefix || !$this->validateInt($prefix, 0, 128)) { return false; } $prefix = (int) $prefix; $modified = true; } // See if this is an ip address if (!filter_var($host, FILTER_VALIDATE_IP)) { return !$modified; } list($ip, $size) = $this->ipGetAddr($host); if ($prefix !== null) { // Check for a valid prefix if ($prefix > $size * 8) { return false; } list($ip, $netmask) = $this->ipGetNetwork($ip, $size, $prefix); } $ipdata = $this->makeIpData($ip, $size, $netmask); return true; } /** * Returns an array of the IP in_addr and its byte size * * IPv4 addresses are always mapped to IPv6, which simplifies handling * and comparison. * * @param string $host * * @return mixed[] in_addr, size */ private function ipGetAddr($host) { $ip = inet_pton($host); $size = strlen($ip); $mapped = $this->ipMapTo6($ip, $size); return array($mapped, $size); } /** * Returns the binary network mask mapped to IPv6 * * @param string $prefix CIDR prefix-length * @param int $size Byte size of in_addr * * @return string */ private function ipGetMask($prefix, $size) { $mask = ''; if ($ones = floor($prefix / 8)) { $mask = str_repeat(chr(255), $ones); } if ($remainder = $prefix % 8) { $mask .= chr(0xff ^ (0xff >> $remainder)); } $mask = str_pad($mask, $size, chr(0)); return $this->ipMapTo6($mask, $size); } /** * Calculates and returns the network and mask * * @param string $rangeIp IP in_addr * @param int $size Byte size of in_addr * @param string $prefix CIDR prefix-length * * @return string[] network in_addr, binary mask */ private function ipGetNetwork($rangeIp, $size, $prefix) { $netmask = $this->ipGetMask($prefix, $size); // Get the network from the address and mask $mask = unpack('C*', $netmask); $ip = unpack('C*', $rangeIp); $net = ''; for ($i = 1; $i < 17; ++$i) { $net .= chr($ip[$i] & $mask[$i]); } return array($net, $netmask); } /** * Maps an IPv4 address to IPv6 * * @param string $binary in_addr * @param int $size Byte size of in_addr * * @return string Mapped or existing in_addr */ private function ipMapTo6($binary, $size) { if ($size === 4) { $prefix = str_repeat(chr(0), 10) . str_repeat(chr(255), 2); $binary = $prefix . $binary; } return $binary; } /** * Creates a rule data object * * @param string $host * @param int $port * @param null|stdclass $ipdata * * @return stdclass */ private function makeData($host, $port, $ipdata) { return (object) array( 'host' => $host, 'name' => '.' . ltrim($host, '.'), 'port' => $port, 'ipdata' => $ipdata, ); } /** * Creates an ip data object * * @param string $ip in_addr * @param int $size Byte size of in_addr * @param null|string $netmask Network mask * * @return stdclass */ private function makeIpData($ip, $size, $netmask) { return (object) array( 'ip' => $ip, 'size' => $size, 'netmask' => $netmask, ); } /** * Splits the hostname into host and port components * * @param string $hostName * * @return mixed[] host, port, if there was error */ private function splitHostPort($hostName) { // host, port, err $error = array('', '', true); $port = 0; $ip6 = ''; // Check for square-bracket notation if ($hostName[0] === '[') { $index = strpos($hostName, ']'); // The smallest ip6 address is :: if (false === $index || $index < 3) { return $error; } $ip6 = substr($hostName, 1, $index - 1); $hostName = substr($hostName, $index + 1); if (strpbrk($hostName, '[]') !== false || substr_count($hostName, ':') > 1) { return $error; } } if (substr_count($hostName, ':') === 1) { $index = strpos($hostName, ':'); $port = substr($hostName, $index + 1); $hostName = substr($hostName, 0, $index); if (!$this->validateInt($port, 1, 65535)) { return $error; } $port = (int) $port; } $host = $ip6 . $hostName; return array($host, $port, false); } /** * Wrapper around filter_var FILTER_VALIDATE_INT * * @param string $int * @param int $min * @param int $max */ private function validateInt($int, $min, $max) { $options = array( 'options' => array( 'min_range' => $min, 'max_range' => $max) ); return false !== filter_var($int, FILTER_VALIDATE_INT, $options); } } composer/src/Composer/Util/ComposerMirror.php 0000644 00000003373 14736103146 0015374 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util; /** * Composer mirror utilities * * @author Jordi Boggiano <j.boggiano@seld.be> */ class ComposerMirror { public static function processUrl($mirrorUrl, $packageName, $version, $reference, $type) { if ($reference) { $reference = preg_match('{^([a-f0-9]*|%reference%)$}', $reference) ? $reference : md5($reference); } $version = strpos($version, '/') === false ? $version : md5($version); return str_replace( array('%package%', '%version%', '%reference%', '%type%'), array($packageName, $version, $reference, $type), $mirrorUrl ); } public static function processGitUrl($mirrorUrl, $packageName, $url, $type) { if (preg_match('#^(?:(?:https?|git)://github\.com/|git@github\.com:)([^/]+)/(.+?)(?:\.git)?$#', $url, $match)) { $url = 'gh-'.$match[1].'/'.$match[2]; } elseif (preg_match('#^https://bitbucket\.org/([^/]+)/(.+?)(?:\.git)?/?$#', $url, $match)) { $url = 'bb-'.$match[1].'/'.$match[2]; } else { $url = preg_replace('{[^a-z0-9_.-]}i', '-', trim($url, '/')); } return str_replace( array('%package%', '%normalizedUrl%', '%type%'), array($packageName, $url, $type), $mirrorUrl ); } public static function processHgUrl($mirrorUrl, $packageName, $url, $type) { return self::processGitUrl($mirrorUrl, $packageName, $url, $type); } } composer/src/Composer/Util/Zip.php 0000644 00000005616 14736103146 0013156 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util; /** * @author Andreas Schempp <andreas.schempp@terminal42.ch> */ class Zip { /** * Gets content of the root composer.json inside a ZIP archive. * * @param string $pathToZip * * @return string|null */ public static function getComposerJson($pathToZip) { if (!extension_loaded('zip')) { throw new \RuntimeException('The Zip Util requires PHP\'s zip extension'); } $zip = new \ZipArchive(); if ($zip->open($pathToZip) !== true) { return null; } if (0 == $zip->numFiles) { $zip->close(); return null; } $foundFileIndex = self::locateFile($zip, 'composer.json'); if (false === $foundFileIndex) { $zip->close(); return null; } $content = null; $configurationFileName = $zip->getNameIndex($foundFileIndex); $stream = $zip->getStream($configurationFileName); if (false !== $stream) { $content = stream_get_contents($stream); } $zip->close(); return $content; } /** * Find a file by name, returning the one that has the shortest path. * * @param \ZipArchive $zip * @param string $filename * * @return bool|int */ private static function locateFile(\ZipArchive $zip, $filename) { $indexOfShortestMatch = false; $lengthOfShortestMatch = -1; for ($i = 0; $i < $zip->numFiles; $i++) { $stat = $zip->statIndex($i); if (strcmp(basename($stat['name']), $filename) === 0) { $directoryName = dirname($stat['name']); if ($directoryName === '.') { //if composer.json is in root directory //it has to be the one to use. return $i; } if (strpos($directoryName, '\\') !== false || strpos($directoryName, '/') !== false) { //composer.json files below first directory are rejected continue; } $length = strlen($stat['name']); if ($indexOfShortestMatch === false || $length < $lengthOfShortestMatch) { //Check it's not a directory. $contents = $zip->getFromIndex($i); if ($contents !== false) { $indexOfShortestMatch = $i; $lengthOfShortestMatch = $length; } } } } return $indexOfShortestMatch; } } composer/src/Composer/Util/GitLab.php 0000644 00000013464 14736103146 0013556 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util; use Composer\IO\IOInterface; use Composer\Config; use Composer\Factory; use Composer\Downloader\TransportException; use Composer\Json\JsonFile; /** * @author Roshan Gautam <roshan.gautam@hotmail.com> */ class GitLab { protected $io; protected $config; protected $process; protected $remoteFilesystem; /** * Constructor. * * @param IOInterface $io The IO instance * @param Config $config The composer configuration * @param ProcessExecutor $process Process instance, injectable for mocking * @param RemoteFilesystem $remoteFilesystem Remote Filesystem, injectable for mocking */ public function __construct(IOInterface $io, Config $config, ProcessExecutor $process = null, RemoteFilesystem $remoteFilesystem = null) { $this->io = $io; $this->config = $config; $this->process = $process ?: new ProcessExecutor($io); $this->remoteFilesystem = $remoteFilesystem ?: Factory::createRemoteFilesystem($this->io, $config); } /** * Attempts to authorize a GitLab domain via OAuth. * * @param string $originUrl The host this GitLab instance is located at * * @return bool true on success */ public function authorizeOAuth($originUrl) { // before composer 1.9, origin URLs had no port number in them $bcOriginUrl = preg_replace('{:\d+}', '', $originUrl); if (!in_array($originUrl, $this->config->get('gitlab-domains'), true) && !in_array($bcOriginUrl, $this->config->get('gitlab-domains'), true)) { return false; } // if available use token from git config if (0 === $this->process->execute('git config gitlab.accesstoken', $output)) { $this->io->setAuthentication($originUrl, trim($output), 'oauth2'); return true; } // if available use token from composer config $authTokens = $this->config->get('gitlab-token'); if (isset($authTokens[$originUrl])) { $this->io->setAuthentication($originUrl, $authTokens[$originUrl], 'private-token'); return true; } if (isset($authTokens[$bcOriginUrl])) { $this->io->setAuthentication($originUrl, $authTokens[$bcOriginUrl], 'private-token'); return true; } return false; } /** * Authorizes a GitLab domain interactively via OAuth. * * @param string $scheme Scheme used in the origin URL * @param string $originUrl The host this GitLab instance is located at * @param string $message The reason this authorization is required * * @throws \RuntimeException * @throws TransportException|\Exception * * @return bool true on success */ public function authorizeOAuthInteractively($scheme, $originUrl, $message = null) { if ($message) { $this->io->writeError($message); } $this->io->writeError(sprintf('A token will be created and stored in "%s", your password will never be stored', $this->config->getAuthConfigSource()->getName())); $this->io->writeError('To revoke access to this token you can visit '.$originUrl.'/profile/applications'); $attemptCounter = 0; while ($attemptCounter++ < 5) { try { $response = $this->createToken($scheme, $originUrl); } catch (TransportException $e) { // 401 is bad credentials, // 403 is max login attempts exceeded if (in_array($e->getCode(), array(403, 401))) { if (401 === $e->getCode()) { $this->io->writeError('Bad credentials.'); } else { $this->io->writeError('Maximum number of login attempts exceeded. Please try again later.'); } $this->io->writeError('You can also manually create a personal token at '.$scheme.'://'.$originUrl.'/profile/personal_access_tokens'); $this->io->writeError('Add it using "composer config --global --auth gitlab-token.'.$originUrl.' <token>"'); continue; } throw $e; } $this->io->setAuthentication($originUrl, $response['access_token'], 'oauth2'); // store value in user config in auth file $this->config->getAuthConfigSource()->addConfigSetting('gitlab-oauth.'.$originUrl, $response['access_token']); return true; } throw new \RuntimeException('Invalid GitLab credentials 5 times in a row, aborting.'); } private function createToken($scheme, $originUrl) { $username = $this->io->ask('Username: '); $password = $this->io->askAndHideAnswer('Password: '); $headers = array('Content-Type: application/x-www-form-urlencoded'); $apiUrl = $originUrl; $data = http_build_query(array( 'username' => $username, 'password' => $password, 'grant_type' => 'password', ), null, '&'); $options = array( 'retry-auth-failure' => false, 'http' => array( 'method' => 'POST', 'header' => $headers, 'content' => $data, ), ); $json = $this->remoteFilesystem->getContents($originUrl, $scheme.'://'.$apiUrl.'/oauth/token', false, $options); $this->io->writeError('Token successfully created'); return JsonFile::parseJson($json); } } composer/src/Composer/Util/IniHelper.php 0000644 00000003140 14736103146 0014261 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util; use Composer\XdebugHandler\XdebugHandler; /** * Provides ini file location functions that work with and without a restart. * When the process has restarted it uses a tmp ini and stores the original * ini locations in an environment variable. * * @author John Stevenson <john-stevenson@blueyonder.co.uk> */ class IniHelper { /** * Returns an array of php.ini locations with at least one entry * * The equivalent of calling php_ini_loaded_file then php_ini_scanned_files. * The loaded ini location is the first entry and may be empty. * * @return array */ public static function getAll() { return XdebugHandler::getAllIniFiles(); } /** * Describes the location of the loaded php.ini file(s) * * @return string */ public static function getMessage() { $paths = self::getAll(); if (empty($paths[0])) { array_shift($paths); } $ini = array_shift($paths); if (empty($ini)) { return 'A php.ini file does not exist. You will have to create one.'; } if (!empty($paths)) { return 'Your command-line PHP is using multiple ini files. Run `php --ini` to show them.'; } return 'The php.ini used by your command-line PHP is: '.$ini; } } composer/src/Composer/Util/PackageSorter.php 0000644 00000004634 14736103146 0015145 0 ustar 00 <?php namespace Composer\Util; use Composer\Package\Link; use Composer\Package\PackageInterface; class PackageSorter { /** * Sorts packages by dependency weight * * Packages of equal weight retain the original order * * @param array $packages * @return array */ public static function sortPackages(array $packages) { $usageList = array(); foreach ($packages as $package) { /** @var PackageInterface $package */ foreach (array_merge($package->getRequires(), $package->getDevRequires()) as $link) { /** @var Link $link */ $target = $link->getTarget(); $usageList[$target][] = $package->getName(); } } $computing = array(); $computed = array(); $computeImportance = function ($name) use (&$computeImportance, &$computing, &$computed, $usageList) { // reusing computed importance if (isset($computed[$name])) { return $computed[$name]; } // canceling circular dependency if (isset($computing[$name])) { return 0; } $computing[$name] = true; $weight = 0; if (isset($usageList[$name])) { foreach ($usageList[$name] as $user) { $weight -= 1 - $computeImportance($user); } } unset($computing[$name]); $computed[$name] = $weight; return $weight; }; $weightList = array(); foreach ($packages as $name => $package) { $weight = $computeImportance($name); $weightList[$name] = $weight; } $stable_sort = function (&$array) { static $transform, $restore; $i = 0; if (!$transform) { $transform = function (&$v, $k) use (&$i) { $v = array($v, ++$i, $k, $v); }; $restore = function (&$v) { $v = $v[3]; }; } array_walk($array, $transform); asort($array); array_walk($array, $restore); }; $stable_sort($weightList); $sortedPackages = array(); foreach (array_keys($weightList) as $name) { $sortedPackages[] = $packages[$name]; } return $sortedPackages; } } composer/src/Composer/Util/Git.php 0000644 00000043037 14736103146 0013136 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util; use Composer\Config; use Composer\IO\IOInterface; /** * @author Jordi Boggiano <j.boggiano@seld.be> */ class Git { private static $version; /** @var IOInterface */ protected $io; /** @var Config */ protected $config; /** @var ProcessExecutor */ protected $process; /** @var Filesystem */ protected $filesystem; public function __construct(IOInterface $io, Config $config, ProcessExecutor $process, Filesystem $fs) { $this->io = $io; $this->config = $config; $this->process = $process; $this->filesystem = $fs; } public function runCommand($commandCallable, $url, $cwd, $initialClone = false) { // Ensure we are allowed to use this URL by config $this->config->prohibitUrlByConfig($url, $this->io); if ($initialClone) { $origCwd = $cwd; $cwd = null; } if (preg_match('{^ssh://[^@]+@[^:]+:[^0-9]+}', $url)) { throw new \InvalidArgumentException('The source URL ' . $url . ' is invalid, ssh URLs should have a port number after ":".' . "\n" . 'Use ssh://git@example.com:22/path or just git@example.com:path if you do not want to provide a password or custom port.'); } if (!$initialClone) { // capture username/password from URL if there is one and we have no auth configured yet $this->process->execute('git remote -v', $output, $cwd); if (preg_match('{^(?:composer|origin)\s+https?://(.+):(.+)@([^/]+)}im', $output, $match) && !$this->io->hasAuthentication($match[3])) { $this->io->setAuthentication($match[3], rawurldecode($match[1]), rawurldecode($match[2])); } } $protocols = $this->config->get('github-protocols'); if (!is_array($protocols)) { throw new \RuntimeException('Config value "github-protocols" must be an array, got ' . gettype($protocols)); } // public github, autoswitch protocols if (preg_match('{^(?:https?|git)://' . self::getGitHubDomainsRegex($this->config) . '/(.*)}', $url, $match)) { $messages = array(); foreach ($protocols as $protocol) { if ('ssh' === $protocol) { $protoUrl = "git@" . $match[1] . ":" . $match[2]; } else { $protoUrl = $protocol . "://" . $match[1] . "/" . $match[2]; } if (0 === $this->process->execute(call_user_func($commandCallable, $protoUrl), $ignoredOutput, $cwd)) { return; } $messages[] = '- ' . $protoUrl . "\n" . preg_replace('#^#m', ' ', $this->process->getErrorOutput()); if ($initialClone) { $this->filesystem->removeDirectory($origCwd); } } // failed to checkout, first check git accessibility if (!$this->io->hasAuthentication($match[1]) && !$this->io->isInteractive()) { $this->throwException('Failed to clone ' . $url . ' via ' . implode(', ', $protocols) . ' protocols, aborting.' . "\n\n" . implode("\n", $messages), $url); } } // if we have a private github url and the ssh protocol is disabled then we skip it and directly fallback to https $bypassSshForGitHub = preg_match('{^git@' . self::getGitHubDomainsRegex($this->config) . ':(.+?)\.git$}i', $url) && !in_array('ssh', $protocols, true); $command = call_user_func($commandCallable, $url); $auth = null; if ($bypassSshForGitHub || 0 !== $this->process->execute($command, $ignoredOutput, $cwd)) { $errorMsg = $this->process->getErrorOutput(); // private github repository without ssh key access, try https with auth if (preg_match('{^git@' . self::getGitHubDomainsRegex($this->config) . ':(.+?)\.git$}i', $url, $match) || preg_match('{^https?://' . self::getGitHubDomainsRegex($this->config) . '/(.*)}', $url, $match) ) { if (!$this->io->hasAuthentication($match[1])) { $gitHubUtil = new GitHub($this->io, $this->config, $this->process); $message = 'Cloning failed using an ssh key for authentication, enter your GitHub credentials to access private repos'; if (!$gitHubUtil->authorizeOAuth($match[1]) && $this->io->isInteractive()) { $gitHubUtil->authorizeOAuthInteractively($match[1], $message); } } if ($this->io->hasAuthentication($match[1])) { $auth = $this->io->getAuthentication($match[1]); $authUrl = 'https://' . rawurlencode($auth['username']) . ':' . rawurlencode($auth['password']) . '@' . $match[1] . '/' . $match[2] . '.git'; $command = call_user_func($commandCallable, $authUrl); if (0 === $this->process->execute($command, $ignoredOutput, $cwd)) { return; } $errorMsg = $this->process->getErrorOutput(); } } elseif (preg_match('{^https://(bitbucket\.org)/(.*)(\.git)?$}U', $url, $match)) { //bitbucket oauth $bitbucketUtil = new Bitbucket($this->io, $this->config, $this->process); if (!$this->io->hasAuthentication($match[1])) { $message = 'Enter your Bitbucket credentials to access private repos'; if (!$bitbucketUtil->authorizeOAuth($match[1]) && $this->io->isInteractive()) { $bitbucketUtil->authorizeOAuthInteractively($match[1], $message); $accessToken = $bitbucketUtil->getToken(); $this->io->setAuthentication($match[1], 'x-token-auth', $accessToken); } } else { //We're authenticating with a locally stored consumer. $auth = $this->io->getAuthentication($match[1]); //We already have an access_token from a previous request. if ($auth['username'] !== 'x-token-auth') { $accessToken = $bitbucketUtil->requestToken($match[1], $auth['username'], $auth['password']); if (! empty($accessToken)) { $this->io->setAuthentication($match[1], 'x-token-auth', $accessToken); } } } if ($this->io->hasAuthentication($match[1])) { $auth = $this->io->getAuthentication($match[1]); $authUrl = 'https://' . rawurlencode($auth['username']) . ':' . rawurlencode($auth['password']) . '@' . $match[1] . '/' . $match[2] . '.git'; $command = call_user_func($commandCallable, $authUrl); if (0 === $this->process->execute($command, $ignoredOutput, $cwd)) { return; } $errorMsg = $this->process->getErrorOutput(); } else { // Falling back to ssh $sshUrl = 'git@bitbucket.org:' . $match[2] . '.git'; $this->io->writeError(' No bitbucket authentication configured. Falling back to ssh.'); $command = call_user_func($commandCallable, $sshUrl); if (0 === $this->process->execute($command, $ignoredOutput, $cwd)) { return; } $errorMsg = $this->process->getErrorOutput(); } } elseif ( preg_match('{^(git)@' . self::getGitLabDomainsRegex($this->config) . ':(.+?\.git)$}i', $url, $match) || preg_match('{^(https?)://' . self::getGitLabDomainsRegex($this->config) . '/(.*)}', $url, $match) ) { if ($match[1] === 'git') { $match[1] = 'https'; } if (!$this->io->hasAuthentication($match[2])) { $gitLabUtil = new GitLab($this->io, $this->config, $this->process); $message = 'Cloning failed, enter your GitLab credentials to access private repos'; if (!$gitLabUtil->authorizeOAuth($match[2]) && $this->io->isInteractive()) { $gitLabUtil->authorizeOAuthInteractively($match[1], $match[2], $message); } } if ($this->io->hasAuthentication($match[2])) { $auth = $this->io->getAuthentication($match[2]); if ($auth['password'] === 'private-token' || $auth['password'] === 'oauth2' || $auth['password'] === 'gitlab-ci-token') { $authUrl = $match[1] . '://' . rawurlencode($auth['password']) . ':' . rawurlencode($auth['username']) . '@' . $match[2] . '/' . $match[3]; // swap username and password } else { $authUrl = $match[1] . '://' . rawurlencode($auth['username']) . ':' . rawurlencode($auth['password']) . '@' . $match[2] . '/' . $match[3]; } $command = call_user_func($commandCallable, $authUrl); if (0 === $this->process->execute($command, $ignoredOutput, $cwd)) { return; } $errorMsg = $this->process->getErrorOutput(); } } elseif ($this->isAuthenticationFailure($url, $match)) { // private non-github/gitlab/bitbucket repo that failed to authenticate if (strpos($match[2], '@')) { list($authParts, $match[2]) = explode('@', $match[2], 2); } $storeAuth = false; if ($this->io->hasAuthentication($match[2])) { $auth = $this->io->getAuthentication($match[2]); } elseif ($this->io->isInteractive()) { $defaultUsername = null; if (isset($authParts) && $authParts) { if (false !== strpos($authParts, ':')) { list($defaultUsername, ) = explode(':', $authParts, 2); } else { $defaultUsername = $authParts; } } $this->io->writeError(' Authentication required (<info>' . $match[2] . '</info>):'); $auth = array( 'username' => $this->io->ask(' Username: ', $defaultUsername), 'password' => $this->io->askAndHideAnswer(' Password: '), ); $storeAuth = $this->config->get('store-auths'); } if ($auth) { $authUrl = $match[1] . rawurlencode($auth['username']) . ':' . rawurlencode($auth['password']) . '@' . $match[2] . $match[3]; $command = call_user_func($commandCallable, $authUrl); if (0 === $this->process->execute($command, $ignoredOutput, $cwd)) { $this->io->setAuthentication($match[2], $auth['username'], $auth['password']); $authHelper = new AuthHelper($this->io, $this->config); $authHelper->storeAuth($match[2], $storeAuth); return; } $errorMsg = $this->process->getErrorOutput(); } } if ($initialClone) { $this->filesystem->removeDirectory($origCwd); } $this->throwException('Failed to execute ' . $command . "\n\n" . $errorMsg, $url); } } public function syncMirror($url, $dir) { // update the repo if it is a valid git repository if (is_dir($dir) && 0 === $this->process->execute('git rev-parse --git-dir', $output, $dir) && trim($output) === '.') { try { $commandCallable = function ($url) { $sanitizedUrl = preg_replace('{://([^@]+?):(.+?)@}', '://', $url); return sprintf('git remote set-url origin %s && git remote update --prune origin && git remote set-url origin %s', ProcessExecutor::escape($url), ProcessExecutor::escape($sanitizedUrl)); }; $this->runCommand($commandCallable, $url, $dir); } catch (\Exception $e) { $this->io->writeError('<error>Sync mirror failed: ' . $e->getMessage() . '</error>', true, IOInterface::DEBUG); return false; } return true; } // clean up directory and do a fresh clone into it $this->filesystem->removeDirectory($dir); $commandCallable = function ($url) use ($dir) { return sprintf('git clone --mirror %s %s', ProcessExecutor::escape($url), ProcessExecutor::escape($dir)); }; $this->runCommand($commandCallable, $url, $dir, true); return true; } public function fetchRefOrSyncMirror($url, $dir, $ref) { if ($this->checkRefIsInMirror($url, $dir, $ref)) { return true; } if ($this->syncMirror($url, $dir)) { return $this->checkRefIsInMirror($url, $dir, $ref); } return false; } private function checkRefIsInMirror($url, $dir, $ref) { if (is_dir($dir) && 0 === $this->process->execute('git rev-parse --git-dir', $output, $dir) && trim($output) === '.') { $escapedRef = ProcessExecutor::escape($ref.'^{commit}'); $exitCode = $this->process->execute(sprintf('git rev-parse --quiet --verify %s', $escapedRef), $ignoredOutput, $dir); if ($exitCode === 0) { return true; } } return false; } private function isAuthenticationFailure($url, &$match) { if (!preg_match('{^(https?://)([^/]+)(.*)$}i', $url, $match)) { return false; } $authFailures = array( 'fatal: Authentication failed', 'remote error: Invalid username or password.', 'error: 401 Unauthorized', 'fatal: unable to access', 'fatal: could not read Username', ); $errorOutput = $this->process->getErrorOutput(); foreach ($authFailures as $authFailure) { if (strpos($errorOutput, $authFailure) !== false) { return true; } } return false; } public static function cleanEnv() { if (PHP_VERSION_ID < 50400 && ini_get('safe_mode') && false === strpos(ini_get('safe_mode_allowed_env_vars'), 'GIT_ASKPASS')) { throw new \RuntimeException('safe_mode is enabled and safe_mode_allowed_env_vars does not contain GIT_ASKPASS, can not set env var. You can disable safe_mode with "-dsafe_mode=0" when running composer'); } // added in git 1.7.1, prevents prompting the user for username/password if (getenv('GIT_ASKPASS') !== 'echo') { putenv('GIT_ASKPASS=echo'); unset($_SERVER['GIT_ASKPASS']); } // clean up rogue git env vars in case this is running in a git hook if (getenv('GIT_DIR')) { putenv('GIT_DIR'); unset($_SERVER['GIT_DIR']); } if (getenv('GIT_WORK_TREE')) { putenv('GIT_WORK_TREE'); unset($_SERVER['GIT_WORK_TREE']); } // Run processes with predictable LANGUAGE if (getenv('LANGUAGE') !== 'C') { putenv('LANGUAGE=C'); } // clean up env for OSX, see https://github.com/composer/composer/issues/2146#issuecomment-35478940 putenv("DYLD_LIBRARY_PATH"); unset($_SERVER['DYLD_LIBRARY_PATH']); } public static function getGitHubDomainsRegex(Config $config) { return '(' . implode('|', array_map('preg_quote', $config->get('github-domains'))) . ')'; } public static function getGitLabDomainsRegex(Config $config) { return '(' . implode('|', array_map('preg_quote', $config->get('gitlab-domains'))) . ')'; } public static function sanitizeUrl($message) { return preg_replace_callback('{://(?P<user>[^@]+?):(?P<password>.+?)@}', function ($m) { if (preg_match('{^[a-f0-9]{12,}$}', $m[1])) { return '://***:***@'; } return '://' . $m[1] . ':***@'; }, $message); } private function throwException($message, $url) { // git might delete a directory when it fails and php will not know clearstatcache(); if (0 !== $this->process->execute('git --version', $ignoredOutput)) { throw new \RuntimeException(self::sanitizeUrl('Failed to clone ' . $url . ', git was not found, check that it is installed and in your PATH env.' . "\n\n" . $this->process->getErrorOutput())); } throw new \RuntimeException(self::sanitizeUrl($message)); } /** * Retrieves the current git version. * * @return string|null The git version number. */ public function getVersion() { if (isset(self::$version)) { return self::$version; } if (0 !== $this->process->execute('git --version', $output)) { return; } if (preg_match('/^git version (\d+(?:\.\d+)+)/m', $output, $matches)) { return self::$version = $matches[1]; } } } composer/src/Composer/Util/TlsHelper.php 0000644 00000014740 14736103146 0014314 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util; use Composer\CaBundle\CaBundle; /** * @author Chris Smith <chris@cs278.org> */ final class TlsHelper { /** * Match hostname against a certificate. * * @param mixed $certificate X.509 certificate * @param string $hostname Hostname in the URL * @param string $cn Set to the common name of the certificate iff match found * * @return bool */ public static function checkCertificateHost($certificate, $hostname, &$cn = null) { $names = self::getCertificateNames($certificate); if (empty($names)) { return false; } $combinedNames = array_merge($names['san'], array($names['cn'])); $hostname = strtolower($hostname); foreach ($combinedNames as $certName) { $matcher = self::certNameMatcher($certName); if ($matcher && $matcher($hostname)) { $cn = $names['cn']; return true; } } return false; } /** * Extract DNS names out of an X.509 certificate. * * @param mixed $certificate X.509 certificate * * @return array|null */ public static function getCertificateNames($certificate) { if (is_array($certificate)) { $info = $certificate; } elseif (CaBundle::isOpensslParseSafe()) { $info = openssl_x509_parse($certificate, false); } if (!isset($info['subject']['commonName'])) { return null; } $commonName = strtolower($info['subject']['commonName']); $subjectAltNames = array(); if (isset($info['extensions']['subjectAltName'])) { $subjectAltNames = preg_split('{\s*,\s*}', $info['extensions']['subjectAltName']); $subjectAltNames = array_filter(array_map(function ($name) { if (0 === strpos($name, 'DNS:')) { return strtolower(ltrim(substr($name, 4))); } return null; }, $subjectAltNames)); $subjectAltNames = array_values($subjectAltNames); } return array( 'cn' => $commonName, 'san' => $subjectAltNames, ); } /** * Get the certificate pin. * * By Kevin McArthur of StormTide Digital Studios Inc. * @KevinSMcArthur / https://github.com/StormTide * * See http://tools.ietf.org/html/draft-ietf-websec-key-pinning-02 * * This method was adapted from Sslurp. * https://github.com/EvanDotPro/Sslurp * * (c) Evan Coury <me@evancoury.com> * * For the full copyright and license information, please see below: * * Copyright (c) 2013, Evan Coury * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ public static function getCertificateFingerprint($certificate) { $pubkeydetails = openssl_pkey_get_details(openssl_get_publickey($certificate)); $pubkeypem = $pubkeydetails['key']; //Convert PEM to DER before SHA1'ing $start = '-----BEGIN PUBLIC KEY-----'; $end = '-----END PUBLIC KEY-----'; $pemtrim = substr($pubkeypem, strpos($pubkeypem, $start) + strlen($start), (strlen($pubkeypem) - strpos($pubkeypem, $end)) * (-1)); $der = base64_decode($pemtrim); return sha1($der); } /** * Test if it is safe to use the PHP function openssl_x509_parse(). * * This checks if OpenSSL extensions is vulnerable to remote code execution * via the exploit documented as CVE-2013-6420. * * @return bool */ public static function isOpensslParseSafe() { return CaBundle::isOpensslParseSafe(); } /** * Convert certificate name into matching function. * * @param string $certName CN/SAN * * @return callable|void */ private static function certNameMatcher($certName) { $wildcards = substr_count($certName, '*'); if (0 === $wildcards) { // Literal match. return function ($hostname) use ($certName) { return $hostname === $certName; }; } if (1 === $wildcards) { $components = explode('.', $certName); if (3 > count($components)) { // Must have 3+ components return; } $firstComponent = $components[0]; // Wildcard must be the last character. if ('*' !== $firstComponent[strlen($firstComponent) - 1]) { return; } $wildcardRegex = preg_quote($certName); $wildcardRegex = str_replace('\\*', '[a-z0-9-]+', $wildcardRegex); $wildcardRegex = "{^{$wildcardRegex}$}"; return function ($hostname) use ($wildcardRegex) { return 1 === preg_match($wildcardRegex, $hostname); }; } } } composer/src/Composer/Util/Filesystem.php 0000644 00000053464 14736103146 0014544 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util; use RecursiveDirectoryIterator; use RecursiveIteratorIterator; use Symfony\Component\Filesystem\Exception\IOException; use Symfony\Component\Finder\Finder; /** * @author Jordi Boggiano <j.boggiano@seld.be> * @author Johannes M. Schmitt <schmittjoh@gmail.com> */ class Filesystem { private $processExecutor; public function __construct(ProcessExecutor $executor = null) { $this->processExecutor = $executor ?: new ProcessExecutor(); } public function remove($file) { if (is_dir($file)) { return $this->removeDirectory($file); } if (file_exists($file)) { return $this->unlink($file); } return false; } /** * Checks if a directory is empty * * @param string $dir * @return bool */ public function isDirEmpty($dir) { $finder = Finder::create() ->ignoreVCS(false) ->ignoreDotFiles(false) ->depth(0) ->in($dir); return count($finder) === 0; } public function emptyDirectory($dir, $ensureDirectoryExists = true) { if (file_exists($dir) && is_link($dir)) { $this->unlink($dir); } if ($ensureDirectoryExists) { $this->ensureDirectoryExists($dir); } if (is_dir($dir)) { $finder = Finder::create() ->ignoreVCS(false) ->ignoreDotFiles(false) ->depth(0) ->in($dir); foreach ($finder as $path) { $this->remove((string) $path); } } } /** * Recursively remove a directory * * Uses the process component if proc_open is enabled on the PHP * installation. * * @param string $directory * @throws \RuntimeException * @return bool */ public function removeDirectory($directory) { if ($this->isSymlinkedDirectory($directory)) { return $this->unlinkSymlinkedDirectory($directory); } if ($this->isJunction($directory)) { return $this->removeJunction($directory); } if (is_link($directory)) { return unlink($directory); } if (!file_exists($directory) || !is_dir($directory)) { return true; } if (preg_match('{^(?:[a-z]:)?[/\\\\]+$}i', $directory)) { throw new \RuntimeException('Aborting an attempted deletion of '.$directory.', this was probably not intended, if it is a real use case please report it.'); } if (!function_exists('proc_open')) { return $this->removeDirectoryPhp($directory); } if (Platform::isWindows()) { $cmd = sprintf('rmdir /S /Q %s', ProcessExecutor::escape(realpath($directory))); } else { $cmd = sprintf('rm -rf %s', ProcessExecutor::escape($directory)); } $result = $this->getProcess()->execute($cmd, $output) === 0; // clear stat cache because external processes aren't tracked by the php stat cache clearstatcache(); if ($result && !file_exists($directory)) { return true; } return $this->removeDirectoryPhp($directory); } /** * Recursively delete directory using PHP iterators. * * Uses a CHILD_FIRST RecursiveIteratorIterator to sort files * before directories, creating a single non-recursive loop * to delete files/directories in the correct order. * * @param string $directory * @return bool */ public function removeDirectoryPhp($directory) { try { $it = new RecursiveDirectoryIterator($directory, RecursiveDirectoryIterator::SKIP_DOTS); } catch (\UnexpectedValueException $e) { // re-try once after clearing the stat cache if it failed as it // sometimes fails without apparent reason, see https://github.com/composer/composer/issues/4009 clearstatcache(); usleep(100000); if (!is_dir($directory)) { return true; } $it = new RecursiveDirectoryIterator($directory, RecursiveDirectoryIterator::SKIP_DOTS); } $ri = new RecursiveIteratorIterator($it, RecursiveIteratorIterator::CHILD_FIRST); foreach ($ri as $file) { if ($file->isDir()) { $this->rmdir($file->getPathname()); } else { $this->unlink($file->getPathname()); } } return $this->rmdir($directory); } public function ensureDirectoryExists($directory) { if (!is_dir($directory)) { if (file_exists($directory)) { throw new \RuntimeException( $directory.' exists and is not a directory.' ); } if (!@mkdir($directory, 0777, true)) { throw new \RuntimeException( $directory.' does not exist and could not be created.' ); } } } /** * Attempts to unlink a file and in case of failure retries after 350ms on windows * * @param string $path * @throws \RuntimeException * @return bool */ public function unlink($path) { $unlinked = @$this->unlinkImplementation($path); if (!$unlinked) { // retry after a bit on windows since it tends to be touchy with mass removals if (Platform::isWindows()) { usleep(350000); $unlinked = @$this->unlinkImplementation($path); } if (!$unlinked) { $error = error_get_last(); $message = 'Could not delete '.$path.': ' . @$error['message']; if (Platform::isWindows()) { $message .= "\nThis can be due to an antivirus or the Windows Search Indexer locking the file while they are analyzed"; } throw new \RuntimeException($message); } } return true; } /** * Attempts to rmdir a file and in case of failure retries after 350ms on windows * * @param string $path * @throws \RuntimeException * @return bool */ public function rmdir($path) { $deleted = @rmdir($path); if (!$deleted) { // retry after a bit on windows since it tends to be touchy with mass removals if (Platform::isWindows()) { usleep(350000); $deleted = @rmdir($path); } if (!$deleted) { $error = error_get_last(); $message = 'Could not delete '.$path.': ' . @$error['message']; if (Platform::isWindows()) { $message .= "\nThis can be due to an antivirus or the Windows Search Indexer locking the file while they are analyzed"; } throw new \RuntimeException($message); } } return true; } /** * Copy then delete is a non-atomic version of {@link rename}. * * Some systems can't rename and also don't have proc_open, * which requires this solution. * * @param string $source * @param string $target */ public function copyThenRemove($source, $target) { $this->copy($source, $target); if (!is_dir($source)) { $this->unlink($source); return; } $this->removeDirectoryPhp($source); } /** * Copies a file or directory from $source to $target. * * @param string $source * @param string $target * @return bool */ public function copy($source, $target) { if (!is_dir($source)) { return copy($source, $target); } $it = new RecursiveDirectoryIterator($source, RecursiveDirectoryIterator::SKIP_DOTS); $ri = new RecursiveIteratorIterator($it, RecursiveIteratorIterator::SELF_FIRST); $this->ensureDirectoryExists($target); $result = true; foreach ($ri as $file) { $targetPath = $target . DIRECTORY_SEPARATOR . $ri->getSubPathName(); if ($file->isDir()) { $this->ensureDirectoryExists($targetPath); } else { $result = $result && copy($file->getPathname(), $targetPath); } } return $result; } public function rename($source, $target) { if (true === @rename($source, $target)) { return; } if (!function_exists('proc_open')) { $this->copyThenRemove($source, $target); return; } if (Platform::isWindows()) { // Try to copy & delete - this is a workaround for random "Access denied" errors. $command = sprintf('xcopy %s %s /E /I /Q /Y', ProcessExecutor::escape($source), ProcessExecutor::escape($target)); $result = $this->processExecutor->execute($command, $output); // clear stat cache because external processes aren't tracked by the php stat cache clearstatcache(); if (0 === $result) { $this->remove($source); return; } } else { // We do not use PHP's "rename" function here since it does not support // the case where $source, and $target are located on different partitions. $command = sprintf('mv %s %s', ProcessExecutor::escape($source), ProcessExecutor::escape($target)); $result = $this->processExecutor->execute($command, $output); // clear stat cache because external processes aren't tracked by the php stat cache clearstatcache(); if (0 === $result) { return; } } $this->copyThenRemove($source, $target); } /** * Returns the shortest path from $from to $to * * @param string $from * @param string $to * @param bool $directories if true, the source/target are considered to be directories * @throws \InvalidArgumentException * @return string */ public function findShortestPath($from, $to, $directories = false) { if (!$this->isAbsolutePath($from) || !$this->isAbsolutePath($to)) { throw new \InvalidArgumentException(sprintf('$from (%s) and $to (%s) must be absolute paths.', $from, $to)); } $from = lcfirst($this->normalizePath($from)); $to = lcfirst($this->normalizePath($to)); if ($directories) { $from = rtrim($from, '/') . '/dummy_file'; } if (dirname($from) === dirname($to)) { return './'.basename($to); } $commonPath = $to; while (strpos($from.'/', $commonPath.'/') !== 0 && '/' !== $commonPath && !preg_match('{^[a-z]:/?$}i', $commonPath)) { $commonPath = strtr(dirname($commonPath), '\\', '/'); } if (0 !== strpos($from, $commonPath) || '/' === $commonPath) { return $to; } $commonPath = rtrim($commonPath, '/') . '/'; $sourcePathDepth = substr_count(substr($from, strlen($commonPath)), '/'); $commonPathCode = str_repeat('../', $sourcePathDepth); return ($commonPathCode . substr($to, strlen($commonPath))) ?: './'; } /** * Returns PHP code that, when executed in $from, will return the path to $to * * @param string $from * @param string $to * @param bool $directories if true, the source/target are considered to be directories * @param bool $staticCode * @throws \InvalidArgumentException * @return string */ public function findShortestPathCode($from, $to, $directories = false, $staticCode = false) { if (!$this->isAbsolutePath($from) || !$this->isAbsolutePath($to)) { throw new \InvalidArgumentException(sprintf('$from (%s) and $to (%s) must be absolute paths.', $from, $to)); } $from = lcfirst($this->normalizePath($from)); $to = lcfirst($this->normalizePath($to)); if ($from === $to) { return $directories ? '__DIR__' : '__FILE__'; } $commonPath = $to; while (strpos($from.'/', $commonPath.'/') !== 0 && '/' !== $commonPath && !preg_match('{^[a-z]:/?$}i', $commonPath) && '.' !== $commonPath) { $commonPath = strtr(dirname($commonPath), '\\', '/'); } if (0 !== strpos($from, $commonPath) || '/' === $commonPath || '.' === $commonPath) { return var_export($to, true); } $commonPath = rtrim($commonPath, '/') . '/'; if (strpos($to, $from.'/') === 0) { return '__DIR__ . '.var_export(substr($to, strlen($from)), true); } $sourcePathDepth = substr_count(substr($from, strlen($commonPath)), '/') + $directories; if ($staticCode) { $commonPathCode = "__DIR__ . '".str_repeat('/..', $sourcePathDepth)."'"; } else { $commonPathCode = str_repeat('dirname(', $sourcePathDepth).'__DIR__'.str_repeat(')', $sourcePathDepth); } $relTarget = substr($to, strlen($commonPath)); return $commonPathCode . (strlen($relTarget) ? '.' . var_export('/' . $relTarget, true) : ''); } /** * Checks if the given path is absolute * * @param string $path * @return bool */ public function isAbsolutePath($path) { return substr($path, 0, 1) === '/' || substr($path, 1, 1) === ':' || substr($path, 0, 2) === '\\\\'; } /** * Returns size of a file or directory specified by path. If a directory is * given, it's size will be computed recursively. * * @param string $path Path to the file or directory * @throws \RuntimeException * @return int */ public function size($path) { if (!file_exists($path)) { throw new \RuntimeException("$path does not exist."); } if (is_dir($path)) { return $this->directorySize($path); } return filesize($path); } /** * Normalize a path. This replaces backslashes with slashes, removes ending * slash and collapses redundant separators and up-level references. * * @param string $path Path to the file or directory * @return string */ public function normalizePath($path) { $parts = array(); $path = strtr($path, '\\', '/'); $prefix = ''; $absolute = false; // extract a prefix being a protocol://, protocol:, protocol://drive: or simply drive: if (preg_match('{^( [0-9a-z]{2,}+: (?: // (?: [a-z]: )? )? | [a-z]: )}ix', $path, $match)) { $prefix = $match[1]; $path = substr($path, strlen($prefix)); } if (substr($path, 0, 1) === '/') { $absolute = true; $path = substr($path, 1); } $up = false; foreach (explode('/', $path) as $chunk) { if ('..' === $chunk && ($absolute || $up)) { array_pop($parts); $up = !(empty($parts) || '..' === end($parts)); } elseif ('.' !== $chunk && '' !== $chunk) { $parts[] = $chunk; $up = '..' !== $chunk; } } return $prefix.($absolute ? '/' : '').implode('/', $parts); } /** * Return if the given path is local * * @param string $path * @return bool */ public static function isLocalPath($path) { return (bool) preg_match('{^(file://(?!//)|/(?!/)|/?[a-z]:[\\\\/]|\.\.[\\\\/]|[a-z0-9_.-]+[\\\\/])}i', $path); } public static function getPlatformPath($path) { if (Platform::isWindows()) { $path = preg_replace('{^(?:file:///([a-z]):?/)}i', 'file://$1:/', $path); } return preg_replace('{^file://}i', '', $path); } protected function directorySize($directory) { $it = new RecursiveDirectoryIterator($directory, RecursiveDirectoryIterator::SKIP_DOTS); $ri = new RecursiveIteratorIterator($it, RecursiveIteratorIterator::CHILD_FIRST); $size = 0; foreach ($ri as $file) { if ($file->isFile()) { $size += $file->getSize(); } } return $size; } protected function getProcess() { return $this->processExecutor; } /** * delete symbolic link implementation (commonly known as "unlink()") * * symbolic links on windows which link to directories need rmdir instead of unlink * * @param string $path * * @return bool */ private function unlinkImplementation($path) { if (Platform::isWindows() && is_dir($path) && is_link($path)) { return rmdir($path); } return unlink($path); } /** * Creates a relative symlink from $link to $target * * @param string $target The path of the binary file to be symlinked * @param string $link The path where the symlink should be created * @return bool */ public function relativeSymlink($target, $link) { $cwd = getcwd(); $relativePath = $this->findShortestPath($link, $target); chdir(dirname($link)); $result = @symlink($relativePath, $link); chdir($cwd); return $result; } /** * return true if that directory is a symlink. * * @param string $directory * * @return bool */ public function isSymlinkedDirectory($directory) { if (!is_dir($directory)) { return false; } $resolved = $this->resolveSymlinkedDirectorySymlink($directory); return is_link($resolved); } /** * @param string $directory * * @return bool */ private function unlinkSymlinkedDirectory($directory) { $resolved = $this->resolveSymlinkedDirectorySymlink($directory); return $this->unlink($resolved); } /** * resolve pathname to symbolic link of a directory * * @param string $pathname directory path to resolve * * @return string resolved path to symbolic link or original pathname (unresolved) */ private function resolveSymlinkedDirectorySymlink($pathname) { if (!is_dir($pathname)) { return $pathname; } $resolved = rtrim($pathname, '/'); if (!strlen($resolved)) { return $pathname; } return $resolved; } /** * Creates an NTFS junction. * * @param string $target * @param string $junction */ public function junction($target, $junction) { if (!Platform::isWindows()) { throw new \LogicException(sprintf('Function %s is not available on non-Windows platform', __CLASS__)); } if (!is_dir($target)) { throw new IOException(sprintf('Cannot junction to "%s" as it is not a directory.', $target), 0, null, $target); } $cmd = sprintf( 'mklink /J %s %s', ProcessExecutor::escape(str_replace('/', DIRECTORY_SEPARATOR, $junction)), ProcessExecutor::escape(realpath($target)) ); if ($this->getProcess()->execute($cmd, $output) !== 0) { throw new IOException(sprintf('Failed to create junction to "%s" at "%s".', $target, $junction), 0, null, $target); } clearstatcache(true, $junction); } /** * Returns whether the target directory is a Windows NTFS Junction. * * We test if the path is a directory and not an ordinary link, then check * that the mode value returned from lstat (which gives the status of the * link itself) is not a directory, by replicating the POSIX S_ISDIR test. * * This logic works because PHP does not set the mode value for a junction, * since there is no universal file type flag for it. Unfortunately an * uninitialized variable in PHP prior to 7.2.16 and 7.3.3 may cause a * random value to be returned. See https://bugs.php.net/bug.php?id=77552 * * If this random value passes the S_ISDIR test, then a junction will not be * detected and a recursive delete operation could lead to loss of data in * the target directory. Note that Windows rmdir can handle this situation * and will only delete the junction (from Windows 7 onwards). * * @param string $junction Path to check. * @return bool */ public function isJunction($junction) { if (!Platform::isWindows()) { return false; } // Important to clear all caches first clearstatcache(true, $junction); if (!is_dir($junction) || is_link($junction)) { return false; } $stat = lstat($junction); // S_ISDIR test (S_IFDIR is 0x4000, S_IFMT is 0xF000 bitmask) return $stat ? 0x4000 !== ($stat['mode'] & 0xF000) : false; } /** * Removes a Windows NTFS junction. * * @param string $junction * @return bool */ public function removeJunction($junction) { if (!Platform::isWindows()) { return false; } $junction = rtrim(str_replace('/', DIRECTORY_SEPARATOR, $junction), DIRECTORY_SEPARATOR); if (!$this->isJunction($junction)) { throw new IOException(sprintf('%s is not a junction and thus cannot be removed as one', $junction)); } return $this->rmdir($junction); } } composer/src/Composer/Util/Bitbucket.php 0000644 00000020615 14736103146 0014324 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util; use Composer\Factory; use Composer\IO\IOInterface; use Composer\Config; use Composer\Downloader\TransportException; /** * @author Paul Wenke <wenke.paul@gmail.com> */ class Bitbucket { private $io; private $config; private $process; private $remoteFilesystem; private $token = array(); private $time; const OAUTH2_ACCESS_TOKEN_URL = 'https://bitbucket.org/site/oauth2/access_token'; /** * Constructor. * * @param IOInterface $io The IO instance * @param Config $config The composer configuration * @param ProcessExecutor $process Process instance, injectable for mocking * @param RemoteFilesystem $remoteFilesystem Remote Filesystem, injectable for mocking * @param int $time Timestamp, injectable for mocking */ public function __construct(IOInterface $io, Config $config, ProcessExecutor $process = null, RemoteFilesystem $remoteFilesystem = null, $time = null) { $this->io = $io; $this->config = $config; $this->process = $process ?: new ProcessExecutor($io); $this->remoteFilesystem = $remoteFilesystem ?: Factory::createRemoteFilesystem($this->io, $config); $this->time = $time; } /** * @return string */ public function getToken() { if (!isset($this->token['access_token'])) { return ''; } return $this->token['access_token']; } /** * Attempts to authorize a Bitbucket domain via OAuth * * @param string $originUrl The host this Bitbucket instance is located at * @return bool true on success */ public function authorizeOAuth($originUrl) { if ($originUrl !== 'bitbucket.org') { return false; } // if available use token from git config if (0 === $this->process->execute('git config bitbucket.accesstoken', $output)) { $this->io->setAuthentication($originUrl, 'x-token-auth', trim($output)); return true; } return false; } /** * @param string $originUrl * @return bool */ private function requestAccessToken($originUrl) { try { $json = $this->remoteFilesystem->getContents($originUrl, self::OAUTH2_ACCESS_TOKEN_URL, false, array( 'retry-auth-failure' => false, 'http' => array( 'method' => 'POST', 'content' => 'grant_type=client_credentials', ), )); $this->token = json_decode($json, true); } catch (TransportException $e) { if ($e->getCode() === 400) { $this->io->writeError('<error>Invalid OAuth consumer provided.</error>'); $this->io->writeError('This can have two reasons:'); $this->io->writeError('1. You are authenticating with a bitbucket username/password combination'); $this->io->writeError('2. You are using an OAuth consumer, but didn\'t configure a (dummy) callback url'); return false; } elseif (in_array($e->getCode(), array(403, 401))) { $this->io->writeError('<error>Invalid OAuth consumer provided.</error>'); $this->io->writeError('You can also add it manually later by using "composer config --global --auth bitbucket-oauth.bitbucket.org <consumer-key> <consumer-secret>"'); return false; } throw $e; } return true; } /** * Authorizes a Bitbucket domain interactively via OAuth * * @param string $originUrl The host this Bitbucket instance is located at * @param string $message The reason this authorization is required * @throws \RuntimeException * @throws TransportException|\Exception * @return bool true on success */ public function authorizeOAuthInteractively($originUrl, $message = null) { if ($message) { $this->io->writeError($message); } $url = 'https://confluence.atlassian.com/bitbucket/oauth-on-bitbucket-cloud-238027431.html'; $this->io->writeError(sprintf('Follow the instructions on %s', $url)); $this->io->writeError(sprintf('to create a consumer. It will be stored in "%s" for future use by Composer.', $this->config->getAuthConfigSource()->getName())); $this->io->writeError('Ensure you enter a "Callback URL" (http://example.com is fine) or it will not be possible to create an Access Token (this callback url will not be used by composer)'); $consumerKey = trim($this->io->askAndHideAnswer('Consumer Key (hidden): ')); if (!$consumerKey) { $this->io->writeError('<warning>No consumer key given, aborting.</warning>'); $this->io->writeError('You can also add it manually later by using "composer config --global --auth bitbucket-oauth.bitbucket.org <consumer-key> <consumer-secret>"'); return false; } $consumerSecret = trim($this->io->askAndHideAnswer('Consumer Secret (hidden): ')); if (!$consumerSecret) { $this->io->writeError('<warning>No consumer secret given, aborting.</warning>'); $this->io->writeError('You can also add it manually later by using "composer config --global --auth bitbucket-oauth.bitbucket.org <consumer-key> <consumer-secret>"'); return false; } $this->io->setAuthentication($originUrl, $consumerKey, $consumerSecret); if (!$this->requestAccessToken($originUrl)) { return false; } // store value in user config $this->storeInAuthConfig($originUrl, $consumerKey, $consumerSecret); // Remove conflicting basic auth credentials (if available) $this->config->getAuthConfigSource()->removeConfigSetting('http-basic.' . $originUrl); $this->io->writeError('<info>Consumer stored successfully.</info>'); return true; } /** * Retrieves an access token from Bitbucket. * * @param string $originUrl * @param string $consumerKey * @param string $consumerSecret * @return string */ public function requestToken($originUrl, $consumerKey, $consumerSecret) { if (!empty($this->token) || $this->getTokenFromConfig($originUrl)) { return $this->token['access_token']; } $this->io->setAuthentication($originUrl, $consumerKey, $consumerSecret); if (!$this->requestAccessToken($originUrl)) { return ''; } $this->storeInAuthConfig($originUrl, $consumerKey, $consumerSecret); return $this->token['access_token']; } /** * Store the new/updated credentials to the configuration * @param string $originUrl * @param string $consumerKey * @param string $consumerSecret */ private function storeInAuthConfig($originUrl, $consumerKey, $consumerSecret) { $this->config->getConfigSource()->removeConfigSetting('bitbucket-oauth.'.$originUrl); $time = null === $this->time ? time() : $this->time; $consumer = array( "consumer-key" => $consumerKey, "consumer-secret" => $consumerSecret, "access-token" => $this->token['access_token'], "access-token-expiration" => $time + $this->token['expires_in'], ); $this->config->getAuthConfigSource()->addConfigSetting('bitbucket-oauth.'.$originUrl, $consumer); } /** * @param string $originUrl * @return bool */ private function getTokenFromConfig($originUrl) { $authConfig = $this->config->get('bitbucket-oauth'); if ( !isset($authConfig[$originUrl]['access-token']) || !isset($authConfig[$originUrl]['access-token-expiration']) || time() > $authConfig[$originUrl]['access-token-expiration'] ) { return false; } $this->token = array( 'access_token' => $authConfig[$originUrl]['access-token'], ); return true; } } composer/src/Composer/Util/Svn.php 0000644 00000023471 14736103146 0013161 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util; use Composer\Config; use Composer\IO\IOInterface; /** * @author Till Klampaeckel <till@php.net> * @author Jordi Boggiano <j.boggiano@seld.be> */ class Svn { const MAX_QTY_AUTH_TRIES = 5; /** * @var array */ protected $credentials; /** * @var bool */ protected $hasAuth; /** * @var \Composer\IO\IOInterface */ protected $io; /** * @var string */ protected $url; /** * @var bool */ protected $cacheCredentials = true; /** * @var ProcessExecutor */ protected $process; /** * @var int */ protected $qtyAuthTries = 0; /** * @var \Composer\Config */ protected $config; /** * @var string|null */ private static $version; /** * @param string $url * @param \Composer\IO\IOInterface $io * @param Config $config * @param ProcessExecutor $process */ public function __construct($url, IOInterface $io, Config $config, ProcessExecutor $process = null) { $this->url = $url; $this->io = $io; $this->config = $config; $this->process = $process ?: new ProcessExecutor($io); } public static function cleanEnv() { // clean up env for OSX, see https://github.com/composer/composer/issues/2146#issuecomment-35478940 putenv("DYLD_LIBRARY_PATH"); unset($_SERVER['DYLD_LIBRARY_PATH']); } /** * Execute an SVN remote command and try to fix up the process with credentials * if necessary. * * @param string $command SVN command to run * @param string $url SVN url * @param string $cwd Working directory * @param string $path Target for a checkout * @param bool $verbose Output all output to the user * * @throws \RuntimeException * @return string */ public function execute($command, $url, $cwd = null, $path = null, $verbose = false) { // Ensure we are allowed to use this URL by config $this->config->prohibitUrlByConfig($url, $this->io); return $this->executeWithAuthRetry($command, $cwd, $url, $path, $verbose); } /** * Execute an SVN local command and try to fix up the process with credentials * if necessary. * * @param string $command SVN command to run * @param string $path Path argument passed thru to the command * @param string $cwd Working directory * @param bool $verbose Output all output to the user * * @throws \RuntimeException * @return string */ public function executeLocal($command, $path, $cwd = null, $verbose = false) { // A local command has no remote url return $this->executeWithAuthRetry($command, $cwd, '', $path, $verbose); } private function executeWithAuthRetry($svnCommand, $cwd, $url, $path, $verbose) { // Regenerate the command at each try, to use the newly user-provided credentials $command = $this->getCommand($svnCommand, $url, $path); $output = null; $io = $this->io; $handler = function ($type, $buffer) use (&$output, $io, $verbose) { if ($type !== 'out') { return; } if ('Redirecting to URL ' === substr($buffer, 0, 19)) { return; } $output .= $buffer; if ($verbose) { $io->writeError($buffer, false); } }; $status = $this->process->execute($command, $handler, $cwd); if (0 === $status) { return $output; } $errorOutput = $this->process->getErrorOutput(); $fullOutput = implode("\n", array($output, $errorOutput)); // the error is not auth-related if (false === stripos($fullOutput, 'Could not authenticate to server:') && false === stripos($fullOutput, 'authorization failed') && false === stripos($fullOutput, 'svn: E170001:') && false === stripos($fullOutput, 'svn: E215004:')) { throw new \RuntimeException($fullOutput); } if (!$this->hasAuth()) { $this->doAuthDance(); } // try to authenticate if maximum quantity of tries not reached if ($this->qtyAuthTries++ < self::MAX_QTY_AUTH_TRIES) { // restart the process return $this->executeWithAuthRetry($svnCommand, $cwd, $url, $path, $verbose); } throw new \RuntimeException( 'wrong credentials provided ('.$fullOutput.')' ); } /** * @param bool $cacheCredentials */ public function setCacheCredentials($cacheCredentials) { $this->cacheCredentials = $cacheCredentials; } /** * Repositories requests credentials, let's put them in. * * @throws \RuntimeException * @return \Composer\Util\Svn */ protected function doAuthDance() { // cannot ask for credentials in non interactive mode if (!$this->io->isInteractive()) { throw new \RuntimeException( 'can not ask for authentication in non interactive mode' ); } $this->io->writeError("The Subversion server ({$this->url}) requested credentials:"); $this->hasAuth = true; $this->credentials['username'] = $this->io->ask("Username: "); $this->credentials['password'] = $this->io->askAndHideAnswer("Password: "); $this->cacheCredentials = $this->io->askConfirmation("Should Subversion cache these credentials? (yes/no) ", true); return $this; } /** * A method to create the svn commands run. * * @param string $cmd Usually 'svn ls' or something like that. * @param string $url Repo URL. * @param string $path Target for a checkout * * @return string */ protected function getCommand($cmd, $url, $path = null) { $cmd = sprintf( '%s %s%s %s', $cmd, '--non-interactive ', $this->getCredentialString(), ProcessExecutor::escape($url) ); if ($path) { $cmd .= ' ' . ProcessExecutor::escape($path); } return $cmd; } /** * Return the credential string for the svn command. * * Adds --no-auth-cache when credentials are present. * * @return string */ protected function getCredentialString() { if (!$this->hasAuth()) { return ''; } return sprintf( ' %s--username %s --password %s ', $this->getAuthCache(), ProcessExecutor::escape($this->getUsername()), ProcessExecutor::escape($this->getPassword()) ); } /** * Get the password for the svn command. Can be empty. * * @throws \LogicException * @return string */ protected function getPassword() { if ($this->credentials === null) { throw new \LogicException("No svn auth detected."); } return isset($this->credentials['password']) ? $this->credentials['password'] : ''; } /** * Get the username for the svn command. * * @throws \LogicException * @return string */ protected function getUsername() { if ($this->credentials === null) { throw new \LogicException("No svn auth detected."); } return $this->credentials['username']; } /** * Detect Svn Auth. * * @return bool */ protected function hasAuth() { if (null !== $this->hasAuth) { return $this->hasAuth; } if (false === $this->createAuthFromConfig()) { $this->createAuthFromUrl(); } return $this->hasAuth; } /** * Return the no-auth-cache switch. * * @return string */ protected function getAuthCache() { return $this->cacheCredentials ? '' : '--no-auth-cache '; } /** * Create the auth params from the configuration file. * * @return bool */ private function createAuthFromConfig() { if (!$this->config->has('http-basic')) { return $this->hasAuth = false; } $authConfig = $this->config->get('http-basic'); $host = parse_url($this->url, PHP_URL_HOST); if (isset($authConfig[$host])) { $this->credentials['username'] = $authConfig[$host]['username']; $this->credentials['password'] = $authConfig[$host]['password']; return $this->hasAuth = true; } return $this->hasAuth = false; } /** * Create the auth params from the url * * @return bool */ private function createAuthFromUrl() { $uri = parse_url($this->url); if (empty($uri['user'])) { return $this->hasAuth = false; } $this->credentials['username'] = $uri['user']; if (!empty($uri['pass'])) { $this->credentials['password'] = $uri['pass']; } return $this->hasAuth = true; } /** * Returns the version of the svn binary contained in PATH * * @return string|null */ public function binaryVersion() { if (!self::$version) { if (0 === $this->process->execute('svn --version', $output)) { if (preg_match('{(\d+(?:\.\d+)+)}', $output, $match)) { self::$version = $match[1]; } } } return self::$version; } } composer/src/Composer/Util/Url.php 0000644 00000005530 14736103146 0013151 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util; use Composer\Config; /** * @author Jordi Boggiano <j.boggiano@seld.be> */ class Url { public static function updateDistReference(Config $config, $url, $ref) { $host = parse_url($url, PHP_URL_HOST); if ($host === 'api.github.com' || $host === 'github.com' || $host === 'www.github.com') { if (preg_match('{^https?://(?:www\.)?github\.com/([^/]+)/([^/]+)/(zip|tar)ball/(.+)$}i', $url, $match)) { // update legacy github archives to API calls with the proper reference $url = 'https://api.github.com/repos/' . $match[1] . '/'. $match[2] . '/' . $match[3] . 'ball/' . $ref; } elseif (preg_match('{^https?://(?:www\.)?github\.com/([^/]+)/([^/]+)/archive/.+\.(zip|tar)(?:\.gz)?$}i', $url, $match)) { // update current github web archives to API calls with the proper reference $url = 'https://api.github.com/repos/' . $match[1] . '/'. $match[2] . '/' . $match[3] . 'ball/' . $ref; } elseif (preg_match('{^https?://api\.github\.com/repos/([^/]+)/([^/]+)/(zip|tar)ball(?:/.+)?$}i', $url, $match)) { // update api archives to the proper reference $url = 'https://api.github.com/repos/' . $match[1] . '/'. $match[2] . '/' . $match[3] . 'ball/' . $ref; } } elseif ($host === 'bitbucket.org' || $host === 'www.bitbucket.org') { if (preg_match('{^https?://(?:www\.)?bitbucket\.org/([^/]+)/([^/]+)/get/(.+)\.(zip|tar\.gz|tar\.bz2)$}i', $url, $match)) { // update Bitbucket archives to the proper reference $url = 'https://bitbucket.org/' . $match[1] . '/'. $match[2] . '/get/' . $ref . '.' . $match[4]; } } elseif ($host === 'gitlab.com' || $host === 'www.gitlab.com') { if (preg_match('{^https?://(?:www\.)?gitlab\.com/api/v[34]/projects/([^/]+)/repository/archive\.(zip|tar\.gz|tar\.bz2|tar)\?sha=.+$}i', $url, $match)) { // update Gitlab archives to the proper reference $url = 'https://gitlab.com/api/v4/projects/' . $match[1] . '/repository/archive.' . $match[2] . '?sha=' . $ref; } } elseif (in_array($host, $config->get('github-domains'), true)) { $url = preg_replace('{(/repos/[^/]+/[^/]+/(zip|tar)ball)(?:/.+)?$}i', '$1/'.$ref, $url); } elseif (in_array($host, $config->get('gitlab-domains'), true)) { $url = preg_replace('{(/api/v[34]/projects/[^/]+/repository/archive\.(?:zip|tar\.gz|tar\.bz2|tar)\?sha=).+$}i', '${1}'.$ref, $url); } return $url; } } composer/src/Composer/Util/SpdxLicense.php 0000644 00000001072 14736103146 0014625 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util; use Composer\Spdx\SpdxLicenses; trigger_error('The ' . __NAMESPACE__ . '\SpdxLicense class is deprecated, use Composer\Spdx\SpdxLicenses instead.', E_USER_DEPRECATED); /** * @deprecated use Composer\Spdx\SpdxLicenses instead */ class SpdxLicense extends SpdxLicenses { } composer/src/Composer/Util/Hg.php 0000644 00000005502 14736103146 0012744 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util; use Composer\Config; use Composer\IO\IOInterface; /** * @author Jonas Renaudot <jonas.renaudot@gmail.com> */ class Hg { /** * @var \Composer\IO\IOInterface */ private $io; /** * @var \Composer\Config */ private $config; /** * @var \Composer\Util\ProcessExecutor */ private $process; public function __construct(IOInterface $io, Config $config, ProcessExecutor $process) { $this->io = $io; $this->config = $config; $this->process = $process; } public function runCommand($commandCallable, $url, $cwd) { $this->config->prohibitUrlByConfig($url, $this->io); // Try as is $command = call_user_func($commandCallable, $url); if (0 === $this->process->execute($command, $ignoredOutput, $cwd)) { return; } // Try with the authentication information available if (preg_match('{^(https?)://((.+)(?:\:(.+))?@)?([^/]+)(/.*)?}mi', $url, $match) && $this->io->hasAuthentication($match[5])) { $auth = $this->io->getAuthentication($match[5]); $authenticatedUrl = $match[1] . '://' . rawurlencode($auth['username']) . ':' . rawurlencode($auth['password']) . '@' . $match[5] . (!empty($match[6]) ? $match[6] : null); $command = call_user_func($commandCallable, $authenticatedUrl); if (0 === $this->process->execute($command, $ignoredOutput, $cwd)) { return; } $error = $this->process->getErrorOutput(); } else { $error = 'The given URL (' . $url . ') does not match the required format (http(s)://(username:password@)example.com/path-to-repository)'; } $this->throwException('Failed to clone ' . $url . ', ' . "\n\n" . $error, $url); } public static function sanitizeUrl($message) { return preg_replace_callback('{://(?P<user>[^@]+?):(?P<password>.+?)@}', function ($m) { if (preg_match('{^[a-f0-9]{12,}$}', $m[1])) { return '://***:***@'; } return '://' . $m[1] . ':***@'; }, $message); } private function throwException($message, $url) { if (0 !== $this->process->execute('hg --version', $ignoredOutput)) { throw new \RuntimeException(self::sanitizeUrl('Failed to clone ' . $url . ', hg was not found, check that it is installed and in your PATH env.' . "\n\n" . $this->process->getErrorOutput())); } throw new \RuntimeException(self::sanitizeUrl($message)); } } composer/src/Composer/Util/RemoteFilesystem.php 0000644 00000134773 14736103146 0015723 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util; use Composer\Config; use Composer\Composer; use Composer\Semver\Constraint\Constraint; use Composer\Package\Version\VersionParser; use Composer\IO\IOInterface; use Composer\Downloader\TransportException; use Composer\CaBundle\CaBundle; use Psr\Log\LoggerInterface; /** * @author François Pluchino <francois.pluchino@opendisplay.com> * @author Jordi Boggiano <j.boggiano@seld.be> * @author Nils Adermann <naderman@naderman.de> */ class RemoteFilesystem { private $io; private $config; private $scheme; private $bytesMax; private $originUrl; private $fileUrl; private $fileName; private $retry; private $progress; private $lastProgress; private $options = array(); private $peerCertificateMap = array(); private $disableTls = false; private $retryAuthFailure; private $lastHeaders; private $storeAuth; private $degradedMode = false; private $redirects; private $maxRedirects = 20; private $displayedOriginAuthentications = array(); /** * Constructor. * * @param IOInterface $io The IO instance * @param Config $config The config * @param array $options The options * @param bool $disableTls */ public function __construct(IOInterface $io, Config $config = null, array $options = array(), $disableTls = false) { $this->io = $io; // Setup TLS options // The cafile option can be set via config.json if ($disableTls === false) { $this->options = $this->getTlsDefaults($options); } else { $this->disableTls = true; } // handle the other externally set options normally. $this->options = array_replace_recursive($this->options, $options); $this->config = $config; } /** * Copy the remote file in local. * * @param string $originUrl The origin URL * @param string $fileUrl The file URL * @param string $fileName the local filename * @param bool $progress Display the progression * @param array $options Additional context options * * @return bool true */ public function copy($originUrl, $fileUrl, $fileName, $progress = true, $options = array()) { return $this->get($originUrl, $fileUrl, $options, $fileName, $progress); } /** * Get the content. * * @param string $originUrl The origin URL * @param string $fileUrl The file URL * @param bool $progress Display the progression * @param array $options Additional context options * * @return bool|string The content */ public function getContents($originUrl, $fileUrl, $progress = true, $options = array()) { return $this->get($originUrl, $fileUrl, $options, null, $progress); } /** * Retrieve the options set in the constructor * * @return array Options */ public function getOptions() { return $this->options; } /** * Merges new options * * @param array $options */ public function setOptions(array $options) { $this->options = array_replace_recursive($this->options, $options); } /** * Check is disable TLS. * * @return bool */ public function isTlsDisabled() { return $this->disableTls === true; } /** * Returns the headers of the last request * * @return array */ public function getLastHeaders() { return $this->lastHeaders; } /** * @param array $headers array of returned headers like from getLastHeaders() * @param string $name header name (case insensitive) * @return string|null */ public function findHeaderValue(array $headers, $name) { $value = null; foreach ($headers as $header) { if (preg_match('{^'.$name.':\s*(.+?)\s*$}i', $header, $match)) { $value = $match[1]; } elseif (preg_match('{^HTTP/}i', $header)) { // In case of redirects, http_response_headers contains the headers of all responses // so we reset the flag when a new response is being parsed as we are only interested in the last response $value = null; } } return $value; } /** * @param array $headers array of returned headers like from getLastHeaders() * @return int|null */ public function findStatusCode(array $headers) { $value = null; foreach ($headers as $header) { if (preg_match('{^HTTP/\S+ (\d+)}i', $header, $match)) { // In case of redirects, http_response_headers contains the headers of all responses // so we can not return directly and need to keep iterating $value = (int) $match[1]; } } return $value; } /** * @param array $headers array of returned headers like from getLastHeaders() * @return string|null */ public function findStatusMessage(array $headers) { $value = null; foreach ($headers as $header) { if (preg_match('{^HTTP/\S+ \d+}i', $header)) { // In case of redirects, http_response_headers contains the headers of all responses // so we can not return directly and need to keep iterating $value = $header; } } return $value; } /** * Get file content or copy action. * * @param string $originUrl The origin URL * @param string $fileUrl The file URL * @param array $additionalOptions context options * @param string $fileName the local filename * @param bool $progress Display the progression * * @throws TransportException|\Exception * @throws TransportException When the file could not be downloaded * * @return bool|string */ protected function get($originUrl, $fileUrl, $additionalOptions = array(), $fileName = null, $progress = true) { if (strpos($originUrl, '.github.com') === (strlen($originUrl) - 11)) { $originUrl = 'github.com'; } // Gitlab can be installed in a non-root context (i.e. gitlab.com/foo). When downloading archives the originUrl // is the host without the path, so we look for the registered gitlab-domains matching the host here if ( $this->config && is_array($this->config->get('gitlab-domains')) && false === strpos($originUrl, '/') && !in_array($originUrl, $this->config->get('gitlab-domains')) ) { foreach ($this->config->get('gitlab-domains') as $gitlabDomain) { if (0 === strpos($gitlabDomain, $originUrl)) { $originUrl = $gitlabDomain; break; } } unset($gitlabDomain); } $this->scheme = parse_url($fileUrl, PHP_URL_SCHEME); $this->bytesMax = 0; $this->originUrl = $originUrl; $this->fileUrl = $fileUrl; $this->fileName = $fileName; $this->progress = $progress; $this->lastProgress = null; $this->retryAuthFailure = true; $this->lastHeaders = array(); $this->redirects = 1; // The first request counts. // capture username/password from URL if there is one if (preg_match('{^https?://([^:/]+):([^@/]+)@([^/]+)}i', $fileUrl, $match)) { $this->io->setAuthentication($originUrl, rawurldecode($match[1]), rawurldecode($match[2])); } $tempAdditionalOptions = $additionalOptions; if (isset($tempAdditionalOptions['retry-auth-failure'])) { $this->retryAuthFailure = (bool) $tempAdditionalOptions['retry-auth-failure']; unset($tempAdditionalOptions['retry-auth-failure']); } $isRedirect = false; if (isset($tempAdditionalOptions['redirects'])) { $this->redirects = $tempAdditionalOptions['redirects']; $isRedirect = true; unset($tempAdditionalOptions['redirects']); } $options = $this->getOptionsForUrl($originUrl, $tempAdditionalOptions); unset($tempAdditionalOptions); $origFileUrl = $fileUrl; if (isset($options['github-token'])) { // only add the access_token if it is actually a github URL (in case we were redirected to S3) if (preg_match('{^https?://api\.github\.com/}', $fileUrl)) { $options['http']['header'][] = 'Authorization: token '.$options['github-token']; } unset($options['github-token']); } if (isset($options['gitlab-token'])) { $fileUrl .= (false === strpos($fileUrl, '?') ? '?' : '&') . 'access_token='.$options['gitlab-token']; unset($options['gitlab-token']); } if (isset($options['http'])) { $options['http']['ignore_errors'] = true; } if ($this->degradedMode && substr($fileUrl, 0, 26) === 'http://repo.packagist.org/') { // access packagist using the resolved IPv4 instead of the hostname to force IPv4 protocol $fileUrl = 'http://' . gethostbyname('repo.packagist.org') . substr($fileUrl, 20); $degradedPackagist = true; } $ctx = StreamContextFactory::getContext($fileUrl, $options, array('notification' => array($this, 'callbackGet'))); $actualContextOptions = stream_context_get_options($ctx); $usingProxy = !empty($actualContextOptions['http']['proxy']) ? ' using proxy ' . $actualContextOptions['http']['proxy'] : ''; $this->io->writeError((substr($origFileUrl, 0, 4) === 'http' ? 'Downloading ' : 'Reading ') . $this->stripCredentialsFromUrl($origFileUrl) . $usingProxy, true, IOInterface::DEBUG); unset($origFileUrl, $actualContextOptions); // Check for secure HTTP, but allow insecure Packagist calls to $hashed providers as file integrity is verified with sha256 if ((!preg_match('{^http://(repo\.)?packagist\.org/p/}', $fileUrl) || (false === strpos($fileUrl, '$') && false === strpos($fileUrl, '%24'))) && empty($degradedPackagist) && $this->config) { $this->config->prohibitUrlByConfig($fileUrl, $this->io); } if ($this->progress && !$isRedirect) { $this->io->writeError("Downloading (<comment>connecting...</comment>)", false); } $errorMessage = ''; $errorCode = 0; $result = false; set_error_handler(function ($code, $msg) use (&$errorMessage) { if ($errorMessage) { $errorMessage .= "\n"; } $errorMessage .= preg_replace('{^file_get_contents\(.*?\): }', '', $msg); return true; }); try { $result = $this->getRemoteContents($originUrl, $fileUrl, $ctx, $http_response_header); if (!empty($http_response_header[0])) { $statusCode = $this->findStatusCode($http_response_header); if ($statusCode >= 400 && $this->findHeaderValue($http_response_header, 'content-type') === 'application/json') { self::outputWarnings($this->io, $originUrl, json_decode($result, true)); } if (in_array($statusCode, array(401, 403)) && $this->retryAuthFailure) { $this->promptAuthAndRetry($statusCode, $this->findStatusMessage($http_response_header), null, $http_response_header); } } $contentLength = !empty($http_response_header[0]) ? $this->findHeaderValue($http_response_header, 'content-length') : null; if ($contentLength && Platform::strlen($result) < $contentLength) { // alas, this is not possible via the stream callback because STREAM_NOTIFY_COMPLETED is documented, but not implemented anywhere in PHP $e = new TransportException('Content-Length mismatch, received '.Platform::strlen($result).' bytes out of the expected '.$contentLength); $e->setHeaders($http_response_header); $e->setStatusCode($this->findStatusCode($http_response_header)); $e->setResponse($result); $this->io->writeError('Content-Length mismatch, received '.Platform::strlen($result).' out of '.$contentLength.' bytes: (' . base64_encode($result).')', true, IOInterface::DEBUG); throw $e; } if (PHP_VERSION_ID < 50600 && !empty($options['ssl']['peer_fingerprint'])) { // Emulate fingerprint validation on PHP < 5.6 $params = stream_context_get_params($ctx); $expectedPeerFingerprint = $options['ssl']['peer_fingerprint']; $peerFingerprint = TlsHelper::getCertificateFingerprint($params['options']['ssl']['peer_certificate']); // Constant time compare??! if ($expectedPeerFingerprint !== $peerFingerprint) { throw new TransportException('Peer fingerprint did not match'); } } } catch (\Exception $e) { if ($e instanceof TransportException && !empty($http_response_header[0])) { $e->setHeaders($http_response_header); $e->setStatusCode($this->findStatusCode($http_response_header)); } if ($e instanceof TransportException && $result !== false) { $e->setResponse($result); } $result = false; } if ($errorMessage && !filter_var(ini_get('allow_url_fopen'), FILTER_VALIDATE_BOOLEAN)) { $errorMessage = 'allow_url_fopen must be enabled in php.ini ('.$errorMessage.')'; } restore_error_handler(); if (isset($e) && !$this->retry) { if (!$this->degradedMode && false !== strpos($e->getMessage(), 'Operation timed out')) { $this->degradedMode = true; $this->io->writeError(''); $this->io->writeError(array( '<error>'.$e->getMessage().'</error>', '<error>Retrying with degraded mode, check https://getcomposer.org/doc/articles/troubleshooting.md#degraded-mode for more info</error>', )); return $this->get($this->originUrl, $this->fileUrl, $additionalOptions, $this->fileName, $this->progress); } throw $e; } $statusCode = null; $contentType = null; $locationHeader = null; if (!empty($http_response_header[0])) { $statusCode = $this->findStatusCode($http_response_header); $contentType = $this->findHeaderValue($http_response_header, 'content-type'); $locationHeader = $this->findHeaderValue($http_response_header, 'location'); } // check for bitbucket login page asking to authenticate if ($originUrl === 'bitbucket.org' && !$this->isPublicBitBucketDownload($fileUrl) && substr($fileUrl, -4) === '.zip' && (!$locationHeader || substr($locationHeader, -4) !== '.zip') && $contentType && preg_match('{^text/html\b}i', $contentType) ) { $result = false; if ($this->retryAuthFailure) { $this->promptAuthAndRetry(401); } } // check for gitlab 404 when downloading archives if ($statusCode === 404 && $this->config && in_array($originUrl, $this->config->get('gitlab-domains'), true) && false !== strpos($fileUrl, 'archive.zip') ) { $result = false; if ($this->retryAuthFailure) { $this->promptAuthAndRetry(401); } } // handle 3xx redirects, 304 Not Modified is excluded $hasFollowedRedirect = false; if ($statusCode >= 300 && $statusCode <= 399 && $statusCode !== 304 && $this->redirects < $this->maxRedirects) { $hasFollowedRedirect = true; $result = $this->handleRedirect($http_response_header, $additionalOptions, $result); } // fail 4xx and 5xx responses and capture the response if ($statusCode && $statusCode >= 400 && $statusCode <= 599) { if (!$this->retry) { if ($this->progress && !$this->retry && !$isRedirect) { $this->io->overwriteError("Downloading (<error>failed</error>)", false); } $e = new TransportException('The "'.$this->fileUrl.'" file could not be downloaded ('.$http_response_header[0].')', $statusCode); $e->setHeaders($http_response_header); $e->setResponse($result); $e->setStatusCode($statusCode); throw $e; } $result = false; } if ($this->progress && !$this->retry && !$isRedirect) { $this->io->overwriteError("Downloading (".($result === false ? '<error>failed</error>' : '<comment>100%</comment>').")", false); } // decode gzip if ($result && extension_loaded('zlib') && substr($fileUrl, 0, 4) === 'http' && !$hasFollowedRedirect) { $contentEncoding = $this->findHeaderValue($http_response_header, 'content-encoding'); $decode = $contentEncoding && 'gzip' === strtolower($contentEncoding); if ($decode) { try { if (PHP_VERSION_ID >= 50400) { $result = zlib_decode($result); } else { // work around issue with gzuncompress & co that do not work with all gzip checksums $result = file_get_contents('compress.zlib://data:application/octet-stream;base64,'.base64_encode($result)); } if (!$result) { throw new TransportException('Failed to decode zlib stream'); } } catch (\Exception $e) { if ($this->degradedMode) { throw $e; } $this->degradedMode = true; $this->io->writeError(array( '', '<error>Failed to decode response: '.$e->getMessage().'</error>', '<error>Retrying with degraded mode, check https://getcomposer.org/doc/articles/troubleshooting.md#degraded-mode for more info</error>', )); return $this->get($this->originUrl, $this->fileUrl, $additionalOptions, $this->fileName, $this->progress); } } } // handle copy command if download was successful if (false !== $result && null !== $fileName && !$isRedirect) { if ('' === $result) { throw new TransportException('"'.$this->fileUrl.'" appears broken, and returned an empty 200 response'); } $errorMessage = ''; set_error_handler(function ($code, $msg) use (&$errorMessage) { if ($errorMessage) { $errorMessage .= "\n"; } $errorMessage .= preg_replace('{^file_put_contents\(.*?\): }', '', $msg); return true; }); $result = (bool) file_put_contents($fileName, $result); restore_error_handler(); if (false === $result) { throw new TransportException('The "'.$this->fileUrl.'" file could not be written to '.$fileName.': '.$errorMessage); } } // Handle SSL cert match issues if (false === $result && false !== strpos($errorMessage, 'Peer certificate') && PHP_VERSION_ID < 50600) { // Certificate name error, PHP doesn't support subjectAltName on PHP < 5.6 // The procedure to handle sAN for older PHP's is: // // 1. Open socket to remote server and fetch certificate (disabling peer // validation because PHP errors without giving up the certificate.) // // 2. Verifying the domain in the URL against the names in the sAN field. // If there is a match record the authority [host/port], certificate // common name, and certificate fingerprint. // // 3. Retry the original request but changing the CN_match parameter to // the common name extracted from the certificate in step 2. // // 4. To prevent any attempt at being hoodwinked by switching the // certificate between steps 2 and 3 the fingerprint of the certificate // presented in step 3 is compared against the one recorded in step 2. if (CaBundle::isOpensslParseSafe()) { $certDetails = $this->getCertificateCnAndFp($this->fileUrl, $options); if ($certDetails) { $this->peerCertificateMap[$this->getUrlAuthority($this->fileUrl)] = $certDetails; $this->retry = true; } } else { $this->io->writeError(''); $this->io->writeError(sprintf( '<error>Your version of PHP, %s, is affected by CVE-2013-6420 and cannot safely perform certificate validation, we strongly suggest you upgrade.</error>', PHP_VERSION )); } } if ($this->retry) { $this->retry = false; $result = $this->get($this->originUrl, $this->fileUrl, $additionalOptions, $this->fileName, $this->progress); if ($this->storeAuth && $this->config) { $authHelper = new AuthHelper($this->io, $this->config); $authHelper->storeAuth($this->originUrl, $this->storeAuth); $this->storeAuth = false; } return $result; } if (false === $result) { $e = new TransportException('The "'.$this->fileUrl.'" file could not be downloaded: '.$errorMessage, $errorCode); if (!empty($http_response_header[0])) { $e->setHeaders($http_response_header); } if (!$this->degradedMode && false !== strpos($e->getMessage(), 'Operation timed out')) { $this->degradedMode = true; $this->io->writeError(''); $this->io->writeError(array( '<error>'.$e->getMessage().'</error>', '<error>Retrying with degraded mode, check https://getcomposer.org/doc/articles/troubleshooting.md#degraded-mode for more info</error>', )); return $this->get($this->originUrl, $this->fileUrl, $additionalOptions, $this->fileName, $this->progress); } throw $e; } if (!empty($http_response_header[0])) { $this->lastHeaders = $http_response_header; } return $result; } /** * Get contents of remote URL. * * @param string $originUrl The origin URL * @param string $fileUrl The file URL * @param resource $context The stream context * * @return string|false The response contents or false on failure */ protected function getRemoteContents($originUrl, $fileUrl, $context, array &$responseHeaders = null) { try { $e = null; $result = file_get_contents($fileUrl, false, $context); } catch (\Throwable $e) { } catch (\Exception $e) { } $responseHeaders = isset($http_response_header) ? $http_response_header : array(); if (null !== $e) { throw $e; } return $result; } /** * Get notification action. * * @param int $notificationCode The notification code * @param int $severity The severity level * @param string $message The message * @param int $messageCode The message code * @param int $bytesTransferred The loaded size * @param int $bytesMax The total size * @throws TransportException */ protected function callbackGet($notificationCode, $severity, $message, $messageCode, $bytesTransferred, $bytesMax) { switch ($notificationCode) { case STREAM_NOTIFY_FAILURE: if (400 === $messageCode) { // This might happen if your host is secured by ssl client certificate authentication // but you do not send an appropriate certificate throw new TransportException("The '" . $this->fileUrl . "' URL could not be accessed: " . $message, $messageCode); } break; case STREAM_NOTIFY_FILE_SIZE_IS: $this->bytesMax = $bytesMax; break; case STREAM_NOTIFY_PROGRESS: if ($this->bytesMax > 0 && $this->progress) { $progression = min(100, round($bytesTransferred / $this->bytesMax * 100)); if ((0 === $progression % 5) && 100 !== $progression && $progression !== $this->lastProgress) { $this->lastProgress = $progression; $this->io->overwriteError("Downloading (<comment>$progression%</comment>)", false); } } break; default: break; } } protected function promptAuthAndRetry($httpStatus, $reason = null, $warning = null, $headers = array()) { if ($this->config && in_array($this->originUrl, $this->config->get('github-domains'), true)) { $gitHubUtil = new GitHub($this->io, $this->config, null); $message = "\n"; $rateLimited = $gitHubUtil->isRateLimited($headers); if ($rateLimited) { $rateLimit = $gitHubUtil->getRateLimit($headers); if ($this->io->hasAuthentication($this->originUrl)) { $message = 'Review your configured GitHub OAuth token or enter a new one to go over the API rate limit.'; } else { $message = 'Create a GitHub OAuth token to go over the API rate limit.'; } $message = sprintf( 'GitHub API limit (%d calls/hr) is exhausted, could not fetch '.$this->fileUrl.'. '.$message.' You can also wait until %s for the rate limit to reset.', $rateLimit['limit'], $rateLimit['reset'] )."\n"; } else { $message .= 'Could not fetch '.$this->fileUrl.', please '; if ($this->io->hasAuthentication($this->originUrl)) { $message .= 'review your configured GitHub OAuth token or enter a new one to access private repos'; } else { $message .= 'create a GitHub OAuth token to access private repos'; } } if (!$gitHubUtil->authorizeOAuth($this->originUrl) && (!$this->io->isInteractive() || !$gitHubUtil->authorizeOAuthInteractively($this->originUrl, $message)) ) { throw new TransportException('Could not authenticate against '.$this->originUrl, 401); } } elseif ($this->config && in_array($this->originUrl, $this->config->get('gitlab-domains'), true)) { $message = "\n".'Could not fetch '.$this->fileUrl.', enter your ' . $this->originUrl . ' credentials ' .($httpStatus === 401 ? 'to access private repos' : 'to go over the API rate limit'); $gitLabUtil = new GitLab($this->io, $this->config, null); if ($this->io->hasAuthentication($this->originUrl) && ($auth = $this->io->getAuthentication($this->originUrl)) && in_array($auth['password'], array('gitlab-ci-token', 'private-token', 'oauth2'), true)) { throw new TransportException("Invalid credentials for '" . $this->fileUrl . "', aborting.", $httpStatus); } if (!$gitLabUtil->authorizeOAuth($this->originUrl) && (!$this->io->isInteractive() || !$gitLabUtil->authorizeOAuthInteractively($this->scheme, $this->originUrl, $message)) ) { throw new TransportException('Could not authenticate against '.$this->originUrl, 401); } } elseif ($this->config && $this->originUrl === 'bitbucket.org') { $askForOAuthToken = true; if ($this->io->hasAuthentication($this->originUrl)) { $auth = $this->io->getAuthentication($this->originUrl); if ($auth['username'] !== 'x-token-auth') { $bitbucketUtil = new Bitbucket($this->io, $this->config); $accessToken = $bitbucketUtil->requestToken($this->originUrl, $auth['username'], $auth['password']); if (!empty($accessToken)) { $this->io->setAuthentication($this->originUrl, 'x-token-auth', $accessToken); $askForOAuthToken = false; } } else { throw new TransportException('Could not authenticate against ' . $this->originUrl, 401); } } if ($askForOAuthToken) { $message = "\n".'Could not fetch ' . $this->fileUrl . ', please create a bitbucket OAuth token to ' . (($httpStatus === 401 || $httpStatus === 403) ? 'access private repos' : 'go over the API rate limit'); $bitBucketUtil = new Bitbucket($this->io, $this->config); if (! $bitBucketUtil->authorizeOAuth($this->originUrl) && (! $this->io->isInteractive() || !$bitBucketUtil->authorizeOAuthInteractively($this->originUrl, $message)) ) { throw new TransportException('Could not authenticate against ' . $this->originUrl, 401); } } } else { // 404s are only handled for github if ($httpStatus === 404) { return; } // fail if the console is not interactive if (!$this->io->isInteractive()) { if ($httpStatus === 401) { $message = "The '" . $this->fileUrl . "' URL required authentication.\nYou must be using the interactive console to authenticate"; } if ($httpStatus === 403) { $message = "The '" . $this->fileUrl . "' URL could not be accessed: " . $reason; } throw new TransportException($message, $httpStatus); } // fail if we already have auth if ($this->io->hasAuthentication($this->originUrl)) { throw new TransportException("Invalid credentials for '" . $this->fileUrl . "', aborting.", $httpStatus); } $this->io->writeError(' Authentication required (<info>'.$this->originUrl.'</info>):'); $username = $this->io->ask(' Username: '); $password = $this->io->askAndHideAnswer(' Password: '); $this->io->setAuthentication($this->originUrl, $username, $password); $this->storeAuth = $this->config->get('store-auths'); } $this->retry = true; throw new TransportException('RETRY'); } protected function getOptionsForUrl($originUrl, $additionalOptions) { $tlsOptions = array(); // Setup remaining TLS options - the matching may need monitoring, esp. www vs none in CN if ($this->disableTls === false && PHP_VERSION_ID < 50600 && !stream_is_local($this->fileUrl)) { $host = parse_url($this->fileUrl, PHP_URL_HOST); if (PHP_VERSION_ID < 50304) { // PHP < 5.3.4 does not support follow_location, for those people // do some really nasty hard coded transformations. These will // still breakdown if the site redirects to a domain we don't // expect. if ($host === 'github.com' || $host === 'api.github.com') { $host = '*.github.com'; } } $tlsOptions['ssl']['CN_match'] = $host; $tlsOptions['ssl']['SNI_server_name'] = $host; $urlAuthority = $this->getUrlAuthority($this->fileUrl); if (isset($this->peerCertificateMap[$urlAuthority])) { // Handle subjectAltName on lesser PHP's. $certMap = $this->peerCertificateMap[$urlAuthority]; $this->io->writeError('', true, IOInterface::DEBUG); $this->io->writeError(sprintf( 'Using <info>%s</info> as CN for subjectAltName enabled host <info>%s</info>', $certMap['cn'], $urlAuthority ), true, IOInterface::DEBUG); $tlsOptions['ssl']['CN_match'] = $certMap['cn']; $tlsOptions['ssl']['peer_fingerprint'] = $certMap['fp']; } elseif (!CaBundle::isOpensslParseSafe() && $host === 'repo.packagist.org') { // handle subjectAltName for packagist.org's repo domain on very old PHPs $tlsOptions['ssl']['CN_match'] = 'packagist.org'; } } $headers = array(); if (extension_loaded('zlib')) { $headers[] = 'Accept-Encoding: gzip'; } $options = array_replace_recursive($this->options, $tlsOptions, $additionalOptions); if (!$this->degradedMode) { // degraded mode disables HTTP/1.1 which causes issues with some bad // proxies/software due to the use of chunked encoding $options['http']['protocol_version'] = 1.1; $headers[] = 'Connection: close'; } if ($this->io->hasAuthentication($originUrl)) { $authenticationDisplayMessage = null; $auth = $this->io->getAuthentication($originUrl); if ($auth['password'] === 'bearer') { $headers[] = 'Authorization: Bearer '.$auth['username']; } elseif ('github.com' === $originUrl && 'x-oauth-basic' === $auth['password']) { $options['github-token'] = $auth['username']; $authenticationDisplayMessage = 'Using GitHub token authentication'; } elseif ($this->config && in_array($originUrl, $this->config->get('gitlab-domains'), true)) { if ($auth['password'] === 'oauth2') { $headers[] = 'Authorization: Bearer '.$auth['username']; $authenticationDisplayMessage = 'Using GitLab OAuth token authentication'; } elseif ($auth['password'] === 'private-token' || $auth['password'] === 'gitlab-ci-token') { $headers[] = 'PRIVATE-TOKEN: '.$auth['username']; $authenticationDisplayMessage = 'Using GitLab private token authentication'; } } elseif ('bitbucket.org' === $originUrl && $this->fileUrl !== Bitbucket::OAUTH2_ACCESS_TOKEN_URL && 'x-token-auth' === $auth['username'] ) { if (!$this->isPublicBitBucketDownload($this->fileUrl)) { $headers[] = 'Authorization: Bearer ' . $auth['password']; $authenticationDisplayMessage = 'Using Bitbucket OAuth token authentication'; } } else { $authStr = base64_encode($auth['username'] . ':' . $auth['password']); $headers[] = 'Authorization: Basic '.$authStr; $authenticationDisplayMessage = 'Using HTTP basic authentication with username "' . $auth['username'] . '"'; } if ($authenticationDisplayMessage && !in_array($originUrl, $this->displayedOriginAuthentications, true)) { $this->io->writeError($authenticationDisplayMessage, true, IOInterface::DEBUG); $this->displayedOriginAuthentications[] = $originUrl; } } $options['http']['follow_location'] = 0; if (isset($options['http']['header']) && !is_array($options['http']['header'])) { $options['http']['header'] = explode("\r\n", trim($options['http']['header'], "\r\n")); } foreach ($headers as $header) { $options['http']['header'][] = $header; } return $options; } private function handleRedirect(array $http_response_header, array $additionalOptions, $result) { if ($locationHeader = $this->findHeaderValue($http_response_header, 'location')) { if (parse_url($locationHeader, PHP_URL_SCHEME)) { // Absolute URL; e.g. https://example.com/composer $targetUrl = $locationHeader; } elseif (parse_url($locationHeader, PHP_URL_HOST)) { // Scheme relative; e.g. //example.com/foo $targetUrl = $this->scheme.':'.$locationHeader; } elseif ('/' === $locationHeader[0]) { // Absolute path; e.g. /foo $urlHost = parse_url($this->fileUrl, PHP_URL_HOST); // Replace path using hostname as an anchor. $targetUrl = preg_replace('{^(.+(?://|@)'.preg_quote($urlHost).'(?::\d+)?)(?:[/\?].*)?$}', '\1'.$locationHeader, $this->fileUrl); } else { // Relative path; e.g. foo // This actually differs from PHP which seems to add duplicate slashes. $targetUrl = preg_replace('{^(.+/)[^/?]*(?:\?.*)?$}', '\1'.$locationHeader, $this->fileUrl); } } if (!empty($targetUrl)) { $this->redirects++; $this->io->writeError('', true, IOInterface::DEBUG); $this->io->writeError(sprintf('Following redirect (%u) %s', $this->redirects, $this->stripCredentialsFromUrl($targetUrl)), true, IOInterface::DEBUG); $additionalOptions['redirects'] = $this->redirects; return $this->get(parse_url($targetUrl, PHP_URL_HOST), $targetUrl, $additionalOptions, $this->fileName, $this->progress); } if (!$this->retry) { $e = new TransportException('The "'.$this->fileUrl.'" file could not be downloaded, got redirect without Location ('.$http_response_header[0].')'); $e->setHeaders($http_response_header); $e->setResponse($result); throw $e; } return false; } /** * @param array $options * * @return array */ private function getTlsDefaults(array $options) { $ciphers = implode(':', array( 'ECDHE-RSA-AES128-GCM-SHA256', 'ECDHE-ECDSA-AES128-GCM-SHA256', 'ECDHE-RSA-AES256-GCM-SHA384', 'ECDHE-ECDSA-AES256-GCM-SHA384', 'DHE-RSA-AES128-GCM-SHA256', 'DHE-DSS-AES128-GCM-SHA256', 'kEDH+AESGCM', 'ECDHE-RSA-AES128-SHA256', 'ECDHE-ECDSA-AES128-SHA256', 'ECDHE-RSA-AES128-SHA', 'ECDHE-ECDSA-AES128-SHA', 'ECDHE-RSA-AES256-SHA384', 'ECDHE-ECDSA-AES256-SHA384', 'ECDHE-RSA-AES256-SHA', 'ECDHE-ECDSA-AES256-SHA', 'DHE-RSA-AES128-SHA256', 'DHE-RSA-AES128-SHA', 'DHE-DSS-AES128-SHA256', 'DHE-RSA-AES256-SHA256', 'DHE-DSS-AES256-SHA', 'DHE-RSA-AES256-SHA', 'AES128-GCM-SHA256', 'AES256-GCM-SHA384', 'AES128-SHA256', 'AES256-SHA256', 'AES128-SHA', 'AES256-SHA', 'AES', 'CAMELLIA', 'DES-CBC3-SHA', '!aNULL', '!eNULL', '!EXPORT', '!DES', '!RC4', '!MD5', '!PSK', '!aECDH', '!EDH-DSS-DES-CBC3-SHA', '!EDH-RSA-DES-CBC3-SHA', '!KRB5-DES-CBC3-SHA', )); /** * CN_match and SNI_server_name are only known once a URL is passed. * They will be set in the getOptionsForUrl() method which receives a URL. * * cafile or capath can be overridden by passing in those options to constructor. */ $defaults = array( 'ssl' => array( 'ciphers' => $ciphers, 'verify_peer' => true, 'verify_depth' => 7, 'SNI_enabled' => true, 'capture_peer_cert' => true, ), ); if (isset($options['ssl'])) { $defaults['ssl'] = array_replace_recursive($defaults['ssl'], $options['ssl']); } $caBundleLogger = $this->io instanceof LoggerInterface ? $this->io : null; /** * Attempt to find a local cafile or throw an exception if none pre-set * The user may go download one if this occurs. */ if (!isset($defaults['ssl']['cafile']) && !isset($defaults['ssl']['capath'])) { $result = CaBundle::getSystemCaRootBundlePath($caBundleLogger); if (is_dir($result)) { $defaults['ssl']['capath'] = $result; } else { $defaults['ssl']['cafile'] = $result; } } if (isset($defaults['ssl']['cafile']) && (!is_readable($defaults['ssl']['cafile']) || !CaBundle::validateCaFile($defaults['ssl']['cafile'], $caBundleLogger))) { throw new TransportException('The configured cafile was not valid or could not be read.'); } if (isset($defaults['ssl']['capath']) && (!is_dir($defaults['ssl']['capath']) || !is_readable($defaults['ssl']['capath']))) { throw new TransportException('The configured capath was not valid or could not be read.'); } /** * Disable TLS compression to prevent CRIME attacks where supported. */ if (PHP_VERSION_ID >= 50413) { $defaults['ssl']['disable_compression'] = true; } return $defaults; } /** * Fetch certificate common name and fingerprint for validation of SAN. * * @todo Remove when PHP 5.6 is minimum supported version. */ private function getCertificateCnAndFp($url, $options) { if (PHP_VERSION_ID >= 50600) { throw new \BadMethodCallException(sprintf( '%s must not be used on PHP >= 5.6', __METHOD__ )); } $context = StreamContextFactory::getContext($url, $options, array('options' => array( 'ssl' => array( 'capture_peer_cert' => true, 'verify_peer' => false, // Yes this is fucking insane! But PHP is lame. ), ), )); // Ideally this would just use stream_socket_client() to avoid sending a // HTTP request but that does not capture the certificate. if (false === $handle = @fopen($url, 'rb', false, $context)) { return; } // Close non authenticated connection without reading any content. fclose($handle); $handle = null; $params = stream_context_get_params($context); if (!empty($params['options']['ssl']['peer_certificate'])) { $peerCertificate = $params['options']['ssl']['peer_certificate']; if (TlsHelper::checkCertificateHost($peerCertificate, parse_url($url, PHP_URL_HOST), $commonName)) { return array( 'cn' => $commonName, 'fp' => TlsHelper::getCertificateFingerprint($peerCertificate), ); } } } private function getUrlAuthority($url) { $defaultPorts = array( 'ftp' => 21, 'http' => 80, 'https' => 443, 'ssh2.sftp' => 22, 'ssh2.scp' => 22, ); $scheme = parse_url($url, PHP_URL_SCHEME); if (!isset($defaultPorts[$scheme])) { throw new \InvalidArgumentException(sprintf( 'Could not get default port for unknown scheme: %s', $scheme )); } $defaultPort = $defaultPorts[$scheme]; $port = parse_url($url, PHP_URL_PORT) ?: $defaultPort; return parse_url($url, PHP_URL_HOST).':'.$port; } /** * @link https://github.com/composer/composer/issues/5584 * * @param string $urlToBitBucketFile URL to a file at bitbucket.org. * * @return bool Whether the given URL is a public BitBucket download which requires no authentication. */ private function isPublicBitBucketDownload($urlToBitBucketFile) { $domain = parse_url($urlToBitBucketFile, PHP_URL_HOST); if (strpos($domain, 'bitbucket.org') === false) { // Bitbucket downloads are hosted on amazonaws. // We do not need to authenticate there at all return true; } $path = parse_url($urlToBitBucketFile, PHP_URL_PATH); // Path for a public download follows this pattern /{user}/{repo}/downloads/{whatever} // {@link https://blog.bitbucket.org/2009/04/12/new-feature-downloads/} $pathParts = explode('/', $path); return count($pathParts) >= 4 && $pathParts[3] == 'downloads'; } public static function outputWarnings(IOInterface $io, $url, $data) { foreach (array('warning', 'info') as $type) { if (empty($data[$type])) { continue; } if (!empty($data[$type . '-versions'])) { $versionParser = new VersionParser(); $constraint = $versionParser->parseConstraints($data[$type . '-versions']); $composer = new Constraint('==', $versionParser->normalize(Composer::getVersion())); if (!$constraint->matches($composer)) { continue; } } $io->writeError('<'.$type.'>'.ucfirst($type).' from '.$url.': '.$data[$type].'</'.$type.'>'); } } public static function getOrigin($urlOrPath) { $hostPort = parse_url($urlOrPath, PHP_URL_HOST); if (!$hostPort) { return $urlOrPath; } if (parse_url($urlOrPath, PHP_URL_PORT)) { $hostPort .= ':'.parse_url($urlOrPath, PHP_URL_PORT); } return $hostPort; } private function stripCredentialsFromUrl($url) { // GitHub repository rename result in redirect locations containing the access_token as GET parameter // e.g. https://api.github.com/repositories/9999999999?access_token=github_token return preg_replace('{([&?]access_token=)[^&]+}', '$1***', $url); } } composer/src/Composer/Util/Silencer.php 0000644 00000004166 14736103146 0014157 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util; /** * Temporarily suppress PHP error reporting, usually warnings and below. * * @author Niels Keurentjes <niels.keurentjes@omines.com> */ class Silencer { /** * @var int[] Unpop stack */ private static $stack = array(); /** * Suppresses given mask or errors. * * @param int|null $mask Error levels to suppress, default value NULL indicates all warnings and below. * @return int The old error reporting level. */ public static function suppress($mask = null) { if (!isset($mask)) { $mask = E_WARNING | E_NOTICE | E_USER_WARNING | E_USER_NOTICE | E_DEPRECATED | E_USER_DEPRECATED | E_STRICT; } $old = error_reporting(); self::$stack[] = $old; error_reporting($old & ~$mask); return $old; } /** * Restores a single state. */ public static function restore() { if (!empty(self::$stack)) { error_reporting(array_pop(self::$stack)); } } /** * Calls a specified function while silencing warnings and below. * * Future improvement: when PHP requirements are raised add Callable type hint (5.4) and variadic parameters (5.6) * * @param callable $callable Function to execute. * @throws \Exception Any exceptions from the callback are rethrown. * @return mixed Return value of the callback. */ public static function call($callable /*, ...$parameters */) { try { self::suppress(); $result = call_user_func_array($callable, array_slice(func_get_args(), 1)); self::restore(); return $result; } catch (\Exception $e) { // Use a finally block for this when requirements are raised to PHP 5.5 self::restore(); throw $e; } } } composer/src/Composer/Util/ConfigValidator.php 0000644 00000017171 14736103146 0015466 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util; use Composer\Package\Loader\ArrayLoader; use Composer\Package\Loader\ValidatingArrayLoader; use Composer\Package\Loader\InvalidPackageException; use Composer\Json\JsonValidationException; use Composer\IO\IOInterface; use Composer\Json\JsonFile; use Composer\Spdx\SpdxLicenses; /** * Validates a composer configuration. * * @author Robert Schönthal <seroscho@googlemail.com> * @author Jordi Boggiano <j.boggiano@seld.be> */ class ConfigValidator { private $io; public function __construct(IOInterface $io) { $this->io = $io; } /** * Validates the config, and returns the result. * * @param string $file The path to the file * @param int $arrayLoaderValidationFlags Flags for ArrayLoader validation * * @return array a triple containing the errors, publishable errors, and warnings */ public function validate($file, $arrayLoaderValidationFlags = ValidatingArrayLoader::CHECK_ALL) { $errors = array(); $publishErrors = array(); $warnings = array(); // validate json schema $laxValid = false; try { $json = new JsonFile($file, null, $this->io); $manifest = $json->read(); $json->validateSchema(JsonFile::LAX_SCHEMA); $laxValid = true; $json->validateSchema(); } catch (JsonValidationException $e) { foreach ($e->getErrors() as $message) { if ($laxValid) { $publishErrors[] = $message; } else { $errors[] = $message; } } } catch (\Exception $e) { $errors[] = $e->getMessage(); return array($errors, $publishErrors, $warnings); } // validate actual data if (empty($manifest['license'])) { $warnings[] = 'No license specified, it is recommended to do so. For closed-source software you may use "proprietary" as license.'; } else { $licenses = (array) $manifest['license']; // strip proprietary since it's not a valid SPDX identifier, but is accepted by composer foreach ($licenses as $key => $license) { if ('proprietary' === $license) { unset($licenses[$key]); } } $licenseValidator = new SpdxLicenses(); foreach ($licenses as $license) { $spdxLicense = $licenseValidator->getLicenseByIdentifier($license); if ($spdxLicense && $spdxLicense[3]) { if (preg_match('{^[AL]?GPL-[123](\.[01])?\+$}i', $license)) { $warnings[] = sprintf( 'License "%s" is a deprecated SPDX license identifier, use "'.str_replace('+', '', $license).'-or-later" instead', $license ); } elseif (preg_match('{^[AL]?GPL-[123](\.[01])?$}i', $license)) { $warnings[] = sprintf( 'License "%s" is a deprecated SPDX license identifier, use "'.$license.'-only" or "'.$license.'-or-later" instead', $license ); } else { $warnings[] = sprintf( 'License "%s" is a deprecated SPDX license identifier, see https://spdx.org/licenses/', $license ); } } } } if (isset($manifest['version'])) { $warnings[] = 'The version field is present, it is recommended to leave it out if the package is published on Packagist.'; } if (!empty($manifest['name']) && preg_match('{[A-Z]}', $manifest['name'])) { $suggestName = preg_replace('{(?:([a-z])([A-Z])|([A-Z])([A-Z][a-z]))}', '\\1\\3-\\2\\4', $manifest['name']); $suggestName = strtolower($suggestName); $publishErrors[] = sprintf( 'Name "%s" does not match the best practice (e.g. lower-cased/with-dashes). We suggest using "%s" instead. As such you will not be able to submit it to Packagist.', $manifest['name'], $suggestName ); } if (!empty($manifest['type']) && $manifest['type'] == 'composer-installer') { $warnings[] = "The package type 'composer-installer' is deprecated. Please distribute your custom installers as plugins from now on. See https://getcomposer.org/doc/articles/plugins.md for plugin documentation."; } // check for require-dev overrides if (isset($manifest['require']) && isset($manifest['require-dev'])) { $requireOverrides = array_intersect_key($manifest['require'], $manifest['require-dev']); if (!empty($requireOverrides)) { $plural = (count($requireOverrides) > 1) ? 'are' : 'is'; $warnings[] = implode(', ', array_keys($requireOverrides)). " {$plural} required both in require and require-dev, this can lead to unexpected behavior"; } } // check for commit references $require = isset($manifest['require']) ? $manifest['require'] : array(); $requireDev = isset($manifest['require-dev']) ? $manifest['require-dev'] : array(); $packages = array_merge($require, $requireDev); foreach ($packages as $package => $version) { if (preg_match('/#/', $version) === 1) { $warnings[] = sprintf( 'The package "%s" is pointing to a commit-ref, this is bad practice and can cause unforeseen issues.', $package ); } } // report scripts-descriptions for non-existent scripts $scriptsDescriptions = isset($manifest['scripts-descriptions']) ? $manifest['scripts-descriptions'] : array(); $scripts = isset($manifest['scripts']) ? $manifest['scripts'] : array(); foreach ($scriptsDescriptions as $scriptName => $scriptDescription) { if (!array_key_exists($scriptName, $scripts)) { $warnings[] = sprintf( 'Description for non-existent script "%s" found in "scripts-descriptions"', $scriptName ); } } // check for empty psr-0/psr-4 namespace prefixes if (isset($manifest['autoload']['psr-0'][''])) { $warnings[] = "Defining autoload.psr-0 with an empty namespace prefix is a bad idea for performance"; } if (isset($manifest['autoload']['psr-4'][''])) { $warnings[] = "Defining autoload.psr-4 with an empty namespace prefix is a bad idea for performance"; } try { $loader = new ValidatingArrayLoader(new ArrayLoader(), true, null, $arrayLoaderValidationFlags); if (!isset($manifest['version'])) { $manifest['version'] = '1.0.0'; } if (!isset($manifest['name'])) { $manifest['name'] = 'dummy/dummy'; } $loader->load($manifest); } catch (InvalidPackageException $e) { $errors = array_merge($errors, $e->getErrors()); } $warnings = array_merge($warnings, $loader->getWarnings()); return array($errors, $publishErrors, $warnings); } } composer/src/Composer/Util/ProcessExecutor.php 0000644 00000014063 14736103146 0015545 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Util; use Composer\IO\IOInterface; use Symfony\Component\Process\Process; use Symfony\Component\Process\ProcessUtils; /** * @author Robert Schönthal <seroscho@googlemail.com> */ class ProcessExecutor { protected static $timeout = 300; protected $captureOutput; protected $errorOutput; protected $io; public function __construct(IOInterface $io = null) { $this->io = $io; } /** * runs a process on the commandline * * @param string $command the command to execute * @param mixed $output the output will be written into this var if passed by ref * if a callable is passed it will be used as output handler * @param string $cwd the working directory * @return int statuscode */ public function execute($command, &$output = null, $cwd = null) { if ($this->io && $this->io->isDebug()) { $safeCommand = preg_replace_callback('{://(?P<user>[^:/\s]+):(?P<password>[^@\s/]+)@}i', function ($m) { if (preg_match('{^[a-f0-9]{12,}$}', $m['user'])) { return '://***:***@'; } return '://'.$m['user'].':***@'; }, $command); $safeCommand = preg_replace("{--password (.*[^\\\\]\') }", '--password \'***\' ', $safeCommand); $this->io->writeError('Executing command ('.($cwd ?: 'CWD').'): '.$safeCommand); } // make sure that null translate to the proper directory in case the dir is a symlink // and we call a git command, because msysgit does not handle symlinks properly if (null === $cwd && Platform::isWindows() && false !== strpos($command, 'git') && getcwd()) { $cwd = realpath(getcwd()); } $this->captureOutput = func_num_args() > 1; $this->errorOutput = null; // TODO in v3, commands should be passed in as arrays of cmd + args if (method_exists('Symfony\Component\Process\Process', 'fromShellCommandline')) { $process = Process::fromShellCommandline($command, $cwd, null, null, static::getTimeout()); } else { $process = new Process($command, $cwd, null, null, static::getTimeout()); } $callback = is_callable($output) ? $output : array($this, 'outputHandler'); $process->run($callback); if ($this->captureOutput && !is_callable($output)) { $output = $process->getOutput(); } $this->errorOutput = $process->getErrorOutput(); return $process->getExitCode(); } public function splitLines($output) { $output = trim($output); return ((string) $output === '') ? array() : preg_split('{\r?\n}', $output); } /** * Get any error output from the last command * * @return string */ public function getErrorOutput() { return $this->errorOutput; } public function outputHandler($type, $buffer) { if ($this->captureOutput) { return; } if (null === $this->io) { echo $buffer; return; } if (method_exists($this->io, 'writeRaw')) { if (Process::ERR === $type) { $this->io->writeErrorRaw($buffer, false); } else { $this->io->writeRaw($buffer, false); } } else { if (Process::ERR === $type) { $this->io->writeError($buffer, false); } else { $this->io->write($buffer, false); } } } public static function getTimeout() { return static::$timeout; } public static function setTimeout($timeout) { static::$timeout = $timeout; } /** * Escapes a string to be used as a shell argument. * * @param string $argument The argument that will be escaped * * @return string The escaped argument */ public static function escape($argument) { return self::escapeArgument($argument); } /** * Copy of ProcessUtils::escapeArgument() that is deprecated in Symfony 3.3 and removed in Symfony 4. * * @param string $argument * * @return string */ private static function escapeArgument($argument) { //Fix for PHP bug #43784 escapeshellarg removes % from given string //Fix for PHP bug #49446 escapeshellarg doesn't work on Windows //@see https://bugs.php.net/bug.php?id=43784 //@see https://bugs.php.net/bug.php?id=49446 if ('\\' === DIRECTORY_SEPARATOR) { if ((string) $argument === '') { return escapeshellarg($argument); } $escapedArgument = ''; $quote = false; foreach (preg_split('/(")/', $argument, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE) as $part) { if ('"' === $part) { $escapedArgument .= '\\"'; } elseif (self::isSurroundedBy($part, '%')) { // Avoid environment variable expansion $escapedArgument .= '^%"'.substr($part, 1, -1).'"^%'; } else { // escape trailing backslash if ('\\' === substr($part, -1)) { $part .= '\\'; } $quote = true; $escapedArgument .= $part; } } if ($quote) { $escapedArgument = '"'.$escapedArgument.'"'; } return $escapedArgument; } return "'".str_replace("'", "'\\''", $argument)."'"; } private static function isSurroundedBy($arg, $char) { return 2 < strlen($arg) && $char === $arg[0] && $char === $arg[strlen($arg) - 1]; } } composer/src/Composer/Command/FundCommand.php 0000644 00000007223 14736103146 0015244 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\Package\CompletePackageInterface; use Composer\Package\AliasPackage; use Composer\Repository\CompositeRepository; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; /** * @author Nicolas Grekas <p@tchwork.com> * @author Jordi Boggiano <j.boggiano@seld.be> */ class FundCommand extends BaseCommand { protected function configure() { $this->setName('fund') ->setDescription('Discover how to help fund the maintenance of your dependencies.') ; } protected function execute(InputInterface $input, OutputInterface $output) { $composer = $this->getComposer(); $repo = $composer->getRepositoryManager()->getLocalRepository(); $remoteRepos = new CompositeRepository($composer->getRepositoryManager()->getRepositories()); $fundings = array(); foreach ($repo->getPackages() as $package) { if ($package instanceof AliasPackage) { continue; } $latest = $remoteRepos->findPackage($package->getName(), 'dev-master'); if ($latest instanceof CompletePackageInterface && $latest->getFunding()) { $fundings = $this->insertFundingData($fundings, $latest); continue; } if ($package instanceof CompletePackageInterface && $package->getFunding()) { $fundings = $this->insertFundingData($fundings, $package); } } ksort($fundings); $io = $this->getIO(); if ($fundings) { $prev = null; $io->write('The following packages were found in your dependencies which publish funding information:'); foreach ($fundings as $vendor => $links) { $io->write(''); $io->write(sprintf("<comment>%s</comment>", $vendor)); foreach ($links as $url => $packages) { $line = sprintf(' <info>%s</info>', implode(', ', $packages)); if ($prev !== $line) { $io->write($line); $prev = $line; } $io->write(sprintf(' %s', $url)); } } $io->write(""); $io->write("Please consider following these links and sponsoring the work of package authors!"); $io->write("Thank you!"); } else { $io->write("No funding links were found in your package dependencies. This doesn't mean they don't need your support!"); } return 0; } private function insertFundingData(array $fundings, CompletePackageInterface $package) { foreach ($package->getFunding() as $fundingOption) { list($vendor, $packageName) = explode('/', $package->getPrettyName()); // ignore malformed funding entries if (empty($fundingOption['url'])) { continue; } $url = $fundingOption['url']; if (!empty($fundingOption['type']) && $fundingOption['type'] === 'github' && preg_match('{^https://github.com/([^/]+)$}', $url, $match)) { $url = 'https://github.com/sponsors/'.$match[1]; } $fundings[$vendor][$url][] = $packageName; } return $fundings; } } composer/src/Composer/Command/SelfUpdateCommand.php 0000644 00000043031 14736103146 0016401 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\Composer; use Composer\Factory; use Composer\Config; use Composer\Util\Filesystem; use Composer\SelfUpdate\Keys; use Composer\SelfUpdate\Versions; use Composer\IO\IOInterface; use Composer\Downloader\FilesystemException; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Finder\Finder; /** * @author Igor Wiedler <igor@wiedler.ch> * @author Kevin Ran <kran@adobe.com> * @author Jordi Boggiano <j.boggiano@seld.be> */ class SelfUpdateCommand extends BaseCommand { const HOMEPAGE = 'getcomposer.org'; const OLD_INSTALL_EXT = '-old.phar'; protected function configure() { $this ->setName('self-update') ->setAliases(array('selfupdate')) ->setDescription('Updates composer.phar to the latest version.') ->setDefinition(array( new InputOption('rollback', 'r', InputOption::VALUE_NONE, 'Revert to an older installation of composer'), new InputOption('clean-backups', null, InputOption::VALUE_NONE, 'Delete old backups during an update. This makes the current version of composer the only backup available after the update'), new InputArgument('version', InputArgument::OPTIONAL, 'The version to update to'), new InputOption('no-progress', null, InputOption::VALUE_NONE, 'Do not output download progress.'), new InputOption('update-keys', null, InputOption::VALUE_NONE, 'Prompt user for a key update'), new InputOption('stable', null, InputOption::VALUE_NONE, 'Force an update to the stable channel'), new InputOption('preview', null, InputOption::VALUE_NONE, 'Force an update to the preview channel'), new InputOption('snapshot', null, InputOption::VALUE_NONE, 'Force an update to the snapshot channel'), new InputOption('1', null, InputOption::VALUE_NONE, 'Force an update to the stable channel, but only use 1.x versions'), new InputOption('2', null, InputOption::VALUE_NONE, 'Force an update to the stable channel, but only use 2.x versions'), new InputOption('set-channel-only', null, InputOption::VALUE_NONE, 'Only store the channel as the default one and then exit'), )) ->setHelp( <<<EOT The <info>self-update</info> command checks getcomposer.org for newer versions of composer and if found, installs the latest. <info>php composer.phar self-update</info> Read more at https://getcomposer.org/doc/03-cli.md#self-update-selfupdate- EOT ) ; } protected function execute(InputInterface $input, OutputInterface $output) { $config = Factory::createConfig(); if ($config->get('disable-tls') === true) { $baseUrl = 'http://' . self::HOMEPAGE; } else { $baseUrl = 'https://' . self::HOMEPAGE; } $io = $this->getIO(); $remoteFilesystem = Factory::createRemoteFilesystem($io, $config); $versionsUtil = new Versions($config, $remoteFilesystem); // switch channel if requested $requestedChannel = null; foreach (Versions::$channels as $channel) { if ($input->getOption($channel)) { $requestedChannel = $channel; $versionsUtil->setChannel($channel); break; } } if ($input->getOption('set-channel-only')) { return 0; } $cacheDir = $config->get('cache-dir'); $rollbackDir = $config->get('data-dir'); $home = $config->get('home'); $localFilename = realpath($_SERVER['argv'][0]) ?: $_SERVER['argv'][0]; if ($input->getOption('update-keys')) { return $this->fetchKeys($io, $config); } // check if current dir is writable and if not try the cache dir from settings $tmpDir = is_writable(dirname($localFilename)) ? dirname($localFilename) : $cacheDir; // check for permissions in local filesystem before start connection process if (!is_writable($tmpDir)) { throw new FilesystemException('Composer update failed: the "'.$tmpDir.'" directory used to download the temp file could not be written'); } // check if composer is running as the same user that owns the directory root, only if POSIX is defined and callable if (function_exists('posix_getpwuid') && function_exists('posix_geteuid')) { $composeUser = posix_getpwuid(posix_geteuid()); $homeOwner = posix_getpwuid(fileowner($home)); if (isset($composeUser['name']) && isset($homeOwner['name']) && $composeUser['name'] !== $homeOwner['name']) { $io->writeError('<warning>You are running composer as "'.$composeUser['name'].'", while "'.$home.'" is owned by "'.$homeOwner['name'].'"</warning>'); } } if ($input->getOption('rollback')) { return $this->rollback($output, $rollbackDir, $localFilename); } $latest = $versionsUtil->getLatest(); $latestStable = $versionsUtil->getLatest('stable'); $latestVersion = $latest['version']; $updateVersion = $input->getArgument('version') ?: $latestVersion; if ($requestedChannel && is_numeric($requestedChannel) && substr($latestStable['version'], 0, 1) !== $requestedChannel) { $io->writeError('<warning>Warning: You forced the install of '.$latestVersion.' via --'.$requestedChannel.', but '.$latestStable['version'].' is the latest stable version. Updating to it via composer self-update --stable is recommended.</warning>'); } if (preg_match('{^[0-9a-f]{40}$}', $updateVersion) && $updateVersion !== $latestVersion) { $io->writeError('<error>You can not update to a specific SHA-1 as those phars are not available for download</error>'); return 1; } if (Composer::VERSION === $updateVersion) { $io->writeError(sprintf('<info>You are already using composer version %s (%s channel).</info>', $updateVersion, $versionsUtil->getChannel())); // remove all backups except for the most recent, if any if ($input->getOption('clean-backups')) { $this->cleanBackups($rollbackDir, $this->getLastBackupVersion($rollbackDir)); } return 0; } $tempFilename = $tmpDir . '/' . basename($localFilename, '.phar').'-temp.phar'; $backupFile = sprintf( '%s/%s-%s%s', $rollbackDir, strtr(Composer::RELEASE_DATE, ' :', '_-'), preg_replace('{^([0-9a-f]{7})[0-9a-f]{33}$}', '$1', Composer::VERSION), self::OLD_INSTALL_EXT ); $updatingToTag = !preg_match('{^[0-9a-f]{40}$}', $updateVersion); $io->write(sprintf("Updating to version <info>%s</info> (%s channel).", $updateVersion, $versionsUtil->getChannel())); $remoteFilename = $baseUrl . ($updatingToTag ? "/download/{$updateVersion}/composer.phar" : '/composer.phar'); $signature = $remoteFilesystem->getContents(self::HOMEPAGE, $remoteFilename.'.sig', false); $io->writeError(' ', false); $remoteFilesystem->copy(self::HOMEPAGE, $remoteFilename, $tempFilename, !$input->getOption('no-progress')); $io->writeError(''); if (!file_exists($tempFilename) || !$signature) { $io->writeError('<error>The download of the new composer version failed for an unexpected reason</error>'); return 1; } // verify phar signature if (!extension_loaded('openssl') && $config->get('disable-tls')) { $io->writeError('<warning>Skipping phar signature verification as you have disabled OpenSSL via config.disable-tls</warning>'); } else { if (!extension_loaded('openssl')) { throw new \RuntimeException('The openssl extension is required for phar signatures to be verified but it is not available. ' . 'If you can not enable the openssl extension, you can disable this error, at your own risk, by setting the \'disable-tls\' option to true.'); } $sigFile = 'file://'.$home.'/' . ($updatingToTag ? 'keys.tags.pub' : 'keys.dev.pub'); if (!file_exists($sigFile)) { file_put_contents( $home.'/keys.dev.pub', <<<DEVPUBKEY -----BEGIN PUBLIC KEY----- MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAnBDHjZS6e0ZMoK3xTD7f FNCzlXjX/Aie2dit8QXA03pSrOTbaMnxON3hUL47Lz3g1SC6YJEMVHr0zYq4elWi i3ecFEgzLcj+pZM5X6qWu2Ozz4vWx3JYo1/a/HYdOuW9e3lwS8VtS0AVJA+U8X0A hZnBmGpltHhO8hPKHgkJtkTUxCheTcbqn4wGHl8Z2SediDcPTLwqezWKUfrYzu1f o/j3WFwFs6GtK4wdYtiXr+yspBZHO3y1udf8eFFGcb2V3EaLOrtfur6XQVizjOuk 8lw5zzse1Qp/klHqbDRsjSzJ6iL6F4aynBc6Euqt/8ccNAIz0rLjLhOraeyj4eNn 8iokwMKiXpcrQLTKH+RH1JCuOVxQ436bJwbSsp1VwiqftPQieN+tzqy+EiHJJmGf TBAbWcncicCk9q2md+AmhNbvHO4PWbbz9TzC7HJb460jyWeuMEvw3gNIpEo2jYa9 pMV6cVqnSa+wOc0D7pC9a6bne0bvLcm3S+w6I5iDB3lZsb3A9UtRiSP7aGSo7D72 8tC8+cIgZcI7k9vjvOqH+d7sdOU2yPCnRY6wFh62/g8bDnUpr56nZN1G89GwM4d4 r/TU7BQQIzsZgAiqOGXvVklIgAMiV0iucgf3rNBLjjeNEwNSTTG9F0CtQ+7JLwaE wSEuAuRm+pRqi8BRnQ/GKUcCAwEAAQ== -----END PUBLIC KEY----- DEVPUBKEY ); file_put_contents( $home.'/keys.tags.pub', <<<TAGSPUBKEY -----BEGIN PUBLIC KEY----- MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0Vi/2K6apCVj76nCnCl2 MQUPdK+A9eqkYBacXo2wQBYmyVlXm2/n/ZsX6pCLYPQTHyr5jXbkQzBw8SKqPdlh vA7NpbMeNCz7wP/AobvUXM8xQuXKbMDTY2uZ4O7sM+PfGbptKPBGLe8Z8d2sUnTO bXtX6Lrj13wkRto7st/w/Yp33RHe9SlqkiiS4MsH1jBkcIkEHsRaveZzedUaxY0M mba0uPhGUInpPzEHwrYqBBEtWvP97t2vtfx8I5qv28kh0Y6t+jnjL1Urid2iuQZf noCMFIOu4vksK5HxJxxrN0GOmGmwVQjOOtxkwikNiotZGPR4KsVj8NnBrLX7oGuM nQvGciiu+KoC2r3HDBrpDeBVdOWxDzT5R4iI0KoLzFh2pKqwbY+obNPS2bj+2dgJ rV3V5Jjry42QOCBN3c88wU1PKftOLj2ECpewY6vnE478IipiEu7EAdK8Zwj2LmTr RKQUSa9k7ggBkYZWAeO/2Ag0ey3g2bg7eqk+sHEq5ynIXd5lhv6tC5PBdHlWipDK tl2IxiEnejnOmAzGVivE1YGduYBjN+mjxDVy8KGBrjnz1JPgAvgdwJ2dYw4Rsc/e TzCFWGk/HM6a4f0IzBWbJ5ot0PIi4amk07IotBXDWwqDiQTwyuGCym5EqWQ2BD95 RGv89BPD+2DLnJysngsvVaUCAwEAAQ== -----END PUBLIC KEY----- TAGSPUBKEY ); } $pubkeyid = openssl_pkey_get_public($sigFile); $algo = defined('OPENSSL_ALGO_SHA384') ? OPENSSL_ALGO_SHA384 : 'SHA384'; if (!in_array('sha384', array_map('strtolower', openssl_get_md_methods()))) { throw new \RuntimeException('SHA384 is not supported by your openssl extension, could not verify the phar file integrity'); } $signature = json_decode($signature, true); $signature = base64_decode($signature['sha384']); $verified = 1 === openssl_verify(file_get_contents($tempFilename), $signature, $pubkeyid, $algo); openssl_free_key($pubkeyid); if (!$verified) { throw new \RuntimeException('The phar signature did not match the file you downloaded, this means your public keys are outdated or that the phar file is corrupt/has been modified'); } } // remove saved installations of composer if ($input->getOption('clean-backups')) { $this->cleanBackups($rollbackDir); } if ($err = $this->setLocalPhar($localFilename, $tempFilename, $backupFile)) { @unlink($tempFilename); $io->writeError('<error>The file is corrupted ('.$err->getMessage().').</error>'); $io->writeError('<error>Please re-run the self-update command to try again.</error>'); return 1; } if (file_exists($backupFile)) { $io->writeError(sprintf( 'Use <info>composer self-update --rollback</info> to return to version <comment>%s</comment>', Composer::VERSION )); } else { $io->writeError('<warning>A backup of the current version could not be written to '.$backupFile.', no rollback possible</warning>'); } return 0; } protected function fetchKeys(IOInterface $io, Config $config) { if (!$io->isInteractive()) { throw new \RuntimeException('Public keys can not be fetched in non-interactive mode, please run Composer interactively'); } $io->write('Open <info>https://composer.github.io/pubkeys.html</info> to find the latest keys'); $validator = function ($value) { if (!preg_match('{^-----BEGIN PUBLIC KEY-----$}', trim($value))) { throw new \UnexpectedValueException('Invalid input'); } return trim($value)."\n"; }; $devKey = ''; while (!preg_match('{(-----BEGIN PUBLIC KEY-----.+?-----END PUBLIC KEY-----)}s', $devKey, $match)) { $devKey = $io->askAndValidate('Enter Dev / Snapshot Public Key (including lines with -----): ', $validator); while ($line = $io->ask('')) { $devKey .= trim($line)."\n"; if (trim($line) === '-----END PUBLIC KEY-----') { break; } } } file_put_contents($keyPath = $config->get('home').'/keys.dev.pub', $match[0]); $io->write('Stored key with fingerprint: ' . Keys::fingerprint($keyPath)); $tagsKey = ''; while (!preg_match('{(-----BEGIN PUBLIC KEY-----.+?-----END PUBLIC KEY-----)}s', $tagsKey, $match)) { $tagsKey = $io->askAndValidate('Enter Tags Public Key (including lines with -----): ', $validator); while ($line = $io->ask('')) { $tagsKey .= trim($line)."\n"; if (trim($line) === '-----END PUBLIC KEY-----') { break; } } } file_put_contents($keyPath = $config->get('home').'/keys.tags.pub', $match[0]); $io->write('Stored key with fingerprint: ' . Keys::fingerprint($keyPath)); $io->write('Public keys stored in '.$config->get('home')); } protected function rollback(OutputInterface $output, $rollbackDir, $localFilename) { $rollbackVersion = $this->getLastBackupVersion($rollbackDir); if (!$rollbackVersion) { throw new \UnexpectedValueException('Composer rollback failed: no installation to roll back to in "'.$rollbackDir.'"'); } $oldFile = $rollbackDir . '/' . $rollbackVersion . self::OLD_INSTALL_EXT; if (!is_file($oldFile)) { throw new FilesystemException('Composer rollback failed: "'.$oldFile.'" could not be found'); } if (!is_readable($oldFile)) { throw new FilesystemException('Composer rollback failed: "'.$oldFile.'" could not be read'); } $io = $this->getIO(); $io->writeError(sprintf("Rolling back to version <info>%s</info>.", $rollbackVersion)); if ($err = $this->setLocalPhar($localFilename, $oldFile)) { $io->writeError('<error>The backup file was corrupted ('.$err->getMessage().').</error>'); return 1; } return 0; } /** * @param string $localFilename * @param string $newFilename * @param string $backupTarget * @throws \Exception * @return \UnexpectedValueException|\PharException|null */ protected function setLocalPhar($localFilename, $newFilename, $backupTarget = null) { try { @chmod($newFilename, fileperms($localFilename)); if (!ini_get('phar.readonly')) { // test the phar validity $phar = new \Phar($newFilename); // free the variable to unlock the file unset($phar); } // copy current file into installations dir if ($backupTarget && file_exists($localFilename)) { @copy($localFilename, $backupTarget); } rename($newFilename, $localFilename); return null; } catch (\Exception $e) { if (!$e instanceof \UnexpectedValueException && !$e instanceof \PharException) { throw $e; } return $e; } } protected function cleanBackups($rollbackDir, $except = null) { $finder = $this->getOldInstallationFinder($rollbackDir); $io = $this->getIO(); $fs = new Filesystem; foreach ($finder as $file) { if ($except && $file->getBasename(self::OLD_INSTALL_EXT) === $except) { continue; } $file = (string) $file; $io->writeError('<info>Removing: '.$file.'</info>'); $fs->remove($file); } } protected function getLastBackupVersion($rollbackDir) { $finder = $this->getOldInstallationFinder($rollbackDir); $finder->sortByName(); $files = iterator_to_array($finder); if (count($files)) { return basename(end($files), self::OLD_INSTALL_EXT); } return false; } protected function getOldInstallationFinder($rollbackDir) { $finder = Finder::create() ->depth(0) ->files() ->name('*' . self::OLD_INSTALL_EXT) ->in($rollbackDir); return $finder; } } composer/src/Composer/Command/UpdateCommand.php 0000644 00000025630 14736103146 0015574 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\Composer; use Composer\Installer; use Composer\IO\IOInterface; use Composer\Plugin\CommandEvent; use Composer\Plugin\PluginEvents; use Symfony\Component\Console\Helper\Table; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Question\Question; /** * @author Jordi Boggiano <j.boggiano@seld.be> * @author Nils Adermann <naderman@naderman.de> */ class UpdateCommand extends BaseCommand { protected function configure() { $this ->setName('update') ->setAliases(array('u', 'upgrade')) ->setDescription('Upgrades your dependencies to the latest version according to composer.json, and updates the composer.lock file.') ->setDefinition(array( new InputArgument('packages', InputArgument::IS_ARRAY | InputArgument::OPTIONAL, 'Packages that should be updated, if not provided all packages are.'), new InputOption('prefer-source', null, InputOption::VALUE_NONE, 'Forces installation from package sources when possible, including VCS information.'), new InputOption('prefer-dist', null, InputOption::VALUE_NONE, 'Forces installation from package dist even for dev versions.'), new InputOption('dry-run', null, InputOption::VALUE_NONE, 'Outputs the operations but will not execute anything (implicitly enables --verbose).'), new InputOption('dev', null, InputOption::VALUE_NONE, 'Enables installation of require-dev packages (enabled by default, only present for BC).'), new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Disables installation of require-dev packages.'), new InputOption('lock', null, InputOption::VALUE_NONE, 'Only updates the lock file hash to suppress warning about the lock file being out of date.'), new InputOption('no-custom-installers', null, InputOption::VALUE_NONE, 'DEPRECATED: Use no-plugins instead.'), new InputOption('no-autoloader', null, InputOption::VALUE_NONE, 'Skips autoloader generation'), new InputOption('no-scripts', null, InputOption::VALUE_NONE, 'Skips the execution of all scripts defined in composer.json file.'), new InputOption('no-progress', null, InputOption::VALUE_NONE, 'Do not output download progress.'), new InputOption('no-suggest', null, InputOption::VALUE_NONE, 'Do not show package suggestions.'), new InputOption('with-dependencies', null, InputOption::VALUE_NONE, 'Add also dependencies of whitelisted packages to the whitelist, except those defined in root package.'), new InputOption('with-all-dependencies', null, InputOption::VALUE_NONE, 'Add also all dependencies of whitelisted packages to the whitelist, including those defined in root package.'), new InputOption('verbose', 'v|vv|vvv', InputOption::VALUE_NONE, 'Shows more details including new commits pulled in when updating packages.'), new InputOption('optimize-autoloader', 'o', InputOption::VALUE_NONE, 'Optimize autoloader during autoloader dump.'), new InputOption('classmap-authoritative', 'a', InputOption::VALUE_NONE, 'Autoload classes from the classmap only. Implicitly enables `--optimize-autoloader`.'), new InputOption('apcu-autoloader', null, InputOption::VALUE_NONE, 'Use APCu to cache found/not-found classes.'), new InputOption('ignore-platform-reqs', null, InputOption::VALUE_NONE, 'Ignore platform requirements (php & ext- packages).'), new InputOption('prefer-stable', null, InputOption::VALUE_NONE, 'Prefer stable versions of dependencies.'), new InputOption('prefer-lowest', null, InputOption::VALUE_NONE, 'Prefer lowest versions of dependencies.'), new InputOption('interactive', 'i', InputOption::VALUE_NONE, 'Interactive interface with autocompletion to select the packages to update.'), new InputOption('root-reqs', null, InputOption::VALUE_NONE, 'Restricts the update to your first degree dependencies.'), )) ->setHelp( <<<EOT The <info>update</info> command reads the composer.json file from the current directory, processes it, and updates, removes or installs all the dependencies. <info>php composer.phar update</info> To limit the update operation to a few packages, you can list the package(s) you want to update as such: <info>php composer.phar update vendor/package1 foo/mypackage [...]</info> You may also use an asterisk (*) pattern to limit the update operation to package(s) from a specific vendor: <info>php composer.phar update vendor/package1 foo/* [...]</info> To select packages names interactively with auto-completion use <info>-i</info>. Read more at https://getcomposer.org/doc/03-cli.md#update-u EOT ) ; } protected function execute(InputInterface $input, OutputInterface $output) { $io = $this->getIO(); if ($input->getOption('no-custom-installers')) { $io->writeError('<warning>You are using the deprecated option "no-custom-installers". Use "no-plugins" instead.</warning>'); $input->setOption('no-plugins', true); } if ($input->getOption('dev')) { $io->writeError('<warning>You are using the deprecated option "dev". Dev packages are installed by default now.</warning>'); } $composer = $this->getComposer(true, $input->getOption('no-plugins')); $packages = $input->getArgument('packages'); if ($input->getOption('interactive')) { $packages = $this->getPackagesInteractively($io, $input, $output, $composer, $packages); } if ($input->getOption('root-reqs')) { $require = array_keys($composer->getPackage()->getRequires()); if (!$input->getOption('no-dev')) { $requireDev = array_keys($composer->getPackage()->getDevRequires()); $require = array_merge($require, $requireDev); } if (!empty($packages)) { $packages = array_intersect($packages, $require); } else { $packages = $require; } } $composer->getDownloadManager()->setOutputProgress(!$input->getOption('no-progress')); $commandEvent = new CommandEvent(PluginEvents::COMMAND, 'update', $input, $output); $composer->getEventDispatcher()->dispatch($commandEvent->getName(), $commandEvent); $install = Installer::create($io, $composer); $config = $composer->getConfig(); list($preferSource, $preferDist) = $this->getPreferredInstallOptions($config, $input); $optimize = $input->getOption('optimize-autoloader') || $config->get('optimize-autoloader'); $authoritative = $input->getOption('classmap-authoritative') || $config->get('classmap-authoritative'); $apcu = $input->getOption('apcu-autoloader') || $config->get('apcu-autoloader'); $install ->setDryRun($input->getOption('dry-run')) ->setVerbose($input->getOption('verbose')) ->setPreferSource($preferSource) ->setPreferDist($preferDist) ->setDevMode(!$input->getOption('no-dev')) ->setDumpAutoloader(!$input->getOption('no-autoloader')) ->setRunScripts(!$input->getOption('no-scripts')) ->setSkipSuggest($input->getOption('no-suggest')) ->setOptimizeAutoloader($optimize) ->setClassMapAuthoritative($authoritative) ->setApcuAutoloader($apcu) ->setUpdate(true) ->setUpdateWhitelist($input->getOption('lock') ? array('lock') : $packages) ->setWhitelistTransitiveDependencies($input->getOption('with-dependencies')) ->setWhitelistAllDependencies($input->getOption('with-all-dependencies')) ->setIgnorePlatformRequirements($input->getOption('ignore-platform-reqs')) ->setPreferStable($input->getOption('prefer-stable')) ->setPreferLowest($input->getOption('prefer-lowest')) ; if ($input->getOption('no-plugins')) { $install->disablePlugins(); } return $install->run(); } private function getPackagesInteractively(IOInterface $io, InputInterface $input, OutputInterface $output, Composer $composer, array $packages) { if (!$input->isInteractive()) { throw new \InvalidArgumentException('--interactive cannot be used in non-interactive terminals.'); } $requires = array_merge( $composer->getPackage()->getRequires(), $composer->getPackage()->getDevRequires() ); $autocompleterValues = array(); foreach ($requires as $require) { $target = $require->getTarget(); $autocompleterValues[strtolower($target)] = $target; } $installedPackages = $composer->getRepositoryManager()->getLocalRepository()->getPackages(); foreach ($installedPackages as $package) { $autocompleterValues[$package->getName()] = $package->getPrettyName(); } $helper = $this->getHelper('question'); $question = new Question('<comment>Enter package name: </comment>', null); $io->writeError('<info>Press enter without value to end submission</info>'); do { $autocompleterValues = array_diff($autocompleterValues, $packages); $question->setAutocompleterValues($autocompleterValues); $addedPackage = $helper->ask($input, $output, $question); if (!is_string($addedPackage) || empty($addedPackage)) { break; } $addedPackage = strtolower($addedPackage); if (!in_array($addedPackage, $packages)) { $packages[] = $addedPackage; } } while (true); $packages = array_filter($packages); if (!$packages) { throw new \InvalidArgumentException('You must enter minimum one package.'); } $table = new Table($output); $table->setHeaders(array('Selected packages')); foreach ($packages as $package) { $table->addRow(array($package)); } $table->render(); if ($io->askConfirmation(sprintf( 'Would you like to continue and update the above package%s [<comment>yes</comment>]? ', 1 === count($packages) ? '' : 's' ), true)) { return $packages; } throw new \RuntimeException('Installation aborted.'); } } composer/src/Composer/Command/OutdatedCommand.php 0000644 00000007511 14736103146 0016121 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\ArrayInput; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; /** * @author Jordi Boggiano <j.boggiano@seld.be> */ class OutdatedCommand extends ShowCommand { protected function configure() { $this ->setName('outdated') ->setDescription('Shows a list of installed packages that have updates available, including their latest version.') ->setDefinition(array( new InputArgument('package', InputArgument::OPTIONAL, 'Package to inspect. Or a name including a wildcard (*) to filter lists of packages instead.'), new InputOption('outdated', 'o', InputOption::VALUE_NONE, 'Show only packages that are outdated (this is the default, but present here for compat with `show`'), new InputOption('all', 'a', InputOption::VALUE_NONE, 'Show all installed packages with their latest versions'), new InputOption('direct', 'D', InputOption::VALUE_NONE, 'Shows only packages that are directly required by the root package'), new InputOption('strict', null, InputOption::VALUE_NONE, 'Return a non-zero exit code when there are outdated packages'), new InputOption('minor-only', 'm', InputOption::VALUE_NONE, 'Show only packages that have minor SemVer-compatible updates. Use with the --outdated option.'), new InputOption('format', 'f', InputOption::VALUE_REQUIRED, 'Format of the output: text or json', 'text'), new InputOption('ignore', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Ignore specified package(s). Use it with the --outdated option if you don\'t want to be informed about new versions of some packages.'), )) ->setHelp( <<<EOT The outdated command is just a proxy for `composer show -l` The color coding (or signage if you have ANSI colors disabled) for dependency versions is as such: - <info>green</info> (=): Dependency is in the latest version and is up to date. - <comment>yellow</comment> (~): Dependency has a new version available that includes backwards compatibility breaks according to semver, so upgrade when you can but it may involve work. - <highlight>red</highlight> (!): Dependency has a new version that is semver-compatible and you should upgrade it. Read more at https://getcomposer.org/doc/03-cli.md#outdated EOT ) ; } protected function execute(InputInterface $input, OutputInterface $output) { $args = array( 'command' => 'show', '--latest' => true, ); if (!$input->getOption('all')) { $args['--outdated'] = true; } if ($input->getOption('direct')) { $args['--direct'] = true; } if ($input->getArgument('package')) { $args['package'] = $input->getArgument('package'); } if ($input->getOption('strict')) { $args['--strict'] = true; } if ($input->getOption('minor-only')) { $args['--minor-only'] = true; } $args['--format'] = $input->getOption('format'); $args['--ignore'] = $input->getOption('ignore'); $input = new ArrayInput($args); return $this->getApplication()->run($input, $output); } /** * {@inheritDoc} */ public function isProxyCommand() { return true; } } composer/src/Composer/Command/LicensesCommand.php 0000644 00000013177 14736103146 0016122 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\Json\JsonFile; use Composer\Plugin\CommandEvent; use Composer\Plugin\PluginEvents; use Composer\Package\PackageInterface; use Composer\Repository\RepositoryInterface; use Symfony\Component\Console\Helper\Table; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; /** * @author Benoît Merlet <benoit.merlet@gmail.com> */ class LicensesCommand extends BaseCommand { protected function configure() { $this ->setName('licenses') ->setDescription('Shows information about licenses of dependencies.') ->setDefinition(array( new InputOption('format', 'f', InputOption::VALUE_REQUIRED, 'Format of the output: text or json', 'text'), new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Disables search in require-dev packages.'), )) ->setHelp( <<<EOT The license command displays detailed information about the licenses of the installed dependencies. Read more at https://getcomposer.org/doc/03-cli.md#licenses EOT ) ; } protected function execute(InputInterface $input, OutputInterface $output) { $composer = $this->getComposer(); $commandEvent = new CommandEvent(PluginEvents::COMMAND, 'licenses', $input, $output); $composer->getEventDispatcher()->dispatch($commandEvent->getName(), $commandEvent); $root = $composer->getPackage(); $repo = $composer->getRepositoryManager()->getLocalRepository(); if ($input->getOption('no-dev')) { $packages = $this->filterRequiredPackages($repo, $root); } else { $packages = $this->appendPackages($repo->getPackages(), array()); } ksort($packages); $io = $this->getIO(); switch ($format = $input->getOption('format')) { case 'text': $io->write('Name: <comment>'.$root->getPrettyName().'</comment>'); $io->write('Version: <comment>'.$root->getFullPrettyVersion().'</comment>'); $io->write('Licenses: <comment>'.(implode(', ', $root->getLicense()) ?: 'none').'</comment>'); $io->write('Dependencies:'); $io->write(''); $table = new Table($output); $table->setStyle('compact'); $tableStyle = $table->getStyle(); if (method_exists($tableStyle, 'setVerticalBorderChars')) { $tableStyle->setVerticalBorderChars(''); } else { $tableStyle->setVerticalBorderChar(''); } $tableStyle->setCellRowContentFormat('%s '); $table->setHeaders(array('Name', 'Version', 'License')); foreach ($packages as $package) { $table->addRow(array( $package->getPrettyName(), $package->getFullPrettyVersion(), implode(', ', $package->getLicense()) ?: 'none', )); } $table->render(); break; case 'json': $dependencies = array(); foreach ($packages as $package) { $dependencies[$package->getPrettyName()] = array( 'version' => $package->getFullPrettyVersion(), 'license' => $package->getLicense(), ); } $io->write(JsonFile::encode(array( 'name' => $root->getPrettyName(), 'version' => $root->getFullPrettyVersion(), 'license' => $root->getLicense(), 'dependencies' => $dependencies, ))); break; default: throw new \RuntimeException(sprintf('Unsupported format "%s". See help for supported formats.', $format)); } return 0; } /** * Find package requires and child requires * * @param RepositoryInterface $repo * @param PackageInterface $package * @param array $bucket * @return array */ private function filterRequiredPackages(RepositoryInterface $repo, PackageInterface $package, $bucket = array()) { $requires = array_keys($package->getRequires()); $packageListNames = array_keys($bucket); $packages = array_filter( $repo->getPackages(), function ($package) use ($requires, $packageListNames) { return in_array($package->getName(), $requires) && !in_array($package->getName(), $packageListNames); } ); $bucket = $this->appendPackages($packages, $bucket); foreach ($packages as $package) { $bucket = $this->filterRequiredPackages($repo, $package, $bucket); } return $bucket; } /** * Adds packages to the package list * * @param array $packages the list of packages to add * @param array $bucket the list to add packages to * @return array */ public function appendPackages(array $packages, array $bucket) { foreach ($packages as $package) { $bucket[$package->getName()] = $package; } return $bucket; } } composer/src/Composer/Command/ConfigCommand.php 0000644 00000072717 14736103146 0015567 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\Util\Platform; use Composer\Util\Silencer; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Composer\Config; use Composer\Config\JsonConfigSource; use Composer\Factory; use Composer\IO\IOInterface; use Composer\Json\JsonFile; use Composer\Semver\VersionParser; use Composer\Package\BasePackage; /** * @author Joshua Estes <Joshua.Estes@iostudio.com> * @author Jordi Boggiano <j.boggiano@seld.be> */ class ConfigCommand extends BaseCommand { /** * @var Config */ protected $config; /** * @var JsonFile */ protected $configFile; /** * @var JsonConfigSource */ protected $configSource; /** * @var JsonFile */ protected $authConfigFile; /** * @var JsonConfigSource */ protected $authConfigSource; /** * {@inheritDoc} */ protected function configure() { $this ->setName('config') ->setDescription('Sets config options.') ->setDefinition(array( new InputOption('global', 'g', InputOption::VALUE_NONE, 'Apply command to the global config file'), new InputOption('editor', 'e', InputOption::VALUE_NONE, 'Open editor'), new InputOption('auth', 'a', InputOption::VALUE_NONE, 'Affect auth config file (only used for --editor)'), new InputOption('unset', null, InputOption::VALUE_NONE, 'Unset the given setting-key'), new InputOption('list', 'l', InputOption::VALUE_NONE, 'List configuration settings'), new InputOption('file', 'f', InputOption::VALUE_REQUIRED, 'If you want to choose a different composer.json or config.json'), new InputOption('absolute', null, InputOption::VALUE_NONE, 'Returns absolute paths when fetching *-dir config values instead of relative'), new InputArgument('setting-key', null, 'Setting key'), new InputArgument('setting-value', InputArgument::IS_ARRAY, 'Setting value'), )) ->setHelp( <<<EOT This command allows you to edit composer config settings and repositories in either the local composer.json file or the global config.json file. Additionally it lets you edit most properties in the local composer.json. To set a config setting: <comment>%command.full_name% bin-dir bin/</comment> To read a config setting: <comment>%command.full_name% bin-dir</comment> Outputs: <info>bin</info> To edit the global config.json file: <comment>%command.full_name% --global</comment> To add a repository: <comment>%command.full_name% repositories.foo vcs https://bar.com</comment> To remove a repository (repo is a short alias for repositories): <comment>%command.full_name% --unset repo.foo</comment> To disable packagist: <comment>%command.full_name% repo.packagist false</comment> You can alter repositories in the global config.json file by passing in the <info>--global</info> option. To add or edit suggested packages you can use: <comment>%command.full_name% suggest.package reason for the suggestion</comment> To add or edit extra properties you can use: <comment>%command.full_name% extra.property value</comment> To edit the file in an external editor: <comment>%command.full_name% --editor</comment> To choose your editor you can set the "EDITOR" env variable. To get a list of configuration values in the file: <comment>%command.full_name% --list</comment> You can always pass more than one option. As an example, if you want to edit the global config.json file. <comment>%command.full_name% --editor --global</comment> Read more at https://getcomposer.org/doc/03-cli.md#config EOT ) ; } /** * {@inheritDoc} */ protected function initialize(InputInterface $input, OutputInterface $output) { parent::initialize($input, $output); if ($input->getOption('global') && null !== $input->getOption('file')) { throw new \RuntimeException('--file and --global can not be combined'); } $io = $this->getIO(); $this->config = Factory::createConfig($io); // Get the local composer.json, global config.json, or if the user // passed in a file to use $configFile = $input->getOption('global') ? ($this->config->get('home') . '/config.json') : ($input->getOption('file') ?: Factory::getComposerFile()); // Create global composer.json if this was invoked using `composer global config` if ( ($configFile === 'composer.json' || $configFile === './composer.json') && !file_exists($configFile) && realpath(getcwd()) === realpath($this->config->get('home')) ) { file_put_contents($configFile, "{\n}\n"); } $this->configFile = new JsonFile($configFile, null, $io); $this->configSource = new JsonConfigSource($this->configFile); $authConfigFile = $input->getOption('global') ? ($this->config->get('home') . '/auth.json') : dirname(realpath($configFile)) . '/auth.json'; $this->authConfigFile = new JsonFile($authConfigFile, null, $io); $this->authConfigSource = new JsonConfigSource($this->authConfigFile, true); // Initialize the global file if it's not there, ignoring any warnings or notices if ($input->getOption('global') && !$this->configFile->exists()) { touch($this->configFile->getPath()); $this->configFile->write(array('config' => new \ArrayObject)); Silencer::call('chmod', $this->configFile->getPath(), 0600); } if ($input->getOption('global') && !$this->authConfigFile->exists()) { touch($this->authConfigFile->getPath()); $this->authConfigFile->write(array('bitbucket-oauth' => new \ArrayObject, 'github-oauth' => new \ArrayObject, 'gitlab-oauth' => new \ArrayObject, 'gitlab-token' => new \ArrayObject, 'http-basic' => new \ArrayObject, 'bearer' => new \ArrayObject)); Silencer::call('chmod', $this->authConfigFile->getPath(), 0600); } if (!$this->configFile->exists()) { throw new \RuntimeException(sprintf('File "%s" cannot be found in the current directory', $configFile)); } } /** * {@inheritDoc} */ protected function execute(InputInterface $input, OutputInterface $output) { // Open file in editor if ($input->getOption('editor')) { $editor = escapeshellcmd(getenv('EDITOR')); if (!$editor) { if (Platform::isWindows()) { $editor = 'notepad'; } else { foreach (array('editor', 'vim', 'vi', 'nano', 'pico', 'ed') as $candidate) { if (exec('which '.$candidate)) { $editor = $candidate; break; } } } } $file = $input->getOption('auth') ? $this->authConfigFile->getPath() : $this->configFile->getPath(); system($editor . ' ' . $file . (Platform::isWindows() ? '' : ' > `tty`')); return 0; } if (!$input->getOption('global')) { $this->config->merge($this->configFile->read()); $this->config->merge(array('config' => $this->authConfigFile->exists() ? $this->authConfigFile->read() : array())); } // List the configuration of the file settings if ($input->getOption('list')) { $this->listConfiguration($this->config->all(), $this->config->raw(), $output); return 0; } $settingKey = $input->getArgument('setting-key'); if (!$settingKey) { return 0; } // If the user enters in a config variable, parse it and save to file if (array() !== $input->getArgument('setting-value') && $input->getOption('unset')) { throw new \RuntimeException('You can not combine a setting value with --unset'); } // show the value if no value is provided if (array() === $input->getArgument('setting-value') && !$input->getOption('unset')) { $properties = array('name', 'type', 'description', 'homepage', 'version', 'minimum-stability', 'prefer-stable', 'keywords', 'license', 'extra'); $rawData = $this->configFile->read(); $data = $this->config->all(); if (preg_match('/^repos?(?:itories)?(?:\.(.+))?/', $settingKey, $matches)) { if (!isset($matches[1]) || $matches[1] === '') { $value = isset($data['repositories']) ? $data['repositories'] : array(); } else { if (!isset($data['repositories'][$matches[1]])) { throw new \InvalidArgumentException('There is no '.$matches[1].' repository defined'); } $value = $data['repositories'][$matches[1]]; } } elseif (strpos($settingKey, '.')) { $bits = explode('.', $settingKey); if ($bits[0] === 'extra') { $data = $rawData; } else { $data = $data['config']; } $match = false; foreach ($bits as $bit) { $key = isset($key) ? $key.'.'.$bit : $bit; $match = false; if (isset($data[$key])) { $match = true; $data = $data[$key]; unset($key); } } if (!$match) { throw new \RuntimeException($settingKey.' is not defined.'); } $value = $data; } elseif (isset($data['config'][$settingKey])) { $value = $this->config->get($settingKey, $input->getOption('absolute') ? 0 : Config::RELATIVE_PATHS); } elseif (in_array($settingKey, $properties, true) && isset($rawData[$settingKey])) { $value = $rawData[$settingKey]; } else { throw new \RuntimeException($settingKey.' is not defined'); } if (is_array($value)) { $value = json_encode($value); } $this->getIO()->write($value, true, IOInterface::QUIET); return 0; } $values = $input->getArgument('setting-value'); // what the user is trying to add/change $booleanValidator = function ($val) { return in_array($val, array('true', 'false', '1', '0'), true); }; $booleanNormalizer = function ($val) { return $val !== 'false' && (bool) $val; }; // handle config values $uniqueConfigValues = array( 'process-timeout' => array('is_numeric', 'intval'), 'use-include-path' => array($booleanValidator, $booleanNormalizer), 'use-github-api' => array($booleanValidator, $booleanNormalizer), 'preferred-install' => array( function ($val) { return in_array($val, array('auto', 'source', 'dist'), true); }, function ($val) { return $val; }, ), 'store-auths' => array( function ($val) { return in_array($val, array('true', 'false', 'prompt'), true); }, function ($val) { if ('prompt' === $val) { return 'prompt'; } return $val !== 'false' && (bool) $val; }, ), 'notify-on-install' => array($booleanValidator, $booleanNormalizer), 'vendor-dir' => array('is_string', function ($val) { return $val; }), 'bin-dir' => array('is_string', function ($val) { return $val; }), 'archive-dir' => array('is_string', function ($val) { return $val; }), 'archive-format' => array('is_string', function ($val) { return $val; }), 'data-dir' => array('is_string', function ($val) { return $val; }), 'cache-dir' => array('is_string', function ($val) { return $val; }), 'cache-files-dir' => array('is_string', function ($val) { return $val; }), 'cache-repo-dir' => array('is_string', function ($val) { return $val; }), 'cache-vcs-dir' => array('is_string', function ($val) { return $val; }), 'cache-ttl' => array('is_numeric', 'intval'), 'cache-files-ttl' => array('is_numeric', 'intval'), 'cache-files-maxsize' => array( function ($val) { return preg_match('/^\s*([0-9.]+)\s*(?:([kmg])(?:i?b)?)?\s*$/i', $val) > 0; }, function ($val) { return $val; }, ), 'bin-compat' => array( function ($val) { return in_array($val, array('auto', 'full')); }, function ($val) { return $val; }, ), 'discard-changes' => array( function ($val) { return in_array($val, array('stash', 'true', 'false', '1', '0'), true); }, function ($val) { if ('stash' === $val) { return 'stash'; } return $val !== 'false' && (bool) $val; }, ), 'autoloader-suffix' => array('is_string', function ($val) { return $val === 'null' ? null : $val; }), 'sort-packages' => array($booleanValidator, $booleanNormalizer), 'optimize-autoloader' => array($booleanValidator, $booleanNormalizer), 'classmap-authoritative' => array($booleanValidator, $booleanNormalizer), 'apcu-autoloader' => array($booleanValidator, $booleanNormalizer), 'prepend-autoloader' => array($booleanValidator, $booleanNormalizer), 'disable-tls' => array($booleanValidator, $booleanNormalizer), 'secure-http' => array($booleanValidator, $booleanNormalizer), 'cafile' => array( function ($val) { return file_exists($val) && is_readable($val); }, function ($val) { return $val === 'null' ? null : $val; }, ), 'capath' => array( function ($val) { return is_dir($val) && is_readable($val); }, function ($val) { return $val === 'null' ? null : $val; }, ), 'github-expose-hostname' => array($booleanValidator, $booleanNormalizer), 'htaccess-protect' => array($booleanValidator, $booleanNormalizer), 'lock' => array($booleanValidator, $booleanNormalizer), ); $multiConfigValues = array( 'github-protocols' => array( function ($vals) { if (!is_array($vals)) { return 'array expected'; } foreach ($vals as $val) { if (!in_array($val, array('git', 'https', 'ssh'))) { return 'valid protocols include: git, https, ssh'; } } return true; }, function ($vals) { return $vals; }, ), 'github-domains' => array( function ($vals) { if (!is_array($vals)) { return 'array expected'; } return true; }, function ($vals) { return $vals; }, ), 'gitlab-domains' => array( function ($vals) { if (!is_array($vals)) { return 'array expected'; } return true; }, function ($vals) { return $vals; }, ), ); if ($input->getOption('unset') && (isset($uniqueConfigValues[$settingKey]) || isset($multiConfigValues[$settingKey]))) { if ($settingKey === 'disable-tls' && $this->config->get('disable-tls')) { $this->getIO()->writeError('<info>You are now running Composer with SSL/TLS protection enabled.</info>'); } $this->configSource->removeConfigSetting($settingKey); return 0; } if (isset($uniqueConfigValues[$settingKey])) { $this->handleSingleValue($settingKey, $uniqueConfigValues[$settingKey], $values, 'addConfigSetting'); return 0; } if (isset($multiConfigValues[$settingKey])) { $this->handleMultiValue($settingKey, $multiConfigValues[$settingKey], $values, 'addConfigSetting'); return 0; } // handle preferred-install per-package config if (preg_match('/^preferred-install\.(.+)/', $settingKey, $matches)) { if ($input->getOption('unset')) { $this->configSource->removeConfigSetting($settingKey); return 0; } list($validator) = $uniqueConfigValues['preferred-install']; if (!$validator($values[0])) { throw new \RuntimeException('Invalid value for '.$settingKey.'. Should be one of: auto, source, or dist'); } $this->configSource->addConfigSetting($settingKey, $values[0]); return 0; } // handle properties $uniqueProps = array( 'name' => array('is_string', function ($val) { return $val; }), 'type' => array('is_string', function ($val) { return $val; }), 'description' => array('is_string', function ($val) { return $val; }), 'homepage' => array('is_string', function ($val) { return $val; }), 'version' => array('is_string', function ($val) { return $val; }), 'minimum-stability' => array( function ($val) { return isset(BasePackage::$stabilities[VersionParser::normalizeStability($val)]); }, function ($val) { return VersionParser::normalizeStability($val); }, ), 'prefer-stable' => array($booleanValidator, $booleanNormalizer), ); $multiProps = array( 'keywords' => array( function ($vals) { if (!is_array($vals)) { return 'array expected'; } return true; }, function ($vals) { return $vals; }, ), 'license' => array( function ($vals) { if (!is_array($vals)) { return 'array expected'; } return true; }, function ($vals) { return $vals; }, ), ); if ($input->getOption('global') && (isset($uniqueProps[$settingKey]) || isset($multiProps[$settingKey]) || substr($settingKey, 0, 6) === 'extra.')) { throw new \InvalidArgumentException('The '.$settingKey.' property can not be set in the global config.json file. Use `composer global config` to apply changes to the global composer.json'); } if ($input->getOption('unset') && (isset($uniqueProps[$settingKey]) || isset($multiProps[$settingKey]))) { $this->configSource->removeProperty($settingKey); return 0; } if (isset($uniqueProps[$settingKey])) { $this->handleSingleValue($settingKey, $uniqueProps[$settingKey], $values, 'addProperty'); return 0; } if (isset($multiProps[$settingKey])) { $this->handleMultiValue($settingKey, $multiProps[$settingKey], $values, 'addProperty'); return 0; } // handle repositories if (preg_match('/^repos?(?:itories)?\.(.+)/', $settingKey, $matches)) { if ($input->getOption('unset')) { $this->configSource->removeRepository($matches[1]); return 0; } if (2 === count($values)) { $this->configSource->addRepository($matches[1], array( 'type' => $values[0], 'url' => $values[1], )); return 0; } if (1 === count($values)) { $value = strtolower($values[0]); if (true === $booleanValidator($value)) { if (false === $booleanNormalizer($value)) { $this->configSource->addRepository($matches[1], false); return 0; } } else { $value = JsonFile::parseJson($values[0]); $this->configSource->addRepository($matches[1], $value); return 0; } } throw new \RuntimeException('You must pass the type and a url. Example: php composer.phar config repositories.foo vcs https://bar.com'); } // handle extra if (preg_match('/^extra\.(.+)/', $settingKey, $matches)) { if ($input->getOption('unset')) { $this->configSource->removeProperty($settingKey); return 0; } $this->configSource->addProperty($settingKey, $values[0]); return 0; } // handle suggest if (preg_match('/^suggest\.(.+)/', $settingKey, $matches)) { if ($input->getOption('unset')) { $this->configSource->removeProperty($settingKey); return 0; } $this->configSource->addProperty($settingKey, implode(' ', $values)); return 0; } // handle unsetting extra/suggest if (in_array($settingKey, array('suggest', 'extra'), true) && $input->getOption('unset')) { $this->configSource->removeProperty($settingKey); return 0; } // handle platform if (preg_match('/^platform\.(.+)/', $settingKey, $matches)) { if ($input->getOption('unset')) { $this->configSource->removeConfigSetting($settingKey); return 0; } $this->configSource->addConfigSetting($settingKey, $values[0]); return 0; } // handle unsetting platform if ($settingKey === 'platform' && $input->getOption('unset')) { $this->configSource->removeConfigSetting($settingKey); return 0; } // handle auth if (preg_match('/^(bitbucket-oauth|github-oauth|gitlab-oauth|gitlab-token|http-basic|bearer)\.(.+)/', $settingKey, $matches)) { if ($input->getOption('unset')) { $this->authConfigSource->removeConfigSetting($matches[1].'.'.$matches[2]); $this->configSource->removeConfigSetting($matches[1].'.'.$matches[2]); return 0; } if ($matches[1] === 'bitbucket-oauth') { if (2 !== count($values)) { throw new \RuntimeException('Expected two arguments (consumer-key, consumer-secret), got '.count($values)); } $this->configSource->removeConfigSetting($matches[1].'.'.$matches[2]); $this->authConfigSource->addConfigSetting($matches[1].'.'.$matches[2], array('consumer-key' => $values[0], 'consumer-secret' => $values[1])); } elseif (in_array($matches[1], array('github-oauth', 'gitlab-oauth', 'gitlab-token', 'bearer'), true)) { if (1 !== count($values)) { throw new \RuntimeException('Too many arguments, expected only one token'); } $this->configSource->removeConfigSetting($matches[1].'.'.$matches[2]); $this->authConfigSource->addConfigSetting($matches[1].'.'.$matches[2], $values[0]); } elseif ($matches[1] === 'http-basic') { if (2 !== count($values)) { throw new \RuntimeException('Expected two arguments (username, password), got '.count($values)); } $this->configSource->removeConfigSetting($matches[1].'.'.$matches[2]); $this->authConfigSource->addConfigSetting($matches[1].'.'.$matches[2], array('username' => $values[0], 'password' => $values[1])); } return 0; } // handle script if (preg_match('/^scripts\.(.+)/', $settingKey, $matches)) { if ($input->getOption('unset')) { $this->configSource->removeProperty($settingKey); return 0; } $this->configSource->addProperty($settingKey, count($values) > 1 ? $values : $values[0]); return 0; } throw new \InvalidArgumentException('Setting '.$settingKey.' does not exist or is not supported by this command'); } protected function handleSingleValue($key, array $callbacks, array $values, $method) { list($validator, $normalizer) = $callbacks; if (1 !== count($values)) { throw new \RuntimeException('You can only pass one value. Example: php composer.phar config process-timeout 300'); } if (true !== $validation = $validator($values[0])) { throw new \RuntimeException(sprintf( '"%s" is an invalid value'.($validation ? ' ('.$validation.')' : ''), $values[0] )); } $normalizedValue = $normalizer($values[0]); if ($key === 'disable-tls') { if (!$normalizedValue && $this->config->get('disable-tls')) { $this->getIO()->writeError('<info>You are now running Composer with SSL/TLS protection enabled.</info>'); } elseif ($normalizedValue && !$this->config->get('disable-tls')) { $this->getIO()->writeError('<warning>You are now running Composer with SSL/TLS protection disabled.</warning>'); } } return call_user_func(array($this->configSource, $method), $key, $normalizedValue); } protected function handleMultiValue($key, array $callbacks, array $values, $method) { list($validator, $normalizer) = $callbacks; if (true !== $validation = $validator($values)) { throw new \RuntimeException(sprintf( '%s is an invalid value'.($validation ? ' ('.$validation.')' : ''), json_encode($values) )); } return call_user_func(array($this->configSource, $method), $key, $normalizer($values)); } /** * Display the contents of the file in a pretty formatted way * * @param array $contents * @param array $rawContents * @param OutputInterface $output * @param string|null $k */ protected function listConfiguration(array $contents, array $rawContents, OutputInterface $output, $k = null) { $origK = $k; $io = $this->getIO(); foreach ($contents as $key => $value) { if ($k === null && !in_array($key, array('config', 'repositories'))) { continue; } $rawVal = isset($rawContents[$key]) ? $rawContents[$key] : null; if (is_array($value) && (!is_numeric(key($value)) || ($key === 'repositories' && null === $k))) { $k .= preg_replace('{^config\.}', '', $key . '.'); $this->listConfiguration($value, $rawVal, $output, $k); $k = $origK; continue; } if (is_array($value)) { $value = array_map(function ($val) { return is_array($val) ? json_encode($val) : $val; }, $value); $value = '['.implode(', ', $value).']'; } if (is_bool($value)) { $value = var_export($value, true); } if (is_string($rawVal) && $rawVal != $value) { $io->write('[<comment>' . $k . $key . '</comment>] <info>' . $rawVal . ' (' . $value . ')</info>', true, IOInterface::QUIET); } else { $io->write('[<comment>' . $k . $key . '</comment>] <info>' . $value . '</info>', true, IOInterface::QUIET); } } } } composer/src/Composer/Command/SuggestsCommand.php 0000644 00000012354 14736103146 0016155 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\Repository\PlatformRepository; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; class SuggestsCommand extends BaseCommand { protected function configure() { $this ->setName('suggests') ->setDescription('Shows package suggestions.') ->setDefinition(array( new InputOption('by-package', null, InputOption::VALUE_NONE, 'Groups output by suggesting package'), new InputOption('by-suggestion', null, InputOption::VALUE_NONE, 'Groups output by suggested package'), new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Exclude suggestions from require-dev packages'), new InputArgument('packages', InputArgument::IS_ARRAY | InputArgument::OPTIONAL, 'Packages that you want to list suggestions from.'), )) ->setHelp( <<<EOT The <info>%command.name%</info> command shows a sorted list of suggested packages. Enabling <info>-v</info> implies <info>--by-package --by-suggestion</info>, showing both lists. Read more at https://getcomposer.org/doc/03-cli.md#suggests EOT ) ; } protected function execute(InputInterface $input, OutputInterface $output) { $lock = $this->getComposer()->getLocker()->getLockData(); if (empty($lock)) { throw new \RuntimeException('Lockfile seems to be empty?'); } $packages = $lock['packages']; if (!$input->getOption('no-dev')) { $packages += $lock['packages-dev']; } $filter = $input->getArgument('packages'); // First assemble lookup list of packages that are installed, replaced or provided $installed = array(); foreach ($packages as $package) { $installed[] = $package['name']; if (!empty($package['provide'])) { $installed = array_merge($installed, array_keys($package['provide'])); } if (!empty($package['replace'])) { $installed = array_merge($installed, array_keys($package['replace'])); } } // Undub and sort the install list into a sorted lookup array $installed = array_flip($installed); ksort($installed); // Init platform repo $platform = new PlatformRepository(array(), $this->getComposer()->getConfig()->get('platform') ?: array()); // Next gather all suggestions that are not in that list $suggesters = array(); $suggested = array(); foreach ($packages as $package) { $packageName = $package['name']; if ((!empty($filter) && !in_array($packageName, $filter)) || empty($package['suggest'])) { continue; } foreach ($package['suggest'] as $suggestion => $reason) { if (preg_match(PlatformRepository::PLATFORM_PACKAGE_REGEX, $suggestion) && null !== $platform->findPackage($suggestion, '*')) { continue; } if (!isset($installed[$suggestion])) { $suggesters[$packageName][$suggestion] = $reason; $suggested[$suggestion][$packageName] = $reason; } } } ksort($suggesters); ksort($suggested); // Determine output mode $mode = 0; $io = $this->getIO(); if ($input->getOption('by-package') || $io->isVerbose()) { $mode |= 1; } if ($input->getOption('by-suggestion')) { $mode |= 2; } // Simple mode if ($mode === 0) { foreach (array_keys($suggested) as $suggestion) { $io->write(sprintf('<info>%s</info>', $suggestion)); } return 0; } // Grouped by package if ($mode & 1) { foreach ($suggesters as $suggester => $suggestions) { $io->write(sprintf('<comment>%s</comment> suggests:', $suggester)); foreach ($suggestions as $suggestion => $reason) { $io->write(sprintf(' - <info>%s</info>: %s', $suggestion, $reason ?: '*')); } $io->write(''); } } // Grouped by suggestion if ($mode & 2) { // Improve readability in full mode if ($mode & 1) { $io->write(str_repeat('-', 78)); } foreach ($suggested as $suggestion => $suggesters) { $io->write(sprintf('<comment>%s</comment> is suggested by:', $suggestion)); foreach ($suggesters as $suggester => $reason) { $io->write(sprintf(' - <info>%s</info>: %s', $suggester, $reason ?: '*')); } $io->write(''); } } return 0; } } composer/src/Composer/Command/InitCommand.php 0000644 00000100317 14736103146 0015251 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\DependencyResolver\Pool; use Composer\Factory; use Composer\Json\JsonFile; use Composer\Package\BasePackage; use Composer\Package\Package; use Composer\Package\Version\VersionParser; use Composer\Package\Version\VersionSelector; use Composer\Repository\CompositeRepository; use Composer\Repository\PlatformRepository; use Composer\Repository\RepositoryFactory; use Composer\Util\ProcessExecutor; use Symfony\Component\Console\Input\ArrayInput; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Process\ExecutableFinder; use Symfony\Component\Process\Process; /** * @author Justin Rainbow <justin.rainbow@gmail.com> * @author Jordi Boggiano <j.boggiano@seld.be> */ class InitCommand extends BaseCommand { /** @var CompositeRepository */ protected $repos; /** @var array */ private $gitConfig; /** @var Pool[] */ private $pools; /** * {@inheritdoc} */ protected function configure() { $this ->setName('init') ->setDescription('Creates a basic composer.json file in current directory.') ->setDefinition(array( new InputOption('name', null, InputOption::VALUE_REQUIRED, 'Name of the package'), new InputOption('description', null, InputOption::VALUE_REQUIRED, 'Description of package'), new InputOption('author', null, InputOption::VALUE_REQUIRED, 'Author name of package'), // new InputOption('version', null, InputOption::VALUE_NONE, 'Version of package'), new InputOption('type', null, InputOption::VALUE_OPTIONAL, 'Type of package (e.g. library, project, metapackage, composer-plugin)'), new InputOption('homepage', null, InputOption::VALUE_REQUIRED, 'Homepage of package'), new InputOption('require', null, InputOption::VALUE_IS_ARRAY | InputOption::VALUE_REQUIRED, 'Package to require with a version constraint, e.g. foo/bar:1.0.0 or foo/bar=1.0.0 or "foo/bar 1.0.0"'), new InputOption('require-dev', null, InputOption::VALUE_IS_ARRAY | InputOption::VALUE_REQUIRED, 'Package to require for development with a version constraint, e.g. foo/bar:1.0.0 or foo/bar=1.0.0 or "foo/bar 1.0.0"'), new InputOption('stability', 's', InputOption::VALUE_REQUIRED, 'Minimum stability (empty or one of: '.implode(', ', array_keys(BasePackage::$stabilities)).')'), new InputOption('license', 'l', InputOption::VALUE_REQUIRED, 'License of package'), new InputOption('repository', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Add custom repositories, either by URL or using JSON arrays'), )) ->setHelp( <<<EOT The <info>init</info> command creates a basic composer.json file in the current directory. <info>php composer.phar init</info> Read more at https://getcomposer.org/doc/03-cli.md#init EOT ) ; } /** * {@inheritdoc} */ protected function execute(InputInterface $input, OutputInterface $output) { $io = $this->getIO(); $whitelist = array('name', 'description', 'author', 'type', 'homepage', 'require', 'require-dev', 'stability', 'license'); $options = array_filter(array_intersect_key($input->getOptions(), array_flip($whitelist))); if (isset($options['author'])) { $options['authors'] = $this->formatAuthors($options['author']); unset($options['author']); } $repositories = $input->getOption('repository'); if ($repositories) { $config = Factory::createConfig($io); foreach ($repositories as $repo) { $options['repositories'][] = RepositoryFactory::configFromString($io, $config, $repo); } } if (isset($options['stability'])) { $options['minimum-stability'] = $options['stability']; unset($options['stability']); } $options['require'] = isset($options['require']) ? $this->formatRequirements($options['require']) : new \stdClass; if (array() === $options['require']) { $options['require'] = new \stdClass; } if (isset($options['require-dev'])) { $options['require-dev'] = $this->formatRequirements($options['require-dev']); if (array() === $options['require-dev']) { $options['require-dev'] = new \stdClass; } } $file = new JsonFile(Factory::getComposerFile()); $json = $file->encode($options); if ($input->isInteractive()) { $io->writeError(array('', $json, '')); if (!$io->askConfirmation('Do you confirm generation [<comment>yes</comment>]? ', true)) { $io->writeError('<error>Command aborted</error>'); return 1; } } $file->write($options); if ($input->isInteractive() && is_dir('.git')) { $ignoreFile = realpath('.gitignore'); if (false === $ignoreFile) { $ignoreFile = realpath('.') . '/.gitignore'; } if (!$this->hasVendorIgnore($ignoreFile)) { $question = 'Would you like the <info>vendor</info> directory added to your <info>.gitignore</info> [<comment>yes</comment>]? '; if ($io->askConfirmation($question, true)) { $this->addVendorIgnore($ignoreFile); } } } $question = 'Would you like to install dependencies now [<comment>yes</comment>]? '; if ($input->isInteractive() && $this->hasDependencies($options) && $io->askConfirmation($question, true)) { $this->installDependencies($output); } return 0; } /** * {@inheritdoc} */ protected function interact(InputInterface $input, OutputInterface $output) { $git = $this->getGitConfig(); $io = $this->getIO(); $formatter = $this->getHelperSet()->get('formatter'); // initialize repos if configured $repositories = $input->getOption('repository'); if ($repositories) { $config = Factory::createConfig($io); $repos = array(new PlatformRepository); $createDefaultPackagistRepo = true; foreach ($repositories as $repo) { $repoConfig = RepositoryFactory::configFromString($io, $config, $repo); if ( (isset($repoConfig['packagist']) && $repoConfig === array('packagist' => false)) || (isset($repoConfig['packagist.org']) && $repoConfig === array('packagist.org' => false)) ) { $createDefaultPackagistRepo = false; continue; } $repos[] = RepositoryFactory::createRepo($io, $config, $repoConfig); } if ($createDefaultPackagistRepo) { $repos[] = RepositoryFactory::createRepo($io, $config, array( 'type' => 'composer', 'url' => 'https://repo.packagist.org', )); } $this->repos = new CompositeRepository($repos); unset($repos, $config, $repositories); } $io->writeError(array( '', $formatter->formatBlock('Welcome to the Composer config generator', 'bg=blue;fg=white', true), '', )); // namespace $io->writeError(array( '', 'This command will guide you through creating your composer.json config.', '', )); $cwd = realpath("."); if (!$name = $input->getOption('name')) { $name = basename($cwd); $name = preg_replace('{(?:([a-z])([A-Z])|([A-Z])([A-Z][a-z]))}', '\\1\\3-\\2\\4', $name); $name = strtolower($name); if (!empty($_SERVER['COMPOSER_DEFAULT_VENDOR'])) { $name = $_SERVER['COMPOSER_DEFAULT_VENDOR'] . '/' . $name; } elseif (isset($git['github.user'])) { $name = $git['github.user'] . '/' . $name; } elseif (!empty($_SERVER['USERNAME'])) { $name = $_SERVER['USERNAME'] . '/' . $name; } elseif (!empty($_SERVER['USER'])) { $name = $_SERVER['USER'] . '/' . $name; } elseif (get_current_user()) { $name = get_current_user() . '/' . $name; } else { // package names must be in the format foo/bar $name .= '/' . $name; } $name = strtolower($name); } else { if (!preg_match('{^[a-z0-9_.-]+/[a-z0-9_.-]+$}D', $name)) { throw new \InvalidArgumentException( 'The package name '.$name.' is invalid, it should be lowercase and have a vendor name, a forward slash, and a package name, matching: [a-z0-9_.-]+/[a-z0-9_.-]+' ); } } $name = $io->askAndValidate( 'Package name (<vendor>/<name>) [<comment>'.$name.'</comment>]: ', function ($value) use ($name) { if (null === $value) { return $name; } if (!preg_match('{^[a-z0-9_.-]+/[a-z0-9_.-]+$}D', $value)) { throw new \InvalidArgumentException( 'The package name '.$value.' is invalid, it should be lowercase and have a vendor name, a forward slash, and a package name, matching: [a-z0-9_.-]+/[a-z0-9_.-]+' ); } return $value; }, null, $name ); $input->setOption('name', $name); $description = $input->getOption('description') ?: false; $description = $io->ask( 'Description [<comment>'.$description.'</comment>]: ', $description ); $input->setOption('description', $description); if (null === $author = $input->getOption('author')) { if (!empty($_SERVER['COMPOSER_DEFAULT_AUTHOR'])) { $author_name = $_SERVER['COMPOSER_DEFAULT_AUTHOR']; } elseif (isset($git['user.name'])) { $author_name = $git['user.name']; } if (!empty($_SERVER['COMPOSER_DEFAULT_EMAIL'])) { $author_email = $_SERVER['COMPOSER_DEFAULT_EMAIL']; } elseif (isset($git['user.email'])) { $author_email = $git['user.email']; } if (isset($author_name) && isset($author_email)) { $author = sprintf('%s <%s>', $author_name, $author_email); } } $self = $this; $author = $io->askAndValidate( 'Author [<comment>'.$author.'</comment>, n to skip]: ', function ($value) use ($self, $author) { if ($value === 'n' || $value === 'no') { return; } $value = $value ?: $author; $author = $self->parseAuthorString($value); return sprintf('%s <%s>', $author['name'], $author['email']); }, null, $author ); $input->setOption('author', $author); $minimumStability = $input->getOption('stability') ?: null; $minimumStability = $io->askAndValidate( 'Minimum Stability [<comment>'.$minimumStability.'</comment>]: ', function ($value) use ($minimumStability) { if (null === $value) { return $minimumStability; } if (!isset(BasePackage::$stabilities[$value])) { throw new \InvalidArgumentException( 'Invalid minimum stability "'.$value.'". Must be empty or one of: '. implode(', ', array_keys(BasePackage::$stabilities)) ); } return $value; }, null, $minimumStability ); $input->setOption('stability', $minimumStability); $type = $input->getOption('type') ?: false; $type = $io->ask( 'Package Type (e.g. library, project, metapackage, composer-plugin) [<comment>'.$type.'</comment>]: ', $type ); $input->setOption('type', $type); if (null === $license = $input->getOption('license')) { if (!empty($_SERVER['COMPOSER_DEFAULT_LICENSE'])) { $license = $_SERVER['COMPOSER_DEFAULT_LICENSE']; } } $license = $io->ask( 'License [<comment>'.$license.'</comment>]: ', $license ); $input->setOption('license', $license); $io->writeError(array('', 'Define your dependencies.', '')); // prepare to resolve dependencies $repos = $this->getRepos(); $preferredStability = $minimumStability ?: 'stable'; $phpVersion = $repos->findPackage('php', '*')->getPrettyVersion(); $question = 'Would you like to define your dependencies (require) interactively [<comment>yes</comment>]? '; $require = $input->getOption('require'); $requirements = array(); if ($require || $io->askConfirmation($question, true)) { $requirements = $this->determineRequirements($input, $output, $require, $phpVersion, $preferredStability); } $input->setOption('require', $requirements); $question = 'Would you like to define your dev dependencies (require-dev) interactively [<comment>yes</comment>]? '; $requireDev = $input->getOption('require-dev'); $devRequirements = array(); if ($requireDev || $io->askConfirmation($question, true)) { $devRequirements = $this->determineRequirements($input, $output, $requireDev, $phpVersion, $preferredStability); } $input->setOption('require-dev', $devRequirements); } /** * @private * @param string $author * @return array */ public function parseAuthorString($author) { if (preg_match('/^(?P<name>[- .,\p{L}\p{N}\p{Mn}\'’"()]+) <(?P<email>.+?)>$/u', $author, $match)) { if ($this->isValidEmail($match['email'])) { return array( 'name' => trim($match['name']), 'email' => $match['email'], ); } } throw new \InvalidArgumentException( 'Invalid author string. Must be in the format: '. 'John Smith <john@example.com>' ); } protected function findPackages($name) { return $this->getRepos()->search($name); } protected function getRepos() { if (!$this->repos) { $this->repos = new CompositeRepository(array_merge( array(new PlatformRepository), RepositoryFactory::defaultRepos($this->getIO()) )); } return $this->repos; } final protected function determineRequirements(InputInterface $input, OutputInterface $output, $requires = array(), $phpVersion = null, $preferredStability = 'stable', $checkProvidedVersions = true, $fixed = false) { if ($requires) { $requires = $this->normalizeRequirements($requires); $result = array(); $io = $this->getIO(); foreach ($requires as $requirement) { if (!isset($requirement['version'])) { // determine the best version automatically list($name, $version) = $this->findBestVersionAndNameForPackage($input, $requirement['name'], $phpVersion, $preferredStability, null, null, $fixed); $requirement['version'] = $version; // replace package name from packagist.org $requirement['name'] = $name; $io->writeError(sprintf( 'Using version <info>%s</info> for <info>%s</info>', $requirement['version'], $requirement['name'] )); } else { // check that the specified version/constraint exists before we proceed list($name, $version) = $this->findBestVersionAndNameForPackage($input, $requirement['name'], $phpVersion, $preferredStability, $checkProvidedVersions ? $requirement['version'] : null, 'dev', $fixed); // replace package name from packagist.org $requirement['name'] = $name; } $result[] = $requirement['name'] . ' ' . $requirement['version']; } return $result; } $versionParser = new VersionParser(); // Collect existing packages $composer = $this->getComposer(false); $installedRepo = $composer ? $composer->getRepositoryManager()->getLocalRepository() : null; $existingPackages = array(); if ($installedRepo) { foreach ($installedRepo->getPackages() as $package) { $existingPackages[] = $package->getName(); } } foreach ($requires as $requiredPackage) { $existingPackages[] = substr($requiredPackage, 0, strpos($requiredPackage, ' ')); } unset($composer, $installedRepo, $requiredPackage); $io = $this->getIO(); while (null !== $package = $io->ask('Search for a package: ')) { $matches = $this->findPackages($package); if (count($matches)) { // Remove existing packages from search results. foreach ($matches as $position => $foundPackage) { if (in_array($foundPackage['name'], $existingPackages, true)) { unset($matches[$position]); } } $matches = array_values($matches); $exactMatch = null; $choices = array(); foreach ($matches as $position => $foundPackage) { $abandoned = ''; if (isset($foundPackage['abandoned'])) { if (is_string($foundPackage['abandoned'])) { $replacement = sprintf('Use %s instead', $foundPackage['abandoned']); } else { $replacement = 'No replacement was suggested'; } $abandoned = sprintf('<warning>Abandoned. %s.</warning>', $replacement); } $choices[] = sprintf(' <info>%5s</info> %s %s', "[$position]", $foundPackage['name'], $abandoned); if ($foundPackage['name'] === $package) { $exactMatch = true; break; } } // no match, prompt which to pick if (!$exactMatch) { $io->writeError(array( '', sprintf('Found <info>%s</info> packages matching <info>%s</info>', count($matches), $package), '', )); $io->writeError($choices); $io->writeError(''); $validator = function ($selection) use ($matches, $versionParser) { if ('' === $selection) { return false; } if (is_numeric($selection) && isset($matches[(int) $selection])) { $package = $matches[(int) $selection]; return $package['name']; } if (preg_match('{^\s*(?P<name>[\S/]+)(?:\s+(?P<version>\S+))?\s*$}', $selection, $packageMatches)) { if (isset($packageMatches['version'])) { // parsing `acme/example ~2.3` // validate version constraint $versionParser->parseConstraints($packageMatches['version']); return $packageMatches['name'].' '.$packageMatches['version']; } // parsing `acme/example` return $packageMatches['name']; } throw new \Exception('Not a valid selection'); }; $package = $io->askAndValidate( 'Enter package # to add, or the complete package name if it is not listed: ', $validator, 3, false ); } // no constraint yet, determine the best version automatically if (false !== $package && false === strpos($package, ' ')) { $validator = function ($input) { $input = trim($input); return $input ?: false; }; $constraint = $io->askAndValidate( 'Enter the version constraint to require (or leave blank to use the latest version): ', $validator, 3, false ); if (false === $constraint) { list($name, $constraint) = $this->findBestVersionAndNameForPackage($input, $package, $phpVersion, $preferredStability); $io->writeError(sprintf( 'Using version <info>%s</info> for <info>%s</info>', $constraint, $package )); } $package .= ' '.$constraint; } if (false !== $package) { $requires[] = $package; $existingPackages[] = substr($package, 0, strpos($package, ' ')); } } } return $requires; } protected function formatAuthors($author) { return array($this->parseAuthorString($author)); } protected function formatRequirements(array $requirements) { $requires = array(); $requirements = $this->normalizeRequirements($requirements); foreach ($requirements as $requirement) { $requires[$requirement['name']] = $requirement['version']; } return $requires; } protected function getGitConfig() { if (null !== $this->gitConfig) { return $this->gitConfig; } $finder = new ExecutableFinder(); $gitBin = $finder->find('git'); // TODO in v3 always call with an array if (method_exists('Symfony\Component\Process\Process', 'fromShellCommandline')) { $cmd = new Process(array($gitBin, 'config', '-l')); } else { $cmd = new Process(sprintf('%s config -l', ProcessExecutor::escape($gitBin))); } $cmd->run(); if ($cmd->isSuccessful()) { $this->gitConfig = array(); preg_match_all('{^([^=]+)=(.*)$}m', $cmd->getOutput(), $matches, PREG_SET_ORDER); foreach ($matches as $match) { $this->gitConfig[$match[1]] = $match[2]; } return $this->gitConfig; } return $this->gitConfig = array(); } /** * Checks the local .gitignore file for the Composer vendor directory. * * Tested patterns include: * "/$vendor" * "$vendor" * "$vendor/" * "/$vendor/" * "/$vendor/*" * "$vendor/*" * * @param string $ignoreFile * @param string $vendor * * @return bool */ protected function hasVendorIgnore($ignoreFile, $vendor = 'vendor') { if (!file_exists($ignoreFile)) { return false; } $pattern = sprintf('{^/?%s(/\*?)?$}', preg_quote($vendor)); $lines = file($ignoreFile, FILE_IGNORE_NEW_LINES); foreach ($lines as $line) { if (preg_match($pattern, $line)) { return true; } } return false; } protected function normalizeRequirements(array $requirements) { $parser = new VersionParser(); return $parser->parseNameVersionPairs($requirements); } protected function addVendorIgnore($ignoreFile, $vendor = '/vendor/') { $contents = ""; if (file_exists($ignoreFile)) { $contents = file_get_contents($ignoreFile); if ("\n" !== substr($contents, 0, -1)) { $contents .= "\n"; } } file_put_contents($ignoreFile, $contents . $vendor. "\n"); } protected function isValidEmail($email) { // assume it's valid if we can't validate it if (!function_exists('filter_var')) { return true; } // php <5.3.3 has a very broken email validator, so bypass checks if (PHP_VERSION_ID < 50303) { return true; } return false !== filter_var($email, FILTER_VALIDATE_EMAIL); } private function getPool(InputInterface $input, $minimumStability = null) { $key = $minimumStability ?: 'default'; if (!isset($this->pools[$key])) { $this->pools[$key] = $pool = new Pool($minimumStability ?: $this->getMinimumStability($input)); $pool->addRepository($this->getRepos()); } return $this->pools[$key]; } private function getMinimumStability(InputInterface $input) { if ($input->hasOption('stability')) { return VersionParser::normalizeStability($input->getOption('stability') ?: 'stable'); } $file = Factory::getComposerFile(); if (is_file($file) && is_readable($file) && is_array($composer = json_decode(file_get_contents($file), true))) { if (!empty($composer['minimum-stability'])) { return VersionParser::normalizeStability($composer['minimum-stability']); } } return 'stable'; } /** * Given a package name, this determines the best version to use in the require key. * * This returns a version with the ~ operator prefixed when possible. * * @param InputInterface $input * @param string $name * @param string|null $phpVersion * @param string $preferredStability * @param string|null $requiredVersion * @param string $minimumStability * @param bool $fixed * @throws \InvalidArgumentException * @return array name version */ private function findBestVersionAndNameForPackage(InputInterface $input, $name, $phpVersion, $preferredStability = 'stable', $requiredVersion = null, $minimumStability = null, $fixed = null) { // find the latest version allowed in this pool $versionSelector = new VersionSelector($this->getPool($input, $minimumStability)); $ignorePlatformReqs = $input->hasOption('ignore-platform-reqs') && $input->getOption('ignore-platform-reqs'); // ignore phpVersion if platform requirements are ignored if ($ignorePlatformReqs) { $phpVersion = null; } $package = $versionSelector->findBestCandidate($name, $requiredVersion, $phpVersion, $preferredStability); if (!$package) { // platform packages can not be found in the pool in versions other than the local platform's has // so if platform reqs are ignored we just take the user's word for it if ($ignorePlatformReqs && preg_match(PlatformRepository::PLATFORM_PACKAGE_REGEX, $name)) { return array($name, $requiredVersion ?: '*'); } // Check whether the PHP version was the problem if ($phpVersion && $versionSelector->findBestCandidate($name, $requiredVersion, null, $preferredStability)) { throw new \InvalidArgumentException(sprintf( 'Package %s at version %s has a PHP requirement incompatible with your PHP version (%s)', $name, $requiredVersion, $phpVersion )); } // Check whether the required version was the problem if ($requiredVersion && $versionSelector->findBestCandidate($name, null, $phpVersion, $preferredStability)) { throw new \InvalidArgumentException(sprintf( 'Could not find package %s in a version matching %s', $name, $requiredVersion )); } // Check whether the PHP version was the problem if ($phpVersion && $versionSelector->findBestCandidate($name)) { throw new \InvalidArgumentException(sprintf( 'Could not find package %s in any version matching your PHP version (%s)', $name, $phpVersion )); } // Check for similar names/typos $similar = $this->findSimilar($name); if ($similar) { // Check whether the minimum stability was the problem but the package exists if ($requiredVersion === null && in_array($name, $similar, true)) { throw new \InvalidArgumentException(sprintf( 'Could not find a version of package %s matching your minimum-stability (%s). Require it with an explicit version constraint allowing its desired stability.', $name, $this->getMinimumStability($input) )); } throw new \InvalidArgumentException(sprintf( "Could not find package %s.\n\nDid you mean " . (count($similar) > 1 ? 'one of these' : 'this') . "?\n %s", $name, implode("\n ", $similar) )); } throw new \InvalidArgumentException(sprintf( 'Could not find a matching version of package %s. Check the package spelling, your version constraint and that the package is available in a stability which matches your minimum-stability (%s).', $name, $this->getMinimumStability($input) )); } return array( $package->getPrettyName(), $fixed ? $package->getPrettyVersion() : $versionSelector->findRecommendedRequireVersion($package), ); } private function findSimilar($package) { try { $results = $this->repos->search($package); } catch (\Exception $e) { // ignore search errors return array(); } $similarPackages = array(); $installedRepo = $this->getComposer()->getRepositoryManager()->getLocalRepository(); foreach ($results as $result) { if ($installedRepo->findPackage($result['name'], '*')) { // Ignore installed package continue; } $similarPackages[$result['name']] = levenshtein($package, $result['name']); } asort($similarPackages); return array_keys(array_slice($similarPackages, 0, 5)); } private function installDependencies($output) { try { $installCommand = $this->getApplication()->find('install'); $installCommand->run(new ArrayInput(array()), $output); } catch (\Exception $e) { $this->getIO()->writeError('Could not install dependencies. Run `composer install` to see more information.'); } } private function hasDependencies($options) { $requires = (array) $options['require']; $devRequires = isset($options['require-dev']) ? (array) $options['require-dev'] : array(); return !empty($requires) || !empty($devRequires); } } composer/src/Composer/Command/DiagnoseCommand.php 0000644 00000070442 14736103146 0016104 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\Composer; use Composer\Factory; use Composer\Config; use Composer\Downloader\TransportException; use Composer\Repository\PlatformRepository; use Composer\Plugin\CommandEvent; use Composer\Plugin\PluginEvents; use Composer\Util\ConfigValidator; use Composer\Util\IniHelper; use Composer\Util\ProcessExecutor; use Composer\Util\RemoteFilesystem; use Composer\Util\StreamContextFactory; use Composer\SelfUpdate\Keys; use Composer\SelfUpdate\Versions; use Composer\IO\NullIO; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; /** * @author Jordi Boggiano <j.boggiano@seld.be> */ class DiagnoseCommand extends BaseCommand { /** @var RemoteFilesystem */ protected $rfs; /** @var ProcessExecutor */ protected $process; /** @var int */ protected $exitCode = 0; protected function configure() { $this ->setName('diagnose') ->setDescription('Diagnoses the system to identify common errors.') ->setHelp( <<<EOT The <info>diagnose</info> command checks common errors to help debugging problems. The process exit code will be 1 in case of warnings and 2 for errors. Read more at https://getcomposer.org/doc/03-cli.md#diagnose EOT ) ; } /** * {@inheritdoc} */ protected function execute(InputInterface $input, OutputInterface $output) { $composer = $this->getComposer(false); $io = $this->getIO(); if ($composer) { $commandEvent = new CommandEvent(PluginEvents::COMMAND, 'diagnose', $input, $output); $composer->getEventDispatcher()->dispatch($commandEvent->getName(), $commandEvent); $io->write('Checking composer.json: ', false); $this->outputResult($this->checkComposerSchema()); } if ($composer) { $config = $composer->getConfig(); } else { $config = Factory::createConfig(); } $config->merge(array('config' => array('secure-http' => false))); $config->prohibitUrlByConfig('http://repo.packagist.org', new NullIO); $this->rfs = Factory::createRemoteFilesystem($io, $config); $this->process = new ProcessExecutor($io); $io->write('Checking platform settings: ', false); $this->outputResult($this->checkPlatform()); $io->write('Checking git settings: ', false); $this->outputResult($this->checkGit()); $io->write('Checking http connectivity to packagist: ', false); $this->outputResult($this->checkHttp('http', $config)); $io->write('Checking https connectivity to packagist: ', false); $this->outputResult($this->checkHttp('https', $config)); $opts = stream_context_get_options(StreamContextFactory::getContext('http://example.org')); if (!empty($opts['http']['proxy'])) { $io->write('Checking HTTP proxy: ', false); $this->outputResult($this->checkHttpProxy()); $io->write('Checking HTTP proxy support for request_fulluri: ', false); $this->outputResult($this->checkHttpProxyFullUriRequestParam()); $io->write('Checking HTTPS proxy support for request_fulluri: ', false); $this->outputResult($this->checkHttpsProxyFullUriRequestParam()); } if ($oauth = $config->get('github-oauth')) { foreach ($oauth as $domain => $token) { $io->write('Checking '.$domain.' oauth access: ', false); $this->outputResult($this->checkGithubOauth($domain, $token)); } } else { $io->write('Checking github.com rate limit: ', false); try { $rate = $this->getGithubRateLimit('github.com'); if (!is_array($rate)) { $this->outputResult($rate); } elseif (10 > $rate['remaining']) { $io->write('<warning>WARNING</warning>'); $io->write(sprintf( '<comment>Github has a rate limit on their API. ' . 'You currently have <options=bold>%u</options=bold> ' . 'out of <options=bold>%u</options=bold> requests left.' . PHP_EOL . 'See https://developer.github.com/v3/#rate-limiting and also' . PHP_EOL . ' https://getcomposer.org/doc/articles/troubleshooting.md#api-rate-limit-and-oauth-tokens</comment>', $rate['remaining'], $rate['limit'] )); } else { $this->outputResult(true); } } catch (\Exception $e) { if ($e instanceof TransportException && $e->getCode() === 401) { $this->outputResult('<comment>The oauth token for github.com seems invalid, run "composer config --global --unset github-oauth.github.com" to remove it</comment>'); } else { $this->outputResult($e); } } } $io->write('Checking disk free space: ', false); $this->outputResult($this->checkDiskSpace($config)); if ('phar:' === substr(__FILE__, 0, 5)) { $io->write('Checking pubkeys: ', false); $this->outputResult($this->checkPubKeys($config)); $io->write('Checking composer version: ', false); $this->outputResult($this->checkVersion($config)); } $io->write(sprintf('Composer version: <comment>%s</comment>', Composer::VERSION)); $platformOverrides = $config->get('platform') ?: array(); $platformRepo = new PlatformRepository(array(), $platformOverrides); $phpPkg = $platformRepo->findPackage('php', '*'); $phpVersion = $phpPkg->getPrettyVersion(); if (false !== strpos($phpPkg->getDescription(), 'overridden')) { $phpVersion .= ' - ' . $phpPkg->getDescription(); } $io->write(sprintf('PHP version: <comment>%s</comment>', $phpVersion)); if (defined('PHP_BINARY')) { $io->write(sprintf('PHP binary path: <comment>%s</comment>', PHP_BINARY)); } $io->write(sprintf('OpenSSL version: <comment>%s</comment>', OPENSSL_VERSION_TEXT)); return $this->exitCode; } private function checkComposerSchema() { $validator = new ConfigValidator($this->getIO()); list($errors, , $warnings) = $validator->validate(Factory::getComposerFile()); if ($errors || $warnings) { $messages = array( 'error' => $errors, 'warning' => $warnings, ); $output = ''; foreach ($messages as $style => $msgs) { foreach ($msgs as $msg) { $output .= '<' . $style . '>' . $msg . '</' . $style . '>' . PHP_EOL; } } return rtrim($output); } return true; } private function checkGit() { $this->process->execute('git config color.ui', $output); if (strtolower(trim($output)) === 'always') { return '<comment>Your git color.ui setting is set to always, this is known to create issues. Use "git config --global color.ui true" to set it correctly.</comment>'; } return true; } private function checkHttp($proto, Config $config) { $result = $this->checkConnectivity(); if ($result !== true) { return $result; } $disableTls = false; $result = array(); if ($proto === 'https' && $config->get('disable-tls') === true) { $disableTls = true; $result[] = '<warning>Composer is configured to disable SSL/TLS protection. This will leave remote HTTPS requests vulnerable to Man-In-The-Middle attacks.</warning>'; } if ($proto === 'https' && !extension_loaded('openssl') && !$disableTls) { $result[] = '<error>Composer is configured to use SSL/TLS protection but the openssl extension is not available.</error>'; } try { $this->rfs->getContents('packagist.org', $proto . '://repo.packagist.org/packages.json', false); } catch (TransportException $e) { if (false !== strpos($e->getMessage(), 'cafile')) { $result[] = '<error>[' . get_class($e) . '] ' . $e->getMessage() . '</error>'; $result[] = '<error>Unable to locate a valid CA certificate file. You must set a valid \'cafile\' option.</error>'; $result[] = '<error>You can alternatively disable this error, at your own risk, by enabling the \'disable-tls\' option.</error>'; } else { array_unshift($result, '[' . get_class($e) . '] ' . $e->getMessage()); } } if (count($result) > 0) { return $result; } return true; } private function checkHttpProxy() { $result = $this->checkConnectivity(); if ($result !== true) { return $result; } $protocol = extension_loaded('openssl') ? 'https' : 'http'; try { $json = json_decode($this->rfs->getContents('packagist.org', $protocol . '://repo.packagist.org/packages.json', false), true); $hash = reset($json['provider-includes']); $hash = $hash['sha256']; $path = str_replace('%hash%', $hash, key($json['provider-includes'])); $provider = $this->rfs->getContents('packagist.org', $protocol . '://repo.packagist.org/'.$path, false); if (hash('sha256', $provider) !== $hash) { return 'It seems that your proxy is modifying http traffic on the fly'; } } catch (\Exception $e) { return $e; } return true; } /** * Due to various proxy servers configurations, some servers can't handle non-standard HTTP "http_proxy_request_fulluri" parameter, * and will return error 500/501 (as not implemented), see discussion @ https://github.com/composer/composer/pull/1825. * This method will test, if you need to disable this parameter via setting extra environment variable in your system. * * @return bool|string */ private function checkHttpProxyFullUriRequestParam() { $result = $this->checkConnectivity(); if ($result !== true) { return $result; } $url = 'http://repo.packagist.org/packages.json'; try { $this->rfs->getContents('packagist.org', $url, false); } catch (TransportException $e) { try { $this->rfs->getContents('packagist.org', $url, false, array('http' => array('request_fulluri' => false))); } catch (TransportException $e) { return 'Unable to assess the situation, maybe packagist.org is down ('.$e->getMessage().')'; } return 'It seems there is a problem with your proxy server, try setting the "HTTP_PROXY_REQUEST_FULLURI" and "HTTPS_PROXY_REQUEST_FULLURI" environment variables to "false"'; } return true; } /** * Due to various proxy servers configurations, some servers can't handle non-standard HTTP "http_proxy_request_fulluri" parameter, * and will return error 500/501 (as not implemented), see discussion @ https://github.com/composer/composer/pull/1825. * This method will test, if you need to disable this parameter via setting extra environment variable in your system. * * @return bool|string */ private function checkHttpsProxyFullUriRequestParam() { $result = $this->checkConnectivity(); if ($result !== true) { return $result; } if (!extension_loaded('openssl')) { return 'You need the openssl extension installed for this check'; } $url = 'https://api.github.com/repos/Seldaek/jsonlint/zipball/1.0.0'; try { $this->rfs->getContents('github.com', $url, false); } catch (TransportException $e) { try { $this->rfs->getContents('github.com', $url, false, array('http' => array('request_fulluri' => false))); } catch (TransportException $e) { return 'Unable to assess the situation, maybe github is down ('.$e->getMessage().')'; } return 'It seems there is a problem with your proxy server, try setting the "HTTPS_PROXY_REQUEST_FULLURI" environment variable to "false"'; } return true; } private function checkGithubOauth($domain, $token) { $result = $this->checkConnectivity(); if ($result !== true) { return $result; } $this->getIO()->setAuthentication($domain, $token, 'x-oauth-basic'); try { $url = $domain === 'github.com' ? 'https://api.'.$domain.'/' : 'https://'.$domain.'/api/v3/'; return $this->rfs->getContents($domain, $url, false, array( 'retry-auth-failure' => false, )) ? true : 'Unexpected error'; } catch (\Exception $e) { if ($e instanceof TransportException && $e->getCode() === 401) { return '<comment>The oauth token for '.$domain.' seems invalid, run "composer config --global --unset github-oauth.'.$domain.'" to remove it</comment>'; } return $e; } } /** * @param string $domain * @param string $token * @throws TransportException * @return array|string */ private function getGithubRateLimit($domain, $token = null) { $result = $this->checkConnectivity(); if ($result !== true) { return $result; } if ($token) { $this->getIO()->setAuthentication($domain, $token, 'x-oauth-basic'); } $url = $domain === 'github.com' ? 'https://api.'.$domain.'/rate_limit' : 'https://'.$domain.'/api/rate_limit'; $json = $this->rfs->getContents($domain, $url, false, array('retry-auth-failure' => false)); $data = json_decode($json, true); return $data['resources']['core']; } private function checkDiskSpace($config) { $minSpaceFree = 1024 * 1024; if ((($df = @disk_free_space($dir = $config->get('home'))) !== false && $df < $minSpaceFree) || (($df = @disk_free_space($dir = $config->get('vendor-dir'))) !== false && $df < $minSpaceFree) ) { return '<error>The disk hosting '.$dir.' is full</error>'; } return true; } private function checkPubKeys($config) { $home = $config->get('home'); $errors = array(); $io = $this->getIO(); if (file_exists($home.'/keys.tags.pub') && file_exists($home.'/keys.dev.pub')) { $io->write(''); } if (file_exists($home.'/keys.tags.pub')) { $io->write('Tags Public Key Fingerprint: ' . Keys::fingerprint($home.'/keys.tags.pub')); } else { $errors[] = '<error>Missing pubkey for tags verification</error>'; } if (file_exists($home.'/keys.dev.pub')) { $io->write('Dev Public Key Fingerprint: ' . Keys::fingerprint($home.'/keys.dev.pub')); } else { $errors[] = '<error>Missing pubkey for dev verification</error>'; } if ($errors) { $errors[] = '<error>Run composer self-update --update-keys to set them up</error>'; } return $errors ?: true; } private function checkVersion($config) { $result = $this->checkConnectivity(); if ($result !== true) { return $result; } $versionsUtil = new Versions($config, $this->rfs); $latest = $versionsUtil->getLatest(); if (Composer::VERSION !== $latest['version'] && Composer::VERSION !== '@package_version@') { return '<comment>You are not running the latest '.$versionsUtil->getChannel().' version, run `composer self-update` to update ('.Composer::VERSION.' => '.$latest['version'].')</comment>'; } return true; } /** * @param bool|string|\Exception $result */ private function outputResult($result) { $io = $this->getIO(); if (true === $result) { $io->write('<info>OK</info>'); return; } $hadError = false; $hadWarning = false; if ($result instanceof \Exception) { $result = '<error>['.get_class($result).'] '.$result->getMessage().'</error>'; } if (!$result) { // falsey results should be considered as an error, even if there is nothing to output $hadError = true; } else { if (!is_array($result)) { $result = array($result); } foreach ($result as $message) { if (false !== strpos($message, '<error>')) { $hadError = true; } elseif (false !== strpos($message, '<warning>')) { $hadWarning = true; } } } if ($hadError) { $io->write('<error>FAIL</error>'); $this->exitCode = max($this->exitCode, 2); } elseif ($hadWarning) { $io->write('<warning>WARNING</warning>'); $this->exitCode = max($this->exitCode, 1); } if ($result) { foreach ($result as $message) { $io->write($message); } } } private function checkPlatform() { $output = ''; $out = function ($msg, $style) use (&$output) { $output .= '<'.$style.'>'.$msg.'</'.$style.'>'.PHP_EOL; }; // code below taken from getcomposer.org/installer, any changes should be made there and replicated here $errors = array(); $warnings = array(); $displayIniMessage = false; $iniMessage = PHP_EOL.PHP_EOL.IniHelper::getMessage(); $iniMessage .= PHP_EOL.'If you can not modify the ini file, you can also run `php -d option=value` to modify ini values on the fly. You can use -d multiple times.'; if (!function_exists('json_decode')) { $errors['json'] = true; } if (!extension_loaded('Phar')) { $errors['phar'] = true; } if (!extension_loaded('filter')) { $errors['filter'] = true; } if (!extension_loaded('hash')) { $errors['hash'] = true; } if (!extension_loaded('iconv') && !extension_loaded('mbstring')) { $errors['iconv_mbstring'] = true; } if (!filter_var(ini_get('allow_url_fopen'), FILTER_VALIDATE_BOOLEAN)) { $errors['allow_url_fopen'] = true; } if (extension_loaded('ionCube Loader') && ioncube_loader_iversion() < 40009) { $errors['ioncube'] = ioncube_loader_version(); } if (PHP_VERSION_ID < 50302) { $errors['php'] = PHP_VERSION; } if (!isset($errors['php']) && PHP_VERSION_ID < 50304) { $warnings['php'] = PHP_VERSION; } if (!extension_loaded('openssl')) { $errors['openssl'] = true; } if (extension_loaded('openssl') && OPENSSL_VERSION_NUMBER < 0x1000100f) { $warnings['openssl_version'] = true; } if (!defined('HHVM_VERSION') && !extension_loaded('apcu') && filter_var(ini_get('apc.enable_cli'), FILTER_VALIDATE_BOOLEAN)) { $warnings['apc_cli'] = true; } if (!extension_loaded('zlib')) { $warnings['zlib'] = true; } ob_start(); phpinfo(INFO_GENERAL); $phpinfo = ob_get_clean(); if (preg_match('{Configure Command(?: *</td><td class="v">| *=> *)(.*?)(?:</td>|$)}m', $phpinfo, $match)) { $configure = $match[1]; if (false !== strpos($configure, '--enable-sigchild')) { $warnings['sigchild'] = true; } if (false !== strpos($configure, '--with-curlwrappers')) { $warnings['curlwrappers'] = true; } } if (filter_var(ini_get('xdebug.profiler_enabled'), FILTER_VALIDATE_BOOLEAN)) { $warnings['xdebug_profile'] = true; } elseif (extension_loaded('xdebug')) { $warnings['xdebug_loaded'] = true; } if (defined('PHP_WINDOWS_VERSION_BUILD') && (version_compare(PHP_VERSION, '7.2.23', '<') || (version_compare(PHP_VERSION, '7.3.0', '>=') && version_compare(PHP_VERSION, '7.3.10', '<')))) { $warnings['onedrive'] = PHP_VERSION; } if (!empty($errors)) { foreach ($errors as $error => $current) { switch ($error) { case 'json': $text = PHP_EOL."The json extension is missing.".PHP_EOL; $text .= "Install it or recompile php without --disable-json"; break; case 'phar': $text = PHP_EOL."The phar extension is missing.".PHP_EOL; $text .= "Install it or recompile php without --disable-phar"; break; case 'filter': $text = PHP_EOL."The filter extension is missing.".PHP_EOL; $text .= "Install it or recompile php without --disable-filter"; break; case 'hash': $text = PHP_EOL."The hash extension is missing.".PHP_EOL; $text .= "Install it or recompile php without --disable-hash"; break; case 'iconv_mbstring': $text = PHP_EOL."The iconv OR mbstring extension is required and both are missing.".PHP_EOL; $text .= "Install either of them or recompile php without --disable-iconv"; break; case 'unicode': $text = PHP_EOL."The detect_unicode setting must be disabled.".PHP_EOL; $text .= "Add the following to the end of your `php.ini`:".PHP_EOL; $text .= " detect_unicode = Off"; $displayIniMessage = true; break; case 'suhosin': $text = PHP_EOL."The suhosin.executor.include.whitelist setting is incorrect.".PHP_EOL; $text .= "Add the following to the end of your `php.ini` or suhosin.ini (Example path [for Debian]: /etc/php5/cli/conf.d/suhosin.ini):".PHP_EOL; $text .= " suhosin.executor.include.whitelist = phar ".$current; $displayIniMessage = true; break; case 'php': $text = PHP_EOL."Your PHP ({$current}) is too old, you must upgrade to PHP 5.3.2 or higher."; break; case 'allow_url_fopen': $text = PHP_EOL."The allow_url_fopen setting is incorrect.".PHP_EOL; $text .= "Add the following to the end of your `php.ini`:".PHP_EOL; $text .= " allow_url_fopen = On"; $displayIniMessage = true; break; case 'ioncube': $text = PHP_EOL."Your ionCube Loader extension ($current) is incompatible with Phar files.".PHP_EOL; $text .= "Upgrade to ionCube 4.0.9 or higher or remove this line (path may be different) from your `php.ini` to disable it:".PHP_EOL; $text .= " zend_extension = /usr/lib/php5/20090626+lfs/ioncube_loader_lin_5.3.so"; $displayIniMessage = true; break; case 'openssl': $text = PHP_EOL."The openssl extension is missing, which means that secure HTTPS transfers are impossible.".PHP_EOL; $text .= "If possible you should enable it or recompile php with --with-openssl"; break; } $out($text, 'error'); } $output .= PHP_EOL; } if (!empty($warnings)) { foreach ($warnings as $warning => $current) { switch ($warning) { case 'apc_cli': $text = "The apc.enable_cli setting is incorrect.".PHP_EOL; $text .= "Add the following to the end of your `php.ini`:".PHP_EOL; $text .= " apc.enable_cli = Off"; $displayIniMessage = true; break; case 'zlib': $text = 'The zlib extension is not loaded, this can slow down Composer a lot.'.PHP_EOL; $text .= 'If possible, enable it or recompile php with --with-zlib'.PHP_EOL; $displayIniMessage = true; break; case 'sigchild': $text = "PHP was compiled with --enable-sigchild which can cause issues on some platforms.".PHP_EOL; $text .= "Recompile it without this flag if possible, see also:".PHP_EOL; $text .= " https://bugs.php.net/bug.php?id=22999"; break; case 'curlwrappers': $text = "PHP was compiled with --with-curlwrappers which will cause issues with HTTP authentication and GitHub.".PHP_EOL; $text .= " Recompile it without this flag if possible"; break; case 'php': $text = "Your PHP ({$current}) is quite old, upgrading to PHP 5.3.4 or higher is recommended.".PHP_EOL; $text .= " Composer works with 5.3.2+ for most people, but there might be edge case issues."; break; case 'openssl_version': // Attempt to parse version number out, fallback to whole string value. $opensslVersion = strstr(trim(strstr(OPENSSL_VERSION_TEXT, ' ')), ' ', true); $opensslVersion = $opensslVersion ?: OPENSSL_VERSION_TEXT; $text = "The OpenSSL library ({$opensslVersion}) used by PHP does not support TLSv1.2 or TLSv1.1.".PHP_EOL; $text .= "If possible you should upgrade OpenSSL to version 1.0.1 or above."; break; case 'xdebug_loaded': $text = "The xdebug extension is loaded, this can slow down Composer a little.".PHP_EOL; $text .= " Disabling it when using Composer is recommended."; break; case 'xdebug_profile': $text = "The xdebug.profiler_enabled setting is enabled, this can slow down Composer a lot.".PHP_EOL; $text .= "Add the following to the end of your `php.ini` to disable it:".PHP_EOL; $text .= " xdebug.profiler_enabled = 0"; $displayIniMessage = true; break; case 'onedrive': $text = "The Windows OneDrive folder is not supported on PHP versions below 7.2.23 and 7.3.10.".PHP_EOL; $text .= "Upgrade your PHP ({$current}) to use this location with Composer.".PHP_EOL; break; } $out($text, 'comment'); } } if ($displayIniMessage) { $out($iniMessage, 'comment'); } return !$warnings && !$errors ? true : $output; } /** * Check if allow_url_fopen is ON * * @return bool|string */ private function checkConnectivity() { if (!ini_get('allow_url_fopen')) { $result = '<info>Skipped because allow_url_fopen is missing.</info>'; return $result; } return true; } } composer/src/Composer/Command/HomeCommand.php 0000644 00000012565 14736103146 0015245 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\Package\CompletePackageInterface; use Composer\Repository\RepositoryInterface; use Composer\Repository\ArrayRepository; use Composer\Repository\RepositoryFactory; use Composer\Util\Platform; use Composer\Util\ProcessExecutor; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; /** * @author Robert Schönthal <seroscho@googlemail.com> */ class HomeCommand extends BaseCommand { /** * {@inheritDoc} */ protected function configure() { $this ->setName('browse') ->setAliases(array('home')) ->setDescription('Opens the package\'s repository URL or homepage in your browser.') ->setDefinition(array( new InputArgument('packages', InputArgument::IS_ARRAY, 'Package(s) to browse to.'), new InputOption('homepage', 'H', InputOption::VALUE_NONE, 'Open the homepage instead of the repository URL.'), new InputOption('show', 's', InputOption::VALUE_NONE, 'Only show the homepage or repository URL.'), )) ->setHelp( <<<EOT The home command opens or shows a package's repository URL or homepage in your default browser. To open the homepage by default, use -H or --homepage. To show instead of open the repository or homepage URL, use -s or --show. Read more at https://getcomposer.org/doc/03-cli.md#browse-home EOT ); } /** * {@inheritDoc} */ protected function execute(InputInterface $input, OutputInterface $output) { $repos = $this->initializeRepos(); $io = $this->getIO(); $return = 0; $packages = $input->getArgument('packages'); if (!$packages) { $io->writeError('No package specified, opening homepage for the root package'); $packages = array($this->getComposer()->getPackage()->getName()); } foreach ($packages as $packageName) { $handled = false; $packageExists = false; foreach ($repos as $repo) { foreach ($repo->findPackages($packageName) as $package) { $packageExists = true; if ($package instanceof CompletePackageInterface && $this->handlePackage($package, $input->getOption('homepage'), $input->getOption('show'))) { $handled = true; break 2; } } } if (!$packageExists) { $return = 1; $io->writeError('<warning>Package '.$packageName.' not found</warning>'); } if (!$handled) { $return = 1; $io->writeError('<warning>'.($input->getOption('homepage') ? 'Invalid or missing homepage' : 'Invalid or missing repository URL').' for '.$packageName.'</warning>'); } } return $return; } private function handlePackage(CompletePackageInterface $package, $showHomepage, $showOnly) { $support = $package->getSupport(); $url = isset($support['source']) ? $support['source'] : $package->getSourceUrl(); if (!$url || $showHomepage) { $url = $package->getHomepage(); } if (!$url || !filter_var($url, FILTER_VALIDATE_URL)) { return false; } if ($showOnly) { $this->getIO()->write(sprintf('<info>%s</info>', $url)); } else { $this->openBrowser($url); } return true; } /** * opens a url in your system default browser * * @param string $url */ private function openBrowser($url) { $url = ProcessExecutor::escape($url); $process = new ProcessExecutor($this->getIO()); if (Platform::isWindows()) { return $process->execute('start "web" explorer "' . $url . '"', $output); } $linux = $process->execute('which xdg-open', $output); $osx = $process->execute('which open', $output); if (0 === $linux) { $process->execute('xdg-open ' . $url, $output); } elseif (0 === $osx) { $process->execute('open ' . $url, $output); } else { $this->getIO()->writeError('No suitable browser opening command found, open yourself: ' . $url); } } /** * Initializes repositories * * Returns an array of repos in order they should be checked in * * @return RepositoryInterface[] */ private function initializeRepos() { $composer = $this->getComposer(false); if ($composer) { return array_merge( array(new ArrayRepository(array($composer->getPackage()))), // root package array($composer->getRepositoryManager()->getLocalRepository()), // installed packages $composer->getRepositoryManager()->getRepositories() // remotes ); } return RepositoryFactory::defaultRepos($this->getIO()); } } composer/src/Composer/Command/ScriptAliasCommand.php 0000644 00000003723 14736103146 0016567 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Output\OutputInterface; /** * @author Jordi Boggiano <j.boggiano@seld.be> */ class ScriptAliasCommand extends BaseCommand { private $script; private $description; public function __construct($script, $description) { $this->script = $script; $this->description = empty($description) ? 'Runs the '.$script.' script as defined in composer.json.' : $description; parent::__construct(); } protected function configure() { $this ->setName($this->script) ->setDescription($this->description) ->setDefinition(array( new InputOption('dev', null, InputOption::VALUE_NONE, 'Sets the dev mode.'), new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Disables the dev mode.'), new InputArgument('args', InputArgument::IS_ARRAY | InputArgument::OPTIONAL, ''), )) ->setHelp( <<<EOT The <info>run-script</info> command runs scripts defined in composer.json: <info>php composer.phar run-script post-update-cmd</info> Read more at https://getcomposer.org/doc/03-cli.md#run-script EOT ) ; } protected function execute(InputInterface $input, OutputInterface $output) { $composer = $this->getComposer(); $args = $input->getArguments(); return $composer->getEventDispatcher()->dispatchScript($this->script, $input->getOption('dev') || !$input->getOption('no-dev'), $args['args']); } } composer/src/Composer/Command/GlobalCommand.php 0000644 00000006577 14736103146 0015563 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\Factory; use Composer\Util\Filesystem; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\StringInput; use Symfony\Component\Console\Output\OutputInterface; /** * @author Jordi Boggiano <j.boggiano@seld.be> */ class GlobalCommand extends BaseCommand { protected function configure() { $this ->setName('global') ->setDescription('Allows running commands in the global composer dir ($COMPOSER_HOME).') ->setDefinition(array( new InputArgument('command-name', InputArgument::REQUIRED, ''), new InputArgument('args', InputArgument::IS_ARRAY | InputArgument::OPTIONAL, ''), )) ->setHelp( <<<EOT Use this command as a wrapper to run other Composer commands within the global context of COMPOSER_HOME. You can use this to install CLI utilities globally, all you need is to add the COMPOSER_HOME/vendor/bin dir to your PATH env var. COMPOSER_HOME is c:\Users\<user>\AppData\Roaming\Composer on Windows and /home/<user>/.composer on unix systems. If your system uses freedesktop.org standards, then it will first check XDG_CONFIG_HOME or default to /home/<user>/.config/composer Note: This path may vary depending on customizations to bin-dir in composer.json or the environmental variable COMPOSER_BIN_DIR. Read more at https://getcomposer.org/doc/03-cli.md#global EOT ) ; } public function run(InputInterface $input, OutputInterface $output) { // extract real command name $tokens = preg_split('{\s+}', $input->__toString()); $args = array(); foreach ($tokens as $token) { if ($token && $token[0] !== '-') { $args[] = $token; if (count($args) >= 2) { break; } } } // show help for this command if no command was found if (count($args) < 2) { return parent::run($input, $output); } // change to global dir $config = Factory::createConfig(); $home = $config->get('home'); if (!is_dir($home)) { $fs = new Filesystem(); $fs->ensureDirectoryExists($home); if (!is_dir($home)) { throw new \RuntimeException('Could not create home directory'); } } try { chdir($home); } catch (\Exception $e) { throw new \RuntimeException('Could not switch to home directory "'.$home.'"', 0, $e); } $this->getIO()->writeError('<info>Changed current directory to '.$home.'</info>'); // create new input without "global" command prefix $input = new StringInput(preg_replace('{\bg(?:l(?:o(?:b(?:a(?:l)?)?)?)?)?\b}', '', $input->__toString(), 1)); $this->getApplication()->resetComposer(); return $this->getApplication()->run($input, $output); } /** * {@inheritDoc} */ public function isProxyCommand() { return true; } } composer/src/Composer/Command/ProhibitsCommand.php 0000644 00000002616 14736103146 0016314 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; /** * @author Niels Keurentjes <niels.keurentjes@omines.com> */ class ProhibitsCommand extends BaseDependencyCommand { /** * Configure command metadata. */ protected function configure() { parent::configure(); $this ->setName('prohibits') ->setAliases(array('why-not')) ->setDescription('Shows which packages prevent the given package from being installed.') ->setHelp( <<<EOT Displays detailed information about why a package cannot be installed. <info>php composer.phar prohibits composer/composer</info> Read more at https://getcomposer.org/doc/03-cli.md#prohibits-why-not- EOT ) ; } /** * Execute the function. * * @param InputInterface $input * @param OutputInterface $output * @return int */ protected function execute(InputInterface $input, OutputInterface $output) { return parent::doExecute($input, $output, true); } } composer/src/Composer/Command/StatusCommand.php 0000644 00000021022 14736103146 0015624 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Composer\Downloader\ChangeReportInterface; use Composer\Downloader\DvcsDownloaderInterface; use Composer\Downloader\VcsCapableDownloaderInterface; use Composer\Package\Dumper\ArrayDumper; use Composer\Package\Version\VersionGuesser; use Composer\Package\Version\VersionParser; use Composer\Plugin\CommandEvent; use Composer\Plugin\PluginEvents; use Composer\Script\ScriptEvents; use Composer\Util\ProcessExecutor; /** * @author Tiago Ribeiro <tiago.ribeiro@seegno.com> * @author Rui Marinho <rui.marinho@seegno.com> */ class StatusCommand extends BaseCommand { const EXIT_CODE_ERRORS = 1; const EXIT_CODE_UNPUSHED_CHANGES = 2; const EXIT_CODE_VERSION_CHANGES = 4; /** * @throws \Symfony\Component\Console\Exception\InvalidArgumentException */ protected function configure() { $this ->setName('status') ->setDescription('Shows a list of locally modified packages, for packages installed from source.') ->setDefinition(array( new InputOption('verbose', 'v|vv|vvv', InputOption::VALUE_NONE, 'Show modified files for each directory that contains changes.'), )) ->setHelp( <<<EOT The status command displays a list of dependencies that have been modified locally. Read more at https://getcomposer.org/doc/03-cli.md#status EOT ) ; } /** * @param InputInterface $input * @param OutputInterface $output * @return int */ protected function execute(InputInterface $input, OutputInterface $output) { $composer = $this->getComposer(); $commandEvent = new CommandEvent(PluginEvents::COMMAND, 'status', $input, $output); $composer->getEventDispatcher()->dispatch($commandEvent->getName(), $commandEvent); // Dispatch pre-status-command $composer->getEventDispatcher()->dispatchScript(ScriptEvents::PRE_STATUS_CMD, true); $exitCode = $this->doExecute($input, $output); // Dispatch post-status-command $composer->getEventDispatcher()->dispatchScript(ScriptEvents::POST_STATUS_CMD, true); return $exitCode; } /** * @param InputInterface $input * @param OutputInterface $output * @return int */ private function doExecute(InputInterface $input, OutputInterface $output) { // init repos $composer = $this->getComposer(); $installedRepo = $composer->getRepositoryManager()->getLocalRepository(); $dm = $composer->getDownloadManager(); $im = $composer->getInstallationManager(); $errors = array(); $io = $this->getIO(); $unpushedChanges = array(); $vcsVersionChanges = array(); $parser = new VersionParser; $guesser = new VersionGuesser($composer->getConfig(), new ProcessExecutor($io), $parser); $dumper = new ArrayDumper; // list packages foreach ($installedRepo->getCanonicalPackages() as $package) { $downloader = $dm->getDownloaderForInstalledPackage($package); $targetDir = $im->getInstallPath($package); if ($downloader instanceof ChangeReportInterface) { if (is_link($targetDir)) { $errors[$targetDir] = $targetDir . ' is a symbolic link.'; } if ($changes = $downloader->getLocalChanges($package, $targetDir)) { $errors[$targetDir] = $changes; } } if ($downloader instanceof VcsCapableDownloaderInterface) { if ($currentRef = $downloader->getVcsReference($package, $targetDir)) { switch ($package->getInstallationSource()) { case 'source': $previousRef = $package->getSourceReference(); break; case 'dist': $previousRef = $package->getDistReference(); break; default: $previousRef = null; } $currentVersion = $guesser->guessVersion($dumper->dump($package), $targetDir); if ($previousRef && $currentVersion && $currentVersion['commit'] !== $previousRef) { $vcsVersionChanges[$targetDir] = array( 'previous' => array( 'version' => $package->getPrettyVersion(), 'ref' => $previousRef, ), 'current' => array( 'version' => $currentVersion['pretty_version'], 'ref' => $currentVersion['commit'], ), ); } } } if ($downloader instanceof DvcsDownloaderInterface) { if ($unpushed = $downloader->getUnpushedChanges($package, $targetDir)) { $unpushedChanges[$targetDir] = $unpushed; } } } // output errors/warnings if (!$errors && !$unpushedChanges && !$vcsVersionChanges) { $io->writeError('<info>No local changes</info>'); return 0; } if ($errors) { $io->writeError('<error>You have changes in the following dependencies:</error>'); foreach ($errors as $path => $changes) { if ($input->getOption('verbose')) { $indentedChanges = implode("\n", array_map(function ($line) { return ' ' . ltrim($line); }, explode("\n", $changes))); $io->write('<info>'.$path.'</info>:'); $io->write($indentedChanges); } else { $io->write($path); } } } if ($unpushedChanges) { $io->writeError('<warning>You have unpushed changes on the current branch in the following dependencies:</warning>'); foreach ($unpushedChanges as $path => $changes) { if ($input->getOption('verbose')) { $indentedChanges = implode("\n", array_map(function ($line) { return ' ' . ltrim($line); }, explode("\n", $changes))); $io->write('<info>'.$path.'</info>:'); $io->write($indentedChanges); } else { $io->write($path); } } } if ($vcsVersionChanges) { $io->writeError('<warning>You have version variations in the following dependencies:</warning>'); foreach ($vcsVersionChanges as $path => $changes) { if ($input->getOption('verbose')) { // If we don't can't find a version, use the ref instead. $currentVersion = $changes['current']['version'] ?: $changes['current']['ref']; $previousVersion = $changes['previous']['version'] ?: $changes['previous']['ref']; if ($io->isVeryVerbose()) { // Output the ref regardless of whether or not it's being used as the version $currentVersion .= sprintf(' (%s)', $changes['current']['ref']); $previousVersion .= sprintf(' (%s)', $changes['previous']['ref']); } $io->write('<info>'.$path.'</info>:'); $io->write(sprintf(' From <comment>%s</comment> to <comment>%s</comment>', $previousVersion, $currentVersion)); } else { $io->write($path); } } } if (($errors || $unpushedChanges || $vcsVersionChanges) && !$input->getOption('verbose')) { $io->writeError('Use --verbose (-v) to see a list of files'); } return ($errors ? self::EXIT_CODE_ERRORS : 0) + ($unpushedChanges ? self::EXIT_CODE_UNPUSHED_CHANGES : 0) + ($vcsVersionChanges ? self::EXIT_CODE_VERSION_CHANGES : 0); } } composer/src/Composer/Command/AboutCommand.php 0000644 00000002224 14736103146 0015416 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; /** * @author Jordi Boggiano <j.boggiano@seld.be> */ class AboutCommand extends BaseCommand { protected function configure() { $this ->setName('about') ->setDescription('Shows the short information about Composer.') ->setHelp( <<<EOT <info>php composer.phar about</info> EOT ) ; } protected function execute(InputInterface $input, OutputInterface $output) { $this->getIO()->write( <<<EOT <info>Composer - Dependency Manager for PHP</info> <comment>Composer is a dependency manager tracking local dependencies of your projects and libraries. See https://getcomposer.org/ for more information.</comment> EOT ); return 0; } } composer/src/Composer/Command/BaseDependencyCommand.php 0000644 00000023713 14736103146 0017223 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\DependencyResolver\Pool; use Composer\Package\Link; use Composer\Package\PackageInterface; use Composer\Repository\ArrayRepository; use Composer\Repository\CompositeRepository; use Composer\Repository\PlatformRepository; use Composer\Repository\RepositoryFactory; use Composer\Plugin\CommandEvent; use Composer\Plugin\PluginEvents; use Symfony\Component\Console\Formatter\OutputFormatterStyle; use Composer\Package\Version\VersionParser; use Symfony\Component\Console\Helper\Table; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; /** * Base implementation for commands mapping dependency relationships. * * @author Niels Keurentjes <niels.keurentjes@omines.com> */ class BaseDependencyCommand extends BaseCommand { const ARGUMENT_PACKAGE = 'package'; const ARGUMENT_CONSTRAINT = 'constraint'; const OPTION_RECURSIVE = 'recursive'; const OPTION_TREE = 'tree'; protected $colors; /** * Set common options and arguments. */ protected function configure() { $this->setDefinition(array( new InputArgument(self::ARGUMENT_PACKAGE, InputArgument::REQUIRED, 'Package to inspect'), new InputArgument(self::ARGUMENT_CONSTRAINT, InputArgument::OPTIONAL, 'Optional version constraint', '*'), new InputOption(self::OPTION_RECURSIVE, 'r', InputOption::VALUE_NONE, 'Recursively resolves up to the root package'), new InputOption(self::OPTION_TREE, 't', InputOption::VALUE_NONE, 'Prints the results as a nested tree'), )); } /** * Execute the command. * * @param InputInterface $input * @param OutputInterface $output * @param bool $inverted Whether to invert matching process (why-not vs why behaviour) * @return int Exit code of the operation. */ protected function doExecute(InputInterface $input, OutputInterface $output, $inverted = false) { // Emit command event on startup $composer = $this->getComposer(); $commandEvent = new CommandEvent(PluginEvents::COMMAND, $this->getName(), $input, $output); $composer->getEventDispatcher()->dispatch($commandEvent->getName(), $commandEvent); // Prepare repositories and set up a pool $platformOverrides = $composer->getConfig()->get('platform') ?: array(); $repository = new CompositeRepository(array( new ArrayRepository(array($composer->getPackage())), $composer->getRepositoryManager()->getLocalRepository(), new PlatformRepository(array(), $platformOverrides), )); $pool = new Pool(); $pool->addRepository($repository); // Parse package name and constraint list($needle, $textConstraint) = array_pad( explode(':', $input->getArgument(self::ARGUMENT_PACKAGE)), 2, $input->getArgument(self::ARGUMENT_CONSTRAINT) ); // Find packages that are or provide the requested package first $packages = $pool->whatProvides(strtolower($needle)); if (empty($packages)) { throw new \InvalidArgumentException(sprintf('Could not find package "%s" in your project', $needle)); } // If the version we ask for is not installed then we need to locate it in remote repos and add it. // This is needed for why-not to resolve conflicts from an uninstalled version against installed packages. if (!$repository->findPackage($needle, $textConstraint)) { $defaultRepos = new CompositeRepository(RepositoryFactory::defaultRepos($this->getIO())); if ($match = $defaultRepos->findPackage($needle, $textConstraint)) { $repository->addRepository(new ArrayRepository(array(clone $match))); } } // Include replaced packages for inverted lookups as they are then the actual starting point to consider $needles = array($needle); if ($inverted) { foreach ($packages as $package) { $needles = array_merge($needles, array_map(function (Link $link) { return $link->getTarget(); }, $package->getReplaces())); } } // Parse constraint if one was supplied if ('*' !== $textConstraint) { $versionParser = new VersionParser(); $constraint = $versionParser->parseConstraints($textConstraint); } else { $constraint = null; } // Parse rendering options $renderTree = $input->getOption(self::OPTION_TREE); $recursive = $renderTree || $input->getOption(self::OPTION_RECURSIVE); // Resolve dependencies $results = $repository->getDependents($needles, $constraint, $inverted, $recursive); if (empty($results)) { $extra = (null !== $constraint) ? sprintf(' in versions %smatching %s', $inverted ? 'not ' : '', $textConstraint) : ''; $this->getIO()->writeError(sprintf( '<info>There is no installed package depending on "%s"%s</info>', $needle, $extra )); } elseif ($renderTree) { $this->initStyles($output); $root = $packages[0]; $this->getIO()->write(sprintf('<info>%s</info> %s %s', $root->getPrettyName(), $root->getPrettyVersion(), $root->getDescription())); $this->printTree($results); } else { $this->printTable($output, $results); } return 0; } /** * Assembles and prints a bottom-up table of the dependencies. * * @param OutputInterface $output * @param array $results */ protected function printTable(OutputInterface $output, $results) { $table = array(); $doubles = array(); do { $queue = array(); $rows = array(); foreach ($results as $result) { /** * @var PackageInterface $package * @var Link $link */ list($package, $link, $children) = $result; $unique = (string) $link; if (isset($doubles[$unique])) { continue; } $doubles[$unique] = true; $version = (strpos($package->getPrettyVersion(), 'No version set') === 0) ? '-' : $package->getPrettyVersion(); $rows[] = array($package->getPrettyName(), $version, $link->getDescription(), sprintf('%s (%s)', $link->getTarget(), $link->getPrettyConstraint())); if ($children) { $queue = array_merge($queue, $children); } } $results = $queue; $table = array_merge($rows, $table); } while (!empty($results)); // Render table $renderer = new Table($output); $renderer->setStyle('compact'); $rendererStyle = $renderer->getStyle(); if (method_exists($rendererStyle, 'setVerticalBorderChars')) { $rendererStyle->setVerticalBorderChars(''); } else { $rendererStyle->setVerticalBorderChar(''); } $rendererStyle->setCellRowContentFormat('%s '); $renderer->setRows($table)->render(); } /** * Init styles for tree * * @param OutputInterface $output */ protected function initStyles(OutputInterface $output) { $this->colors = array( 'green', 'yellow', 'cyan', 'magenta', 'blue', ); foreach ($this->colors as $color) { $style = new OutputFormatterStyle($color); $output->getFormatter()->setStyle($color, $style); } } /** * Recursively prints a tree of the selected results. * * @param array $results Results to be printed at this level. * @param string $prefix Prefix of the current tree level. * @param int $level Current level of recursion. */ protected function printTree($results, $prefix = '', $level = 1) { $count = count($results); $idx = 0; foreach ($results as $result) { /** * @var PackageInterface $package * @var Link $link * @var array|bool $children */ list($package, $link, $children) = $result; $color = $this->colors[$level % count($this->colors)]; $prevColor = $this->colors[($level - 1) % count($this->colors)]; $isLast = (++$idx == $count); $versionText = (strpos($package->getPrettyVersion(), 'No version set') === 0) ? '' : $package->getPrettyVersion(); $packageText = rtrim(sprintf('<%s>%s</%1$s> %s', $color, $package->getPrettyName(), $versionText)); $linkText = sprintf('%s <%s>%s</%2$s> %s', $link->getDescription(), $prevColor, $link->getTarget(), $link->getPrettyConstraint()); $circularWarn = $children === false ? '(circular dependency aborted here)' : ''; $this->writeTreeLine(rtrim(sprintf("%s%s%s (%s) %s", $prefix, $isLast ? '└──' : '├──', $packageText, $linkText, $circularWarn))); if ($children) { $this->printTree($children, $prefix . ($isLast ? ' ' : '│ '), $level + 1); } } } private function writeTreeLine($line) { $io = $this->getIO(); if (!$io->isDecorated()) { $line = str_replace(array('â””', '├', '──', '│'), array('`-', '|-', '-', '|'), $line); } $io->write($line); } } composer/src/Composer/Command/ArchiveCommand.php 0000644 00000015207 14736103146 0015732 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\Factory; use Composer\IO\IOInterface; use Composer\Config; use Composer\Composer; use Composer\Repository\CompositeRepository; use Composer\Repository\RepositoryFactory; use Composer\Script\ScriptEvents; use Composer\Plugin\CommandEvent; use Composer\Plugin\PluginEvents; use Composer\Util\Filesystem; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; /** * Creates an archive of a package for distribution. * * @author Nils Adermann <naderman@naderman.de> */ class ArchiveCommand extends BaseCommand { protected function configure() { $this ->setName('archive') ->setDescription('Creates an archive of this composer package.') ->setDefinition(array( new InputArgument('package', InputArgument::OPTIONAL, 'The package to archive instead of the current project'), new InputArgument('version', InputArgument::OPTIONAL, 'A version constraint to find the package to archive'), new InputOption('format', 'f', InputOption::VALUE_REQUIRED, 'Format of the resulting archive: tar or zip'), new InputOption('dir', null, InputOption::VALUE_REQUIRED, 'Write the archive to this directory'), new InputOption('file', null, InputOption::VALUE_REQUIRED, 'Write the archive with the given file name.' .' Note that the format will be appended.'), new InputOption('ignore-filters', false, InputOption::VALUE_NONE, 'Ignore filters when saving package'), )) ->setHelp( <<<EOT The <info>archive</info> command creates an archive of the specified format containing the files and directories of the Composer project or the specified package in the specified version and writes it to the specified directory. <info>php composer.phar archive [--format=zip] [--dir=/foo] [package [version]]</info> Read more at https://getcomposer.org/doc/03-cli.md#archive EOT ) ; } protected function execute(InputInterface $input, OutputInterface $output) { $composer = $this->getComposer(false); $config = null; if ($composer) { $config = $composer->getConfig(); $commandEvent = new CommandEvent(PluginEvents::COMMAND, 'archive', $input, $output); $eventDispatcher = $composer->getEventDispatcher(); $eventDispatcher->dispatch($commandEvent->getName(), $commandEvent); $eventDispatcher->dispatchScript(ScriptEvents::PRE_ARCHIVE_CMD); } if (!$config) { $config = Factory::createConfig(); } if (null === $input->getOption('format')) { $input->setOption('format', $config->get('archive-format')); } if (null === $input->getOption('dir')) { $input->setOption('dir', $config->get('archive-dir')); } $returnCode = $this->archive( $this->getIO(), $config, $input->getArgument('package'), $input->getArgument('version'), $input->getOption('format'), $input->getOption('dir'), $input->getOption('file'), $input->getOption('ignore-filters'), $composer ); if (0 === $returnCode && $composer) { $composer->getEventDispatcher()->dispatchScript(ScriptEvents::POST_ARCHIVE_CMD); } return $returnCode; } protected function archive(IOInterface $io, Config $config, $packageName = null, $version = null, $format = 'tar', $dest = '.', $fileName = null, $ignoreFilters = false, Composer $composer = null) { if ($composer) { $archiveManager = $composer->getArchiveManager(); } else { $factory = new Factory; $downloadManager = $factory->createDownloadManager($io, $config); $archiveManager = $factory->createArchiveManager($config, $downloadManager); } if ($packageName) { $package = $this->selectPackage($io, $packageName, $version); if (!$package) { return 1; } } else { $package = $this->getComposer()->getPackage(); } $io->writeError('<info>Creating the archive into "'.$dest.'".</info>'); $packagePath = $archiveManager->archive($package, $format, $dest, $fileName, $ignoreFilters); $fs = new Filesystem; $shortPath = $fs->findShortestPath(getcwd(), $packagePath, true); $io->writeError('Created: ', false); $io->write(strlen($shortPath) < strlen($packagePath) ? $shortPath : $packagePath); return 0; } protected function selectPackage(IOInterface $io, $packageName, $version = null) { $io->writeError('<info>Searching for the specified package.</info>'); if ($composer = $this->getComposer(false)) { $localRepo = $composer->getRepositoryManager()->getLocalRepository(); $repo = new CompositeRepository(array_merge(array($localRepo), $composer->getRepositoryManager()->getRepositories())); } else { $defaultRepos = RepositoryFactory::defaultRepos($this->getIO()); $io->writeError('No composer.json found in the current directory, searching packages from ' . implode(', ', array_keys($defaultRepos))); $repo = new CompositeRepository($defaultRepos); } $packages = $repo->findPackages($packageName, $version); if (count($packages) > 1) { $package = reset($packages); $io->writeError('<info>Found multiple matches, selected '.$package->getPrettyString().'.</info>'); $io->writeError('Alternatives were '.implode(', ', array_map(function ($p) { return $p->getPrettyString(); }, $packages)).'.'); $io->writeError('<comment>Please use a more specific constraint to pick a different package.</comment>'); } elseif ($packages) { $package = reset($packages); $io->writeError('<info>Found an exact match '.$package->getPrettyString().'.</info>'); } else { $io->writeError('<error>Could not find a package matching '.$packageName.'.</error>'); return false; } return $package; } } composer/src/Composer/Command/ExecCommand.php 0000644 00000007041 14736103146 0015232 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Input\InputArgument; /** * @author Davey Shafik <me@daveyshafik.com> */ class ExecCommand extends BaseCommand { protected function configure() { $this ->setName('exec') ->setDescription('Executes a vendored binary/script.') ->setDefinition(array( new InputOption('list', 'l', InputOption::VALUE_NONE), new InputArgument('binary', InputArgument::OPTIONAL, 'The binary to run, e.g. phpunit'), new InputArgument( 'args', InputArgument::IS_ARRAY | InputArgument::OPTIONAL, 'Arguments to pass to the binary. Use <info>--</info> to separate from composer arguments' ), )) ->setHelp( <<<EOT Executes a vendored binary/script. Read more at https://getcomposer.org/doc/03-cli.md#exec EOT ) ; } protected function execute(InputInterface $input, OutputInterface $output) { $composer = $this->getComposer(); $binDir = $composer->getConfig()->get('bin-dir'); if ($input->getOption('list') || !$input->getArgument('binary')) { $bins = glob($binDir . '/*'); $bins = array_merge($bins, array_map(function ($e) { return "$e (local)"; }, $composer->getPackage()->getBinaries())); if (!$bins) { throw new \RuntimeException("No binaries found in composer.json or in bin-dir ($binDir)"); } $this->getIO()->write( <<<EOT <comment>Available binaries:</comment> EOT ); foreach ($bins as $bin) { // skip .bat copies if (isset($previousBin) && $bin === $previousBin.'.bat') { continue; } $previousBin = $bin; $bin = basename($bin); $this->getIO()->write( <<<EOT <info>- $bin</info> EOT ); } return 0; } $binary = $input->getArgument('binary'); $dispatcher = $composer->getEventDispatcher(); $dispatcher->addListener('__exec_command', $binary); if ($output->getVerbosity() === OutputInterface::VERBOSITY_NORMAL) { $output->setVerbosity(OutputInterface::VERBOSITY_QUIET); } // If the CWD was modified, we restore it to what it was initially, as it was // most likely modified by the global command, and we want exec to run in the local working directory // not the global one if (getcwd() !== $this->getApplication()->getInitialWorkingDirectory()) { try { chdir($this->getApplication()->getInitialWorkingDirectory()); } catch (\Exception $e) { throw new \RuntimeException('Could not switch back to working directory "'.$this->getApplication()->getWorkingDirectory().'"', 0, $e); } } return $dispatcher->dispatchScript('__exec_command', true, $input->getArgument('args')); } } composer/src/Composer/Command/ShowCommand.php 0000644 00000140635 14736103146 0015275 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\Composer; use Composer\DependencyResolver\DefaultPolicy; use Composer\DependencyResolver\Pool; use Composer\Json\JsonFile; use Composer\Package\BasePackage; use Composer\Package\CompletePackageInterface; use Composer\Package\PackageInterface; use Composer\Package\Version\VersionParser; use Composer\Package\Version\VersionSelector; use Composer\Plugin\CommandEvent; use Composer\Plugin\PluginEvents; use Composer\Repository\ArrayRepository; use Composer\Repository\ComposerRepository; use Composer\Repository\CompositeRepository; use Composer\Repository\PlatformRepository; use Composer\Repository\RepositoryFactory; use Composer\Repository\RepositoryInterface; use Composer\Semver\Constraint\ConstraintInterface; use Composer\Semver\Semver; use Composer\Spdx\SpdxLicenses; use Composer\Util\Platform; use Symfony\Component\Console\Formatter\OutputFormatterStyle; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Terminal; /** * @author Robert Schönthal <seroscho@googlemail.com> * @author Jordi Boggiano <j.boggiano@seld.be> * @author Jérémy Romey <jeremyFreeAgent> * @author Mihai Plasoianu <mihai@plasoianu.de> */ class ShowCommand extends BaseCommand { /** @var VersionParser */ protected $versionParser; protected $colors; /** @var Pool */ private $pool; protected function configure() { $this ->setName('show') ->setAliases(array('info')) ->setDescription('Shows information about packages.') ->setDefinition(array( new InputArgument('package', InputArgument::OPTIONAL, 'Package to inspect. Or a name including a wildcard (*) to filter lists of packages instead.'), new InputArgument('version', InputArgument::OPTIONAL, 'Version or version constraint to inspect'), new InputOption('all', null, InputOption::VALUE_NONE, 'List all packages'), new InputOption('installed', 'i', InputOption::VALUE_NONE, 'List installed packages only (enabled by default, only present for BC).'), new InputOption('platform', 'p', InputOption::VALUE_NONE, 'List platform packages only'), new InputOption('available', 'a', InputOption::VALUE_NONE, 'List available packages only'), new InputOption('self', 's', InputOption::VALUE_NONE, 'Show the root package information'), new InputOption('name-only', 'N', InputOption::VALUE_NONE, 'List package names only'), new InputOption('path', 'P', InputOption::VALUE_NONE, 'Show package paths'), new InputOption('tree', 't', InputOption::VALUE_NONE, 'List the dependencies as a tree'), new InputOption('latest', 'l', InputOption::VALUE_NONE, 'Show the latest version'), new InputOption('outdated', 'o', InputOption::VALUE_NONE, 'Show the latest version but only for packages that are outdated'), new InputOption('ignore', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Ignore specified package(s). Use it with the --outdated option if you don\'t want to be informed about new versions of some packages.'), new InputOption('minor-only', 'm', InputOption::VALUE_NONE, 'Show only packages that have minor SemVer-compatible updates. Use with the --outdated option.'), new InputOption('direct', 'D', InputOption::VALUE_NONE, 'Shows only packages that are directly required by the root package'), new InputOption('strict', null, InputOption::VALUE_NONE, 'Return a non-zero exit code when there are outdated packages'), new InputOption('format', 'f', InputOption::VALUE_REQUIRED, 'Format of the output: text or json', 'text'), )) ->setHelp( <<<EOT The show command displays detailed information about a package, or lists all packages available. Read more at https://getcomposer.org/doc/03-cli.md#show EOT ) ; } protected function execute(InputInterface $input, OutputInterface $output) { $this->versionParser = new VersionParser; if ($input->getOption('tree')) { $this->initStyles($output); } $composer = $this->getComposer(false); $io = $this->getIO(); if ($input->getOption('installed')) { $io->writeError('<warning>You are using the deprecated option "installed". Only installed packages are shown by default now. The --all option can be used to show all packages.</warning>'); } if ($input->getOption('outdated')) { $input->setOption('latest', true); } elseif ($input->getOption('ignore')) { $io->writeError('<warning>You are using the option "ignore" for action other than "outdated", it will be ignored.</warning>'); } if ($input->getOption('direct') && ($input->getOption('all') || $input->getOption('available') || $input->getOption('platform'))) { $io->writeError('The --direct (-D) option is not usable in combination with --all, --platform (-p) or --available (-a)'); return 1; } if ($input->getOption('tree') && ($input->getOption('all') || $input->getOption('available'))) { $io->writeError('The --tree (-t) option is not usable in combination with --all or --available (-a)'); return 1; } if ($input->getOption('tree') && $input->getOption('latest')) { $io->writeError('The --tree (-t) option is not usable in combination with --latest (-l)'); return 1; } if ($input->getOption('tree') && $input->getOption('path')) { $io->writeError('The --tree (-t) option is not usable in combination with --path (-P)'); return 1; } $format = $input->getOption('format'); if (!in_array($format, array('text', 'json'))) { $io->writeError(sprintf('Unsupported format "%s". See help for supported formats.', $format)); return 1; } // init repos $platformOverrides = array(); if ($composer) { $platformOverrides = $composer->getConfig()->get('platform') ?: array(); } $platformRepo = new PlatformRepository(array(), $platformOverrides); $phpVersion = $platformRepo->findPackage('php', '*')->getVersion(); if ($input->getOption('self')) { $package = $this->getComposer()->getPackage(); if ($input->getOption('name-only')) { $io->write($package->getName()); return 0; } $repos = $installedRepo = new ArrayRepository(array($package)); } elseif ($input->getOption('platform')) { $repos = $installedRepo = $platformRepo; } elseif ($input->getOption('available')) { $installedRepo = $platformRepo; if ($composer) { $repos = new CompositeRepository($composer->getRepositoryManager()->getRepositories()); } else { $defaultRepos = RepositoryFactory::defaultRepos($io); $repos = new CompositeRepository($defaultRepos); $io->writeError('No composer.json found in the current directory, showing available packages from ' . implode(', ', array_keys($defaultRepos))); } } elseif ($input->getOption('all') && $composer) { $localRepo = $composer->getRepositoryManager()->getLocalRepository(); $installedRepo = new CompositeRepository(array($localRepo, $platformRepo)); $repos = new CompositeRepository(array_merge(array($installedRepo), $composer->getRepositoryManager()->getRepositories())); } elseif ($input->getOption('all')) { $defaultRepos = RepositoryFactory::defaultRepos($io); $io->writeError('No composer.json found in the current directory, showing available packages from ' . implode(', ', array_keys($defaultRepos))); $installedRepo = $platformRepo; $repos = new CompositeRepository(array_merge(array($installedRepo), $defaultRepos)); } else { $repos = $installedRepo = $this->getComposer()->getRepositoryManager()->getLocalRepository(); $rootPkg = $this->getComposer()->getPackage(); if (!$installedRepo->getPackages() && ($rootPkg->getRequires() || $rootPkg->getDevRequires())) { $io->writeError('<warning>No dependencies installed. Try running composer install or update.</warning>'); } } if ($composer) { $commandEvent = new CommandEvent(PluginEvents::COMMAND, 'show', $input, $output); $composer->getEventDispatcher()->dispatch($commandEvent->getName(), $commandEvent); } if ($input->getOption('latest') && null === $composer) { $io->writeError('No composer.json found in the current directory, disabling "latest" option'); $input->setOption('latest', false); } $packageFilter = $input->getArgument('package'); // show single package or single version if (($packageFilter && false === strpos($packageFilter, '*')) || !empty($package)) { if (empty($package)) { list($package, $versions) = $this->getPackage($installedRepo, $repos, $input->getArgument('package'), $input->getArgument('version')); if (empty($package)) { $options = $input->getOptions(); if (!isset($options['working-dir']) || !file_exists('composer.json')) { if (preg_match(PlatformRepository::PLATFORM_PACKAGE_REGEX, $input->getArgument('package')) && !$input->getOption('platform')) { throw new \InvalidArgumentException('Package ' . $packageFilter . ' not found, try using --platform (-p) to show platform packages.'); } throw new \InvalidArgumentException('Package ' . $packageFilter . ' not found'); } $io->writeError('Package ' . $packageFilter . ' not found in ' . $options['working-dir'] . '/composer.json'); return 1; } } else { $versions = array($package->getPrettyVersion() => $package->getVersion()); } $exitCode = 0; if ($input->getOption('tree')) { $arrayTree = $this->generatePackageTree($package, $installedRepo, $repos); if ('json' === $format) { $io->write(JsonFile::encode(array('installed' => array($arrayTree)))); } else { $this->displayPackageTree(array($arrayTree)); } } else { $latestPackage = null; if ($input->getOption('latest')) { $latestPackage = $this->findLatestPackage($package, $composer, $phpVersion); } if ($input->getOption('outdated') && $input->getOption('strict') && $latestPackage && $latestPackage->getFullPrettyVersion() !== $package->getFullPrettyVersion() && !$latestPackage->isAbandoned()) { $exitCode = 1; } if ($input->getOption('path')) { $io->write($package->getName(), false); $io->write(' ' . strtok(realpath($composer->getInstallationManager()->getInstallPath($package)), "\r\n")); return $exitCode; } if ('json' === $format) { $this->printPackageInfoAsJson($package, $versions, $installedRepo, $latestPackage ?: null); } else { $this->printPackageInfo($package, $versions, $installedRepo, $latestPackage ?: null); } } return $exitCode; } // show tree view if requested if ($input->getOption('tree')) { $rootRequires = $this->getRootRequires(); $packages = $installedRepo->getPackages(); usort($packages, 'strcmp'); $arrayTree = array(); foreach ($packages as $package) { if (in_array($package->getName(), $rootRequires, true)) { $arrayTree[] = $this->generatePackageTree($package, $installedRepo, $repos); } } if ('json' === $format) { $io->write(JsonFile::encode(array('installed' => $arrayTree))); } else { $this->displayPackageTree($arrayTree); } return 0; } if ($repos instanceof CompositeRepository) { $repos = $repos->getRepositories(); } elseif (!is_array($repos)) { $repos = array($repos); } // list packages $packages = array(); if (null !== $packageFilter) { $packageFilter = '{^'.str_replace('\\*', '.*?', preg_quote($packageFilter)).'$}i'; } $packageListFilter = array(); if ($input->getOption('direct')) { $packageListFilter = $this->getRootRequires(); } if (class_exists('Symfony\Component\Console\Terminal')) { $terminal = new Terminal(); $width = $terminal->getWidth(); } else { // For versions of Symfony console before 3.2 list($width) = $this->getApplication()->getTerminalDimensions(); } if (null === $width) { // In case the width is not detected, we're probably running the command // outside of a real terminal, use space without a limit $width = PHP_INT_MAX; } if (Platform::isWindows()) { $width--; } else { $width = max(80, $width); } if ($input->getOption('path') && null === $composer) { $io->writeError('No composer.json found in the current directory, disabling "path" option'); $input->setOption('path', false); } foreach ($repos as $repo) { if ($repo === $platformRepo) { $type = 'platform'; } elseif ( $repo === $installedRepo || ($installedRepo instanceof CompositeRepository && in_array($repo, $installedRepo->getRepositories(), true)) ) { $type = 'installed'; } else { $type = 'available'; } if ($repo instanceof ComposerRepository && $repo->hasProviders()) { foreach ($repo->getProviderNames() as $name) { if (!$packageFilter || preg_match($packageFilter, $name)) { $packages[$type][$name] = $name; } } } else { foreach ($repo->getPackages() as $package) { if (!isset($packages[$type][$package->getName()]) || !is_object($packages[$type][$package->getName()]) || version_compare($packages[$type][$package->getName()]->getVersion(), $package->getVersion(), '<') ) { if (!$packageFilter || preg_match($packageFilter, $package->getName())) { if (!$packageListFilter || in_array($package->getName(), $packageListFilter, true)) { $packages[$type][$package->getName()] = $package; } } } } } } $showAllTypes = $input->getOption('all'); $showLatest = $input->getOption('latest'); $showMinorOnly = $input->getOption('minor-only'); $ignoredPackages = array_map('strtolower', $input->getOption('ignore')); $indent = $showAllTypes ? ' ' : ''; $latestPackages = array(); $exitCode = 0; $viewData = array(); $viewMetaData = array(); foreach (array('platform' => true, 'available' => false, 'installed' => true) as $type => $showVersion) { if (isset($packages[$type])) { ksort($packages[$type]); $nameLength = $versionLength = $latestLength = 0; if ($showLatest && $showVersion) { foreach ($packages[$type] as $package) { if (is_object($package)) { $latestPackage = $this->findLatestPackage($package, $composer, $phpVersion, $showMinorOnly); if ($latestPackage === false) { continue; } $latestPackages[$package->getPrettyName()] = $latestPackage; } } } $writePath = !$input->getOption('name-only') && $input->getOption('path'); $writeVersion = !$input->getOption('name-only') && !$input->getOption('path') && $showVersion; $writeLatest = $writeVersion && $showLatest; $writeDescription = !$input->getOption('name-only') && !$input->getOption('path'); $hasOutdatedPackages = false; $viewData[$type] = array(); foreach ($packages[$type] as $package) { $packageViewData = array(); if (is_object($package)) { $latestPackage = null; if ($showLatest && isset($latestPackages[$package->getPrettyName()])) { $latestPackage = $latestPackages[$package->getPrettyName()]; } // Determine if Composer is checking outdated dependencies and if current package should trigger non-default exit code $packageIsUpToDate = $latestPackage && $latestPackage->getFullPrettyVersion() === $package->getFullPrettyVersion() && !$latestPackage->isAbandoned(); $packageIsIgnored = \in_array($package->getPrettyName(), $ignoredPackages, true); if ($input->getOption('outdated') && ($packageIsUpToDate || $packageIsIgnored)) { continue; } elseif ($input->getOption('outdated') || $input->getOption('strict')) { $hasOutdatedPackages = true; } $packageViewData['name'] = $package->getPrettyName(); $nameLength = max($nameLength, strlen($package->getPrettyName())); if ($writeVersion) { $packageViewData['version'] = $package->getFullPrettyVersion(); $versionLength = max($versionLength, strlen($package->getFullPrettyVersion())); } if ($writeLatest && $latestPackage) { $packageViewData['latest'] = $latestPackage->getFullPrettyVersion(); $packageViewData['latest-status'] = $this->getUpdateStatus($latestPackage, $package); $latestLength = max($latestLength, strlen($latestPackage->getFullPrettyVersion())); } if ($writeDescription) { $packageViewData['description'] = $package->getDescription(); } if ($writePath) { $packageViewData['path'] = strtok(realpath($composer->getInstallationManager()->getInstallPath($package)), "\r\n"); } if ($latestPackage && $latestPackage->isAbandoned()) { $replacement = is_string($latestPackage->getReplacementPackage()) ? 'Use ' . $latestPackage->getReplacementPackage() . ' instead' : 'No replacement was suggested'; $packageWarning = sprintf( 'Package %s is abandoned, you should avoid using it. %s.', $package->getPrettyName(), $replacement ); $packageViewData['warning'] = $packageWarning; } } else { $packageViewData['name'] = $package; $nameLength = max($nameLength, strlen($package)); } $viewData[$type][] = $packageViewData; } $viewMetaData[$type] = array( 'nameLength' => $nameLength, 'versionLength' => $versionLength, 'latestLength' => $latestLength, ); if ($input->getOption('strict') && $hasOutdatedPackages) { $exitCode = 1; break; } } } if ('json' === $format) { $io->write(JsonFile::encode($viewData)); } else { foreach ($viewData as $type => $packages) { $nameLength = $viewMetaData[$type]['nameLength']; $versionLength = $viewMetaData[$type]['versionLength']; $latestLength = $viewMetaData[$type]['latestLength']; $writeVersion = $nameLength + $versionLength + 3 <= $width; $writeLatest = $nameLength + $versionLength + $latestLength + 3 <= $width; $writeDescription = $nameLength + $versionLength + $latestLength + 24 <= $width; if ($writeLatest && !$io->isDecorated()) { $latestLength += 2; } if ($showAllTypes) { if ('available' === $type) { $io->write('<comment>' . $type . '</comment>:'); } else { $io->write('<info>' . $type . '</info>:'); } } foreach ($packages as $package) { $io->write($indent . str_pad($package['name'], $nameLength, ' '), false); if (isset($package['version']) && $writeVersion) { $io->write(' ' . str_pad($package['version'], $versionLength, ' '), false); } if (isset($package['latest']) && $writeLatest) { $latestVersion = $package['latest']; $updateStatus = $package['latest-status']; $style = $this->updateStatusToVersionStyle($updateStatus); if (!$io->isDecorated()) { $latestVersion = str_replace(array('up-to-date', 'semver-safe-update', 'update-possible'), array('=', '!', '~'), $updateStatus) . ' ' . $latestVersion; } $io->write(' <' . $style . '>' . str_pad($latestVersion, $latestLength, ' ') . '</' . $style . '>', false); } if (isset($package['description']) && $writeDescription) { $description = strtok($package['description'], "\r\n"); $remaining = $width - $nameLength - $versionLength - 4; if ($writeLatest) { $remaining -= $latestLength; } if (strlen($description) > $remaining) { $description = substr($description, 0, $remaining - 3) . '...'; } $io->write(' ' . $description, false); } if (isset($package['path'])) { $io->write(' ' . $package['path'], false); } $io->write(''); if (isset($package['warning'])) { $io->write('<warning>' . $package['warning'] . '</warning>'); } } if ($showAllTypes) { $io->write(''); } } } return $exitCode; } protected function getRootRequires() { $rootPackage = $this->getComposer()->getPackage(); return array_map( 'strtolower', array_keys(array_merge($rootPackage->getRequires(), $rootPackage->getDevRequires())) ); } protected function getVersionStyle(PackageInterface $latestPackage, PackageInterface $package) { return $this->updateStatusToVersionStyle($this->getUpdateStatus($latestPackage, $package)); } /** * finds a package by name and version if provided * * @param RepositoryInterface $installedRepo * @param RepositoryInterface $repos * @param string $name * @param ConstraintInterface|string $version * @throws \InvalidArgumentException * @return array array(CompletePackageInterface, array of versions) */ protected function getPackage(RepositoryInterface $installedRepo, RepositoryInterface $repos, $name, $version = null) { $name = strtolower($name); $constraint = is_string($version) ? $this->versionParser->parseConstraints($version) : $version; $policy = new DefaultPolicy(); $pool = new Pool('dev'); $pool->addRepository($repos); $matchedPackage = null; $versions = array(); $matches = $pool->whatProvides($name, $constraint); foreach ($matches as $index => $package) { // skip providers/replacers if ($package->getName() !== $name) { unset($matches[$index]); continue; } // select an exact match if it is in the installed repo and no specific version was required if (null === $version && $installedRepo->hasPackage($package)) { $matchedPackage = $package; } $versions[$package->getPrettyVersion()] = $package->getVersion(); $matches[$index] = $package->getId(); } // select preferred package according to policy rules if (!$matchedPackage && $matches && $preferred = $policy->selectPreferredPackages($pool, array(), $matches)) { $matchedPackage = $pool->literalToPackage($preferred[0]); } return array($matchedPackage, $versions); } /** * Prints package info. * * @param CompletePackageInterface $package * @param array $versions * @param RepositoryInterface $installedRepo * @param PackageInterface|null $latestPackage */ protected function printPackageInfo(CompletePackageInterface $package, array $versions, RepositoryInterface $installedRepo, PackageInterface $latestPackage = null) { $io = $this->getIO(); $this->printMeta($package, $versions, $installedRepo, $latestPackage ?: null); $this->printLinks($package, 'requires'); $this->printLinks($package, 'devRequires', 'requires (dev)'); if ($package->getSuggests()) { $io->write("\n<info>suggests</info>"); foreach ($package->getSuggests() as $suggested => $reason) { $io->write($suggested . ' <comment>' . $reason . '</comment>'); } } $this->printLinks($package, 'provides'); $this->printLinks($package, 'conflicts'); $this->printLinks($package, 'replaces'); } /** * Prints package metadata. * * @param CompletePackageInterface $package * @param array $versions * @param RepositoryInterface $installedRepo * @param PackageInterface|null $latestPackage */ protected function printMeta(CompletePackageInterface $package, array $versions, RepositoryInterface $installedRepo, PackageInterface $latestPackage = null) { $io = $this->getIO(); $io->write('<info>name</info> : ' . $package->getPrettyName()); $io->write('<info>descrip.</info> : ' . $package->getDescription()); $io->write('<info>keywords</info> : ' . implode(', ', $package->getKeywords() ?: array())); $this->printVersions($package, $versions, $installedRepo); if ($latestPackage) { $style = $this->getVersionStyle($latestPackage, $package); $io->write('<info>latest</info> : <'.$style.'>' . $latestPackage->getPrettyVersion() . '</'.$style.'>'); } else { $latestPackage = $package; } $io->write('<info>type</info> : ' . $package->getType()); $this->printLicenses($package); $io->write('<info>homepage</info> : ' . $package->getHomepage()); $io->write('<info>source</info> : ' . sprintf('[%s] <comment>%s</comment> %s', $package->getSourceType(), $package->getSourceUrl(), $package->getSourceReference())); $io->write('<info>dist</info> : ' . sprintf('[%s] <comment>%s</comment> %s', $package->getDistType(), $package->getDistUrl(), $package->getDistReference())); if ($installedRepo->hasPackage($package)) { $io->write('<info>path</info> : ' . sprintf('%s', realpath($this->getComposer()->getInstallationManager()->getInstallPath($package)))); } $io->write('<info>names</info> : ' . implode(', ', $package->getNames())); if ($latestPackage->isAbandoned()) { $replacement = ($latestPackage->getReplacementPackage() !== null) ? ' The author suggests using the ' . $latestPackage->getReplacementPackage(). ' package instead.' : null; $io->writeError( sprintf('<warning>Attention: This package is abandoned and no longer maintained.%s</warning>', $replacement) ); } if ($package->getSupport()) { $io->write("\n<info>support</info>"); foreach ($package->getSupport() as $type => $value) { $io->write('<comment>' . $type . '</comment> : '.$value); } } if ($package->getAutoload()) { $io->write("\n<info>autoload</info>"); foreach ($package->getAutoload() as $type => $autoloads) { $io->write('<comment>' . $type . '</comment>'); if ($type === 'psr-0') { foreach ($autoloads as $name => $path) { $io->write(($name ?: '*') . ' => ' . (is_array($path) ? implode(', ', $path) : ($path ?: '.'))); } } elseif ($type === 'psr-4') { foreach ($autoloads as $name => $path) { $io->write(($name ?: '*') . ' => ' . (is_array($path) ? implode(', ', $path) : ($path ?: '.'))); } } elseif ($type === 'classmap') { $io->write(implode(', ', $autoloads)); } } if ($package->getIncludePaths()) { $io->write('<comment>include-path</comment>'); $io->write(implode(', ', $package->getIncludePaths())); } } } /** * Prints all available versions of this package and highlights the installed one if any. * * @param CompletePackageInterface $package * @param array $versions * @param RepositoryInterface $installedRepo */ protected function printVersions(CompletePackageInterface $package, array $versions, RepositoryInterface $installedRepo) { uasort($versions, 'version_compare'); $versions = array_keys(array_reverse($versions)); // highlight installed version if ($installedRepo->hasPackage($package)) { $installedVersion = $package->getPrettyVersion(); $key = array_search($installedVersion, $versions); if (false !== $key) { $versions[$key] = '<info>* ' . $installedVersion . '</info>'; } } $versions = implode(', ', $versions); $this->getIO()->write('<info>versions</info> : ' . $versions); } /** * print link objects * * @param CompletePackageInterface $package * @param string $linkType * @param string $title */ protected function printLinks(CompletePackageInterface $package, $linkType, $title = null) { $title = $title ?: $linkType; $io = $this->getIO(); if ($links = $package->{'get'.ucfirst($linkType)}()) { $io->write("\n<info>" . $title . "</info>"); foreach ($links as $link) { $io->write($link->getTarget() . ' <comment>' . $link->getPrettyConstraint() . '</comment>'); } } } /** * Prints the licenses of a package with metadata * * @param CompletePackageInterface $package */ protected function printLicenses(CompletePackageInterface $package) { $spdxLicenses = new SpdxLicenses(); $licenses = $package->getLicense(); $io = $this->getIO(); foreach ($licenses as $licenseId) { $license = $spdxLicenses->getLicenseByIdentifier($licenseId); // keys: 0 fullname, 1 osi, 2 url if (!$license) { $out = $licenseId; } else { // is license OSI approved? if ($license[1] === true) { $out = sprintf('%s (%s) (OSI approved) %s', $license[0], $licenseId, $license[2]); } else { $out = sprintf('%s (%s) %s', $license[0], $licenseId, $license[2]); } } $io->write('<info>license</info> : ' . $out); } } /** * Prints package info in JSON format. * * @param CompletePackageInterface $package * @param array $versions * @param RepositoryInterface $installedRepo * @param PackageInterface|null $latestPackage */ protected function printPackageInfoAsJson(CompletePackageInterface $package, array $versions, RepositoryInterface $installedRepo, PackageInterface $latestPackage = null) { $json = array( 'name' => $package->getPrettyName(), 'description' => $package->getDescription(), 'keywords' => $package->getKeywords() ?: array(), 'type' => $package->getType(), 'homepage' => $package->getHomepage(), 'names' => $package->getNames() ); $json = $this->appendVersions($json, $versions); $json = $this->appendLicenses($json, $package); if ($latestPackage) { $json['latest'] = $latestPackage->getPrettyVersion(); } else { $latestPackage = $package; } if ($package->getSourceType()) { $json['source'] = array( 'type' => $package->getSourceType(), 'url' => $package->getSourceUrl(), 'reference' => $package->getSourceReference() ); } if ($package->getDistType()) { $json['dist'] = array( 'type' => $package->getDistType(), 'url' => $package->getDistUrl(), 'reference' => $package->getDistReference() ); } if ($installedRepo->hasPackage($package)) { $json['path'] = realpath($this->getComposer()->getInstallationManager()->getInstallPath($package)); if ($json['path'] === false) { unset($json['path']); } } if ($latestPackage->isAbandoned()) { $json['replacement'] = $latestPackage->getReplacementPackage(); } if ($package->getSuggests()) { $json['suggests'] = $package->getSuggests(); } if ($package->getSupport()) { $json['support'] = $package->getSupport(); } $json = $this->appendAutoload($json, $package); if ($package->getIncludePaths()) { $json['include_path'] = $package->getIncludePaths(); } $json = $this->appendLinks($json, $package); $this->getIO()->write(JsonFile::encode($json)); } private function appendVersions($json, array $versions) { uasort($versions, 'version_compare'); $versions = array_keys(array_reverse($versions)); $json['versions'] = $versions; return $json; } private function appendLicenses($json, CompletePackageInterface $package) { if ($licenses = $package->getLicense()) { $spdxLicenses = new SpdxLicenses(); $json['licenses'] = array_map(function ($licenseId) use ($spdxLicenses) { $license = $spdxLicenses->getLicenseByIdentifier($licenseId); // keys: 0 fullname, 1 osi, 2 url if (!$license) { return $licenseId; } return array( 'name' => $license[0], 'osi' => $licenseId, 'url' => $license[2] ); }, $licenses); } return $json; } private function appendAutoload($json, CompletePackageInterface $package) { if ($package->getAutoload()) { $autoload = array(); foreach ($package->getAutoload() as $type => $autoloads) { if ($type === 'psr-0' || $type === 'psr-4') { $psr = array(); foreach ($autoloads as $name => $path) { if (!$path) { $path = '.'; } $psr[$name ?: '*'] = $path; } $autoload[$type] = $psr; } elseif ($type === 'classmap') { $autoload['classmap'] = $autoloads; } } $json['autoload'] = $autoload; } return $json; } private function appendLinks($json, CompletePackageInterface $package) { foreach (array('requires', 'devRequires', 'provides', 'conflicts', 'replaces') as $linkType) { $json = $this->appendLink($json, $package, $linkType); } return $json; } private function appendLink($json, CompletePackageInterface $package, $linkType) { $links = $package->{'get' . ucfirst($linkType)}(); if ($links) { $json[$linkType] = array(); foreach ($links as $link) { $json[$linkType][$link->getTarget()] = $link->getPrettyConstraint(); } } return $json; } /** * Init styles for tree * * @param OutputInterface $output */ protected function initStyles(OutputInterface $output) { $this->colors = array( 'green', 'yellow', 'cyan', 'magenta', 'blue', ); foreach ($this->colors as $color) { $style = new OutputFormatterStyle($color); $output->getFormatter()->setStyle($color, $style); } } /** * Display the tree * * @param array $arrayTree */ protected function displayPackageTree(array $arrayTree) { $io = $this->getIO(); foreach ($arrayTree as $package) { $io->write(sprintf('<info>%s</info>', $package['name']), false); $io->write(' ' . $package['version'], false); $io->write(' ' . strtok($package['description'], "\r\n")); if (isset($package['requires'])) { $requires = $package['requires']; $treeBar = '├'; $j = 0; $total = count($requires); foreach ($requires as $require) { $requireName = $require['name']; $j++; if ($j === $total) { $treeBar = 'â””'; } $level = 1; $color = $this->colors[$level]; $info = sprintf( '%s──<%s>%s</%s> %s', $treeBar, $color, $requireName, $color, $require['version'] ); $this->writeTreeLine($info); $treeBar = str_replace('â””', ' ', $treeBar); $packagesInTree = array($package['name'], $requireName); $this->displayTree($require, $packagesInTree, $treeBar, $level + 1); } } } } /** * Generate the package tree * * @param PackageInterface $package * @param RepositoryInterface $installedRepo * @param RepositoryInterface $distantRepos * @return array */ protected function generatePackageTree( PackageInterface $package, RepositoryInterface $installedRepo, RepositoryInterface $distantRepos ) { $requires = $package->getRequires(); ksort($requires); $children = array(); foreach ($requires as $requireName => $require) { $packagesInTree = array($package->getName(), $requireName); $treeChildDesc = array( 'name' => $requireName, 'version' => $require->getPrettyConstraint(), ); $deepChildren = $this->addTree($requireName, $require, $installedRepo, $distantRepos, $packagesInTree); if ($deepChildren) { $treeChildDesc['requires'] = $deepChildren; } $children[] = $treeChildDesc; } $tree = array( 'name' => $package->getPrettyName(), 'version' => $package->getPrettyVersion(), 'description' => $package->getDescription(), ); if ($children) { $tree['requires'] = $children; } return $tree; } /** * Display a package tree * * @param PackageInterface|string $package * @param array $packagesInTree * @param string $previousTreeBar * @param int $level */ protected function displayTree( $package, array $packagesInTree, $previousTreeBar = '├', $level = 1 ) { $previousTreeBar = str_replace('├', '│', $previousTreeBar); if (isset($package['requires'])) { $requires = $package['requires']; $treeBar = $previousTreeBar . ' ├'; $i = 0; $total = count($requires); foreach ($requires as $require) { $currentTree = $packagesInTree; $i++; if ($i === $total) { $treeBar = $previousTreeBar . ' â””'; } $colorIdent = $level % count($this->colors); $color = $this->colors[$colorIdent]; $circularWarn = in_array( $require['name'], $currentTree, true ) ? '(circular dependency aborted here)' : ''; $info = rtrim(sprintf( '%s──<%s>%s</%s> %s %s', $treeBar, $color, $require['name'], $color, $require['version'], $circularWarn )); $this->writeTreeLine($info); $treeBar = str_replace('â””', ' ', $treeBar); $currentTree[] = $require['name']; $this->displayTree($require, $currentTree, $treeBar, $level + 1); } } } /** * Display a package tree * * @param string $name * @param PackageInterface|string $package * @param RepositoryInterface $installedRepo * @param RepositoryInterface $distantRepos * @param array $packagesInTree * @return array */ protected function addTree( $name, $package, RepositoryInterface $installedRepo, RepositoryInterface $distantRepos, array $packagesInTree ) { $children = array(); list($package, $versions) = $this->getPackage( $installedRepo, $distantRepos, $name, $package->getPrettyConstraint() === 'self.version' ? $package->getConstraint() : $package->getPrettyConstraint() ); if (is_object($package)) { $requires = $package->getRequires(); ksort($requires); foreach ($requires as $requireName => $require) { $currentTree = $packagesInTree; $treeChildDesc = array( 'name' => $requireName, 'version' => $require->getPrettyConstraint(), ); if (!in_array($requireName, $currentTree, true)) { $currentTree[] = $requireName; $deepChildren = $this->addTree($requireName, $require, $installedRepo, $distantRepos, $currentTree); if ($deepChildren) { $treeChildDesc['requires'] = $deepChildren; } } $children[] = $treeChildDesc; } } return $children; } private function updateStatusToVersionStyle($updateStatus) { // 'up-to-date' is printed green // 'semver-safe-update' is printed red // 'update-possible' is printed yellow return str_replace(array('up-to-date', 'semver-safe-update', 'update-possible'), array('info', 'highlight', 'comment'), $updateStatus); } private function getUpdateStatus(PackageInterface $latestPackage, PackageInterface $package) { if ($latestPackage->getFullPrettyVersion() === $package->getFullPrettyVersion()) { return 'up-to-date'; } $constraint = $package->getVersion(); if (0 !== strpos($constraint, 'dev-')) { $constraint = '^'.$constraint; } if ($latestPackage->getVersion() && Semver::satisfies($latestPackage->getVersion(), $constraint)) { // it needs an immediate semver-compliant upgrade return 'semver-safe-update'; } // it needs an upgrade but has potential BC breaks so is not urgent return 'update-possible'; } private function writeTreeLine($line) { $io = $this->getIO(); if (!$io->isDecorated()) { $line = str_replace(array('â””', '├', '──', '│'), array('`-', '|-', '-', '|'), $line); } $io->write($line); } /** * Given a package, this finds the latest package matching it * * @param PackageInterface $package * @param Composer $composer * @param string $phpVersion * @param bool $minorOnly * * @return PackageInterface|null */ private function findLatestPackage(PackageInterface $package, Composer $composer, $phpVersion, $minorOnly = false) { // find the latest version allowed in this pool $name = $package->getName(); $versionSelector = new VersionSelector($this->getPool($composer)); $stability = $composer->getPackage()->getMinimumStability(); $flags = $composer->getPackage()->getStabilityFlags(); if (isset($flags[$name])) { $stability = array_search($flags[$name], BasePackage::$stabilities, true); } $bestStability = $stability; if ($composer->getPackage()->getPreferStable()) { $bestStability = $package->getStability(); } $targetVersion = null; if (0 === strpos($package->getVersion(), 'dev-')) { $targetVersion = $package->getVersion(); } if ($targetVersion === null && $minorOnly) { $targetVersion = '^' . $package->getVersion(); } return $versionSelector->findBestCandidate($name, $targetVersion, $phpVersion, $bestStability); } private function getPool(Composer $composer) { if (!$this->pool) { $this->pool = new Pool($composer->getPackage()->getMinimumStability(), $composer->getPackage()->getStabilityFlags()); $this->pool->addRepository(new CompositeRepository($composer->getRepositoryManager()->getRepositories())); } return $this->pool; } } composer/src/Composer/Command/InstallCommand.php 0000644 00000014445 14736103146 0015762 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\Installer; use Composer\Plugin\CommandEvent; use Composer\Plugin\PluginEvents; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Output\OutputInterface; /** * @author Jordi Boggiano <j.boggiano@seld.be> * @author Ryan Weaver <ryan@knplabs.com> * @author Konstantin Kudryashov <ever.zet@gmail.com> * @author Nils Adermann <naderman@naderman.de> */ class InstallCommand extends BaseCommand { protected function configure() { $this ->setName('install') ->setAliases(array('i')) ->setDescription('Installs the project dependencies from the composer.lock file if present, or falls back on the composer.json.') ->setDefinition(array( new InputOption('prefer-source', null, InputOption::VALUE_NONE, 'Forces installation from package sources when possible, including VCS information.'), new InputOption('prefer-dist', null, InputOption::VALUE_NONE, 'Forces installation from package dist even for dev versions.'), new InputOption('dry-run', null, InputOption::VALUE_NONE, 'Outputs the operations but will not execute anything (implicitly enables --verbose).'), new InputOption('dev', null, InputOption::VALUE_NONE, 'Enables installation of require-dev packages (enabled by default, only present for BC).'), new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Disables installation of require-dev packages.'), new InputOption('no-custom-installers', null, InputOption::VALUE_NONE, 'DEPRECATED: Use no-plugins instead.'), new InputOption('no-autoloader', null, InputOption::VALUE_NONE, 'Skips autoloader generation'), new InputOption('no-scripts', null, InputOption::VALUE_NONE, 'Skips the execution of all scripts defined in composer.json file.'), new InputOption('no-progress', null, InputOption::VALUE_NONE, 'Do not output download progress.'), new InputOption('no-suggest', null, InputOption::VALUE_NONE, 'Do not show package suggestions.'), new InputOption('verbose', 'v|vv|vvv', InputOption::VALUE_NONE, 'Shows more details including new commits pulled in when updating packages.'), new InputOption('optimize-autoloader', 'o', InputOption::VALUE_NONE, 'Optimize autoloader during autoloader dump'), new InputOption('classmap-authoritative', 'a', InputOption::VALUE_NONE, 'Autoload classes from the classmap only. Implicitly enables `--optimize-autoloader`.'), new InputOption('apcu-autoloader', null, InputOption::VALUE_NONE, 'Use APCu to cache found/not-found classes.'), new InputOption('ignore-platform-reqs', null, InputOption::VALUE_NONE, 'Ignore platform requirements (php & ext- packages).'), new InputArgument('packages', InputArgument::IS_ARRAY | InputArgument::OPTIONAL, 'Should not be provided, use composer require instead to add a given package to composer.json.'), )) ->setHelp( <<<EOT The <info>install</info> command reads the composer.lock file from the current directory, processes it, and downloads and installs all the libraries and dependencies outlined in that file. If the file does not exist it will look for composer.json and do the same. <info>php composer.phar install</info> Read more at https://getcomposer.org/doc/03-cli.md#install-i EOT ) ; } protected function execute(InputInterface $input, OutputInterface $output) { $io = $this->getIO(); if ($args = $input->getArgument('packages')) { $io->writeError('<error>Invalid argument '.implode(' ', $args).'. Use "composer require '.implode(' ', $args).'" instead to add packages to your composer.json.</error>'); return 1; } if ($input->getOption('no-custom-installers')) { $io->writeError('<warning>You are using the deprecated option "no-custom-installers". Use "no-plugins" instead.</warning>'); $input->setOption('no-plugins', true); } if ($input->getOption('dev')) { $io->writeError('<warning>You are using the deprecated option "dev". Dev packages are installed by default now.</warning>'); } $composer = $this->getComposer(true, $input->getOption('no-plugins')); $composer->getDownloadManager()->setOutputProgress(!$input->getOption('no-progress')); $commandEvent = new CommandEvent(PluginEvents::COMMAND, 'install', $input, $output); $composer->getEventDispatcher()->dispatch($commandEvent->getName(), $commandEvent); $install = Installer::create($io, $composer); $config = $composer->getConfig(); list($preferSource, $preferDist) = $this->getPreferredInstallOptions($config, $input); $optimize = $input->getOption('optimize-autoloader') || $config->get('optimize-autoloader'); $authoritative = $input->getOption('classmap-authoritative') || $config->get('classmap-authoritative'); $apcu = $input->getOption('apcu-autoloader') || $config->get('apcu-autoloader'); $install ->setDryRun($input->getOption('dry-run')) ->setVerbose($input->getOption('verbose')) ->setPreferSource($preferSource) ->setPreferDist($preferDist) ->setDevMode(!$input->getOption('no-dev')) ->setDumpAutoloader(!$input->getOption('no-autoloader')) ->setRunScripts(!$input->getOption('no-scripts')) ->setSkipSuggest($input->getOption('no-suggest')) ->setOptimizeAutoloader($optimize) ->setClassMapAuthoritative($authoritative) ->setApcuAutoloader($apcu) ->setIgnorePlatformRequirements($input->getOption('ignore-platform-reqs')) ; if ($input->getOption('no-plugins')) { $install->disablePlugins(); } return $install->run(); } } composer/src/Composer/Command/CheckPlatformReqsCommand.php 0000644 00000013514 14736103146 0017725 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\Package\Link; use Composer\Package\PackageInterface; use Composer\Semver\Constraint\Constraint; use Symfony\Component\Console\Helper\Table; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Composer\Repository\PlatformRepository; class CheckPlatformReqsCommand extends BaseCommand { protected function configure() { $this->setName('check-platform-reqs') ->setDescription('Check that platform requirements are satisfied.') ->setDefinition(array( new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Disables checking of require-dev packages requirements.'), )) ->setHelp( <<<EOT Checks that your PHP and extensions versions match the platform requirements of the installed packages. Unlike update/install, this command will ignore config.platform settings and check the real platform packages so you can be certain you have the required platform dependencies. <info>php composer.phar check-platform-reqs</info> EOT ); } protected function execute(InputInterface $input, OutputInterface $output) { $composer = $this->getComposer(); $requires = $composer->getPackage()->getRequires(); if ($input->getOption('no-dev')) { $dependencies = $composer->getLocker()->getLockedRepository(!$input->getOption('no-dev'))->getPackages(); } else { $dependencies = $composer->getRepositoryManager()->getLocalRepository()->getPackages(); // fallback to lockfile if installed repo is empty if (!$dependencies) { $dependencies = $composer->getLocker()->getLockedRepository(true)->getPackages(); } $requires += $composer->getPackage()->getDevRequires(); } foreach ($requires as $require => $link) { $requires[$require] = array($link); } foreach ($dependencies as $package) { foreach ($package->getRequires() as $require => $link) { $requires[$require][] = $link; } } ksort($requires); $platformRepo = new PlatformRepository(array(), array()); $currentPlatformPackages = $platformRepo->getPackages(); $currentPlatformPackageMap = array(); /** * @var PackageInterface $currentPlatformPackage */ foreach ($currentPlatformPackages as $currentPlatformPackage) { $currentPlatformPackageMap[$currentPlatformPackage->getName()] = $currentPlatformPackage; } $results = array(); $exitCode = 0; /** * @var Link[] $links */ foreach ($requires as $require => $links) { if (preg_match(PlatformRepository::PLATFORM_PACKAGE_REGEX, $require)) { if (isset($currentPlatformPackageMap[$require])) { $pass = true; $version = $currentPlatformPackageMap[$require]->getVersion(); foreach ($links as $link) { if (!$link->getConstraint()->matches(new Constraint('=', $version))) { $results[] = array( $currentPlatformPackageMap[$require]->getPrettyName(), $currentPlatformPackageMap[$require]->getPrettyVersion(), $link, '<error>failed</error>', ); $pass = false; $exitCode = max($exitCode, 1); } } if ($pass) { $results[] = array( $currentPlatformPackageMap[$require]->getPrettyName(), $currentPlatformPackageMap[$require]->getPrettyVersion(), null, '<info>success</info>', ); } } else { $results[] = array( $require, 'n/a', $links[0], '<error>missing</error>', ); $exitCode = max($exitCode, 2); } } } $this->printTable($output, $results); return $exitCode; } protected function printTable(OutputInterface $output, $results) { $table = array(); $rows = array(); foreach ($results as $result) { /** * @var Link|null $link */ list($platformPackage, $version, $link, $status) = $result; $rows[] = array( $platformPackage, $version, $link ? sprintf('%s %s %s (%s)', $link->getSource(), $link->getDescription(), $link->getTarget(), $link->getPrettyConstraint()) : '', $status, ); } $table = array_merge($rows, $table); // Render table $renderer = new Table($output); $renderer->setStyle('compact'); $rendererStyle = $renderer->getStyle(); if (method_exists($rendererStyle, 'setVerticalBorderChars')) { $rendererStyle->setVerticalBorderChars(''); } else { $rendererStyle->setVerticalBorderChar(''); } $rendererStyle->setCellRowContentFormat('%s '); $renderer->setRows($table)->render(); } } composer/src/Composer/Command/RunScriptCommand.php 0000644 00000012556 14736103146 0016306 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\Script\Event as ScriptEvent; use Composer\Script\ScriptEvents; use Composer\Util\ProcessExecutor; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Helper\Table; /** * @author Fabien Potencier <fabien.potencier@gmail.com> */ class RunScriptCommand extends BaseCommand { /** * @var array Array with command events */ protected $scriptEvents = array( ScriptEvents::PRE_INSTALL_CMD, ScriptEvents::POST_INSTALL_CMD, ScriptEvents::PRE_UPDATE_CMD, ScriptEvents::POST_UPDATE_CMD, ScriptEvents::PRE_STATUS_CMD, ScriptEvents::POST_STATUS_CMD, ScriptEvents::POST_ROOT_PACKAGE_INSTALL, ScriptEvents::POST_CREATE_PROJECT_CMD, ScriptEvents::PRE_ARCHIVE_CMD, ScriptEvents::POST_ARCHIVE_CMD, ScriptEvents::PRE_AUTOLOAD_DUMP, ScriptEvents::POST_AUTOLOAD_DUMP, ); protected function configure() { $this ->setName('run-script') ->setAliases(array('run')) ->setDescription('Runs the scripts defined in composer.json.') ->setDefinition(array( new InputArgument('script', InputArgument::OPTIONAL, 'Script name to run.'), new InputArgument('args', InputArgument::IS_ARRAY | InputArgument::OPTIONAL, ''), new InputOption('timeout', null, InputOption::VALUE_REQUIRED, 'Sets script timeout in seconds, or 0 for never.'), new InputOption('dev', null, InputOption::VALUE_NONE, 'Sets the dev mode.'), new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Disables the dev mode.'), new InputOption('list', 'l', InputOption::VALUE_NONE, 'List scripts.'), )) ->setHelp( <<<EOT The <info>run-script</info> command runs scripts defined in composer.json: <info>php composer.phar run-script post-update-cmd</info> Read more at https://getcomposer.org/doc/03-cli.md#run-script EOT ) ; } protected function execute(InputInterface $input, OutputInterface $output) { if ($input->getOption('list')) { return $this->listScripts($output); } elseif (!$input->getArgument('script')) { throw new \RuntimeException('Missing required argument "script"'); } $script = $input->getArgument('script'); if (!in_array($script, $this->scriptEvents)) { if (defined('Composer\Script\ScriptEvents::'.str_replace('-', '_', strtoupper($script)))) { throw new \InvalidArgumentException(sprintf('Script "%s" cannot be run with this command', $script)); } } $composer = $this->getComposer(); $devMode = $input->getOption('dev') || !$input->getOption('no-dev'); $event = new ScriptEvent($script, $composer, $this->getIO(), $devMode); $hasListeners = $composer->getEventDispatcher()->hasEventListeners($event); if (!$hasListeners) { throw new \InvalidArgumentException(sprintf('Script "%s" is not defined in this package', $script)); } $args = $input->getArgument('args'); if (null !== $timeout = $input->getOption('timeout')) { if (!ctype_digit($timeout)) { throw new \RuntimeException('Timeout value must be numeric and positive if defined, or 0 for forever'); } // Override global timeout set before in Composer by environment or config ProcessExecutor::setTimeout((int) $timeout); } return $composer->getEventDispatcher()->dispatchScript($script, $devMode, $args); } protected function listScripts(OutputInterface $output) { $scripts = $this->getComposer()->getPackage()->getScripts(); if (!count($scripts)) { return 0; } $io = $this->getIO(); $io->writeError('<info>scripts:</info>'); $table = array(); foreach ($scripts as $name => $script) { $description = ''; try { $cmd = $this->getApplication()->find($name); if ($cmd instanceof ScriptAliasCommand) { $description = $cmd->getDescription(); } } catch (\Symfony\Component\Console\Exception\CommandNotFoundException $e) { // ignore scripts that have no command associated, like native Composer script listeners } $table[] = array(' '.$name, $description); } $renderer = new Table($output); $renderer->setStyle('compact'); $rendererStyle = $renderer->getStyle(); if (method_exists($rendererStyle, 'setVerticalBorderChars')) { $rendererStyle->setVerticalBorderChars(''); } else { $rendererStyle->setVerticalBorderChar(''); } $rendererStyle->setCellRowContentFormat('%s '); $renderer->setRows($table)->render(); return 0; } } composer/src/Composer/Command/SearchCommand.php 0000644 00000005775 14736103146 0015567 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\Factory; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Composer\Repository\CompositeRepository; use Composer\Repository\PlatformRepository; use Composer\Repository\RepositoryInterface; use Composer\Plugin\CommandEvent; use Composer\Plugin\PluginEvents; /** * @author Robert Schönthal <seroscho@googlemail.com> */ class SearchCommand extends BaseCommand { protected $matches; protected $lowMatches = array(); protected $tokens; protected $output; protected $onlyName; protected function configure() { $this ->setName('search') ->setDescription('Searches for packages.') ->setDefinition(array( new InputOption('only-name', 'N', InputOption::VALUE_NONE, 'Search only in name'), new InputOption('type', 't', InputOption::VALUE_REQUIRED, 'Search for a specific package type'), new InputArgument('tokens', InputArgument::IS_ARRAY | InputArgument::REQUIRED, 'tokens to search for'), )) ->setHelp( <<<EOT The search command searches for packages by its name <info>php composer.phar search symfony composer</info> Read more at https://getcomposer.org/doc/03-cli.md#search EOT ) ; } protected function execute(InputInterface $input, OutputInterface $output) { // init repos $platformRepo = new PlatformRepository; $io = $this->getIO(); if (!($composer = $this->getComposer(false))) { $composer = Factory::create($this->getIO(), array(), $input->hasParameterOption('--no-plugins')); } $localRepo = $composer->getRepositoryManager()->getLocalRepository(); $installedRepo = new CompositeRepository(array($localRepo, $platformRepo)); $repos = new CompositeRepository(array_merge(array($installedRepo), $composer->getRepositoryManager()->getRepositories())); $commandEvent = new CommandEvent(PluginEvents::COMMAND, 'search', $input, $output); $composer->getEventDispatcher()->dispatch($commandEvent->getName(), $commandEvent); $onlyName = $input->getOption('only-name'); $type = $input->getOption('type') ?: null; $flags = $onlyName ? RepositoryInterface::SEARCH_NAME : RepositoryInterface::SEARCH_FULLTEXT; $results = $repos->search(implode(' ', $input->getArgument('tokens')), $flags, $type); foreach ($results as $result) { $io->write($result['name'] . (isset($result['description']) ? ' '. $result['description'] : '')); } return 0; } } composer/src/Composer/Command/RequireCommand.php 0000644 00000032530 14736103146 0015763 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Composer\Factory; use Composer\Installer; use Composer\Json\JsonFile; use Composer\Json\JsonManipulator; use Composer\Package\Version\VersionParser; use Composer\Plugin\CommandEvent; use Composer\Plugin\PluginEvents; use Composer\Repository\CompositeRepository; use Composer\Repository\PlatformRepository; use Composer\IO\IOInterface; use Composer\Util\Silencer; /** * @author Jérémy Romey <jeremy@free-agent.fr> * @author Jordi Boggiano <j.boggiano@seld.be> */ class RequireCommand extends InitCommand { private $newlyCreated; private $json; private $file; private $composerBackup; protected function configure() { $this ->setName('require') ->setDescription('Adds required packages to your composer.json and installs them.') ->setDefinition(array( new InputArgument('packages', InputArgument::IS_ARRAY | InputArgument::OPTIONAL, 'Optional package name can also include a version constraint, e.g. foo/bar or foo/bar:1.0.0 or foo/bar=1.0.0 or "foo/bar 1.0.0"'), new InputOption('dev', null, InputOption::VALUE_NONE, 'Add requirement to require-dev.'), new InputOption('prefer-source', null, InputOption::VALUE_NONE, 'Forces installation from package sources when possible, including VCS information.'), new InputOption('prefer-dist', null, InputOption::VALUE_NONE, 'Forces installation from package dist even for dev versions.'), new InputOption('fixed', null, InputOption::VALUE_NONE, 'Write fixed version to the composer.json.'), new InputOption('no-progress', null, InputOption::VALUE_NONE, 'Do not output download progress.'), new InputOption('no-suggest', null, InputOption::VALUE_NONE, 'Do not show package suggestions.'), new InputOption('no-update', null, InputOption::VALUE_NONE, 'Disables the automatic update of the dependencies.'), new InputOption('no-scripts', null, InputOption::VALUE_NONE, 'Skips the execution of all scripts defined in composer.json file.'), new InputOption('update-no-dev', null, InputOption::VALUE_NONE, 'Run the dependency update with the --no-dev option.'), new InputOption('update-with-dependencies', null, InputOption::VALUE_NONE, 'Allows inherited dependencies to be updated, except those that are root requirements.'), new InputOption('update-with-all-dependencies', null, InputOption::VALUE_NONE, 'Allows all inherited dependencies to be updated, including those that are root requirements.'), new InputOption('ignore-platform-reqs', null, InputOption::VALUE_NONE, 'Ignore platform requirements (php & ext- packages).'), new InputOption('prefer-stable', null, InputOption::VALUE_NONE, 'Prefer stable versions of dependencies.'), new InputOption('prefer-lowest', null, InputOption::VALUE_NONE, 'Prefer lowest versions of dependencies.'), new InputOption('sort-packages', null, InputOption::VALUE_NONE, 'Sorts packages when adding/updating a new dependency'), new InputOption('optimize-autoloader', 'o', InputOption::VALUE_NONE, 'Optimize autoloader during autoloader dump'), new InputOption('classmap-authoritative', 'a', InputOption::VALUE_NONE, 'Autoload classes from the classmap only. Implicitly enables `--optimize-autoloader`.'), new InputOption('apcu-autoloader', null, InputOption::VALUE_NONE, 'Use APCu to cache found/not-found classes.'), )) ->setHelp( <<<EOT The require command adds required packages to your composer.json and installs them. If you do not specify a package, composer will prompt you to search for a package, and given results, provide a list of matches to require. If you do not specify a version constraint, composer will choose a suitable one based on the available package versions. If you do not want to install the new dependencies immediately you can call it with --no-update Read more at https://getcomposer.org/doc/03-cli.md#require EOT ) ; } protected function execute(InputInterface $input, OutputInterface $output) { if (function_exists('pcntl_async_signals')) { pcntl_async_signals(true); pcntl_signal(SIGINT, array($this, 'revertComposerFile')); pcntl_signal(SIGTERM, array($this, 'revertComposerFile')); pcntl_signal(SIGHUP, array($this, 'revertComposerFile')); } $this->file = Factory::getComposerFile(); $io = $this->getIO(); $this->newlyCreated = !file_exists($this->file); if ($this->newlyCreated && !file_put_contents($this->file, "{\n}\n")) { $io->writeError('<error>'.$this->file.' could not be created.</error>'); return 1; } // check for readability by reading the file as is_readable can not be trusted on network-mounts // see https://github.com/composer/composer/issues/8231 and https://bugs.php.net/bug.php?id=68926 if (!is_readable($this->file) && false === Silencer::call('file_get_contents', $this->file)) { $io->writeError('<error>'.$this->file.' is not readable.</error>'); return 1; } if (filesize($this->file) === 0) { file_put_contents($this->file, "{\n}\n"); } $this->json = new JsonFile($this->file); $this->composerBackup = file_get_contents($this->json->getPath()); // check for writability by writing to the file as is_writable can not be trusted on network-mounts // see https://github.com/composer/composer/issues/8231 and https://bugs.php.net/bug.php?id=68926 if (!is_writable($this->file) && !Silencer::call('file_put_contents', $this->file, $this->composerBackup)) { $io->writeError('<error>'.$this->file.' is not writable.</error>'); return 1; } if ($input->getOption('fixed') === true) { $config = $this->json->read(); $packageType = empty($config['type']) ? 'library' : $config['type']; /** * @see https://github.com/composer/composer/pull/8313#issuecomment-532637955 */ if ($packageType !== 'project') { $io->writeError('<error>"--fixed" option is allowed for "project" package types only to prevent possible misuses.</error>'); if (empty($config['type'])) { $io->writeError('<error>If your package is not library, you should explicitly specify "type" parameter in composer.json.</error>'); } return 1; } } $composer = $this->getComposer(true, $input->getOption('no-plugins')); $repos = $composer->getRepositoryManager()->getRepositories(); $platformOverrides = $composer->getConfig()->get('platform') ?: array(); // initialize $this->repos as it is used by the parent InitCommand $this->repos = new CompositeRepository(array_merge( array(new PlatformRepository(array(), $platformOverrides)), $repos )); if ($composer->getPackage()->getPreferStable()) { $preferredStability = 'stable'; } else { $preferredStability = $composer->getPackage()->getMinimumStability(); } $phpVersion = $this->repos->findPackage('php', '*')->getPrettyVersion(); try { $requirements = $this->determineRequirements($input, $output, $input->getArgument('packages'), $phpVersion, $preferredStability, !$input->getOption('no-update'), $input->getOption('fixed')); } catch (\Exception $e) { if ($this->newlyCreated) { throw new \RuntimeException('No composer.json present in the current directory, this may be the cause of the following exception.', 0, $e); } throw $e; } $requireKey = $input->getOption('dev') ? 'require-dev' : 'require'; $removeKey = $input->getOption('dev') ? 'require' : 'require-dev'; $requirements = $this->formatRequirements($requirements); // validate requirements format $versionParser = new VersionParser(); foreach ($requirements as $package => $constraint) { if (strtolower($package) === $composer->getPackage()->getName()) { $io->writeError(sprintf('<error>Root package \'%s\' cannot require itself in its composer.json</error>', $package)); return 1; } $versionParser->parseConstraints($constraint); } $sortPackages = $input->getOption('sort-packages') || $composer->getConfig()->get('sort-packages'); if (!$this->updateFileCleanly($this->json, $requirements, $requireKey, $removeKey, $sortPackages)) { $composerDefinition = $this->json->read(); foreach ($requirements as $package => $version) { $composerDefinition[$requireKey][$package] = $version; unset($composerDefinition[$removeKey][$package]); } $this->json->write($composerDefinition); } $io->writeError('<info>'.$this->file.' has been '.($this->newlyCreated ? 'created' : 'updated').'</info>'); if ($input->getOption('no-update')) { return 0; } try { return $this->doUpdate($input, $output, $io, $requirements); } catch (\Exception $e) { $this->revertComposerFile(false); throw $e; } } private function doUpdate(InputInterface $input, OutputInterface $output, IOInterface $io, array $requirements) { // Update packages $this->resetComposer(); $composer = $this->getComposer(true, $input->getOption('no-plugins')); $composer->getDownloadManager()->setOutputProgress(!$input->getOption('no-progress')); $updateDevMode = !$input->getOption('update-no-dev'); $optimize = $input->getOption('optimize-autoloader') || $composer->getConfig()->get('optimize-autoloader'); $authoritative = $input->getOption('classmap-authoritative') || $composer->getConfig()->get('classmap-authoritative'); $apcu = $input->getOption('apcu-autoloader') || $composer->getConfig()->get('apcu-autoloader'); $commandEvent = new CommandEvent(PluginEvents::COMMAND, 'require', $input, $output); $composer->getEventDispatcher()->dispatch($commandEvent->getName(), $commandEvent); $install = Installer::create($io, $composer); $install ->setVerbose($input->getOption('verbose')) ->setPreferSource($input->getOption('prefer-source')) ->setPreferDist($input->getOption('prefer-dist')) ->setDevMode($updateDevMode) ->setRunScripts(!$input->getOption('no-scripts')) ->setSkipSuggest($input->getOption('no-suggest')) ->setOptimizeAutoloader($optimize) ->setClassMapAuthoritative($authoritative) ->setApcuAutoloader($apcu) ->setUpdate(true) ->setUpdateWhitelist(array_keys($requirements)) ->setWhitelistTransitiveDependencies($input->getOption('update-with-dependencies')) ->setWhitelistAllDependencies($input->getOption('update-with-all-dependencies')) ->setIgnorePlatformRequirements($input->getOption('ignore-platform-reqs')) ->setPreferStable($input->getOption('prefer-stable')) ->setPreferLowest($input->getOption('prefer-lowest')) ; $status = $install->run(); if ($status !== 0) { $this->revertComposerFile(false); } return $status; } private function updateFileCleanly($json, array $new, $requireKey, $removeKey, $sortPackages) { $contents = file_get_contents($json->getPath()); $manipulator = new JsonManipulator($contents); foreach ($new as $package => $constraint) { if (!$manipulator->addLink($requireKey, $package, $constraint, $sortPackages)) { return false; } if (!$manipulator->removeSubNode($removeKey, $package)) { return false; } } file_put_contents($json->getPath(), $manipulator->getContents()); return true; } protected function interact(InputInterface $input, OutputInterface $output) { return; } public function revertComposerFile($hardExit = true) { $io = $this->getIO(); if ($this->newlyCreated) { $io->writeError("\n".'<error>Installation failed, deleting '.$this->file.'.</error>'); unlink($this->json->getPath()); } else { $io->writeError("\n".'<error>Installation failed, reverting '.$this->file.' to its original content.</error>'); file_put_contents($this->json->getPath(), $this->composerBackup); } if ($hardExit) { exit(1); } } } composer/src/Composer/Command/BaseCommand.php 0000644 00000012305 14736103146 0015217 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\Composer; use Composer\Config; use Composer\Console\Application; use Composer\Factory; use Composer\IO\IOInterface; use Composer\IO\NullIO; use Composer\Plugin\PreCommandRunEvent; use Composer\Plugin\PluginEvents; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Command\Command; /** * Base class for Composer commands * * @author Ryan Weaver <ryan@knplabs.com> * @author Konstantin Kudryashov <ever.zet@gmail.com> */ abstract class BaseCommand extends Command { /** * @var Composer|null */ private $composer; /** * @var IOInterface */ private $io; /** * @param bool $required * @param bool|null $disablePlugins * @throws \RuntimeException * @return Composer */ public function getComposer($required = true, $disablePlugins = null) { if (null === $this->composer) { $application = $this->getApplication(); if ($application instanceof Application) { /* @var $application Application */ $this->composer = $application->getComposer($required, $disablePlugins); } elseif ($required) { throw new \RuntimeException( 'Could not create a Composer\Composer instance, you must inject '. 'one if this command is not used with a Composer\Console\Application instance' ); } } return $this->composer; } /** * @param Composer $composer */ public function setComposer(Composer $composer) { $this->composer = $composer; } /** * Removes the cached composer instance */ public function resetComposer() { $this->composer = null; $this->getApplication()->resetComposer(); } /** * Whether or not this command is meant to call another command. * * This is mainly needed to avoid duplicated warnings messages. * * @return bool */ public function isProxyCommand() { return false; } /** * @return IOInterface */ public function getIO() { if (null === $this->io) { $application = $this->getApplication(); if ($application instanceof Application) { /* @var $application Application */ $this->io = $application->getIO(); } else { $this->io = new NullIO(); } } return $this->io; } /** * @param IOInterface $io */ public function setIO(IOInterface $io) { $this->io = $io; } /** * {@inheritDoc} */ protected function initialize(InputInterface $input, OutputInterface $output) { // initialize a plugin-enabled Composer instance, either local or global $disablePlugins = $input->hasParameterOption('--no-plugins'); $composer = $this->getComposer(false, $disablePlugins); if (null === $composer) { $composer = Factory::createGlobal($this->getIO(), $disablePlugins); } if ($composer) { $preCommandRunEvent = new PreCommandRunEvent(PluginEvents::PRE_COMMAND_RUN, $input, $this->getName()); $composer->getEventDispatcher()->dispatch($preCommandRunEvent->getName(), $preCommandRunEvent); } if (true === $input->hasParameterOption(array('--no-ansi')) && $input->hasOption('no-progress')) { $input->setOption('no-progress', true); } parent::initialize($input, $output); } /** * Returns preferSource and preferDist values based on the configuration. * * @param Config $config * @param InputInterface $input * @param bool $keepVcsRequiresPreferSource * * @return bool[] An array composed of the preferSource and preferDist values */ protected function getPreferredInstallOptions(Config $config, InputInterface $input, $keepVcsRequiresPreferSource = false) { $preferSource = false; $preferDist = false; switch ($config->get('preferred-install')) { case 'source': $preferSource = true; break; case 'dist': $preferDist = true; break; case 'auto': default: // noop break; } if ($input->getOption('prefer-source') || $input->getOption('prefer-dist') || ($keepVcsRequiresPreferSource && $input->hasOption('keep-vcs') && $input->getOption('keep-vcs'))) { $preferSource = $input->getOption('prefer-source') || ($keepVcsRequiresPreferSource && $input->hasOption('keep-vcs') && $input->getOption('keep-vcs')); $preferDist = $input->getOption('prefer-dist'); } return array($preferSource, $preferDist); } } composer/src/Composer/Command/RemoveCommand.php 0000644 00000017614 14736103146 0015612 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\Config\JsonConfigSource; use Composer\Installer; use Composer\Plugin\CommandEvent; use Composer\Plugin\PluginEvents; use Composer\Json\JsonFile; use Composer\Factory; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Output\OutputInterface; use Composer\Package\BasePackage; /** * @author Pierre du Plessis <pdples@gmail.com> * @author Jordi Boggiano <j.boggiano@seld.be> */ class RemoveCommand extends BaseCommand { protected function configure() { $this ->setName('remove') ->setDescription('Removes a package from the require or require-dev.') ->setDefinition(array( new InputArgument('packages', InputArgument::IS_ARRAY | InputArgument::REQUIRED, 'Packages that should be removed.'), new InputOption('dev', null, InputOption::VALUE_NONE, 'Removes a package from the require-dev section.'), new InputOption('no-progress', null, InputOption::VALUE_NONE, 'Do not output download progress.'), new InputOption('no-update', null, InputOption::VALUE_NONE, 'Disables the automatic update of the dependencies.'), new InputOption('no-scripts', null, InputOption::VALUE_NONE, 'Skips the execution of all scripts defined in composer.json file.'), new InputOption('update-no-dev', null, InputOption::VALUE_NONE, 'Run the dependency update with the --no-dev option.'), new InputOption('update-with-dependencies', null, InputOption::VALUE_NONE, 'Allows inherited dependencies to be updated with explicit dependencies. (Deprecrated, is now default behavior)'), new InputOption('no-update-with-dependencies', null, InputOption::VALUE_NONE, 'Does not allow inherited dependencies to be updated with explicit dependencies.'), new InputOption('ignore-platform-reqs', null, InputOption::VALUE_NONE, 'Ignore platform requirements (php & ext- packages).'), new InputOption('optimize-autoloader', 'o', InputOption::VALUE_NONE, 'Optimize autoloader during autoloader dump'), new InputOption('classmap-authoritative', 'a', InputOption::VALUE_NONE, 'Autoload classes from the classmap only. Implicitly enables `--optimize-autoloader`.'), new InputOption('apcu-autoloader', null, InputOption::VALUE_NONE, 'Use APCu to cache found/not-found classes.'), )) ->setHelp( <<<EOT The <info>remove</info> command removes a package from the current list of installed packages <info>php composer.phar remove</info> Read more at https://getcomposer.org/doc/03-cli.md#remove EOT ) ; } protected function execute(InputInterface $input, OutputInterface $output) { $packages = $input->getArgument('packages'); $packages = array_map('strtolower', $packages); $file = Factory::getComposerFile(); $jsonFile = new JsonFile($file); $composer = $jsonFile->read(); $composerBackup = file_get_contents($jsonFile->getPath()); $json = new JsonConfigSource($jsonFile); $type = $input->getOption('dev') ? 'require-dev' : 'require'; $altType = !$input->getOption('dev') ? 'require-dev' : 'require'; $io = $this->getIO(); if ($input->getOption('update-with-dependencies')) { $io->writeError('<warning>You are using the deprecated option "update-with-dependencies". This is now default behaviour. The --no-update-with-dependencies option can be used to remove a package without its dependencies.</warning>'); } // make sure name checks are done case insensitively foreach (array('require', 'require-dev') as $linkType) { if (isset($composer[$linkType])) { foreach ($composer[$linkType] as $name => $version) { $composer[$linkType][strtolower($name)] = $name; } } } foreach ($packages as $package) { if (isset($composer[$type][$package])) { $json->removeLink($type, $composer[$type][$package]); } elseif (isset($composer[$altType][$package])) { $io->writeError('<warning>' . $composer[$altType][$package] . ' could not be found in ' . $type . ' but it is present in ' . $altType . '</warning>'); if ($io->isInteractive()) { if ($io->askConfirmation('Do you want to remove it from ' . $altType . ' [<comment>yes</comment>]? ', true)) { $json->removeLink($altType, $composer[$altType][$package]); } } } elseif (isset($composer[$type]) && $matches = preg_grep(BasePackage::packageNameToRegexp($package), array_keys($composer[$type]))) { foreach ($matches as $matchedPackage) { $json->removeLink($type, $matchedPackage); } } elseif (isset($composer[$altType]) && $matches = preg_grep(BasePackage::packageNameToRegexp($package), array_keys($composer[$altType]))) { foreach ($matches as $matchedPackage) { $io->writeError('<warning>' . $matchedPackage . ' could not be found in ' . $type . ' but it is present in ' . $altType . '</warning>'); if ($io->isInteractive()) { if ($io->askConfirmation('Do you want to remove it from ' . $altType . ' [<comment>yes</comment>]? ', true)) { $json->removeLink($altType, $matchedPackage); } } } } else { $io->writeError('<warning>'.$package.' is not required in your composer.json and has not been removed</warning>'); } } if ($input->getOption('no-update')) { return 0; } // Update packages $this->resetComposer(); $composer = $this->getComposer(true, $input->getOption('no-plugins')); $composer->getDownloadManager()->setOutputProgress(!$input->getOption('no-progress')); $commandEvent = new CommandEvent(PluginEvents::COMMAND, 'remove', $input, $output); $composer->getEventDispatcher()->dispatch($commandEvent->getName(), $commandEvent); $install = Installer::create($io, $composer); $updateDevMode = !$input->getOption('update-no-dev'); $optimize = $input->getOption('optimize-autoloader') || $composer->getConfig()->get('optimize-autoloader'); $authoritative = $input->getOption('classmap-authoritative') || $composer->getConfig()->get('classmap-authoritative'); $apcu = $input->getOption('apcu-autoloader') || $composer->getConfig()->get('apcu-autoloader'); $install ->setVerbose($input->getOption('verbose')) ->setDevMode($updateDevMode) ->setOptimizeAutoloader($optimize) ->setClassMapAuthoritative($authoritative) ->setApcuAutoloader($apcu) ->setUpdate(true) ->setUpdateWhitelist($packages) ->setWhitelistTransitiveDependencies(!$input->getOption('no-update-with-dependencies')) ->setIgnorePlatformRequirements($input->getOption('ignore-platform-reqs')) ->setRunScripts(!$input->getOption('no-scripts')) ; $status = $install->run(); if ($status !== 0) { $io->writeError("\n".'<error>Removal failed, reverting '.$file.' to its original content.</error>'); file_put_contents($jsonFile->getPath(), $composerBackup); } return $status; } } composer/src/Composer/Command/DependsCommand.php 0000644 00000002564 14736103146 0015735 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; /** * @author Niels Keurentjes <niels.keurentjes@omines.com> */ class DependsCommand extends BaseDependencyCommand { /** * Configure command metadata. */ protected function configure() { parent::configure(); $this ->setName('depends') ->setAliases(array('why')) ->setDescription('Shows which packages cause the given package to be installed.') ->setHelp( <<<EOT Displays detailed information about where a package is referenced. <info>php composer.phar depends composer/composer</info> Read more at https://getcomposer.org/doc/03-cli.md#depends-why- EOT ) ; } /** * Execute the function. * * @param InputInterface $input * @param OutputInterface $output * @return int */ protected function execute(InputInterface $input, OutputInterface $output) { return parent::doExecute($input, $output, false); } } composer/src/Composer/Command/DumpAutoloadCommand.php 0000644 00000007377 14736103146 0016760 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\Plugin\CommandEvent; use Composer\Plugin\PluginEvents; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; /** * @author Jordi Boggiano <j.boggiano@seld.be> */ class DumpAutoloadCommand extends BaseCommand { protected function configure() { $this ->setName('dump-autoload') ->setAliases(array('dumpautoload')) ->setDescription('Dumps the autoloader.') ->setDefinition(array( new InputOption('no-scripts', null, InputOption::VALUE_NONE, 'Skips the execution of all scripts defined in composer.json file.'), new InputOption('optimize', 'o', InputOption::VALUE_NONE, 'Optimizes PSR0 and PSR4 packages to be loaded with classmaps too, good for production.'), new InputOption('classmap-authoritative', 'a', InputOption::VALUE_NONE, 'Autoload classes from the classmap only. Implicitly enables `--optimize`.'), new InputOption('apcu', null, InputOption::VALUE_NONE, 'Use APCu to cache found/not-found classes.'), new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Disables autoload-dev rules.'), )) ->setHelp( <<<EOT <info>php composer.phar dump-autoload</info> Read more at https://getcomposer.org/doc/03-cli.md#dump-autoload-dumpautoload- EOT ) ; } protected function execute(InputInterface $input, OutputInterface $output) { $composer = $this->getComposer(); $commandEvent = new CommandEvent(PluginEvents::COMMAND, 'dump-autoload', $input, $output); $composer->getEventDispatcher()->dispatch($commandEvent->getName(), $commandEvent); $installationManager = $composer->getInstallationManager(); $localRepo = $composer->getRepositoryManager()->getLocalRepository(); $package = $composer->getPackage(); $config = $composer->getConfig(); $optimize = $input->getOption('optimize') || $config->get('optimize-autoloader'); $authoritative = $input->getOption('classmap-authoritative') || $config->get('classmap-authoritative'); $apcu = $input->getOption('apcu') || $config->get('apcu-autoloader'); if ($authoritative) { $this->getIO()->write('<info>Generating optimized autoload files (authoritative)</info>'); } elseif ($optimize) { $this->getIO()->write('<info>Generating optimized autoload files</info>'); } else { $this->getIO()->write('<info>Generating autoload files</info>'); } $generator = $composer->getAutoloadGenerator(); $generator->setDevMode(!$input->getOption('no-dev')); $generator->setClassMapAuthoritative($authoritative); $generator->setApcu($apcu); $generator->setRunScripts(!$input->getOption('no-scripts')); $numberOfClasses = $generator->dump($config, $localRepo, $package, $installationManager, 'composer', $optimize); if ($authoritative) { $this->getIO()->write('<info>Generated optimized autoload files (authoritative) containing '. $numberOfClasses .' classes</info>'); } elseif ($optimize) { $this->getIO()->write('<info>Generated optimized autoload files containing '. $numberOfClasses .' classes</info>'); } else { $this->getIO()->write('<info>Generated autoload files</info>'); } return 0; } } composer/src/Composer/Command/ClearCacheCommand.php 0000644 00000004157 14736103146 0016325 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\Cache; use Composer\Factory; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; /** * @author David Neilsen <petah.p@gmail.com> */ class ClearCacheCommand extends BaseCommand { protected function configure() { $this ->setName('clear-cache') ->setAliases(array('clearcache', 'cc')) ->setDescription('Clears composer\'s internal package cache.') ->setHelp( <<<EOT The <info>clear-cache</info> deletes all cached packages from composer's cache directory. Read more at https://getcomposer.org/doc/03-cli.md#clear-cache-clearcache-cc EOT ) ; } protected function execute(InputInterface $input, OutputInterface $output) { $config = Factory::createConfig(); $io = $this->getIO(); $cachePaths = array( 'cache-vcs-dir' => $config->get('cache-vcs-dir'), 'cache-repo-dir' => $config->get('cache-repo-dir'), 'cache-files-dir' => $config->get('cache-files-dir'), 'cache-dir' => $config->get('cache-dir'), ); foreach ($cachePaths as $key => $cachePath) { $cachePath = realpath($cachePath); if (!$cachePath) { $io->writeError("<info>Cache directory does not exist ($key): $cachePath</info>"); continue; } $cache = new Cache($io, $cachePath); if (!$cache->isEnabled()) { $io->writeError("<info>Cache is not enabled ($key): $cachePath</info>"); continue; } $io->writeError("<info>Clearing cache ($key): $cachePath</info>"); $cache->clear(); } $io->writeError('<info>All caches cleared.</info>'); return 0; } } composer/src/Composer/Command/ValidateCommand.php 0000644 00000016143 14736103146 0016102 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\Factory; use Composer\Package\Loader\ValidatingArrayLoader; use Composer\Plugin\CommandEvent; use Composer\Plugin\PluginEvents; use Composer\Util\ConfigValidator; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; /** * ValidateCommand * * @author Robert Schönthal <seroscho@googlemail.com> * @author Jordi Boggiano <j.boggiano@seld.be> */ class ValidateCommand extends BaseCommand { /** * configure */ protected function configure() { $this ->setName('validate') ->setDescription('Validates a composer.json and composer.lock.') ->setDefinition(array( new InputOption('no-check-all', null, InputOption::VALUE_NONE, 'Do not validate requires for overly strict/loose constraints'), new InputOption('no-check-lock', null, InputOption::VALUE_NONE, 'Do not check if lock file is up to date'), new InputOption('no-check-publish', null, InputOption::VALUE_NONE, 'Do not check for publish errors'), new InputOption('with-dependencies', 'A', InputOption::VALUE_NONE, 'Also validate the composer.json of all installed dependencies'), new InputOption('strict', null, InputOption::VALUE_NONE, 'Return a non-zero exit code for warnings as well as errors'), new InputArgument('file', InputArgument::OPTIONAL, 'path to composer.json file'), )) ->setHelp( <<<EOT The validate command validates a given composer.json and composer.lock Exit codes in case of errors are: 1 validation warning(s), only when --strict is given 2 validation error(s) 3 file unreadable or missing Read more at https://getcomposer.org/doc/03-cli.md#validate EOT ); } /** * @param InputInterface $input * @param OutputInterface $output * * @return int */ protected function execute(InputInterface $input, OutputInterface $output) { $file = $input->getArgument('file') ?: Factory::getComposerFile(); $io = $this->getIO(); if (!file_exists($file)) { $io->writeError('<error>' . $file . ' not found.</error>'); return 3; } if (!is_readable($file)) { $io->writeError('<error>' . $file . ' is not readable.</error>'); return 3; } $validator = new ConfigValidator($io); $checkAll = $input->getOption('no-check-all') ? 0 : ValidatingArrayLoader::CHECK_ALL; $checkPublish = !$input->getOption('no-check-publish'); $checkLock = !$input->getOption('no-check-lock'); $isStrict = $input->getOption('strict'); list($errors, $publishErrors, $warnings) = $validator->validate($file, $checkAll); $lockErrors = array(); $composer = Factory::create($io, $file, $input->hasParameterOption('--no-plugins')); $locker = $composer->getLocker(); if ($locker->isLocked() && !$locker->isFresh()) { $lockErrors[] = 'The lock file is not up to date with the latest changes in composer.json, it is recommended that you run `composer update` or `composer update <package name>`.'; } $this->outputResult($io, $file, $errors, $warnings, $checkPublish, $publishErrors, $checkLock, $lockErrors, true); // $errors include publish and lock errors when exists $exitCode = $errors ? 2 : ($isStrict && $warnings ? 1 : 0); if ($input->getOption('with-dependencies')) { $localRepo = $composer->getRepositoryManager()->getLocalRepository(); foreach ($localRepo->getPackages() as $package) { $path = $composer->getInstallationManager()->getInstallPath($package); $file = $path . '/composer.json'; if (is_dir($path) && file_exists($file)) { list($errors, $publishErrors, $warnings) = $validator->validate($file, $checkAll); $this->outputResult($io, $package->getPrettyName(), $errors, $warnings, $checkPublish, $publishErrors); // $errors include publish errors when exists $depCode = $errors ? 2 : ($isStrict && $warnings ? 1 : 0); $exitCode = max($depCode, $exitCode); } } } $commandEvent = new CommandEvent(PluginEvents::COMMAND, 'validate', $input, $output); $eventCode = $composer->getEventDispatcher()->dispatch($commandEvent->getName(), $commandEvent); $exitCode = max($eventCode, $exitCode); return $exitCode; } private function outputResult($io, $name, &$errors, &$warnings, $checkPublish = false, $publishErrors = array(), $checkLock = false, $lockErrors = array(), $printSchemaUrl = false) { $doPrintSchemaUrl = false; if ($errors) { $io->writeError('<error>' . $name . ' is invalid, the following errors/warnings were found:</error>'); } elseif ($publishErrors) { $io->writeError('<info>' . $name . ' is valid for simple usage with composer but has</info>'); $io->writeError('<info>strict errors that make it unable to be published as a package:</info>'); $doPrintSchemaUrl = $printSchemaUrl; } elseif ($warnings) { $io->writeError('<info>' . $name . ' is valid, but with a few warnings</info>'); $doPrintSchemaUrl = $printSchemaUrl; } else { $io->write('<info>' . $name . ' is valid</info>'); // if ($lockErrors) then they will be displayed below } if ($doPrintSchemaUrl) { $io->writeError('<warning>See https://getcomposer.org/doc/04-schema.md for details on the schema</warning>'); } // Avoid setting the exit code to 1 in case --strict and --no-check-publish/--no-check-lock are combined $extraWarnings = array(); // If checking publish errors, display them as errors, otherwise just show them as warnings if ($checkPublish) { $errors = array_merge($errors, $publishErrors); } else { $extraWarnings = array_merge($extraWarnings, $publishErrors); } // If checking lock errors, display them as errors, otherwise just show them as warnings if ($checkLock) { $errors = array_merge($errors, $lockErrors); } else { $extraWarnings = array_merge($extraWarnings, $lockErrors); } $messages = array( 'error' => $errors, 'warning' => array_merge($warnings, $extraWarnings), ); foreach ($messages as $style => $msgs) { foreach ($msgs as $msg) { $io->writeError('<' . $style . '>' . $msg . '</' . $style . '>'); } } } } composer/src/Composer/Command/CreateProjectCommand.php 0000644 00000046175 14736103146 0017113 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Command; use Composer\Config; use Composer\Factory; use Composer\Installer; use Composer\Installer\ProjectInstaller; use Composer\Installer\InstallationManager; use Composer\Installer\SuggestedPackagesReporter; use Composer\IO\IOInterface; use Composer\Package\BasePackage; use Composer\DependencyResolver\Pool; use Composer\DependencyResolver\Operation\InstallOperation; use Composer\Package\Version\VersionSelector; use Composer\Package\AliasPackage; use Composer\Repository\RepositoryFactory; use Composer\Repository\CompositeRepository; use Composer\Repository\PlatformRepository; use Composer\Repository\InstalledFilesystemRepository; use Composer\Script\ScriptEvents; use Composer\Util\Silencer; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Finder\Finder; use Composer\Json\JsonFile; use Composer\Config\JsonConfigSource; use Composer\Util\Filesystem; use Composer\Package\Version\VersionParser; /** * Install a package as new project into new directory. * * @author Benjamin Eberlei <kontakt@beberlei.de> * @author Jordi Boggiano <j.boggiano@seld.be> * @author Tobias Munk <schmunk@usrbin.de> * @author Nils Adermann <naderman@naderman.de> */ class CreateProjectCommand extends BaseCommand { /** * @var SuggestedPackagesReporter */ protected $suggestedPackagesReporter; protected function configure() { $this ->setName('create-project') ->setDescription('Creates new project from a package into given directory.') ->setDefinition(array( new InputArgument('package', InputArgument::OPTIONAL, 'Package name to be installed'), new InputArgument('directory', InputArgument::OPTIONAL, 'Directory where the files should be created'), new InputArgument('version', InputArgument::OPTIONAL, 'Version, will default to latest'), new InputOption('stability', 's', InputOption::VALUE_REQUIRED, 'Minimum-stability allowed (unless a version is specified).'), new InputOption('prefer-source', null, InputOption::VALUE_NONE, 'Forces installation from package sources when possible, including VCS information.'), new InputOption('prefer-dist', null, InputOption::VALUE_NONE, 'Forces installation from package dist even for dev versions.'), new InputOption('repository', null, InputOption::VALUE_REQUIRED, 'Pick a different repository (as url or json config) to look for the package.'), new InputOption('repository-url', null, InputOption::VALUE_REQUIRED, 'DEPRECATED: Use --repository instead.'), new InputOption('add-repository', null, InputOption::VALUE_NONE, 'Add the repository option to the composer.json.'), new InputOption('dev', null, InputOption::VALUE_NONE, 'Enables installation of require-dev packages (enabled by default, only present for BC).'), new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Disables installation of require-dev packages.'), new InputOption('no-custom-installers', null, InputOption::VALUE_NONE, 'DEPRECATED: Use no-plugins instead.'), new InputOption('no-scripts', null, InputOption::VALUE_NONE, 'Whether to prevent execution of all defined scripts in the root package.'), new InputOption('no-progress', null, InputOption::VALUE_NONE, 'Do not output download progress.'), new InputOption('no-secure-http', null, InputOption::VALUE_NONE, 'Disable the secure-http config option temporarily while installing the root package. Use at your own risk. Using this flag is a bad idea.'), new InputOption('keep-vcs', null, InputOption::VALUE_NONE, 'Whether to prevent deleting the vcs folder.'), new InputOption('remove-vcs', null, InputOption::VALUE_NONE, 'Whether to force deletion of the vcs folder without prompting.'), new InputOption('no-install', null, InputOption::VALUE_NONE, 'Whether to skip installation of the package dependencies.'), new InputOption('ignore-platform-reqs', null, InputOption::VALUE_NONE, 'Ignore platform requirements (php & ext- packages).'), )) ->setHelp( <<<EOT The <info>create-project</info> command creates a new project from a given package into a new directory. If executed without params and in a directory with a composer.json file it installs the packages for the current project. You can use this command to bootstrap new projects or setup a clean version-controlled installation for developers of your project. <info>php composer.phar create-project vendor/project target-directory [version]</info> You can also specify the version with the package name using = or : as separator. <info>php composer.phar create-project vendor/project:version target-directory</info> To install unstable packages, either specify the version you want, or use the --stability=dev (where dev can be one of RC, beta, alpha or dev). To setup a developer workable version you should create the project using the source controlled code by appending the <info>'--prefer-source'</info> flag. To install a package from another repository than the default one you can pass the <info>'--repository=https://myrepository.org'</info> flag. Read more at https://getcomposer.org/doc/03-cli.md#create-project EOT ) ; } protected function execute(InputInterface $input, OutputInterface $output) { $config = Factory::createConfig(); $io = $this->getIO(); list($preferSource, $preferDist) = $this->getPreferredInstallOptions($config, $input, true); if ($input->getOption('dev')) { $io->writeError('<warning>You are using the deprecated option "dev". Dev packages are installed by default now.</warning>'); } if ($input->getOption('no-custom-installers')) { $io->writeError('<warning>You are using the deprecated option "no-custom-installers". Use "no-plugins" instead.</warning>'); $input->setOption('no-plugins', true); } return $this->installProject( $io, $config, $input, $input->getArgument('package'), $input->getArgument('directory'), $input->getArgument('version'), $input->getOption('stability'), $preferSource, $preferDist, !$input->getOption('no-dev'), $input->getOption('repository') ?: $input->getOption('repository-url'), $input->getOption('no-plugins'), $input->getOption('no-scripts'), $input->getOption('no-progress'), $input->getOption('no-install'), $input->getOption('ignore-platform-reqs'), !$input->getOption('no-secure-http'), $input->getOption('add-repository') ); } public function installProject(IOInterface $io, Config $config, InputInterface $input, $packageName, $directory = null, $packageVersion = null, $stability = 'stable', $preferSource = false, $preferDist = false, $installDevPackages = false, $repository = null, $disablePlugins = false, $noScripts = false, $noProgress = false, $noInstall = false, $ignorePlatformReqs = false, $secureHttp = true, $addRepository = false) { $oldCwd = getcwd(); // we need to manually load the configuration to pass the auth credentials to the io interface! $io->loadConfiguration($config); $this->suggestedPackagesReporter = new SuggestedPackagesReporter($io); if ($packageName !== null) { $installedFromVcs = $this->installRootPackage($io, $config, $packageName, $directory, $packageVersion, $stability, $preferSource, $preferDist, $installDevPackages, $repository, $disablePlugins, $noScripts, $noProgress, $ignorePlatformReqs, $secureHttp); } else { $installedFromVcs = false; } $composer = Factory::create($io, null, $disablePlugins); // add the repository to the composer.json and use it for the install run later if ($repository !== null && $addRepository) { if ($composer->getLocker()->isLocked()) { $io->writeError('<error>Adding a repository when creating a project that provides a composer.lock file is not supported</error>'); return false; } $repoConfig = RepositoryFactory::configFromString($io, $composer->getConfig(), $repository, true); $composerJsonRepositoriesConfig = $composer->getConfig()->getRepositories(); $name = RepositoryFactory::generateRepositoryName(0, $repoConfig, $composerJsonRepositoriesConfig); $configSource = new JsonConfigSource(new JsonFile('composer.json')); $configSource->addRepository($name, $repoConfig); $composer = Factory::create($io, null, $disablePlugins); } $composer->getDownloadManager()->setOutputProgress(!$noProgress); $fs = new Filesystem(); if ($noScripts === false) { // dispatch event $composer->getEventDispatcher()->dispatchScript(ScriptEvents::POST_ROOT_PACKAGE_INSTALL, $installDevPackages); } // use the new config including the newly installed project $config = $composer->getConfig(); list($preferSource, $preferDist) = $this->getPreferredInstallOptions($config, $input); // install dependencies of the created project if ($noInstall === false) { $installer = Installer::create($io, $composer); $installer->setPreferSource($preferSource) ->setPreferDist($preferDist) ->setDevMode($installDevPackages) ->setRunScripts(!$noScripts) ->setIgnorePlatformRequirements($ignorePlatformReqs) ->setSuggestedPackagesReporter($this->suggestedPackagesReporter) ->setOptimizeAutoloader($config->get('optimize-autoloader')) ->setClassMapAuthoritative($config->get('classmap-authoritative')) ->setApcuAutoloader($config->get('apcu-autoloader')); if ($disablePlugins) { $installer->disablePlugins(); } $status = $installer->run(); if (0 !== $status) { return $status; } } $hasVcs = $installedFromVcs; if ( !$input->getOption('keep-vcs') && $installedFromVcs && ( $input->getOption('remove-vcs') || !$io->isInteractive() || $io->askConfirmation('<info>Do you want to remove the existing VCS (.git, .svn..) history?</info> [<comment>Y,n</comment>]? ', true) ) ) { $finder = new Finder(); $finder->depth(0)->directories()->in(getcwd())->ignoreVCS(false)->ignoreDotFiles(false); foreach (array('.svn', '_svn', 'CVS', '_darcs', '.arch-params', '.monotone', '.bzr', '.git', '.hg', '.fslckout', '_FOSSIL_') as $vcsName) { $finder->name($vcsName); } try { $dirs = iterator_to_array($finder); unset($finder); foreach ($dirs as $dir) { if (!$fs->removeDirectory($dir)) { throw new \RuntimeException('Could not remove '.$dir); } } } catch (\Exception $e) { $io->writeError('<error>An error occurred while removing the VCS metadata: '.$e->getMessage().'</error>'); } $hasVcs = false; } // rewriting self.version dependencies with explicit version numbers if the package's vcs metadata is gone if (!$hasVcs) { $package = $composer->getPackage(); $configSource = new JsonConfigSource(new JsonFile('composer.json')); foreach (BasePackage::$supportedLinkTypes as $type => $meta) { foreach ($package->{'get'.$meta['method']}() as $link) { if ($link->getPrettyConstraint() === 'self.version') { $configSource->addLink($type, $link->getTarget(), $package->getPrettyVersion()); } } } } if ($noScripts === false) { // dispatch event $composer->getEventDispatcher()->dispatchScript(ScriptEvents::POST_CREATE_PROJECT_CMD, $installDevPackages); } chdir($oldCwd); $vendorComposerDir = $config->get('vendor-dir').'/composer'; if (is_dir($vendorComposerDir) && $fs->isDirEmpty($vendorComposerDir)) { Silencer::call('rmdir', $vendorComposerDir); $vendorDir = $config->get('vendor-dir'); if (is_dir($vendorDir) && $fs->isDirEmpty($vendorDir)) { Silencer::call('rmdir', $vendorDir); } } return 0; } protected function installRootPackage(IOInterface $io, Config $config, $packageName, $directory = null, $packageVersion = null, $stability = 'stable', $preferSource = false, $preferDist = false, $installDevPackages = false, $repository = null, $disablePlugins = false, $noScripts = false, $noProgress = false, $ignorePlatformReqs = false, $secureHttp = true) { if (!$secureHttp) { $config->merge(array('config' => array('secure-http' => false))); } if (null === $repository) { $sourceRepo = new CompositeRepository(RepositoryFactory::defaultRepos($io, $config)); } else { $sourceRepo = RepositoryFactory::fromString($io, $config, $repository, true); } $parser = new VersionParser(); $requirements = $parser->parseNameVersionPairs(array($packageName)); $name = strtolower($requirements[0]['name']); if (!$packageVersion && isset($requirements[0]['version'])) { $packageVersion = $requirements[0]['version']; } // if no directory was specified, use the 2nd part of the package name if (null === $directory) { $parts = explode("/", $name, 2); $directory = getcwd() . DIRECTORY_SEPARATOR . array_pop($parts); } $fs = new Filesystem(); if (!$fs->isAbsolutePath($directory)) { $directory = getcwd() . DIRECTORY_SEPARATOR . $directory; } $io->writeError('<info>Creating a "' . $packageName . '" project at "' . $fs->findShortestPath(getcwd(), $directory, true) . '"</info>'); if (file_exists($directory)) { if (!is_dir($directory)) { throw new \InvalidArgumentException('Cannot create project directory at "'.$directory.'", it exists as a file.'); } elseif (!$fs->isDirEmpty($directory)) { throw new \InvalidArgumentException('Project directory "'.$directory.'" is not empty.'); } } if (null === $stability) { if (preg_match('{^[^,\s]*?@('.implode('|', array_keys(BasePackage::$stabilities)).')$}i', $packageVersion, $match)) { $stability = $match[1]; } else { $stability = VersionParser::parseStability($packageVersion); } } $stability = VersionParser::normalizeStability($stability); if (!isset(BasePackage::$stabilities[$stability])) { throw new \InvalidArgumentException('Invalid stability provided ('.$stability.'), must be one of: '.implode(', ', array_keys(BasePackage::$stabilities))); } $pool = new Pool($stability); $pool->addRepository($sourceRepo); $phpVersion = null; $prettyPhpVersion = null; if (!$ignorePlatformReqs) { $platformOverrides = $config->get('platform') ?: array(); // initialize $this->repos as it is used by the parent InitCommand $platform = new PlatformRepository(array(), $platformOverrides); $phpPackage = $platform->findPackage('php', '*'); $phpVersion = $phpPackage->getVersion(); $prettyPhpVersion = $phpPackage->getPrettyVersion(); } // find the latest version if there are multiple $versionSelector = new VersionSelector($pool); $package = $versionSelector->findBestCandidate($name, $packageVersion, $phpVersion, $stability); if (!$package) { $errorMessage = "Could not find package $name with " . ($packageVersion ? "version $packageVersion" : "stability $stability"); if ($phpVersion && $versionSelector->findBestCandidate($name, $packageVersion, null, $stability)) { throw new \InvalidArgumentException($errorMessage .' in a version installable using your PHP version '.$prettyPhpVersion.'.'); } throw new \InvalidArgumentException($errorMessage .'.'); } // handler Ctrl+C for unix-like systems if (function_exists('pcntl_async_signals')) { @mkdir($directory, 0777, true); if ($realDir = realpath($directory)) { pcntl_async_signals(true); pcntl_signal(SIGINT, function () use ($realDir) { $fs = new Filesystem(); $fs->removeDirectory($realDir); exit(130); }); } } $io->writeError('<info>Installing ' . $package->getName() . ' (' . $package->getFullPrettyVersion(false) . ')</info>'); if ($disablePlugins) { $io->writeError('<info>Plugins have been disabled.</info>'); } if ($package instanceof AliasPackage) { $package = $package->getAliasOf(); } $dm = $this->createDownloadManager($io, $config); $dm->setPreferSource($preferSource) ->setPreferDist($preferDist) ->setOutputProgress(!$noProgress); $projectInstaller = new ProjectInstaller($directory, $dm); $im = $this->createInstallationManager(); $im->addInstaller($projectInstaller); $im->install(new InstalledFilesystemRepository(new JsonFile('php://memory')), new InstallOperation($package)); $im->notifyInstalls($io); // collect suggestions $this->suggestedPackagesReporter->addSuggestionsFromPackage($package); $installedFromVcs = 'source' === $package->getInstallationSource(); $io->writeError('<info>Created project in ' . $directory . '</info>'); chdir($directory); $_SERVER['COMPOSER_ROOT_VERSION'] = $package->getPrettyVersion(); putenv('COMPOSER_ROOT_VERSION='.$_SERVER['COMPOSER_ROOT_VERSION']); return $installedFromVcs; } protected function createDownloadManager(IOInterface $io, Config $config) { $factory = new Factory(); return $factory->createDownloadManager($io, $config); } protected function createInstallationManager() { return new InstallationManager(); } } composer/src/Composer/Downloader/RarDownloader.php 0000644 00000005446 14736103146 0016341 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Downloader; use Composer\Config; use Composer\Cache; use Composer\EventDispatcher\EventDispatcher; use Composer\Util\IniHelper; use Composer\Util\Platform; use Composer\Util\ProcessExecutor; use Composer\Util\RemoteFilesystem; use Composer\IO\IOInterface; use RarArchive; /** * RAR archive downloader. * * Based on previous work by Jordi Boggiano ({@see ZipDownloader}). * * @author Derrick Nelson <drrcknlsn@gmail.com> */ class RarDownloader extends ArchiveDownloader { protected $process; public function __construct(IOInterface $io, Config $config, EventDispatcher $eventDispatcher = null, Cache $cache = null, ProcessExecutor $process = null, RemoteFilesystem $rfs = null) { $this->process = $process ?: new ProcessExecutor($io); parent::__construct($io, $config, $eventDispatcher, $cache, $rfs); } protected function extract($file, $path) { $processError = null; // Try to use unrar on *nix if (!Platform::isWindows()) { $command = 'unrar x ' . ProcessExecutor::escape($file) . ' ' . ProcessExecutor::escape($path) . ' >/dev/null && chmod -R u+w ' . ProcessExecutor::escape($path); if (0 === $this->process->execute($command, $ignoredOutput)) { return; } $processError = 'Failed to execute ' . $command . "\n\n" . $this->process->getErrorOutput(); } if (!class_exists('RarArchive')) { // php.ini path is added to the error message to help users find the correct file $iniMessage = IniHelper::getMessage(); $error = "Could not decompress the archive, enable the PHP rar extension or install unrar.\n" . $iniMessage . "\n" . $processError; if (!Platform::isWindows()) { $error = "Could not decompress the archive, enable the PHP rar extension.\n" . $iniMessage; } throw new \RuntimeException($error); } $rarArchive = RarArchive::open($file); if (false === $rarArchive) { throw new \UnexpectedValueException('Could not open RAR archive: ' . $file); } $entries = $rarArchive->getEntries(); if (false === $entries) { throw new \RuntimeException('Could not retrieve RAR archive entries'); } foreach ($entries as $entry) { if (false === $entry->extract($path)) { throw new \RuntimeException('Could not extract entry'); } } $rarArchive->close(); } } composer/src/Composer/Downloader/FilesystemException.php 0000644 00000001240 14736103146 0017565 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Downloader; /** * Exception thrown when issues exist on local filesystem * * @author Javier Spagnoletti <jspagnoletti@javierspagnoletti.com.ar> */ class FilesystemException extends \Exception { public function __construct($message = '', $code = 0, \Exception $previous = null) { parent::__construct("Filesystem exception: \n".$message, $code, $previous); } } composer/src/Composer/Downloader/ChangeReportInterface.php 0000644 00000001376 14736103146 0017776 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Downloader; use Composer\Package\PackageInterface; /** * ChangeReport interface. * * @author Sascha Egerer <sascha.egerer@dkd.de> */ interface ChangeReportInterface { /** * Checks for changes to the local copy * * @param PackageInterface $package package instance * @param string $path package directory * @return string|null changes or null */ public function getLocalChanges(PackageInterface $package, $path); } composer/src/Composer/Downloader/DownloadManager.php 0000644 00000024530 14736103146 0016633 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Downloader; use Composer\Package\PackageInterface; use Composer\IO\IOInterface; use Composer\Util\Filesystem; /** * Downloaders manager. * * @author Konstantin Kudryashov <ever.zet@gmail.com> */ class DownloadManager { private $io; private $preferDist = false; private $preferSource = false; private $packagePreferences = array(); private $filesystem; private $downloaders = array(); /** * Initializes download manager. * * @param IOInterface $io The Input Output Interface * @param bool $preferSource prefer downloading from source * @param Filesystem|null $filesystem custom Filesystem object */ public function __construct(IOInterface $io, $preferSource = false, Filesystem $filesystem = null) { $this->io = $io; $this->preferSource = $preferSource; $this->filesystem = $filesystem ?: new Filesystem(); } /** * Makes downloader prefer source installation over the dist. * * @param bool $preferSource prefer downloading from source * @return DownloadManager */ public function setPreferSource($preferSource) { $this->preferSource = $preferSource; return $this; } /** * Makes downloader prefer dist installation over the source. * * @param bool $preferDist prefer downloading from dist * @return DownloadManager */ public function setPreferDist($preferDist) { $this->preferDist = $preferDist; return $this; } /** * Sets fine tuned preference settings for package level source/dist selection. * * @param array $preferences array of preferences by package patterns * @return DownloadManager */ public function setPreferences(array $preferences) { $this->packagePreferences = $preferences; return $this; } /** * Sets whether to output download progress information for all registered * downloaders * * @param bool $outputProgress * @return DownloadManager */ public function setOutputProgress($outputProgress) { foreach ($this->downloaders as $downloader) { $downloader->setOutputProgress($outputProgress); } return $this; } /** * Sets installer downloader for a specific installation type. * * @param string $type installation type * @param DownloaderInterface $downloader downloader instance * @return DownloadManager */ public function setDownloader($type, DownloaderInterface $downloader) { $type = strtolower($type); $this->downloaders[$type] = $downloader; return $this; } /** * Returns downloader for a specific installation type. * * @param string $type installation type * @throws \InvalidArgumentException if downloader for provided type is not registered * @return DownloaderInterface */ public function getDownloader($type) { $type = strtolower($type); if (!isset($this->downloaders[$type])) { throw new \InvalidArgumentException(sprintf('Unknown downloader type: %s. Available types: %s.', $type, implode(', ', array_keys($this->downloaders)))); } return $this->downloaders[$type]; } /** * Returns downloader for already installed package. * * @param PackageInterface $package package instance * @throws \InvalidArgumentException if package has no installation source specified * @throws \LogicException if specific downloader used to load package with * wrong type * @return DownloaderInterface|null */ public function getDownloaderForInstalledPackage(PackageInterface $package) { $installationSource = $package->getInstallationSource(); if ('metapackage' === $package->getType()) { return; } if ('dist' === $installationSource) { $downloader = $this->getDownloader($package->getDistType()); } elseif ('source' === $installationSource) { $downloader = $this->getDownloader($package->getSourceType()); } else { throw new \InvalidArgumentException( 'Package '.$package.' seems not been installed properly' ); } if ($installationSource !== $downloader->getInstallationSource()) { throw new \LogicException(sprintf( 'Downloader "%s" is a %s type downloader and can not be used to download %s for package %s', get_class($downloader), $downloader->getInstallationSource(), $installationSource, $package )); } return $downloader; } /** * Downloads package into target dir. * * @param PackageInterface $package package instance * @param string $targetDir target dir * @param bool $preferSource prefer installation from source * * @throws \InvalidArgumentException if package have no urls to download from * @throws \RuntimeException */ public function download(PackageInterface $package, $targetDir, $preferSource = null) { $preferSource = null !== $preferSource ? $preferSource : $this->preferSource; $sourceType = $package->getSourceType(); $distType = $package->getDistType(); $sources = array(); if ($sourceType) { $sources[] = 'source'; } if ($distType) { $sources[] = 'dist'; } if (empty($sources)) { throw new \InvalidArgumentException('Package '.$package.' must have a source or dist specified'); } if (!$preferSource && ($this->preferDist || 'dist' === $this->resolvePackageInstallPreference($package))) { $sources = array_reverse($sources); } $this->filesystem->ensureDirectoryExists($targetDir); foreach ($sources as $i => $source) { if (isset($e)) { $this->io->writeError(' <warning>Now trying to download from ' . $source . '</warning>'); } $package->setInstallationSource($source); try { $downloader = $this->getDownloaderForInstalledPackage($package); if ($downloader) { $downloader->download($package, $targetDir); } break; } catch (\RuntimeException $e) { if ($i === count($sources) - 1) { throw $e; } $this->io->writeError( ' <warning>Failed to download '. $package->getPrettyName(). ' from ' . $source . ': '. $e->getMessage().'</warning>' ); } } } /** * Updates package from initial to target version. * * @param PackageInterface $initial initial package version * @param PackageInterface $target target package version * @param string $targetDir target dir * * @throws \InvalidArgumentException if initial package is not installed */ public function update(PackageInterface $initial, PackageInterface $target, $targetDir) { $downloader = $this->getDownloaderForInstalledPackage($initial); if (!$downloader) { return; } $installationSource = $initial->getInstallationSource(); if ('dist' === $installationSource) { $initialType = $initial->getDistType(); $targetType = $target->getDistType(); } else { $initialType = $initial->getSourceType(); $targetType = $target->getSourceType(); } // upgrading from a dist stable package to a dev package, force source reinstall if ($target->isDev() && 'dist' === $installationSource) { $downloader->remove($initial, $targetDir); $this->download($target, $targetDir); return; } if ($initialType === $targetType) { $target->setInstallationSource($installationSource); try { $downloader->update($initial, $target, $targetDir); return; } catch (\RuntimeException $e) { if (!$this->io->isInteractive()) { throw $e; } $this->io->writeError('<error> Update failed ('.$e->getMessage().')</error>'); if (!$this->io->askConfirmation(' Would you like to try reinstalling the package instead [<comment>yes</comment>]? ', true)) { throw $e; } } } $downloader->remove($initial, $targetDir); $this->download($target, $targetDir, 'source' === $installationSource); } /** * Removes package from target dir. * * @param PackageInterface $package package instance * @param string $targetDir target dir */ public function remove(PackageInterface $package, $targetDir) { $downloader = $this->getDownloaderForInstalledPackage($package); if ($downloader) { $downloader->remove($package, $targetDir); } } /** * Determines the install preference of a package * * @param PackageInterface $package package instance * * @return string */ protected function resolvePackageInstallPreference(PackageInterface $package) { foreach ($this->packagePreferences as $pattern => $preference) { $pattern = '{^'.str_replace('\\*', '.*', preg_quote($pattern)).'$}i'; if (preg_match($pattern, $package->getName())) { if ('dist' === $preference || (!$package->isDev() && 'auto' === $preference)) { return 'dist'; } return 'source'; } } return $package->isDev() ? 'source' : 'dist'; } } composer/src/Composer/Downloader/VcsCapableDownloaderInterface.php 0000644 00000001433 14736103146 0021431 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Downloader; use Composer\Package\PackageInterface; /** * VCS Capable Downloader interface. * * @author Steve Buzonas <steve@fancyguy.com> */ interface VcsCapableDownloaderInterface { /** * Gets the VCS Reference for the package at path * * @param PackageInterface $package package directory * @param string $path package directory * @return string|null reference or null */ public function getVcsReference(PackageInterface $package, $path); } composer/src/Composer/Downloader/SvnDownloader.php 0000644 00000017302 14736103146 0016355 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Downloader; use Composer\Package\PackageInterface; use Composer\Util\Svn as SvnUtil; use Composer\Repository\VcsRepository; use Composer\Util\ProcessExecutor; /** * @author Ben Bieker <mail@ben-bieker.de> * @author Till Klampaeckel <till@php.net> */ class SvnDownloader extends VcsDownloader { protected $cacheCredentials = true; /** * {@inheritDoc} */ public function doDownload(PackageInterface $package, $path, $url) { SvnUtil::cleanEnv(); $ref = $package->getSourceReference(); $repo = $package->getRepository(); if ($repo instanceof VcsRepository) { $repoConfig = $repo->getRepoConfig(); if (array_key_exists('svn-cache-credentials', $repoConfig)) { $this->cacheCredentials = (bool) $repoConfig['svn-cache-credentials']; } } $this->io->writeError(" Checking out ".$package->getSourceReference()); $this->execute($url, "svn co", sprintf("%s/%s", $url, $ref), null, $path); } /** * {@inheritDoc} */ public function doUpdate(PackageInterface $initial, PackageInterface $target, $path, $url) { SvnUtil::cleanEnv(); $ref = $target->getSourceReference(); if (!$this->hasMetadataRepository($path)) { throw new \RuntimeException('The .svn directory is missing from '.$path.', see https://getcomposer.org/commit-deps for more information'); } $util = new SvnUtil($url, $this->io, $this->config); $flags = ""; if (version_compare($util->binaryVersion(), '1.7.0', '>=')) { $flags .= ' --ignore-ancestry'; } $this->io->writeError(" Checking out " . $ref); $this->execute($url, "svn switch" . $flags, sprintf("%s/%s", $url, $ref), $path); } /** * {@inheritDoc} */ public function getLocalChanges(PackageInterface $package, $path) { if (!$this->hasMetadataRepository($path)) { return null; } $this->process->execute('svn status --ignore-externals', $output, $path); return preg_match('{^ *[^X ] +}m', $output) ? $output : null; } /** * Execute an SVN command and try to fix up the process with credentials * if necessary. * * @param string $baseUrl Base URL of the repository * @param string $command SVN command to run * @param string $url SVN url * @param string $cwd Working directory * @param string $path Target for a checkout * @throws \RuntimeException * @return string */ protected function execute($baseUrl, $command, $url, $cwd = null, $path = null) { $util = new SvnUtil($baseUrl, $this->io, $this->config); $util->setCacheCredentials($this->cacheCredentials); try { return $util->execute($command, $url, $cwd, $path, $this->io->isVerbose()); } catch (\RuntimeException $e) { throw new \RuntimeException( 'Package could not be downloaded, '.$e->getMessage() ); } } /** * {@inheritDoc} */ protected function cleanChanges(PackageInterface $package, $path, $update) { if (!$changes = $this->getLocalChanges($package, $path)) { return; } if (!$this->io->isInteractive()) { if (true === $this->config->get('discard-changes')) { return $this->discardChanges($path); } return parent::cleanChanges($package, $path, $update); } $changes = array_map(function ($elem) { return ' '.$elem; }, preg_split('{\s*\r?\n\s*}', $changes)); $countChanges = count($changes); $this->io->writeError(sprintf(' <error>The package has modified file%s:</error>', $countChanges === 1 ? '' : 's')); $this->io->writeError(array_slice($changes, 0, 10)); if ($countChanges > 10) { $remainingChanges = $countChanges - 10; $this->io->writeError( sprintf( ' <info>'.$remainingChanges.' more file%s modified, choose "v" to view the full list</info>', $remainingChanges === 1 ? '' : 's' ) ); } while (true) { switch ($this->io->ask(' <info>Discard changes [y,n,v,?]?</info> ', '?')) { case 'y': $this->discardChanges($path); break 2; case 'n': throw new \RuntimeException('Update aborted'); case 'v': $this->io->writeError($changes); break; case '?': default: $this->io->writeError(array( ' y - discard changes and apply the '.($update ? 'update' : 'uninstall'), ' n - abort the '.($update ? 'update' : 'uninstall').' and let you manually clean things up', ' v - view modified files', ' ? - print help', )); break; } } } /** * {@inheritDoc} */ protected function getCommitLogs($fromReference, $toReference, $path) { if (preg_match('{.*@(\d+)$}', $fromReference) && preg_match('{.*@(\d+)$}', $toReference)) { // retrieve the svn base url from the checkout folder $command = sprintf('svn info --non-interactive --xml %s', ProcessExecutor::escape($path)); if (0 !== $this->process->execute($command, $output, $path)) { throw new \RuntimeException( 'Failed to execute ' . $command . "\n\n" . $this->process->getErrorOutput() ); } $urlPattern = '#<url>(.*)</url>#'; if (preg_match($urlPattern, $output, $matches)) { $baseUrl = $matches[1]; } else { throw new \RuntimeException( 'Unable to determine svn url for path '. $path ); } // strip paths from references and only keep the actual revision $fromRevision = preg_replace('{.*@(\d+)$}', '$1', $fromReference); $toRevision = preg_replace('{.*@(\d+)$}', '$1', $toReference); $command = sprintf('svn log -r%s:%s --incremental', ProcessExecutor::escape($fromRevision), ProcessExecutor::escape($toRevision)); $util = new SvnUtil($baseUrl, $this->io, $this->config); $util->setCacheCredentials($this->cacheCredentials); try { return $util->executeLocal($command, $path, null, $this->io->isVerbose()); } catch (\RuntimeException $e) { throw new \RuntimeException( 'Failed to execute ' . $command . "\n\n".$e->getMessage() ); } } return "Could not retrieve changes between $fromReference and $toReference due to missing revision information"; } protected function discardChanges($path) { if (0 !== $this->process->execute('svn revert -R .', $output, $path)) { throw new \RuntimeException("Could not reset changes\n\n:".$this->process->getErrorOutput()); } } /** * {@inheritDoc} */ protected function hasMetadataRepository($path) { return is_dir($path.'/.svn'); } } composer/src/Composer/Downloader/VcsDownloader.php 0000644 00000024620 14736103146 0016343 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Downloader; use Composer\Config; use Composer\Package\Dumper\ArrayDumper; use Composer\Package\PackageInterface; use Composer\Package\Version\VersionGuesser; use Composer\Package\Version\VersionParser; use Composer\Util\ProcessExecutor; use Composer\IO\IOInterface; use Composer\Util\Filesystem; /** * @author Jordi Boggiano <j.boggiano@seld.be> */ abstract class VcsDownloader implements DownloaderInterface, ChangeReportInterface, VcsCapableDownloaderInterface { /** @var IOInterface */ protected $io; /** @var Config */ protected $config; /** @var ProcessExecutor */ protected $process; /** @var Filesystem */ protected $filesystem; public function __construct(IOInterface $io, Config $config, ProcessExecutor $process = null, Filesystem $fs = null) { $this->io = $io; $this->config = $config; $this->process = $process ?: new ProcessExecutor($io); $this->filesystem = $fs ?: new Filesystem($this->process); } /** * {@inheritDoc} */ public function getInstallationSource() { return 'source'; } /** * {@inheritDoc} */ public function download(PackageInterface $package, $path) { if (!$package->getSourceReference()) { throw new \InvalidArgumentException('Package '.$package->getPrettyName().' is missing reference information'); } $this->io->writeError(" - Installing <info>" . $package->getName() . "</info> (<comment>" . $package->getFullPrettyVersion() . "</comment>): ", false); $this->filesystem->emptyDirectory($path); $urls = $package->getSourceUrls(); while ($url = array_shift($urls)) { try { if (Filesystem::isLocalPath($url)) { // realpath() below will not understand // url that starts with "file://" $needle = 'file://'; $isFileProtocol = false; if (0 === strpos($url, $needle)) { $url = substr($url, strlen($needle)); $isFileProtocol = true; } // realpath() below will not understand %20 spaces etc. if (false !== strpos($url, '%')) { $url = rawurldecode($url); } $url = realpath($url); if ($isFileProtocol) { $url = $needle . $url; } } $this->doDownload($package, $path, $url); break; } catch (\Exception $e) { // rethrow phpunit exceptions to avoid hard to debug bug failures if ($e instanceof \PHPUnit_Framework_Exception) { throw $e; } if ($this->io->isDebug()) { $this->io->writeError('Failed: ['.get_class($e).'] '.$e->getMessage()); } elseif (count($urls)) { $this->io->writeError(' Failed, trying the next URL'); } if (!count($urls)) { throw $e; } } } } /** * {@inheritDoc} */ public function update(PackageInterface $initial, PackageInterface $target, $path) { if (!$target->getSourceReference()) { throw new \InvalidArgumentException('Package '.$target->getPrettyName().' is missing reference information'); } $name = $target->getName(); if ($initial->getPrettyVersion() == $target->getPrettyVersion()) { if ($target->getSourceType() === 'svn') { $from = $initial->getSourceReference(); $to = $target->getSourceReference(); } else { $from = substr($initial->getSourceReference(), 0, 7); $to = substr($target->getSourceReference(), 0, 7); } $name .= ' '.$initial->getPrettyVersion(); } else { $from = $initial->getFullPrettyVersion(); $to = $target->getFullPrettyVersion(); } $actionName = VersionParser::isUpgrade($initial->getVersion(), $target->getVersion()) ? 'Updating' : 'Downgrading'; $this->io->writeError(" - " . $actionName . " <info>" . $name . "</info> (<comment>" . $from . "</comment> => <comment>" . $to . "</comment>): ", false); $this->cleanChanges($initial, $path, true); $urls = $target->getSourceUrls(); $exception = null; while ($url = array_shift($urls)) { try { if (Filesystem::isLocalPath($url)) { $url = realpath($url); } $this->doUpdate($initial, $target, $path, $url); $exception = null; break; } catch (\Exception $exception) { // rethrow phpunit exceptions to avoid hard to debug bug failures if ($exception instanceof \PHPUnit_Framework_Exception) { throw $exception; } if ($this->io->isDebug()) { $this->io->writeError('Failed: ['.get_class($exception).'] '.$exception->getMessage()); } elseif (count($urls)) { $this->io->writeError(' Failed, trying the next URL'); } } } $this->reapplyChanges($path); // print the commit logs if in verbose mode and VCS metadata is present // because in case of missing metadata code would trigger another exception if (!$exception && $this->io->isVerbose() && $this->hasMetadataRepository($path)) { $message = 'Pulling in changes:'; $logs = $this->getCommitLogs($initial->getSourceReference(), $target->getSourceReference(), $path); if (!trim($logs)) { $message = 'Rolling back changes:'; $logs = $this->getCommitLogs($target->getSourceReference(), $initial->getSourceReference(), $path); } if (trim($logs)) { $logs = implode("\n", array_map(function ($line) { return ' ' . $line; }, explode("\n", $logs))); // escape angle brackets for proper output in the console $logs = str_replace('<', '\<', $logs); $this->io->writeError(' '.$message); $this->io->writeError($logs); } } if (!$urls && $exception) { throw $exception; } } /** * {@inheritDoc} */ public function remove(PackageInterface $package, $path) { $this->io->writeError(" - Removing <info>" . $package->getName() . "</info> (<comment>" . $package->getPrettyVersion() . "</comment>)"); $this->cleanChanges($package, $path, false); if (!$this->filesystem->removeDirectory($path)) { throw new \RuntimeException('Could not completely delete '.$path.', aborting.'); } } /** * Download progress information is not available for all VCS downloaders. * {@inheritDoc} */ public function setOutputProgress($outputProgress) { return $this; } /** * {@inheritDoc} */ public function getVcsReference(PackageInterface $package, $path) { $parser = new VersionParser; $guesser = new VersionGuesser($this->config, $this->process, $parser); $dumper = new ArrayDumper; $packageConfig = $dumper->dump($package); if ($packageVersion = $guesser->guessVersion($packageConfig, $path)) { return $packageVersion['commit']; } } /** * Prompt the user to check if changes should be stashed/removed or the operation aborted * * @param PackageInterface $package * @param string $path * @param bool $update if true (update) the changes can be stashed and reapplied after an update, * if false (remove) the changes should be assumed to be lost if the operation is not aborted * @throws \RuntimeException in case the operation must be aborted */ protected function cleanChanges(PackageInterface $package, $path, $update) { // the default implementation just fails if there are any changes, override in child classes to provide stash-ability if (null !== $this->getLocalChanges($package, $path)) { throw new \RuntimeException('Source directory ' . $path . ' has uncommitted changes.'); } } /** * Guarantee that no changes have been made to the local copy * * @param string $path * @throws \RuntimeException in case the operation must be aborted or the patch does not apply cleanly */ protected function reapplyChanges($path) { } /** * Downloads specific package into specific folder. * * @param PackageInterface $package package instance * @param string $path download path * @param string $url package url */ abstract protected function doDownload(PackageInterface $package, $path, $url); /** * Updates specific package in specific folder from initial to target version. * * @param PackageInterface $initial initial package * @param PackageInterface $target updated package * @param string $path download path * @param string $url package url */ abstract protected function doUpdate(PackageInterface $initial, PackageInterface $target, $path, $url); /** * Fetches the commit logs between two commits * * @param string $fromReference the source reference * @param string $toReference the target reference * @param string $path the package path * @return string */ abstract protected function getCommitLogs($fromReference, $toReference, $path); /** * Checks if VCS metadata repository has been initialized * repository example: .git|.svn|.hg * * @param string $path * @return bool */ abstract protected function hasMetadataRepository($path); } composer/src/Composer/Downloader/ZipDownloader.php 0000644 00000020725 14736103146 0016354 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Downloader; use Composer\Config; use Composer\Cache; use Composer\EventDispatcher\EventDispatcher; use Composer\Package\PackageInterface; use Composer\Util\IniHelper; use Composer\Util\Platform; use Composer\Util\ProcessExecutor; use Composer\Util\RemoteFilesystem; use Composer\IO\IOInterface; use Symfony\Component\Process\ExecutableFinder; use ZipArchive; /** * @author Jordi Boggiano <j.boggiano@seld.be> */ class ZipDownloader extends ArchiveDownloader { protected static $hasSystemUnzip; private static $hasZipArchive; private static $isWindows; protected $process; private $zipArchiveObject; public function __construct(IOInterface $io, Config $config, EventDispatcher $eventDispatcher = null, Cache $cache = null, ProcessExecutor $process = null, RemoteFilesystem $rfs = null) { $this->process = $process ?: new ProcessExecutor($io); parent::__construct($io, $config, $eventDispatcher, $cache, $rfs); } /** * {@inheritDoc} */ public function download(PackageInterface $package, $path, $output = true) { if (null === self::$hasSystemUnzip) { $finder = new ExecutableFinder; self::$hasSystemUnzip = (bool) $finder->find('unzip'); } if (null === self::$hasZipArchive) { self::$hasZipArchive = class_exists('ZipArchive'); } if (!self::$hasZipArchive && !self::$hasSystemUnzip) { // php.ini path is added to the error message to help users find the correct file $iniMessage = IniHelper::getMessage(); $error = "The zip extension and unzip command are both missing, skipping.\n" . $iniMessage; throw new \RuntimeException($error); } if (null === self::$isWindows) { self::$isWindows = Platform::isWindows(); if (!self::$isWindows && !self::$hasSystemUnzip) { $this->io->writeError("<warning>As there is no 'unzip' command installed zip files are being unpacked using the PHP zip extension.</warning>"); $this->io->writeError("<warning>This may cause invalid reports of corrupted archives. Besides, any UNIX permissions (e.g. executable) defined in the archives will be lost.</warning>"); $this->io->writeError("<warning>Installing 'unzip' may remediate them.</warning>"); } } return parent::download($package, $path, $output); } /** * extract $file to $path with "unzip" command * * @param string $file File to extract * @param string $path Path where to extract file * @param bool $isLastChance If true it is called as a fallback and should throw an exception * @return bool Success status */ protected function extractWithSystemUnzip($file, $path, $isLastChance) { if (!self::$hasZipArchive) { // Force Exception throwing if the Other alternative is not available $isLastChance = true; } if (!self::$hasSystemUnzip && !$isLastChance) { // This was call as the favorite extract way, but is not available // We switch to the alternative return $this->extractWithZipArchive($file, $path, true); } $processError = null; // When called after a ZipArchive failed, perhaps there is some files to overwrite $overwrite = $isLastChance ? '-o' : ''; $command = 'unzip -qq '.$overwrite.' '.ProcessExecutor::escape($file).' -d '.ProcessExecutor::escape($path); try { if (0 === $exitCode = $this->process->execute($command, $ignoredOutput)) { return true; } $processError = new \RuntimeException('Failed to execute ('.$exitCode.') '.$command."\n\n".$this->process->getErrorOutput()); } catch (\Exception $e) { $processError = $e; } if ($isLastChance) { throw $processError; } $this->io->writeError(' '.$processError->getMessage()); $this->io->writeError(' The archive may contain identical file names with different capitalization (which fails on case insensitive filesystems)'); $this->io->writeError(' Unzip with unzip command failed, falling back to ZipArchive class'); return $this->extractWithZipArchive($file, $path, true); } /** * extract $file to $path with ZipArchive * * @param string $file File to extract * @param string $path Path where to extract file * @param bool $isLastChance If true it is called as a fallback and should throw an exception * @return bool Success status */ protected function extractWithZipArchive($file, $path, $isLastChance) { if (!self::$hasSystemUnzip) { // Force Exception throwing if the Other alternative is not available $isLastChance = true; } if (!self::$hasZipArchive && !$isLastChance) { // This was call as the favorite extract way, but is not available // We switch to the alternative return $this->extractWithSystemUnzip($file, $path, true); } $processError = null; $zipArchive = $this->zipArchiveObject ?: new ZipArchive(); try { if (true === ($retval = $zipArchive->open($file))) { $extractResult = $zipArchive->extractTo($path); if (true === $extractResult) { $zipArchive->close(); return true; } $processError = new \RuntimeException(rtrim("There was an error extracting the ZIP file, it is either corrupted or using an invalid format.\n")); } else { $processError = new \UnexpectedValueException(rtrim($this->getErrorMessage($retval, $file)."\n"), $retval); } } catch (\ErrorException $e) { $processError = new \RuntimeException('The archive may contain identical file names with different capitalization (which fails on case insensitive filesystems): '.$e->getMessage(), 0, $e); } catch (\Exception $e) { $processError = $e; } if ($isLastChance) { throw $processError; } $this->io->writeError(' '.$processError->getMessage()); $this->io->writeError(' Unzip with ZipArchive class failed, falling back to unzip command'); return $this->extractWithSystemUnzip($file, $path, true); } /** * extract $file to $path * * @param string $file File to extract * @param string $path Path where to extract file */ public function extract($file, $path) { // Each extract calls its alternative if not available or fails if (self::$isWindows) { $this->extractWithZipArchive($file, $path, false); } else { $this->extractWithSystemUnzip($file, $path, false); } } /** * Give a meaningful error message to the user. * * @param int $retval * @param string $file * @return string */ protected function getErrorMessage($retval, $file) { switch ($retval) { case ZipArchive::ER_EXISTS: return sprintf("File '%s' already exists.", $file); case ZipArchive::ER_INCONS: return sprintf("Zip archive '%s' is inconsistent.", $file); case ZipArchive::ER_INVAL: return sprintf("Invalid argument (%s)", $file); case ZipArchive::ER_MEMORY: return sprintf("Malloc failure (%s)", $file); case ZipArchive::ER_NOENT: return sprintf("No such zip file: '%s'", $file); case ZipArchive::ER_NOZIP: return sprintf("'%s' is not a zip archive.", $file); case ZipArchive::ER_OPEN: return sprintf("Can't open zip file: %s", $file); case ZipArchive::ER_READ: return sprintf("Zip read error (%s)", $file); case ZipArchive::ER_SEEK: return sprintf("Zip seek error (%s)", $file); default: return sprintf("'%s' is not a valid zip archive, got error code: %s", $file, $retval); } } } composer/src/Composer/Downloader/GitDownloader.php 0000644 00000050322 14736103146 0016331 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Downloader; use Composer\Config; use Composer\IO\IOInterface; use Composer\Package\PackageInterface; use Composer\Util\Filesystem; use Composer\Util\Git as GitUtil; use Composer\Util\Platform; use Composer\Util\ProcessExecutor; use Composer\Cache; /** * @author Jordi Boggiano <j.boggiano@seld.be> */ class GitDownloader extends VcsDownloader implements DvcsDownloaderInterface { private $hasStashedChanges = false; private $hasDiscardedChanges = false; private $gitUtil; public function __construct(IOInterface $io, Config $config, ProcessExecutor $process = null, Filesystem $fs = null) { parent::__construct($io, $config, $process, $fs); $this->gitUtil = new GitUtil($this->io, $this->config, $this->process, $this->filesystem); } /** * {@inheritDoc} */ public function doDownload(PackageInterface $package, $path, $url) { GitUtil::cleanEnv(); $path = $this->normalizePath($path); $cachePath = $this->config->get('cache-vcs-dir').'/'.preg_replace('{[^a-z0-9.]}i', '-', $url).'/'; $ref = $package->getSourceReference(); $flag = Platform::isWindows() ? '/D ' : ''; // --dissociate option is only available since git 2.3.0-rc0 $gitVersion = $this->gitUtil->getVersion(); $msg = "Cloning ".$this->getShortHash($ref); $command = 'git clone --no-checkout %url% %path% && cd '.$flag.'%path% && git remote add composer %url% && git fetch composer && git remote set-url origin %sanitizedUrl% && git remote set-url composer %sanitizedUrl%'; if ($gitVersion && version_compare($gitVersion, '2.3.0-rc0', '>=') && Cache::isUsable($cachePath)) { $this->io->writeError('', true, IOInterface::DEBUG); $this->io->writeError(sprintf(' Cloning to cache at %s', ProcessExecutor::escape($cachePath)), true, IOInterface::DEBUG); try { if (!$this->gitUtil->fetchRefOrSyncMirror($url, $cachePath, $ref)) { $this->io->writeError('<error>Failed to update '.$url.' in cache, package installation for '.$package->getPrettyName().' might fail.</error>'); } if (is_dir($cachePath)) { $command = 'git clone --no-checkout %cachePath% %path% --dissociate --reference %cachePath% ' . '&& cd '.$flag.'%path% ' . '&& git remote set-url origin %sanitizedUrl% && git remote add composer %sanitizedUrl%'; $msg = "Cloning ".$this->getShortHash($ref).' from cache'; } } catch (\RuntimeException $e) { if (0 === strpos(get_class($e), 'PHPUnit')) { throw $e; } } } $this->io->writeError($msg); $commandCallable = function ($url) use ($path, $command, $cachePath) { return str_replace( array('%url%', '%path%', '%cachePath%', '%sanitizedUrl%'), array( ProcessExecutor::escape($url), ProcessExecutor::escape($path), ProcessExecutor::escape($cachePath), ProcessExecutor::escape(preg_replace('{://([^@]+?):(.+?)@}', '://', $url)), ), $command ); }; $this->gitUtil->runCommand($commandCallable, $url, $path, true); if ($url !== $package->getSourceUrl()) { $this->updateOriginUrl($path, $package->getSourceUrl()); } else { $this->setPushUrl($path, $url); } if ($newRef = $this->updateToCommit($path, $ref, $package->getPrettyVersion(), $package->getReleaseDate())) { if ($package->getDistReference() === $package->getSourceReference()) { $package->setDistReference($newRef); } $package->setSourceReference($newRef); } } /** * {@inheritDoc} */ public function doUpdate(PackageInterface $initial, PackageInterface $target, $path, $url) { GitUtil::cleanEnv(); if (!$this->hasMetadataRepository($path)) { throw new \RuntimeException('The .git directory is missing from '.$path.', see https://getcomposer.org/commit-deps for more information'); } $updateOriginUrl = false; if ( 0 === $this->process->execute('git remote -v', $output, $path) && preg_match('{^origin\s+(?P<url>\S+)}m', $output, $originMatch) && preg_match('{^composer\s+(?P<url>\S+)}m', $output, $composerMatch) ) { if ($originMatch['url'] === $composerMatch['url'] && $composerMatch['url'] !== $target->getSourceUrl()) { $updateOriginUrl = true; } } $ref = $target->getSourceReference(); $this->io->writeError(" Checking out ".$this->getShortHash($ref)); $command = '(git remote set-url composer %s && git rev-parse --quiet --verify %s || (git fetch composer && git fetch --tags composer)) && git remote set-url composer %s'; $commandCallable = function ($url) use ($command, $ref) { return sprintf( $command, ProcessExecutor::escape($url), ProcessExecutor::escape($ref.'^{commit}'), ProcessExecutor::escape(preg_replace('{://([^@]+?):(.+?)@}', '://', $url)) ); }; $this->gitUtil->runCommand($commandCallable, $url, $path); if ($newRef = $this->updateToCommit($path, $ref, $target->getPrettyVersion(), $target->getReleaseDate())) { if ($target->getDistReference() === $target->getSourceReference()) { $target->setDistReference($newRef); } $target->setSourceReference($newRef); } if ($updateOriginUrl) { $this->updateOriginUrl($path, $target->getSourceUrl()); } } /** * {@inheritDoc} */ public function getLocalChanges(PackageInterface $package, $path) { GitUtil::cleanEnv(); if (!$this->hasMetadataRepository($path)) { return; } $command = 'git status --porcelain --untracked-files=no'; if (0 !== $this->process->execute($command, $output, $path)) { throw new \RuntimeException('Failed to execute ' . $command . "\n\n" . $this->process->getErrorOutput()); } return trim($output) ?: null; } public function getUnpushedChanges(PackageInterface $package, $path) { GitUtil::cleanEnv(); $path = $this->normalizePath($path); if (!$this->hasMetadataRepository($path)) { return; } $command = 'git show-ref --head -d'; if (0 !== $this->process->execute($command, $output, $path)) { throw new \RuntimeException('Failed to execute ' . $command . "\n\n" . $this->process->getErrorOutput()); } $refs = trim($output); if (!preg_match('{^([a-f0-9]+) HEAD$}mi', $refs, $match)) { // could not match the HEAD for some reason return; } $headRef = $match[1]; if (!preg_match_all('{^'.$headRef.' refs/heads/(.+)$}mi', $refs, $matches)) { // not on a branch, we are either on a not-modified tag or some sort of detached head, so skip this return; } // use the first match as branch name for now $branch = $matches[1][0]; $unpushedChanges = null; // do two passes, as if we find anything we want to fetch and then re-try for ($i = 0; $i <= 1; $i++) { // try to find the a matching branch name in the composer remote foreach ($matches[1] as $candidate) { if (preg_match('{^[a-f0-9]+ refs/remotes/((?:composer|origin)/'.preg_quote($candidate).')$}mi', $refs, $match)) { $branch = $candidate; $remoteBranch = $match[1]; break; } } // if it doesn't exist, then we assume it is an unpushed branch // this is bad as we have no reference point to do a diff so we just bail listing // the branch as being unpushed if (!isset($remoteBranch)) { $unpushedChanges = 'Branch ' . $branch . ' could not be found on the origin remote and appears to be unpushed'; } else { $command = sprintf('git diff --name-status %s...%s --', $remoteBranch, $branch); if (0 !== $this->process->execute($command, $output, $path)) { throw new \RuntimeException('Failed to execute ' . $command . "\n\n" . $this->process->getErrorOutput()); } $unpushedChanges = trim($output) ?: null; } // first pass and we found unpushed changes, fetch from both remotes to make sure we have up to date // remotes and then try again as outdated remotes can sometimes cause false-positives if ($unpushedChanges && $i === 0) { $this->process->execute('git fetch composer && git fetch origin', $output, $path); } // abort after first pass if we didn't find anything if (!$unpushedChanges) { break; } } return $unpushedChanges; } /** * {@inheritDoc} */ protected function cleanChanges(PackageInterface $package, $path, $update) { GitUtil::cleanEnv(); $path = $this->normalizePath($path); $unpushed = $this->getUnpushedChanges($package, $path); if ($unpushed && ($this->io->isInteractive() || $this->config->get('discard-changes') !== true)) { throw new \RuntimeException('Source directory ' . $path . ' has unpushed changes on the current branch: '."\n".$unpushed); } if (!$changes = $this->getLocalChanges($package, $path)) { return; } if (!$this->io->isInteractive()) { $discardChanges = $this->config->get('discard-changes'); if (true === $discardChanges) { return $this->discardChanges($path); } if ('stash' === $discardChanges) { if (!$update) { return parent::cleanChanges($package, $path, $update); } return $this->stashChanges($path); } return parent::cleanChanges($package, $path, $update); } $changes = array_map(function ($elem) { return ' '.$elem; }, preg_split('{\s*\r?\n\s*}', $changes)); $this->io->writeError(' <error>The package has modified files:</error>'); $this->io->writeError(array_slice($changes, 0, 10)); if (count($changes) > 10) { $this->io->writeError(' <info>' . (count($changes) - 10) . ' more files modified, choose "v" to view the full list</info>'); } while (true) { switch ($this->io->ask(' <info>Discard changes [y,n,v,d,'.($update ? 's,' : '').'?]?</info> ', '?')) { case 'y': $this->discardChanges($path); break 2; case 's': if (!$update) { goto help; } $this->stashChanges($path); break 2; case 'n': throw new \RuntimeException('Update aborted'); case 'v': $this->io->writeError($changes); break; case 'd': $this->viewDiff($path); break; case '?': default: help: $this->io->writeError(array( ' y - discard changes and apply the '.($update ? 'update' : 'uninstall'), ' n - abort the '.($update ? 'update' : 'uninstall').' and let you manually clean things up', ' v - view modified files', ' d - view local modifications (diff)', )); if ($update) { $this->io->writeError(' s - stash changes and try to reapply them after the update'); } $this->io->writeError(' ? - print help'); break; } } } /** * {@inheritDoc} */ protected function reapplyChanges($path) { $path = $this->normalizePath($path); if ($this->hasStashedChanges) { $this->hasStashedChanges = false; $this->io->writeError(' <info>Re-applying stashed changes</info>'); if (0 !== $this->process->execute('git stash pop', $output, $path)) { throw new \RuntimeException("Failed to apply stashed changes:\n\n".$this->process->getErrorOutput()); } } $this->hasDiscardedChanges = false; } /** * Updates the given path to the given commit ref * * @param string $path * @param string $reference * @param string $branch * @param \DateTime $date * @throws \RuntimeException * @return null|string if a string is returned, it is the commit reference that was checked out if the original could not be found */ protected function updateToCommit($path, $reference, $branch, $date) { $force = $this->hasDiscardedChanges || $this->hasStashedChanges ? '-f ' : ''; // This uses the "--" sequence to separate branch from file parameters. // // Otherwise git tries the branch name as well as file name. // If the non-existent branch is actually the name of a file, the file // is checked out. $template = 'git checkout '.$force.'%s -- && git reset --hard %1$s --'; $branch = preg_replace('{(?:^dev-|(?:\.x)?-dev$)}i', '', $branch); $branches = null; if (0 === $this->process->execute('git branch -r', $output, $path)) { $branches = $output; } // check whether non-commitish are branches or tags, and fetch branches with the remote name $gitRef = $reference; if (!preg_match('{^[a-f0-9]{40}$}', $reference) && $branches && preg_match('{^\s+composer/'.preg_quote($reference).'$}m', $branches) ) { $command = sprintf('git checkout '.$force.'-B %s %s -- && git reset --hard %2$s --', ProcessExecutor::escape($branch), ProcessExecutor::escape('composer/'.$reference)); if (0 === $this->process->execute($command, $output, $path)) { return; } } // try to checkout branch by name and then reset it so it's on the proper branch name if (preg_match('{^[a-f0-9]{40}$}', $reference)) { // add 'v' in front of the branch if it was stripped when generating the pretty name if (!preg_match('{^\s+composer/'.preg_quote($branch).'$}m', $branches) && preg_match('{^\s+composer/v'.preg_quote($branch).'$}m', $branches)) { $branch = 'v' . $branch; } $command = sprintf('git checkout %s --', ProcessExecutor::escape($branch)); $fallbackCommand = sprintf('git checkout '.$force.'-B %s %s --', ProcessExecutor::escape($branch), ProcessExecutor::escape('composer/'.$branch)); if (0 === $this->process->execute($command, $output, $path) || 0 === $this->process->execute($fallbackCommand, $output, $path) ) { $command = sprintf('git reset --hard %s --', ProcessExecutor::escape($reference)); if (0 === $this->process->execute($command, $output, $path)) { return; } } } $command = sprintf($template, ProcessExecutor::escape($gitRef)); if (0 === $this->process->execute($command, $output, $path)) { return; } // reference was not found (prints "fatal: reference is not a tree: $ref") if (false !== strpos($this->process->getErrorOutput(), $reference)) { $this->io->writeError(' <warning>'.$reference.' is gone (history was rewritten?)</warning>'); } throw new \RuntimeException(GitUtil::sanitizeUrl('Failed to execute ' . $command . "\n\n" . $this->process->getErrorOutput())); } protected function updateOriginUrl($path, $url) { $this->process->execute(sprintf('git remote set-url origin %s', ProcessExecutor::escape($url)), $output, $path); $this->setPushUrl($path, $url); } protected function setPushUrl($path, $url) { // set push url for github projects if (preg_match('{^(?:https?|git)://'.GitUtil::getGitHubDomainsRegex($this->config).'/([^/]+)/([^/]+?)(?:\.git)?$}', $url, $match)) { $protocols = $this->config->get('github-protocols'); $pushUrl = 'git@'.$match[1].':'.$match[2].'/'.$match[3].'.git'; if (!in_array('ssh', $protocols, true)) { $pushUrl = 'https://' . $match[1] . '/'.$match[2].'/'.$match[3].'.git'; } $cmd = sprintf('git remote set-url --push origin %s', ProcessExecutor::escape($pushUrl)); $this->process->execute($cmd, $ignoredOutput, $path); } } /** * {@inheritDoc} */ protected function getCommitLogs($fromReference, $toReference, $path) { $path = $this->normalizePath($path); $command = sprintf('git log %s..%s --pretty=format:"%%h - %%an: %%s"', ProcessExecutor::escape($fromReference), ProcessExecutor::escape($toReference)); if (0 !== $this->process->execute($command, $output, $path)) { throw new \RuntimeException('Failed to execute ' . $command . "\n\n" . $this->process->getErrorOutput()); } return $output; } /** * @param string $path * @throws \RuntimeException */ protected function discardChanges($path) { $path = $this->normalizePath($path); if (0 !== $this->process->execute('git reset --hard', $output, $path)) { throw new \RuntimeException("Could not reset changes\n\n:".$this->process->getErrorOutput()); } $this->hasDiscardedChanges = true; } /** * @param string $path * @throws \RuntimeException */ protected function stashChanges($path) { $path = $this->normalizePath($path); if (0 !== $this->process->execute('git stash --include-untracked', $output, $path)) { throw new \RuntimeException("Could not stash changes\n\n:".$this->process->getErrorOutput()); } $this->hasStashedChanges = true; } /** * @param string $path * @throws \RuntimeException */ protected function viewDiff($path) { $path = $this->normalizePath($path); if (0 !== $this->process->execute('git diff HEAD', $output, $path)) { throw new \RuntimeException("Could not view diff\n\n:".$this->process->getErrorOutput()); } $this->io->writeError($output); } protected function normalizePath($path) { if (Platform::isWindows() && strlen($path) > 0) { $basePath = $path; $removed = array(); while (!is_dir($basePath) && $basePath !== '\\') { array_unshift($removed, basename($basePath)); $basePath = dirname($basePath); } if ($basePath === '\\') { return $path; } $path = rtrim(realpath($basePath) . '/' . implode('/', $removed), '/'); } return $path; } /** * {@inheritDoc} */ protected function hasMetadataRepository($path) { $path = $this->normalizePath($path); return is_dir($path.'/.git'); } protected function getShortHash($reference) { if (!$this->io->isVerbose() && preg_match('{^[0-9a-f]{40}$}', $reference)) { return substr($reference, 0, 10); } return $reference; } } composer/src/Composer/Downloader/FossilDownloader.php 0000644 00000007652 14736103146 0017055 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Downloader; use Composer\Package\PackageInterface; use Composer\Util\ProcessExecutor; /** * @author BohwaZ <http://bohwaz.net/> */ class FossilDownloader extends VcsDownloader { /** * {@inheritDoc} */ public function doDownload(PackageInterface $package, $path, $url) { // Ensure we are allowed to use this URL by config $this->config->prohibitUrlByConfig($url, $this->io); $url = ProcessExecutor::escape($url); $ref = ProcessExecutor::escape($package->getSourceReference()); $repoFile = $path . '.fossil'; $this->io->writeError("Cloning ".$package->getSourceReference()); $command = sprintf('fossil clone %s %s', $url, ProcessExecutor::escape($repoFile)); if (0 !== $this->process->execute($command, $ignoredOutput)) { throw new \RuntimeException('Failed to execute ' . $command . "\n\n" . $this->process->getErrorOutput()); } $command = sprintf('fossil open %s --nested', ProcessExecutor::escape($repoFile)); if (0 !== $this->process->execute($command, $ignoredOutput, realpath($path))) { throw new \RuntimeException('Failed to execute ' . $command . "\n\n" . $this->process->getErrorOutput()); } $command = sprintf('fossil update %s', $ref); if (0 !== $this->process->execute($command, $ignoredOutput, realpath($path))) { throw new \RuntimeException('Failed to execute ' . $command . "\n\n" . $this->process->getErrorOutput()); } } /** * {@inheritDoc} */ public function doUpdate(PackageInterface $initial, PackageInterface $target, $path, $url) { // Ensure we are allowed to use this URL by config $this->config->prohibitUrlByConfig($url, $this->io); $url = ProcessExecutor::escape($url); $ref = ProcessExecutor::escape($target->getSourceReference()); $this->io->writeError(" Updating to ".$target->getSourceReference()); if (!$this->hasMetadataRepository($path)) { throw new \RuntimeException('The .fslckout file is missing from '.$path.', see https://getcomposer.org/commit-deps for more information'); } $command = sprintf('fossil pull && fossil up %s', $ref); if (0 !== $this->process->execute($command, $ignoredOutput, realpath($path))) { throw new \RuntimeException('Failed to execute ' . $command . "\n\n" . $this->process->getErrorOutput()); } } /** * {@inheritDoc} */ public function getLocalChanges(PackageInterface $package, $path) { if (!$this->hasMetadataRepository($path)) { return null; } $this->process->execute('fossil changes', $output, realpath($path)); return trim($output) ?: null; } /** * {@inheritDoc} */ protected function getCommitLogs($fromReference, $toReference, $path) { $command = sprintf('fossil timeline -t ci -W 0 -n 0 before %s', ProcessExecutor::escape($toReference)); if (0 !== $this->process->execute($command, $output, realpath($path))) { throw new \RuntimeException('Failed to execute ' . $command . "\n\n" . $this->process->getErrorOutput()); } $log = ''; $match = '/\d\d:\d\d:\d\d\s+\[' . $toReference . '\]/'; foreach ($this->process->splitLines($output) as $line) { if (preg_match($match, $line)) { break; } $log .= $line; } return $log; } /** * {@inheritDoc} */ protected function hasMetadataRepository($path) { return is_file($path . '/.fslckout') || is_file($path . '/_FOSSIL_'); } } composer/src/Composer/Downloader/DvcsDownloaderInterface.php 0000644 00000001416 14736103146 0020326 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Downloader; use Composer\Package\PackageInterface; /** * DVCS Downloader interface. * * @author James Titcumb <james@asgrim.com> */ interface DvcsDownloaderInterface { /** * Checks for unpushed changes to a current branch * * @param PackageInterface $package package directory * @param string $path package directory * @return string|null changes or null */ public function getUnpushedChanges(PackageInterface $package, $path); } composer/src/Composer/Downloader/GzipDownloader.php 0000644 00000005052 14736103146 0016517 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Downloader; use Composer\Config; use Composer\Cache; use Composer\EventDispatcher\EventDispatcher; use Composer\Package\PackageInterface; use Composer\Util\Platform; use Composer\Util\ProcessExecutor; use Composer\Util\RemoteFilesystem; use Composer\IO\IOInterface; /** * GZip archive downloader. * * @author Pavel Puchkin <i@neoascetic.me> */ class GzipDownloader extends ArchiveDownloader { protected $process; public function __construct(IOInterface $io, Config $config, EventDispatcher $eventDispatcher = null, Cache $cache = null, ProcessExecutor $process = null, RemoteFilesystem $rfs = null) { $this->process = $process ?: new ProcessExecutor($io); parent::__construct($io, $config, $eventDispatcher, $cache, $rfs); } protected function extract($file, $path) { $targetFilepath = $path . DIRECTORY_SEPARATOR . basename(substr($file, 0, -3)); // Try to use gunzip on *nix if (!Platform::isWindows()) { $command = 'gzip -cd ' . ProcessExecutor::escape($file) . ' > ' . ProcessExecutor::escape($targetFilepath); if (0 === $this->process->execute($command, $ignoredOutput)) { return; } if (extension_loaded('zlib')) { // Fallback to using the PHP extension. $this->extractUsingExt($file, $targetFilepath); return; } $processError = 'Failed to execute ' . $command . "\n\n" . $this->process->getErrorOutput(); throw new \RuntimeException($processError); } // Windows version of PHP has built-in support of gzip functions $this->extractUsingExt($file, $targetFilepath); } /** * {@inheritdoc} */ protected function getFileName(PackageInterface $package, $path) { return $path.'/'.pathinfo(parse_url($package->getDistUrl(), PHP_URL_PATH), PATHINFO_BASENAME); } private function extractUsingExt($file, $targetFilepath) { $archiveFile = gzopen($file, 'rb'); $targetFile = fopen($targetFilepath, 'wb'); while ($string = gzread($archiveFile, 4096)) { fwrite($targetFile, $string, Platform::strlen($string)); } gzclose($archiveFile); fclose($targetFile); } } composer/src/Composer/Downloader/PearPackageExtractor.php 0000644 00000026622 14736103146 0017634 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Downloader; use Composer\Util\Filesystem; /** * Extractor for pear packages. * * Composer cannot rely on tar files structure when place it inside package target dir. Correct source files * disposition must be read from package.xml * This extract pear package source files to target dir. * * @author Alexey Prilipko <palex@farpost.com> */ class PearPackageExtractor { private static $rolesWithoutPackageNamePrefix = array('php', 'script', 'www'); /** @var Filesystem */ private $filesystem; private $file; public function __construct($file) { if (!is_file($file)) { throw new \UnexpectedValueException('PEAR package file is not found at '.$file); } $this->filesystem = new Filesystem(); $this->file = $file; } /** * Installs PEAR source files according to package.xml definitions and removes extracted files * * @param string $target target install location. all source installation would be performed relative to target path. * @param array $roles types of files to install. default role for PEAR source files are 'php'. * @param array $vars used for replacement tasks * @throws \RuntimeException * @throws \UnexpectedValueException */ public function extractTo($target, array $roles = array('php' => '/', 'script' => '/bin'), $vars = array()) { $extractionPath = $target.'/tarball'; try { $archive = new \PharData($this->file); $archive->extractTo($extractionPath, null, true); if (!is_file($this->combine($extractionPath, '/package.xml'))) { throw new \RuntimeException('Invalid PEAR package. It must contain package.xml file.'); } $fileCopyActions = $this->buildCopyActions($extractionPath, $roles, $vars); $this->copyFiles($fileCopyActions, $extractionPath, $target, $roles, $vars); $this->filesystem->removeDirectory($extractionPath); } catch (\Exception $exception) { throw new \UnexpectedValueException(sprintf('Failed to extract PEAR package %s to %s. Reason: %s', $this->file, $target, $exception->getMessage()), 0, $exception); } } /** * Perform copy actions on files * * @param array $files array of copy actions ('from', 'to') with relative paths * @param string $source path to source dir. * @param string $target path to destination dir * @param array $roles array [role => roleRoot] relative root for files having that role * @param array $vars list of values can be used for replacement tasks */ private function copyFiles($files, $source, $target, $roles, $vars) { foreach ($files as $file) { $from = $this->combine($source, $file['from']); $to = $this->combine($target, $roles[$file['role']]); $to = $this->combine($to, $file['to']); $tasks = $file['tasks']; $this->copyFile($from, $to, $tasks, $vars); } } private function copyFile($from, $to, $tasks, $vars) { if (!is_file($from)) { throw new \RuntimeException('Invalid PEAR package. package.xml defines file that is not located inside tarball.'); } $this->filesystem->ensureDirectoryExists(dirname($to)); if (0 == count($tasks)) { $copied = copy($from, $to); } else { $content = file_get_contents($from); $replacements = array(); foreach ($tasks as $task) { $pattern = $task['from']; $varName = $task['to']; if (isset($vars[$varName])) { if ($varName === 'php_bin' && false === strpos($to, '.bat')) { $replacements[$pattern] = preg_replace('{\.bat$}', '', $vars[$varName]); } else { $replacements[$pattern] = $vars[$varName]; } } } $content = strtr($content, $replacements); $copied = file_put_contents($to, $content); } if (false === $copied) { throw new \RuntimeException(sprintf('Failed to copy %s to %s', $from, $to)); } } /** * Builds list of copy and list of remove actions that would transform extracted PEAR tarball into installed package. * * @param string $source string path to extracted files * @param array $roles array [role => roleRoot] relative root for files having that role * @param array $vars list of values can be used for replacement tasks * @throws \RuntimeException * @return array array of 'source' => 'target', where source is location of file in the tarball (relative to source * path, and target is destination of file (also relative to $source path) */ private function buildCopyActions($source, array $roles, $vars) { /** @var \SimpleXmlElement $package */ $package = simplexml_load_string(file_get_contents($this->combine($source, 'package.xml'))); if (false === $package) { throw new \RuntimeException('Package definition file is not valid.'); } $packageSchemaVersion = $package['version']; if ('1.0' == $packageSchemaVersion) { $children = $package->release->filelist->children(); $packageName = (string) $package->name; $packageVersion = (string) $package->release->version; $sourceDir = $packageName . '-' . $packageVersion; $result = $this->buildSourceList10($children, $roles, $sourceDir, '', null, $packageName); } elseif ('2.0' == $packageSchemaVersion || '2.1' == $packageSchemaVersion) { $children = $package->contents->children(); $packageName = (string) $package->name; $packageVersion = (string) $package->version->release; $sourceDir = $packageName . '-' . $packageVersion; $result = $this->buildSourceList20($children, $roles, $sourceDir, '', null, $packageName); $namespaces = $package->getNamespaces(); $package->registerXPathNamespace('ns', $namespaces['']); $releaseNodes = $package->xpath('ns:phprelease'); $this->applyRelease($result, $releaseNodes, $vars); } else { throw new \RuntimeException('Unsupported schema version of package definition file.'); } return $result; } private function applyRelease(&$actions, $releaseNodes, $vars) { foreach ($releaseNodes as $releaseNode) { $requiredOs = $releaseNode->installconditions && $releaseNode->installconditions->os && $releaseNode->installconditions->os->name ? (string) $releaseNode->installconditions->os->name : ''; if ($requiredOs && $vars['os'] != $requiredOs) { continue; } if ($releaseNode->filelist) { foreach ($releaseNode->filelist->children() as $action) { if ('install' == $action->getName()) { $name = (string) $action['name']; $as = (string) $action['as']; if (isset($actions[$name])) { $actions[$name]['to'] = $as; } } elseif ('ignore' == $action->getName()) { $name = (string) $action['name']; unset($actions[$name]); } else { // unknown action } } } break; } } private function buildSourceList10($children, $targetRoles, $source, $target, $role, $packageName) { $result = array(); // enumerating files foreach ($children as $child) { /** @var $child \SimpleXMLElement */ if ($child->getName() == 'dir') { $dirSource = $this->combine($source, (string) $child['name']); $dirTarget = $child['baseinstalldir'] ?: $target; $dirRole = $child['role'] ?: $role; $dirFiles = $this->buildSourceList10($child->children(), $targetRoles, $dirSource, $dirTarget, $dirRole, $packageName); $result = array_merge($result, $dirFiles); } elseif ($child->getName() == 'file') { $fileRole = (string) $child['role'] ?: $role; if (isset($targetRoles[$fileRole])) { $fileName = (string) ($child['name'] ?: $child[0]); // $child[0] means text content $fileSource = $this->combine($source, $fileName); $fileTarget = $this->combine((string) $child['baseinstalldir'] ?: $target, $fileName); if (!in_array($fileRole, self::$rolesWithoutPackageNamePrefix)) { $fileTarget = $packageName . '/' . $fileTarget; } $result[(string) $child['name']] = array('from' => $fileSource, 'to' => $fileTarget, 'role' => $fileRole, 'tasks' => array()); } } } return $result; } private function buildSourceList20($children, $targetRoles, $source, $target, $role, $packageName) { $result = array(); // enumerating files foreach ($children as $child) { /** @var $child \SimpleXMLElement */ if ('dir' == $child->getName()) { $dirSource = $this->combine($source, $child['name']); $dirTarget = $child['baseinstalldir'] ?: $target; $dirRole = $child['role'] ?: $role; $dirFiles = $this->buildSourceList20($child->children(), $targetRoles, $dirSource, $dirTarget, $dirRole, $packageName); $result = array_merge($result, $dirFiles); } elseif ('file' == $child->getName()) { $fileRole = (string) $child['role'] ?: $role; if (isset($targetRoles[$fileRole])) { $fileSource = $this->combine($source, (string) $child['name']); $fileTarget = $this->combine((string) ($child['baseinstalldir'] ?: $target), (string) $child['name']); $fileTasks = array(); foreach ($child->children('http://pear.php.net/dtd/tasks-1.0') as $taskNode) { if ('replace' == $taskNode->getName()) { $fileTasks[] = array('from' => (string) $taskNode->attributes()->from, 'to' => (string) $taskNode->attributes()->to); } } if (!in_array($fileRole, self::$rolesWithoutPackageNamePrefix)) { $fileTarget = $packageName . '/' . $fileTarget; } $result[(string) $child['name']] = array('from' => $fileSource, 'to' => $fileTarget, 'role' => $fileRole, 'tasks' => $fileTasks); } } } return $result; } private function combine($left, $right) { return rtrim($left, '/') . '/' . ltrim($right, '/'); } } composer/src/Composer/Downloader/HgDownloader.php 0000644 00000005670 14736103146 0016152 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Downloader; use Composer\Package\PackageInterface; use Composer\Util\ProcessExecutor; use Composer\Util\Hg as HgUtils; /** * @author Per Bernhardt <plb@webfactory.de> */ class HgDownloader extends VcsDownloader { /** * {@inheritDoc} */ public function doDownload(PackageInterface $package, $path, $url) { $hgUtils = new HgUtils($this->io, $this->config, $this->process); $cloneCommand = function ($url) use ($path) { return sprintf('hg clone %s %s', ProcessExecutor::escape($url), ProcessExecutor::escape($path)); }; $hgUtils->runCommand($cloneCommand, $url, $path); $ref = ProcessExecutor::escape($package->getSourceReference()); $command = sprintf('hg up %s', $ref); if (0 !== $this->process->execute($command, $ignoredOutput, realpath($path))) { throw new \RuntimeException('Failed to execute ' . $command . "\n\n" . $this->process->getErrorOutput()); } } /** * {@inheritDoc} */ public function doUpdate(PackageInterface $initial, PackageInterface $target, $path, $url) { $hgUtils = new HgUtils($this->io, $this->config, $this->process); $ref = $target->getSourceReference(); $this->io->writeError(" Updating to ".$target->getSourceReference()); if (!$this->hasMetadataRepository($path)) { throw new \RuntimeException('The .hg directory is missing from '.$path.', see https://getcomposer.org/commit-deps for more information'); } $command = function ($url) use ($ref) { return sprintf('hg pull %s && hg up %s', ProcessExecutor::escape($url), ProcessExecutor::escape($ref)); }; $hgUtils->runCommand($command, $url, $path); } /** * {@inheritDoc} */ public function getLocalChanges(PackageInterface $package, $path) { if (!is_dir($path.'/.hg')) { return null; } $this->process->execute('hg st', $output, realpath($path)); return trim($output) ?: null; } /** * {@inheritDoc} */ protected function getCommitLogs($fromReference, $toReference, $path) { $command = sprintf('hg log -r %s:%s --style compact', ProcessExecutor::escape($fromReference), ProcessExecutor::escape($toReference)); if (0 !== $this->process->execute($command, $output, realpath($path))) { throw new \RuntimeException('Failed to execute ' . $command . "\n\n" . $this->process->getErrorOutput()); } return $output; } /** * {@inheritDoc} */ protected function hasMetadataRepository($path) { return is_dir($path . '/.hg'); } } composer/src/Composer/Downloader/PerforceDownloader.php 0000644 00000005423 14736103146 0017355 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Downloader; use Composer\Package\PackageInterface; use Composer\Repository\VcsRepository; use Composer\Util\Perforce; /** * @author Matt Whittom <Matt.Whittom@veteransunited.com> */ class PerforceDownloader extends VcsDownloader { /** @var Perforce */ protected $perforce; /** * {@inheritDoc} */ public function doDownload(PackageInterface $package, $path, $url) { $ref = $package->getSourceReference(); $label = $this->getLabelFromSourceReference($ref); $this->io->writeError('Cloning ' . $ref); $this->initPerforce($package, $path, $url); $this->perforce->setStream($ref); $this->perforce->p4Login(); $this->perforce->writeP4ClientSpec(); $this->perforce->connectClient(); $this->perforce->syncCodeBase($label); $this->perforce->cleanupClientSpec(); } private function getLabelFromSourceReference($ref) { $pos = strpos($ref, '@'); if (false !== $pos) { return substr($ref, $pos + 1); } return null; } public function initPerforce(PackageInterface $package, $path, $url) { if (!empty($this->perforce)) { $this->perforce->initializePath($path); return; } $repository = $package->getRepository(); $repoConfig = null; if ($repository instanceof VcsRepository) { $repoConfig = $this->getRepoConfig($repository); } $this->perforce = Perforce::create($repoConfig, $url, $path, $this->process, $this->io); } private function getRepoConfig(VcsRepository $repository) { return $repository->getRepoConfig(); } /** * {@inheritDoc} */ public function doUpdate(PackageInterface $initial, PackageInterface $target, $path, $url) { $this->doDownload($target, $path, $url); } /** * {@inheritDoc} */ public function getLocalChanges(PackageInterface $package, $path) { $this->io->writeError('Perforce driver does not check for local changes before overriding', true); } /** * {@inheritDoc} */ protected function getCommitLogs($fromReference, $toReference, $path) { return $this->perforce->getCommitLogs($fromReference, $toReference); } public function setPerforce($perforce) { $this->perforce = $perforce; } /** * {@inheritDoc} */ protected function hasMetadataRepository($path) { return true; } } composer/src/Composer/Downloader/PharDownloader.php 0000644 00000001651 14736103146 0016501 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Downloader; /** * Downloader for phar files * * @author Kirill chEbba Chebunin <iam@chebba.org> */ class PharDownloader extends ArchiveDownloader { /** * {@inheritDoc} */ protected function extract($file, $path) { // Can throw an UnexpectedValueException $archive = new \Phar($file); $archive->extractTo($path, null, true); /* TODO: handle openssl signed phars * https://github.com/composer/composer/pull/33#issuecomment-2250768 * https://github.com/koto/phar-util * http://blog.kotowicz.net/2010/08/hardening-php-how-to-securely-include.html */ } } composer/src/Composer/Downloader/TransportException.php 0000644 00000001761 14736103146 0017445 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Downloader; /** * @author Jordi Boggiano <j.boggiano@seld.be> */ class TransportException extends \RuntimeException { protected $headers; protected $response; protected $statusCode; public function setHeaders($headers) { $this->headers = $headers; } public function getHeaders() { return $this->headers; } public function setResponse($response) { $this->response = $response; } public function getResponse() { return $this->response; } public function setStatusCode($statusCode) { $this->statusCode = $statusCode; } public function getStatusCode() { return $this->statusCode; } } composer/src/Composer/Downloader/XzDownloader.php 0000644 00000003263 14736103146 0016211 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Downloader; use Composer\Config; use Composer\Cache; use Composer\EventDispatcher\EventDispatcher; use Composer\Package\PackageInterface; use Composer\Util\ProcessExecutor; use Composer\Util\RemoteFilesystem; use Composer\IO\IOInterface; /** * Xz archive downloader. * * @author Pavel Puchkin <i@neoascetic.me> * @author Pierre Rudloff <contact@rudloff.pro> */ class XzDownloader extends ArchiveDownloader { protected $process; public function __construct(IOInterface $io, Config $config, EventDispatcher $eventDispatcher = null, Cache $cache = null, ProcessExecutor $process = null, RemoteFilesystem $rfs = null) { $this->process = $process ?: new ProcessExecutor($io); parent::__construct($io, $config, $eventDispatcher, $cache, $rfs); } protected function extract($file, $path) { $command = 'tar -xJf ' . ProcessExecutor::escape($file) . ' -C ' . ProcessExecutor::escape($path); if (0 === $this->process->execute($command, $ignoredOutput)) { return; } $processError = 'Failed to execute ' . $command . "\n\n" . $this->process->getErrorOutput(); throw new \RuntimeException($processError); } /** * {@inheritdoc} */ protected function getFileName(PackageInterface $package, $path) { return $path.'/'.pathinfo(parse_url($package->getDistUrl(), PHP_URL_PATH), PATHINFO_BASENAME); } } composer/src/Composer/Downloader/DownloaderInterface.php 0000644 00000003365 14736103146 0017513 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Downloader; use Composer\Package\PackageInterface; /** * Downloader interface. * * @author Konstantin Kudryashov <ever.zet@gmail.com> * @author Jordi Boggiano <j.boggiano@seld.be> */ interface DownloaderInterface { /** * Returns installation source (either source or dist). * * @return string "source" or "dist" */ public function getInstallationSource(); /** * Downloads specific package into specific folder. * * @param PackageInterface $package package instance * @param string $path download path */ public function download(PackageInterface $package, $path); /** * Updates specific package in specific folder from initial to target version. * * @param PackageInterface $initial initial package * @param PackageInterface $target updated package * @param string $path download path */ public function update(PackageInterface $initial, PackageInterface $target, $path); /** * Removes specific package from specific folder. * * @param PackageInterface $package package instance * @param string $path download path */ public function remove(PackageInterface $package, $path); /** * Sets whether to output download progress information or not * * @param bool $outputProgress * @return DownloaderInterface */ public function setOutputProgress($outputProgress); } composer/src/Composer/Downloader/TarDownloader.php 0000644 00000001271 14736103146 0016333 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Downloader; /** * Downloader for tar files: tar, tar.gz or tar.bz2 * * @author Kirill chEbba Chebunin <iam@chebba.org> */ class TarDownloader extends ArchiveDownloader { /** * {@inheritDoc} */ protected function extract($file, $path) { // Can throw an UnexpectedValueException $archive = new \PharData($file); $archive->extractTo($path, null, true); } } composer/src/Composer/Downloader/FileDownloader.php 0000644 00000026227 14736103146 0016474 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Downloader; use Composer\Config; use Composer\Cache; use Composer\Factory; use Composer\IO\IOInterface; use Composer\IO\NullIO; use Composer\Package\Comparer\Comparer; use Composer\Package\PackageInterface; use Composer\Package\Version\VersionParser; use Composer\Plugin\PluginEvents; use Composer\Plugin\PreFileDownloadEvent; use Composer\EventDispatcher\EventDispatcher; use Composer\Util\Filesystem; use Composer\Util\RemoteFilesystem; use Composer\Util\Url as UrlUtil; /** * Base downloader for files * * @author Kirill chEbba Chebunin <iam@chebba.org> * @author Jordi Boggiano <j.boggiano@seld.be> * @author François Pluchino <francois.pluchino@opendisplay.com> * @author Nils Adermann <naderman@naderman.de> */ class FileDownloader implements DownloaderInterface, ChangeReportInterface { protected $io; protected $config; protected $rfs; protected $filesystem; protected $cache; protected $outputProgress = true; private $lastCacheWrites = array(); private $eventDispatcher; /** * Constructor. * * @param IOInterface $io The IO instance * @param Config $config The config * @param EventDispatcher $eventDispatcher The event dispatcher * @param Cache $cache Optional cache instance * @param RemoteFilesystem $rfs The remote filesystem * @param Filesystem $filesystem The filesystem */ public function __construct(IOInterface $io, Config $config, EventDispatcher $eventDispatcher = null, Cache $cache = null, RemoteFilesystem $rfs = null, Filesystem $filesystem = null) { $this->io = $io; $this->config = $config; $this->eventDispatcher = $eventDispatcher; $this->rfs = $rfs ?: Factory::createRemoteFilesystem($this->io, $config); $this->filesystem = $filesystem ?: new Filesystem(); $this->cache = $cache; if ($this->cache && $this->cache->gcIsNecessary()) { $this->cache->gc($config->get('cache-files-ttl'), $config->get('cache-files-maxsize')); } } /** * {@inheritDoc} */ public function getInstallationSource() { return 'dist'; } /** * {@inheritDoc} */ public function download(PackageInterface $package, $path, $output = true) { if (!$package->getDistUrl()) { throw new \InvalidArgumentException('The given package is missing url information'); } if ($output) { $this->io->writeError(" - Installing <info>" . $package->getName() . "</info> (<comment>" . $package->getFullPrettyVersion() . "</comment>): ", false); } $urls = $package->getDistUrls(); while ($url = array_shift($urls)) { try { $fileName = $this->doDownload($package, $path, $url); break; } catch (\Exception $e) { if ($this->io->isDebug()) { $this->io->writeError(''); $this->io->writeError('Failed: ['.get_class($e).'] '.$e->getCode().': '.$e->getMessage()); } elseif (count($urls)) { $this->io->writeError(''); $this->io->writeError(' Failed, trying the next URL ('.$e->getCode().': '.$e->getMessage().')', false); } if (!count($urls)) { throw $e; } } } if ($output) { $this->io->writeError(''); } return $fileName; } protected function doDownload(PackageInterface $package, $path, $url) { $this->filesystem->emptyDirectory($path); $fileName = $this->getFileName($package, $path); $processedUrl = $this->processUrl($package, $url); $origin = RemoteFilesystem::getOrigin($processedUrl); $preFileDownloadEvent = new PreFileDownloadEvent(PluginEvents::PRE_FILE_DOWNLOAD, $this->rfs, $processedUrl); if ($this->eventDispatcher) { $this->eventDispatcher->dispatch($preFileDownloadEvent->getName(), $preFileDownloadEvent); } $rfs = $preFileDownloadEvent->getRemoteFilesystem(); try { $checksum = $package->getDistSha1Checksum(); $cacheKey = $this->getCacheKey($package, $processedUrl); // use from cache if it is present and has a valid checksum or we have no checksum to check against if ($this->cache && (!$checksum || $checksum === $this->cache->sha1($cacheKey)) && $this->cache->copyTo($cacheKey, $fileName)) { $this->io->writeError('Loading from cache', false); } else { // download if cache restore failed if (!$this->outputProgress) { $this->io->writeError('Downloading', false); } // try to download 3 times then fail hard $retries = 3; while ($retries--) { try { $rfs->copy($origin, $processedUrl, $fileName, $this->outputProgress, $package->getTransportOptions()); break; } catch (TransportException $e) { // if we got an http response with a proper code, then requesting again will probably not help, abort if ((0 !== $e->getCode() && !in_array($e->getCode(), array(500, 502, 503, 504))) || !$retries) { throw $e; } $this->io->writeError(''); $this->io->writeError(' Download failed, retrying...', true, IOInterface::VERBOSE); usleep(500000); } } if (!$this->outputProgress) { $this->io->writeError(' (<comment>100%</comment>)', false); } if ($this->cache) { $this->lastCacheWrites[$package->getName()] = $cacheKey; $this->cache->copyFrom($cacheKey, $fileName); } } if (!file_exists($fileName)) { throw new \UnexpectedValueException($url.' could not be saved to '.$fileName.', make sure the' .' directory is writable and you have internet connectivity'); } if ($checksum && hash_file('sha1', $fileName) !== $checksum) { throw new \UnexpectedValueException('The checksum verification of the file failed (downloaded from '.$url.')'); } } catch (\Exception $e) { // clean up $this->filesystem->removeDirectory($path); $this->clearLastCacheWrite($package); throw $e; } return $fileName; } /** * {@inheritDoc} */ public function setOutputProgress($outputProgress) { $this->outputProgress = $outputProgress; return $this; } protected function clearLastCacheWrite(PackageInterface $package) { if ($this->cache && isset($this->lastCacheWrites[$package->getName()])) { $this->cache->remove($this->lastCacheWrites[$package->getName()]); unset($this->lastCacheWrites[$package->getName()]); } } /** * {@inheritDoc} */ public function update(PackageInterface $initial, PackageInterface $target, $path) { $name = $target->getName(); $from = $initial->getFullPrettyVersion(); $to = $target->getFullPrettyVersion(); $actionName = VersionParser::isUpgrade($initial->getVersion(), $target->getVersion()) ? 'Updating' : 'Downgrading'; $this->io->writeError(" - " . $actionName . " <info>" . $name . "</info> (<comment>" . $from . "</comment> => <comment>" . $to . "</comment>): ", false); $this->remove($initial, $path, false); $this->download($target, $path, false); $this->io->writeError(''); } /** * {@inheritDoc} */ public function remove(PackageInterface $package, $path, $output = true) { if ($output) { $this->io->writeError(" - Removing <info>" . $package->getName() . "</info> (<comment>" . $package->getFullPrettyVersion() . "</comment>)"); } if (!$this->filesystem->removeDirectory($path)) { throw new \RuntimeException('Could not completely delete '.$path.', aborting.'); } } /** * Gets file name for specific package * * @param PackageInterface $package package instance * @param string $path download path * @return string file name */ protected function getFileName(PackageInterface $package, $path) { return $path.'/'.pathinfo(parse_url($package->getDistUrl(), PHP_URL_PATH), PATHINFO_BASENAME); } /** * Process the download url * * @param PackageInterface $package package the url is coming from * @param string $url download url * @throws \RuntimeException If any problem with the url * @return string url */ protected function processUrl(PackageInterface $package, $url) { if (!extension_loaded('openssl') && 0 === strpos($url, 'https:')) { throw new \RuntimeException('You must enable the openssl extension to download files via https'); } if ($package->getDistReference()) { $url = UrlUtil::updateDistReference($this->config, $url, $package->getDistReference()); } return $url; } private function getCacheKey(PackageInterface $package, $processedUrl) { // we use the complete download url here to avoid conflicting entries // from different packages, which would potentially allow a given package // in a third party repo to pre-populate the cache for the same package in // packagist for example. $cacheKey = sha1($processedUrl); return $package->getName().'/'.$cacheKey.'.'.$package->getDistType(); } /** * {@inheritDoc} * @throws \RuntimeException */ public function getLocalChanges(PackageInterface $package, $targetDir) { $prevIO = $this->io; $prevProgress = $this->outputProgress; $this->io = new NullIO; $this->io->loadConfiguration($this->config); $this->outputProgress = false; $e = null; try { $this->download($package, $targetDir.'_compare', false); $comparer = new Comparer(); $comparer->setSource($targetDir.'_compare'); $comparer->setUpdate($targetDir); $comparer->doCompare(); $output = $comparer->getChanged(true, true); $this->filesystem->removeDirectory($targetDir.'_compare'); } catch (\Exception $e) { } $this->io = $prevIO; $this->outputProgress = $prevProgress; if ($e) { throw $e; } return trim($output); } } composer/src/Composer/Downloader/ArchiveDownloader.php 0000644 00000011044 14736103146 0017165 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Downloader; use Composer\Package\PackageInterface; use Symfony\Component\Finder\Finder; use Composer\IO\IOInterface; /** * Base downloader for archives * * @author Kirill chEbba Chebunin <iam@chebba.org> * @author Jordi Boggiano <j.boggiano@seld.be> * @author François Pluchino <francois.pluchino@opendisplay.com> */ abstract class ArchiveDownloader extends FileDownloader { /** * {@inheritDoc} * @throws \RuntimeException * @throws \UnexpectedValueException */ public function download(PackageInterface $package, $path, $output = true) { $temporaryDir = $this->config->get('vendor-dir').'/composer/'.substr(md5(uniqid('', true)), 0, 8); $retries = 3; while ($retries--) { $fileName = parent::download($package, $path, $output); if ($output) { $this->io->writeError(' Extracting archive', false, IOInterface::VERBOSE); } try { $this->filesystem->ensureDirectoryExists($temporaryDir); try { $this->extract($fileName, $temporaryDir); } catch (\Exception $e) { // remove cache if the file was corrupted parent::clearLastCacheWrite($package); throw $e; } $this->filesystem->unlink($fileName); $contentDir = $this->getFolderContent($temporaryDir); // only one dir in the archive, extract its contents out of it if (1 === count($contentDir) && is_dir(reset($contentDir))) { $contentDir = $this->getFolderContent((string) reset($contentDir)); } // move files back out of the temp dir foreach ($contentDir as $file) { $file = (string) $file; $this->filesystem->rename($file, $path . '/' . basename($file)); } $this->filesystem->removeDirectory($temporaryDir); if ($this->filesystem->isDirEmpty($this->config->get('vendor-dir').'/composer/')) { $this->filesystem->removeDirectory($this->config->get('vendor-dir').'/composer/'); } if ($this->filesystem->isDirEmpty($this->config->get('vendor-dir'))) { $this->filesystem->removeDirectory($this->config->get('vendor-dir')); } } catch (\Exception $e) { // clean up $this->filesystem->removeDirectory($path); $this->filesystem->removeDirectory($temporaryDir); // retry downloading if we have an invalid zip file if ($retries && $e instanceof \UnexpectedValueException && class_exists('ZipArchive') && $e->getCode() === \ZipArchive::ER_NOZIP) { $this->io->writeError(''); if ($this->io->isDebug()) { $this->io->writeError(' Invalid zip file ('.$e->getMessage().'), retrying...'); } else { $this->io->writeError(' Invalid zip file, retrying...'); } usleep(500000); continue; } throw $e; } break; } } /** * {@inheritdoc} */ protected function getFileName(PackageInterface $package, $path) { return rtrim($path.'/'.md5($path.spl_object_hash($package)).'.'.pathinfo(parse_url($package->getDistUrl(), PHP_URL_PATH), PATHINFO_EXTENSION), '.'); } /** * Extract file to directory * * @param string $file Extracted file * @param string $path Directory * * @throws \UnexpectedValueException If can not extract downloaded file to path */ abstract protected function extract($file, $path); /** * Returns the folder content, excluding dotfiles * * @param string $dir Directory * @return \SplFileInfo[] */ private function getFolderContent($dir) { $finder = Finder::create() ->ignoreVCS(false) ->ignoreDotFiles(false) ->notName('.DS_Store') ->depth(0) ->in($dir); return iterator_to_array($finder); } } composer/src/Composer/Downloader/PathDownloader.php 0000644 00000022012 14736103146 0016475 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Downloader; use Composer\Package\Archiver\ArchivableFilesFinder; use Composer\Package\Dumper\ArrayDumper; use Composer\Package\PackageInterface; use Composer\Package\Version\VersionGuesser; use Composer\Package\Version\VersionParser; use Composer\Util\Platform; use Composer\Util\ProcessExecutor; use Composer\Util\Filesystem as ComposerFilesystem; use Symfony\Component\Filesystem\Exception\IOException; use Symfony\Component\Filesystem\Filesystem; /** * Download a package from a local path. * * @author Samuel Roze <samuel.roze@gmail.com> * @author Johann Reinke <johann.reinke@gmail.com> */ class PathDownloader extends FileDownloader implements VcsCapableDownloaderInterface { const STRATEGY_SYMLINK = 10; const STRATEGY_MIRROR = 20; /** * {@inheritdoc} */ public function download(PackageInterface $package, $path, $output = true) { $url = $package->getDistUrl(); $realUrl = realpath($url); if (false === $realUrl || !file_exists($realUrl) || !is_dir($realUrl)) { throw new \RuntimeException(sprintf( 'Source path "%s" is not found for package %s', $url, $package->getName() )); } if (realpath($path) === $realUrl) { if ($output) { $this->io->writeError(sprintf( ' - Installing <info>%s</info> (<comment>%s</comment>): Source already present', $package->getName(), $package->getFullPrettyVersion() )); } return; } if (strpos(realpath($path) . DIRECTORY_SEPARATOR, $realUrl . DIRECTORY_SEPARATOR) === 0) { // IMPORTANT NOTICE: If you wish to change this, don't. You are wasting your time and ours. // // Please see https://github.com/composer/composer/pull/5974 and https://github.com/composer/composer/pull/6174 // for previous attempts that were shut down because they did not work well enough or introduced too many risks. throw new \RuntimeException(sprintf( 'Package %s cannot install to "%s" inside its source at "%s"', $package->getName(), realpath($path), $realUrl )); } // Get the transport options with default values $transportOptions = $package->getTransportOptions() + array('symlink' => null, 'relative' => true); // When symlink transport option is null, both symlink and mirror are allowed $currentStrategy = self::STRATEGY_SYMLINK; $allowedStrategies = array(self::STRATEGY_SYMLINK, self::STRATEGY_MIRROR); $mirrorPathRepos = getenv('COMPOSER_MIRROR_PATH_REPOS'); if ($mirrorPathRepos) { $currentStrategy = self::STRATEGY_MIRROR; } if (true === $transportOptions['symlink']) { $currentStrategy = self::STRATEGY_SYMLINK; $allowedStrategies = array(self::STRATEGY_SYMLINK); } elseif (false === $transportOptions['symlink']) { $currentStrategy = self::STRATEGY_MIRROR; $allowedStrategies = array(self::STRATEGY_MIRROR); } // Check we can use junctions safely if we are on Windows if (Platform::isWindows() && self::STRATEGY_SYMLINK === $currentStrategy && !$this->safeJunctions()) { $currentStrategy = self::STRATEGY_MIRROR; $allowedStrategies = array(self::STRATEGY_MIRROR); } $fileSystem = new Filesystem(); $this->filesystem->removeDirectory($path); if ($output) { $this->io->writeError(sprintf( ' - Installing <info>%s</info> (<comment>%s</comment>): ', $package->getName(), $package->getFullPrettyVersion() ), false); } $isFallback = false; if (self::STRATEGY_SYMLINK == $currentStrategy) { try { if (Platform::isWindows()) { // Implement symlinks as NTFS junctions on Windows $this->io->writeError(sprintf('Junctioning from %s', $url), false); $this->filesystem->junction($realUrl, $path); } else { $absolutePath = $path; if (!$this->filesystem->isAbsolutePath($absolutePath)) { $absolutePath = getcwd() . DIRECTORY_SEPARATOR . $path; } $shortestPath = $this->filesystem->findShortestPath($absolutePath, $realUrl); $path = rtrim($path, "/"); $this->io->writeError(sprintf('Symlinking from %s', $url), false); if ($transportOptions['relative']) { $fileSystem->symlink($shortestPath, $path); } else { $fileSystem->symlink($realUrl, $path); } } } catch (IOException $e) { if (in_array(self::STRATEGY_MIRROR, $allowedStrategies)) { $this->io->writeError(''); $this->io->writeError(' <error>Symlink failed, fallback to use mirroring!</error>'); $currentStrategy = self::STRATEGY_MIRROR; $isFallback = true; } else { throw new \RuntimeException(sprintf('Symlink from "%s" to "%s" failed!', $realUrl, $path)); } } } // Fallback if symlink failed or if symlink is not allowed for the package if (self::STRATEGY_MIRROR == $currentStrategy) { $fs = new ComposerFilesystem(); $realUrl = $fs->normalizePath($realUrl); $this->io->writeError(sprintf('%sMirroring from %s', $isFallback ? ' ' : '', $url), false); $iterator = new ArchivableFilesFinder($realUrl, array()); $fileSystem->mirror($realUrl, $path, $iterator); } $this->io->writeError(''); } /** * {@inheritDoc} */ public function remove(PackageInterface $package, $path, $output = true) { $realUrl = realpath($package->getDistUrl()); if (realpath($path) === $realUrl) { if ($output) { $this->io->writeError(" - Removing <info>" . $package->getName() . "</info> (<comment>" . $package->getFullPrettyVersion() . "</comment>), source is still present in $path"); } return; } /** * For junctions don't blindly rely on Filesystem::removeDirectory as it may be overzealous. If a process * inadvertently locks the file the removal will fail, but it would fall back to recursive delete which * is disastrous within a junction. So in that case we have no other real choice but to fail hard. */ if (Platform::isWindows() && $this->filesystem->isJunction($path)) { if ($output) { $this->io->writeError(" - Removing junction for <info>" . $package->getName() . "</info> (<comment>" . $package->getFullPrettyVersion() . "</comment>)"); } if (!$this->filesystem->removeJunction($path)) { $this->io->writeError(" <warning>Could not remove junction at " . $path . " - is another process locking it?</warning>"); throw new \RuntimeException('Could not reliably remove junction for package ' . $package->getName()); } } else { parent::remove($package, $path, $output); } } /** * {@inheritDoc} */ public function getVcsReference(PackageInterface $package, $path) { $parser = new VersionParser; $guesser = new VersionGuesser($this->config, new ProcessExecutor($this->io), $parser); $dumper = new ArrayDumper; $packageConfig = $dumper->dump($package); if ($packageVersion = $guesser->guessVersion($packageConfig, $path)) { return $packageVersion['commit']; } } /** * Returns true if junctions can be created and safely used on Windows * * A PHP bug makes junction detection fragile, leading to possible data loss * when removing a package. See https://bugs.php.net/bug.php?id=77552 * * For safety we require a minimum version of Windows 7, so we can call the * system rmdir which will preserve target content if given a junction. * * The PHP bug was fixed in 7.2.16 and 7.3.3 (requires at least Windows 7). * * @return bool */ private function safeJunctions() { // We need to call mklink, and rmdir on Windows 7 (version 6.1) return function_exists('proc_open') && (PHP_WINDOWS_VERSION_MAJOR > 6 || (PHP_WINDOWS_VERSION_MAJOR === 6 && PHP_WINDOWS_VERSION_MINOR >= 1)); } } composer/src/Composer/Autoload/AutoloadGenerator.php 0000644 00000110406 14736103146 0016660 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Autoload; use Composer\Config; use Composer\EventDispatcher\EventDispatcher; use Composer\Installer\InstallationManager; use Composer\IO\IOInterface; use Composer\Package\AliasPackage; use Composer\Package\PackageInterface; use Composer\Repository\InstalledRepositoryInterface; use Composer\Util\Filesystem; use Composer\Script\ScriptEvents; use Composer\Util\PackageSorter; /** * @author Igor Wiedler <igor@wiedler.ch> * @author Jordi Boggiano <j.boggiano@seld.be> */ class AutoloadGenerator { /** * @var EventDispatcher */ private $eventDispatcher; /** * @var IOInterface */ private $io; /** * @var bool */ private $devMode = false; /** * @var bool */ private $classMapAuthoritative = false; /** * @var bool */ private $apcu = false; /** * @var bool */ private $runScripts = false; public function __construct(EventDispatcher $eventDispatcher, IOInterface $io = null) { $this->eventDispatcher = $eventDispatcher; $this->io = $io; } public function setDevMode($devMode = true) { $this->devMode = (bool) $devMode; } /** * Whether or not generated autoloader considers the class map * authoritative. * * @param bool $classMapAuthoritative */ public function setClassMapAuthoritative($classMapAuthoritative) { $this->classMapAuthoritative = (bool) $classMapAuthoritative; } /** * Whether or not generated autoloader considers APCu caching. * * @param bool $apcu */ public function setApcu($apcu) { $this->apcu = (bool) $apcu; } /** * Set whether to run scripts or not * * @param bool $runScripts */ public function setRunScripts($runScripts = true) { $this->runScripts = (bool) $runScripts; } public function dump(Config $config, InstalledRepositoryInterface $localRepo, PackageInterface $mainPackage, InstallationManager $installationManager, $targetDir, $scanPsrPackages = false, $suffix = '') { if ($this->classMapAuthoritative) { // Force scanPsrPackages when classmap is authoritative $scanPsrPackages = true; } if ($this->runScripts) { $this->eventDispatcher->dispatchScript(ScriptEvents::PRE_AUTOLOAD_DUMP, $this->devMode, array(), array( 'optimize' => (bool) $scanPsrPackages, )); } $filesystem = new Filesystem(); $filesystem->ensureDirectoryExists($config->get('vendor-dir')); // Do not remove double realpath() calls. // Fixes failing Windows realpath() implementation. // See https://bugs.php.net/bug.php?id=72738 $basePath = $filesystem->normalizePath(realpath(realpath(getcwd()))); $vendorPath = $filesystem->normalizePath(realpath(realpath($config->get('vendor-dir')))); $useGlobalIncludePath = (bool) $config->get('use-include-path'); $prependAutoloader = $config->get('prepend-autoloader') === false ? 'false' : 'true'; $targetDir = $vendorPath.'/'.$targetDir; $filesystem->ensureDirectoryExists($targetDir); $vendorPathCode = $filesystem->findShortestPathCode(realpath($targetDir), $vendorPath, true); $vendorPathCode52 = str_replace('__DIR__', 'dirname(__FILE__)', $vendorPathCode); $vendorPathToTargetDirCode = $filesystem->findShortestPathCode($vendorPath, realpath($targetDir), true); $appBaseDirCode = $filesystem->findShortestPathCode($vendorPath, $basePath, true); $appBaseDirCode = str_replace('__DIR__', '$vendorDir', $appBaseDirCode); $namespacesFile = <<<EOF <?php // autoload_namespaces.php @generated by Composer \$vendorDir = $vendorPathCode52; \$baseDir = $appBaseDirCode; return array( EOF; $psr4File = <<<EOF <?php // autoload_psr4.php @generated by Composer \$vendorDir = $vendorPathCode52; \$baseDir = $appBaseDirCode; return array( EOF; // Collect information from all packages. $packageMap = $this->buildPackageMap($installationManager, $mainPackage, $localRepo->getCanonicalPackages()); $autoloads = $this->parseAutoloads($packageMap, $mainPackage, $this->devMode === false); // Process the 'psr-0' base directories. foreach ($autoloads['psr-0'] as $namespace => $paths) { $exportedPaths = array(); foreach ($paths as $path) { $exportedPaths[] = $this->getPathCode($filesystem, $basePath, $vendorPath, $path); } $exportedPrefix = var_export($namespace, true); $namespacesFile .= " $exportedPrefix => "; $namespacesFile .= "array(".implode(', ', $exportedPaths)."),\n"; } $namespacesFile .= ");\n"; // Process the 'psr-4' base directories. foreach ($autoloads['psr-4'] as $namespace => $paths) { $exportedPaths = array(); foreach ($paths as $path) { $exportedPaths[] = $this->getPathCode($filesystem, $basePath, $vendorPath, $path); } $exportedPrefix = var_export($namespace, true); $psr4File .= " $exportedPrefix => "; $psr4File .= "array(".implode(', ', $exportedPaths)."),\n"; } $psr4File .= ");\n"; $classmapFile = <<<EOF <?php // autoload_classmap.php @generated by Composer \$vendorDir = $vendorPathCode52; \$baseDir = $appBaseDirCode; return array( EOF; // add custom psr-0 autoloading if the root package has a target dir $targetDirLoader = null; $mainAutoload = $mainPackage->getAutoload(); if ($mainPackage->getTargetDir() && !empty($mainAutoload['psr-0'])) { $levels = substr_count($filesystem->normalizePath($mainPackage->getTargetDir()), '/') + 1; $prefixes = implode(', ', array_map(function ($prefix) { return var_export($prefix, true); }, array_keys($mainAutoload['psr-0']))); $baseDirFromTargetDirCode = $filesystem->findShortestPathCode($targetDir, $basePath, true); $targetDirLoader = <<<EOF public static function autoload(\$class) { \$dir = $baseDirFromTargetDirCode . '/'; \$prefixes = array($prefixes); foreach (\$prefixes as \$prefix) { if (0 !== strpos(\$class, \$prefix)) { continue; } \$path = \$dir . implode('/', array_slice(explode('\\\\', \$class), $levels)).'.php'; if (!\$path = stream_resolve_include_path(\$path)) { return false; } require \$path; return true; } } EOF; } $blacklist = null; if (!empty($autoloads['exclude-from-classmap'])) { $blacklist = '{(' . implode('|', $autoloads['exclude-from-classmap']) . ')}'; } $classMap = array(); $ambiguousClasses = array(); $scannedFiles = array(); foreach ($autoloads['classmap'] as $dir) { $classMap = $this->addClassMapCode($filesystem, $basePath, $vendorPath, $dir, $blacklist, null, null, $classMap, $ambiguousClasses, $scannedFiles); } if ($scanPsrPackages) { $namespacesToScan = array(); // Scan the PSR-0/4 directories for class files, and add them to the class map foreach (array('psr-4', 'psr-0') as $psrType) { foreach ($autoloads[$psrType] as $namespace => $paths) { $namespacesToScan[$namespace][] = array('paths' => $paths, 'type' => $psrType); } } krsort($namespacesToScan); foreach ($namespacesToScan as $namespace => $groups) { foreach ($groups as $group) { foreach ($group['paths'] as $dir) { $dir = $filesystem->normalizePath($filesystem->isAbsolutePath($dir) ? $dir : $basePath.'/'.$dir); if (!is_dir($dir)) { continue; } $classMap = $this->addClassMapCode($filesystem, $basePath, $vendorPath, $dir, $blacklist, $namespace, $group['type'], $classMap, $ambiguousClasses, $scannedFiles); } } } } foreach ($ambiguousClasses as $className => $ambigiousPaths) { $cleanPath = str_replace(array('$vendorDir . \'', '$baseDir . \'', "',\n"), array($vendorPath, $basePath, ''), $classMap[$className]); $this->io->writeError( '<warning>Warning: Ambiguous class resolution, "'.$className.'"'. ' was found '. (count($ambigiousPaths) + 1) .'x: in "'.$cleanPath.'" and "'. implode('", "', $ambigiousPaths) .'", the first will be used.</warning>' ); } ksort($classMap); foreach ($classMap as $class => $code) { $classmapFile .= ' '.var_export($class, true).' => '.$code; } $classmapFile .= ");\n"; if (!$suffix) { if (!$config->get('autoloader-suffix') && is_readable($vendorPath.'/autoload.php')) { $content = file_get_contents($vendorPath.'/autoload.php'); if (preg_match('{ComposerAutoloaderInit([^:\s]+)::}', $content, $match)) { $suffix = $match[1]; } } if (!$suffix) { $suffix = $config->get('autoloader-suffix') ?: md5(uniqid('', true)); } } $this->filePutContentsIfModified($targetDir.'/autoload_namespaces.php', $namespacesFile); $this->filePutContentsIfModified($targetDir.'/autoload_psr4.php', $psr4File); $this->filePutContentsIfModified($targetDir.'/autoload_classmap.php', $classmapFile); $includePathFilePath = $targetDir.'/include_paths.php'; if ($includePathFileContents = $this->getIncludePathsFile($packageMap, $filesystem, $basePath, $vendorPath, $vendorPathCode52, $appBaseDirCode)) { $this->filePutContentsIfModified($includePathFilePath, $includePathFileContents); } elseif (file_exists($includePathFilePath)) { unlink($includePathFilePath); } $includeFilesFilePath = $targetDir.'/autoload_files.php'; if ($includeFilesFileContents = $this->getIncludeFilesFile($autoloads['files'], $filesystem, $basePath, $vendorPath, $vendorPathCode52, $appBaseDirCode)) { $this->filePutContentsIfModified($includeFilesFilePath, $includeFilesFileContents); } elseif (file_exists($includeFilesFilePath)) { unlink($includeFilesFilePath); } $this->filePutContentsIfModified($targetDir.'/autoload_static.php', $this->getStaticFile($suffix, $targetDir, $vendorPath, $basePath, $staticPhpVersion)); $this->filePutContentsIfModified($vendorPath.'/autoload.php', $this->getAutoloadFile($vendorPathToTargetDirCode, $suffix)); $this->filePutContentsIfModified($targetDir.'/autoload_real.php', $this->getAutoloadRealFile(true, (bool) $includePathFileContents, $targetDirLoader, (bool) $includeFilesFileContents, $vendorPathCode, $appBaseDirCode, $suffix, $useGlobalIncludePath, $prependAutoloader, $staticPhpVersion)); $this->safeCopy(__DIR__.'/ClassLoader.php', $targetDir.'/ClassLoader.php'); $this->safeCopy(__DIR__.'/../../../LICENSE', $targetDir.'/LICENSE'); if ($this->runScripts) { $this->eventDispatcher->dispatchScript(ScriptEvents::POST_AUTOLOAD_DUMP, $this->devMode, array(), array( 'optimize' => (bool) $scanPsrPackages, )); } return count($classMap); } private function filePutContentsIfModified($path, $content) { $currentContent = @file_get_contents($path); if (!$currentContent || ($currentContent != $content)) { return file_put_contents($path, $content); } return 0; } private function addClassMapCode($filesystem, $basePath, $vendorPath, $dir, $blacklist, $namespaceFilter, $autoloadType, array $classMap, array &$ambiguousClasses, array &$scannedFiles) { foreach ($this->generateClassMap($dir, $blacklist, $namespaceFilter, $autoloadType, true, $scannedFiles) as $class => $path) { $pathCode = $this->getPathCode($filesystem, $basePath, $vendorPath, $path).",\n"; if (!isset($classMap[$class])) { $classMap[$class] = $pathCode; } elseif ($this->io && $classMap[$class] !== $pathCode && !preg_match('{/(test|fixture|example|stub)s?/}i', strtr($classMap[$class].' '.$path, '\\', '/'))) { $ambiguousClasses[$class][] = $path; } } return $classMap; } private function generateClassMap($dir, $blacklist, $namespaceFilter, $autoloadType, $showAmbiguousWarning, array &$scannedFiles) { return ClassMapGenerator::createMap($dir, $blacklist, $showAmbiguousWarning ? $this->io : null, $namespaceFilter, $autoloadType, $scannedFiles); } public function buildPackageMap(InstallationManager $installationManager, PackageInterface $mainPackage, array $packages) { // build package => install path map $packageMap = array(array($mainPackage, '')); foreach ($packages as $package) { if ($package instanceof AliasPackage) { continue; } $this->validatePackage($package); $packageMap[] = array( $package, $installationManager->getInstallPath($package), ); } return $packageMap; } /** * @param PackageInterface $package * * @throws \InvalidArgumentException Throws an exception, if the package has illegal settings. */ protected function validatePackage(PackageInterface $package) { $autoload = $package->getAutoload(); if (!empty($autoload['psr-4']) && null !== $package->getTargetDir()) { $name = $package->getName(); $package->getTargetDir(); throw new \InvalidArgumentException("PSR-4 autoloading is incompatible with the target-dir property, remove the target-dir in package '$name'."); } if (!empty($autoload['psr-4'])) { foreach ($autoload['psr-4'] as $namespace => $dirs) { if ($namespace !== '' && '\\' !== substr($namespace, -1)) { throw new \InvalidArgumentException("psr-4 namespaces must end with a namespace separator, '$namespace' does not, use '$namespace\\'."); } } } } /** * Compiles an ordered list of namespace => path mappings * * @param array $packageMap array of array(package, installDir-relative-to-composer.json) * @param PackageInterface $mainPackage root package instance * @param bool $filterOutRequireDevPackages whether to filter out require-dev packages * @return array array('psr-0' => array('Ns\\Foo' => array('installDir'))) */ public function parseAutoloads(array $packageMap, PackageInterface $mainPackage, $filterOutRequireDevPackages = false) { $mainPackageMap = array_shift($packageMap); if ($filterOutRequireDevPackages) { $packageMap = $this->filterPackageMap($packageMap, $mainPackage); } $sortedPackageMap = $this->sortPackageMap($packageMap); $sortedPackageMap[] = $mainPackageMap; array_unshift($packageMap, $mainPackageMap); $psr0 = $this->parseAutoloadsType($packageMap, 'psr-0', $mainPackage); $psr4 = $this->parseAutoloadsType($packageMap, 'psr-4', $mainPackage); $classmap = $this->parseAutoloadsType(array_reverse($sortedPackageMap), 'classmap', $mainPackage); $files = $this->parseAutoloadsType($sortedPackageMap, 'files', $mainPackage); $exclude = $this->parseAutoloadsType($sortedPackageMap, 'exclude-from-classmap', $mainPackage); krsort($psr0); krsort($psr4); return array( 'psr-0' => $psr0, 'psr-4' => $psr4, 'classmap' => $classmap, 'files' => $files, 'exclude-from-classmap' => $exclude, ); } /** * Registers an autoloader based on an autoload map returned by parseAutoloads * * @param array $autoloads see parseAutoloads return value * @return ClassLoader */ public function createLoader(array $autoloads) { $loader = new ClassLoader(); if (isset($autoloads['psr-0'])) { foreach ($autoloads['psr-0'] as $namespace => $path) { $loader->add($namespace, $path); } } if (isset($autoloads['psr-4'])) { foreach ($autoloads['psr-4'] as $namespace => $path) { $loader->addPsr4($namespace, $path); } } if (isset($autoloads['classmap'])) { $blacklist = null; if (!empty($autoloads['exclude-from-classmap'])) { $blacklist = '{(' . implode('|', $autoloads['exclude-from-classmap']) . ')}'; } $scannedFiles = array(); foreach ($autoloads['classmap'] as $dir) { try { $loader->addClassMap($this->generateClassMap($dir, $blacklist, null, null, false, $scannedFiles)); } catch (\RuntimeException $e) { $this->io->writeError('<warning>'.$e->getMessage().'</warning>'); } } } return $loader; } protected function getIncludePathsFile(array $packageMap, Filesystem $filesystem, $basePath, $vendorPath, $vendorPathCode, $appBaseDirCode) { $includePaths = array(); foreach ($packageMap as $item) { list($package, $installPath) = $item; if (null !== $package->getTargetDir() && strlen($package->getTargetDir()) > 0) { $installPath = substr($installPath, 0, -strlen('/'.$package->getTargetDir())); } foreach ($package->getIncludePaths() as $includePath) { $includePath = trim($includePath, '/'); $includePaths[] = empty($installPath) ? $includePath : $installPath.'/'.$includePath; } } if (!$includePaths) { return; } $includePathsCode = ''; foreach ($includePaths as $path) { $includePathsCode .= " " . $this->getPathCode($filesystem, $basePath, $vendorPath, $path) . ",\n"; } return <<<EOF <?php // include_paths.php @generated by Composer \$vendorDir = $vendorPathCode; \$baseDir = $appBaseDirCode; return array( $includePathsCode); EOF; } protected function getIncludeFilesFile(array $files, Filesystem $filesystem, $basePath, $vendorPath, $vendorPathCode, $appBaseDirCode) { $filesCode = ''; foreach ($files as $fileIdentifier => $functionFile) { $filesCode .= ' ' . var_export($fileIdentifier, true) . ' => ' . $this->getPathCode($filesystem, $basePath, $vendorPath, $functionFile) . ",\n"; } if (!$filesCode) { return false; } return <<<EOF <?php // autoload_files.php @generated by Composer \$vendorDir = $vendorPathCode; \$baseDir = $appBaseDirCode; return array( $filesCode); EOF; } protected function getPathCode(Filesystem $filesystem, $basePath, $vendorPath, $path) { if (!$filesystem->isAbsolutePath($path)) { $path = $basePath . '/' . $path; } $path = $filesystem->normalizePath($path); $baseDir = ''; if (strpos($path.'/', $vendorPath.'/') === 0) { $path = substr($path, strlen($vendorPath)); $baseDir = '$vendorDir'; if ($path !== false) { $baseDir .= " . "; } } else { $path = $filesystem->normalizePath($filesystem->findShortestPath($basePath, $path, true)); if (!$filesystem->isAbsolutePath($path)) { $baseDir = '$baseDir . '; $path = '/' . $path; } } if (strpos($path, '.phar') !== false) { $baseDir = "'phar://' . " . $baseDir; } return $baseDir . (($path !== false) ? var_export($path, true) : ""); } protected function getAutoloadFile($vendorPathToTargetDirCode, $suffix) { $lastChar = $vendorPathToTargetDirCode[strlen($vendorPathToTargetDirCode) - 1]; if ("'" === $lastChar || '"' === $lastChar) { $vendorPathToTargetDirCode = substr($vendorPathToTargetDirCode, 0, -1).'/autoload_real.php'.$lastChar; } else { $vendorPathToTargetDirCode .= " . '/autoload_real.php'"; } return <<<AUTOLOAD <?php // autoload.php @generated by Composer require_once $vendorPathToTargetDirCode; return ComposerAutoloaderInit$suffix::getLoader(); AUTOLOAD; } protected function getAutoloadRealFile($useClassMap, $useIncludePath, $targetDirLoader, $useIncludeFiles, $vendorPathCode, $appBaseDirCode, $suffix, $useGlobalIncludePath, $prependAutoloader, $staticPhpVersion = 70000) { $file = <<<HEADER <?php // autoload_real.php @generated by Composer class ComposerAutoloaderInit$suffix { private static \$loader; public static function loadClassLoader(\$class) { if ('Composer\\Autoload\\ClassLoader' === \$class) { require __DIR__ . '/ClassLoader.php'; } } /** * @return \Composer\Autoload\ClassLoader */ public static function getLoader() { if (null !== self::\$loader) { return self::\$loader; } spl_autoload_register(array('ComposerAutoloaderInit$suffix', 'loadClassLoader'), true, $prependAutoloader); self::\$loader = \$loader = new \\Composer\\Autoload\\ClassLoader(); spl_autoload_unregister(array('ComposerAutoloaderInit$suffix', 'loadClassLoader')); HEADER; if ($useIncludePath) { $file .= <<<'INCLUDE_PATH' $includePaths = require __DIR__ . '/include_paths.php'; $includePaths[] = get_include_path(); set_include_path(implode(PATH_SEPARATOR, $includePaths)); INCLUDE_PATH; } $file .= <<<STATIC_INIT \$useStaticLoader = PHP_VERSION_ID >= $staticPhpVersion && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); if (\$useStaticLoader) { require_once __DIR__ . '/autoload_static.php'; call_user_func(\Composer\Autoload\ComposerStaticInit$suffix::getInitializer(\$loader)); } else { STATIC_INIT; if (!$this->classMapAuthoritative) { $file .= <<<'PSR04' $map = require __DIR__ . '/autoload_namespaces.php'; foreach ($map as $namespace => $path) { $loader->set($namespace, $path); } $map = require __DIR__ . '/autoload_psr4.php'; foreach ($map as $namespace => $path) { $loader->setPsr4($namespace, $path); } PSR04; } if ($useClassMap) { $file .= <<<'CLASSMAP' $classMap = require __DIR__ . '/autoload_classmap.php'; if ($classMap) { $loader->addClassMap($classMap); } CLASSMAP; } $file .= " }\n\n"; if ($this->classMapAuthoritative) { $file .= <<<'CLASSMAPAUTHORITATIVE' $loader->setClassMapAuthoritative(true); CLASSMAPAUTHORITATIVE; } if ($this->apcu) { $apcuPrefix = substr(base64_encode(md5(uniqid('', true), true)), 0, -3); $file .= <<<APCU \$loader->setApcuPrefix('$apcuPrefix'); APCU; } if ($useGlobalIncludePath) { $file .= <<<'INCLUDEPATH' $loader->setUseIncludePath(true); INCLUDEPATH; } if ($targetDirLoader) { $file .= <<<REGISTER_TARGET_DIR_AUTOLOAD spl_autoload_register(array('ComposerAutoloaderInit$suffix', 'autoload'), true, true); REGISTER_TARGET_DIR_AUTOLOAD; } $file .= <<<REGISTER_LOADER \$loader->register($prependAutoloader); REGISTER_LOADER; if ($useIncludeFiles) { $file .= <<<INCLUDE_FILES if (\$useStaticLoader) { \$includeFiles = Composer\Autoload\ComposerStaticInit$suffix::\$files; } else { \$includeFiles = require __DIR__ . '/autoload_files.php'; } foreach (\$includeFiles as \$fileIdentifier => \$file) { composerRequire$suffix(\$fileIdentifier, \$file); } INCLUDE_FILES; } $file .= <<<METHOD_FOOTER return \$loader; } METHOD_FOOTER; $file .= $targetDirLoader; if ($useIncludeFiles) { return $file . <<<FOOTER } function composerRequire$suffix(\$fileIdentifier, \$file) { if (empty(\$GLOBALS['__composer_autoload_files'][\$fileIdentifier])) { require \$file; \$GLOBALS['__composer_autoload_files'][\$fileIdentifier] = true; } } FOOTER; } return $file . <<<FOOTER } FOOTER; } protected function getStaticFile($suffix, $targetDir, $vendorPath, $basePath, &$staticPhpVersion) { $staticPhpVersion = 50600; $file = <<<HEADER <?php // autoload_static.php @generated by Composer namespace Composer\Autoload; class ComposerStaticInit$suffix { HEADER; $loader = new ClassLoader(); $map = require $targetDir . '/autoload_namespaces.php'; foreach ($map as $namespace => $path) { $loader->set($namespace, $path); } $map = require $targetDir . '/autoload_psr4.php'; foreach ($map as $namespace => $path) { $loader->setPsr4($namespace, $path); } $classMap = require $targetDir . '/autoload_classmap.php'; if ($classMap) { $loader->addClassMap($classMap); } $filesystem = new Filesystem(); $vendorPathCode = ' => ' . $filesystem->findShortestPathCode(realpath($targetDir), $vendorPath, true, true) . " . '/"; $vendorPharPathCode = ' => \'phar://\' . ' . $filesystem->findShortestPathCode(realpath($targetDir), $vendorPath, true, true) . " . '/"; $appBaseDirCode = ' => ' . $filesystem->findShortestPathCode(realpath($targetDir), $basePath, true, true) . " . '/"; $appBaseDirPharCode = ' => \'phar://\' . ' . $filesystem->findShortestPathCode(realpath($targetDir), $basePath, true, true) . " . '/"; $absoluteVendorPathCode = ' => ' . substr(var_export(rtrim($vendorDir, '\\/') . '/', true), 0, -1); $absoluteVendorPharPathCode = ' => ' . substr(var_export(rtrim('phar://' . $vendorDir, '\\/') . '/', true), 0, -1); $absoluteAppBaseDirCode = ' => ' . substr(var_export(rtrim($baseDir, '\\/') . '/', true), 0, -1); $absoluteAppBaseDirPharCode = ' => ' . substr(var_export(rtrim('phar://' . $baseDir, '\\/') . '/', true), 0, -1); $initializer = ''; $prefix = "\0Composer\Autoload\ClassLoader\0"; $prefixLen = strlen($prefix); if (file_exists($targetDir . '/autoload_files.php')) { $maps = array('files' => require $targetDir . '/autoload_files.php'); } else { $maps = array(); } foreach ((array) $loader as $prop => $value) { if ($value && 0 === strpos($prop, $prefix)) { $maps[substr($prop, $prefixLen)] = $value; } } foreach ($maps as $prop => $value) { if (count($value) > 32767) { // Static arrays are limited to 32767 values on PHP 5.6 // See https://bugs.php.net/68057 $staticPhpVersion = 70000; } $value = strtr( var_export($value, true), array( $absoluteVendorPathCode => $vendorPathCode, $absoluteVendorPharPathCode => $vendorPharPathCode, $absoluteAppBaseDirCode => $appBaseDirCode, $absoluteAppBaseDirPharCode => $appBaseDirPharCode, ) ); $value = ltrim(preg_replace('/^ */m', ' $0$0', $value)); $file .= sprintf(" public static $%s = %s;\n\n", $prop, $value); if ('files' !== $prop) { $initializer .= " \$loader->$prop = ComposerStaticInit$suffix::\$$prop;\n"; } } return $file . <<<INITIALIZER public static function getInitializer(ClassLoader \$loader) { return \Closure::bind(function () use (\$loader) { $initializer }, null, ClassLoader::class); } } INITIALIZER; } protected function parseAutoloadsType(array $packageMap, $type, PackageInterface $mainPackage) { $autoloads = array(); foreach ($packageMap as $item) { list($package, $installPath) = $item; $autoload = $package->getAutoload(); if ($this->devMode && $package === $mainPackage) { $autoload = array_merge_recursive($autoload, $package->getDevAutoload()); } // skip misconfigured packages if (!isset($autoload[$type]) || !is_array($autoload[$type])) { continue; } if (null !== $package->getTargetDir() && $package !== $mainPackage) { $installPath = substr($installPath, 0, -strlen('/'.$package->getTargetDir())); } foreach ($autoload[$type] as $namespace => $paths) { foreach ((array) $paths as $path) { if (($type === 'files' || $type === 'classmap' || $type === 'exclude-from-classmap') && $package->getTargetDir() && !is_readable($installPath.'/'.$path)) { // remove target-dir from file paths of the root package if ($package === $mainPackage) { $targetDir = str_replace('\\<dirsep\\>', '[\\\\/]', preg_quote(str_replace(array('/', '\\'), '<dirsep>', $package->getTargetDir()))); $path = ltrim(preg_replace('{^'.$targetDir.'}', '', ltrim($path, '\\/')), '\\/'); } else { // add target-dir from file paths that don't have it $path = $package->getTargetDir() . '/' . $path; } } if ($type === 'exclude-from-classmap') { // first escape user input $path = preg_replace('{/+}', '/', preg_quote(trim(strtr($path, '\\', '/'), '/'))); // add support for wildcards * and ** $path = str_replace('\\*\\*', '.+?', $path); $path = str_replace('\\*', '[^/]+?', $path); // add support for up-level relative paths $updir = null; $path = preg_replace_callback( '{^((?:(?:\\\\\\.){1,2}+/)+)}', function ($matches) use (&$updir) { if (isset($matches[1])) { // undo preg_quote for the matched string $updir = str_replace('\\.', '.', $matches[1]); } return ''; }, $path ); if (empty($installPath)) { $installPath = strtr(getcwd(), '\\', '/'); } $resolvedPath = realpath($installPath . '/' . $updir); $autoloads[] = preg_quote(strtr($resolvedPath, '\\', '/')) . '/' . $path . '($|/)'; continue; } $relativePath = empty($installPath) ? (empty($path) ? '.' : $path) : $installPath.'/'.$path; if ($type === 'files') { $autoloads[$this->getFileIdentifier($package, $path)] = $relativePath; continue; } elseif ($type === 'classmap') { $autoloads[] = $relativePath; continue; } $autoloads[$namespace][] = $relativePath; } } } return $autoloads; } protected function getFileIdentifier(PackageInterface $package, $path) { return md5($package->getName() . ':' . $path); } /** * Filters out dev-dependencies * * @param array $packageMap * @param PackageInterface $mainPackage * @return array */ protected function filterPackageMap(array $packageMap, PackageInterface $mainPackage) { $packages = array(); $include = array(); $replacedBy = array(); foreach ($packageMap as $item) { $package = $item[0]; $name = $package->getName(); $packages[$name] = $package; foreach ($package->getReplaces() as $replace) { $replacedBy[$replace->getTarget()] = $name; } } $add = function (PackageInterface $package) use (&$add, $packages, &$include, $replacedBy) { foreach ($package->getRequires() as $link) { $target = $link->getTarget(); if (isset($replacedBy[$target])) { $target = $replacedBy[$target]; } if (!isset($include[$target])) { $include[$target] = true; if (isset($packages[$target])) { $add($packages[$target]); } } } }; $add($mainPackage); return array_filter( $packageMap, function ($item) use ($include) { $package = $item[0]; foreach ($package->getNames() as $name) { if (isset($include[$name])) { return true; } } return false; } ); } /** * Sorts packages by dependency weight * * Packages of equal weight retain the original order * * @param array $packageMap * @return array */ protected function sortPackageMap(array $packageMap) { $packages = array(); $paths = array(); foreach ($packageMap as $item) { list($package, $path) = $item; $name = $package->getName(); $packages[$name] = $package; $paths[$name] = $path; } $sortedPackages = PackageSorter::sortPackages($packages); $sortedPackageMap = array(); foreach ($sortedPackages as $package) { $name = $package->getName(); $sortedPackageMap[] = array($packages[$name], $paths[$name]); } return $sortedPackageMap; } /** * Copy file using stream_copy_to_stream to work around https://bugs.php.net/bug.php?id=6463 * * @param string $source * @param string $target */ protected function safeCopy($source, $target) { if (!file_exists($target) || !file_exists($source) || !$this->filesAreEqual($source, $target)) { $source = fopen($source, 'r'); $target = fopen($target, 'w+'); stream_copy_to_stream($source, $target); fclose($source); fclose($target); } } /** * compare 2 files * https://stackoverflow.com/questions/3060125/can-i-use-file-get-contents-to-compare-two-files */ private function filesAreEqual($a, $b) { // Check if filesize is different if (filesize($a) !== filesize($b)) { return false; } // Check if content is different $ah = fopen($a, 'rb'); $bh = fopen($b, 'rb'); $result = true; while (!feof($ah)) { if (fread($ah, 8192) != fread($bh, 8192)) { $result = false; break; } } fclose($ah); fclose($bh); return $result; } } composer/src/Composer/Autoload/ClassMapGenerator.php 0000644 00000032155 14736103146 0016617 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /* * This file is copied from the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> */ namespace Composer\Autoload; use Symfony\Component\Finder\Finder; use Composer\IO\IOInterface; use Composer\Util\Filesystem; /** * ClassMapGenerator * * @author Gyula Sallai <salla016@gmail.com> * @author Jordi Boggiano <j.boggiano@seld.be> */ class ClassMapGenerator { /** * Generate a class map file * * @param \Traversable $dirs Directories or a single path to search in * @param string $file The name of the class map file */ public static function dump($dirs, $file) { $maps = array(); foreach ($dirs as $dir) { $maps = array_merge($maps, static::createMap($dir)); } file_put_contents($file, sprintf('<?php return %s;', var_export($maps, true))); } /** * Iterate over all files in the given directory searching for classes * * @param \Iterator|string $path The path to search in or an iterator * @param string $blacklist Regex that matches against the file path that exclude from the classmap. * @param IOInterface $io IO object * @param string $namespace Optional namespace prefix to filter by * @param string $autoloadType psr-0|psr-4 Optional autoload standard to use mapping rules * * @throws \RuntimeException When the path is neither an existing file nor directory * @return array A class map array */ public static function createMap($path, $blacklist = null, IOInterface $io = null, $namespace = null, $autoloadType = null, &$scannedFiles = array()) { if (is_string($path)) { $basePath = $path; if (is_file($path)) { $path = array(new \SplFileInfo($path)); } elseif (is_dir($path)) { $path = Finder::create()->files()->followLinks()->name('/\.(php|inc|hh)$/')->in($path); } else { throw new \RuntimeException( 'Could not scan for classes inside "'.$path. '" which does not appear to be a file nor a folder' ); } } elseif (null !== $autoloadType) { throw new \RuntimeException('Path must be a string when specifying an autoload type'); } $map = array(); $filesystem = new Filesystem(); $cwd = realpath(getcwd()); foreach ($path as $file) { $filePath = $file->getPathname(); if (!in_array(pathinfo($filePath, PATHINFO_EXTENSION), array('php', 'inc', 'hh'))) { continue; } if (!$filesystem->isAbsolutePath($filePath)) { $filePath = $cwd . '/' . $filePath; $filePath = $filesystem->normalizePath($filePath); } else { $filePath = preg_replace('{[\\\\/]{2,}}', '/', $filePath); } $realPath = realpath($filePath); // if a list of scanned files is given, avoid scanning twice the same file to save cycles and avoid generating warnings // in case a PSR-0/4 declaration follows another more specific one, or a classmap declaration, which covered this file already if (isset($scannedFiles[$realPath])) { continue; } // check the realpath of the file against the blacklist as the path might be a symlink and the blacklist is realpath'd so symlink are resolved if ($blacklist && preg_match($blacklist, strtr($realPath, '\\', '/'))) { continue; } // check non-realpath of file for directories symlink in project dir if ($blacklist && preg_match($blacklist, strtr($filePath, '\\', '/'))) { continue; } $classes = self::findClasses($filePath); if (null !== $autoloadType) { list($classes, $validClasses) = self::filterByNamespace($classes, $filePath, $namespace, $autoloadType, $basePath, $io); // if no valid class was found in the file then we do not mark it as scanned as it might still be matched by another rule later if ($validClasses) { $scannedFiles[$realPath] = true; } } else { // classmap autoload rules always collect all classes so for these we definitely do not want to scan again $scannedFiles[$realPath] = true; } foreach ($classes as $class) { // skip classes not within the given namespace prefix // TODO enable in Composer v1.11 or 2.0 whichever comes first if (/* null === $autoloadType && */ null !== $namespace && '' !== $namespace && 0 !== strpos($class, $namespace)) { continue; } if (!isset($map[$class])) { $map[$class] = $filePath; } elseif ($io && $map[$class] !== $filePath && !preg_match('{/(test|fixture|example|stub)s?/}i', strtr($map[$class].' '.$filePath, '\\', '/'))) { $io->writeError( '<warning>Warning: Ambiguous class resolution, "'.$class.'"'. ' was found in both "'.$map[$class].'" and "'.$filePath.'", the first will be used.</warning>' ); } } } return $map; } /** * Remove classes which could not have been loaded by namespace autoloaders * * @param array $classes found classes in given file * @param string $filePath current file * @param string $baseNamespace prefix of given autoload mapping * @param string $namespaceType psr-0|psr-4 * @param string $basePath root directory of given autoload mapping * @param IOInterface $io IO object * @return array valid classes */ private static function filterByNamespace($classes, $filePath, $baseNamespace, $namespaceType, $basePath, $io) { $validClasses = array(); $rejectedClasses = array(); $realSubPath = substr($filePath, strlen($basePath) + 1); $realSubPath = substr($realSubPath, 0, strrpos($realSubPath, '.')); foreach ($classes as $class) { // silently skip if ns doesn't have common root if ('' !== $baseNamespace && 0 !== strpos($class, $baseNamespace)) { continue; } // transform class name to file path and validate if ('psr-0' === $namespaceType) { $namespaceLength = strrpos($class, '\\'); if (false !== $namespaceLength) { $namespace = substr($class, 0, $namespaceLength + 1); $className = substr($class, $namespaceLength + 1); $subPath = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . str_replace('_', DIRECTORY_SEPARATOR, $className); } else { $subPath = str_replace('_', DIRECTORY_SEPARATOR, $class); } } elseif ('psr-4' === $namespaceType) { $subNamespace = ('' !== $baseNamespace) ? substr($class, strlen($baseNamespace)) : $class; $subPath = str_replace('\\', DIRECTORY_SEPARATOR, $subNamespace); } else { throw new \RuntimeException("namespaceType must be psr-0 or psr-4, $namespaceType given"); } if ($subPath === $realSubPath) { $validClasses[] = $class; } else { $rejectedClasses[] = $class; } } // warn only if no valid classes, else silently skip invalid if (empty($validClasses)) { foreach ($rejectedClasses as $class) { trigger_error( "Class $class located in ".preg_replace('{^'.preg_quote(getcwd()).'}', '.', $filePath, 1)." does not comply with $namespaceType autoloading standard. It will not autoload anymore in Composer v2.0.", E_USER_DEPRECATED ); } // TODO enable in Composer 2.0 //return array(); } // TODO enable in Composer 2.0 & unskip test in AutoloadGeneratorTest::testPSRToClassMapIgnoresNonPSRClasses //return $validClasses; return array($classes, $validClasses); } /** * Extract the classes in the given file * * @param string $path The file to check * @throws \RuntimeException * @return array The found classes */ private static function findClasses($path) { $extraTypes = PHP_VERSION_ID < 50400 ? '' : '|trait'; if (defined('HHVM_VERSION') && version_compare(HHVM_VERSION, '3.3', '>=')) { $extraTypes .= '|enum'; } // Use @ here instead of Silencer to actively suppress 'unhelpful' output // @link https://github.com/composer/composer/pull/4886 $contents = @php_strip_whitespace($path); if (!$contents) { if (!file_exists($path)) { $message = 'File at "%s" does not exist, check your classmap definitions'; } elseif (!is_readable($path)) { $message = 'File at "%s" is not readable, check its permissions'; } elseif ('' === trim(file_get_contents($path))) { // The input file was really empty and thus contains no classes return array(); } else { $message = 'File at "%s" could not be parsed as PHP, it may be binary or corrupted'; } $error = error_get_last(); if (isset($error['message'])) { $message .= PHP_EOL . 'The following message may be helpful:' . PHP_EOL . $error['message']; } throw new \RuntimeException(sprintf($message, $path)); } // return early if there is no chance of matching anything in this file if (!preg_match('{\b(?:class|interface'.$extraTypes.')\s}i', $contents)) { return array(); } // strip heredocs/nowdocs $contents = preg_replace('{<<<[ \t]*([\'"]?)(\w+)\\1(?:\r\n|\n|\r)(?:.*?)(?:\r\n|\n|\r)(?:\s*)\\2(?=\s+|[;,.)])}s', 'null', $contents); // strip strings $contents = preg_replace('{"[^"\\\\]*+(\\\\.[^"\\\\]*+)*+"|\'[^\'\\\\]*+(\\\\.[^\'\\\\]*+)*+\'}s', 'null', $contents); // strip leading non-php code if needed if (substr($contents, 0, 2) !== '<?') { $contents = preg_replace('{^.+?<\?}s', '<?', $contents, 1, $replacements); if ($replacements === 0) { return array(); } } // strip non-php blocks in the file $contents = preg_replace('{\?>(?:[^<]++|<(?!\?))*+<\?}s', '?><?', $contents); // strip trailing non-php code if needed $pos = strrpos($contents, '?>'); if (false !== $pos && false === strpos(substr($contents, $pos), '<?')) { $contents = substr($contents, 0, $pos); } // strip comments if short open tags are in the file if (preg_match('{(<\?)(?!(php|hh))}i', $contents)) { $contents = preg_replace('{//.* | /\*(?:[^*]++|\*(?!/))*\*/}x', '', $contents); } preg_match_all('{ (?: \b(?<![\$:>])(?P<type>class|interface'.$extraTypes.') \s++ (?P<name>[a-zA-Z_\x7f-\xff:][a-zA-Z0-9_\x7f-\xff:\-]*+) | \b(?<![\$:>])(?P<ns>namespace) (?P<nsname>\s++[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*+(?:\s*+\\\\\s*+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*+)*+)? \s*+ [\{;] ) }ix', $contents, $matches); $classes = array(); $namespace = ''; for ($i = 0, $len = count($matches['type']); $i < $len; $i++) { if (!empty($matches['ns'][$i])) { $namespace = str_replace(array(' ', "\t", "\r", "\n"), '', $matches['nsname'][$i]) . '\\'; } else { $name = $matches['name'][$i]; // skip anon classes extending/implementing if ($name === 'extends' || $name === 'implements') { continue; } if ($name[0] === ':') { // This is an XHP class, https://github.com/facebook/xhp $name = 'xhp'.substr(str_replace(array('-', ':'), array('_', '__'), $name), 1); } elseif ($matches['type'][$i] === 'enum') { // In Hack, something like: // enum Foo: int { HERP = '123'; } // The regex above captures the colon, which isn't part of // the class name. $name = rtrim($name, ':'); } $classes[] = ltrim($namespace . $name, '\\'); } } return $classes; } } composer/src/Composer/Autoload/ClassLoader.php 0000644 00000032223 14736103146 0015435 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Autoload; /** * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. * * $loader = new \Composer\Autoload\ClassLoader(); * * // register classes with namespaces * $loader->add('Symfony\Component', __DIR__.'/component'); * $loader->add('Symfony', __DIR__.'/framework'); * * // activate the autoloader * $loader->register(); * * // to enable searching the include path (eg. for PEAR packages) * $loader->setUseIncludePath(true); * * In this example, if you try to use a class in the Symfony\Component * namespace or one of its children (Symfony\Component\Console for instance), * the autoloader will first look for the class under the component/ * directory, and it will then fallback to the framework/ directory if not * found before giving up. * * This class is loosely based on the Symfony UniversalClassLoader. * * @author Fabien Potencier <fabien@symfony.com> * @author Jordi Boggiano <j.boggiano@seld.be> * @see http://www.php-fig.org/psr/psr-0/ * @see http://www.php-fig.org/psr/psr-4/ */ class ClassLoader { // PSR-4 private $prefixLengthsPsr4 = array(); private $prefixDirsPsr4 = array(); private $fallbackDirsPsr4 = array(); // PSR-0 private $prefixesPsr0 = array(); private $fallbackDirsPsr0 = array(); private $useIncludePath = false; private $classMap = array(); private $classMapAuthoritative = false; private $missingClasses = array(); private $apcuPrefix; public function getPrefixes() { if (!empty($this->prefixesPsr0)) { return call_user_func_array('array_merge', $this->prefixesPsr0); } return array(); } public function getPrefixesPsr4() { return $this->prefixDirsPsr4; } public function getFallbackDirs() { return $this->fallbackDirsPsr0; } public function getFallbackDirsPsr4() { return $this->fallbackDirsPsr4; } public function getClassMap() { return $this->classMap; } /** * @param array $classMap Class to filename map */ public function addClassMap(array $classMap) { if ($this->classMap) { $this->classMap = array_merge($this->classMap, $classMap); } else { $this->classMap = $classMap; } } /** * Registers a set of PSR-0 directories for a given prefix, either * appending or prepending to the ones previously set for this prefix. * * @param string $prefix The prefix * @param array|string $paths The PSR-0 root directories * @param bool $prepend Whether to prepend the directories */ public function add($prefix, $paths, $prepend = false) { if (!$prefix) { if ($prepend) { $this->fallbackDirsPsr0 = array_merge( (array) $paths, $this->fallbackDirsPsr0 ); } else { $this->fallbackDirsPsr0 = array_merge( $this->fallbackDirsPsr0, (array) $paths ); } return; } $first = $prefix[0]; if (!isset($this->prefixesPsr0[$first][$prefix])) { $this->prefixesPsr0[$first][$prefix] = (array) $paths; return; } if ($prepend) { $this->prefixesPsr0[$first][$prefix] = array_merge( (array) $paths, $this->prefixesPsr0[$first][$prefix] ); } else { $this->prefixesPsr0[$first][$prefix] = array_merge( $this->prefixesPsr0[$first][$prefix], (array) $paths ); } } /** * Registers a set of PSR-4 directories for a given namespace, either * appending or prepending to the ones previously set for this namespace. * * @param string $prefix The prefix/namespace, with trailing '\\' * @param array|string $paths The PSR-4 base directories * @param bool $prepend Whether to prepend the directories * * @throws \InvalidArgumentException */ public function addPsr4($prefix, $paths, $prepend = false) { if (!$prefix) { // Register directories for the root namespace. if ($prepend) { $this->fallbackDirsPsr4 = array_merge( (array) $paths, $this->fallbackDirsPsr4 ); } else { $this->fallbackDirsPsr4 = array_merge( $this->fallbackDirsPsr4, (array) $paths ); } } elseif (!isset($this->prefixDirsPsr4[$prefix])) { // Register directories for a new namespace. $length = strlen($prefix); if ('\\' !== $prefix[$length - 1]) { throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); } $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; $this->prefixDirsPsr4[$prefix] = (array) $paths; } elseif ($prepend) { // Prepend directories for an already registered namespace. $this->prefixDirsPsr4[$prefix] = array_merge( (array) $paths, $this->prefixDirsPsr4[$prefix] ); } else { // Append directories for an already registered namespace. $this->prefixDirsPsr4[$prefix] = array_merge( $this->prefixDirsPsr4[$prefix], (array) $paths ); } } /** * Registers a set of PSR-0 directories for a given prefix, * replacing any others previously set for this prefix. * * @param string $prefix The prefix * @param array|string $paths The PSR-0 base directories */ public function set($prefix, $paths) { if (!$prefix) { $this->fallbackDirsPsr0 = (array) $paths; } else { $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; } } /** * Registers a set of PSR-4 directories for a given namespace, * replacing any others previously set for this namespace. * * @param string $prefix The prefix/namespace, with trailing '\\' * @param array|string $paths The PSR-4 base directories * * @throws \InvalidArgumentException */ public function setPsr4($prefix, $paths) { if (!$prefix) { $this->fallbackDirsPsr4 = (array) $paths; } else { $length = strlen($prefix); if ('\\' !== $prefix[$length - 1]) { throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); } $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; $this->prefixDirsPsr4[$prefix] = (array) $paths; } } /** * Turns on searching the include path for class files. * * @param bool $useIncludePath */ public function setUseIncludePath($useIncludePath) { $this->useIncludePath = $useIncludePath; } /** * Can be used to check if the autoloader uses the include path to check * for classes. * * @return bool */ public function getUseIncludePath() { return $this->useIncludePath; } /** * Turns off searching the prefix and fallback directories for classes * that have not been registered with the class map. * * @param bool $classMapAuthoritative */ public function setClassMapAuthoritative($classMapAuthoritative) { $this->classMapAuthoritative = $classMapAuthoritative; } /** * Should class lookup fail if not found in the current class map? * * @return bool */ public function isClassMapAuthoritative() { return $this->classMapAuthoritative; } /** * APCu prefix to use to cache found/not-found classes, if the extension is enabled. * * @param string|null $apcuPrefix */ public function setApcuPrefix($apcuPrefix) { $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; } /** * The APCu prefix in use, or null if APCu caching is not enabled. * * @return string|null */ public function getApcuPrefix() { return $this->apcuPrefix; } /** * Registers this instance as an autoloader. * * @param bool $prepend Whether to prepend the autoloader or not */ public function register($prepend = false) { spl_autoload_register(array($this, 'loadClass'), true, $prepend); } /** * Unregisters this instance as an autoloader. */ public function unregister() { spl_autoload_unregister(array($this, 'loadClass')); } /** * Loads the given class or interface. * * @param string $class The name of the class * @return bool|null True if loaded, null otherwise */ public function loadClass($class) { if ($file = $this->findFile($class)) { includeFile($file); return true; } } /** * Finds the path to the file where the class is defined. * * @param string $class The name of the class * * @return string|false The path if found, false otherwise */ public function findFile($class) { // class map lookup if (isset($this->classMap[$class])) { return $this->classMap[$class]; } if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { return false; } if (null !== $this->apcuPrefix) { $file = apcu_fetch($this->apcuPrefix.$class, $hit); if ($hit) { return $file; } } $file = $this->findFileWithExtension($class, '.php'); // Search for Hack files if we are running on HHVM if (false === $file && defined('HHVM_VERSION')) { $file = $this->findFileWithExtension($class, '.hh'); } if (null !== $this->apcuPrefix) { apcu_add($this->apcuPrefix.$class, $file); } if (false === $file) { // Remember that this class does not exist. $this->missingClasses[$class] = true; } return $file; } private function findFileWithExtension($class, $ext) { // PSR-4 lookup $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; $first = $class[0]; if (isset($this->prefixLengthsPsr4[$first])) { $subPath = $class; while (false !== $lastPos = strrpos($subPath, '\\')) { $subPath = substr($subPath, 0, $lastPos); $search = $subPath . '\\'; if (isset($this->prefixDirsPsr4[$search])) { $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); foreach ($this->prefixDirsPsr4[$search] as $dir) { if (file_exists($file = $dir . $pathEnd)) { return $file; } } } } } // PSR-4 fallback dirs foreach ($this->fallbackDirsPsr4 as $dir) { if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { return $file; } } // PSR-0 lookup if (false !== $pos = strrpos($class, '\\')) { // namespaced class name $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); } else { // PEAR-like class name $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; } if (isset($this->prefixesPsr0[$first])) { foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { if (0 === strpos($class, $prefix)) { foreach ($dirs as $dir) { if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { return $file; } } } } } // PSR-0 fallback dirs foreach ($this->fallbackDirsPsr0 as $dir) { if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { return $file; } } // PSR-0 include paths. if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { return $file; } return false; } } /** * Scope isolated include. * * Prevents access to $this/self from included files. */ function includeFile($file) { include $file; } composer/src/Composer/Installer.php 0000644 00000213327 14736103146 0013434 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer; use Composer\Autoload\AutoloadGenerator; use Composer\DependencyResolver\DefaultPolicy; use Composer\DependencyResolver\Operation\UpdateOperation; use Composer\DependencyResolver\Operation\InstallOperation; use Composer\DependencyResolver\Operation\UninstallOperation; use Composer\DependencyResolver\Operation\MarkAliasUninstalledOperation; use Composer\DependencyResolver\Operation\OperationInterface; use Composer\DependencyResolver\PolicyInterface; use Composer\DependencyResolver\Pool; use Composer\DependencyResolver\Request; use Composer\DependencyResolver\Rule; use Composer\DependencyResolver\Solver; use Composer\DependencyResolver\SolverProblemsException; use Composer\Downloader\DownloadManager; use Composer\EventDispatcher\EventDispatcher; use Composer\Installer\InstallationManager; use Composer\Installer\InstallerEvents; use Composer\Installer\NoopInstaller; use Composer\Installer\SuggestedPackagesReporter; use Composer\IO\IOInterface; use Composer\Package\AliasPackage; use Composer\Package\BasePackage; use Composer\Package\CompletePackage; use Composer\Package\CompletePackageInterface; use Composer\Package\Link; use Composer\Package\Loader\ArrayLoader; use Composer\Package\Dumper\ArrayDumper; use Composer\Semver\Constraint\Constraint; use Composer\Package\Locker; use Composer\Package\PackageInterface; use Composer\Package\RootPackageInterface; use Composer\Repository\CompositeRepository; use Composer\Repository\InstalledArrayRepository; use Composer\Repository\PlatformRepository; use Composer\Repository\RepositoryInterface; use Composer\Repository\RepositoryManager; use Composer\Repository\WritableRepositoryInterface; use Composer\Script\ScriptEvents; /** * @author Jordi Boggiano <j.boggiano@seld.be> * @author Beau Simensen <beau@dflydev.com> * @author Konstantin Kudryashov <ever.zet@gmail.com> * @author Nils Adermann <naderman@naderman.de> */ class Installer { /** * @var IOInterface */ protected $io; /** * @var Config */ protected $config; /** * @var RootPackageInterface */ protected $package; /** * @var DownloadManager */ protected $downloadManager; /** * @var RepositoryManager */ protected $repositoryManager; /** * @var Locker */ protected $locker; /** * @var InstallationManager */ protected $installationManager; /** * @var EventDispatcher */ protected $eventDispatcher; /** * @var AutoloadGenerator */ protected $autoloadGenerator; protected $preferSource = false; protected $preferDist = false; protected $optimizeAutoloader = false; protected $classMapAuthoritative = false; protected $apcuAutoloader = false; protected $devMode = false; protected $dryRun = false; protected $verbose = false; protected $update = false; protected $dumpAutoloader = true; protected $runScripts = true; protected $ignorePlatformReqs = false; protected $preferStable = false; protected $preferLowest = false; protected $skipSuggest = false; protected $writeLock; protected $executeOperations = true; /** * Array of package names/globs flagged for update * * @var array|null */ protected $updateWhitelist = null; protected $whitelistDependencies = false; // TODO 2.0 rename to whitelistTransitiveDependencies protected $whitelistAllDependencies = false; /** * @var SuggestedPackagesReporter */ protected $suggestedPackagesReporter; /** * @var RepositoryInterface */ protected $additionalInstalledRepository; /** * Constructor * * @param IOInterface $io * @param Config $config * @param RootPackageInterface $package * @param DownloadManager $downloadManager * @param RepositoryManager $repositoryManager * @param Locker $locker * @param InstallationManager $installationManager * @param EventDispatcher $eventDispatcher * @param AutoloadGenerator $autoloadGenerator */ public function __construct(IOInterface $io, Config $config, RootPackageInterface $package, DownloadManager $downloadManager, RepositoryManager $repositoryManager, Locker $locker, InstallationManager $installationManager, EventDispatcher $eventDispatcher, AutoloadGenerator $autoloadGenerator) { $this->io = $io; $this->config = $config; $this->package = $package; $this->downloadManager = $downloadManager; $this->repositoryManager = $repositoryManager; $this->locker = $locker; $this->installationManager = $installationManager; $this->eventDispatcher = $eventDispatcher; $this->autoloadGenerator = $autoloadGenerator; $this->writeLock = $config->get('lock'); } /** * Run installation (or update) * * @throws \Exception * @return int 0 on success or a positive error code on failure */ public function run() { // Disable GC to save CPU cycles, as the dependency solver can create hundreds of thousands // of PHP objects, the GC can spend quite some time walking the tree of references looking // for stuff to collect while there is nothing to collect. This slows things down dramatically // and turning it off results in much better performance. Do not try this at home however. gc_collect_cycles(); gc_disable(); // Force update if there is no lock file present if (!$this->update && !$this->locker->isLocked()) { $this->update = true; } if ($this->dryRun) { $this->verbose = true; $this->runScripts = false; $this->executeOperations = false; $this->writeLock = false; $this->dumpAutoloader = false; $this->installationManager->addInstaller(new NoopInstaller); $this->mockLocalRepositories($this->repositoryManager); } if ($this->runScripts) { $_SERVER['COMPOSER_DEV_MODE'] = (int) $this->devMode; putenv('COMPOSER_DEV_MODE='.$_SERVER['COMPOSER_DEV_MODE']); // dispatch pre event $eventName = $this->update ? ScriptEvents::PRE_UPDATE_CMD : ScriptEvents::PRE_INSTALL_CMD; $this->eventDispatcher->dispatchScript($eventName, $this->devMode); } $this->downloadManager->setPreferSource($this->preferSource); $this->downloadManager->setPreferDist($this->preferDist); // create installed repo, this contains all local packages + platform packages (php & extensions) $localRepo = $this->repositoryManager->getLocalRepository(); if ($this->update) { $platformOverrides = $this->config->get('platform') ?: array(); } else { $platformOverrides = $this->locker->getPlatformOverrides(); } $platformRepo = new PlatformRepository(array(), $platformOverrides); $installedRepo = $this->createInstalledRepo($localRepo, $platformRepo); $aliases = $this->getRootAliases(); $this->aliasPlatformPackages($platformRepo, $aliases); if (!$this->suggestedPackagesReporter) { $this->suggestedPackagesReporter = new SuggestedPackagesReporter($this->io); } try { list($res, $devPackages) = $this->doInstall($localRepo, $installedRepo, $platformRepo, $aliases); if ($res !== 0) { return $res; } } catch (\Exception $e) { if ($this->executeOperations && $this->config->get('notify-on-install')) { $this->installationManager->notifyInstalls($this->io); } throw $e; } if ($this->executeOperations && $this->config->get('notify-on-install')) { $this->installationManager->notifyInstalls($this->io); } // output suggestions if we're in dev mode if ($this->devMode && !$this->skipSuggest) { $this->suggestedPackagesReporter->output($installedRepo); } # Find abandoned packages and warn user foreach ($localRepo->getPackages() as $package) { if (!$package instanceof CompletePackage || !$package->isAbandoned()) { continue; } $replacement = is_string($package->getReplacementPackage()) ? 'Use ' . $package->getReplacementPackage() . ' instead' : 'No replacement was suggested'; $this->io->writeError( sprintf( "<warning>Package %s is abandoned, you should avoid using it. %s.</warning>", $package->getPrettyName(), $replacement ) ); } // write lock if ($this->update && $this->writeLock) { $localRepo->reload(); $platformReqs = $this->extractPlatformRequirements($this->package->getRequires()); $platformDevReqs = $this->extractPlatformRequirements($this->package->getDevRequires()); $updatedLock = $this->locker->setLockData( array_diff($localRepo->getCanonicalPackages(), $devPackages), $devPackages, $platformReqs, $platformDevReqs, $aliases, $this->package->getMinimumStability(), $this->package->getStabilityFlags(), $this->preferStable || $this->package->getPreferStable(), $this->preferLowest, $this->config->get('platform') ?: array() ); if ($updatedLock) { $this->io->writeError('<info>Writing lock file</info>'); } } if ($this->dumpAutoloader) { // write autoloader if ($this->optimizeAutoloader) { $this->io->writeError('<info>Generating optimized autoload files</info>'); } else { $this->io->writeError('<info>Generating autoload files</info>'); } $this->autoloadGenerator->setDevMode($this->devMode); $this->autoloadGenerator->setClassMapAuthoritative($this->classMapAuthoritative); $this->autoloadGenerator->setApcu($this->apcuAutoloader); $this->autoloadGenerator->setRunScripts($this->runScripts); $this->autoloadGenerator->dump($this->config, $localRepo, $this->package, $this->installationManager, 'composer', $this->optimizeAutoloader); } if ($this->executeOperations) { // force binaries re-generation in case they are missing foreach ($localRepo->getPackages() as $package) { $this->installationManager->ensureBinariesPresence($package); } } $fundingCount = 0; foreach ($localRepo->getPackages() as $package) { if ($package instanceof CompletePackageInterface && !$package instanceof AliasPackage && $package->getFunding()) { $fundingCount++; } } if ($fundingCount) { $this->io->writeError(array( sprintf( "<info>%d package%s you are using %s looking for funding.</info>", $fundingCount, 1 === $fundingCount ? '' : 's', 1 === $fundingCount ? 'is' : 'are' ), '<info>Use the `composer fund` command to find out more!</info>', )); } if ($this->runScripts) { // dispatch post event $eventName = $this->update ? ScriptEvents::POST_UPDATE_CMD : ScriptEvents::POST_INSTALL_CMD; $this->eventDispatcher->dispatchScript($eventName, $this->devMode); } // re-enable GC except on HHVM which triggers a warning here if (!defined('HHVM_VERSION')) { gc_enable(); } return 0; } /** * @param RepositoryInterface $localRepo * @param RepositoryInterface $installedRepo * @param PlatformRepository $platformRepo * @param array $aliases * @return array [int, PackageInterfaces[]|null] with the exit code and an array of dev packages on update, or null on install */ protected function doInstall($localRepo, $installedRepo, $platformRepo, $aliases) { // init vars $lockedRepository = null; $repositories = null; // initialize locked repo if we are installing from lock or in a partial update // and a lock file is present as we need to force install non-whitelisted lock file // packages in that case if (!$this->update || (!empty($this->updateWhitelist) && $this->locker->isLocked())) { try { $lockedRepository = $this->locker->getLockedRepository($this->devMode); } catch (\RuntimeException $e) { // if there are dev requires, then we really can not install if ($this->package->getDevRequires()) { throw $e; } // no require-dev in composer.json and the lock file was created with no dev info, so skip them $lockedRepository = $this->locker->getLockedRepository(); } } $this->whitelistUpdateDependencies( $lockedRepository ?: $localRepo, $this->package->getRequires(), $this->package->getDevRequires() ); $this->io->writeError('<info>Loading composer repositories with package information</info>'); // creating repository pool $policy = $this->createPolicy(); $pool = $this->createPool($this->update ? null : $lockedRepository); $pool->addRepository($installedRepo, $aliases); if ($this->update) { $repositories = $this->repositoryManager->getRepositories(); foreach ($repositories as $repository) { $pool->addRepository($repository, $aliases); } } // Add the locked repository after the others in case we are doing a // partial update so missing packages can be found there still. // For installs from lock it's the only one added so it is first if ($lockedRepository) { $pool->addRepository($lockedRepository, $aliases); } // creating requirements request $request = $this->createRequest($this->package, $platformRepo); if ($this->update) { // remove unstable packages from the localRepo if they don't match the current stability settings $removedUnstablePackages = array(); foreach ($localRepo->getPackages() as $package) { if ( !$pool->isPackageAcceptable($package->getNames(), $package->getStability()) && $this->installationManager->isPackageInstalled($localRepo, $package) ) { $removedUnstablePackages[$package->getName()] = true; $request->remove($package->getName(), new Constraint('=', $package->getVersion())); } } $this->io->writeError('<info>Updating dependencies'.($this->devMode ? ' (including require-dev)' : '').'</info>'); $request->updateAll(); $links = array_merge($this->package->getRequires(), $this->package->getDevRequires()); foreach ($links as $link) { $request->install($link->getTarget(), $link->getConstraint()); } // if the updateWhitelist is enabled, packages not in it are also fixed // to the version specified in the lock, or their currently installed version if ($this->updateWhitelist) { $currentPackages = $this->getCurrentPackages($installedRepo); // collect packages to fixate from root requirements as well as installed packages $candidates = array(); foreach ($links as $link) { $candidates[$link->getTarget()] = true; $rootRequires[$link->getTarget()] = $link; } foreach ($currentPackages as $package) { $candidates[$package->getName()] = true; } // fix them to the version in lock (or currently installed) if they are not updateable foreach ($candidates as $candidate => $dummy) { foreach ($currentPackages as $curPackage) { if ($curPackage->getName() === $candidate) { if (!$this->isUpdateable($curPackage) && !isset($removedUnstablePackages[$curPackage->getName()])) { $constraint = new Constraint('=', $curPackage->getVersion()); $description = $this->locker->isLocked() ? '(locked at' : '(installed at'; $requiredAt = isset($rootRequires[$candidate]) ? ', required as ' . $rootRequires[$candidate]->getPrettyConstraint() : ''; $constraint->setPrettyString($description . ' ' . $curPackage->getPrettyVersion() . $requiredAt . ')'); $request->install($curPackage->getName(), $constraint); } break; } } } } } else { $this->io->writeError('<info>Installing dependencies'.($this->devMode ? ' (including require-dev)' : '').' from lock file</info>'); if (!$this->locker->isFresh()) { $this->io->writeError('<warning>Warning: The lock file is not up to date with the latest changes in composer.json. You may be getting outdated dependencies. It is recommended that you run `composer update` or `composer update <package name>`.</warning>', true, IOInterface::QUIET); } foreach ($lockedRepository->getPackages() as $package) { $version = $package->getVersion(); if (isset($aliases[$package->getName()][$version])) { $version = $aliases[$package->getName()][$version]['alias_normalized']; } $constraint = new Constraint('=', $version); $constraint->setPrettyString($package->getPrettyVersion()); $request->install($package->getName(), $constraint); } foreach ($this->locker->getPlatformRequirements($this->devMode) as $link) { $request->install($link->getTarget(), $link->getConstraint()); } } // force dev packages to have the latest links if we update or install from a (potentially new) lock $this->processDevPackages($localRepo, $pool, $policy, $repositories, $installedRepo, $lockedRepository, 'force-links'); // solve dependencies $this->eventDispatcher->dispatchInstallerEvent(InstallerEvents::PRE_DEPENDENCIES_SOLVING, $this->devMode, $policy, $pool, $installedRepo, $request); $solver = new Solver($policy, $pool, $installedRepo, $this->io); try { $operations = $solver->solve($request, $this->ignorePlatformReqs); $ruleSetSize = $solver->getRuleSetSize(); $solver = null; } catch (SolverProblemsException $e) { $this->io->writeError('<error>Your requirements could not be resolved to an installable set of packages.</error>', true, IOInterface::QUIET); $this->io->writeError($e->getMessage()); if ($this->update && !$this->devMode) { $this->io->writeError('<warning>Running update with --no-dev does not mean require-dev is ignored, it just means the packages will not be installed. If dev requirements are blocking the update you have to resolve those problems.</warning>', true, IOInterface::QUIET); } return array(max(1, $e->getCode()), array()); } // force dev packages to be updated if we update or install from a (potentially new) lock $operations = $this->processDevPackages($localRepo, $pool, $policy, $repositories, $installedRepo, $lockedRepository, 'force-updates', $operations); $this->eventDispatcher->dispatchInstallerEvent(InstallerEvents::POST_DEPENDENCIES_SOLVING, $this->devMode, $policy, $pool, $installedRepo, $request, $operations); $this->io->writeError("Analyzed ".count($pool)." packages to resolve dependencies", true, IOInterface::VERBOSE); $this->io->writeError("Analyzed ".$ruleSetSize." rules to resolve dependencies", true, IOInterface::VERBOSE); // execute operations if (!$operations) { $this->io->writeError('Nothing to install or update'); } $operations = $this->movePluginsToFront($operations); $operations = $this->moveUninstallsToFront($operations); // extract dev packages and mark them to be skipped if it's a --no-dev install or update // we also force them to be uninstalled if they are present in the local repo if ($this->update) { $devPackages = $this->extractDevPackages($operations, $localRepo, $platformRepo, $aliases); if (!$this->devMode) { $operations = $this->filterDevPackageOperations($devPackages, $operations, $localRepo); } } else { $devPackages = null; } if ($operations) { $installs = $updates = $uninstalls = array(); foreach ($operations as $operation) { if ($operation instanceof InstallOperation) { $installs[] = $operation->getPackage()->getPrettyName().':'.$operation->getPackage()->getFullPrettyVersion(); } elseif ($operation instanceof UpdateOperation) { $updates[] = $operation->getTargetPackage()->getPrettyName().':'.$operation->getTargetPackage()->getFullPrettyVersion(); } elseif ($operation instanceof UninstallOperation) { $uninstalls[] = $operation->getPackage()->getPrettyName(); } } $this->io->writeError(sprintf( "<info>Package operations: %d install%s, %d update%s, %d removal%s</info>", count($installs), 1 === count($installs) ? '' : 's', count($updates), 1 === count($updates) ? '' : 's', count($uninstalls), 1 === count($uninstalls) ? '' : 's' )); if ($installs) { $this->io->writeError("Installs: ".implode(', ', $installs), true, IOInterface::VERBOSE); } if ($updates) { $this->io->writeError("Updates: ".implode(', ', $updates), true, IOInterface::VERBOSE); } if ($uninstalls) { $this->io->writeError("Removals: ".implode(', ', $uninstalls), true, IOInterface::VERBOSE); } } foreach ($operations as $operation) { // collect suggestions $jobType = $operation->getJobType(); if ('install' === $jobType) { $this->suggestedPackagesReporter->addSuggestionsFromPackage($operation->getPackage()); } // updating, force dev packages' references if they're in root package refs if ($this->update) { $package = null; if ('update' === $jobType) { $package = $operation->getTargetPackage(); } elseif ('install' === $jobType) { $package = $operation->getPackage(); } if ($package && $package->isDev()) { $references = $this->package->getReferences(); if (isset($references[$package->getName()])) { $this->updateInstallReferences($package, $references[$package->getName()]); } } if ('update' === $jobType) { $targetPackage = $operation->getTargetPackage(); if ($targetPackage->isDev()) { $initialPackage = $operation->getInitialPackage(); if ($targetPackage->getVersion() === $initialPackage->getVersion() && (!$targetPackage->getSourceReference() || $targetPackage->getSourceReference() === $initialPackage->getSourceReference()) && (!$targetPackage->getDistReference() || $targetPackage->getDistReference() === $initialPackage->getDistReference()) ) { $this->io->writeError(' - Skipping update of ' . $targetPackage->getPrettyName() . ' to the same reference-locked version', true, IOInterface::DEBUG); $this->io->writeError('', true, IOInterface::DEBUG); continue; } } } } $event = 'Composer\Installer\PackageEvents::PRE_PACKAGE_'.strtoupper($jobType); if (defined($event) && $this->runScripts) { $this->eventDispatcher->dispatchPackageEvent(constant($event), $this->devMode, $policy, $pool, $installedRepo, $request, $operations, $operation); } // output non-alias ops when not executing operations (i.e. dry run), output alias ops in debug verbosity if (!$this->executeOperations && false === strpos($operation->getJobType(), 'Alias')) { $this->io->writeError(' - ' . $operation); } elseif ($this->io->isDebug() && false !== strpos($operation->getJobType(), 'Alias')) { $this->io->writeError(' - ' . $operation); } $this->installationManager->execute($localRepo, $operation); // output reasons why the operation was ran, only for install/update operations if ($this->verbose && $this->io->isVeryVerbose() && in_array($jobType, array('install', 'update'))) { $reason = $operation->getReason(); if ($reason instanceof Rule) { switch ($reason->getReason()) { case Rule::RULE_JOB_INSTALL: $this->io->writeError(' REASON: Required by the root package: '.$reason->getPrettyString($pool)); $this->io->writeError(''); break; case Rule::RULE_PACKAGE_REQUIRES: $this->io->writeError(' REASON: '.$reason->getPrettyString($pool)); $this->io->writeError(''); break; } } } if ($this->executeOperations || $this->writeLock) { $localRepo->write(); } $event = 'Composer\Installer\PackageEvents::POST_PACKAGE_'.strtoupper($jobType); if (defined($event) && $this->runScripts) { $this->eventDispatcher->dispatchPackageEvent(constant($event), $this->devMode, $policy, $pool, $installedRepo, $request, $operations, $operation); } } if ($this->executeOperations) { // force source/dist urls to be updated for all packages $this->processPackageUrls($pool, $policy, $localRepo, $repositories); $localRepo->write(); } // see https://github.com/composer/composer/issues/2764 if ($operations) { $vendorDir = $this->config->get('vendor-dir'); if (is_dir($vendorDir)) { // suppress errors as this fails sometimes on OSX for no apparent reason // see https://github.com/composer/composer/issues/4070#issuecomment-129792748 @touch($vendorDir); } } return array(0, $devPackages); } /** * Extracts the dev packages out of the localRepo * * This works by faking the operations so we can see what the dev packages * would be at the end of the operation execution. This lets us then remove * the dev packages from the list of operations accordingly if we are in a * --no-dev install or update. * * @return array */ private function extractDevPackages(array $operations, RepositoryInterface $localRepo, PlatformRepository $platformRepo, array $aliases) { if (!$this->package->getDevRequires()) { return array(); } // fake-apply all operations to this clone of the local repo so we see the complete set of package we would end up with $tempLocalRepo = clone $localRepo; foreach ($operations as $operation) { switch ($operation->getJobType()) { case 'install': case 'markAliasInstalled': if (!$tempLocalRepo->hasPackage($operation->getPackage())) { $tempLocalRepo->addPackage(clone $operation->getPackage()); } break; case 'uninstall': case 'markAliasUninstalled': $tempLocalRepo->removePackage($operation->getPackage()); break; case 'update': $tempLocalRepo->removePackage($operation->getInitialPackage()); if (!$tempLocalRepo->hasPackage($operation->getTargetPackage())) { $tempLocalRepo->addPackage(clone $operation->getTargetPackage()); } break; default: throw new \LogicException('Unknown type: '.$operation->getJobType()); } } // we have to reload the local repo to handle aliases properly // but as it is not persisted on disk we use a loader/dumper // to reload it in memory $localRepo = new InstalledArrayRepository(array()); $loader = new ArrayLoader(null, true); $dumper = new ArrayDumper(); foreach ($tempLocalRepo->getCanonicalPackages() as $pkg) { $localRepo->addPackage($loader->load($dumper->dump($pkg))); } unset($tempLocalRepo, $loader, $dumper); $policy = $this->createPolicy(); $pool = $this->createPool(); $installedRepo = $this->createInstalledRepo($localRepo, $platformRepo); $pool->addRepository($installedRepo, $aliases); // creating requirements request without dev requirements $request = $this->createRequest($this->package, $platformRepo); $request->updateAll(); foreach ($this->package->getRequires() as $link) { $request->install($link->getTarget(), $link->getConstraint()); } // solve deps to see which get removed $this->eventDispatcher->dispatchInstallerEvent(InstallerEvents::PRE_DEPENDENCIES_SOLVING, false, $policy, $pool, $installedRepo, $request); $solver = new Solver($policy, $pool, $installedRepo, $this->io); $ops = $solver->solve($request, $this->ignorePlatformReqs); $this->eventDispatcher->dispatchInstallerEvent(InstallerEvents::POST_DEPENDENCIES_SOLVING, false, $policy, $pool, $installedRepo, $request, $ops); $devPackages = array(); foreach ($ops as $op) { if ($op->getJobType() === 'uninstall') { $devPackages[] = $op->getPackage(); } } return $devPackages; } /** * @return OperationInterface[] filtered operations, dev packages are uninstalled and all operations on them ignored */ private function filterDevPackageOperations(array $devPackages, array $operations, RepositoryInterface $localRepo) { $finalOps = array(); $packagesToSkip = array(); foreach ($devPackages as $pkg) { $packagesToSkip[$pkg->getName()] = true; if ($installedDevPkg = $localRepo->findPackage($pkg->getName(), '*')) { if ($installedDevPkg instanceof AliasPackage) { $finalOps[] = new MarkAliasUninstalledOperation($installedDevPkg, 'non-dev install removing it'); $installedDevPkg = $installedDevPkg->getAliasOf(); } $finalOps[] = new UninstallOperation($installedDevPkg, 'non-dev install removing it'); } } // skip operations applied on dev packages foreach ($operations as $op) { $package = $op->getJobType() === 'update' ? $op->getTargetPackage() : $op->getPackage(); if (isset($packagesToSkip[$package->getName()])) { continue; } $finalOps[] = $op; } return $finalOps; } /** * Workaround: if your packages depend on plugins, we must be sure * that those are installed / updated first; else it would lead to packages * being installed multiple times in different folders, when running Composer * twice. * * While this does not fix the root-causes of https://github.com/composer/composer/issues/1147, * it at least fixes the symptoms and makes usage of composer possible (again) * in such scenarios. * * @param OperationInterface[] $operations * @return OperationInterface[] reordered operation list */ private function movePluginsToFront(array $operations) { $pluginsNoDeps = array(); $pluginsWithDeps = array(); $pluginRequires = array(); foreach (array_reverse($operations, true) as $idx => $op) { if ($op instanceof InstallOperation) { $package = $op->getPackage(); } elseif ($op instanceof UpdateOperation) { $package = $op->getTargetPackage(); } else { continue; } // is this package a plugin? $isPlugin = $package->getType() === 'composer-plugin' || $package->getType() === 'composer-installer'; // is this a plugin or a dependency of a plugin? if ($isPlugin || count(array_intersect($package->getNames(), $pluginRequires))) { // get the package's requires, but filter out any platform requirements or 'composer-plugin-api' $requires = array_filter(array_keys($package->getRequires()), function ($req) { return $req !== 'composer-plugin-api' && !preg_match(PlatformRepository::PLATFORM_PACKAGE_REGEX, $req); }); // is this a plugin with no meaningful dependencies? if ($isPlugin && !count($requires)) { // plugins with no dependencies go to the very front array_unshift($pluginsNoDeps, $op); } else { // capture the requirements for this package so those packages will be moved up as well $pluginRequires = array_merge($pluginRequires, $requires); // move the operation to the front array_unshift($pluginsWithDeps, $op); } unset($operations[$idx]); } } return array_merge($pluginsNoDeps, $pluginsWithDeps, $operations); } /** * Removals of packages should be executed before installations in * case two packages resolve to the same path (due to custom installers) * * @param OperationInterface[] $operations * @return OperationInterface[] reordered operation list */ private function moveUninstallsToFront(array $operations) { $uninstOps = array(); foreach ($operations as $idx => $op) { if ($op instanceof UninstallOperation) { $uninstOps[] = $op; unset($operations[$idx]); } } return array_merge($uninstOps, $operations); } /** * @return RepositoryInterface */ private function createInstalledRepo(RepositoryInterface $localRepo, PlatformRepository $platformRepo) { // clone root package to have one in the installed repo that does not require anything // we don't want it to be uninstallable, but its requirements should not conflict // with the lock file for example $installedRootPackage = clone $this->package; $installedRootPackage->setRequires(array()); $installedRootPackage->setDevRequires(array()); $repos = array( $localRepo, new InstalledArrayRepository(array($installedRootPackage)), $platformRepo, ); $installedRepo = new CompositeRepository($repos); if ($this->additionalInstalledRepository) { $installedRepo->addRepository($this->additionalInstalledRepository); } return $installedRepo; } /** * @param RepositoryInterface|null $lockedRepository * @return Pool */ private function createPool(RepositoryInterface $lockedRepository = null) { if ($this->update) { $minimumStability = $this->package->getMinimumStability(); $stabilityFlags = $this->package->getStabilityFlags(); $requires = array_merge($this->package->getRequires(), $this->package->getDevRequires()); } else { $minimumStability = $this->locker->getMinimumStability(); $stabilityFlags = $this->locker->getStabilityFlags(); $requires = array(); foreach ($lockedRepository->getPackages() as $package) { $constraint = new Constraint('=', $package->getVersion()); $constraint->setPrettyString($package->getPrettyVersion()); $requires[$package->getName()] = $constraint; } } $rootConstraints = array(); foreach ($requires as $req => $constraint) { // skip platform requirements from the root package to avoid filtering out existing platform packages if ($this->ignorePlatformReqs && preg_match(PlatformRepository::PLATFORM_PACKAGE_REGEX, $req)) { continue; } if ($constraint instanceof Link) { $rootConstraints[$req] = $constraint->getConstraint(); } else { $rootConstraints[$req] = $constraint; } } return new Pool($minimumStability, $stabilityFlags, $rootConstraints); } /** * @return DefaultPolicy */ private function createPolicy() { $preferStable = null; $preferLowest = null; if (!$this->update) { $preferStable = $this->locker->getPreferStable(); $preferLowest = $this->locker->getPreferLowest(); } // old lock file without prefer stable/lowest will return null // so in this case we use the composer.json info if (null === $preferStable) { $preferStable = $this->preferStable || $this->package->getPreferStable(); } if (null === $preferLowest) { $preferLowest = $this->preferLowest; } return new DefaultPolicy($preferStable, $preferLowest); } /** * @param RootPackageInterface $rootPackage * @param PlatformRepository $platformRepo * @return Request */ private function createRequest(RootPackageInterface $rootPackage, PlatformRepository $platformRepo) { $request = new Request(); $constraint = new Constraint('=', $rootPackage->getVersion()); $constraint->setPrettyString($rootPackage->getPrettyVersion()); $request->install($rootPackage->getName(), $constraint); $fixedPackages = $platformRepo->getPackages(); if ($this->additionalInstalledRepository) { $additionalFixedPackages = $this->additionalInstalledRepository->getPackages(); $fixedPackages = array_merge($fixedPackages, $additionalFixedPackages); } // fix the version of all platform packages + additionally installed packages // to prevent the solver trying to remove or update those $provided = $rootPackage->getProvides(); foreach ($fixedPackages as $package) { $constraint = new Constraint('=', $package->getVersion()); $constraint->setPrettyString($package->getPrettyVersion()); // skip platform packages that are provided by the root package if ($package->getRepository() !== $platformRepo || !isset($provided[$package->getName()]) || !$provided[$package->getName()]->getConstraint()->matches($constraint) ) { $request->fix($package->getName(), $constraint); } } return $request; } /** * @param WritableRepositoryInterface $localRepo * @param Pool $pool * @param PolicyInterface $policy * @param array $repositories * @param RepositoryInterface $installedRepo * @param RepositoryInterface $lockedRepository * @param string $task * @param array|null $operations * @return array */ private function processDevPackages($localRepo, $pool, $policy, $repositories, $installedRepo, $lockedRepository, $task, array $operations = null) { if ($task === 'force-updates' && null === $operations) { throw new \InvalidArgumentException('Missing operations argument'); } if ($task === 'force-links') { $operations = array(); } if ($this->update && $this->updateWhitelist) { $currentPackages = $this->getCurrentPackages($installedRepo); } foreach ($localRepo->getCanonicalPackages() as $package) { // skip non-dev packages if (!$package->isDev()) { continue; } // skip packages that will be updated/uninstalled foreach ($operations as $operation) { if (('update' === $operation->getJobType() && $operation->getInitialPackage()->equals($package)) || ('uninstall' === $operation->getJobType() && $operation->getPackage()->equals($package)) ) { continue 2; } } if ($this->update) { // skip package if the whitelist is enabled and it is not in it if ($this->updateWhitelist && !$this->isUpdateable($package)) { // check if non-updateable packages are out of date compared to the lock file to ensure we don't corrupt it foreach ($currentPackages as $curPackage) { if ($curPackage->isDev() && $curPackage->getName() === $package->getName() && $curPackage->getVersion() === $package->getVersion()) { if ($task === 'force-links') { $package->setRequires($curPackage->getRequires()); $package->setConflicts($curPackage->getConflicts()); $package->setProvides($curPackage->getProvides()); $package->setReplaces($curPackage->getReplaces()); } elseif ($task === 'force-updates') { if (($curPackage->getSourceReference() && $curPackage->getSourceReference() !== $package->getSourceReference()) || ($curPackage->getDistReference() && $curPackage->getDistReference() !== $package->getDistReference()) ) { $operations[] = new UpdateOperation($package, $curPackage); } } break; } } continue; } // find similar packages (name/version) in all repositories $matches = $pool->whatProvides($package->getName(), new Constraint('=', $package->getVersion())); foreach ($matches as $index => $match) { // skip local packages if (!in_array($match->getRepository(), $repositories, true)) { unset($matches[$index]); continue; } // skip providers/replacers if ($match->getName() !== $package->getName()) { unset($matches[$index]); continue; } $matches[$index] = $match->getId(); } // select preferred package according to policy rules if ($matches && $matches = $policy->selectPreferredPackages($pool, array(), $matches)) { $newPackage = $pool->literalToPackage($matches[0]); if ($task === 'force-links' && $newPackage) { $package->setRequires($newPackage->getRequires()); $package->setConflicts($newPackage->getConflicts()); $package->setProvides($newPackage->getProvides()); $package->setReplaces($newPackage->getReplaces()); } if ( $task === 'force-updates' && $newPackage && ( ($newPackage->getSourceReference() && $newPackage->getSourceReference() !== $package->getSourceReference()) || ($newPackage->getDistReference() && $newPackage->getDistReference() !== $package->getDistReference()) ) ) { $operations[] = new UpdateOperation($package, $newPackage); continue; } } if ($task === 'force-updates') { // force installed package to update to referenced version in root package if it does not match the installed version $references = $this->package->getReferences(); if (isset($references[$package->getName()]) && $references[$package->getName()] !== $package->getSourceReference()) { // changing the source ref to update to will be handled in the operations loop $operations[] = new UpdateOperation($package, clone $package); } } } else { // force update to locked version if it does not match the installed version foreach ($lockedRepository->findPackages($package->getName()) as $lockedPackage) { if ($lockedPackage->isDev() && $lockedPackage->getVersion() === $package->getVersion()) { if ($task === 'force-links') { $package->setRequires($lockedPackage->getRequires()); $package->setConflicts($lockedPackage->getConflicts()); $package->setProvides($lockedPackage->getProvides()); $package->setReplaces($lockedPackage->getReplaces()); } elseif ($task === 'force-updates') { if (($lockedPackage->getSourceReference() && $lockedPackage->getSourceReference() !== $package->getSourceReference()) || ($lockedPackage->getDistReference() && $lockedPackage->getDistReference() !== $package->getDistReference()) ) { $operations[] = new UpdateOperation($package, $lockedPackage); } } break; } } } } return $operations; } /** * Loads the most "current" list of packages that are installed meaning from lock ideally or from installed repo as fallback * @param RepositoryInterface $installedRepo * @return array */ private function getCurrentPackages($installedRepo) { if ($this->locker->isLocked()) { try { return $this->locker->getLockedRepository(true)->getPackages(); } catch (\RuntimeException $e) { // fetch only non-dev packages from lock if doing a dev update fails due to a previously incomplete lock file return $this->locker->getLockedRepository()->getPackages(); } } return $installedRepo->getPackages(); } /** * @return array */ private function getRootAliases() { if ($this->update) { $aliases = $this->package->getAliases(); } else { $aliases = $this->locker->getAliases(); } $normalizedAliases = array(); foreach ($aliases as $alias) { $normalizedAliases[$alias['package']][$alias['version']] = array( 'alias' => $alias['alias'], 'alias_normalized' => $alias['alias_normalized'], ); } return $normalizedAliases; } /** * @param Pool $pool * @param PolicyInterface $policy * @param WritableRepositoryInterface $localRepo * @param array $repositories */ private function processPackageUrls($pool, $policy, $localRepo, $repositories) { if (!$this->update) { return; } $rootRefs = $this->package->getReferences(); foreach ($localRepo->getCanonicalPackages() as $package) { // find similar packages (name/version) in all repositories $matches = $pool->whatProvides($package->getName(), new Constraint('=', $package->getVersion())); foreach ($matches as $index => $match) { // skip local packages if (!in_array($match->getRepository(), $repositories, true)) { unset($matches[$index]); continue; } // skip providers/replacers if ($match->getName() !== $package->getName()) { unset($matches[$index]); continue; } $matches[$index] = $match->getId(); } // select preferred package according to policy rules if ($matches && $matches = $policy->selectPreferredPackages($pool, array(), $matches)) { $newPackage = $pool->literalToPackage($matches[0]); // update the dist and source URLs $sourceUrl = $package->getSourceUrl(); $newSourceUrl = $newPackage->getSourceUrl(); $newReference = $newPackage->getSourceReference(); if ($package->isDev() && isset($rootRefs[$package->getName()]) && $package->getSourceReference() === $rootRefs[$package->getName()]) { $newReference = $rootRefs[$package->getName()]; } $this->updatePackageUrl($package, $newSourceUrl, $newPackage->getSourceType(), $newReference, $newPackage->getDistUrl(), $newPackage->getDistType(), $newPackage->getDistSha1Checksum()); if ($package instanceof CompletePackage && $newPackage instanceof CompletePackage) { $package->setAbandoned($newPackage->getReplacementPackage() ?: $newPackage->isAbandoned()); } $package->setDistMirrors($newPackage->getDistMirrors()); $package->setSourceMirrors($newPackage->getSourceMirrors()); $package->setTransportOptions($newPackage->getTransportOptions()); } } } private function updatePackageUrl(PackageInterface $package, $sourceUrl, $sourceType, $sourceReference, $distUrl, $distType, $distShaSum) { $oldSourceRef = $package->getSourceReference(); if ($package->getSourceUrl() !== $sourceUrl) { $package->setSourceType($sourceType); $package->setSourceUrl($sourceUrl); $package->setSourceReference($sourceReference); } // only update dist url for github/bitbucket/gitlab dists as they use a combination of dist url + dist reference to install // but for other urls this is ambiguous and could result in bad outcomes if (preg_match('{^https?://(?:(?:www\.)?bitbucket\.org|(api\.)?github\.com|(?:www\.)?gitlab\.com)/}i', $distUrl)) { $package->setDistUrl($distUrl); $package->setDistType($distType); $package->setDistSha1Checksum($distShaSum); $this->updateInstallReferences($package, $sourceReference); } if ($this->updateWhitelist && !$this->isUpdateable($package)) { $this->updateInstallReferences($package, $oldSourceRef); } } private function updateInstallReferences(PackageInterface $package, $reference) { if (!$reference) { return; } $package->setSourceReference($reference); if (preg_match('{^https?://(?:(?:www\.)?bitbucket\.org|(api\.)?github\.com|(?:www\.)?gitlab\.com)/}i', $package->getDistUrl())) { $package->setDistReference($reference); $package->setDistUrl(preg_replace('{(?<=/|sha=)[a-f0-9]{40}(?=/|$)}i', $reference, $package->getDistUrl())); } elseif ($package->getDistReference()) { // update the dist reference if there was one, but if none was provided ignore it $package->setDistReference($reference); } } /** * @param PlatformRepository $platformRepo * @param array $aliases */ private function aliasPlatformPackages(PlatformRepository $platformRepo, $aliases) { foreach ($aliases as $package => $versions) { foreach ($versions as $version => $alias) { $packages = $platformRepo->findPackages($package, $version); foreach ($packages as $package) { $aliasPackage = new AliasPackage($package, $alias['alias_normalized'], $alias['alias']); $aliasPackage->setRootPackageAlias(true); $platformRepo->addPackage($aliasPackage); } } } } /** * @param PackageInterface $package * @return bool */ private function isUpdateable(PackageInterface $package) { if (!$this->updateWhitelist) { throw new \LogicException('isUpdateable should only be called when a whitelist is present'); } foreach ($this->updateWhitelist as $whiteListedPattern => $void) { $patternRegexp = BasePackage::packageNameToRegexp($whiteListedPattern); if (preg_match($patternRegexp, $package->getName())) { return true; } } return false; } /** * @param array $links * @return array */ private function extractPlatformRequirements($links) { $platformReqs = array(); foreach ($links as $link) { if (preg_match(PlatformRepository::PLATFORM_PACKAGE_REGEX, $link->getTarget())) { $platformReqs[$link->getTarget()] = $link->getPrettyConstraint(); } } return $platformReqs; } /** * Adds all dependencies of the update whitelist to the whitelist, too. * * Packages which are listed as requirements in the root package will be * skipped including their dependencies, unless they are listed in the * update whitelist themselves or $whitelistAllDependencies is true. * * @param RepositoryInterface $localOrLockRepo Use the locked repo if available, otherwise installed repo will do * As we want the most accurate package list to work with, and installed * repo might be empty but locked repo will always be current. * @param array $rootRequires An array of links to packages in require of the root package * @param array $rootDevRequires An array of links to packages in require-dev of the root package */ private function whitelistUpdateDependencies($localOrLockRepo, array $rootRequires, array $rootDevRequires) { if (!$this->updateWhitelist) { return; } $rootRequires = array_merge($rootRequires, $rootDevRequires); $skipPackages = array(); if (!$this->whitelistAllDependencies) { foreach ($rootRequires as $require) { $skipPackages[$require->getTarget()] = true; } } $pool = new Pool('dev'); $pool->addRepository($localOrLockRepo); $seen = array(); $rootRequiredPackageNames = array_keys($rootRequires); foreach ($this->updateWhitelist as $packageName => $void) { $packageQueue = new \SplQueue; $nameMatchesRequiredPackage = false; $depPackages = $pool->whatProvides($packageName); $matchesByPattern = array(); // check if the name is a glob pattern that did not match directly if (empty($depPackages)) { // add any installed package matching the whitelisted name/pattern $whitelistPatternSearchRegexp = BasePackage::packageNameToRegexp($packageName, '^%s$'); foreach ($localOrLockRepo->search($whitelistPatternSearchRegexp) as $installedPackage) { $matchesByPattern[] = $pool->whatProvides($installedPackage['name']); } // add root requirements which match the whitelisted name/pattern $whitelistPatternRegexp = BasePackage::packageNameToRegexp($packageName); foreach ($rootRequiredPackageNames as $rootRequiredPackageName) { if (preg_match($whitelistPatternRegexp, $rootRequiredPackageName)) { $nameMatchesRequiredPackage = true; break; } } } if (!empty($matchesByPattern)) { $depPackages = array_merge($depPackages, call_user_func_array('array_merge', $matchesByPattern)); } if (count($depPackages) == 0 && !$nameMatchesRequiredPackage && !in_array($packageName, array('nothing', 'lock', 'mirrors'))) { $this->io->writeError('<warning>Package "' . $packageName . '" listed for update is not installed. Ignoring.</warning>'); } foreach ($depPackages as $depPackage) { $packageQueue->enqueue($depPackage); } while (!$packageQueue->isEmpty()) { $package = $packageQueue->dequeue(); if (isset($seen[$package->getId()])) { continue; } $seen[$package->getId()] = true; $this->updateWhitelist[$package->getName()] = true; if (!$this->whitelistDependencies && !$this->whitelistAllDependencies) { continue; } $requires = $package->getRequires(); foreach ($requires as $require) { $requirePackages = $pool->whatProvides($require->getTarget()); foreach ($requirePackages as $requirePackage) { if (isset($this->updateWhitelist[$requirePackage->getName()])) { continue; } if (isset($skipPackages[$requirePackage->getName()]) && !preg_match(BasePackage::packageNameToRegexp($packageName), $requirePackage->getName())) { $this->io->writeError('<warning>Dependency "' . $requirePackage->getName() . '" is also a root requirement, but is not explicitly whitelisted. Ignoring.</warning>'); continue; } $packageQueue->enqueue($requirePackage); } } } } } /** * Replace local repositories with InstalledArrayRepository instances * * This is to prevent any accidental modification of the existing repos on disk * * @param RepositoryManager $rm */ private function mockLocalRepositories(RepositoryManager $rm) { $packages = array(); foreach ($rm->getLocalRepository()->getPackages() as $package) { $packages[(string) $package] = clone $package; } foreach ($packages as $key => $package) { if ($package instanceof AliasPackage) { $alias = (string) $package->getAliasOf(); $packages[$key] = new AliasPackage($packages[$alias], $package->getVersion(), $package->getPrettyVersion()); } } $rm->setLocalRepository( new InstalledArrayRepository($packages) ); } /** * Create Installer * * @param IOInterface $io * @param Composer $composer * @return Installer */ public static function create(IOInterface $io, Composer $composer) { return new static( $io, $composer->getConfig(), $composer->getPackage(), $composer->getDownloadManager(), $composer->getRepositoryManager(), $composer->getLocker(), $composer->getInstallationManager(), $composer->getEventDispatcher(), $composer->getAutoloadGenerator() ); } /** * @param RepositoryInterface $additionalInstalledRepository * @return $this */ public function setAdditionalInstalledRepository(RepositoryInterface $additionalInstalledRepository) { $this->additionalInstalledRepository = $additionalInstalledRepository; return $this; } /** * Whether to run in drymode or not * * @param bool $dryRun * @return Installer */ public function setDryRun($dryRun = true) { $this->dryRun = (bool) $dryRun; return $this; } /** * Checks, if this is a dry run (simulation mode). * * @return bool */ public function isDryRun() { return $this->dryRun; } /** * prefer source installation * * @param bool $preferSource * @return Installer */ public function setPreferSource($preferSource = true) { $this->preferSource = (bool) $preferSource; return $this; } /** * prefer dist installation * * @param bool $preferDist * @return Installer */ public function setPreferDist($preferDist = true) { $this->preferDist = (bool) $preferDist; return $this; } /** * Whether or not generated autoloader are optimized * * @param bool $optimizeAutoloader * @return Installer */ public function setOptimizeAutoloader($optimizeAutoloader = false) { $this->optimizeAutoloader = (bool) $optimizeAutoloader; if (!$this->optimizeAutoloader) { // Force classMapAuthoritative off when not optimizing the // autoloader $this->setClassMapAuthoritative(false); } return $this; } /** * Whether or not generated autoloader considers the class map * authoritative. * * @param bool $classMapAuthoritative * @return Installer */ public function setClassMapAuthoritative($classMapAuthoritative = false) { $this->classMapAuthoritative = (bool) $classMapAuthoritative; if ($this->classMapAuthoritative) { // Force optimizeAutoloader when classmap is authoritative $this->setOptimizeAutoloader(true); } return $this; } /** * Whether or not generated autoloader considers APCu caching. * * @param bool $apcuAutoloader * @return Installer */ public function setApcuAutoloader($apcuAutoloader = false) { $this->apcuAutoloader = (bool) $apcuAutoloader; return $this; } /** * update packages * * @param bool $update * @return Installer */ public function setUpdate($update = true) { $this->update = (bool) $update; return $this; } /** * enables dev packages * * @param bool $devMode * @return Installer */ public function setDevMode($devMode = true) { $this->devMode = (bool) $devMode; return $this; } /** * set whether to run autoloader or not * * This is disabled implicitly when enabling dryRun * * @param bool $dumpAutoloader * @return Installer */ public function setDumpAutoloader($dumpAutoloader = true) { $this->dumpAutoloader = (bool) $dumpAutoloader; return $this; } /** * set whether to run scripts or not * * This is disabled implicitly when enabling dryRun * * @param bool $runScripts * @return Installer */ public function setRunScripts($runScripts = true) { $this->runScripts = (bool) $runScripts; return $this; } /** * set the config instance * * @param Config $config * @return Installer */ public function setConfig(Config $config) { $this->config = $config; return $this; } /** * run in verbose mode * * @param bool $verbose * @return Installer */ public function setVerbose($verbose = true) { $this->verbose = (bool) $verbose; return $this; } /** * Checks, if running in verbose mode. * * @return bool */ public function isVerbose() { return $this->verbose; } /** * set ignore Platform Package requirements * * @param bool $ignorePlatformReqs * @return Installer */ public function setIgnorePlatformRequirements($ignorePlatformReqs = false) { $this->ignorePlatformReqs = (bool) $ignorePlatformReqs; return $this; } /** * restrict the update operation to a few packages, all other packages * that are already installed will be kept at their current version * * @param array $packages * @return Installer */ public function setUpdateWhitelist(array $packages) { $this->updateWhitelist = array_flip(array_map('strtolower', $packages)); return $this; } /** * @deprecated use setWhitelistTransitiveDependencies instead */ public function setWhitelistDependencies($updateDependencies = true) { return $this->setWhitelistTransitiveDependencies($updateDependencies); } /** * Should dependencies of whitelisted packages (but not direct dependencies) be updated? * * This will NOT whitelist any dependencies that are also directly defined * in the root package. * * @param bool $updateTransitiveDependencies * @return Installer */ public function setWhitelistTransitiveDependencies($updateTransitiveDependencies = true) { $this->whitelistDependencies = (bool) $updateTransitiveDependencies; return $this; } /** * Should all dependencies of whitelisted packages be updated recursively? * * This will whitelist any dependencies of the whitelisted packages, including * those defined in the root package. * * @param bool $updateAllDependencies * @return Installer */ public function setWhitelistAllDependencies($updateAllDependencies = true) { $this->whitelistAllDependencies = (bool) $updateAllDependencies; return $this; } /** * Should packages be preferred in a stable version when updating? * * @param bool $preferStable * @return Installer */ public function setPreferStable($preferStable = true) { $this->preferStable = (bool) $preferStable; return $this; } /** * Should packages be preferred in a lowest version when updating? * * @param bool $preferLowest * @return Installer */ public function setPreferLowest($preferLowest = true) { $this->preferLowest = (bool) $preferLowest; return $this; } /** * Should the lock file be updated when updating? * * This is disabled implicitly when enabling dryRun * * @param bool $writeLock * @return Installer */ public function setWriteLock($writeLock = true) { $this->writeLock = (bool) $writeLock; return $this; } /** * Should the operations (package install, update and removal) be executed on disk? * * This is disabled implicitly when enabling dryRun * * @param bool $executeOperations * @return Installer */ public function setExecuteOperations($executeOperations = true) { $this->executeOperations = (bool) $executeOperations; return $this; } /** * Should suggestions be skipped? * * @param bool $skipSuggest * @return Installer */ public function setSkipSuggest($skipSuggest = true) { $this->skipSuggest = (bool) $skipSuggest; return $this; } /** * Disables plugins. * * Call this if you want to ensure that third-party code never gets * executed. The default is to automatically install, and execute * custom third-party installers. * * @return Installer */ public function disablePlugins() { $this->installationManager->disablePlugins(); return $this; } /** * @param SuggestedPackagesReporter $suggestedPackagesReporter * @return Installer */ public function setSuggestedPackagesReporter(SuggestedPackagesReporter $suggestedPackagesReporter) { $this->suggestedPackagesReporter = $suggestedPackagesReporter; return $this; } } composer/src/Composer/Cache.php 0000644 00000017115 14736103146 0012477 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer; use Composer\IO\IOInterface; use Composer\Util\Filesystem; use Composer\Util\Silencer; use Symfony\Component\Finder\Finder; /** * Reads/writes to a filesystem cache * * @author Jordi Boggiano <j.boggiano@seld.be> */ class Cache { private static $cacheCollected = false; private $io; private $root; private $enabled = true; private $whitelist; private $filesystem; /** * @param IOInterface $io * @param string $cacheDir location of the cache * @param string $whitelist List of characters that are allowed in path names (used in a regex character class) * @param Filesystem $filesystem optional filesystem instance */ public function __construct(IOInterface $io, $cacheDir, $whitelist = 'a-z0-9.', Filesystem $filesystem = null) { $this->io = $io; $this->root = rtrim($cacheDir, '/\\') . '/'; $this->whitelist = $whitelist; $this->filesystem = $filesystem ?: new Filesystem(); if (!self::isUsable($cacheDir)) { $this->enabled = false; return; } if ( (!is_dir($this->root) && !Silencer::call('mkdir', $this->root, 0777, true)) || !is_writable($this->root) ) { $this->io->writeError('<warning>Cannot create cache directory ' . $this->root . ', or directory is not writable. Proceeding without cache</warning>'); $this->enabled = false; } } public static function isUsable($path) { return !preg_match('{(^|[\\\\/])(\$null|nul|NUL|/dev/null)([\\\\/]|$)}', $path); } public function isEnabled() { return $this->enabled; } public function getRoot() { return $this->root; } public function read($file) { if ($this->enabled) { $file = preg_replace('{[^'.$this->whitelist.']}i', '-', $file); if (file_exists($this->root . $file)) { $this->io->writeError('Reading '.$this->root . $file.' from cache', true, IOInterface::DEBUG); return file_get_contents($this->root . $file); } } return false; } public function write($file, $contents) { if ($this->enabled) { $file = preg_replace('{[^'.$this->whitelist.']}i', '-', $file); $this->io->writeError('Writing '.$this->root . $file.' into cache', true, IOInterface::DEBUG); try { return file_put_contents($this->root . $file, $contents); } catch (\ErrorException $e) { $this->io->writeError('<warning>Failed to write into cache: '.$e->getMessage().'</warning>', true, IOInterface::DEBUG); if (preg_match('{^file_put_contents\(\): Only ([0-9]+) of ([0-9]+) bytes written}', $e->getMessage(), $m)) { // Remove partial file. unlink($this->root . $file); $message = sprintf( '<warning>Writing %1$s into cache failed after %2$u of %3$u bytes written, only %4$u bytes of free space available</warning>', $this->root . $file, $m[1], $m[2], @disk_free_space($this->root . dirname($file)) ); $this->io->writeError($message); return false; } throw $e; } } return false; } /** * Copy a file into the cache */ public function copyFrom($file, $source) { if ($this->enabled) { $file = preg_replace('{[^'.$this->whitelist.']}i', '-', $file); $this->filesystem->ensureDirectoryExists(dirname($this->root . $file)); if (!file_exists($source)) { $this->io->writeError('<error>'.$source.' does not exist, can not write into cache</error>'); } elseif ($this->io->isDebug()) { $this->io->writeError('Writing '.$this->root . $file.' into cache from '.$source); } return copy($source, $this->root . $file); } return false; } /** * Copy a file out of the cache */ public function copyTo($file, $target) { if ($this->enabled) { $file = preg_replace('{[^'.$this->whitelist.']}i', '-', $file); if (file_exists($this->root . $file)) { try { touch($this->root . $file, filemtime($this->root . $file), time()); } catch (\ErrorException $e) { // fallback in case the above failed due to incorrect ownership // see https://github.com/composer/composer/issues/4070 Silencer::call('touch', $this->root . $file); } $this->io->writeError('Reading '.$this->root . $file.' from cache', true, IOInterface::DEBUG); return copy($this->root . $file, $target); } } return false; } public function gcIsNecessary() { return (!self::$cacheCollected && !mt_rand(0, 50)); } public function remove($file) { if ($this->enabled) { $file = preg_replace('{[^'.$this->whitelist.']}i', '-', $file); if (file_exists($this->root . $file)) { return $this->filesystem->unlink($this->root . $file); } } return false; } public function clear() { if ($this->enabled) { $this->filesystem->emptyDirectory($this->root); return true; } return false; } public function gc($ttl, $maxSize) { if ($this->enabled) { $expire = new \DateTime(); $expire->modify('-'.$ttl.' seconds'); $finder = $this->getFinder()->date('until '.$expire->format('Y-m-d H:i:s')); foreach ($finder as $file) { $this->filesystem->unlink($file->getPathname()); } $totalSize = $this->filesystem->size($this->root); if ($totalSize > $maxSize) { $iterator = $this->getFinder()->sortByAccessedTime()->getIterator(); while ($totalSize > $maxSize && $iterator->valid()) { $filepath = $iterator->current()->getPathname(); $totalSize -= $this->filesystem->size($filepath); $this->filesystem->unlink($filepath); $iterator->next(); } } self::$cacheCollected = true; return true; } return false; } public function sha1($file) { if ($this->enabled) { $file = preg_replace('{[^'.$this->whitelist.']}i', '-', $file); if (file_exists($this->root . $file)) { return sha1_file($this->root . $file); } } return false; } public function sha256($file) { if ($this->enabled) { $file = preg_replace('{[^'.$this->whitelist.']}i', '-', $file); if (file_exists($this->root . $file)) { return hash_file('sha256', $this->root . $file); } } return false; } protected function getFinder() { return Finder::create()->in($this->root)->files(); } } composer/src/Composer/XdebugHandler.php 0000644 00000001515 14736103146 0014205 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer; use Symfony\Component\Console\Output\OutputInterface; trigger_error('The ' . __NAMESPACE__ . '\XdebugHandler class is deprecated, use Composer\XdebugHandler\XdebugHandler instead,', E_USER_DEPRECATED); /** * @deprecated use Composer\XdebugHandler\XdebugHandler instead */ class XdebugHandler extends XdebugHandler\XdebugHandler { const ENV_ALLOW = 'COMPOSER_ALLOW_XDEBUG'; const ENV_VERSION = 'COMPOSER_XDEBUG_VERSION'; public function __construct(OutputInterface $output) { parent::__construct('composer', '--ansi'); } } composer/src/Composer/Repository/RepositoryFactory.php 0000644 00000015747 14736103146 0017373 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository; use Composer\Factory; use Composer\IO\IOInterface; use Composer\Config; use Composer\EventDispatcher\EventDispatcher; use Composer\Util\RemoteFilesystem; use Composer\Json\JsonFile; /** * @author Jordi Boggiano <j.boggiano@seld.be> */ class RepositoryFactory { /** * @param IOInterface $io * @param Config $config * @param string $repository * @param bool $allowFilesystem * @return array|mixed */ public static function configFromString(IOInterface $io, Config $config, $repository, $allowFilesystem = false) { if (0 === strpos($repository, 'http')) { $repoConfig = array('type' => 'composer', 'url' => $repository); } elseif ("json" === pathinfo($repository, PATHINFO_EXTENSION)) { $json = new JsonFile($repository, Factory::createRemoteFilesystem($io, $config)); $data = $json->read(); if (!empty($data['packages']) || !empty($data['includes']) || !empty($data['provider-includes'])) { $repoConfig = array('type' => 'composer', 'url' => 'file://' . strtr(realpath($repository), '\\', '/')); } elseif ($allowFilesystem) { $repoConfig = array('type' => 'filesystem', 'json' => $json); } else { throw new \InvalidArgumentException("Invalid repository URL ($repository) given. This file does not contain a valid composer repository."); } } elseif ('{' === substr($repository, 0, 1)) { // assume it is a json object that makes a repo config $repoConfig = JsonFile::parseJson($repository); } else { throw new \InvalidArgumentException("Invalid repository url ($repository) given. Has to be a .json file, an http url or a JSON object."); } return $repoConfig; } /** * @param IOInterface $io * @param Config $config * @param string $repository * @param bool $allowFilesystem * @return RepositoryInterface */ public static function fromString(IOInterface $io, Config $config, $repository, $allowFilesystem = false) { $repoConfig = static::configFromString($io, $config, $repository, $allowFilesystem); return static::createRepo($io, $config, $repoConfig); } /** * @param IOInterface $io * @param Config $config * @param array $repoConfig * @return RepositoryInterface */ public static function createRepo(IOInterface $io, Config $config, array $repoConfig) { $rm = static::manager($io, $config, null, Factory::createRemoteFilesystem($io, $config)); $repos = static::createRepos($rm, array($repoConfig)); return reset($repos); } /** * @param IOInterface|null $io * @param Config|null $config * @param RepositoryManager|null $rm * @return RepositoryInterface[] */ public static function defaultRepos(IOInterface $io = null, Config $config = null, RepositoryManager $rm = null) { if (!$config) { $config = Factory::createConfig($io); } if ($io) { $io->loadConfiguration($config); } if (!$rm) { if (!$io) { throw new \InvalidArgumentException('This function requires either an IOInterface or a RepositoryManager'); } $rm = static::manager($io, $config, null, Factory::createRemoteFilesystem($io, $config)); } return static::createRepos($rm, $config->getRepositories()); } /** * @param IOInterface $io * @param Config $config * @param EventDispatcher $eventDispatcher * @param RemoteFilesystem $rfs * @return RepositoryManager */ public static function manager(IOInterface $io, Config $config, EventDispatcher $eventDispatcher = null, RemoteFilesystem $rfs = null) { $rm = new RepositoryManager($io, $config, $eventDispatcher, $rfs); $rm->setRepositoryClass('composer', 'Composer\Repository\ComposerRepository'); $rm->setRepositoryClass('vcs', 'Composer\Repository\VcsRepository'); $rm->setRepositoryClass('package', 'Composer\Repository\PackageRepository'); $rm->setRepositoryClass('pear', 'Composer\Repository\PearRepository'); $rm->setRepositoryClass('git', 'Composer\Repository\VcsRepository'); $rm->setRepositoryClass('git-bitbucket', 'Composer\Repository\VcsRepository'); $rm->setRepositoryClass('github', 'Composer\Repository\VcsRepository'); $rm->setRepositoryClass('gitlab', 'Composer\Repository\VcsRepository'); $rm->setRepositoryClass('svn', 'Composer\Repository\VcsRepository'); $rm->setRepositoryClass('fossil', 'Composer\Repository\VcsRepository'); $rm->setRepositoryClass('perforce', 'Composer\Repository\VcsRepository'); $rm->setRepositoryClass('hg', 'Composer\Repository\VcsRepository'); $rm->setRepositoryClass('hg-bitbucket', 'Composer\Repository\VcsRepository'); $rm->setRepositoryClass('artifact', 'Composer\Repository\ArtifactRepository'); $rm->setRepositoryClass('path', 'Composer\Repository\PathRepository'); return $rm; } /** * @return RepositoryInterface[] */ private static function createRepos(RepositoryManager $rm, array $repoConfigs) { $repos = array(); foreach ($repoConfigs as $index => $repo) { if (is_string($repo)) { throw new \UnexpectedValueException('"repositories" should be an array of repository definitions, only a single repository was given'); } if (!is_array($repo)) { throw new \UnexpectedValueException('Repository "'.$index.'" ('.json_encode($repo).') should be an array, '.gettype($repo).' given'); } if (!isset($repo['type'])) { throw new \UnexpectedValueException('Repository "'.$index.'" ('.json_encode($repo).') must have a type defined'); } $name = self::generateRepositoryName($index, $repo, $repos); if ($repo['type'] === 'filesystem') { $repos[$name] = new FilesystemRepository($repo['json']); } else { $repos[$name] = $rm->createRepository($repo['type'], $repo, $index); } } return $repos; } public static function generateRepositoryName($index, array $repo, array $existingRepos) { $name = is_int($index) && isset($repo['url']) ? preg_replace('{^https?://}i', '', $repo['url']) : $index; while (isset($existingRepos[$name])) { $name .= '2'; } return $name; } } composer/src/Composer/Repository/ConfigurableRepositoryInterface.php 0000644 00000000736 14736103146 0022175 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository; /** * Configurable repository interface. * * @author Lukas Homza <lukashomz@gmail.com> */ interface ConfigurableRepositoryInterface { public function getRepoConfig(); } composer/src/Composer/Repository/VersionCacheInterface.php 0000644 00000001172 14736103146 0020041 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository; interface VersionCacheInterface { /** * @param string $version * @param string $identifier * @return array|null|false Package version data if found, false to indicate the identifier is known but has no package, null for an unknown identifier */ public function getVersionPackage($version, $identifier); } composer/src/Composer/Repository/InvalidRepositoryException.php 0000644 00000000737 14736103146 0021222 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository; /** * Exception thrown when a package repository is utterly broken * * @author Jordi Boggiano <j.boggiano@seld.be> */ class InvalidRepositoryException extends \Exception { } composer/src/Composer/Repository/VcsRepository.php 0000644 00000037665 14736103146 0016522 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository; use Composer\Downloader\TransportException; use Composer\Repository\Vcs\VcsDriverInterface; use Composer\Package\Version\VersionParser; use Composer\Package\Loader\ArrayLoader; use Composer\Package\Loader\ValidatingArrayLoader; use Composer\Package\Loader\InvalidPackageException; use Composer\Package\Loader\LoaderInterface; use Composer\EventDispatcher\EventDispatcher; use Composer\Semver\Constraint\Constraint; use Composer\IO\IOInterface; use Composer\Config; /** * @author Jordi Boggiano <j.boggiano@seld.be> */ class VcsRepository extends ArrayRepository implements ConfigurableRepositoryInterface { protected $url; protected $packageName; protected $isVerbose; protected $isVeryVerbose; protected $io; protected $config; protected $versionParser; protected $type; protected $loader; protected $repoConfig; protected $branchErrorOccurred = false; private $drivers; /** @var VcsDriverInterface */ private $driver; /** @var VersionCacheInterface */ private $versionCache; private $emptyReferences = array(); private $versionTransportExceptions = array(); public function __construct(array $repoConfig, IOInterface $io, Config $config, EventDispatcher $dispatcher = null, array $drivers = null, VersionCacheInterface $versionCache = null) { parent::__construct(); $this->drivers = $drivers ?: array( 'github' => 'Composer\Repository\Vcs\GitHubDriver', 'gitlab' => 'Composer\Repository\Vcs\GitLabDriver', 'git-bitbucket' => 'Composer\Repository\Vcs\GitBitbucketDriver', 'git' => 'Composer\Repository\Vcs\GitDriver', 'hg-bitbucket' => 'Composer\Repository\Vcs\HgBitbucketDriver', 'hg' => 'Composer\Repository\Vcs\HgDriver', 'perforce' => 'Composer\Repository\Vcs\PerforceDriver', 'fossil' => 'Composer\Repository\Vcs\FossilDriver', // svn must be last because identifying a subversion server for sure is practically impossible 'svn' => 'Composer\Repository\Vcs\SvnDriver', ); $this->url = $repoConfig['url']; $this->io = $io; $this->type = isset($repoConfig['type']) ? $repoConfig['type'] : 'vcs'; $this->isVerbose = $io->isVerbose(); $this->isVeryVerbose = $io->isVeryVerbose(); $this->config = $config; $this->repoConfig = $repoConfig; $this->versionCache = $versionCache; } public function getRepoConfig() { return $this->repoConfig; } public function setLoader(LoaderInterface $loader) { $this->loader = $loader; } public function getDriver() { if ($this->driver) { return $this->driver; } if (isset($this->drivers[$this->type])) { $class = $this->drivers[$this->type]; $this->driver = new $class($this->repoConfig, $this->io, $this->config); $this->driver->initialize(); return $this->driver; } foreach ($this->drivers as $driver) { if ($driver::supports($this->io, $this->config, $this->url)) { $this->driver = new $driver($this->repoConfig, $this->io, $this->config); $this->driver->initialize(); return $this->driver; } } foreach ($this->drivers as $driver) { if ($driver::supports($this->io, $this->config, $this->url, true)) { $this->driver = new $driver($this->repoConfig, $this->io, $this->config); $this->driver->initialize(); return $this->driver; } } } public function hadInvalidBranches() { return $this->branchErrorOccurred; } public function getEmptyReferences() { return $this->emptyReferences; } public function getVersionTransportExceptions() { return $this->versionTransportExceptions; } protected function initialize() { parent::initialize(); $isVerbose = $this->isVerbose; $isVeryVerbose = $this->isVeryVerbose; $driver = $this->getDriver(); if (!$driver) { throw new \InvalidArgumentException('No driver found to handle VCS repository '.$this->url); } $this->versionParser = new VersionParser; if (!$this->loader) { $this->loader = new ArrayLoader($this->versionParser); } try { if ($driver->hasComposerFile($driver->getRootIdentifier())) { $data = $driver->getComposerInformation($driver->getRootIdentifier()); $this->packageName = !empty($data['name']) ? $data['name'] : null; } } catch (\Exception $e) { if ($isVeryVerbose) { $this->io->writeError('<error>Skipped parsing '.$driver->getRootIdentifier().', '.$e->getMessage().'</error>'); } } foreach ($driver->getTags() as $tag => $identifier) { $msg = 'Reading composer.json of <info>' . ($this->packageName ?: $this->url) . '</info> (<comment>' . $tag . '</comment>)'; if ($isVeryVerbose) { $this->io->writeError($msg); } elseif ($isVerbose) { $this->io->overwriteError($msg, false); } // strip the release- prefix from tags if present $tag = str_replace('release-', '', $tag); $cachedPackage = $this->getCachedPackageVersion($tag, $identifier, $isVerbose, $isVeryVerbose); if ($cachedPackage) { $this->addPackage($cachedPackage); continue; } elseif ($cachedPackage === false) { $this->emptyReferences[] = $identifier; continue; } if (!$parsedTag = $this->validateTag($tag)) { if ($isVeryVerbose) { $this->io->writeError('<warning>Skipped tag '.$tag.', invalid tag name</warning>'); } continue; } try { if (!$data = $driver->getComposerInformation($identifier)) { if ($isVeryVerbose) { $this->io->writeError('<warning>Skipped tag '.$tag.', no composer file</warning>'); } $this->emptyReferences[] = $identifier; continue; } // manually versioned package if (isset($data['version'])) { $data['version_normalized'] = $this->versionParser->normalize($data['version']); } else { // auto-versioned package, read value from tag $data['version'] = $tag; $data['version_normalized'] = $parsedTag; } // make sure tag packages have no -dev flag $data['version'] = preg_replace('{[.-]?dev$}i', '', $data['version']); $data['version_normalized'] = preg_replace('{(^dev-|[.-]?dev$)}i', '', $data['version_normalized']); // broken package, version doesn't match tag if ($data['version_normalized'] !== $parsedTag) { if ($isVeryVerbose) { $this->io->writeError('<warning>Skipped tag '.$tag.', tag ('.$parsedTag.') does not match version ('.$data['version_normalized'].') in composer.json</warning>'); } continue; } $tagPackageName = isset($data['name']) ? $data['name'] : $this->packageName; if ($existingPackage = $this->findPackage($tagPackageName, $data['version_normalized'])) { if ($isVeryVerbose) { $this->io->writeError('<warning>Skipped tag '.$tag.', it conflicts with an another tag ('.$existingPackage->getPrettyVersion().') as both resolve to '.$data['version_normalized'].' internally</warning>'); } continue; } if ($isVeryVerbose) { $this->io->writeError('Importing tag '.$tag.' ('.$data['version_normalized'].')'); } $this->addPackage($this->loader->load($this->preProcess($driver, $data, $identifier))); } catch (\Exception $e) { if ($e instanceof TransportException) { $this->versionTransportExceptions['tags'][$tag] = $e; if ($e->getCode() === 404) { $this->emptyReferences[] = $identifier; } } if ($isVeryVerbose) { $this->io->writeError('<warning>Skipped tag '.$tag.', '.($e instanceof TransportException ? 'no composer file was found (' . $e->getCode() . ' HTTP status code)' : $e->getMessage()).'</warning>'); } continue; } } if (!$isVeryVerbose) { $this->io->overwriteError('', false); } $branches = $driver->getBranches(); foreach ($branches as $branch => $identifier) { $msg = 'Reading composer.json of <info>' . ($this->packageName ?: $this->url) . '</info> (<comment>' . $branch . '</comment>)'; if ($isVeryVerbose) { $this->io->writeError($msg); } elseif ($isVerbose) { $this->io->overwriteError($msg, false); } if ($branch === 'trunk' && isset($branches['master'])) { if ($isVeryVerbose) { $this->io->writeError('<warning>Skipped branch '.$branch.', can not parse both master and trunk branches as they both resolve to 9999999-dev internally</warning>'); } continue; } if (!$parsedBranch = $this->validateBranch($branch)) { if ($isVeryVerbose) { $this->io->writeError('<warning>Skipped branch '.$branch.', invalid name</warning>'); } continue; } // make sure branch packages have a dev flag if ('dev-' === substr($parsedBranch, 0, 4) || '9999999-dev' === $parsedBranch) { $version = 'dev-' . $branch; } else { $prefix = substr($branch, 0, 1) === 'v' ? 'v' : ''; $version = $prefix . preg_replace('{(\.9{7})+}', '.x', $parsedBranch); } $cachedPackage = $this->getCachedPackageVersion($version, $identifier, $isVerbose, $isVeryVerbose); if ($cachedPackage) { $this->addPackage($cachedPackage); continue; } elseif ($cachedPackage === false) { $this->emptyReferences[] = $identifier; continue; } try { if (!$data = $driver->getComposerInformation($identifier)) { if ($isVeryVerbose) { $this->io->writeError('<warning>Skipped branch '.$branch.', no composer file</warning>'); } $this->emptyReferences[] = $identifier; continue; } // branches are always auto-versioned, read value from branch name $data['version'] = $version; $data['version_normalized'] = $parsedBranch; if ($isVeryVerbose) { $this->io->writeError('Importing branch '.$branch.' ('.$data['version'].')'); } $packageData = $this->preProcess($driver, $data, $identifier); $package = $this->loader->load($packageData); if ($this->loader instanceof ValidatingArrayLoader && $this->loader->getWarnings()) { throw new InvalidPackageException($this->loader->getErrors(), $this->loader->getWarnings(), $packageData); } $this->addPackage($package); } catch (TransportException $e) { $this->versionTransportExceptions['branches'][$branch] = $e; if ($e->getCode() === 404) { $this->emptyReferences[] = $identifier; } if ($isVeryVerbose) { $this->io->writeError('<warning>Skipped branch '.$branch.', no composer file was found (' . $e->getCode() . ' HTTP status code)</warning>'); } continue; } catch (\Exception $e) { if (!$isVeryVerbose) { $this->io->writeError(''); } $this->branchErrorOccurred = true; $this->io->writeError('<error>Skipped branch '.$branch.', '.$e->getMessage().'</error>'); $this->io->writeError(''); continue; } } $driver->cleanup(); if (!$isVeryVerbose) { $this->io->overwriteError('', false); } if (!$this->getPackages()) { throw new InvalidRepositoryException('No valid composer.json was found in any branch or tag of '.$this->url.', could not load a package from it.'); } } protected function preProcess(VcsDriverInterface $driver, array $data, $identifier) { // keep the name of the main identifier for all packages $dataPackageName = isset($data['name']) ? $data['name'] : null; $data['name'] = $this->packageName ?: $dataPackageName; if (!isset($data['dist'])) { $data['dist'] = $driver->getDist($identifier); } if (!isset($data['source'])) { $data['source'] = $driver->getSource($identifier); } return $data; } private function validateBranch($branch) { try { $normalizedBranch = $this->versionParser->normalizeBranch($branch); // validate that the branch name has no weird characters conflicting with constraints $this->versionParser->parseConstraints($normalizedBranch); return $normalizedBranch; } catch (\Exception $e) { } return false; } private function validateTag($version) { try { return $this->versionParser->normalize($version); } catch (\Exception $e) { } return false; } private function getCachedPackageVersion($version, $identifier, $isVerbose, $isVeryVerbose) { if (!$this->versionCache) { return; } $cachedPackage = $this->versionCache->getVersionPackage($version, $identifier); if ($cachedPackage === false) { if ($isVeryVerbose) { $this->io->writeError('<warning>Skipped '.$version.', no composer file (cached from ref '.$identifier.')</warning>'); } return false; } if ($cachedPackage) { $msg = 'Found cached composer.json of <info>' . ($this->packageName ?: $this->url) . '</info> (<comment>' . $version . '</comment>)'; if ($isVeryVerbose) { $this->io->writeError($msg); } elseif ($isVerbose) { $this->io->overwriteError($msg, false); } if ($existingPackage = $this->findPackage($cachedPackage['name'], new Constraint('=', $cachedPackage['version_normalized']))) { if ($isVeryVerbose) { $this->io->writeError('<warning>Skipped cached version '.$version.', it conflicts with an another tag ('.$existingPackage->getPrettyVersion().') as both resolve to '.$cachedPackage['version_normalized'].' internally</warning>'); } $cachedPackage = null; } } if ($cachedPackage) { return $this->loader->load($cachedPackage); } return null; } } composer/src/Composer/Repository/PlatformRepository.php 0000644 00000031622 14736103146 0017536 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository; use Composer\Composer; use Composer\Package\CompletePackage; use Composer\Package\PackageInterface; use Composer\Package\Version\VersionParser; use Composer\Plugin\PluginInterface; use Composer\Util\ProcessExecutor; use Composer\Util\Silencer; use Composer\Util\Platform; use Composer\XdebugHandler\XdebugHandler; use Symfony\Component\Process\ExecutableFinder; /** * @author Jordi Boggiano <j.boggiano@seld.be> */ class PlatformRepository extends ArrayRepository { const PLATFORM_PACKAGE_REGEX = '{^(?:php(?:-64bit|-ipv6|-zts|-debug)?|hhvm|(?:ext|lib)-[a-z0-9](?:[_.-]?[a-z0-9]+)*|composer-(?:plugin|runtime)-api)$}iD'; private $versionParser; /** * Defines overrides so that the platform can be mocked * * Should be an array of package name => version number mappings * * @var array */ private $overrides = array(); private $process; public function __construct(array $packages = array(), array $overrides = array(), ProcessExecutor $process = null) { $this->process = $process === null ? (new ProcessExecutor()) : $process; foreach ($overrides as $name => $version) { $this->overrides[strtolower($name)] = array('name' => $name, 'version' => $version); } parent::__construct($packages); } protected function initialize() { parent::initialize(); $this->versionParser = new VersionParser(); // Add each of the override versions as options. // Later we might even replace the extensions instead. foreach ($this->overrides as $override) { // Check that it's a platform package. if (!preg_match(self::PLATFORM_PACKAGE_REGEX, $override['name'])) { throw new \InvalidArgumentException('Invalid platform package name in config.platform: '.$override['name']); } $this->addOverriddenPackage($override); } $prettyVersion = PluginInterface::PLUGIN_API_VERSION; $version = $this->versionParser->normalize($prettyVersion); $composerPluginApi = new CompletePackage('composer-plugin-api', $version, $prettyVersion); $composerPluginApi->setDescription('The Composer Plugin API'); $this->addPackage($composerPluginApi); $prettyVersion = Composer::RUNTIME_API_VERSION; $version = $this->versionParser->normalize($prettyVersion); $composerRuntimeApi = new CompletePackage('composer-runtime-api', $version, $prettyVersion); $composerRuntimeApi->setDescription('The Composer Runtime API'); $this->addPackage($composerRuntimeApi); try { $prettyVersion = PHP_VERSION; $version = $this->versionParser->normalize($prettyVersion); } catch (\UnexpectedValueException $e) { $prettyVersion = preg_replace('#^([^~+-]+).*$#', '$1', PHP_VERSION); $version = $this->versionParser->normalize($prettyVersion); } $php = new CompletePackage('php', $version, $prettyVersion); $php->setDescription('The PHP interpreter'); $this->addPackage($php); if (PHP_DEBUG) { $phpdebug = new CompletePackage('php-debug', $version, $prettyVersion); $phpdebug->setDescription('The PHP interpreter, with debugging symbols'); $this->addPackage($phpdebug); } if (defined('PHP_ZTS') && PHP_ZTS) { $phpzts = new CompletePackage('php-zts', $version, $prettyVersion); $phpzts->setDescription('The PHP interpreter, with Zend Thread Safety'); $this->addPackage($phpzts); } if (PHP_INT_SIZE === 8) { $php64 = new CompletePackage('php-64bit', $version, $prettyVersion); $php64->setDescription('The PHP interpreter, 64bit'); $this->addPackage($php64); } // The AF_INET6 constant is only defined if ext-sockets is available but // IPv6 support might still be available. if (defined('AF_INET6') || Silencer::call('inet_pton', '::') !== false) { $phpIpv6 = new CompletePackage('php-ipv6', $version, $prettyVersion); $phpIpv6->setDescription('The PHP interpreter, with IPv6 support'); $this->addPackage($phpIpv6); } $loadedExtensions = get_loaded_extensions(); // Extensions scanning foreach ($loadedExtensions as $name) { if (in_array($name, array('standard', 'Core'))) { continue; } $reflExt = new \ReflectionExtension($name); $prettyVersion = $reflExt->getVersion(); $this->addExtension($name, $prettyVersion); } // Check for Xdebug in a restarted process if (!in_array('xdebug', $loadedExtensions, true) && ($prettyVersion = XdebugHandler::getSkippedVersion())) { $this->addExtension('xdebug', $prettyVersion); } // Another quick loop, just for possible libraries // Doing it this way to know that functions or constants exist before // relying on them. foreach ($loadedExtensions as $name) { $prettyVersion = null; $description = 'The '.$name.' PHP library'; switch ($name) { case 'curl': $curlVersion = curl_version(); $prettyVersion = $curlVersion['version']; break; case 'iconv': $prettyVersion = ICONV_VERSION; break; case 'intl': $name = 'ICU'; if (defined('INTL_ICU_VERSION')) { $prettyVersion = INTL_ICU_VERSION; } else { $reflector = new \ReflectionExtension('intl'); ob_start(); $reflector->info(); $output = ob_get_clean(); preg_match('/^ICU version => (.*)$/m', $output, $matches); $prettyVersion = $matches[1]; } break; case 'imagick': $imagick = new \Imagick(); $imageMagickVersion = $imagick->getVersion(); // 6.x: ImageMagick 6.2.9 08/24/06 Q16 http://www.imagemagick.org // 7.x: ImageMagick 7.0.8-34 Q16 x86_64 2019-03-23 https://imagemagick.org preg_match('/^ImageMagick ([\d.]+)(?:-(\d+))?/', $imageMagickVersion['versionString'], $matches); if (isset($matches[2])) { $prettyVersion = "{$matches[1]}.{$matches[2]}"; } else { $prettyVersion = $matches[1]; } break; case 'libxml': $prettyVersion = LIBXML_DOTTED_VERSION; break; case 'openssl': $prettyVersion = preg_replace_callback('{^(?:OpenSSL|LibreSSL)?\s*([0-9.]+)([a-z]*).*}i', function ($match) { if (empty($match[2])) { return $match[1]; } // OpenSSL versions add another letter when they reach Z. // e.g. OpenSSL 0.9.8zh 3 Dec 2015 if (!preg_match('{^z*[a-z]$}', $match[2])) { // 0.9.8abc is garbage return 0; } $len = strlen($match[2]); $patchVersion = ($len - 1) * 26; // All Z $patchVersion += ord($match[2][$len - 1]) - 96; return $match[1].'.'.$patchVersion; }, OPENSSL_VERSION_TEXT); $description = OPENSSL_VERSION_TEXT; break; case 'pcre': $prettyVersion = preg_replace('{^(\S+).*}', '$1', PCRE_VERSION); break; case 'uuid': $prettyVersion = phpversion('uuid'); break; case 'xsl': $prettyVersion = LIBXSLT_DOTTED_VERSION; break; default: // None handled extensions have no special cases, skip continue 2; } try { $version = $this->versionParser->normalize($prettyVersion); } catch (\UnexpectedValueException $e) { continue; } $lib = new CompletePackage('lib-'.$name, $version, $prettyVersion); $lib->setDescription($description); $this->addPackage($lib); } $hhvmVersion = defined('HHVM_VERSION') ? HHVM_VERSION : null; if ($hhvmVersion === null && !Platform::isWindows()) { $finder = new ExecutableFinder(); $hhvm = $finder->find('hhvm'); if ($hhvm !== null) { $exitCode = $this->process->execute( ProcessExecutor::escape($hhvm). ' --php -d hhvm.jit=0 -r "echo HHVM_VERSION;" 2>/dev/null', $hhvmVersion ); if ($exitCode !== 0) { $hhvmVersion = null; } } } if ($hhvmVersion) { try { $prettyVersion = $hhvmVersion; $version = $this->versionParser->normalize($prettyVersion); } catch (\UnexpectedValueException $e) { $prettyVersion = preg_replace('#^([^~+-]+).*$#', '$1', $hhvmVersion); $version = $this->versionParser->normalize($prettyVersion); } $hhvm = new CompletePackage('hhvm', $version, $prettyVersion); $hhvm->setDescription('The HHVM Runtime (64bit)'); $this->addPackage($hhvm); } } /** * {@inheritDoc} */ public function addPackage(PackageInterface $package) { // Skip if overridden if (isset($this->overrides[$package->getName()])) { $overrider = $this->findPackage($package->getName(), '*'); if ($package->getVersion() === $overrider->getVersion()) { $actualText = 'same as actual'; } else { $actualText = 'actual: '.$package->getPrettyVersion(); } $overrider->setDescription($overrider->getDescription().' ('.$actualText.')'); return; } // Skip if PHP is overridden and we are adding a php-* package if (isset($this->overrides['php']) && 0 === strpos($package->getName(), 'php-')) { $overrider = $this->addOverriddenPackage($this->overrides['php'], $package->getPrettyName()); if ($package->getVersion() === $overrider->getVersion()) { $actualText = 'same as actual'; } else { $actualText = 'actual: '.$package->getPrettyVersion(); } $overrider->setDescription($overrider->getDescription().' ('.$actualText.')'); return; } parent::addPackage($package); } private function addOverriddenPackage(array $override, $name = null) { $version = $this->versionParser->normalize($override['version']); $package = new CompletePackage($name ?: $override['name'], $version, $override['version']); $package->setDescription('Package overridden via config.platform'); $package->setExtra(array('config.platform' => true)); parent::addPackage($package); return $package; } /** * Parses the version and adds a new package to the repository * * @param string $name * @param null|string $prettyVersion */ private function addExtension($name, $prettyVersion) { $extraDescription = null; try { $version = $this->versionParser->normalize($prettyVersion); } catch (\UnexpectedValueException $e) { $extraDescription = ' (actual version: '.$prettyVersion.')'; if (preg_match('{^(\d+\.\d+\.\d+(?:\.\d+)?)}', $prettyVersion, $match)) { $prettyVersion = $match[1]; } else { $prettyVersion = '0'; } $version = $this->versionParser->normalize($prettyVersion); } $packageName = $this->buildPackageName($name); $ext = new CompletePackage($packageName, $version, $prettyVersion); $ext->setDescription('The '.$name.' PHP extension'.$extraDescription); $this->addPackage($ext); } private function buildPackageName($name) { return 'ext-' . str_replace(' ', '-', $name); } } composer/src/Composer/Repository/WritableRepositoryInterface.php 0000644 00000002345 14736103146 0021344 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository; use Composer\Package\PackageInterface; /** * Writable repository interface. * * @author Konstantin Kudryashov <ever.zet@gmail.com> */ interface WritableRepositoryInterface extends RepositoryInterface { /** * Writes repository (f.e. to the disc). */ public function write(); /** * Adds package to the repository. * * @param PackageInterface $package package instance */ public function addPackage(PackageInterface $package); /** * Removes package from the repository. * * @param PackageInterface $package package instance */ public function removePackage(PackageInterface $package); /** * Get unique packages (at most one package of each name), with aliases resolved and removed. * * @return PackageInterface[] */ public function getCanonicalPackages(); /** * Forces a reload of all packages. */ public function reload(); } composer/src/Composer/Repository/ArrayRepository.php 0000644 00000013765 14736103146 0017040 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository; use Composer\Package\AliasPackage; use Composer\Package\PackageInterface; use Composer\Package\CompletePackageInterface; use Composer\Package\Version\VersionParser; use Composer\Semver\Constraint\ConstraintInterface; use Composer\Semver\Constraint\Constraint; /** * A repository implementation that simply stores packages in an array * * @author Nils Adermann <naderman@naderman.de> */ class ArrayRepository extends BaseRepository { /** @var PackageInterface[] */ protected $packages; /** * @var PackageInterface[] indexed by package unique name and used to cache hasPackage calls */ protected $packageMap; public function __construct(array $packages = array()) { foreach ($packages as $package) { $this->addPackage($package); } } /** * {@inheritDoc} */ public function findPackage($name, $constraint) { $name = strtolower($name); if (!$constraint instanceof ConstraintInterface) { $versionParser = new VersionParser(); $constraint = $versionParser->parseConstraints($constraint); } foreach ($this->getPackages() as $package) { if ($name === $package->getName()) { $pkgConstraint = new Constraint('==', $package->getVersion()); if ($constraint->matches($pkgConstraint)) { return $package; } } } return null; } /** * {@inheritDoc} */ public function findPackages($name, $constraint = null) { // normalize name $name = strtolower($name); $packages = array(); if (null !== $constraint && !$constraint instanceof ConstraintInterface) { $versionParser = new VersionParser(); $constraint = $versionParser->parseConstraints($constraint); } foreach ($this->getPackages() as $package) { if ($name === $package->getName()) { $pkgConstraint = new Constraint('==', $package->getVersion()); if (null === $constraint || $constraint->matches($pkgConstraint)) { $packages[] = $package; } } } return $packages; } /** * {@inheritDoc} */ public function search($query, $mode = 0, $type = null) { $regex = '{(?:'.implode('|', preg_split('{\s+}', $query)).')}i'; $matches = array(); foreach ($this->getPackages() as $package) { $name = $package->getName(); if (isset($matches[$name])) { continue; } if (preg_match($regex, $name) || ($mode === self::SEARCH_FULLTEXT && $package instanceof CompletePackageInterface && preg_match($regex, implode(' ', (array) $package->getKeywords()) . ' ' . $package->getDescription())) ) { if (null !== $type && $package->getType() !== $type) { continue; } $matches[$name] = array( 'name' => $package->getPrettyName(), 'description' => $package instanceof CompletePackageInterface ? $package->getDescription() : null, ); } } return array_values($matches); } /** * {@inheritDoc} */ public function hasPackage(PackageInterface $package) { if ($this->packageMap === null) { $this->packageMap = array(); foreach ($this->getPackages() as $repoPackage) { $this->packageMap[$repoPackage->getUniqueName()] = $repoPackage; } } return isset($this->packageMap[$package->getUniqueName()]); } /** * Adds a new package to the repository * * @param PackageInterface $package */ public function addPackage(PackageInterface $package) { if (null === $this->packages) { $this->initialize(); } $package->setRepository($this); $this->packages[] = $package; if ($package instanceof AliasPackage) { $aliasedPackage = $package->getAliasOf(); if (null === $aliasedPackage->getRepository()) { $this->addPackage($aliasedPackage); } } // invalidate package map cache $this->packageMap = null; } protected function createAliasPackage(PackageInterface $package, $alias, $prettyAlias) { return new AliasPackage($package instanceof AliasPackage ? $package->getAliasOf() : $package, $alias, $prettyAlias); } /** * Removes package from repository. * * @param PackageInterface $package package instance */ public function removePackage(PackageInterface $package) { $packageId = $package->getUniqueName(); foreach ($this->getPackages() as $key => $repoPackage) { if ($packageId === $repoPackage->getUniqueName()) { array_splice($this->packages, $key, 1); // invalidate package map cache $this->packageMap = null; return; } } } /** * {@inheritDoc} */ public function getPackages() { if (null === $this->packages) { $this->initialize(); } return $this->packages; } /** * Returns the number of packages in this repository * * @return int Number of packages */ #[\ReturnTypeWillChange] public function count() { return count($this->packages); } /** * Initializes the packages array. Mostly meant as an extension point. */ protected function initialize() { $this->packages = array(); } } composer/src/Composer/Repository/RepositoryInterface.php 0000644 00000004271 14736103146 0017652 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository; use Composer\Package\PackageInterface; /** * Repository interface. * * @author Nils Adermann <naderman@naderman.de> * @author Konstantin Kudryashov <ever.zet@gmail.com> * @author Jordi Boggiano <j.boggiano@seld.be> */ interface RepositoryInterface extends \Countable { const SEARCH_FULLTEXT = 0; const SEARCH_NAME = 1; /** * Checks if specified package registered (installed). * * @param PackageInterface $package package instance * * @return bool */ public function hasPackage(PackageInterface $package); /** * Searches for the first match of a package by name and version. * * @param string $name package name * @param string|\Composer\Semver\Constraint\ConstraintInterface $constraint package version or version constraint to match against * * @return PackageInterface|null */ public function findPackage($name, $constraint); /** * Searches for all packages matching a name and optionally a version. * * @param string $name package name * @param string|\Composer\Semver\Constraint\ConstraintInterface $constraint package version or version constraint to match against * * @return PackageInterface[] */ public function findPackages($name, $constraint = null); /** * Returns list of registered packages. * * @return PackageInterface[] */ public function getPackages(); /** * Searches the repository for packages containing the query * * @param string $query search query * @param int $mode a set of SEARCH_* constants to search on, implementations should do a best effort only * * @return array[] an array of array('name' => '...', 'description' => '...') */ public function search($query, $mode = 0); } composer/src/Composer/Repository/BaseRepository.php 0000644 00000021665 14736103146 0016632 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository; use Composer\Package\RootPackageInterface; use Composer\Semver\Constraint\ConstraintInterface; use Composer\Semver\Constraint\Constraint; use Composer\Package\Link; /** * Common ancestor class for generic repository functionality. * * @author Niels Keurentjes <niels.keurentjes@omines.com> */ abstract class BaseRepository implements RepositoryInterface { /** * Returns a list of links causing the requested needle packages to be installed, as an associative array with the * dependent's name as key, and an array containing in order the PackageInterface and Link describing the relationship * as values. If recursive lookup was requested a third value is returned containing an identically formed array up * to the root package. That third value will be false in case a circular recursion was detected. * * @param string|string[] $needle The package name(s) to inspect. * @param ConstraintInterface|null $constraint Optional constraint to filter by. * @param bool $invert Whether to invert matches to discover reasons for the package *NOT* to be installed. * @param bool $recurse Whether to recursively expand the requirement tree up to the root package. * @param string[] $packagesFound Used internally when recurring * @return array An associative array of arrays as described above. */ public function getDependents($needle, $constraint = null, $invert = false, $recurse = true, $packagesFound = null) { $needles = array_map('strtolower', (array) $needle); $results = array(); // initialize the array with the needles before any recursion occurs if (null === $packagesFound) { $packagesFound = $needles; } // locate root package for use below $rootPackage = null; foreach ($this->getPackages() as $package) { if ($package instanceof RootPackageInterface) { $rootPackage = $package; break; } } // Loop over all currently installed packages. foreach ($this->getPackages() as $package) { $links = $package->getRequires(); // each loop needs its own "tree" as we want to show the complete dependent set of every needle // without warning all the time about finding circular deps $packagesInTree = $packagesFound; // Replacements are considered valid reasons for a package to be installed during forward resolution if (!$invert) { $links += $package->getReplaces(); // On forward search, check if any replaced package was required and add the replaced // packages to the list of needles. Contrary to the cross-reference link check below, // replaced packages are the target of links. foreach ($package->getReplaces() as $link) { foreach ($needles as $needle) { if ($link->getSource() === $needle) { if ($constraint === null || ($link->getConstraint()->matches($constraint) === !$invert)) { // already displayed this node's dependencies, cutting short if (in_array($link->getTarget(), $packagesInTree)) { $results[] = array($package, $link, false); continue; } $packagesInTree[] = $link->getTarget(); $dependents = $recurse ? $this->getDependents($link->getTarget(), null, false, true, $packagesInTree) : array(); $results[] = array($package, $link, $dependents); $needles[] = $link->getTarget(); } } } } } // Require-dev is only relevant for the root package if ($package instanceof RootPackageInterface) { $links += $package->getDevRequires(); } // Cross-reference all discovered links to the needles foreach ($links as $link) { foreach ($needles as $needle) { if ($link->getTarget() === $needle) { if ($constraint === null || ($link->getConstraint()->matches($constraint) === !$invert)) { // already displayed this node's dependencies, cutting short if (in_array($link->getSource(), $packagesInTree)) { $results[] = array($package, $link, false); continue; } $packagesInTree[] = $link->getSource(); $dependents = $recurse ? $this->getDependents($link->getSource(), null, false, true, $packagesInTree) : array(); $results[] = array($package, $link, $dependents); } } } } // When inverting, we need to check for conflicts of the needles against installed packages if ($invert && in_array($package->getName(), $needles)) { foreach ($package->getConflicts() as $link) { foreach ($this->findPackages($link->getTarget()) as $pkg) { $version = new Constraint('=', $pkg->getVersion()); if ($link->getConstraint()->matches($version) === $invert) { $results[] = array($package, $link, false); } } } } // When inverting, we need to check for conflicts of the needles' requirements against installed packages if ($invert && $constraint && in_array($package->getName(), $needles) && $constraint->matches(new Constraint('=', $package->getVersion()))) { foreach ($package->getRequires() as $link) { if (preg_match(PlatformRepository::PLATFORM_PACKAGE_REGEX, $link->getTarget())) { if ($this->findPackage($link->getTarget(), $link->getConstraint())) { continue; } $platformPkg = $this->findPackage($link->getTarget(), '*'); $description = $platformPkg ? 'but '.$platformPkg->getPrettyVersion().' is installed' : 'but it is missing'; $results[] = array($package, new Link($package->getName(), $link->getTarget(), null, 'requires', $link->getPrettyConstraint().' '.$description), false); continue; } foreach ($this->getPackages() as $pkg) { if (!in_array($link->getTarget(), $pkg->getNames())) { continue; } $version = new Constraint('=', $pkg->getVersion()); if (!$link->getConstraint()->matches($version)) { // if we have a root package (we should but can not guarantee..) we show // the root requires as well to perhaps allow to find an issue there if ($rootPackage) { foreach (array_merge($rootPackage->getRequires(), $rootPackage->getDevRequires()) as $rootReq) { if (in_array($rootReq->getTarget(), $pkg->getNames()) && !$rootReq->getConstraint()->matches($link->getConstraint())) { $results[] = array($package, $link, false); $results[] = array($rootPackage, $rootReq, false); continue 3; } } $results[] = array($package, $link, false); $results[] = array($rootPackage, new Link($rootPackage->getName(), $link->getTarget(), null, 'does not require', 'but ' . $pkg->getPrettyVersion() . ' is installed'), false); } else { // no root so let's just print whatever we found $results[] = array($package, $link, false); } } continue 2; } } } } ksort($results); return $results; } } composer/src/Composer/Repository/PackageRepository.php 0000644 00000003134 14736103146 0017302 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository; use Composer\Package\Loader\ArrayLoader; use Composer\Package\Loader\ValidatingArrayLoader; /** * Package repository. * * @author Jordi Boggiano <j.boggiano@seld.be> */ class PackageRepository extends ArrayRepository { private $config; /** * Initializes filesystem repository. * * @param array $config package definition */ public function __construct(array $config) { parent::__construct(); $this->config = $config['package']; // make sure we have an array of package definitions if (!is_numeric(key($this->config))) { $this->config = array($this->config); } } /** * Initializes repository (reads file, or remote address). */ protected function initialize() { parent::initialize(); $loader = new ValidatingArrayLoader(new ArrayLoader(null, true), false); foreach ($this->config as $package) { try { $package = $loader->load($package); } catch (\Exception $e) { throw new InvalidRepositoryException('A repository of type "package" contains an invalid package definition: '.$e->getMessage()."\n\nInvalid package definition:\n".json_encode($package)); } $this->addPackage($package); } } } composer/src/Composer/Repository/RepositorySecurityException.php 0000644 00000000742 14736103146 0021437 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository; /** * Thrown when a security problem, like a broken or missing signature * * @author Eric Daspet <edaspet@survol.fr> */ class RepositorySecurityException extends \Exception { } composer/src/Composer/Repository/ComposerRepository.php 0000644 00000077070 14736103146 0017550 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository; use Composer\Package\Loader\ArrayLoader; use Composer\Package\PackageInterface; use Composer\Package\AliasPackage; use Composer\Package\Version\VersionParser; use Composer\DependencyResolver\Pool; use Composer\Json\JsonFile; use Composer\Cache; use Composer\Config; use Composer\Composer; use Composer\Factory; use Composer\IO\IOInterface; use Composer\Util\RemoteFilesystem; use Composer\Plugin\PluginEvents; use Composer\Plugin\PreFileDownloadEvent; use Composer\EventDispatcher\EventDispatcher; use Composer\Downloader\TransportException; use Composer\Semver\Constraint\ConstraintInterface; use Composer\Semver\Constraint\Constraint; /** * @author Jordi Boggiano <j.boggiano@seld.be> */ class ComposerRepository extends ArrayRepository implements ConfigurableRepositoryInterface { protected $config; protected $repoConfig; protected $options; protected $url; protected $baseUrl; protected $io; protected $rfs; protected $cache; protected $notifyUrl; protected $searchUrl; protected $hasProviders = false; protected $providersUrl; protected $lazyProvidersUrl; protected $providerListing; protected $providers = array(); protected $providersByUid = array(); protected $loader; protected $rootAliases; protected $allowSslDowngrade = false; protected $eventDispatcher; protected $sourceMirrors; protected $distMirrors; private $degradedMode = false; private $rootData; private $hasPartialPackages; private $partialPackagesByName; public function __construct(array $repoConfig, IOInterface $io, Config $config, EventDispatcher $eventDispatcher = null, RemoteFilesystem $rfs = null) { parent::__construct(); if (!preg_match('{^[\w.]+\??://}', $repoConfig['url'])) { // assume http as the default protocol $repoConfig['url'] = 'http://'.$repoConfig['url']; } $repoConfig['url'] = rtrim($repoConfig['url'], '/'); if ('https?' === substr($repoConfig['url'], 0, 6)) { $repoConfig['url'] = (extension_loaded('openssl') ? 'https' : 'http') . substr($repoConfig['url'], 6); } $urlBits = parse_url($repoConfig['url']); if ($urlBits === false || empty($urlBits['scheme'])) { throw new \UnexpectedValueException('Invalid url given for Composer repository: '.$repoConfig['url']); } if (!isset($repoConfig['options'])) { $repoConfig['options'] = array(); } if (isset($repoConfig['allow_ssl_downgrade']) && true === $repoConfig['allow_ssl_downgrade']) { $this->allowSslDowngrade = true; } $this->config = $config; $this->options = $repoConfig['options']; $this->url = $repoConfig['url']; // force url for packagist.org to repo.packagist.org if (preg_match('{^(?P<proto>https?)://packagist\.org/?$}i', $this->url, $match)) { $this->url = $match['proto'].'://repo.packagist.org'; } $this->baseUrl = rtrim(preg_replace('{(?:/[^/\\\\]+\.json)?(?:[?#].*)?$}', '', $this->url), '/'); $this->io = $io; $this->cache = new Cache($io, $config->get('cache-repo-dir').'/'.preg_replace('{[^a-z0-9.]}i', '-', $this->url), 'a-z0-9.$'); $this->loader = new ArrayLoader(); if ($rfs && $this->options) { $rfs = clone $rfs; $rfs->setOptions($this->options); } $this->rfs = $rfs ?: Factory::createRemoteFilesystem($this->io, $this->config, $this->options); $this->eventDispatcher = $eventDispatcher; $this->repoConfig = $repoConfig; } public function getRepoConfig() { return $this->repoConfig; } public function setRootAliases(array $rootAliases) { $this->rootAliases = $rootAliases; } /** * {@inheritDoc} */ public function findPackage($name, $constraint) { if (!$this->hasProviders()) { return parent::findPackage($name, $constraint); } $name = strtolower($name); if (!$constraint instanceof ConstraintInterface) { $versionParser = new VersionParser(); $constraint = $versionParser->parseConstraints($constraint); } foreach ($this->getProviderNames() as $providerName) { if ($name === $providerName) { $packages = $this->whatProvides(new Pool('dev'), $providerName); foreach ($packages as $package) { if ($name === $package->getName()) { $pkgConstraint = new Constraint('==', $package->getVersion()); if ($constraint->matches($pkgConstraint)) { return $package; } } } break; } } } /** * {@inheritDoc} */ public function findPackages($name, $constraint = null) { if (!$this->hasProviders()) { return parent::findPackages($name, $constraint); } // normalize name $name = strtolower($name); if (null !== $constraint && !$constraint instanceof ConstraintInterface) { $versionParser = new VersionParser(); $constraint = $versionParser->parseConstraints($constraint); } $packages = array(); foreach ($this->getProviderNames() as $providerName) { if ($name === $providerName) { $candidates = $this->whatProvides(new Pool('dev'), $providerName); foreach ($candidates as $package) { if ($name === $package->getName()) { $pkgConstraint = new Constraint('==', $package->getVersion()); if (null === $constraint || $constraint->matches($pkgConstraint)) { $packages[] = $package; } } } break; } } return $packages; } public function getPackages() { if ($this->hasProviders()) { throw new \LogicException('Composer repositories that have providers can not load the complete list of packages, use getProviderNames instead.'); } return parent::getPackages(); } /** * {@inheritDoc} */ public function search($query, $mode = 0, $type = null) { $this->loadRootServerFile(); if ($this->searchUrl && $mode === self::SEARCH_FULLTEXT) { $url = str_replace(array('%query%', '%type%'), array($query, $type), $this->searchUrl); $origin = RemoteFilesystem::getOrigin($url); $json = $this->rfs->getContents($origin, $url, false); $search = JsonFile::parseJson($json, $url); if (empty($search['results'])) { return array(); } $results = array(); foreach ($search['results'] as $result) { // do not show virtual packages in results as they are not directly useful from a composer perspective if (empty($result['virtual'])) { $results[] = $result; } } return $results; } if ($this->hasProviders()) { $results = array(); $regex = '{(?:'.implode('|', preg_split('{\s+}', $query)).')}i'; foreach ($this->getProviderNames() as $name) { if (preg_match($regex, $name)) { $results[] = array('name' => $name); } } return $results; } return parent::search($query, $mode); } public function getProviderNames() { $this->loadRootServerFile(); if (null === $this->providerListing) { $this->loadProviderListings($this->loadRootServerFile()); } if ($this->hasPartialPackages) { if (null === $this->partialPackagesByName) { $this->initializePartialPackages(); } return array_keys($this->partialPackagesByName); } if ($this->lazyProvidersUrl) { // Can not determine list of provided packages for lazy repositories return array(); } if ($this->providersUrl) { return array_keys($this->providerListing); } return array(); } protected function configurePackageTransportOptions(PackageInterface $package) { foreach ($package->getDistUrls() as $url) { if (strpos($url, $this->baseUrl) === 0) { $package->setTransportOptions($this->options); return; } } } public function hasProviders() { $this->loadRootServerFile(); return $this->hasProviders; } public function resetPackageIds() { foreach ($this->providersByUid as $package) { if ($package instanceof AliasPackage) { $package->getAliasOf()->setId(-1); } $package->setId(-1); } } /** * @param Pool $pool * @param string $name package name * @param bool $bypassFilters If set to true, this bypasses the stability filtering, and forces a recompute without cache * @return array|mixed */ public function whatProvides(Pool $pool, $name, $bypassFilters = false) { if (isset($this->providers[$name]) && !$bypassFilters) { return $this->providers[$name]; } if ($this->hasPartialPackages && null === $this->partialPackagesByName) { $this->initializePartialPackages(); } if (!$this->hasPartialPackages || !isset($this->partialPackagesByName[$name])) { // skip platform packages, root package and composer-plugin-api if (preg_match(PlatformRepository::PLATFORM_PACKAGE_REGEX, $name) || '__root__' === $name || 'composer-plugin-api' === $name) { return array(); } if (null === $this->providerListing) { $this->loadProviderListings($this->loadRootServerFile()); } $useLastModifiedCheck = false; if ($this->lazyProvidersUrl && !isset($this->providerListing[$name])) { $hash = null; $url = str_replace('%package%', $name, $this->lazyProvidersUrl); $cacheKey = 'provider-'.strtr($name, '/', '$').'.json'; $useLastModifiedCheck = true; } elseif ($this->providersUrl) { // package does not exist in this repo if (!isset($this->providerListing[$name])) { return array(); } $hash = $this->providerListing[$name]['sha256']; $url = str_replace(array('%package%', '%hash%'), array($name, $hash), $this->providersUrl); $cacheKey = 'provider-'.strtr($name, '/', '$').'.json'; } else { return array(); } $packages = null; if ($cacheKey) { if (!$useLastModifiedCheck && $hash && $this->cache->sha256($cacheKey) === $hash) { $packages = json_decode($this->cache->read($cacheKey), true); } elseif ($useLastModifiedCheck) { if ($contents = $this->cache->read($cacheKey)) { $contents = json_decode($contents, true); if (isset($contents['last-modified'])) { $response = $this->fetchFileIfLastModified($url, $cacheKey, $contents['last-modified']); if (true === $response) { $packages = $contents; } elseif ($response) { $packages = $response; } } } } } if (!$packages) { try { $packages = $this->fetchFile($url, $cacheKey, $hash, $useLastModifiedCheck); } catch (TransportException $e) { // 404s are acceptable for lazy provider repos if ($e->getStatusCode() === 404 && $this->lazyProvidersUrl) { $packages = array('packages' => array()); } else { throw $e; } } } $loadingPartialPackage = false; } else { $packages = array('packages' => array('versions' => $this->partialPackagesByName[$name])); $loadingPartialPackage = true; } $this->providers[$name] = array(); foreach ($packages['packages'] as $versions) { foreach ($versions as $version) { if (!$loadingPartialPackage && $this->hasPartialPackages && isset($this->partialPackagesByName[$version['name']])) { continue; } // avoid loading the same objects twice if (isset($this->providersByUid[$version['uid']])) { // skip if already assigned if (!isset($this->providers[$name][$version['uid']])) { // expand alias in two packages if ($this->providersByUid[$version['uid']] instanceof AliasPackage) { $this->providers[$name][$version['uid']] = $this->providersByUid[$version['uid']]->getAliasOf(); $this->providers[$name][$version['uid'].'-alias'] = $this->providersByUid[$version['uid']]; } else { $this->providers[$name][$version['uid']] = $this->providersByUid[$version['uid']]; } // check for root aliases if (isset($this->providersByUid[$version['uid'].'-root'])) { $this->providers[$name][$version['uid'].'-root'] = $this->providersByUid[$version['uid'].'-root']; } } } else { if (!$bypassFilters && !$pool->isPackageAcceptable(strtolower($version['name']), VersionParser::parseStability($version['version']))) { continue; } // load acceptable packages in the providers $package = $this->createPackage($version, 'Composer\Package\CompletePackage'); $package->setRepository($this); if ($package instanceof AliasPackage) { $aliased = $package->getAliasOf(); $aliased->setRepository($this); $this->providers[$name][$version['uid']] = $aliased; $this->providers[$name][$version['uid'].'-alias'] = $package; // override provider with its alias so it can be expanded in the if block above $this->providersByUid[$version['uid']] = $package; } else { $this->providers[$name][$version['uid']] = $package; $this->providersByUid[$version['uid']] = $package; } // handle root package aliases unset($rootAliasData); if (isset($this->rootAliases[$package->getName()][$package->getVersion()])) { $rootAliasData = $this->rootAliases[$package->getName()][$package->getVersion()]; } elseif ($package instanceof AliasPackage && isset($this->rootAliases[$package->getName()][$package->getAliasOf()->getVersion()])) { $rootAliasData = $this->rootAliases[$package->getName()][$package->getAliasOf()->getVersion()]; } if (isset($rootAliasData)) { $alias = $this->createAliasPackage($package, $rootAliasData['alias_normalized'], $rootAliasData['alias']); $alias->setRepository($this); $this->providers[$name][$version['uid'].'-root'] = $alias; $this->providersByUid[$version['uid'].'-root'] = $alias; } } } } $result = $this->providers[$name]; // clean up the cache because otherwise using this puts the repo in an inconsistent state with a polluted unfiltered cache // which is likely not an issue but might cause hard to track behaviors depending on how the repo is used if ($bypassFilters) { foreach ($this->providers[$name] as $uid => $provider) { unset($this->providersByUid[$uid]); } unset($this->providers[$name]); } return $result; } /** * {@inheritDoc} */ protected function initialize() { parent::initialize(); $repoData = $this->loadDataFromServer(); foreach ($repoData as $package) { $this->addPackage($this->createPackage($package, 'Composer\Package\CompletePackage')); } } /** * Adds a new package to the repository * * @param PackageInterface $package */ public function addPackage(PackageInterface $package) { parent::addPackage($package); $this->configurePackageTransportOptions($package); } protected function loadRootServerFile() { if (null !== $this->rootData) { return $this->rootData; } if (!extension_loaded('openssl') && 'https' === substr($this->url, 0, 5)) { throw new \RuntimeException('You must enable the openssl extension in your php.ini to load information from '.$this->url); } $jsonUrlParts = parse_url($this->url); if (isset($jsonUrlParts['path']) && false !== strpos($jsonUrlParts['path'], '.json')) { $jsonUrl = $this->url; } else { $jsonUrl = $this->url . '/packages.json'; } $data = $this->fetchFile($jsonUrl, 'packages.json'); if (!empty($data['notify-batch'])) { $this->notifyUrl = $this->canonicalizeUrl($data['notify-batch']); } elseif (!empty($data['notify'])) { $this->notifyUrl = $this->canonicalizeUrl($data['notify']); } if (!empty($data['search'])) { $this->searchUrl = $this->canonicalizeUrl($data['search']); } if (!empty($data['mirrors'])) { foreach ($data['mirrors'] as $mirror) { if (!empty($mirror['git-url'])) { $this->sourceMirrors['git'][] = array('url' => $mirror['git-url'], 'preferred' => !empty($mirror['preferred'])); } if (!empty($mirror['hg-url'])) { $this->sourceMirrors['hg'][] = array('url' => $mirror['hg-url'], 'preferred' => !empty($mirror['preferred'])); } if (!empty($mirror['dist-url'])) { $this->distMirrors[] = array( 'url' => $this->canonicalizeUrl($mirror['dist-url']), 'preferred' => !empty($mirror['preferred']), ); } } } if (!empty($data['providers-lazy-url'])) { $this->lazyProvidersUrl = $this->canonicalizeUrl($data['providers-lazy-url']); $this->hasProviders = true; $this->hasPartialPackages = !empty($data['packages']) && is_array($data['packages']); } if ($this->allowSslDowngrade) { $this->url = str_replace('https://', 'http://', $this->url); $this->baseUrl = str_replace('https://', 'http://', $this->baseUrl); } if (!empty($data['providers-url'])) { $this->providersUrl = $this->canonicalizeUrl($data['providers-url']); $this->hasProviders = true; } if (!empty($data['providers']) || !empty($data['providers-includes'])) { $this->hasProviders = true; } // force values for packagist if (preg_match('{^https?://repo\.packagist\.org/?$}i', $this->url) && !empty($this->repoConfig['force-lazy-providers'])) { $this->url = 'https://repo.packagist.org'; $this->baseUrl = 'https://repo.packagist.org'; $this->lazyProvidersUrl = $this->canonicalizeUrl('https://repo.packagist.org/p/%package%.json'); $this->providersUrl = null; } elseif (!empty($this->repoConfig['force-lazy-providers'])) { $this->lazyProvidersUrl = $this->canonicalizeUrl('/p/%package%.json'); $this->providersUrl = null; } return $this->rootData = $data; } protected function canonicalizeUrl($url) { if ('/' === $url[0]) { if (preg_match('{^[^:]++://[^/]*+}', $this->url, $matches)) { return $matches[0] . $url; } return $this->url; } return $url; } protected function loadDataFromServer() { $data = $this->loadRootServerFile(); return $this->loadIncludes($data); } protected function loadProviderListings($data) { if (isset($data['providers'])) { if (!is_array($this->providerListing)) { $this->providerListing = array(); } $this->providerListing = array_merge($this->providerListing, $data['providers']); } if ($this->providersUrl && isset($data['provider-includes'])) { $includes = $data['provider-includes']; foreach ($includes as $include => $metadata) { $url = $this->baseUrl . '/' . str_replace('%hash%', $metadata['sha256'], $include); $cacheKey = str_replace(array('%hash%','$'), '', $include); if ($this->cache->sha256($cacheKey) === $metadata['sha256']) { $includedData = json_decode($this->cache->read($cacheKey), true); } else { $includedData = $this->fetchFile($url, $cacheKey, $metadata['sha256']); } $this->loadProviderListings($includedData); } } } protected function loadIncludes($data) { $packages = array(); // legacy repo handling if (!isset($data['packages']) && !isset($data['includes'])) { foreach ($data as $pkg) { foreach ($pkg['versions'] as $metadata) { $packages[] = $metadata; } } return $packages; } if (isset($data['packages'])) { foreach ($data['packages'] as $package => $versions) { foreach ($versions as $version => $metadata) { $packages[] = $metadata; } } } if (isset($data['includes'])) { foreach ($data['includes'] as $include => $metadata) { if ($this->cache->sha1($include) === $metadata['sha1']) { $includedData = json_decode($this->cache->read($include), true); } else { $includedData = $this->fetchFile($include); } $packages = array_merge($packages, $this->loadIncludes($includedData)); } } return $packages; } protected function createPackage(array $data, $class = 'Composer\Package\CompletePackage') { try { if (!isset($data['notification-url'])) { $data['notification-url'] = $this->notifyUrl; } $package = $this->loader->load($data, $class); if (isset($this->sourceMirrors[$package->getSourceType()])) { $package->setSourceMirrors($this->sourceMirrors[$package->getSourceType()]); } $package->setDistMirrors($this->distMirrors); $this->configurePackageTransportOptions($package); return $package; } catch (\Exception $e) { throw new \RuntimeException('Could not load package '.(isset($data['name']) ? $data['name'] : json_encode($data)).' in '.$this->url.': ['.get_class($e).'] '.$e->getMessage(), 0, $e); } } protected function fetchFile($filename, $cacheKey = null, $sha256 = null, $storeLastModifiedTime = false) { if (null === $cacheKey) { $cacheKey = $filename; $filename = $this->baseUrl.'/'.$filename; } // url-encode $ signs in URLs as bad proxies choke on them if (($pos = strpos($filename, '$')) && preg_match('{^https?://.*}i', $filename)) { $filename = substr($filename, 0, $pos) . '%24' . substr($filename, $pos + 1); } $retries = 3; while ($retries--) { try { $preFileDownloadEvent = new PreFileDownloadEvent(PluginEvents::PRE_FILE_DOWNLOAD, $this->rfs, $filename); if ($this->eventDispatcher) { $this->eventDispatcher->dispatch($preFileDownloadEvent->getName(), $preFileDownloadEvent); } $origin = RemoteFilesystem::getOrigin($filename); $rfs = $preFileDownloadEvent->getRemoteFilesystem(); $json = $rfs->getContents($origin, $filename, false); if ($sha256 && $sha256 !== hash('sha256', $json)) { // undo downgrade before trying again if http seems to be hijacked or modifying content somehow if ($this->allowSslDowngrade) { $this->url = str_replace('http://', 'https://', $this->url); $this->baseUrl = str_replace('http://', 'https://', $this->baseUrl); $filename = str_replace('http://', 'https://', $filename); } if ($retries) { usleep(100000); continue; } // TODO use scarier wording once we know for sure it doesn't do false positives anymore throw new RepositorySecurityException('The contents of '.$filename.' do not match its signature. This could indicate a man-in-the-middle attack or e.g. antivirus software corrupting files. Try running composer again and report this if you think it is a mistake.'); } $data = JsonFile::parseJson($json, $filename); RemoteFilesystem::outputWarnings($this->io, $this->url, $data); if ($cacheKey) { if ($storeLastModifiedTime) { $lastModifiedDate = $rfs->findHeaderValue($rfs->getLastHeaders(), 'last-modified'); if ($lastModifiedDate) { $data['last-modified'] = $lastModifiedDate; $json = json_encode($data); } } $this->cache->write($cacheKey, $json); } break; } catch (\Exception $e) { if ($e instanceof TransportException && $e->getStatusCode() === 404) { throw $e; } if ($retries) { usleep(100000); continue; } if ($e instanceof RepositorySecurityException) { throw $e; } if ($cacheKey && ($contents = $this->cache->read($cacheKey))) { if (!$this->degradedMode) { $this->io->writeError('<warning>'.$e->getMessage().'</warning>'); $this->io->writeError('<warning>'.$this->url.' could not be fully loaded, package information was loaded from the local cache and may be out of date</warning>'); } $this->degradedMode = true; $data = JsonFile::parseJson($contents, $this->cache->getRoot().$cacheKey); break; } throw $e; } } return $data; } protected function fetchFileIfLastModified($filename, $cacheKey, $lastModifiedTime) { $retries = 3; while ($retries--) { try { $preFileDownloadEvent = new PreFileDownloadEvent(PluginEvents::PRE_FILE_DOWNLOAD, $this->rfs, $filename); if ($this->eventDispatcher) { $this->eventDispatcher->dispatch($preFileDownloadEvent->getName(), $preFileDownloadEvent); } $origin = RemoteFilesystem::getOrigin($filename); $rfs = $preFileDownloadEvent->getRemoteFilesystem(); $options = array('http' => array('header' => array('If-Modified-Since: '.$lastModifiedTime))); $json = $rfs->getContents($origin, $filename, false, $options); if ($json === '' && $rfs->findStatusCode($rfs->getLastHeaders()) === 304) { return true; } $data = JsonFile::parseJson($json, $filename); RemoteFilesystem::outputWarnings($this->io, $this->url, $data); $lastModifiedDate = $rfs->findHeaderValue($rfs->getLastHeaders(), 'last-modified'); if ($lastModifiedDate) { $data['last-modified'] = $lastModifiedDate; $json = json_encode($data); } $this->cache->write($cacheKey, $json); return $data; } catch (\Exception $e) { if ($e instanceof TransportException && $e->getStatusCode() === 404) { throw $e; } if ($retries) { usleep(100000); continue; } if (!$this->degradedMode) { $this->io->writeError('<warning>'.$e->getMessage().'</warning>'); $this->io->writeError('<warning>'.$this->url.' could not be fully loaded, package information was loaded from the local cache and may be out of date</warning>'); } $this->degradedMode = true; return true; } } } /** * This initializes the packages key of a partial packages.json that contain some packages inlined + a providers-lazy-url * * This should only be called once */ private function initializePartialPackages() { $rootData = $this->loadRootServerFile(); $this->partialPackagesByName = array(); foreach ($rootData['packages'] as $package => $versions) { $package = strtolower($package); foreach ($versions as $version) { $this->partialPackagesByName[$package][] = $version; if (!empty($version['provide']) && is_array($version['provide'])) { foreach ($version['provide'] as $provided => $providedVersion) { $this->partialPackagesByName[strtolower($provided)][] = $version; } } if (!empty($version['replace']) && is_array($version['replace'])) { foreach ($version['replace'] as $provided => $providedVersion) { $this->partialPackagesByName[strtolower($provided)][] = $version; } } } } // wipe rootData as it is fully consumed at this point and this saves some memory $this->rootData = true; } } composer/src/Composer/Repository/Pear/ReleaseInfo.php 0000644 00000002002 14736103146 0016723 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository\Pear; /** * PEAR package release info * * @author Alexey Prilipko <palex@farpost.com> */ class ReleaseInfo { private $stability; private $dependencyInfo; /** * @param string $stability * @param DependencyInfo $dependencyInfo */ public function __construct($stability, $dependencyInfo) { $this->stability = $stability; $this->dependencyInfo = $dependencyInfo; } /** * @return DependencyInfo release dependencies */ public function getDependencyInfo() { return $this->dependencyInfo; } /** * @return string release stability */ public function getStability() { return $this->stability; } } composer/src/Composer/Repository/Pear/ChannelReader.php 0000644 00000006220 14736103146 0017230 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository\Pear; use Composer\Util\RemoteFilesystem; /** * PEAR Channel package reader. * * Reads channel packages info from and builds Package's * * @author Alexey Prilipko <palex@farpost.com> */ class ChannelReader extends BaseChannelReader { /** @var array of ('xpath test' => 'rest implementation') */ private $readerMap; public function __construct(RemoteFilesystem $rfs) { parent::__construct($rfs); $rest10reader = new ChannelRest10Reader($rfs); $rest11reader = new ChannelRest11Reader($rfs); $this->readerMap = array( 'REST1.3' => $rest11reader, 'REST1.2' => $rest11reader, 'REST1.1' => $rest11reader, 'REST1.0' => $rest10reader, ); } /** * Reads PEAR channel through REST interface and builds list of packages * * @param string $url PEAR Channel url * @throws \UnexpectedValueException * @return ChannelInfo */ public function read($url) { $xml = $this->requestXml($url, "/channel.xml"); $channelName = (string) $xml->name; $channelAlias = (string) $xml->suggestedalias; $supportedVersions = array_keys($this->readerMap); $selectedRestVersion = $this->selectRestVersion($xml, $supportedVersions); if (!$selectedRestVersion) { throw new \UnexpectedValueException(sprintf('PEAR repository %s does not supports any of %s protocols.', $url, implode(', ', $supportedVersions))); } $reader = $this->readerMap[$selectedRestVersion['version']]; $packageDefinitions = $reader->read($selectedRestVersion['baseUrl']); return new ChannelInfo($channelName, $channelAlias, $packageDefinitions); } /** * Reads channel supported REST interfaces and selects one of them * * @param \SimpleXMLElement $channelXml * @param string[] $supportedVersions supported PEAR REST protocols * @return array|null hash with selected version and baseUrl */ private function selectRestVersion($channelXml, $supportedVersions) { $channelXml->registerXPathNamespace('ns', self::CHANNEL_NS); foreach ($supportedVersions as $version) { $xpathTest = "ns:servers/ns:*/ns:rest/ns:baseurl[@type='{$version}']"; $testResult = $channelXml->xpath($xpathTest); foreach ($testResult as $result) { // Choose first https:// option. $result = (string) $result; if (preg_match('{^https://}i', $result)) { return array('version' => $version, 'baseUrl' => $result); } } // Fallback to non-https if it does not exist. if (count($testResult) > 0) { return array('version' => $version, 'baseUrl' => (string) $testResult[0]); } } return null; } } composer/src/Composer/Repository/Pear/DependencyInfo.php 0000644 00000002233 14736103146 0017427 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository\Pear; /** * PEAR package release dependency info * * @author Alexey Prilipko <palex@farpost.com> */ class DependencyInfo { private $requires; private $optionals; /** * @param DependencyConstraint[] $requires list of requires/conflicts/replaces * @param array $optionals [groupName => DependencyConstraint[]] list of optional groups */ public function __construct($requires, $optionals) { $this->requires = $requires; $this->optionals = $optionals; } /** * @return DependencyConstraint[] list of requires/conflicts/replaces */ public function getRequires() { return $this->requires; } /** * @return array [groupName => DependencyConstraint[]] list of optional groups */ public function getOptionals() { return $this->optionals; } } composer/src/Composer/Repository/Pear/ChannelRest11Reader.php 0000644 00000007771 14736103146 0020244 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository\Pear; /** * Read PEAR packages using REST 1.1 interface * * At version 1.1 package descriptions read from: * {baseUrl}/c/categories.xml * {baseUrl}/c/{category}/packagesinfo.xml * * @author Alexey Prilipko <palex@farpost.com> */ class ChannelRest11Reader extends BaseChannelReader { private $dependencyReader; public function __construct($rfs) { parent::__construct($rfs); $this->dependencyReader = new PackageDependencyParser(); } /** * Reads package descriptions using PEAR Rest 1.1 interface * * @param string $baseUrl base Url interface * * @return PackageInfo[] */ public function read($baseUrl) { return $this->readChannelPackages($baseUrl); } /** * Read list of channel categories from * {baseUrl}/c/categories.xml * * @param string $baseUrl * @return PackageInfo[] */ private function readChannelPackages($baseUrl) { $result = array(); $xml = $this->requestXml($baseUrl, "/c/categories.xml"); $xml->registerXPathNamespace('ns', self::ALL_CATEGORIES_NS); foreach ($xml->xpath('ns:c') as $node) { $categoryName = (string) $node; $categoryPackages = $this->readCategoryPackages($baseUrl, $categoryName); $result = array_merge($result, $categoryPackages); } return $result; } /** * Read packages from * {baseUrl}/c/{category}/packagesinfo.xml * * @param string $baseUrl * @param string $categoryName * @return PackageInfo[] */ private function readCategoryPackages($baseUrl, $categoryName) { $result = array(); $categoryPath = '/c/'.urlencode($categoryName).'/packagesinfo.xml'; $xml = $this->requestXml($baseUrl, $categoryPath); $xml->registerXPathNamespace('ns', self::CATEGORY_PACKAGES_INFO_NS); foreach ($xml->xpath('ns:pi') as $node) { $packageInfo = $this->parsePackage($node); $result[] = $packageInfo; } return $result; } /** * Parses package node. * * @param \SimpleXMLElement $packageInfo xml element describing package * @return PackageInfo */ private function parsePackage($packageInfo) { $packageInfo->registerXPathNamespace('ns', self::CATEGORY_PACKAGES_INFO_NS); $channelName = (string) $packageInfo->p->c; $packageName = (string) $packageInfo->p->n; $license = (string) $packageInfo->p->l; $shortDescription = (string) $packageInfo->p->s; $description = (string) $packageInfo->p->d; $dependencies = array(); foreach ($packageInfo->xpath('ns:deps') as $node) { $dependencyVersion = (string) $node->v; $dependencyArray = unserialize((string) $node->d); $dependencyInfo = $this->dependencyReader->buildDependencyInfo($dependencyArray); $dependencies[$dependencyVersion] = $dependencyInfo; } $releases = array(); $releasesInfo = $packageInfo->xpath('ns:a/ns:r'); if ($releasesInfo) { foreach ($releasesInfo as $node) { $releaseVersion = (string) $node->v; $releaseStability = (string) $node->s; $releases[$releaseVersion] = new ReleaseInfo( $releaseStability, isset($dependencies[$releaseVersion]) ? $dependencies[$releaseVersion] : new DependencyInfo(array(), array()) ); } } return new PackageInfo( $channelName, $packageName, $license, $shortDescription, $description, $releases ); } } composer/src/Composer/Repository/Pear/ChannelRest10Reader.php 0000644 00000011327 14736103146 0020233 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository\Pear; use Composer\Downloader\TransportException; /** * Read PEAR packages using REST 1.0 interface * * At version 1.0 package descriptions read from: * {baseUrl}/p/packages.xml * {baseUrl}/p/{package}/info.xml * {baseUrl}/p/{package}/allreleases.xml * {baseUrl}/p/{package}/deps.{version}.txt * * @author Alexey Prilipko <palex@farpost.com> */ class ChannelRest10Reader extends BaseChannelReader { private $dependencyReader; public function __construct($rfs) { parent::__construct($rfs); $this->dependencyReader = new PackageDependencyParser(); } /** * Reads package descriptions using PEAR Rest 1.0 interface * * @param string $baseUrl base Url interface * * @return PackageInfo[] */ public function read($baseUrl) { return $this->readPackages($baseUrl); } /** * Read list of packages from * {baseUrl}/p/packages.xml * * @param string $baseUrl * @return PackageInfo[] */ private function readPackages($baseUrl) { $result = array(); $xmlPath = '/p/packages.xml'; $xml = $this->requestXml($baseUrl, $xmlPath); $xml->registerXPathNamespace('ns', self::ALL_PACKAGES_NS); foreach ($xml->xpath('ns:p') as $node) { $packageName = (string) $node; $packageInfo = $this->readPackage($baseUrl, $packageName); $result[] = $packageInfo; } return $result; } /** * Read package info from * {baseUrl}/p/{package}/info.xml * * @param string $baseUrl * @param string $packageName * @return PackageInfo */ private function readPackage($baseUrl, $packageName) { $xmlPath = '/p/' . strtolower($packageName) . '/info.xml'; $xml = $this->requestXml($baseUrl, $xmlPath); $xml->registerXPathNamespace('ns', self::PACKAGE_INFO_NS); $channelName = (string) $xml->c; $packageName = (string) $xml->n; $license = (string) $xml->l; $shortDescription = (string) $xml->s; $description = (string) $xml->d; return new PackageInfo( $channelName, $packageName, $license, $shortDescription, $description, $this->readPackageReleases($baseUrl, $packageName) ); } /** * Read package releases from * {baseUrl}/p/{package}/allreleases.xml * * @param string $baseUrl * @param string $packageName * @throws \Composer\Downloader\TransportException|\Exception * @return ReleaseInfo[] hash array with keys as version numbers */ private function readPackageReleases($baseUrl, $packageName) { $result = array(); try { $xmlPath = '/r/' . strtolower($packageName) . '/allreleases.xml'; $xml = $this->requestXml($baseUrl, $xmlPath); $xml->registerXPathNamespace('ns', self::ALL_RELEASES_NS); foreach ($xml->xpath('ns:r') as $node) { $releaseVersion = (string) $node->v; $releaseStability = (string) $node->s; try { $result[$releaseVersion] = new ReleaseInfo( $releaseStability, $this->readPackageReleaseDependencies($baseUrl, $packageName, $releaseVersion) ); } catch (TransportException $exception) { if ($exception->getCode() != 404) { throw $exception; } } } } catch (TransportException $exception) { if ($exception->getCode() != 404) { throw $exception; } } return $result; } /** * Read package dependencies from * {baseUrl}/p/{package}/deps.{version}.txt * * @param string $baseUrl * @param string $packageName * @param string $version * @return DependencyInfo[] */ private function readPackageReleaseDependencies($baseUrl, $packageName, $version) { $dependencyReader = new PackageDependencyParser(); $depthPath = '/r/' . strtolower($packageName) . '/deps.' . $version . '.txt'; $content = $this->requestContent($baseUrl, $depthPath); $dependencyArray = unserialize($content); return $dependencyReader->buildDependencyInfo($dependencyArray); } } composer/src/Composer/Repository/Pear/ChannelInfo.php 0000644 00000002302 14736103146 0016716 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository\Pear; /** * PEAR channel info * * @author Alexey Prilipko <palex@farpost.com> */ class ChannelInfo { private $name; private $alias; private $packages; /** * @param string $name * @param string $alias * @param PackageInfo[] $packages */ public function __construct($name, $alias, array $packages) { $this->name = $name; $this->alias = $alias; $this->packages = $packages; } /** * Name of the channel * * @return string */ public function getName() { return $this->name; } /** * Alias of the channel * * @return string */ public function getAlias() { return $this->alias; } /** * List of channel packages * * @return PackageInfo[] */ public function getPackages() { return $this->packages; } } composer/src/Composer/Repository/Pear/BaseChannelReader.php 0000644 00000004737 14736103146 0020036 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository\Pear; use Composer\Util\RemoteFilesystem; /** * Base PEAR Channel reader. * * Provides xml namespaces and red * * @author Alexey Prilipko <palex@farpost.com> */ abstract class BaseChannelReader { /** * PEAR REST Interface namespaces */ const CHANNEL_NS = 'http://pear.php.net/channel-1.0'; const ALL_CATEGORIES_NS = 'http://pear.php.net/dtd/rest.allcategories'; const CATEGORY_PACKAGES_INFO_NS = 'http://pear.php.net/dtd/rest.categorypackageinfo'; const ALL_PACKAGES_NS = 'http://pear.php.net/dtd/rest.allpackages'; const ALL_RELEASES_NS = 'http://pear.php.net/dtd/rest.allreleases'; const PACKAGE_INFO_NS = 'http://pear.php.net/dtd/rest.package'; /** @var RemoteFilesystem */ private $rfs; protected function __construct(RemoteFilesystem $rfs) { $this->rfs = $rfs; } /** * Read content from remote filesystem. * * @param string $origin server * @param string $path relative path to content * @throws \UnexpectedValueException * @return \SimpleXMLElement */ protected function requestContent($origin, $path) { $url = rtrim($origin, '/') . '/' . ltrim($path, '/'); $content = $this->rfs->getContents($origin, $url, false); if (!$content) { throw new \UnexpectedValueException('The PEAR channel at ' . $url . ' did not respond.'); } return str_replace('http://pear.php.net/rest/', 'https://pear.php.net/rest/', $content); } /** * Read xml content from remote filesystem * * @param string $origin server * @param string $path relative path to content * @throws \UnexpectedValueException * @return \SimpleXMLElement */ protected function requestXml($origin, $path) { // http://components.ez.no/p/packages.xml is malformed. to read it we must ignore parsing errors. $xml = simplexml_load_string($this->requestContent($origin, $path), "SimpleXMLElement", LIBXML_NOERROR); if (false === $xml) { throw new \UnexpectedValueException(sprintf('The PEAR channel at ' . $origin . ' is broken. (Invalid XML at file `%s`)', $path)); } return $xml; } } composer/src/Composer/Repository/Pear/PackageDependencyParser.php 0000644 00000025245 14736103146 0021254 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository\Pear; /** * Read PEAR packages using REST 1.0 interface * * @author Alexey Prilipko <palex@farpost.com> */ class PackageDependencyParser { /** * Builds dependency information. It detects used package.xml format. * * @param array $depArray * @return DependencyInfo */ public function buildDependencyInfo($depArray) { if (!is_array($depArray)) { return new DependencyInfo(array(), array()); } if (!$this->isHash($depArray)) { return new DependencyInfo($this->buildDependency10Info($depArray), array()); } return $this->buildDependency20Info($depArray); } /** * Builds dependency information from package.xml 1.0 format * * https://pear.php.net/manual/en/guide.developers.package2.dependencies.php * * package.xml 1.0 format consists of array of * { type="php|os|sapi|ext|pkg" rel="has|not|eq|ge|gt|le|lt" optional="yes" * channel="channelName" name="extName|packageName" } * * @param array $depArray Dependency data in package.xml 1.0 format * @return DependencyConstraint[] */ private function buildDependency10Info($depArray) { static $dep10toOperatorMap = array('has' => '==', 'eq' => '==', 'ge' => '>=', 'gt' => '>', 'le' => '<=', 'lt' => '<', 'not' => '!='); $result = array(); foreach ($depArray as $depItem) { if (empty($depItem['rel']) || !array_key_exists($depItem['rel'], $dep10toOperatorMap)) { // 'unknown rel type:' . $depItem['rel']; continue; } $depType = !empty($depItem['optional']) && 'yes' == $depItem['optional'] ? 'optional' : 'required'; $depType = 'not' == $depItem['rel'] ? 'conflicts' : $depType; $depVersion = !empty($depItem['version']) ? $this->parseVersion($depItem['version']) : '*'; // has & not are special operators that does not requires version $depVersionConstraint = ('has' == $depItem['rel'] || 'not' == $depItem['rel']) && '*' == $depVersion ? '*' : $dep10toOperatorMap[$depItem['rel']] . $depVersion; switch ($depItem['type']) { case 'php': $depChannelName = 'php'; $depPackageName = ''; break; case 'pkg': $depChannelName = !empty($depItem['channel']) ? $depItem['channel'] : 'pear.php.net'; $depPackageName = $depItem['name']; break; case 'ext': $depChannelName = 'ext'; $depPackageName = $depItem['name']; break; case 'os': case 'sapi': $depChannelName = ''; $depPackageName = ''; break; default: $depChannelName = ''; $depPackageName = ''; break; } if ('' != $depChannelName) { $result[] = new DependencyConstraint( $depType, $depVersionConstraint, $depChannelName, $depPackageName ); } } return $result; } /** * Builds dependency information from package.xml 2.0 format * * @param array $depArray Dependency data in package.xml 1.0 format * @return DependencyInfo */ private function buildDependency20Info($depArray) { $result = array(); $optionals = array(); $defaultOptionals = array(); foreach ($depArray as $depType => $depTypeGroup) { if (!is_array($depTypeGroup)) { continue; } if ('required' == $depType || 'optional' == $depType) { foreach ($depTypeGroup as $depItemType => $depItem) { switch ($depItemType) { case 'php': $result[] = new DependencyConstraint( $depType, $this->parse20VersionConstraint($depItem), 'php', '' ); break; case 'package': $deps = $this->buildDepPackageConstraints($depItem, $depType); $result = array_merge($result, $deps); break; case 'extension': $deps = $this->buildDepExtensionConstraints($depItem, $depType); $result = array_merge($result, $deps); break; case 'subpackage': $deps = $this->buildDepPackageConstraints($depItem, 'replaces'); $defaultOptionals += $deps; break; case 'os': case 'pearinstaller': break; default: break; } } } elseif ('group' == $depType) { if ($this->isHash($depTypeGroup)) { $depTypeGroup = array($depTypeGroup); } foreach ($depTypeGroup as $depItem) { $groupName = $depItem['attribs']['name']; if (!isset($optionals[$groupName])) { $optionals[$groupName] = array(); } if (isset($depItem['subpackage'])) { $optionals[$groupName] += $this->buildDepPackageConstraints($depItem['subpackage'], 'replaces'); } else { $result += $this->buildDepPackageConstraints($depItem['package'], 'optional'); } } } } if (count($defaultOptionals) > 0) { $optionals['*'] = $defaultOptionals; } return new DependencyInfo($result, $optionals); } /** * Builds dependency constraint of 'extension' type * * @param array $depItem dependency constraint or array of dependency constraints * @param string $depType target type of building constraint. * @return DependencyConstraint[] */ private function buildDepExtensionConstraints($depItem, $depType) { if ($this->isHash($depItem)) { $depItem = array($depItem); } $result = array(); foreach ($depItem as $subDepItem) { $depChannelName = 'ext'; $depPackageName = $subDepItem['name']; $depVersionConstraint = $this->parse20VersionConstraint($subDepItem); $result[] = new DependencyConstraint( $depType, $depVersionConstraint, $depChannelName, $depPackageName ); } return $result; } /** * Builds dependency constraint of 'package' type * * @param array $depItem dependency constraint or array of dependency constraints * @param string $depType target type of building constraint. * @return DependencyConstraint[] */ private function buildDepPackageConstraints($depItem, $depType) { if ($this->isHash($depItem)) { $depItem = array($depItem); } $result = array(); foreach ($depItem as $subDepItem) { if (!array_key_exists('channel', $subDepItem)) { $subDepItem['channel'] = $subDepItem['uri']; } $depChannelName = $subDepItem['channel']; $depPackageName = $subDepItem['name']; $depVersionConstraint = $this->parse20VersionConstraint($subDepItem); if (isset($subDepItem['conflicts'])) { $depType = 'conflicts'; } $result[] = new DependencyConstraint( $depType, $depVersionConstraint, $depChannelName, $depPackageName ); } return $result; } /** * Parses version constraint * * @param array $data array containing several 'min', 'max', 'has', 'exclude' and other keys. * @return string */ private function parse20VersionConstraint(array $data) { static $dep20toOperatorMap = array('has' => '==', 'min' => '>=', 'max' => '<=', 'exclude' => '!='); $versions = array(); $values = array_intersect_key($data, $dep20toOperatorMap); if (0 == count($values)) { return '*'; } if (isset($values['min']) && isset($values['exclude']) && $data['min'] == $data['exclude']) { $versions[] = '>' . $this->parseVersion($values['min']); } elseif (isset($values['max']) && isset($values['exclude']) && $data['max'] == $data['exclude']) { $versions[] = '<' . $this->parseVersion($values['max']); } else { foreach ($values as $op => $version) { if ('exclude' == $op && is_array($version)) { foreach ($version as $versionPart) { $versions[] = $dep20toOperatorMap[$op] . $this->parseVersion($versionPart); } } else { $versions[] = $dep20toOperatorMap[$op] . $this->parseVersion($version); } } } return implode(',', $versions); } /** * Softened version parser * * @param string $version * @return null|string */ private function parseVersion($version) { if (preg_match('{^v?(\d{1,3})(\.\d+)?(\.\d+)?(\.\d+)?}i', $version, $matches)) { $version = $matches[1] .(!empty($matches[2]) ? $matches[2] : '.0') .(!empty($matches[3]) ? $matches[3] : '.0') .(!empty($matches[4]) ? $matches[4] : '.0'); return $version; } return null; } /** * Test if array is associative or hash type * * @param array $array * @return bool */ private function isHash(array $array) { return !array_key_exists(1, $array) && !array_key_exists(0, $array); } } composer/src/Composer/Repository/Pear/DependencyConstraint.php 0000644 00000002340 14736103146 0020657 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository\Pear; /** * PEAR package release dependency info * * @author Alexey Prilipko <palex@farpost.com> */ class DependencyConstraint { private $type; private $constraint; private $channelName; private $packageName; /** * @param string $type * @param string $constraint * @param string $channelName * @param string $packageName */ public function __construct($type, $constraint, $channelName, $packageName) { $this->type = $type; $this->constraint = $constraint; $this->channelName = $channelName; $this->packageName = $packageName; } public function getChannelName() { return $this->channelName; } public function getConstraint() { return $this->constraint; } public function getPackageName() { return $this->packageName; } public function getType() { return $this->type; } } composer/src/Composer/Repository/Pear/PackageInfo.php 0000644 00000004112 14736103146 0016702 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository\Pear; /** * PEAR Package info * * @author Alexey Prilipko <palex@farpost.com> */ class PackageInfo { private $channelName; private $packageName; private $license; private $shortDescription; private $description; private $releases; /** * @param string $channelName * @param string $packageName * @param string $license * @param string $shortDescription * @param string $description * @param ReleaseInfo[] $releases associative array maps release version to release info */ public function __construct($channelName, $packageName, $license, $shortDescription, $description, $releases) { $this->channelName = $channelName; $this->packageName = $packageName; $this->license = $license; $this->shortDescription = $shortDescription; $this->description = $description; $this->releases = $releases; } /** * @return string the package channel name */ public function getChannelName() { return $this->channelName; } /** * @return string the package name */ public function getPackageName() { return $this->packageName; } /** * @return string the package description */ public function getDescription() { return $this->description; } /** * @return string the package short description */ public function getShortDescription() { return $this->shortDescription; } /** * @return string the package license */ public function getLicense() { return $this->license; } /** * @return ReleaseInfo[] */ public function getReleases() { return $this->releases; } } composer/src/Composer/Repository/InstalledFilesystemRepository.php 0000644 00000000770 14736103146 0021736 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository; /** * Installed filesystem repository. * * @author Jordi Boggiano <j.boggiano@seld.be> */ class InstalledFilesystemRepository extends FilesystemRepository implements InstalledRepositoryInterface { } composer/src/Composer/Repository/InstalledRepositoryInterface.php 0000644 00000001103 14736103146 0021501 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository; /** * Installable repository interface. * * Just used to tag installed repositories so the base classes can act differently on Alias packages * * @author Jordi Boggiano <j.boggiano@seld.be> */ interface InstalledRepositoryInterface extends WritableRepositoryInterface { } composer/src/Composer/Repository/PathRepository.php 0000644 00000015526 14736103146 0016653 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository; use Composer\Config; use Composer\IO\IOInterface; use Composer\Json\JsonFile; use Composer\Package\Loader\ArrayLoader; use Composer\Package\Version\VersionGuesser; use Composer\Package\Version\VersionParser; use Composer\Util\Platform; use Composer\Util\ProcessExecutor; use Composer\Util\Filesystem; /** * This repository allows installing local packages that are not necessarily under their own VCS. * * The local packages will be symlinked when possible, else they will be copied. * * @code * "require": { * "<vendor>/<local-package>": "*" * }, * "repositories": [ * { * "type": "path", * "url": "../../relative/path/to/package/" * }, * { * "type": "path", * "url": "/absolute/path/to/package/" * }, * { * "type": "path", * "url": "/absolute/path/to/several/packages/*" * }, * { * "type": "path", * "url": "../../relative/path/to/package/", * "options": { * "symlink": false * } * }, * ] * @endcode * * @author Samuel Roze <samuel.roze@gmail.com> * @author Johann Reinke <johann.reinke@gmail.com> */ class PathRepository extends ArrayRepository implements ConfigurableRepositoryInterface { /** * @var ArrayLoader */ private $loader; /** * @var VersionGuesser */ private $versionGuesser; /** * @var string */ private $url; /** * @var array */ private $repoConfig; /** * @var ProcessExecutor */ private $process; /** * @var array */ private $options; /** * Initializes path repository. * * @param array $repoConfig * @param IOInterface $io * @param Config $config */ public function __construct(array $repoConfig, IOInterface $io, Config $config) { if (!isset($repoConfig['url'])) { throw new \RuntimeException('You must specify the `url` configuration for the path repository'); } $this->loader = new ArrayLoader(null, true); $this->url = Platform::expandPath($repoConfig['url']); $this->process = new ProcessExecutor($io); $this->versionGuesser = new VersionGuesser($config, $this->process, new VersionParser()); $this->repoConfig = $repoConfig; $this->options = isset($repoConfig['options']) ? $repoConfig['options'] : array(); if (!isset($this->options['relative'])) { $filesystem = new Filesystem(); $this->options['relative'] = !$filesystem->isAbsolutePath($this->url); } parent::__construct(); } public function getRepoConfig() { return $this->repoConfig; } /** * Initializes path repository. * * This method will basically read the folder and add the found package. */ protected function initialize() { parent::initialize(); $urlMatches = $this->getUrlMatches(); if (empty($urlMatches)) { if (preg_match('{[*{}]}', $this->url)) { $url = $this->url; while (preg_match('{[*{}]}', $url)) { $url = dirname($url); } // the parent directory before any wildcard exists, so we assume it is correctly configured but simply empty if (is_dir($url)) { return; } } throw new \RuntimeException('The `url` supplied for the path (' . $this->url . ') repository does not exist'); } foreach ($urlMatches as $url) { $path = realpath($url) . DIRECTORY_SEPARATOR; $composerFilePath = $path.'composer.json'; if (!file_exists($composerFilePath)) { continue; } $json = file_get_contents($composerFilePath); $package = JsonFile::parseJson($json, $composerFilePath); $package['dist'] = array( 'type' => 'path', 'url' => $url, 'reference' => sha1($json . serialize($this->options)), ); $package['transport-options'] = $this->options; // carry over the root package version if this path repo is in the same git repository as root package if (!isset($package['version']) && ($rootVersion = getenv('COMPOSER_ROOT_VERSION'))) { if ( 0 === $this->process->execute('git rev-parse HEAD', $ref1, $path) && 0 === $this->process->execute('git rev-parse HEAD', $ref2) && $ref1 === $ref2 ) { $package['version'] = $rootVersion; } } $output = ''; if (is_dir($path . DIRECTORY_SEPARATOR . '.git') && 0 === $this->process->execute('git log -n1 --pretty=%H', $output, $path)) { $package['dist']['reference'] = trim($output); } if (!isset($package['version'])) { $versionData = $this->versionGuesser->guessVersion($package, $path); if (is_array($versionData) && $versionData['pretty_version']) { // if there is a feature branch detected, we add a second packages with the feature branch version if (!empty($versionData['feature_pretty_version'])) { $package['version'] = $versionData['feature_pretty_version']; $this->addPackage($this->loader->load($package)); } $package['version'] = $versionData['pretty_version']; } else { $package['version'] = 'dev-master'; } } $package = $this->loader->load($package); $this->addPackage($package); } } /** * Get a list of all (possibly relative) path names matching given url (supports globbing). * * @return string[] */ private function getUrlMatches() { $flags = GLOB_MARK | GLOB_ONLYDIR; if (defined('GLOB_BRACE')) { $flags |= GLOB_BRACE; } elseif (strpos($this->url, '{') !== false || strpos($this->url, '}') !== false) { throw new \RuntimeException('The operating system does not support GLOB_BRACE which is required for the url '. $this->url); } // Ensure environment-specific path separators are normalized to URL separators return array_map(function ($val) { return rtrim(str_replace(DIRECTORY_SEPARATOR, '/', $val), '/'); }, glob($this->url, $flags)); } } composer/src/Composer/Repository/Vcs/BitbucketDriver.php 0000644 00000032717 14736103146 0017503 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository\Vcs; use Composer\Cache; use Composer\Downloader\TransportException; use Composer\Json\JsonFile; use Composer\Util\Bitbucket; abstract class BitbucketDriver extends VcsDriver { /** @var Cache */ protected $cache; protected $owner; protected $repository; protected $hasIssues; protected $rootIdentifier; protected $tags; protected $branches; protected $infoCache = array(); protected $branchesUrl = ''; protected $tagsUrl = ''; protected $homeUrl = ''; protected $website = ''; protected $cloneHttpsUrl = ''; /** * @var VcsDriver */ protected $fallbackDriver; /** @var string|null if set either git or hg */ protected $vcsType; /** * {@inheritDoc} */ public function initialize() { preg_match('#^https?://bitbucket\.org/([^/]+)/([^/]+?)(\.git|/?)$#i', $this->url, $match); $this->owner = $match[1]; $this->repository = $match[2]; $this->originUrl = 'bitbucket.org'; $this->cache = new Cache( $this->io, implode('/', array( $this->config->get('cache-repo-dir'), $this->originUrl, $this->owner, $this->repository, )) ); } /** * {@inheritDoc} */ public function getUrl() { if ($this->fallbackDriver) { return $this->fallbackDriver->getUrl(); } return $this->cloneHttpsUrl; } /** * Attempts to fetch the repository data via the BitBucket API and * sets some parameters which are used in other methods * * @return bool */ protected function getRepoData() { $resource = sprintf( 'https://api.bitbucket.org/2.0/repositories/%s/%s?%s', $this->owner, $this->repository, http_build_query( array('fields' => '-project,-owner'), null, '&' ) ); $repoData = JsonFile::parseJson($this->getContentsWithOAuthCredentials($resource, true), $resource); if ($this->fallbackDriver) { return false; } $this->parseCloneUrls($repoData['links']['clone']); $this->hasIssues = !empty($repoData['has_issues']); $this->branchesUrl = $repoData['links']['branches']['href']; $this->tagsUrl = $repoData['links']['tags']['href']; $this->homeUrl = $repoData['links']['html']['href']; $this->website = $repoData['website']; $this->vcsType = $repoData['scm']; return true; } /** * {@inheritDoc} */ public function getComposerInformation($identifier) { if ($this->fallbackDriver) { return $this->fallbackDriver->getComposerInformation($identifier); } if (!isset($this->infoCache[$identifier])) { if ($this->shouldCache($identifier) && $res = $this->cache->read($identifier)) { return $this->infoCache[$identifier] = JsonFile::parseJson($res); } $composer = $this->getBaseComposerInformation($identifier); if ($composer) { // specials for bitbucket if (!isset($composer['support']['source'])) { $label = array_search( $identifier, $this->getTags() ) ?: array_search( $identifier, $this->getBranches() ) ?: $identifier; if (array_key_exists($label, $tags = $this->getTags())) { $hash = $tags[$label]; } elseif (array_key_exists($label, $branches = $this->getBranches())) { $hash = $branches[$label]; } if (! isset($hash)) { $composer['support']['source'] = sprintf( 'https://%s/%s/%s/src', $this->originUrl, $this->owner, $this->repository ); } else { $composer['support']['source'] = sprintf( 'https://%s/%s/%s/src/%s/?at=%s', $this->originUrl, $this->owner, $this->repository, $hash, $label ); } } if (!isset($composer['support']['issues']) && $this->hasIssues) { $composer['support']['issues'] = sprintf( 'https://%s/%s/%s/issues', $this->originUrl, $this->owner, $this->repository ); } if (!isset($composer['homepage'])) { $composer['homepage'] = empty($this->website) ? $this->homeUrl : $this->website; } } $this->infoCache[$identifier] = $composer; if ($this->shouldCache($identifier)) { $this->cache->write($identifier, json_encode($composer)); } } return $this->infoCache[$identifier]; } /** * {@inheritdoc} */ public function getFileContent($file, $identifier) { if ($this->fallbackDriver) { return $this->fallbackDriver->getFileContent($file, $identifier); } if (strpos($identifier, '/') !== false) { $branches = $this->getBranches(); if (isset($branches[$identifier])) { $identifier = $branches[$identifier]; } } $resource = sprintf( 'https://api.bitbucket.org/2.0/repositories/%s/%s/src/%s/%s', $this->owner, $this->repository, $identifier, $file ); return $this->getContentsWithOAuthCredentials($resource); } /** * {@inheritdoc} */ public function getChangeDate($identifier) { if ($this->fallbackDriver) { return $this->fallbackDriver->getChangeDate($identifier); } if (strpos($identifier, '/') !== false) { $branches = $this->getBranches(); if (isset($branches[$identifier])) { $identifier = $branches[$identifier]; } } $resource = sprintf( 'https://api.bitbucket.org/2.0/repositories/%s/%s/commit/%s?fields=date', $this->owner, $this->repository, $identifier ); $commit = JsonFile::parseJson($this->getContentsWithOAuthCredentials($resource), $resource); return new \DateTime($commit['date']); } /** * {@inheritDoc} */ public function getSource($identifier) { if ($this->fallbackDriver) { return $this->fallbackDriver->getSource($identifier); } return array('type' => $this->vcsType, 'url' => $this->getUrl(), 'reference' => $identifier); } /** * {@inheritDoc} */ public function getDist($identifier) { if ($this->fallbackDriver) { return $this->fallbackDriver->getDist($identifier); } $url = sprintf( 'https://bitbucket.org/%s/%s/get/%s.zip', $this->owner, $this->repository, $identifier ); return array('type' => 'zip', 'url' => $url, 'reference' => $identifier, 'shasum' => ''); } /** * {@inheritDoc} */ public function getTags() { if ($this->fallbackDriver) { return $this->fallbackDriver->getTags(); } if (null === $this->tags) { $this->tags = array(); $resource = sprintf( '%s?%s', $this->tagsUrl, http_build_query( array( 'pagelen' => 100, 'fields' => 'values.name,values.target.hash,next', 'sort' => '-target.date', ), null, '&' ) ); $hasNext = true; while ($hasNext) { $tagsData = JsonFile::parseJson($this->getContentsWithOAuthCredentials($resource), $resource); foreach ($tagsData['values'] as $data) { $this->tags[$data['name']] = $data['target']['hash']; } if (empty($tagsData['next'])) { $hasNext = false; } else { $resource = $tagsData['next']; } } if ($this->vcsType === 'hg') { unset($this->tags['tip']); } } return $this->tags; } /** * {@inheritDoc} */ public function getBranches() { if ($this->fallbackDriver) { return $this->fallbackDriver->getBranches(); } if (null === $this->branches) { $this->branches = array(); $resource = sprintf( '%s?%s', $this->branchesUrl, http_build_query( array( 'pagelen' => 100, 'fields' => 'values.name,values.target.hash,values.heads,next', 'sort' => '-target.date', ), null, '&' ) ); $hasNext = true; while ($hasNext) { $branchData = JsonFile::parseJson($this->getContentsWithOAuthCredentials($resource), $resource); foreach ($branchData['values'] as $data) { // skip headless branches which seem to be deleted branches that bitbucket nevertheless returns in the API if ($this->vcsType === 'hg' && empty($data['heads'])) { continue; } $this->branches[$data['name']] = $data['target']['hash']; } if (empty($branchData['next'])) { $hasNext = false; } else { $resource = $branchData['next']; } } } return $this->branches; } /** * Get the remote content. * * @param string $url The URL of content * @param bool $fetchingRepoData * * @return mixed The result */ protected function getContentsWithOAuthCredentials($url, $fetchingRepoData = false) { try { return parent::getContents($url); } catch (TransportException $e) { $bitbucketUtil = new Bitbucket($this->io, $this->config, $this->process, $this->remoteFilesystem); if (403 === $e->getCode() || (401 === $e->getCode() && strpos($e->getMessage(), 'Could not authenticate against') === 0)) { if (!$this->io->hasAuthentication($this->originUrl) && $bitbucketUtil->authorizeOAuth($this->originUrl) ) { return parent::getContents($url); } if (!$this->io->isInteractive() && $fetchingRepoData) { return $this->attemptCloneFallback(); } } throw $e; } } /** * Generate an SSH URL * * @return string */ abstract protected function generateSshUrl(); protected function attemptCloneFallback() { try { $this->setupFallbackDriver($this->generateSshUrl()); } catch (\RuntimeException $e) { $this->fallbackDriver = null; $this->io->writeError( '<error>Failed to clone the ' . $this->generateSshUrl() . ' repository, try running in interactive mode' . ' so that you can enter your Bitbucket OAuth consumer credentials</error>' ); throw $e; } } /** * @param string $url * @return void */ abstract protected function setupFallbackDriver($url); /** * @param array $cloneLinks * @return void */ protected function parseCloneUrls(array $cloneLinks) { foreach ($cloneLinks as $cloneLink) { if ($cloneLink['name'] === 'https') { // Format: https://(user@)bitbucket.org/{user}/{repo} // Strip username from URL (only present in clone URL's for private repositories) $this->cloneHttpsUrl = preg_replace('/https:\/\/([^@]+@)?/', 'https://', $cloneLink['href']); } } } /** * @return array|null */ protected function getMainBranchData() { $resource = sprintf( 'https://api.bitbucket.org/2.0/repositories/%s/%s?fields=mainbranch', $this->owner, $this->repository ); $data = JsonFile::parseJson($this->getContentsWithOAuthCredentials($resource), $resource); if (isset($data['mainbranch'])) { return $data['mainbranch']; } return null; } } composer/src/Composer/Repository/Vcs/GitHubDriver.php 0000644 00000046766 14736103146 0016762 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository\Vcs; use Composer\Config; use Composer\Downloader\TransportException; use Composer\Json\JsonFile; use Composer\Cache; use Composer\IO\IOInterface; use Composer\Util\GitHub; /** * @author Jordi Boggiano <j.boggiano@seld.be> */ class GitHubDriver extends VcsDriver { protected $cache; protected $owner; protected $repository; protected $tags; protected $branches; protected $rootIdentifier; protected $repoData; protected $hasIssues; protected $infoCache = array(); protected $isPrivate = false; private $isArchived = false; private $fundingInfo; /** * Git Driver * * @var GitDriver */ protected $gitDriver; /** * {@inheritDoc} */ public function initialize() { preg_match('#^(?:(?:https?|git)://([^/]+)/|git@([^:]+):/?)([^/]+)/(.+?)(?:\.git|/)?$#', $this->url, $match); $this->owner = $match[3]; $this->repository = $match[4]; $this->originUrl = strtolower(!empty($match[1]) ? $match[1] : $match[2]); if ($this->originUrl === 'www.github.com') { $this->originUrl = 'github.com'; } $this->cache = new Cache($this->io, $this->config->get('cache-repo-dir').'/'.$this->originUrl.'/'.$this->owner.'/'.$this->repository); if ( $this->config->get('use-github-api') === false || (isset($this->repoConfig['no-api']) && $this->repoConfig['no-api'] ) ){ $this->setupGitDriver($this->url); return; } $this->fetchRootIdentifier(); } public function getRepositoryUrl() { return 'https://'.$this->originUrl.'/'.$this->owner.'/'.$this->repository; } /** * {@inheritDoc} */ public function getRootIdentifier() { if ($this->gitDriver) { return $this->gitDriver->getRootIdentifier(); } return $this->rootIdentifier; } /** * {@inheritDoc} */ public function getUrl() { if ($this->gitDriver) { return $this->gitDriver->getUrl(); } return 'https://' . $this->originUrl . '/'.$this->owner.'/'.$this->repository.'.git'; } /** * {@inheritDoc} */ protected function getApiUrl() { if ('github.com' === $this->originUrl) { $apiUrl = 'api.github.com'; } else { $apiUrl = $this->originUrl . '/api/v3'; } return 'https://' . $apiUrl; } /** * {@inheritDoc} */ public function getSource($identifier) { if ($this->gitDriver) { return $this->gitDriver->getSource($identifier); } if ($this->isPrivate) { // Private GitHub repositories should be accessed using the // SSH version of the URL. $url = $this->generateSshUrl(); } else { $url = $this->getUrl(); } return array('type' => 'git', 'url' => $url, 'reference' => $identifier); } /** * {@inheritDoc} */ public function getDist($identifier) { $url = $this->getApiUrl() . '/repos/'.$this->owner.'/'.$this->repository.'/zipball/'.$identifier; return array('type' => 'zip', 'url' => $url, 'reference' => $identifier, 'shasum' => ''); } /** * {@inheritDoc} */ public function getComposerInformation($identifier) { if ($this->gitDriver) { return $this->gitDriver->getComposerInformation($identifier); } if (!isset($this->infoCache[$identifier])) { if ($this->shouldCache($identifier) && $res = $this->cache->read($identifier)) { return $this->infoCache[$identifier] = JsonFile::parseJson($res); } $composer = $this->getBaseComposerInformation($identifier); if ($composer) { // specials for github if (!isset($composer['support']['source'])) { $label = array_search($identifier, $this->getTags()) ?: array_search($identifier, $this->getBranches()) ?: $identifier; $composer['support']['source'] = sprintf('https://%s/%s/%s/tree/%s', $this->originUrl, $this->owner, $this->repository, $label); } if (!isset($composer['support']['issues']) && $this->hasIssues) { $composer['support']['issues'] = sprintf('https://%s/%s/%s/issues', $this->originUrl, $this->owner, $this->repository); } if (!isset($composer['abandoned']) && $this->isArchived) { $composer['abandoned'] = true; } if (!isset($composer['funding']) && $funding = $this->getFundingInfo()) { $composer['funding'] = $funding; } } if ($this->shouldCache($identifier)) { $this->cache->write($identifier, json_encode($composer)); } $this->infoCache[$identifier] = $composer; } return $this->infoCache[$identifier]; } private function getFundingInfo() { if (null !== $this->fundingInfo) { return $this->fundingInfo; } if ($this->originUrl !== 'github.com') { return $this->fundingInfo = false; } foreach (array($this->getApiUrl() . '/repos/'.$this->owner.'/'.$this->repository.'/contents/.github/FUNDING.yml', $this->getApiUrl() . '/repos/'.$this->owner.'/.github/contents/FUNDING.yml') as $file) { try { $result = $this->remoteFilesystem->getContents($this->originUrl, $file, false, array( 'retry-auth-failure' => false, )); $response = json_decode($result, true); } catch (TransportException $e) { continue; } if (empty($response['content']) || $response['encoding'] !== 'base64' || !($funding = base64_decode($response['content']))) { continue; } break; } if (empty($funding)) { return $this->fundingInfo = false; } $result = array(); $key = null; foreach (preg_split('{\r?\n}', $funding) as $line) { $line = preg_replace('{#.*}', '', $line); $line = trim($line); if (preg_match('{^(\w+)\s*:\s*(.+)$}', $line, $match)) { if (preg_match('{^\[.*\]$}', $match[2])) { foreach (array_map('trim', preg_split('{[\'"]?\s*,\s*[\'"]?}', substr($match[2], 1, -1))) as $item) { $result[] = array('type' => $match[1], 'url' => trim($item, '"\' ')); } } else { $result[] = array('type' => $match[1], 'url' => trim($match[2], '"\' ')); } $key = null; } elseif (preg_match('{^(\w+)\s*:$}', $line, $match)) { $key = $match[1]; } elseif ($key && preg_match('{^-\s*(.+)$}', $line, $match)) { $result[] = array('type' => $key, 'url' => trim($match[1], '"\' ')); } } foreach ($result as $key => $item) { switch ($item['type']) { case 'tidelift': $result[$key]['url'] = 'https://tidelift.com/funding/github/' . $item['url']; break; case 'github': $result[$key]['url'] = 'https://github.com/' . basename($item['url']); break; case 'patreon': $result[$key]['url'] = 'https://www.patreon.com/' . basename($item['url']); break; case 'otechie': $result[$key]['url'] = 'https://otechie.com/' . basename($item['url']); break; case 'open_collective': $result[$key]['url'] = 'https://opencollective.com/' . basename($item['url']); break; case 'liberapay': $result[$key]['url'] = 'https://liberapay.com/' . basename($item['url']); break; case 'ko_fi': $result[$key]['url'] = 'https://ko-fi.com/' . basename($item['url']); break; case 'issuehunt': $result[$key]['url'] = 'https://issuehunt.io/r/' . $item['url']; break; case 'community_bridge': $result[$key]['url'] = 'https://funding.communitybridge.org/projects/' . basename($item['url']); break; } } return $this->fundingInfo = $result; } /** * {@inheritdoc} */ public function getFileContent($file, $identifier) { if ($this->gitDriver) { return $this->gitDriver->getFileContent($file, $identifier); } $resource = $this->getApiUrl() . '/repos/'.$this->owner.'/'.$this->repository.'/contents/' . $file . '?ref='.urlencode($identifier); $resource = JsonFile::parseJson($this->getContents($resource)); if (empty($resource['content']) || $resource['encoding'] !== 'base64' || !($content = base64_decode($resource['content']))) { throw new \RuntimeException('Could not retrieve ' . $file . ' for '.$identifier); } return $content; } /** * {@inheritdoc} */ public function getChangeDate($identifier) { if ($this->gitDriver) { return $this->gitDriver->getChangeDate($identifier); } $resource = $this->getApiUrl() . '/repos/'.$this->owner.'/'.$this->repository.'/commits/'.urlencode($identifier); $commit = JsonFile::parseJson($this->getContents($resource), $resource); return new \DateTime($commit['commit']['committer']['date']); } /** * {@inheritDoc} */ public function getTags() { if ($this->gitDriver) { return $this->gitDriver->getTags(); } if (null === $this->tags) { $this->tags = array(); $resource = $this->getApiUrl() . '/repos/'.$this->owner.'/'.$this->repository.'/tags?per_page=100'; do { $tagsData = JsonFile::parseJson($this->getContents($resource), $resource); foreach ($tagsData as $tag) { $this->tags[$tag['name']] = $tag['commit']['sha']; } $resource = $this->getNextPage(); } while ($resource); } return $this->tags; } /** * {@inheritDoc} */ public function getBranches() { if ($this->gitDriver) { return $this->gitDriver->getBranches(); } if (null === $this->branches) { $this->branches = array(); $resource = $this->getApiUrl() . '/repos/'.$this->owner.'/'.$this->repository.'/git/refs/heads?per_page=100'; $branchBlacklist = array('gh-pages'); do { $branchData = JsonFile::parseJson($this->getContents($resource), $resource); foreach ($branchData as $branch) { $name = substr($branch['ref'], 11); if (!in_array($name, $branchBlacklist)) { $this->branches[$name] = $branch['object']['sha']; } } $resource = $this->getNextPage(); } while ($resource); } return $this->branches; } /** * {@inheritDoc} */ public static function supports(IOInterface $io, Config $config, $url, $deep = false) { if (!preg_match('#^((?:https?|git)://([^/]+)/|git@([^:]+):/?)([^/]+)/(.+?)(?:\.git|/)?$#', $url, $matches)) { return false; } $originUrl = !empty($matches[2]) ? $matches[2] : $matches[3]; if (!in_array(strtolower(preg_replace('{^www\.}i', '', $originUrl)), $config->get('github-domains'))) { return false; } if (!extension_loaded('openssl')) { $io->writeError('Skipping GitHub driver for '.$url.' because the OpenSSL PHP extension is missing.', true, IOInterface::VERBOSE); return false; } return true; } /** * Gives back the loaded <github-api>/repos/<owner>/<repo> result * * @return array|null */ public function getRepoData() { $this->fetchRootIdentifier(); return $this->repoData; } /** * Generate an SSH URL * * @return string */ protected function generateSshUrl() { if (false !== strpos($this->originUrl, ':')) { return 'ssh://git@' . $this->originUrl . '/'.$this->owner.'/'.$this->repository.'.git'; } return 'git@' . $this->originUrl . ':'.$this->owner.'/'.$this->repository.'.git'; } /** * {@inheritDoc} */ protected function getContents($url, $fetchingRepoData = false) { try { return parent::getContents($url); } catch (TransportException $e) { $gitHubUtil = new GitHub($this->io, $this->config, $this->process, $this->remoteFilesystem); switch ($e->getCode()) { case 401: case 404: // try to authorize only if we are fetching the main /repos/foo/bar data, otherwise it must be a real 404 if (!$fetchingRepoData) { throw $e; } if ($gitHubUtil->authorizeOAuth($this->originUrl)) { return parent::getContents($url); } if (!$this->io->isInteractive()) { return $this->attemptCloneFallback(); } $scopesIssued = array(); $scopesNeeded = array(); if ($headers = $e->getHeaders()) { if ($scopes = $this->remoteFilesystem->findHeaderValue($headers, 'X-OAuth-Scopes')) { $scopesIssued = explode(' ', $scopes); } if ($scopes = $this->remoteFilesystem->findHeaderValue($headers, 'X-Accepted-OAuth-Scopes')) { $scopesNeeded = explode(' ', $scopes); } } $scopesFailed = array_diff($scopesNeeded, $scopesIssued); // non-authenticated requests get no scopesNeeded, so ask for credentials // authenticated requests which failed some scopes should ask for new credentials too if (!$headers || !count($scopesNeeded) || count($scopesFailed)) { $gitHubUtil->authorizeOAuthInteractively($this->originUrl, 'Your GitHub credentials are required to fetch private repository metadata (<info>'.$this->url.'</info>)'); } return parent::getContents($url); case 403: if (!$this->io->hasAuthentication($this->originUrl) && $gitHubUtil->authorizeOAuth($this->originUrl)) { return parent::getContents($url); } if (!$this->io->isInteractive() && $fetchingRepoData) { return $this->attemptCloneFallback(); } $rateLimited = $gitHubUtil->isRateLimited($e->getHeaders()); if (!$this->io->hasAuthentication($this->originUrl)) { if (!$this->io->isInteractive()) { $this->io->writeError('<error>GitHub API limit exhausted. Failed to get metadata for the '.$this->url.' repository, try running in interactive mode so that you can enter your GitHub credentials to increase the API limit</error>'); throw $e; } $gitHubUtil->authorizeOAuthInteractively($this->originUrl, 'API limit exhausted. Enter your GitHub credentials to get a larger API limit (<info>'.$this->url.'</info>)'); return parent::getContents($url); } if ($rateLimited) { $rateLimit = $gitHubUtil->getRateLimit($e->getHeaders()); $this->io->writeError(sprintf( '<error>GitHub API limit (%d calls/hr) is exhausted. You are already authorized so you have to wait until %s before doing more requests</error>', $rateLimit['limit'], $rateLimit['reset'] )); } throw $e; default: throw $e; } } } /** * Fetch root identifier from GitHub * * @throws TransportException */ protected function fetchRootIdentifier() { if ($this->repoData) { return; } $repoDataUrl = $this->getApiUrl() . '/repos/'.$this->owner.'/'.$this->repository; $this->repoData = JsonFile::parseJson($this->getContents($repoDataUrl, true), $repoDataUrl); if (null === $this->repoData && null !== $this->gitDriver) { return; } $this->owner = $this->repoData['owner']['login']; $this->repository = $this->repoData['name']; $this->isPrivate = !empty($this->repoData['private']); if (isset($this->repoData['default_branch'])) { $this->rootIdentifier = $this->repoData['default_branch']; } elseif (isset($this->repoData['master_branch'])) { $this->rootIdentifier = $this->repoData['master_branch']; } else { $this->rootIdentifier = 'master'; } $this->hasIssues = !empty($this->repoData['has_issues']); $this->isArchived = !empty($this->repoData['archived']); } protected function attemptCloneFallback() { $this->isPrivate = true; try { // If this repository may be private (hard to say for sure, // GitHub returns 404 for private repositories) and we // cannot ask for authentication credentials (because we // are not interactive) then we fallback to GitDriver. $this->setupGitDriver($this->generateSshUrl()); return; } catch (\RuntimeException $e) { $this->gitDriver = null; $this->io->writeError('<error>Failed to clone the '.$this->generateSshUrl().' repository, try running in interactive mode so that you can enter your GitHub credentials</error>'); throw $e; } } protected function setupGitDriver($url) { $this->gitDriver = new GitDriver( array('url' => $url), $this->io, $this->config, $this->process, $this->remoteFilesystem ); $this->gitDriver->initialize(); } protected function getNextPage() { $headers = $this->remoteFilesystem->getLastHeaders(); foreach ($headers as $header) { if (preg_match('{^link:\s*(.+?)\s*$}i', $header, $match)) { $links = explode(',', $match[1]); foreach ($links as $link) { if (preg_match('{<(.+?)>; *rel="next"}', $link, $match)) { return $match[1]; } } } } } } composer/src/Composer/Repository/Vcs/GitBitbucketDriver.php 0000644 00000004515 14736103146 0020142 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository\Vcs; use Composer\Config; use Composer\IO\IOInterface; /** * @author Per Bernhardt <plb@webfactory.de> */ class GitBitbucketDriver extends BitbucketDriver { /** * {@inheritDoc} */ public function getRootIdentifier() { if ($this->fallbackDriver) { return $this->fallbackDriver->getRootIdentifier(); } if (null === $this->rootIdentifier) { if (! $this->getRepoData()) { return $this->fallbackDriver->getRootIdentifier(); } if ($this->vcsType !== 'git') { throw new \RuntimeException( $this->url.' does not appear to be a git repository, use '. $this->cloneHttpsUrl.' if this is a mercurial bitbucket repository' ); } $mainBranchData = $this->getMainBranchData(); $this->rootIdentifier = !empty($mainBranchData['name']) ? $mainBranchData['name'] : 'master'; } return $this->rootIdentifier; } /** * {@inheritDoc} */ public static function supports(IOInterface $io, Config $config, $url, $deep = false) { if (!preg_match('#^https?://bitbucket\.org/([^/]+)/(.+?)\.git$#i', $url)) { return false; } if (!extension_loaded('openssl')) { $io->writeError('Skipping Bitbucket git driver for '.$url.' because the OpenSSL PHP extension is missing.', true, IOInterface::VERBOSE); return false; } return true; } /** * {@inheritdoc} */ protected function setupFallbackDriver($url) { $this->fallbackDriver = new GitDriver( array('url' => $url), $this->io, $this->config, $this->process, $this->remoteFilesystem ); $this->fallbackDriver->initialize(); } /** * {@inheritdoc} */ protected function generateSshUrl() { return 'git@' . $this->originUrl . ':' . $this->owner.'/'.$this->repository.'.git'; } } composer/src/Composer/Repository/Vcs/VcsDriverInterface.php 0000644 00000006176 14736103146 0020143 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository\Vcs; use Composer\Config; use Composer\IO\IOInterface; /** * @author Jordi Boggiano <j.boggiano@seld.be> */ interface VcsDriverInterface { /** * Initializes the driver (git clone, svn checkout, fetch info etc) */ public function initialize(); /** * Return the composer.json file information * * @param string $identifier Any identifier to a specific branch/tag/commit * @return array containing all infos from the composer.json file */ public function getComposerInformation($identifier); /** * Return the content of $file or null if the file does not exist. * * @param string $file * @param string $identifier * @return string */ public function getFileContent($file, $identifier); /** * Get the changedate for $identifier. * * @param string $identifier * @return \DateTime */ public function getChangeDate($identifier); /** * Return the root identifier (trunk, master, default/tip ..) * * @return string Identifier */ public function getRootIdentifier(); /** * Return list of branches in the repository * * @return array Branch names as keys, identifiers as values */ public function getBranches(); /** * Return list of tags in the repository * * @return array Tag names as keys, identifiers as values */ public function getTags(); /** * @param string $identifier Any identifier to a specific branch/tag/commit * @return array With type, url reference and shasum keys. */ public function getDist($identifier); /** * @param string $identifier Any identifier to a specific branch/tag/commit * @return array With type, url and reference keys. */ public function getSource($identifier); /** * Return the URL of the repository * * @return string */ public function getUrl(); /** * Return true if the repository has a composer file for a given identifier, * false otherwise. * * @param string $identifier Any identifier to a specific branch/tag/commit * @return bool Whether the repository has a composer file for a given identifier. */ public function hasComposerFile($identifier); /** * Performs any cleanup necessary as the driver is not longer needed */ public function cleanup(); /** * Checks if this driver can handle a given url * * @param IOInterface $io IO instance * @param Config $config current $config * @param string $url URL to validate/check * @param bool $deep unless true, only shallow checks (url matching typically) should be done * @return bool */ public static function supports(IOInterface $io, Config $config, $url, $deep = false); } composer/src/Composer/Repository/Vcs/SvnDriver.php 0000644 00000027643 14736103146 0016337 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository\Vcs; use Composer\Cache; use Composer\Config; use Composer\Json\JsonFile; use Composer\Util\ProcessExecutor; use Composer\Util\Filesystem; use Composer\Util\Svn as SvnUtil; use Composer\IO\IOInterface; use Composer\Downloader\TransportException; /** * @author Jordi Boggiano <j.boggiano@seld.be> * @author Till Klampaeckel <till@php.net> */ class SvnDriver extends VcsDriver { /** * @var Cache */ protected $cache; protected $baseUrl; protected $tags; protected $branches; protected $rootIdentifier; protected $infoCache = array(); protected $trunkPath = 'trunk'; protected $branchesPath = 'branches'; protected $tagsPath = 'tags'; protected $packagePath = ''; protected $cacheCredentials = true; /** * @var \Composer\Util\Svn */ private $util; /** * {@inheritDoc} */ public function initialize() { $this->url = $this->baseUrl = rtrim(self::normalizeUrl($this->url), '/'); SvnUtil::cleanEnv(); if (isset($this->repoConfig['trunk-path'])) { $this->trunkPath = $this->repoConfig['trunk-path']; } if (isset($this->repoConfig['branches-path'])) { $this->branchesPath = $this->repoConfig['branches-path']; } if (isset($this->repoConfig['tags-path'])) { $this->tagsPath = $this->repoConfig['tags-path']; } if (array_key_exists('svn-cache-credentials', $this->repoConfig)) { $this->cacheCredentials = (bool) $this->repoConfig['svn-cache-credentials']; } if (isset($this->repoConfig['package-path'])) { $this->packagePath = '/' . trim($this->repoConfig['package-path'], '/'); } if (false !== ($pos = strrpos($this->url, '/' . $this->trunkPath))) { $this->baseUrl = substr($this->url, 0, $pos); } $this->cache = new Cache($this->io, $this->config->get('cache-repo-dir').'/'.preg_replace('{[^a-z0-9.]}i', '-', $this->baseUrl)); $this->getBranches(); $this->getTags(); } /** * {@inheritDoc} */ public function getRootIdentifier() { return $this->rootIdentifier ?: $this->trunkPath; } /** * {@inheritDoc} */ public function getUrl() { return $this->url; } /** * {@inheritDoc} */ public function getSource($identifier) { return array('type' => 'svn', 'url' => $this->baseUrl, 'reference' => $identifier); } /** * {@inheritDoc} */ public function getDist($identifier) { return null; } /** * {@inheritdoc} */ protected function shouldCache($identifier) { return $this->cache && preg_match('{@\d+$}', $identifier); } /** * {@inheritdoc} */ public function getComposerInformation($identifier) { if (!isset($this->infoCache[$identifier])) { if ($this->shouldCache($identifier) && $res = $this->cache->read($identifier.'.json')) { return $this->infoCache[$identifier] = JsonFile::parseJson($res); } try { $composer = $this->getBaseComposerInformation($identifier); } catch (TransportException $e) { $message = $e->getMessage(); if (stripos($message, 'path not found') === false && stripos($message, 'svn: warning: W160013') === false) { throw $e; } // remember a not-existent composer.json $composer = ''; } if ($this->shouldCache($identifier)) { $this->cache->write($identifier.'.json', json_encode($composer)); } $this->infoCache[$identifier] = $composer; } return $this->infoCache[$identifier]; } /** * @param string $file * @param string $identifier */ public function getFileContent($file, $identifier) { $identifier = '/' . trim($identifier, '/') . '/'; preg_match('{^(.+?)(@\d+)?/$}', $identifier, $match); if (!empty($match[2])) { $path = $match[1]; $rev = $match[2]; } else { $path = $identifier; $rev = ''; } try { $resource = $path.$file; $output = $this->execute('svn cat', $this->baseUrl . $resource . $rev); if (!trim($output)) { return null; } } catch (\RuntimeException $e) { throw new TransportException($e->getMessage()); } return $output; } /** * {@inheritdoc} */ public function getChangeDate($identifier) { $identifier = '/' . trim($identifier, '/') . '/'; preg_match('{^(.+?)(@\d+)?/$}', $identifier, $match); if (!empty($match[2])) { $path = $match[1]; $rev = $match[2]; } else { $path = $identifier; $rev = ''; } $output = $this->execute('svn info', $this->baseUrl . $path . $rev); foreach ($this->process->splitLines($output) as $line) { if ($line && preg_match('{^Last Changed Date: ([^(]+)}', $line, $match)) { return new \DateTime($match[1], new \DateTimeZone('UTC')); } } return null; } /** * {@inheritDoc} */ public function getTags() { if (null === $this->tags) { $this->tags = array(); if ($this->tagsPath !== false) { $output = $this->execute('svn ls --verbose', $this->baseUrl . '/' . $this->tagsPath); if ($output) { foreach ($this->process->splitLines($output) as $line) { $line = trim($line); if ($line && preg_match('{^\s*(\S+).*?(\S+)\s*$}', $line, $match)) { if (isset($match[1]) && isset($match[2]) && $match[2] !== './') { $this->tags[rtrim($match[2], '/')] = $this->buildIdentifier( '/' . $this->tagsPath . '/' . $match[2], $match[1] ); } } } } } } return $this->tags; } /** * {@inheritDoc} */ public function getBranches() { if (null === $this->branches) { $this->branches = array(); if (false === $this->trunkPath) { $trunkParent = $this->baseUrl . '/'; } else { $trunkParent = $this->baseUrl . '/' . $this->trunkPath; } $output = $this->execute('svn ls --verbose', $trunkParent); if ($output) { foreach ($this->process->splitLines($output) as $line) { $line = trim($line); if ($line && preg_match('{^\s*(\S+).*?(\S+)\s*$}', $line, $match)) { if (isset($match[1]) && isset($match[2]) && $match[2] === './') { $this->branches['trunk'] = $this->buildIdentifier( '/' . $this->trunkPath, $match[1] ); $this->rootIdentifier = $this->branches['trunk']; break; } } } } unset($output); if ($this->branchesPath !== false) { $output = $this->execute('svn ls --verbose', $this->baseUrl . '/' . $this->branchesPath); if ($output) { foreach ($this->process->splitLines(trim($output)) as $line) { $line = trim($line); if ($line && preg_match('{^\s*(\S+).*?(\S+)\s*$}', $line, $match)) { if (isset($match[1]) && isset($match[2]) && $match[2] !== './') { $this->branches[rtrim($match[2], '/')] = $this->buildIdentifier( '/' . $this->branchesPath . '/' . $match[2], $match[1] ); } } } } } } return $this->branches; } /** * {@inheritDoc} */ public static function supports(IOInterface $io, Config $config, $url, $deep = false) { $url = self::normalizeUrl($url); if (preg_match('#(^svn://|^svn\+ssh://|svn\.)#i', $url)) { return true; } // proceed with deep check for local urls since they are fast to process if (!$deep && !Filesystem::isLocalPath($url)) { return false; } $processExecutor = new ProcessExecutor($io); $exit = $processExecutor->execute( "svn info --non-interactive ".ProcessExecutor::escape($url), $ignoredOutput ); if ($exit === 0) { // This is definitely a Subversion repository. return true; } // Subversion client 1.7 and older if (false !== stripos($processExecutor->getErrorOutput(), 'authorization failed:')) { // This is likely a remote Subversion repository that requires // authentication. We will handle actual authentication later. return true; } // Subversion client 1.8 and newer if (false !== stripos($processExecutor->getErrorOutput(), 'Authentication failed')) { // This is likely a remote Subversion or newer repository that requires // authentication. We will handle actual authentication later. return true; } return false; } /** * An absolute path (leading '/') is converted to a file:// url. * * @param string $url * * @return string */ protected static function normalizeUrl($url) { $fs = new Filesystem(); if ($fs->isAbsolutePath($url)) { return 'file://' . strtr($url, '\\', '/'); } return $url; } /** * Execute an SVN command and try to fix up the process with credentials * if necessary. * * @param string $command The svn command to run. * @param string $url The SVN URL. * @throws \RuntimeException * @return string */ protected function execute($command, $url) { if (null === $this->util) { $this->util = new SvnUtil($this->baseUrl, $this->io, $this->config, $this->process); $this->util->setCacheCredentials($this->cacheCredentials); } try { return $this->util->execute($command, $url); } catch (\RuntimeException $e) { if (null === $this->util->binaryVersion()) { throw new \RuntimeException('Failed to load '.$this->url.', svn was not found, check that it is installed and in your PATH env.' . "\n\n" . $this->process->getErrorOutput()); } throw new \RuntimeException( 'Repository '.$this->url.' could not be processed, '.$e->getMessage() ); } } /** * Build the identifier respecting "package-path" config option * * @param string $baseDir The path to trunk/branch/tag * @param int $revision The revision mark to add to identifier * * @return string */ protected function buildIdentifier($baseDir, $revision) { return rtrim($baseDir, '/') . $this->packagePath . '/@' . $revision; } } composer/src/Composer/Repository/Vcs/FossilDriver.php 0000644 00000016447 14736103146 0017030 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository\Vcs; use Composer\Cache; use Composer\Config; use Composer\Util\ProcessExecutor; use Composer\Util\Filesystem; use Composer\IO\IOInterface; /** * @author BohwaZ <http://bohwaz.net/> */ class FossilDriver extends VcsDriver { protected $tags; protected $branches; protected $rootIdentifier; protected $repoFile; protected $checkoutDir; protected $infoCache = array(); /** * {@inheritDoc} */ public function initialize() { // Make sure fossil is installed and reachable. $this->checkFossil(); // Ensure we are allowed to use this URL by config. $this->config->prohibitUrlByConfig($this->url, $this->io); // Only if url points to a locally accessible directory, assume it's the checkout directory. // Otherwise, it should be something fossil can clone from. if (Filesystem::isLocalPath($this->url) && is_dir($this->url)) { $this->checkoutDir = $this->url; } else { if (!Cache::isUsable($this->config->get('cache-repo-dir')) || !Cache::isUsable($this->config->get('cache-vcs-dir'))) { throw new \RuntimeException('FossilDriver requires a usable cache directory, and it looks like you set it to be disabled'); } $localName = preg_replace('{[^a-z0-9]}i', '-', $this->url); $this->repoFile = $this->config->get('cache-repo-dir') . '/' . $localName . '.fossil'; $this->checkoutDir = $this->config->get('cache-vcs-dir') . '/' . $localName . '/'; $this->updateLocalRepo(); } $this->getTags(); $this->getBranches(); } /** * Check that fossil can be invoked via command line. */ protected function checkFossil() { if (0 !== $this->process->execute('fossil version', $ignoredOutput)) { throw new \RuntimeException("fossil was not found, check that it is installed and in your PATH env.\n\n" . $this->process->getErrorOutput()); } } /** * Clone or update existing local fossil repository. */ protected function updateLocalRepo() { $fs = new Filesystem(); $fs->ensureDirectoryExists($this->checkoutDir); if (!is_writable(dirname($this->checkoutDir))) { throw new \RuntimeException('Can not clone '.$this->url.' to access package information. The "'.$this->checkoutDir.'" directory is not writable by the current user.'); } // update the repo if it is a valid fossil repository if (is_file($this->repoFile) && is_dir($this->checkoutDir) && 0 === $this->process->execute('fossil info', $output, $this->checkoutDir)) { if (0 !== $this->process->execute('fossil pull', $output, $this->checkoutDir)) { $this->io->writeError('<error>Failed to update '.$this->url.', package information from this repository may be outdated ('.$this->process->getErrorOutput().')</error>'); } } else { // clean up directory and do a fresh clone into it $fs->removeDirectory($this->checkoutDir); $fs->remove($this->repoFile); $fs->ensureDirectoryExists($this->checkoutDir); if (0 !== $this->process->execute(sprintf('fossil clone %s %s', ProcessExecutor::escape($this->url), ProcessExecutor::escape($this->repoFile)), $output)) { $output = $this->process->getErrorOutput(); throw new \RuntimeException('Failed to clone '.$this->url.' to repository ' . $this->repoFile . "\n\n" .$output); } if (0 !== $this->process->execute(sprintf('fossil open %s --nested', ProcessExecutor::escape($this->repoFile)), $output, $this->checkoutDir)) { $output = $this->process->getErrorOutput(); throw new \RuntimeException('Failed to open repository '.$this->repoFile.' in ' . $this->checkoutDir . "\n\n" .$output); } } } /** * {@inheritDoc} */ public function getRootIdentifier() { if (null === $this->rootIdentifier) { $this->rootIdentifier = 'trunk'; } return $this->rootIdentifier; } /** * {@inheritDoc} */ public function getUrl() { return $this->url; } /** * {@inheritDoc} */ public function getSource($identifier) { return array('type' => 'fossil', 'url' => $this->getUrl(), 'reference' => $identifier); } /** * {@inheritDoc} */ public function getDist($identifier) { return null; } /** * {@inheritdoc} */ public function getFileContent($file, $identifier) { $command = sprintf('fossil cat -r %s %s', ProcessExecutor::escape($identifier), ProcessExecutor::escape($file)); $this->process->execute($command, $content, $this->checkoutDir); if (!trim($content)) { return null; } return $content; } /** * {@inheritdoc} */ public function getChangeDate($identifier) { $this->process->execute('fossil finfo -b -n 1 composer.json', $output, $this->checkoutDir); list($ckout, $date, $message) = explode(' ', trim($output), 3); return new \DateTime($date, new \DateTimeZone('UTC')); } /** * {@inheritDoc} */ public function getTags() { if (null === $this->tags) { $tags = array(); $this->process->execute('fossil tag list', $output, $this->checkoutDir); foreach ($this->process->splitLines($output) as $tag) { $tags[$tag] = $tag; } $this->tags = $tags; } return $this->tags; } /** * {@inheritDoc} */ public function getBranches() { if (null === $this->branches) { $branches = array(); $bookmarks = array(); $this->process->execute('fossil branch list', $output, $this->checkoutDir); foreach ($this->process->splitLines($output) as $branch) { $branch = trim(preg_replace('/^\*/', '', trim($branch))); $branches[$branch] = $branch; } $this->branches = $branches; } return $this->branches; } /** * {@inheritDoc} */ public static function supports(IOInterface $io, Config $config, $url, $deep = false) { if (preg_match('#(^(?:https?|ssh)://(?:[^@]@)?(?:chiselapp\.com|fossil\.))#i', $url)) { return true; } if (preg_match('!/fossil/|\.fossil!', $url)) { return true; } // local filesystem if (Filesystem::isLocalPath($url)) { $url = Filesystem::getPlatformPath($url); if (!is_dir($url)) { return false; } $process = new ProcessExecutor($io); // check whether there is a fossil repo in that path if ($process->execute('fossil info', $output, $url) === 0) { return true; } } return false; } } composer/src/Composer/Repository/Vcs/HgDriver.php 0000644 00000015531 14736103146 0016120 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository\Vcs; use Composer\Config; use Composer\Cache; use Composer\Util\Hg as HgUtils; use Composer\Util\ProcessExecutor; use Composer\Util\Filesystem; use Composer\IO\IOInterface; /** * @author Per Bernhardt <plb@webfactory.de> */ class HgDriver extends VcsDriver { protected $tags; protected $branches; protected $rootIdentifier; protected $repoDir; protected $infoCache = array(); /** * {@inheritDoc} */ public function initialize() { if (Filesystem::isLocalPath($this->url)) { $this->repoDir = $this->url; } else { if (!Cache::isUsable($this->config->get('cache-vcs-dir'))) { throw new \RuntimeException('HgDriver requires a usable cache directory, and it looks like you set it to be disabled'); } $cacheDir = $this->config->get('cache-vcs-dir'); $this->repoDir = $cacheDir . '/' . preg_replace('{[^a-z0-9]}i', '-', $this->url) . '/'; $fs = new Filesystem(); $fs->ensureDirectoryExists($cacheDir); if (!is_writable(dirname($this->repoDir))) { throw new \RuntimeException('Can not clone '.$this->url.' to access package information. The "'.$cacheDir.'" directory is not writable by the current user.'); } // Ensure we are allowed to use this URL by config $this->config->prohibitUrlByConfig($this->url, $this->io); $hgUtils = new HgUtils($this->io, $this->config, $this->process); // update the repo if it is a valid hg repository if (is_dir($this->repoDir) && 0 === $this->process->execute('hg summary', $output, $this->repoDir)) { if (0 !== $this->process->execute('hg pull', $output, $this->repoDir)) { $this->io->writeError('<error>Failed to update '.$this->url.', package information from this repository may be outdated ('.$this->process->getErrorOutput().')</error>'); } } else { // clean up directory and do a fresh clone into it $fs->removeDirectory($this->repoDir); $repoDir = $this->repoDir; $command = function ($url) use ($repoDir) { return sprintf('hg clone --noupdate %s %s', ProcessExecutor::escape($url), ProcessExecutor::escape($repoDir)); }; $hgUtils->runCommand($command, $this->url, null); } } $this->getTags(); $this->getBranches(); } /** * {@inheritDoc} */ public function getRootIdentifier() { if (null === $this->rootIdentifier) { $this->process->execute(sprintf('hg tip --template "{node}"'), $output, $this->repoDir); $output = $this->process->splitLines($output); $this->rootIdentifier = $output[0]; } return $this->rootIdentifier; } /** * {@inheritDoc} */ public function getUrl() { return $this->url; } /** * {@inheritDoc} */ public function getSource($identifier) { return array('type' => 'hg', 'url' => $this->getUrl(), 'reference' => $identifier); } /** * {@inheritDoc} */ public function getDist($identifier) { return null; } /** * {@inheritdoc} */ public function getFileContent($file, $identifier) { $resource = sprintf('hg cat -r %s %s', ProcessExecutor::escape($identifier), ProcessExecutor::escape($file)); $this->process->execute($resource, $content, $this->repoDir); if (!trim($content)) { return; } return $content; } /** * {@inheritdoc} */ public function getChangeDate($identifier) { $this->process->execute( sprintf( 'hg log --template "{date|rfc3339date}" -r %s', ProcessExecutor::escape($identifier) ), $output, $this->repoDir ); return new \DateTime(trim($output), new \DateTimeZone('UTC')); } /** * {@inheritDoc} */ public function getTags() { if (null === $this->tags) { $tags = array(); $this->process->execute('hg tags', $output, $this->repoDir); foreach ($this->process->splitLines($output) as $tag) { if ($tag && preg_match('(^([^\s]+)\s+\d+:(.*)$)', $tag, $match)) { $tags[$match[1]] = $match[2]; } } unset($tags['tip']); $this->tags = $tags; } return $this->tags; } /** * {@inheritDoc} */ public function getBranches() { if (null === $this->branches) { $branches = array(); $bookmarks = array(); $this->process->execute('hg branches', $output, $this->repoDir); foreach ($this->process->splitLines($output) as $branch) { if ($branch && preg_match('(^([^\s]+)\s+\d+:([a-f0-9]+))', $branch, $match)) { $branches[$match[1]] = $match[2]; } } $this->process->execute('hg bookmarks', $output, $this->repoDir); foreach ($this->process->splitLines($output) as $branch) { if ($branch && preg_match('(^(?:[\s*]*)([^\s]+)\s+\d+:(.*)$)', $branch, $match)) { $bookmarks[$match[1]] = $match[2]; } } // Branches will have preference over bookmarks $this->branches = array_merge($bookmarks, $branches); } return $this->branches; } /** * {@inheritDoc} */ public static function supports(IOInterface $io, Config $config, $url, $deep = false) { if (preg_match('#(^(?:https?|ssh)://(?:[^@]+@)?bitbucket.org|https://(?:.*?)\.kilnhg.com)#i', $url)) { return true; } // local filesystem if (Filesystem::isLocalPath($url)) { $url = Filesystem::getPlatformPath($url); if (!is_dir($url)) { return false; } $process = new ProcessExecutor($io); // check whether there is a hg repo in that path if ($process->execute('hg summary', $output, $url) === 0) { return true; } } if (!$deep) { return false; } $processExecutor = new ProcessExecutor($io); $exit = $processExecutor->execute(sprintf('hg identify %s', ProcessExecutor::escape($url)), $ignored); return $exit === 0; } } composer/src/Composer/Repository/Vcs/PerforceDriver.php 0000644 00000007532 14736103146 0017331 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository\Vcs; use Composer\Config; use Composer\Cache; use Composer\IO\IOInterface; use Composer\Util\ProcessExecutor; use Composer\Util\Perforce; /** * @author Matt Whittom <Matt.Whittom@veteransunited.com> */ class PerforceDriver extends VcsDriver { protected $depot; protected $branch; /** @var Perforce */ protected $perforce; /** * {@inheritDoc} */ public function initialize() { $this->depot = $this->repoConfig['depot']; $this->branch = ''; if (!empty($this->repoConfig['branch'])) { $this->branch = $this->repoConfig['branch']; } $this->initPerforce($this->repoConfig); $this->perforce->p4Login(); $this->perforce->checkStream(); $this->perforce->writeP4ClientSpec(); $this->perforce->connectClient(); return true; } private function initPerforce($repoConfig) { if (!empty($this->perforce)) { return; } if (!Cache::isUsable($this->config->get('cache-vcs-dir'))) { throw new \RuntimeException('PerforceDriver requires a usable cache directory, and it looks like you set it to be disabled'); } $repoDir = $this->config->get('cache-vcs-dir') . '/' . $this->depot; $this->perforce = Perforce::create($repoConfig, $this->getUrl(), $repoDir, $this->process, $this->io); } /** * {@inheritdoc} */ public function getFileContent($file, $identifier) { return $this->perforce->getFileContent($file, $identifier); } /** * {@inheritdoc} */ public function getChangeDate($identifier) { return null; } /** * {@inheritDoc} */ public function getRootIdentifier() { return $this->branch; } /** * {@inheritDoc} */ public function getBranches() { return $this->perforce->getBranches(); } /** * {@inheritDoc} */ public function getTags() { return $this->perforce->getTags(); } /** * {@inheritDoc} */ public function getDist($identifier) { return null; } /** * {@inheritDoc} */ public function getSource($identifier) { $source = array( 'type' => 'perforce', 'url' => $this->repoConfig['url'], 'reference' => $identifier, 'p4user' => $this->perforce->getUser(), ); return $source; } /** * {@inheritDoc} */ public function getUrl() { return $this->url; } /** * {@inheritDoc} */ public function hasComposerFile($identifier) { $composerInfo = $this->perforce->getComposerInformation('//' . $this->depot . '/' . $identifier); $composerInfoIdentifier = $identifier; return !empty($composerInfo); } /** * {@inheritDoc} */ public function getContents($url) { return false; } /** * {@inheritDoc} */ public static function supports(IOInterface $io, Config $config, $url, $deep = false) { if ($deep || preg_match('#\b(perforce|p4)\b#i', $url)) { return Perforce::checkServerExists($url, new ProcessExecutor($io)); } return false; } /** * {@inheritDoc} */ public function cleanup() { $this->perforce->cleanupClientSpec(); $this->perforce = null; } public function getDepot() { return $this->depot; } public function getBranch() { return $this->branch; } } composer/src/Composer/Repository/Vcs/HgBitbucketDriver.php 0000644 00000004507 14736103146 0017756 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository\Vcs; use Composer\Config; use Composer\IO\IOInterface; /** * @author Per Bernhardt <plb@webfactory.de> */ class HgBitbucketDriver extends BitbucketDriver { /** * {@inheritDoc} */ public function getRootIdentifier() { if ($this->fallbackDriver) { return $this->fallbackDriver->getRootIdentifier(); } if (null === $this->rootIdentifier) { if (! $this->getRepoData()) { return $this->fallbackDriver->getRootIdentifier(); } if ($this->vcsType !== 'hg') { throw new \RuntimeException( $this->url.' does not appear to be a mercurial repository, use '. $this->cloneHttpsUrl.' if this is a git bitbucket repository' ); } $mainBranchData = $this->getMainBranchData(); $this->rootIdentifier = !empty($mainBranchData['name']) ? $mainBranchData['name'] : 'default'; } return $this->rootIdentifier; } /** * {@inheritDoc} */ public static function supports(IOInterface $io, Config $config, $url, $deep = false) { if (!preg_match('#^https?://bitbucket\.org/([^/]+)/([^/]+)/?$#i', $url)) { return false; } if (!extension_loaded('openssl')) { $io->writeError('Skipping Bitbucket hg driver for '.$url.' because the OpenSSL PHP extension is missing.', true, IOInterface::VERBOSE); return false; } return true; } /** * {@inheritdoc} */ protected function setupFallbackDriver($url) { $this->fallbackDriver = new HgDriver( array('url' => $url), $this->io, $this->config, $this->process, $this->remoteFilesystem ); $this->fallbackDriver->initialize(); } /** * {@inheritdoc} */ protected function generateSshUrl() { return 'ssh://hg@' . $this->originUrl . '/' . $this->owner.'/'.$this->repository; } } composer/src/Composer/Repository/Vcs/GitLabDriver.php 0000644 00000043116 14736103146 0016724 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository\Vcs; use Composer\Config; use Composer\Cache; use Composer\IO\IOInterface; use Composer\Json\JsonFile; use Composer\Downloader\TransportException; use Composer\Util\RemoteFilesystem; use Composer\Util\GitLab; /** * Driver for GitLab API, use the Git driver for local checkouts. * * @author Henrik Bjørnskov <henrik@bjrnskov.dk> * @author Jérôme Tamarelle <jerome@tamarelle.net> */ class GitLabDriver extends VcsDriver { private $scheme; private $namespace; private $repository; /** * @var array Project data returned by GitLab API */ private $project; /** * @var array Keeps commits returned by GitLab API */ private $commits = array(); /** * @var array List of tag => reference */ private $tags; /** * @var array List of branch => reference */ private $branches; /** * Git Driver * * @var GitDriver */ protected $gitDriver; /** * Defaults to true unless we can make sure it is public * * @var bool defines whether the repo is private or not */ private $isPrivate = true; /** * @var bool true if the origin has a port number or a path component in it */ private $hasNonstandardOrigin = false; const URL_REGEX = '#^(?:(?P<scheme>https?)://(?P<domain>.+?)(?::(?P<port>[0-9]+))?/|git@(?P<domain2>[^:]+):)(?P<parts>.+)/(?P<repo>[^/]+?)(?:\.git|/)?$#'; /** * Extracts information from the repository url. * * SSH urls use https by default. Set "secure-http": false on the repository config to use http instead. * * {@inheritDoc} */ public function initialize() { if (!preg_match(self::URL_REGEX, $this->url, $match)) { throw new \InvalidArgumentException('The URL provided is invalid. It must be the HTTP URL of a GitLab project.'); } $guessedDomain = !empty($match['domain']) ? $match['domain'] : $match['domain2']; $configuredDomains = $this->config->get('gitlab-domains'); $urlParts = explode('/', $match['parts']); $this->scheme = !empty($match['scheme']) ? $match['scheme'] : (isset($this->repoConfig['secure-http']) && $this->repoConfig['secure-http'] === false ? 'http' : 'https') ; $this->originUrl = $this->determineOrigin($configuredDomains, $guessedDomain, $urlParts, $match['port']); if (false !== strpos($this->originUrl, ':') || false !== strpos($this->originUrl, '/')) { $this->hasNonstandardOrigin = true; } $this->namespace = implode('/', $urlParts); $this->repository = preg_replace('#(\.git)$#', '', $match['repo']); $this->cache = new Cache($this->io, $this->config->get('cache-repo-dir').'/'.$this->originUrl.'/'.$this->namespace.'/'.$this->repository); $this->fetchProject(); } /** * Updates the RemoteFilesystem instance. * Mainly useful for tests. * * @internal */ public function setRemoteFilesystem(RemoteFilesystem $remoteFilesystem) { $this->remoteFilesystem = $remoteFilesystem; } /** * {@inheritDoc} */ public function getComposerInformation($identifier) { if ($this->gitDriver) { return $this->gitDriver->getComposerInformation($identifier); } if (!isset($this->infoCache[$identifier])) { if ($this->shouldCache($identifier) && $res = $this->cache->read($identifier)) { return $this->infoCache[$identifier] = JsonFile::parseJson($res); } $composer = $this->getBaseComposerInformation($identifier); if ($composer) { // specials for gitlab (this data is only available if authentication is provided) if (!isset($composer['support']['issues']) && isset($this->project['_links']['issues'])) { $composer['support']['issues'] = $this->project['_links']['issues']; } if (!isset($composer['abandoned']) && !empty($this->project['archived'])) { $composer['abandoned'] = true; } } if ($this->shouldCache($identifier)) { $this->cache->write($identifier, json_encode($composer)); } $this->infoCache[$identifier] = $composer; } return $this->infoCache[$identifier]; } /** * {@inheritdoc} */ public function getFileContent($file, $identifier) { if ($this->gitDriver) { return $this->gitDriver->getFileContent($file, $identifier); } // Convert the root identifier to a cacheable commit id if (!preg_match('{[a-f0-9]{40}}i', $identifier)) { $branches = $this->getBranches(); if (isset($branches[$identifier])) { $identifier = $branches[$identifier]; } } $resource = $this->getApiUrl().'/repository/files/'.$this->urlEncodeAll($file).'/raw?ref='.$identifier; try { $content = $this->getContents($resource); } catch (TransportException $e) { if ($e->getCode() !== 404) { throw $e; } return null; } return $content; } /** * {@inheritdoc} */ public function getChangeDate($identifier) { if ($this->gitDriver) { return $this->gitDriver->getChangeDate($identifier); } if (isset($this->commits[$identifier])) { return new \DateTime($this->commits[$identifier]['committed_date']); } return new \DateTime(); } /** * {@inheritDoc} */ public function getRepositoryUrl() { return $this->isPrivate ? $this->project['ssh_url_to_repo'] : $this->project['http_url_to_repo']; } /** * {@inheritDoc} */ public function getUrl() { if ($this->gitDriver) { return $this->gitDriver->getUrl(); } return $this->project['web_url']; } /** * {@inheritDoc} */ public function getDist($identifier) { $url = $this->getApiUrl().'/repository/archive.zip?sha='.$identifier; return array('type' => 'zip', 'url' => $url, 'reference' => $identifier, 'shasum' => ''); } /** * {@inheritDoc} */ public function getSource($identifier) { if ($this->gitDriver) { return $this->gitDriver->getSource($identifier); } return array('type' => 'git', 'url' => $this->getRepositoryUrl(), 'reference' => $identifier); } /** * {@inheritDoc} */ public function getRootIdentifier() { if ($this->gitDriver) { return $this->gitDriver->getRootIdentifier(); } return $this->project['default_branch']; } /** * {@inheritDoc} */ public function getBranches() { if ($this->gitDriver) { return $this->gitDriver->getBranches(); } if (!$this->branches) { $this->branches = $this->getReferences('branches'); } return $this->branches; } /** * {@inheritDoc} */ public function getTags() { if ($this->gitDriver) { return $this->gitDriver->getTags(); } if (!$this->tags) { $this->tags = $this->getReferences('tags'); } return $this->tags; } /** * @return string Base URL for GitLab API v3 */ public function getApiUrl() { return $this->scheme.'://'.$this->originUrl.'/api/v4/projects/'.$this->urlEncodeAll($this->namespace).'%2F'.$this->urlEncodeAll($this->repository); } /** * Urlencode all non alphanumeric characters. rawurlencode() can not be used as it does not encode `.` * * @param string $string * @return string */ private function urlEncodeAll($string) { $encoded = ''; for ($i = 0; isset($string[$i]); $i++) { $character = $string[$i]; if (!ctype_alnum($character) && !in_array($character, array('-', '_'), true)) { $character = '%' . sprintf('%02X', ord($character)); } $encoded .= $character; } return $encoded; } /** * @param string $type * * @return string[] where keys are named references like tags or branches and the value a sha */ protected function getReferences($type) { $perPage = 100; $resource = $this->getApiUrl().'/repository/'.$type.'?per_page='.$perPage; $references = array(); do { $data = JsonFile::parseJson($this->getContents($resource), $resource); foreach ($data as $datum) { $references[$datum['name']] = $datum['commit']['id']; // Keep the last commit date of a reference to avoid // unnecessary API call when retrieving the composer file. $this->commits[$datum['commit']['id']] = $datum['commit']; } if (count($data) >= $perPage) { $resource = $this->getNextPage(); } else { $resource = false; } } while ($resource); return $references; } protected function fetchProject() { // we need to fetch the default branch from the api $resource = $this->getApiUrl(); $this->project = JsonFile::parseJson($this->getContents($resource, true), $resource); if (isset($this->project['visibility'])) { $this->isPrivate = $this->project['visibility'] !== 'public'; } else { // client is not authendicated, therefore repository has to be public $this->isPrivate = false; } } protected function attemptCloneFallback() { try { if ($this->isPrivate === false) { $url = $this->generatePublicUrl(); } else { $url = $this->generateSshUrl(); } // If this repository may be private and we // cannot ask for authentication credentials (because we // are not interactive) then we fallback to GitDriver. $this->setupGitDriver($url); return; } catch (\RuntimeException $e) { $this->gitDriver = null; $this->io->writeError('<error>Failed to clone the '.$url.' repository, try running in interactive mode so that you can enter your credentials</error>'); throw $e; } } /** * Generate an SSH URL * * @return string */ protected function generateSshUrl() { if ($this->hasNonstandardOrigin) { return 'ssh://git@'.$this->originUrl.'/'.$this->namespace.'/'.$this->repository.'.git'; } return 'git@' . $this->originUrl . ':'.$this->namespace.'/'.$this->repository.'.git'; } protected function generatePublicUrl() { return $this->scheme . '://' . $this->originUrl . '/'.$this->namespace.'/'.$this->repository.'.git'; } protected function setupGitDriver($url) { $this->gitDriver = new GitDriver( array('url' => $url), $this->io, $this->config, $this->process, $this->remoteFilesystem ); $this->gitDriver->initialize(); } /** * {@inheritDoc} */ protected function getContents($url, $fetchingRepoData = false) { try { $res = parent::getContents($url); if ($fetchingRepoData) { $json = JsonFile::parseJson($res, $url); // Accessing the API with a token with Guest (10) access will return // more data than unauthenticated access but no default_branch data // accessing files via the API will then also fail if (!isset($json['default_branch']) && isset($json['permissions'])) { $this->isPrivate = $json['visibility'] !== 'public'; $moreThanGuestAccess = false; // Check both access levels (e.g. project, group) // - value will be null if no access is set // - value will be array with key access_level if set foreach ($json['permissions'] as $permission) { if ($permission && $permission['access_level'] > 10) { $moreThanGuestAccess = true; } } if (!$moreThanGuestAccess) { $this->io->writeError('<warning>GitLab token with Guest only access detected</warning>'); return $this->attemptCloneFallback(); } } // force auth as the unauthenticated version of the API is broken if (!isset($json['default_branch'])) { if (!empty($json['id'])) { $this->isPrivate = false; } throw new TransportException('GitLab API seems to not be authenticated as it did not return a default_branch', 401); } } return $res; } catch (TransportException $e) { $gitLabUtil = new GitLab($this->io, $this->config, $this->process, $this->remoteFilesystem); switch ($e->getCode()) { case 401: case 404: // try to authorize only if we are fetching the main /repos/foo/bar data, otherwise it must be a real 404 if (!$fetchingRepoData) { throw $e; } if ($gitLabUtil->authorizeOAuth($this->originUrl)) { return parent::getContents($url); } if (!$this->io->isInteractive()) { return $this->attemptCloneFallback(); } $this->io->writeError('<warning>Failed to download ' . $this->namespace . '/' . $this->repository . ':' . $e->getMessage() . '</warning>'); $gitLabUtil->authorizeOAuthInteractively($this->scheme, $this->originUrl, 'Your credentials are required to fetch private repository metadata (<info>'.$this->url.'</info>)'); return parent::getContents($url); case 403: if (!$this->io->hasAuthentication($this->originUrl) && $gitLabUtil->authorizeOAuth($this->originUrl)) { return parent::getContents($url); } if (!$this->io->isInteractive() && $fetchingRepoData) { return $this->attemptCloneFallback(); } throw $e; default: throw $e; } } } /** * Uses the config `gitlab-domains` to see if the driver supports the url for the * repository given. * * {@inheritDoc} */ public static function supports(IOInterface $io, Config $config, $url, $deep = false) { if (!preg_match(self::URL_REGEX, $url, $match)) { return false; } $scheme = !empty($match['scheme']) ? $match['scheme'] : null; $guessedDomain = !empty($match['domain']) ? $match['domain'] : $match['domain2']; $urlParts = explode('/', $match['parts']); if (false === self::determineOrigin((array) $config->get('gitlab-domains'), $guessedDomain, $urlParts, $match['port'])) { return false; } if ('https' === $scheme && !extension_loaded('openssl')) { $io->writeError('Skipping GitLab driver for '.$url.' because the OpenSSL PHP extension is missing.', true, IOInterface::VERBOSE); return false; } return true; } private function getNextPage() { $headers = $this->remoteFilesystem->getLastHeaders(); foreach ($headers as $header) { if (preg_match('{^link:\s*(.+?)\s*$}i', $header, $match)) { $links = explode(',', $match[1]); foreach ($links as $link) { if (preg_match('{<(.+?)>; *rel="next"}', $link, $match)) { return $match[1]; } } } } } /** * @param array $configuredDomains * @param string $guessedDomain * @param array $urlParts * @return bool|string */ private static function determineOrigin(array $configuredDomains, $guessedDomain, array &$urlParts, $portNumber) { $guessedDomain = strtolower($guessedDomain); if (in_array($guessedDomain, $configuredDomains) || ($portNumber && in_array($guessedDomain.':'.$portNumber, $configuredDomains))) { if ($portNumber) { return $guessedDomain.':'.$portNumber; } return $guessedDomain; } if ($portNumber) { $guessedDomain .= ':'.$portNumber; } while (null !== ($part = array_shift($urlParts))) { $guessedDomain .= '/' . $part; if (in_array($guessedDomain, $configuredDomains) || ($portNumber && in_array(preg_replace('{:\d+}', '', $guessedDomain), $configuredDomains))) { return $guessedDomain; } } return false; } } composer/src/Composer/Repository/Vcs/VcsDriver.php 0000644 00000011536 14736103146 0016316 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository\Vcs; use Composer\Cache; use Composer\Downloader\TransportException; use Composer\Config; use Composer\Factory; use Composer\IO\IOInterface; use Composer\Json\JsonFile; use Composer\Util\ProcessExecutor; use Composer\Util\RemoteFilesystem; use Composer\Util\Filesystem; /** * A driver implementation for driver with authentication interaction. * * @author François Pluchino <francois.pluchino@opendisplay.com> */ abstract class VcsDriver implements VcsDriverInterface { /** @var string */ protected $url; /** @var string */ protected $originUrl; /** @var array */ protected $repoConfig; /** @var IOInterface */ protected $io; /** @var Config */ protected $config; /** @var ProcessExecutor */ protected $process; /** @var RemoteFilesystem */ protected $remoteFilesystem; /** @var array */ protected $infoCache = array(); /** @var Cache */ protected $cache; /** * Constructor. * * @param array $repoConfig The repository configuration * @param IOInterface $io The IO instance * @param Config $config The composer configuration * @param ProcessExecutor $process Process instance, injectable for mocking * @param RemoteFilesystem $remoteFilesystem Remote Filesystem, injectable for mocking */ final public function __construct(array $repoConfig, IOInterface $io, Config $config, ProcessExecutor $process = null, RemoteFilesystem $remoteFilesystem = null) { if (Filesystem::isLocalPath($repoConfig['url'])) { $repoConfig['url'] = Filesystem::getPlatformPath($repoConfig['url']); } $this->url = $repoConfig['url']; $this->originUrl = $repoConfig['url']; $this->repoConfig = $repoConfig; $this->io = $io; $this->config = $config; $this->process = $process ?: new ProcessExecutor($io); $this->remoteFilesystem = $remoteFilesystem ?: Factory::createRemoteFilesystem($this->io, $config); } /** * Returns whether or not the given $identifier should be cached or not. * * @param string $identifier * @return bool */ protected function shouldCache($identifier) { return $this->cache && preg_match('{[a-f0-9]{40}}i', $identifier); } /** * {@inheritdoc} */ public function getComposerInformation($identifier) { if (!isset($this->infoCache[$identifier])) { if ($this->shouldCache($identifier) && $res = $this->cache->read($identifier)) { return $this->infoCache[$identifier] = JsonFile::parseJson($res); } $composer = $this->getBaseComposerInformation($identifier); if ($this->shouldCache($identifier)) { $this->cache->write($identifier, json_encode($composer)); } $this->infoCache[$identifier] = $composer; } return $this->infoCache[$identifier]; } protected function getBaseComposerInformation($identifier) { $composerFileContent = $this->getFileContent('composer.json', $identifier); if (!$composerFileContent) { return null; } $composer = JsonFile::parseJson($composerFileContent, $identifier . ':composer.json'); if (empty($composer['time']) && $changeDate = $this->getChangeDate($identifier)) { $composer['time'] = $changeDate->format(DATE_RFC3339); } return $composer; } /** * {@inheritDoc} */ public function hasComposerFile($identifier) { try { return (bool) $this->getComposerInformation($identifier); } catch (TransportException $e) { } return false; } /** * Get the https or http protocol depending on SSL support. * * Call this only if you know that the server supports both. * * @return string The correct type of protocol */ protected function getScheme() { if (extension_loaded('openssl')) { return 'https'; } return 'http'; } /** * Get the remote content. * * @param string $url The URL of content * * @return mixed The result */ protected function getContents($url) { $options = isset($this->repoConfig['options']) ? $this->repoConfig['options'] : array(); return $this->remoteFilesystem->getContents($this->originUrl, $url, false, $options); } /** * {@inheritDoc} */ public function cleanup() { return; } } composer/src/Composer/Repository/Vcs/GitDriver.php 0000644 00000015272 14736103146 0016307 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository\Vcs; use Composer\Util\ProcessExecutor; use Composer\Util\Filesystem; use Composer\Util\Git as GitUtil; use Composer\IO\IOInterface; use Composer\Cache; use Composer\Config; /** * @author Jordi Boggiano <j.boggiano@seld.be> */ class GitDriver extends VcsDriver { protected $cache; protected $tags; protected $branches; protected $rootIdentifier; protected $repoDir; protected $infoCache = array(); /** * {@inheritDoc} */ public function initialize() { if (Filesystem::isLocalPath($this->url)) { $this->url = preg_replace('{[\\/]\.git/?$}', '', $this->url); $this->repoDir = $this->url; $cacheUrl = realpath($this->url); } else { if (!Cache::isUsable($this->config->get('cache-vcs-dir'))) { throw new \RuntimeException('GitDriver requires a usable cache directory, and it looks like you set it to be disabled'); } $this->repoDir = $this->config->get('cache-vcs-dir') . '/' . preg_replace('{[^a-z0-9.]}i', '-', $this->url) . '/'; GitUtil::cleanEnv(); $fs = new Filesystem(); $fs->ensureDirectoryExists(dirname($this->repoDir)); if (!is_writable(dirname($this->repoDir))) { throw new \RuntimeException('Can not clone '.$this->url.' to access package information. The "'.dirname($this->repoDir).'" directory is not writable by the current user.'); } if (preg_match('{^ssh://[^@]+@[^:]+:[^0-9]+}', $this->url)) { throw new \InvalidArgumentException('The source URL '.$this->url.' is invalid, ssh URLs should have a port number after ":".'."\n".'Use ssh://git@example.com:22/path or just git@example.com:path if you do not want to provide a password or custom port.'); } $gitUtil = new GitUtil($this->io, $this->config, $this->process, $fs); if (!$gitUtil->syncMirror($this->url, $this->repoDir)) { $this->io->writeError('<error>Failed to update '.$this->url.', package information from this repository may be outdated</error>'); } $cacheUrl = $this->url; } $this->getTags(); $this->getBranches(); $this->cache = new Cache($this->io, $this->config->get('cache-repo-dir').'/'.preg_replace('{[^a-z0-9.]}i', '-', $cacheUrl)); } /** * {@inheritDoc} */ public function getRootIdentifier() { if (null === $this->rootIdentifier) { $this->rootIdentifier = 'master'; // select currently checked out branch if master is not available $this->process->execute('git branch --no-color', $output, $this->repoDir); $branches = $this->process->splitLines($output); if (!in_array('* master', $branches)) { foreach ($branches as $branch) { if ($branch && preg_match('{^\* +(\S+)}', $branch, $match)) { $this->rootIdentifier = $match[1]; break; } } } } return $this->rootIdentifier; } /** * {@inheritDoc} */ public function getUrl() { return $this->url; } /** * {@inheritDoc} */ public function getSource($identifier) { return array('type' => 'git', 'url' => $this->getUrl(), 'reference' => $identifier); } /** * {@inheritDoc} */ public function getDist($identifier) { return null; } /** * {@inheritdoc} */ public function getFileContent($file, $identifier) { $resource = sprintf('%s:%s', ProcessExecutor::escape($identifier), ProcessExecutor::escape($file)); $this->process->execute(sprintf('git show %s', $resource), $content, $this->repoDir); if (!trim($content)) { return null; } return $content; } /** * {@inheritdoc} */ public function getChangeDate($identifier) { $this->process->execute(sprintf( 'git -c log.showSignature=false log -1 --format=%%at %s', ProcessExecutor::escape($identifier) ), $output, $this->repoDir); return new \DateTime('@'.trim($output), new \DateTimeZone('UTC')); } /** * {@inheritDoc} */ public function getTags() { if (null === $this->tags) { $this->tags = array(); $this->process->execute('git show-ref --tags --dereference', $output, $this->repoDir); foreach ($output = $this->process->splitLines($output) as $tag) { if ($tag && preg_match('{^([a-f0-9]{40}) refs/tags/(\S+?)(\^\{\})?$}', $tag, $match)) { $this->tags[$match[2]] = $match[1]; } } } return $this->tags; } /** * {@inheritDoc} */ public function getBranches() { if (null === $this->branches) { $branches = array(); $this->process->execute('git branch --no-color --no-abbrev -v', $output, $this->repoDir); foreach ($this->process->splitLines($output) as $branch) { if ($branch && !preg_match('{^ *[^/]+/HEAD }', $branch)) { if (preg_match('{^(?:\* )? *(\S+) *([a-f0-9]+)(?: .*)?$}', $branch, $match)) { $branches[$match[1]] = $match[2]; } } } $this->branches = $branches; } return $this->branches; } /** * {@inheritDoc} */ public static function supports(IOInterface $io, Config $config, $url, $deep = false) { if (preg_match('#(^git://|\.git/?$|git(?:olite)?@|//git\.|//github.com/)#i', $url)) { return true; } // local filesystem if (Filesystem::isLocalPath($url)) { $url = Filesystem::getPlatformPath($url); if (!is_dir($url)) { return false; } $process = new ProcessExecutor($io); // check whether there is a git repo in that path if ($process->execute('git tag', $output, $url) === 0) { return true; } } if (!$deep) { return false; } $process = new ProcessExecutor($io); return $process->execute('git ls-remote --heads ' . ProcessExecutor::escape($url), $output) === 0; } } composer/src/Composer/Repository/CompositeRepository.php 0000644 00000007564 14736103146 0017724 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository; use Composer\Package\PackageInterface; /** * Composite repository. * * @author Beau Simensen <beau@dflydev.com> */ class CompositeRepository extends BaseRepository { /** * List of repositories * @var array */ private $repositories; /** * Constructor * @param array $repositories */ public function __construct(array $repositories) { $this->repositories = array(); foreach ($repositories as $repo) { $this->addRepository($repo); } } /** * Returns all the wrapped repositories * * @return array */ public function getRepositories() { return $this->repositories; } /** * {@inheritdoc} */ public function hasPackage(PackageInterface $package) { foreach ($this->repositories as $repository) { /* @var $repository RepositoryInterface */ if ($repository->hasPackage($package)) { return true; } } return false; } /** * {@inheritdoc} */ public function findPackage($name, $constraint) { foreach ($this->repositories as $repository) { /* @var $repository RepositoryInterface */ $package = $repository->findPackage($name, $constraint); if (null !== $package) { return $package; } } return null; } /** * {@inheritdoc} */ public function findPackages($name, $constraint = null) { $packages = array(); foreach ($this->repositories as $repository) { /* @var $repository RepositoryInterface */ $packages[] = $repository->findPackages($name, $constraint); } return $packages ? call_user_func_array('array_merge', $packages) : array(); } /** * {@inheritdoc} */ public function search($query, $mode = 0, $type = null) { $matches = array(); foreach ($this->repositories as $repository) { /* @var $repository RepositoryInterface */ $matches[] = $repository->search($query, $mode, $type); } return $matches ? call_user_func_array('array_merge', $matches) : array(); } /** * {@inheritdoc} */ public function getPackages() { $packages = array(); foreach ($this->repositories as $repository) { /* @var $repository RepositoryInterface */ $packages[] = $repository->getPackages(); } return $packages ? call_user_func_array('array_merge', $packages) : array(); } /** * {@inheritdoc} */ public function removePackage(PackageInterface $package) { foreach ($this->repositories as $repository) { /* @var $repository RepositoryInterface */ $repository->removePackage($package); } } /** * {@inheritdoc} */ #[\ReturnTypeWillChange] public function count() { $total = 0; foreach ($this->repositories as $repository) { /* @var $repository RepositoryInterface */ $total += $repository->count(); } return $total; } /** * Add a repository. * @param RepositoryInterface $repository */ public function addRepository(RepositoryInterface $repository) { if ($repository instanceof self) { foreach ($repository->getRepositories() as $repo) { $this->addRepository($repo); } } else { $this->repositories[] = $repository; } } } composer/src/Composer/Repository/PearRepository.php 0000644 00000021047 14736103146 0016641 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository; use Composer\IO\IOInterface; use Composer\Semver\VersionParser as SemverVersionParser; use Composer\Package\Version\VersionParser; use Composer\Repository\Pear\ChannelReader; use Composer\Package\CompletePackage; use Composer\Repository\Pear\ChannelInfo; use Composer\EventDispatcher\EventDispatcher; use Composer\Package\Link; use Composer\Semver\Constraint\Constraint; use Composer\Util\RemoteFilesystem; use Composer\Config; use Composer\Factory; /** * Builds list of package from PEAR channel. * * Packages read from channel are named as 'pear-{channelName}/{packageName}' * and has aliased as 'pear-{channelAlias}/{packageName}' * * @author Benjamin Eberlei <kontakt@beberlei.de> * @author Jordi Boggiano <j.boggiano@seld.be> */ class PearRepository extends ArrayRepository implements ConfigurableRepositoryInterface { private $url; private $io; private $rfs; private $versionParser; private $repoConfig; /** @var string vendor makes additional alias for each channel as {prefix}/{packagename}. It allows smoother * package transition to composer-like repositories. */ private $vendorAlias; public function __construct(array $repoConfig, IOInterface $io, Config $config, EventDispatcher $dispatcher = null, RemoteFilesystem $rfs = null) { parent::__construct(); if (!preg_match('{^https?://}', $repoConfig['url'])) { $repoConfig['url'] = 'http://'.$repoConfig['url']; } $urlBits = parse_url($repoConfig['url']); if (empty($urlBits['scheme']) || empty($urlBits['host'])) { throw new \UnexpectedValueException('Invalid url given for PEAR repository: '.$repoConfig['url']); } $this->url = rtrim($repoConfig['url'], '/'); $this->io = $io; $this->rfs = $rfs ?: Factory::createRemoteFilesystem($this->io, $config); $this->vendorAlias = isset($repoConfig['vendor-alias']) ? $repoConfig['vendor-alias'] : null; $this->versionParser = new VersionParser(); $this->repoConfig = $repoConfig; } public function getRepoConfig() { return $this->repoConfig; } protected function initialize() { parent::initialize(); $this->io->writeError('Initializing PEAR repository '.$this->url); $reader = new ChannelReader($this->rfs); try { $channelInfo = $reader->read($this->url); } catch (\Exception $e) { $this->io->writeError('<warning>PEAR repository from '.$this->url.' could not be loaded. '.$e->getMessage().'</warning>'); return; } $packages = $this->buildComposerPackages($channelInfo, $this->versionParser); foreach ($packages as $package) { $this->addPackage($package); } } /** * Builds CompletePackages from PEAR package definition data. * * @param ChannelInfo $channelInfo * @param SemverVersionParser $versionParser * @return CompletePackage */ private function buildComposerPackages(ChannelInfo $channelInfo, SemverVersionParser $versionParser) { $result = array(); foreach ($channelInfo->getPackages() as $packageDefinition) { foreach ($packageDefinition->getReleases() as $version => $releaseInfo) { try { $normalizedVersion = $versionParser->normalize($version); } catch (\UnexpectedValueException $e) { $this->io->writeError('Could not load '.$packageDefinition->getPackageName().' '.$version.': '.$e->getMessage(), true, IOInterface::VERBOSE); continue; } $composerPackageName = $this->buildComposerPackageName($packageDefinition->getChannelName(), $packageDefinition->getPackageName()); // distribution url must be read from /r/{packageName}/{version}.xml::/r/g:text() // but this location is 'de-facto' standard $urlBits = parse_url($this->url); $scheme = (isset($urlBits['scheme']) && 'https' === $urlBits['scheme'] && extension_loaded('openssl')) ? 'https' : 'http'; $distUrl = "{$scheme}://{$packageDefinition->getChannelName()}/get/{$packageDefinition->getPackageName()}-{$version}.tgz"; $requires = array(); $suggests = array(); $conflicts = array(); $replaces = array(); // alias package only when its channel matches repository channel, // cause we've know only repository channel alias if ($channelInfo->getName() == $packageDefinition->getChannelName()) { $composerPackageAlias = $this->buildComposerPackageName($channelInfo->getAlias(), $packageDefinition->getPackageName()); $aliasConstraint = new Constraint('==', $normalizedVersion); $replaces[] = new Link($composerPackageName, $composerPackageAlias, $aliasConstraint, 'replaces', (string) $aliasConstraint); } // alias package with user-specified prefix. it makes private pear channels looks like composer's. if (!empty($this->vendorAlias) && ($this->vendorAlias != 'pear-'.$channelInfo->getAlias() || $channelInfo->getName() != $packageDefinition->getChannelName()) ) { $composerPackageAlias = "{$this->vendorAlias}/{$packageDefinition->getPackageName()}"; $aliasConstraint = new Constraint('==', $normalizedVersion); $replaces[] = new Link($composerPackageName, $composerPackageAlias, $aliasConstraint, 'replaces', (string) $aliasConstraint); } foreach ($releaseInfo->getDependencyInfo()->getRequires() as $dependencyConstraint) { $dependencyPackageName = $this->buildComposerPackageName($dependencyConstraint->getChannelName(), $dependencyConstraint->getPackageName()); $constraint = $versionParser->parseConstraints($dependencyConstraint->getConstraint()); $link = new Link($composerPackageName, $dependencyPackageName, $constraint, $dependencyConstraint->getType(), $dependencyConstraint->getConstraint()); switch ($dependencyConstraint->getType()) { case 'required': $requires[] = $link; break; case 'conflicts': $conflicts[] = $link; break; case 'replaces': $replaces[] = $link; break; } } foreach ($releaseInfo->getDependencyInfo()->getOptionals() as $group => $dependencyConstraints) { foreach ($dependencyConstraints as $dependencyConstraint) { $dependencyPackageName = $this->buildComposerPackageName($dependencyConstraint->getChannelName(), $dependencyConstraint->getPackageName()); $suggests[$group.'-'.$dependencyPackageName] = $dependencyConstraint->getConstraint(); } } $package = new CompletePackage($composerPackageName, $normalizedVersion, $version); $package->setType('pear-library'); $package->setDescription($packageDefinition->getDescription()); $package->setLicense(array($packageDefinition->getLicense())); $package->setDistType('file'); $package->setDistUrl($distUrl); $package->setAutoload(array('classmap' => array(''))); $package->setIncludePaths(array('/')); $package->setRequires($requires); $package->setConflicts($conflicts); $package->setSuggests($suggests); $package->setReplaces($replaces); $result[] = $package; } } return $result; } private function buildComposerPackageName($channelName, $packageName) { if ('php' === $channelName) { return "php"; } if ('ext' === $channelName) { return "ext-{$packageName}"; } return "pear-{$channelName}/{$packageName}"; } } composer/src/Composer/Repository/InstalledArrayRepository.php 0000644 00000001110 14736103146 0020655 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository; /** * Installed array repository. * * This is used for serving the RootPackage inside an in-memory InstalledRepository * * @author Jordi Boggiano <j.boggiano@seld.be> */ class InstalledArrayRepository extends WritableArrayRepository implements InstalledRepositoryInterface { } composer/src/Composer/Repository/ArtifactRepository.php 0000644 00000006150 14736103146 0017505 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository; use Composer\IO\IOInterface; use Composer\Json\JsonFile; use Composer\Package\Loader\ArrayLoader; use Composer\Package\Loader\LoaderInterface; use Composer\Util\Zip; /** * @author Serge Smertin <serg.smertin@gmail.com> */ class ArtifactRepository extends ArrayRepository implements ConfigurableRepositoryInterface { /** @var LoaderInterface */ protected $loader; protected $lookup; protected $repoConfig; private $io; public function __construct(array $repoConfig, IOInterface $io) { parent::__construct(); if (!extension_loaded('zip')) { throw new \RuntimeException('The artifact repository requires PHP\'s zip extension'); } $this->loader = new ArrayLoader(); $this->lookup = $repoConfig['url']; $this->io = $io; $this->repoConfig = $repoConfig; } public function getRepoConfig() { return $this->repoConfig; } protected function initialize() { parent::initialize(); $this->scanDirectory($this->lookup); } private function scanDirectory($path) { $io = $this->io; $directory = new \RecursiveDirectoryIterator($path, \RecursiveDirectoryIterator::FOLLOW_SYMLINKS); $iterator = new \RecursiveIteratorIterator($directory); $regex = new \RegexIterator($iterator, '/^.+\.(zip|phar)$/i'); foreach ($regex as $file) { /* @var $file \SplFileInfo */ if (!$file->isFile()) { continue; } $package = $this->getComposerInformation($file); if (!$package) { $io->writeError("File <comment>{$file->getBasename()}</comment> doesn't seem to hold a package", true, IOInterface::VERBOSE); continue; } $template = 'Found package <info>%s</info> (<comment>%s</comment>) in file <info>%s</info>'; $io->writeError(sprintf($template, $package->getName(), $package->getPrettyVersion(), $file->getBasename()), true, IOInterface::VERBOSE); $this->addPackage($package); } } private function getComposerInformation(\SplFileInfo $file) { $json = Zip::getComposerJson($file->getPathname()); if (null === $json) { return false; } $package = JsonFile::parseJson($json, $file->getPathname().'#composer.json'); $package['dist'] = array( 'type' => 'zip', 'url' => strtr($file->getPathname(), '\\', '/'), 'shasum' => sha1_file($file->getRealPath()), ); try { $package = $this->loader->load($package); } catch (\UnexpectedValueException $e) { throw new \UnexpectedValueException('Failed loading package in '.$file.': '.$e->getMessage(), 0, $e); } return $package; } } composer/src/Composer/Repository/WritableArrayRepository.php 0000644 00000002760 14736103146 0020523 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository; use Composer\Package\AliasPackage; /** * Writable array repository. * * @author Jordi Boggiano <j.boggiano@seld.be> */ class WritableArrayRepository extends ArrayRepository implements WritableRepositoryInterface { /** * {@inheritDoc} */ public function write() { } /** * {@inheritDoc} */ public function reload() { } /** * {@inheritDoc} */ public function getCanonicalPackages() { $packages = $this->getPackages(); // get at most one package of each name, preferring non-aliased ones $packagesByName = array(); foreach ($packages as $package) { if (!isset($packagesByName[$package->getName()]) || $packagesByName[$package->getName()] instanceof AliasPackage) { $packagesByName[$package->getName()] = $package; } } $canonicalPackages = array(); // unfold aliased packages foreach ($packagesByName as $package) { while ($package instanceof AliasPackage) { $package = $package->getAliasOf(); } $canonicalPackages[] = $package; } return $canonicalPackages; } } composer/src/Composer/Repository/RepositoryManager.php 0000644 00000013702 14736103146 0017323 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository; use Composer\IO\IOInterface; use Composer\Config; use Composer\EventDispatcher\EventDispatcher; use Composer\Package\PackageInterface; use Composer\Util\RemoteFilesystem; /** * Repositories manager. * * @author Jordi Boggiano <j.boggiano@seld.be> * @author Konstantin Kudryashov <ever.zet@gmail.com> * @author François Pluchino <francois.pluchino@opendisplay.com> */ class RepositoryManager { private $localRepository; private $repositories = array(); private $repositoryClasses = array(); private $io; private $config; private $eventDispatcher; private $rfs; public function __construct(IOInterface $io, Config $config, EventDispatcher $eventDispatcher = null, RemoteFilesystem $rfs = null) { $this->io = $io; $this->config = $config; $this->eventDispatcher = $eventDispatcher; $this->rfs = $rfs; } /** * Searches for a package by it's name and version in managed repositories. * * @param string $name package name * @param string|\Composer\Semver\Constraint\ConstraintInterface $constraint package version or version constraint to match against * * @return PackageInterface|null */ public function findPackage($name, $constraint) { foreach ($this->repositories as $repository) { /** @var RepositoryInterface $repository */ if ($package = $repository->findPackage($name, $constraint)) { return $package; } } return null; } /** * Searches for all packages matching a name and optionally a version in managed repositories. * * @param string $name package name * @param string|\Composer\Semver\Constraint\ConstraintInterface $constraint package version or version constraint to match against * * @return PackageInterface[] */ public function findPackages($name, $constraint) { $packages = array(); foreach ($this->getRepositories() as $repository) { $packages = array_merge($packages, $repository->findPackages($name, $constraint)); } return $packages; } /** * Adds repository * * @param RepositoryInterface $repository repository instance */ public function addRepository(RepositoryInterface $repository) { $this->repositories[] = $repository; } /** * Adds a repository to the beginning of the chain * * This is useful when injecting additional repositories that should trump Packagist, e.g. from a plugin. * * @param RepositoryInterface $repository repository instance */ public function prependRepository(RepositoryInterface $repository) { array_unshift($this->repositories, $repository); } /** * Returns a new repository for a specific installation type. * * @param string $type repository type * @param array $config repository configuration * @param string $name repository name * @throws \InvalidArgumentException if repository for provided type is not registered * @return RepositoryInterface */ public function createRepository($type, $config, $name = null) { if (!isset($this->repositoryClasses[$type])) { throw new \InvalidArgumentException('Repository type is not registered: '.$type); } if (isset($config['packagist']) && false === $config['packagist']) { $this->io->writeError('<warning>Repository "'.$name.'" ('.json_encode($config).') has a packagist key which should be in its own repository definition</warning>'); } $class = $this->repositoryClasses[$type]; $reflMethod = new \ReflectionMethod($class, '__construct'); $params = $reflMethod->getParameters(); if (isset($params[4])) { $paramType = null; if (\PHP_VERSION_ID >= 70000) { $reflectionType = $params[4]->getType(); if ($reflectionType) { $paramType = $reflectionType instanceof \ReflectionNamedType ? $reflectionType->getName() : (string)$reflectionType; } } else { $paramType = $params[4]->getClass() ? $params[4]->getClass()->getName() : null; } if ($paramType === 'Composer\Util\RemoteFilesystem') { return new $class($config, $this->io, $this->config, $this->eventDispatcher, $this->rfs); } } return new $class($config, $this->io, $this->config, $this->eventDispatcher); } /** * Stores repository class for a specific installation type. * * @param string $type installation type * @param string $class class name of the repo implementation */ public function setRepositoryClass($type, $class) { $this->repositoryClasses[$type] = $class; } /** * Returns all repositories, except local one. * * @return RepositoryInterface[] */ public function getRepositories() { return $this->repositories; } /** * Sets local repository for the project. * * @param WritableRepositoryInterface $repository repository instance */ public function setLocalRepository(WritableRepositoryInterface $repository) { $this->localRepository = $repository; } /** * Returns local repository for the project. * * @return WritableRepositoryInterface */ public function getLocalRepository() { return $this->localRepository; } } composer/src/Composer/Repository/FilesystemRepository.php 0000644 00000004636 14736103146 0020103 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Repository; use Composer\Json\JsonFile; use Composer\Package\Loader\ArrayLoader; use Composer\Package\Dumper\ArrayDumper; /** * Filesystem repository. * * @author Konstantin Kudryashov <ever.zet@gmail.com> * @author Jordi Boggiano <j.boggiano@seld.be> */ class FilesystemRepository extends WritableArrayRepository { private $file; /** * Initializes filesystem repository. * * @param JsonFile $repositoryFile repository json file */ public function __construct(JsonFile $repositoryFile) { parent::__construct(); $this->file = $repositoryFile; } /** * Initializes repository (reads file, or remote address). */ protected function initialize() { parent::initialize(); if (!$this->file->exists()) { return; } try { $packages = $this->file->read(); // forward compatibility for composer v2 installed.json if (isset($packages['packages'])) { $packages = $packages['packages']; } if (!is_array($packages)) { throw new \UnexpectedValueException('Could not parse package list from the repository'); } } catch (\Exception $e) { throw new InvalidRepositoryException('Invalid repository data in '.$this->file->getPath().', packages could not be loaded: ['.get_class($e).'] '.$e->getMessage()); } $loader = new ArrayLoader(null, true); foreach ($packages as $packageData) { $package = $loader->load($packageData); $this->addPackage($package); } } public function reload() { $this->packages = null; $this->initialize(); } /** * Writes writable repository. */ public function write() { $data = array(); $dumper = new ArrayDumper(); foreach ($this->getCanonicalPackages() as $package) { $data[] = $dumper->dump($package); } usort($data, function ($a, $b) { return strcmp($a['name'], $b['name']); }); $this->file->write($data); } } composer/src/Composer/Config.php 0000644 00000040330 14736103146 0012674 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer; use Composer\Config\ConfigSourceInterface; use Composer\Downloader\TransportException; use Composer\IO\IOInterface; use Composer\Util\Platform; use Composer\Util\ProcessExecutor; /** * @author Jordi Boggiano <j.boggiano@seld.be> */ class Config { const RELATIVE_PATHS = 1; public static $defaultConfig = array( 'process-timeout' => 300, 'use-include-path' => false, 'preferred-install' => 'auto', 'notify-on-install' => true, 'github-protocols' => array('https', 'ssh', 'git'), 'vendor-dir' => 'vendor', 'bin-dir' => '{$vendor-dir}/bin', 'cache-dir' => '{$home}/cache', 'data-dir' => '{$home}', 'cache-files-dir' => '{$cache-dir}/files', 'cache-repo-dir' => '{$cache-dir}/repo', 'cache-vcs-dir' => '{$cache-dir}/vcs', 'cache-ttl' => 15552000, // 6 months 'cache-files-ttl' => null, // fallback to cache-ttl 'cache-files-maxsize' => '300MiB', 'bin-compat' => 'auto', 'discard-changes' => false, 'autoloader-suffix' => null, 'sort-packages' => false, 'optimize-autoloader' => false, 'classmap-authoritative' => false, 'apcu-autoloader' => false, 'prepend-autoloader' => true, 'github-domains' => array('github.com'), 'bitbucket-expose-hostname' => true, 'disable-tls' => false, 'secure-http' => true, 'cafile' => null, 'capath' => null, 'github-expose-hostname' => true, 'gitlab-domains' => array('gitlab.com'), 'store-auths' => 'prompt', 'platform' => array(), 'archive-format' => 'tar', 'archive-dir' => '.', 'htaccess-protect' => true, 'use-github-api' => true, 'lock' => true, // valid keys without defaults (auth config stuff): // bitbucket-oauth // github-oauth // gitlab-oauth // gitlab-token // http-basic // bearer ); public static $defaultRepositories = array( 'packagist.org' => array( 'type' => 'composer', 'url' => 'https?://repo.packagist.org', 'allow_ssl_downgrade' => true, ), ); private $config; private $baseDir; private $repositories; /** @var ConfigSourceInterface */ private $configSource; /** @var ConfigSourceInterface */ private $authConfigSource; private $useEnvironment; private $warnedHosts = array(); /** * @param bool $useEnvironment Use COMPOSER_ environment variables to replace config settings * @param string $baseDir Optional base directory of the config */ public function __construct($useEnvironment = true, $baseDir = null) { // load defaults $this->config = static::$defaultConfig; $this->repositories = static::$defaultRepositories; $this->useEnvironment = (bool) $useEnvironment; $this->baseDir = $baseDir; } public function setConfigSource(ConfigSourceInterface $source) { $this->configSource = $source; } public function getConfigSource() { return $this->configSource; } public function setAuthConfigSource(ConfigSourceInterface $source) { $this->authConfigSource = $source; } public function getAuthConfigSource() { return $this->authConfigSource; } /** * Merges new config values with the existing ones (overriding) * * @param array $config */ public function merge($config) { // override defaults with given config if (!empty($config['config']) && is_array($config['config'])) { foreach ($config['config'] as $key => $val) { if (in_array($key, array('bitbucket-oauth', 'github-oauth', 'gitlab-oauth', 'gitlab-token', 'http-basic', 'bearer')) && isset($this->config[$key])) { $this->config[$key] = array_merge($this->config[$key], $val); } elseif ('preferred-install' === $key && isset($this->config[$key])) { if (is_array($val) || is_array($this->config[$key])) { if (is_string($val)) { $val = array('*' => $val); } if (is_string($this->config[$key])) { $this->config[$key] = array('*' => $this->config[$key]); } $this->config[$key] = array_merge($this->config[$key], $val); // the full match pattern needs to be last if (isset($this->config[$key]['*'])) { $wildcard = $this->config[$key]['*']; unset($this->config[$key]['*']); $this->config[$key]['*'] = $wildcard; } } else { $this->config[$key] = $val; } } else { $this->config[$key] = $val; } } } if (!empty($config['repositories']) && is_array($config['repositories'])) { $this->repositories = array_reverse($this->repositories, true); $newRepos = array_reverse($config['repositories'], true); foreach ($newRepos as $name => $repository) { // disable a repository by name if (false === $repository) { $this->disableRepoByName($name); continue; } // disable a repository with an anonymous {"name": false} repo if (is_array($repository) && 1 === count($repository) && false === current($repository)) { $this->disableRepoByName(key($repository)); continue; } // store repo if (is_int($name)) { $this->repositories[] = $repository; } else { if ($name === 'packagist') { // BC support for default "packagist" named repo $this->repositories[$name . '.org'] = $repository; } else { $this->repositories[$name] = $repository; } } } $this->repositories = array_reverse($this->repositories, true); } } /** * @return array */ public function getRepositories() { return $this->repositories; } /** * Returns a setting * * @param string $key * @param int $flags Options (see class constants) * @throws \RuntimeException * @return mixed */ public function get($key, $flags = 0) { switch ($key) { case 'vendor-dir': case 'bin-dir': case 'process-timeout': case 'data-dir': case 'cache-dir': case 'cache-files-dir': case 'cache-repo-dir': case 'cache-vcs-dir': case 'cafile': case 'capath': // convert foo-bar to COMPOSER_FOO_BAR and check if it exists since it overrides the local config $env = 'COMPOSER_' . strtoupper(strtr($key, '-', '_')); $val = $this->getComposerEnv($env); $val = rtrim((string) $this->process(false !== $val ? $val : $this->config[$key], $flags), '/\\'); $val = Platform::expandPath($val); if (substr($key, -4) !== '-dir') { return $val; } return (($flags & self::RELATIVE_PATHS) == self::RELATIVE_PATHS) ? $val : $this->realpath($val); case 'htaccess-protect': $value = $this->getComposerEnv('COMPOSER_HTACCESS_PROTECT'); if (false === $value) { $value = $this->config[$key]; } return $value !== 'false' && (bool) $value; case 'cache-ttl': return (int) $this->config[$key]; case 'cache-files-maxsize': if (!preg_match('/^\s*([0-9.]+)\s*(?:([kmg])(?:i?b)?)?\s*$/i', $this->config[$key], $matches)) { throw new \RuntimeException( "Could not parse the value of 'cache-files-maxsize': {$this->config[$key]}" ); } $size = $matches[1]; if (isset($matches[2])) { switch (strtolower($matches[2])) { case 'g': $size *= 1024; // intentional fallthrough // no break case 'm': $size *= 1024; // intentional fallthrough // no break case 'k': $size *= 1024; break; } } return $size; case 'cache-files-ttl': if (isset($this->config[$key])) { return (int) $this->config[$key]; } return (int) $this->config['cache-ttl']; case 'home': $val = preg_replace('#^(\$HOME|~)(/|$)#', rtrim(getenv('HOME') ?: getenv('USERPROFILE'), '/\\') . '/', $this->config[$key]); return rtrim($this->process($val, $flags), '/\\'); case 'bin-compat': $value = $this->getComposerEnv('COMPOSER_BIN_COMPAT') ?: $this->config[$key]; if (!in_array($value, array('auto', 'full'))) { throw new \RuntimeException( "Invalid value for 'bin-compat': {$value}. Expected auto, full" ); } return $value; case 'discard-changes': if ($env = $this->getComposerEnv('COMPOSER_DISCARD_CHANGES')) { if (!in_array($env, array('stash', 'true', 'false', '1', '0'), true)) { throw new \RuntimeException( "Invalid value for COMPOSER_DISCARD_CHANGES: {$env}. Expected 1, 0, true, false or stash" ); } if ('stash' === $env) { return 'stash'; } // convert string value to bool return $env !== 'false' && (bool) $env; } if (!in_array($this->config[$key], array(true, false, 'stash'), true)) { throw new \RuntimeException( "Invalid value for 'discard-changes': {$this->config[$key]}. Expected true, false or stash" ); } return $this->config[$key]; case 'github-protocols': $protos = $this->config['github-protocols']; if ($this->config['secure-http'] && false !== ($index = array_search('git', $protos))) { unset($protos[$index]); } if (reset($protos) === 'http') { throw new \RuntimeException('The http protocol for github is not available anymore, update your config\'s github-protocols to use "https", "git" or "ssh"'); } return $protos; case 'disable-tls': return $this->config[$key] !== 'false' && (bool) $this->config[$key]; case 'secure-http': return $this->config[$key] !== 'false' && (bool) $this->config[$key]; case 'use-github-api': return $this->config[$key] !== 'false' && (bool) $this->config[$key]; case 'lock': return $this->config[$key] !== 'false' && (bool) $this->config[$key]; default: if (!isset($this->config[$key])) { return null; } return $this->process($this->config[$key], $flags); } } public function all($flags = 0) { $all = array( 'repositories' => $this->getRepositories(), ); foreach (array_keys($this->config) as $key) { $all['config'][$key] = $this->get($key, $flags); } return $all; } public function raw() { return array( 'repositories' => $this->getRepositories(), 'config' => $this->config, ); } /** * Checks whether a setting exists * * @param string $key * @return bool */ public function has($key) { return array_key_exists($key, $this->config); } /** * Replaces {$refs} inside a config string * * @param string|int|null $value a config string that can contain {$refs-to-other-config} * @param int $flags Options (see class constants) * @return string|int|null */ private function process($value, $flags) { $config = $this; if (!is_string($value)) { return $value; } return preg_replace_callback('#\{\$(.+)\}#', function ($match) use ($config, $flags) { return $config->get($match[1], $flags); }, $value); } /** * Turns relative paths in absolute paths without realpath() * * Since the dirs might not exist yet we can not call realpath or it will fail. * * @param string $path * @return string */ private function realpath($path) { if (preg_match('{^(?:/|[a-z]:|[a-z0-9.]+://)}i', $path)) { return $path; } return $this->baseDir . '/' . $path; } /** * Reads the value of a Composer environment variable * * This should be used to read COMPOSER_ environment variables * that overload config values. * * @param string $var * @return string|bool */ private function getComposerEnv($var) { if ($this->useEnvironment) { return getenv($var); } return false; } private function disableRepoByName($name) { if (isset($this->repositories[$name])) { unset($this->repositories[$name]); } elseif ($name === 'packagist') { // BC support for default "packagist" named repo unset($this->repositories['packagist.org']); } } /** * Validates that the passed URL is allowed to be used by current config, or throws an exception. * * @param string $url * @param IOInterface $io */ public function prohibitUrlByConfig($url, IOInterface $io = null) { // Return right away if the URL is malformed or custom (see issue #5173) if (false === filter_var($url, FILTER_VALIDATE_URL)) { return; } // Extract scheme and throw exception on known insecure protocols $scheme = parse_url($url, PHP_URL_SCHEME); if (in_array($scheme, array('http', 'git', 'ftp', 'svn'))) { if ($this->get('secure-http')) { throw new TransportException("Your configuration does not allow connections to $url. See https://getcomposer.org/doc/06-config.md#secure-http for details."); } elseif ($io) { $host = parse_url($url, PHP_URL_HOST); if (!isset($this->warnedHosts[$host])) { $io->writeError("<warning>Warning: Accessing $host over $scheme which is an insecure protocol.</warning>"); } $this->warnedHosts[$host] = true; } } } /** * Used by long-running custom scripts in composer.json * * "scripts": { * "watch": [ * "Composer\\Config::disableProcessTimeout", * "vendor/bin/long-running-script --watch" * ] * } */ public static function disableProcessTimeout() { // Override global timeout set earlier by environment or config ProcessExecutor::setTimeout(0); } } composer/src/Composer/Exception/NoSslException.php 0000644 00000000626 14736103146 0016346 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Exception; /** * @author Jordi Boggiano <j.boggiano@seld.be> */ class NoSslException extends \RuntimeException { } composer/src/Composer/Plugin/Capable.php 0000644 00000002233 14736103146 0014254 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Plugin; /** * Plugins which need to expose various implementations * of the Composer Plugin Capabilities must have their * declared Plugin class implementing this interface. * * @api */ interface Capable { /** * Method by which a Plugin announces its API implementations, through an array * with a special structure. * * The key must be a string, representing a fully qualified class/interface name * which Composer Plugin API exposes. * The value must be a string as well, representing the fully qualified class name * of the implementing class. * * @tutorial * * return array( * 'Composer\Plugin\Capability\CommandProvider' => 'My\CommandProvider', * 'Composer\Plugin\Capability\Validator' => 'My\Validator', * ); * * @return string[] */ public function getCapabilities(); } composer/src/Composer/Plugin/PluginEvents.php 0000644 00000002650 14736103146 0015353 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Plugin; /** * The Plugin Events. * * @author Nils Adermann <naderman@naderman.de> */ class PluginEvents { /** * The INIT event occurs after a Composer instance is done being initialized * * The event listener method receives a * Composer\EventDispatcher\Event instance. * * @var string */ const INIT = 'init'; /** * The COMMAND event occurs as a command begins * * The event listener method receives a * Composer\Plugin\CommandEvent instance. * * @var string */ const COMMAND = 'command'; /** * The PRE_FILE_DOWNLOAD event occurs before downloading a file * * The event listener method receives a * Composer\Plugin\PreFileDownloadEvent instance. * * @var string */ const PRE_FILE_DOWNLOAD = 'pre-file-download'; /** * The PRE_COMMAND_RUN event occurs before a command is executed and lets you modify the input arguments/options * * The event listener method receives a * Composer\Plugin\PreCommandRunEvent instance. * * @var string */ const PRE_COMMAND_RUN = 'pre-command-run'; } composer/src/Composer/Plugin/CommandEvent.php 0000644 00000003655 14736103146 0015316 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Plugin; use Composer\EventDispatcher\Event; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; /** * An event for all commands. * * @author Nils Adermann <naderman@naderman.de> */ class CommandEvent extends Event { /** * @var string */ private $commandName; /** * @var InputInterface */ private $input; /** * @var OutputInterface */ private $output; /** * Constructor. * * @param string $name The event name * @param string $commandName The command name * @param InputInterface $input * @param OutputInterface $output * @param array $args Arguments passed by the user * @param array $flags Optional flags to pass data not as argument */ public function __construct($name, $commandName, $input, $output, array $args = array(), array $flags = array()) { parent::__construct($name, $args, $flags); $this->commandName = $commandName; $this->input = $input; $this->output = $output; } /** * Returns the command input interface * * @return InputInterface */ public function getInput() { return $this->input; } /** * Retrieves the command output interface * * @return OutputInterface */ public function getOutput() { return $this->output; } /** * Retrieves the name of the command being run * * @return string */ public function getCommandName() { return $this->commandName; } } composer/src/Composer/Plugin/PluginManager.php 0000644 00000037235 14736103146 0015470 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Plugin; use Composer\Composer; use Composer\EventDispatcher\EventSubscriberInterface; use Composer\IO\IOInterface; use Composer\Package\CompletePackage; use Composer\Package\Package; use Composer\Package\Version\VersionParser; use Composer\Repository\RepositoryInterface; use Composer\Package\PackageInterface; use Composer\Package\Link; use Composer\Semver\Constraint\Constraint; use Composer\DependencyResolver\Pool; use Composer\Plugin\Capability\Capability; use Composer\Util\PackageSorter; /** * Plugin manager * * @author Nils Adermann <naderman@naderman.de> * @author Jordi Boggiano <j.boggiano@seld.be> */ class PluginManager { protected $composer; protected $io; protected $globalComposer; protected $versionParser; protected $disablePlugins = false; protected $plugins = array(); protected $registeredPlugins = array(); private static $classCounter = 0; /** * Initializes plugin manager * * @param IOInterface $io * @param Composer $composer * @param Composer $globalComposer * @param bool $disablePlugins */ public function __construct(IOInterface $io, Composer $composer, Composer $globalComposer = null, $disablePlugins = false) { $this->io = $io; $this->composer = $composer; $this->globalComposer = $globalComposer; $this->versionParser = new VersionParser(); $this->disablePlugins = $disablePlugins; } /** * Loads all plugins from currently installed plugin packages */ public function loadInstalledPlugins() { if ($this->disablePlugins) { return; } $repo = $this->composer->getRepositoryManager()->getLocalRepository(); $globalRepo = $this->globalComposer ? $this->globalComposer->getRepositoryManager()->getLocalRepository() : null; if ($repo) { $this->loadRepository($repo); } if ($globalRepo) { $this->loadRepository($globalRepo); } } /** * Gets all currently active plugin instances * * @return array plugins */ public function getPlugins() { return $this->plugins; } /** * Gets global composer or null when main composer is not fully loaded * * @return Composer|null */ public function getGlobalComposer() { return $this->globalComposer; } /** * Register a plugin package, activate it etc. * * If it's of type composer-installer it is registered as an installer * instead for BC * * @param PackageInterface $package * @param bool $failOnMissingClasses By default this silently skips plugins that can not be found, but if set to true it fails with an exception * * @throws \UnexpectedValueException */ public function registerPackage(PackageInterface $package, $failOnMissingClasses = false) { if ($this->disablePlugins) { return; } if ($package->getType() === 'composer-plugin') { $requiresComposer = null; foreach ($package->getRequires() as $link) { /** @var Link $link */ if ('composer-plugin-api' === $link->getTarget()) { $requiresComposer = $link->getConstraint(); break; } } if (!$requiresComposer) { throw new \RuntimeException("Plugin ".$package->getName()." is missing a require statement for a version of the composer-plugin-api package."); } $currentPluginApiVersion = $this->getPluginApiVersion(); $currentPluginApiConstraint = new Constraint('==', $this->versionParser->normalize($currentPluginApiVersion)); if ($requiresComposer->getPrettyString() === '1.0.0' && $this->getPluginApiVersion() === '1.0.0') { $this->io->writeError('<warning>The "' . $package->getName() . '" plugin requires composer-plugin-api 1.0.0, this *WILL* break in the future and it should be fixed ASAP (require ^1.0 for example).</warning>'); } elseif (!$requiresComposer->matches($currentPluginApiConstraint)) { $this->io->writeError('<warning>The "' . $package->getName() . '" plugin was skipped because it requires a Plugin API version ("' . $requiresComposer->getPrettyString() . '") that does not match your Composer installation ("' . $currentPluginApiVersion . '"). You may need to run composer update with the "--no-plugins" option.</warning>'); return; } } $oldInstallerPlugin = ($package->getType() === 'composer-installer'); if (in_array($package->getName(), $this->registeredPlugins)) { return; } $extra = $package->getExtra(); if (empty($extra['class'])) { throw new \UnexpectedValueException('Error while installing '.$package->getPrettyName().', composer-plugin packages should have a class defined in their extra key to be usable.'); } $classes = is_array($extra['class']) ? $extra['class'] : array($extra['class']); $localRepo = $this->composer->getRepositoryManager()->getLocalRepository(); $globalRepo = $this->globalComposer ? $this->globalComposer->getRepositoryManager()->getLocalRepository() : null; $pool = new Pool('dev'); $pool->addRepository($localRepo); if ($globalRepo) { $pool->addRepository($globalRepo); } $autoloadPackages = array($package->getName() => $package); $autoloadPackages = $this->collectDependencies($pool, $autoloadPackages, $package); $generator = $this->composer->getAutoloadGenerator(); $autoloads = array(); foreach ($autoloadPackages as $autoloadPackage) { $downloadPath = $this->getInstallPath($autoloadPackage, $globalRepo && $globalRepo->hasPackage($autoloadPackage)); $autoloads[] = array($autoloadPackage, $downloadPath); } $map = $generator->parseAutoloads($autoloads, new Package('dummy', '1.0.0.0', '1.0.0')); $classLoader = $generator->createLoader($map); $classLoader->register(); foreach ($classes as $class) { if (class_exists($class, false)) { $class = trim($class, '\\'); $path = $classLoader->findFile($class); $code = file_get_contents($path); $separatorPos = strrpos($class, '\\'); $className = $class; if ($separatorPos) { $className = substr($class, $separatorPos + 1); } $code = preg_replace('{^((?:final\s+)?(?:\s*))class\s+('.preg_quote($className).')}mi', '$1class $2_composer_tmp'.self::$classCounter, $code, 1); $code = str_replace('__FILE__', var_export($path, true), $code); $code = str_replace('__DIR__', var_export(dirname($path), true), $code); $code = str_replace('__CLASS__', var_export($class, true), $code); $code = preg_replace('/^\s*<\?(php)?/i', '', $code, 1); eval($code); $class .= '_composer_tmp'.self::$classCounter; self::$classCounter++; } if ($oldInstallerPlugin) { $installer = new $class($this->io, $this->composer); $this->composer->getInstallationManager()->addInstaller($installer); } elseif (class_exists($class)) { $plugin = new $class(); $this->addPlugin($plugin); $this->registeredPlugins[] = $package->getName(); } elseif ($failOnMissingClasses) { throw new \UnexpectedValueException('Plugin '.$package->getName().' could not be initialized, class not found: '.$class); } } } /** * Returns the version of the internal composer-plugin-api package. * * @return string */ protected function getPluginApiVersion() { return PluginInterface::PLUGIN_API_VERSION; } /** * Adds a plugin, activates it and registers it with the event dispatcher * * Ideally plugin packages should be registered via registerPackage, but if you use Composer * programmatically and want to register a plugin class directly this is a valid way * to do it. * * @param PluginInterface $plugin plugin instance */ public function addPlugin(PluginInterface $plugin) { $this->io->writeError('Loading plugin '.get_class($plugin), true, IOInterface::DEBUG); $this->plugins[] = $plugin; $plugin->activate($this->composer, $this->io); if ($plugin instanceof EventSubscriberInterface) { $this->composer->getEventDispatcher()->addSubscriber($plugin); } } /** * Load all plugins and installers from a repository * * Note that plugins in the specified repository that rely on events that * have fired prior to loading will be missed. This means you likely want to * call this method as early as possible. * * @param RepositoryInterface $repo Repository to scan for plugins to install * * @throws \RuntimeException */ private function loadRepository(RepositoryInterface $repo) { $packages = $repo->getPackages(); $sortedPackages = array_reverse(PackageSorter::sortPackages($packages)); foreach ($sortedPackages as $package) { if (!($package instanceof CompletePackage)) { continue; } if ('composer-plugin' === $package->getType()) { $this->registerPackage($package); // Backward compatibility } elseif ('composer-installer' === $package->getType()) { $this->registerPackage($package); } } } /** * Recursively generates a map of package names to packages for all deps * * @param Pool $pool Package pool of installed packages * @param array $collected Current state of the map for recursion * @param PackageInterface $package The package to analyze * * @return array Map of package names to packages */ private function collectDependencies(Pool $pool, array $collected, PackageInterface $package) { $requires = array_merge( $package->getRequires(), $package->getDevRequires() ); foreach ($requires as $requireLink) { $requiredPackage = $this->lookupInstalledPackage($pool, $requireLink); if ($requiredPackage && !isset($collected[$requiredPackage->getName()])) { $collected[$requiredPackage->getName()] = $requiredPackage; $collected = $this->collectDependencies($pool, $collected, $requiredPackage); } } return $collected; } /** * Resolves a package link to a package in the installed pool * * Since dependencies are already installed this should always find one. * * @param Pool $pool Pool of installed packages only * @param Link $link Package link to look up * * @return PackageInterface|null The found package */ private function lookupInstalledPackage(Pool $pool, Link $link) { $packages = $pool->whatProvides($link->getTarget(), $link->getConstraint()); return !empty($packages) ? $packages[0] : null; } /** * Retrieves the path a package is installed to. * * @param PackageInterface $package * @param bool $global Whether this is a global package * * @return string Install path */ private function getInstallPath(PackageInterface $package, $global = false) { if (!$global) { return $this->composer->getInstallationManager()->getInstallPath($package); } return $this->globalComposer->getInstallationManager()->getInstallPath($package); } /** * @param PluginInterface $plugin * @param string $capability * @throws \RuntimeException On empty or non-string implementation class name value * @return null|string The fully qualified class of the implementation or null if Plugin is not of Capable type or does not provide it */ protected function getCapabilityImplementationClassName(PluginInterface $plugin, $capability) { if (!($plugin instanceof Capable)) { return null; } $capabilities = (array) $plugin->getCapabilities(); if (!empty($capabilities[$capability]) && is_string($capabilities[$capability]) && trim($capabilities[$capability])) { return trim($capabilities[$capability]); } if ( array_key_exists($capability, $capabilities) && (empty($capabilities[$capability]) || !is_string($capabilities[$capability]) || !trim($capabilities[$capability])) ) { throw new \UnexpectedValueException('Plugin '.get_class($plugin).' provided invalid capability class name(s), got '.var_export($capabilities[$capability], 1)); } } /** * @param PluginInterface $plugin * @param string $capabilityClassName The fully qualified name of the API interface which the plugin may provide * an implementation of. * @param array $ctorArgs Arguments passed to Capability's constructor. * Keeping it an array will allow future values to be passed w\o changing the signature. * @return null|Capability */ public function getPluginCapability(PluginInterface $plugin, $capabilityClassName, array $ctorArgs = array()) { if ($capabilityClass = $this->getCapabilityImplementationClassName($plugin, $capabilityClassName)) { if (!class_exists($capabilityClass)) { throw new \RuntimeException("Cannot instantiate Capability, as class $capabilityClass from plugin ".get_class($plugin)." does not exist."); } $ctorArgs['plugin'] = $plugin; $capabilityObj = new $capabilityClass($ctorArgs); // FIXME these could use is_a and do the check *before* instantiating once drop support for php<5.3.9 if (!$capabilityObj instanceof Capability || !$capabilityObj instanceof $capabilityClassName) { throw new \RuntimeException( 'Class ' . $capabilityClass . ' must implement both Composer\Plugin\Capability\Capability and '. $capabilityClassName . '.' ); } return $capabilityObj; } } /** * @param string $capabilityClassName The fully qualified name of the API interface which the plugin may provide * an implementation of. * @param array $ctorArgs Arguments passed to Capability's constructor. * Keeping it an array will allow future values to be passed w\o changing the signature. * @return Capability[] */ public function getPluginCapabilities($capabilityClassName, array $ctorArgs = array()) { $capabilities = array(); foreach ($this->getPlugins() as $plugin) { if ($capability = $this->getPluginCapability($plugin, $capabilityClassName, $ctorArgs)) { $capabilities[] = $capability; } } return $capabilities; } } composer/src/Composer/Plugin/PreCommandRunEvent.php 0000644 00000002515 14736103146 0016444 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Plugin; use Composer\EventDispatcher\Event; use Symfony\Component\Console\Input\InputInterface; /** * The pre command run event. * * @author Jordi Boggiano <j.boggiano@seld.be> */ class PreCommandRunEvent extends Event { /** * @var InputInterface */ private $input; /** * @var string */ private $command; /** * Constructor. * * @param string $name The event name * @param InputInterface $input * @param string $command The command about to be executed */ public function __construct($name, InputInterface $input, $command) { parent::__construct($name); $this->input = $input; $this->command = $command; } /** * Returns the console input * * @return InputInterface */ public function getInput() { return $this->input; } /** * Returns the command about to be executed * * @return string */ public function getCommand() { return $this->command; } } composer/src/Composer/Plugin/Capability/CommandProvider.php 0000644 00000001537 14736103146 0020105 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Plugin\Capability; /** * Commands Provider Interface * * This capability will receive an array with 'composer' and 'io' keys as * constructor argument. Those contain Composer\Composer and Composer\IO\IOInterface * instances. It also contains a 'plugin' key containing the plugin instance that * created the capability. * * @author Jérémy Derussé <jeremy@derusse.com> */ interface CommandProvider extends Capability { /** * Retrieves an array of commands * * @return \Composer\Command\BaseCommand[] */ public function getCommands(); } composer/src/Composer/Plugin/Capability/Capability.php 0000644 00000000745 14736103146 0017075 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Plugin\Capability; /** * Marker interface for Plugin capabilities. * Every new Capability which is added to the Plugin API must implement this interface. * * @api */ interface Capability { } composer/src/Composer/Plugin/PluginInterface.php 0000644 00000001452 14736103146 0016006 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Plugin; use Composer\Composer; use Composer\IO\IOInterface; /** * Plugin interface * * @author Nils Adermann <naderman@naderman.de> */ interface PluginInterface { /** * Version number of the internal composer-plugin-api package * * @var string */ const PLUGIN_API_VERSION = '1.1.0'; /** * Apply plugin modifications to Composer * * @param Composer $composer * @param IOInterface $io */ public function activate(Composer $composer, IOInterface $io); } composer/src/Composer/Plugin/PreFileDownloadEvent.php 0000644 00000003067 14736103146 0016753 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Plugin; use Composer\EventDispatcher\Event; use Composer\Util\RemoteFilesystem; /** * The pre file download event. * * @author Nils Adermann <naderman@naderman.de> */ class PreFileDownloadEvent extends Event { /** * @var RemoteFilesystem */ private $rfs; /** * @var string */ private $processedUrl; /** * Constructor. * * @param string $name The event name * @param RemoteFilesystem $rfs * @param string $processedUrl */ public function __construct($name, RemoteFilesystem $rfs, $processedUrl) { parent::__construct($name); $this->rfs = $rfs; $this->processedUrl = $processedUrl; } /** * Returns the remote filesystem * * @return RemoteFilesystem */ public function getRemoteFilesystem() { return $this->rfs; } /** * Sets the remote filesystem * * @param RemoteFilesystem $rfs */ public function setRemoteFilesystem(RemoteFilesystem $rfs) { $this->rfs = $rfs; } /** * Retrieves the processed URL this remote filesystem will be used for * * @return string */ public function getProcessedUrl() { return $this->processedUrl; } } composer/src/Composer/Compiler.php 0000644 00000024246 14736103146 0013251 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer; use Composer\Json\JsonFile; use Composer\Spdx\SpdxLicenses; use Composer\CaBundle\CaBundle; use Symfony\Component\Finder\Finder; use Symfony\Component\Process\Process; use Seld\PharUtils\Timestamps; use Seld\PharUtils\Linter; /** * The Compiler class compiles composer into a phar * * @author Fabien Potencier <fabien@symfony.com> * @author Jordi Boggiano <j.boggiano@seld.be> */ class Compiler { private $version; private $branchAliasVersion = ''; private $versionDate; /** * Compiles composer into a single phar file * * @param string $pharFile The full path to the file to create * @throws \RuntimeException */ public function compile($pharFile = 'composer.phar') { if (file_exists($pharFile)) { unlink($pharFile); } $process = new Process('git log --pretty="%H" -n1 HEAD', __DIR__); if ($process->run() != 0) { throw new \RuntimeException('Can\'t run git log. You must ensure to run compile from composer git repository clone and that git binary is available.'); } $this->version = trim($process->getOutput()); $process = new Process('git log -n1 --pretty=%ci HEAD', __DIR__); if ($process->run() != 0) { throw new \RuntimeException('Can\'t run git log. You must ensure to run compile from composer git repository clone and that git binary is available.'); } $this->versionDate = new \DateTime(trim($process->getOutput())); $this->versionDate->setTimezone(new \DateTimeZone('UTC')); $process = new Process('git describe --tags --exact-match HEAD'); if ($process->run() == 0) { $this->version = trim($process->getOutput()); } else { // get branch-alias defined in composer.json for dev-master (if any) $localConfig = __DIR__.'/../../composer.json'; $file = new JsonFile($localConfig); $localConfig = $file->read(); if (isset($localConfig['extra']['branch-alias']['dev-master'])) { $this->branchAliasVersion = $localConfig['extra']['branch-alias']['dev-master']; } } $phar = new \Phar($pharFile, 0, 'composer.phar'); $phar->setSignatureAlgorithm(\Phar::SHA1); $phar->startBuffering(); $finderSort = function ($a, $b) { return strcmp(strtr($a->getRealPath(), '\\', '/'), strtr($b->getRealPath(), '\\', '/')); }; $finder = new Finder(); $finder->files() ->ignoreVCS(true) ->name('*.php') ->notName('Compiler.php') ->notName('ClassLoader.php') ->in(__DIR__.'/..') ->sort($finderSort) ; foreach ($finder as $file) { $this->addFile($phar, $file); } $this->addFile($phar, new \SplFileInfo(__DIR__ . '/Autoload/ClassLoader.php'), false); $finder = new Finder(); $finder->files() ->name('*.json') ->in(__DIR__.'/../../res') ->in(SpdxLicenses::getResourcesDir()) ->sort($finderSort) ; foreach ($finder as $file) { $this->addFile($phar, $file, false); } $this->addFile($phar, new \SplFileInfo(__DIR__ . '/../../vendor/symfony/console/Resources/bin/hiddeninput.exe'), false); $finder = new Finder(); $finder->files() ->ignoreVCS(true) ->name('*.php') ->name('LICENSE') ->exclude('Tests') ->exclude('tests') ->exclude('docs') ->in(__DIR__.'/../../vendor/symfony/') ->in(__DIR__.'/../../vendor/seld/jsonlint/') ->in(__DIR__.'/../../vendor/justinrainbow/json-schema/') ->in(__DIR__.'/../../vendor/composer/spdx-licenses/') ->in(__DIR__.'/../../vendor/composer/semver/') ->in(__DIR__.'/../../vendor/composer/ca-bundle/') ->in(__DIR__.'/../../vendor/composer/xdebug-handler/') ->in(__DIR__.'/../../vendor/psr/') ->sort($finderSort) ; foreach ($finder as $file) { $this->addFile($phar, $file); } $this->addFile($phar, new \SplFileInfo(__DIR__.'/../../vendor/autoload.php')); $this->addFile($phar, new \SplFileInfo(__DIR__.'/../../vendor/composer/autoload_namespaces.php')); $this->addFile($phar, new \SplFileInfo(__DIR__.'/../../vendor/composer/autoload_psr4.php')); $this->addFile($phar, new \SplFileInfo(__DIR__.'/../../vendor/composer/autoload_classmap.php')); $this->addFile($phar, new \SplFileInfo(__DIR__.'/../../vendor/composer/autoload_files.php')); $this->addFile($phar, new \SplFileInfo(__DIR__.'/../../vendor/composer/autoload_real.php')); $this->addFile($phar, new \SplFileInfo(__DIR__.'/../../vendor/composer/autoload_static.php')); if (file_exists(__DIR__.'/../../vendor/composer/include_paths.php')) { $this->addFile($phar, new \SplFileInfo(__DIR__.'/../../vendor/composer/include_paths.php')); } $this->addFile($phar, new \SplFileInfo(__DIR__.'/../../vendor/composer/ClassLoader.php')); $this->addFile($phar, new \SplFileInfo(CaBundle::getBundledCaBundlePath()), false); $this->addComposerBin($phar); // Stubs $phar->setStub($this->getStub()); $phar->stopBuffering(); // disabled for interoperability with systems without gzip ext // $phar->compressFiles(\Phar::GZ); $this->addFile($phar, new \SplFileInfo(__DIR__.'/../../LICENSE'), false); unset($phar); // re-sign the phar with reproducible timestamp / signature $util = new Timestamps($pharFile); $util->updateTimestamps($this->versionDate); $util->save($pharFile, \Phar::SHA1); Linter::lint($pharFile); } /** * @param \SplFileInfo $file * @return string */ private function getRelativeFilePath($file) { $realPath = $file->getRealPath(); $pathPrefix = dirname(dirname(__DIR__)).DIRECTORY_SEPARATOR; $pos = strpos($realPath, $pathPrefix); $relativePath = ($pos !== false) ? substr_replace($realPath, '', $pos, strlen($pathPrefix)) : $realPath; return strtr($relativePath, '\\', '/'); } private function addFile($phar, $file, $strip = true) { $path = $this->getRelativeFilePath($file); $content = file_get_contents($file); if ($strip) { $content = $this->stripWhitespace($content); } elseif ('LICENSE' === basename($file)) { $content = "\n".$content."\n"; } if ($path === 'src/Composer/Composer.php') { $content = str_replace('@package_version@', $this->version, $content); $content = str_replace('@package_branch_alias_version@', $this->branchAliasVersion, $content); $content = str_replace('@release_date@', $this->versionDate->format('Y-m-d H:i:s'), $content); $content = preg_replace('{SOURCE_VERSION = \'[^\']+\';}', 'SOURCE_VERSION = \'\';', $content); } $phar->addFromString($path, $content); } private function addComposerBin($phar) { $content = file_get_contents(__DIR__.'/../../bin/composer'); $content = preg_replace('{^#!/usr/bin/env php\s*}', '', $content); $phar->addFromString('bin/composer', $content); } /** * Removes whitespace from a PHP source string while preserving line numbers. * * @param string $source A PHP string * @return string The PHP string with the whitespace removed */ private function stripWhitespace($source) { if (!function_exists('token_get_all')) { return $source; } $output = ''; foreach (token_get_all($source) as $token) { if (is_string($token)) { $output .= $token; } elseif (in_array($token[0], array(T_COMMENT, T_DOC_COMMENT))) { $output .= str_repeat("\n", substr_count($token[1], "\n")); } elseif (T_WHITESPACE === $token[0]) { // reduce wide spaces $whitespace = preg_replace('{[ \t]+}', ' ', $token[1]); // normalize newlines to \n $whitespace = preg_replace('{(?:\r\n|\r|\n)}', "\n", $whitespace); // trim leading spaces $whitespace = preg_replace('{\n +}', "\n", $whitespace); $output .= $whitespace; } else { $output .= $token[1]; } } return $output; } private function getStub() { $stub = <<<'EOF' #!/usr/bin/env php <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view * the license that is located at the bottom of this file. */ // Avoid APC causing random fatal errors per https://github.com/composer/composer/issues/264 if (extension_loaded('apc') && filter_var(ini_get('apc.enable_cli'), FILTER_VALIDATE_BOOLEAN) && filter_var(ini_get('apc.cache_by_default'), FILTER_VALIDATE_BOOLEAN)) { if (version_compare(phpversion('apc'), '3.0.12', '>=')) { ini_set('apc.cache_by_default', 0); } else { fwrite(STDERR, 'Warning: APC <= 3.0.12 may cause fatal errors when running composer commands.'.PHP_EOL); fwrite(STDERR, 'Update APC, or set apc.enable_cli or apc.cache_by_default to 0 in your php.ini.'.PHP_EOL); } } Phar::mapPhar('composer.phar'); EOF; // add warning once the phar is older than 60 days if (preg_match('{^[a-f0-9]+$}', $this->version)) { $warningTime = $this->versionDate->format('U') + 60 * 86400; $stub .= "define('COMPOSER_DEV_WARNING_TIME', $warningTime);\n"; } return $stub . <<<'EOF' require 'phar://composer.phar/bin/composer'; __HALT_COMPILER(); EOF; } } composer/src/Composer/EventDispatcher/Event.php 0000644 00000004146 14736103146 0015645 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\EventDispatcher; /** * The base event class * * @author Nils Adermann <naderman@naderman.de> */ class Event { /** * @var string This event's name */ protected $name; /** * @var array Arguments passed by the user, these will be forwarded to CLI script handlers */ protected $args; /** * @var array Flags usable in PHP script handlers */ protected $flags; /** * @var bool Whether the event should not be passed to more listeners */ private $propagationStopped = false; /** * Constructor. * * @param string $name The event name * @param array $args Arguments passed by the user * @param array $flags Optional flags to pass data not as argument */ public function __construct($name, array $args = array(), array $flags = array()) { $this->name = $name; $this->args = $args; $this->flags = $flags; } /** * Returns the event's name. * * @return string The event name */ public function getName() { return $this->name; } /** * Returns the event's arguments. * * @return array The event arguments */ public function getArguments() { return $this->args; } /** * Returns the event's flags. * * @return array The event flags */ public function getFlags() { return $this->flags; } /** * Checks if stopPropagation has been called * * @return bool Whether propagation has been stopped */ public function isPropagationStopped() { return $this->propagationStopped; } /** * Prevents the event from being passed to further listeners */ public function stopPropagation() { $this->propagationStopped = true; } } composer/src/Composer/EventDispatcher/EventDispatcher.php 0000644 00000055565 14736103146 0017667 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\EventDispatcher; use Composer\DependencyResolver\PolicyInterface; use Composer\DependencyResolver\Pool; use Composer\DependencyResolver\Request; use Composer\Installer\InstallerEvent; use Composer\IO\IOInterface; use Composer\Composer; use Composer\DependencyResolver\Operation\OperationInterface; use Composer\Repository\CompositeRepository; use Composer\Script; use Composer\Installer\PackageEvent; use Composer\Installer\BinaryInstaller; use Composer\Util\ProcessExecutor; use Composer\Script\Event as ScriptEvent; use Symfony\Component\Process\PhpExecutableFinder; /** * The Event Dispatcher. * * Example in command: * $dispatcher = new EventDispatcher($this->getComposer(), $this->getApplication()->getIO()); * // ... * $dispatcher->dispatch(ScriptEvents::POST_INSTALL_CMD); * // ... * * @author François Pluchino <francois.pluchino@opendisplay.com> * @author Jordi Boggiano <j.boggiano@seld.be> * @author Nils Adermann <naderman@naderman.de> */ class EventDispatcher { protected $composer; protected $io; protected $loader; protected $process; protected $listeners; private $eventStack; /** * Constructor. * * @param Composer $composer The composer instance * @param IOInterface $io The IOInterface instance * @param ProcessExecutor $process */ public function __construct(Composer $composer, IOInterface $io, ProcessExecutor $process = null) { $this->composer = $composer; $this->io = $io; $this->process = $process ?: new ProcessExecutor($io); $this->eventStack = array(); } /** * Dispatch an event * * @param string $eventName An event name * @param Event $event * @return int return code of the executed script if any, for php scripts a false return * value is changed to 1, anything else to 0 */ public function dispatch($eventName, Event $event = null) { if (null === $event) { $event = new Event($eventName); } return $this->doDispatch($event); } /** * Dispatch a script event. * * @param string $eventName The constant in ScriptEvents * @param bool $devMode * @param array $additionalArgs Arguments passed by the user * @param array $flags Optional flags to pass data not as argument * @return int return code of the executed script if any, for php scripts a false return * value is changed to 1, anything else to 0 */ public function dispatchScript($eventName, $devMode = false, $additionalArgs = array(), $flags = array()) { return $this->doDispatch(new Script\Event($eventName, $this->composer, $this->io, $devMode, $additionalArgs, $flags)); } /** * Dispatch a package event. * * @param string $eventName The constant in PackageEvents * @param bool $devMode Whether or not we are in dev mode * @param PolicyInterface $policy The policy * @param Pool $pool The pool * @param CompositeRepository $installedRepo The installed repository * @param Request $request The request * @param array $operations The list of operations * @param OperationInterface $operation The package being installed/updated/removed * * @return int return code of the executed script if any, for php scripts a false return * value is changed to 1, anything else to 0 */ public function dispatchPackageEvent($eventName, $devMode, PolicyInterface $policy, Pool $pool, CompositeRepository $installedRepo, Request $request, array $operations, OperationInterface $operation) { return $this->doDispatch(new PackageEvent($eventName, $this->composer, $this->io, $devMode, $policy, $pool, $installedRepo, $request, $operations, $operation)); } /** * Dispatch a installer event. * * @param string $eventName The constant in InstallerEvents * @param bool $devMode Whether or not we are in dev mode * @param PolicyInterface $policy The policy * @param Pool $pool The pool * @param CompositeRepository $installedRepo The installed repository * @param Request $request The request * @param array $operations The list of operations * * @return int return code of the executed script if any, for php scripts a false return * value is changed to 1, anything else to 0 */ public function dispatchInstallerEvent($eventName, $devMode, PolicyInterface $policy, Pool $pool, CompositeRepository $installedRepo, Request $request, array $operations = array()) { return $this->doDispatch(new InstallerEvent($eventName, $this->composer, $this->io, $devMode, $policy, $pool, $installedRepo, $request, $operations)); } /** * Triggers the listeners of an event. * * @param Event $event The event object to pass to the event handlers/listeners. * @throws \RuntimeException|\Exception * @return int return code of the executed script if any, for php scripts a false return * value is changed to 1, anything else to 0 */ protected function doDispatch(Event $event) { $listeners = $this->getListeners($event); $this->pushEvent($event); $return = 0; foreach ($listeners as $callable) { $this->ensureBinDirIsInPath(); if (!is_string($callable)) { if (!is_callable($callable)) { $className = is_object($callable[0]) ? get_class($callable[0]) : $callable[0]; throw new \RuntimeException('Subscriber '.$className.'::'.$callable[1].' for event '.$event->getName().' is not callable, make sure the function is defined and public'); } $event = $this->checkListenerExpectedEvent($callable, $event); $return = false === call_user_func($callable, $event) ? 1 : 0; } elseif ($this->isComposerScript($callable)) { $this->io->writeError(sprintf('> %s: %s', $event->getName(), $callable), true, IOInterface::VERBOSE); $script = explode(' ', substr($callable, 1)); $scriptName = $script[0]; unset($script[0]); $args = array_merge($script, $event->getArguments()); $flags = $event->getFlags(); if (substr($callable, 0, 10) === '@composer ') { $exec = $this->getPhpExecCommand() . ' ' . ProcessExecutor::escape(getenv('COMPOSER_BINARY')) . substr($callable, 9); if (0 !== ($exitCode = $this->process->execute($exec))) { $this->io->writeError(sprintf('<error>Script %s handling the %s event returned with error code '.$exitCode.'</error>', $callable, $event->getName()), true, IOInterface::QUIET); throw new ScriptExecutionException('Error Output: '.$this->process->getErrorOutput(), $exitCode); } } else { if (!$this->getListeners(new Event($scriptName))) { $this->io->writeError(sprintf('<warning>You made a reference to a non-existent script %s</warning>', $callable), true, IOInterface::QUIET); } try { $scriptEvent = new Script\Event($scriptName, $event->getComposer(), $event->getIO(), $event->isDevMode(), $args, $flags); $scriptEvent->setOriginatingEvent($event); $return = $this->dispatch($scriptName, $scriptEvent); } catch (ScriptExecutionException $e) { $this->io->writeError(sprintf('<error>Script %s was called via %s</error>', $callable, $event->getName()), true, IOInterface::QUIET); throw $e; } } } elseif ($this->isPhpScript($callable)) { $className = substr($callable, 0, strpos($callable, '::')); $methodName = substr($callable, strpos($callable, '::') + 2); if (!class_exists($className)) { $this->io->writeError('<warning>Class '.$className.' is not autoloadable, can not call '.$event->getName().' script</warning>', true, IOInterface::QUIET); continue; } if (!is_callable($callable)) { $this->io->writeError('<warning>Method '.$callable.' is not callable, can not call '.$event->getName().' script</warning>', true, IOInterface::QUIET); continue; } try { $return = false === $this->executeEventPhpScript($className, $methodName, $event) ? 1 : 0; } catch (\Exception $e) { $message = "Script %s handling the %s event terminated with an exception"; $this->io->writeError('<error>'.sprintf($message, $callable, $event->getName()).'</error>', true, IOInterface::QUIET); throw $e; } } else { $args = implode(' ', array_map(array('Composer\Util\ProcessExecutor', 'escape'), $event->getArguments())); $exec = $callable . ($args === '' ? '' : ' '.$args); if ($this->io->isVerbose()) { $this->io->writeError(sprintf('> %s: %s', $event->getName(), $exec)); } else { $this->io->writeError(sprintf('> %s', $exec)); } $possibleLocalBinaries = $this->composer->getPackage()->getBinaries(); if ($possibleLocalBinaries) { foreach ($possibleLocalBinaries as $localExec) { if (preg_match('{\b'.preg_quote($callable).'$}', $localExec)) { $caller = BinaryInstaller::determineBinaryCaller($localExec); $exec = preg_replace('{^'.preg_quote($callable).'}', $caller . ' ' . $localExec, $exec); break; } } } if (substr($exec, 0, 8) === '@putenv ') { putenv(substr($exec, 8)); continue; } elseif (substr($exec, 0, 5) === '@php ') { $exec = $this->getPhpExecCommand() . ' ' . substr($exec, 5); } else { $finder = new PhpExecutableFinder(); $phpPath = $finder->find(false); if ($phpPath) { $_SERVER['PHP_BINARY'] = $phpPath; putenv('PHP_BINARY=' . $_SERVER['PHP_BINARY']); } } // if composer is being executed, make sure it runs the expected composer from current path // resolution, even if bin-dir contains composer too because the project requires composer/composer // see https://github.com/composer/composer/issues/8748 if (substr($exec, 0, 9) === 'composer ') { $exec = $this->getPhpExecCommand() . ' ' . ProcessExecutor::escape(getenv('COMPOSER_BINARY')) . substr($exec, 8); } if (0 !== ($exitCode = $this->process->execute($exec))) { $this->io->writeError(sprintf('<error>Script %s handling the %s event returned with error code '.$exitCode.'</error>', $callable, $event->getName()), true, IOInterface::QUIET); throw new ScriptExecutionException('Error Output: '.$this->process->getErrorOutput(), $exitCode); } } if ($event->isPropagationStopped()) { break; } } $this->popEvent(); return $return; } protected function getPhpExecCommand() { $finder = new PhpExecutableFinder(); $phpPath = $finder->find(false); if (!$phpPath) { throw new \RuntimeException('Failed to locate PHP binary to execute '.$phpPath); } $phpArgs = $finder->findArguments(); $phpArgs = $phpArgs ? ' ' . implode(' ', $phpArgs) : ''; $allowUrlFOpenFlag = ' -d allow_url_fopen=' . ProcessExecutor::escape(ini_get('allow_url_fopen')); $disableFunctionsFlag = ' -d disable_functions=' . ProcessExecutor::escape(ini_get('disable_functions')); $memoryLimitFlag = ' -d memory_limit=' . ProcessExecutor::escape(ini_get('memory_limit')); return ProcessExecutor::escape($phpPath) . $phpArgs . $allowUrlFOpenFlag . $disableFunctionsFlag . $memoryLimitFlag; } /** * @param string $className * @param string $methodName * @param Event $event Event invoking the PHP callable */ protected function executeEventPhpScript($className, $methodName, Event $event) { $event = $this->checkListenerExpectedEvent(array($className, $methodName), $event); if ($this->io->isVerbose()) { $this->io->writeError(sprintf('> %s: %s::%s', $event->getName(), $className, $methodName)); } else { $this->io->writeError(sprintf('> %s::%s', $className, $methodName)); } return $className::$methodName($event); } /** * @param mixed $target * @param Event $event * @return Event */ protected function checkListenerExpectedEvent($target, Event $event) { if (in_array($event->getName(), array( 'init', 'command', 'pre-file-download', ), true)) { return $event; } try { $reflected = new \ReflectionParameter($target, 0); } catch (\Exception $e) { return $event; } $expected = null; $isClass = false; if (\PHP_VERSION_ID >= 70000) { $reflectionType = $reflected->getType(); if ($reflectionType) { $expected = $reflectionType instanceof \ReflectionNamedType ? $reflectionType->getName() : (string)$reflectionType; $isClass = !$reflectionType->isBuiltin(); } } else { $expected = $reflected->getClass() ? $reflected->getClass()->getName() : null; $isClass = null !== $expected; } if (!$isClass) { return $event; } // BC support if (!$event instanceof $expected && $expected === 'Composer\Script\CommandEvent') { trigger_error('The callback '.$this->serializeCallback($target).' declared at '.$reflected->getDeclaringFunction()->getFileName().' accepts a '.$expected.' but '.$event->getName().' events use a '.get_class($event).' instance. Please adjust your type hint accordingly, see https://getcomposer.org/doc/articles/scripts.md#event-classes', E_USER_DEPRECATED); $event = new \Composer\Script\CommandEvent( $event->getName(), $event->getComposer(), $event->getIO(), $event->isDevMode(), $event->getArguments() ); } if (!$event instanceof $expected && $expected === 'Composer\Script\PackageEvent') { trigger_error('The callback '.$this->serializeCallback($target).' declared at '.$reflected->getDeclaringFunction()->getFileName().' accepts a '.$expected.' but '.$event->getName().' events use a '.get_class($event).' instance. Please adjust your type hint accordingly, see https://getcomposer.org/doc/articles/scripts.md#event-classes', E_USER_DEPRECATED); $event = new \Composer\Script\PackageEvent( $event->getName(), $event->getComposer(), $event->getIO(), $event->isDevMode(), $event->getPolicy(), $event->getPool(), $event->getInstalledRepo(), $event->getRequest(), $event->getOperations(), $event->getOperation() ); } if (!$event instanceof $expected && $expected === 'Composer\Script\Event') { trigger_error('The callback '.$this->serializeCallback($target).' declared at '.$reflected->getDeclaringFunction()->getFileName().' accepts a '.$expected.' but '.$event->getName().' events use a '.get_class($event).' instance. Please adjust your type hint accordingly, see https://getcomposer.org/doc/articles/scripts.md#event-classes', E_USER_DEPRECATED); $event = new \Composer\Script\Event( $event->getName(), $event->getComposer(), $event->getIO(), $event->isDevMode(), $event->getArguments(), $event->getFlags() ); } return $event; } private function serializeCallback($cb) { if (is_array($cb) && count($cb) === 2) { if (is_object($cb[0])) { $cb[0] = get_class($cb[0]); } if (is_string($cb[0]) && is_string($cb[1])) { $cb = implode('::', $cb); } } if (is_string($cb)) { return $cb; } return var_export($cb, true); } /** * Add a listener for a particular event * * @param string $eventName The event name - typically a constant * @param callable $listener A callable expecting an event argument * @param int $priority A higher value represents a higher priority */ public function addListener($eventName, $listener, $priority = 0) { $this->listeners[$eventName][$priority][] = $listener; } /** * Adds object methods as listeners for the events in getSubscribedEvents * * @see EventSubscriberInterface * * @param EventSubscriberInterface $subscriber */ public function addSubscriber(EventSubscriberInterface $subscriber) { foreach ($subscriber->getSubscribedEvents() as $eventName => $params) { if (is_string($params)) { $this->addListener($eventName, array($subscriber, $params)); } elseif (is_string($params[0])) { $this->addListener($eventName, array($subscriber, $params[0]), isset($params[1]) ? $params[1] : 0); } else { foreach ($params as $listener) { $this->addListener($eventName, array($subscriber, $listener[0]), isset($listener[1]) ? $listener[1] : 0); } } } } /** * Retrieves all listeners for a given event * * @param Event $event * @return array All listeners: callables and scripts */ protected function getListeners(Event $event) { $scriptListeners = $this->getScriptListeners($event); if (!isset($this->listeners[$event->getName()][0])) { $this->listeners[$event->getName()][0] = array(); } krsort($this->listeners[$event->getName()]); $listeners = $this->listeners; $listeners[$event->getName()][0] = array_merge($listeners[$event->getName()][0], $scriptListeners); return call_user_func_array('array_merge', $listeners[$event->getName()]); } /** * Checks if an event has listeners registered * * @param Event $event * @return bool */ public function hasEventListeners(Event $event) { $listeners = $this->getListeners($event); return count($listeners) > 0; } /** * Finds all listeners defined as scripts in the package * * @param Event $event Event object * @return array Listeners */ protected function getScriptListeners(Event $event) { $package = $this->composer->getPackage(); $scripts = $package->getScripts(); if (empty($scripts[$event->getName()])) { return array(); } if ($this->loader) { $this->loader->unregister(); } $generator = $this->composer->getAutoloadGenerator(); if ($event instanceof ScriptEvent) { $generator->setDevMode($event->isDevMode()); } $packages = $this->composer->getRepositoryManager()->getLocalRepository()->getCanonicalPackages(); $packageMap = $generator->buildPackageMap($this->composer->getInstallationManager(), $package, $packages); $map = $generator->parseAutoloads($packageMap, $package); $this->loader = $generator->createLoader($map); $this->loader->register(); return $scripts[$event->getName()]; } /** * Checks if string given references a class path and method * * @param string $callable * @return bool */ protected function isPhpScript($callable) { return false === strpos($callable, ' ') && false !== strpos($callable, '::'); } /** * Checks if string given references a composer run-script * * @param string $callable * @return bool */ protected function isComposerScript($callable) { return '@' === substr($callable, 0, 1) && '@php ' !== substr($callable, 0, 5) && '@putenv ' !== substr($callable, 0, 8); } /** * Push an event to the stack of active event * * @param Event $event * @throws \RuntimeException * @return number */ protected function pushEvent(Event $event) { $eventName = $event->getName(); if (in_array($eventName, $this->eventStack)) { throw new \RuntimeException(sprintf("Circular call to script handler '%s' detected", $eventName)); } return array_push($this->eventStack, $eventName); } /** * Pops the active event from the stack * * @return mixed */ protected function popEvent() { return array_pop($this->eventStack); } private function ensureBinDirIsInPath() { $pathStr = 'PATH'; if (!isset($_SERVER[$pathStr]) && isset($_SERVER['Path'])) { $pathStr = 'Path'; } // add the bin dir to the PATH to make local binaries of deps usable in scripts $binDir = $this->composer->getConfig()->get('bin-dir'); if (is_dir($binDir)) { $binDir = realpath($binDir); if (isset($_SERVER[$pathStr]) && !preg_match('{(^|'.PATH_SEPARATOR.')'.preg_quote($binDir).'($|'.PATH_SEPARATOR.')}', $_SERVER[$pathStr])) { $_SERVER[$pathStr] = $binDir.PATH_SEPARATOR.getenv($pathStr); putenv($pathStr.'='.$_SERVER[$pathStr]); } } } } composer/src/Composer/EventDispatcher/ScriptExecutionException.php 0000644 00000000646 14736103146 0021574 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\EventDispatcher; /** * @author Jordi Boggiano <j.boggiano@seld.be> */ class ScriptExecutionException extends \RuntimeException { } composer/src/Composer/EventDispatcher/EventSubscriberInterface.php 0000644 00000003021 14736103146 0021501 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\EventDispatcher; /** * An EventSubscriber knows which events it is interested in. * * If an EventSubscriber is added to an EventDispatcher, the manager invokes * {@link getSubscribedEvents} and registers the subscriber as a listener for all * returned events. * * @author Guilherme Blanco <guilhermeblanco@hotmail.com> * @author Jonathan Wage <jonwage@gmail.com> * @author Roman Borschel <roman@code-factory.org> * @author Bernhard Schussek <bschussek@gmail.com> */ interface EventSubscriberInterface { /** * Returns an array of event names this subscriber wants to listen to. * * The array keys are event names and the value can be: * * * The method name to call (priority defaults to 0) * * An array composed of the method name to call and the priority * * An array of arrays composed of the method names to call and respective * priorities, or 0 if unset * * For instance: * * * array('eventName' => 'methodName') * * array('eventName' => array('methodName', $priority)) * * array('eventName' => array(array('methodName1', $priority), array('methodName2')) * * @return array The event names to listen to */ public static function getSubscribedEvents(); } composer/src/Composer/Factory.php 0000644 00000057560 14736103146 0013113 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer; use Composer\Config\JsonConfigSource; use Composer\Json\JsonFile; use Composer\IO\IOInterface; use Composer\Package\Archiver; use Composer\Package\Version\VersionGuesser; use Composer\Repository\RepositoryManager; use Composer\Repository\RepositoryFactory; use Composer\Repository\WritableRepositoryInterface; use Composer\Util\Filesystem; use Composer\Util\Platform; use Composer\Util\ProcessExecutor; use Composer\Util\RemoteFilesystem; use Composer\Util\Silencer; use Composer\Plugin\PluginEvents; use Composer\EventDispatcher\Event; use Seld\JsonLint\DuplicateKeyException; use Symfony\Component\Console\Formatter\OutputFormatter; use Symfony\Component\Console\Formatter\OutputFormatterStyle; use Symfony\Component\Console\Output\ConsoleOutput; use Composer\EventDispatcher\EventDispatcher; use Composer\Autoload\AutoloadGenerator; use Composer\Package\Version\VersionParser; use Composer\Downloader\TransportException; use Seld\JsonLint\JsonParser; /** * Creates a configured instance of composer. * * @author Ryan Weaver <ryan@knplabs.com> * @author Jordi Boggiano <j.boggiano@seld.be> * @author Igor Wiedler <igor@wiedler.ch> * @author Nils Adermann <naderman@naderman.de> */ class Factory { /** * @throws \RuntimeException * @return string */ protected static function getHomeDir() { $home = getenv('COMPOSER_HOME'); if ($home) { return $home; } if (Platform::isWindows()) { if (!getenv('APPDATA')) { throw new \RuntimeException('The APPDATA or COMPOSER_HOME environment variable must be set for composer to run correctly'); } return rtrim(strtr(getenv('APPDATA'), '\\', '/'), '/') . '/Composer'; } $userDir = self::getUserDir(); if (is_dir($userDir . '/.composer')) { return $userDir . '/.composer'; } if (self::useXdg()) { // XDG Base Directory Specifications $xdgConfig = getenv('XDG_CONFIG_HOME') ?: $userDir . '/.config'; return $xdgConfig . '/composer'; } return $userDir . '/.composer'; } /** * @param string $home * @return string */ protected static function getCacheDir($home) { $cacheDir = getenv('COMPOSER_CACHE_DIR'); if ($cacheDir) { return $cacheDir; } $homeEnv = getenv('COMPOSER_HOME'); if ($homeEnv) { return $homeEnv . '/cache'; } if (Platform::isWindows()) { if ($cacheDir = getenv('LOCALAPPDATA')) { $cacheDir .= '/Composer'; } else { $cacheDir = $home . '/cache'; } return rtrim(strtr($cacheDir, '\\', '/'), '/'); } $userDir = self::getUserDir(); if ($home === $userDir . '/.composer' && is_dir($home . '/cache')) { return $home . '/cache'; } if (self::useXdg()) { $xdgCache = getenv('XDG_CACHE_HOME') ?: $userDir . '/.cache'; return $xdgCache . '/composer'; } return $home . '/cache'; } /** * @param string $home * @return string */ protected static function getDataDir($home) { $homeEnv = getenv('COMPOSER_HOME'); if ($homeEnv) { return $homeEnv; } if (Platform::isWindows()) { return strtr($home, '\\', '/'); } $userDir = self::getUserDir(); if ($home !== $userDir . '/.composer' && self::useXdg()) { $xdgData = getenv('XDG_DATA_HOME') ?: $userDir . '/.local/share'; return $xdgData . '/composer'; } return $home; } /** * @param IOInterface|null $io * @return Config */ public static function createConfig(IOInterface $io = null, $cwd = null) { $cwd = $cwd ?: getcwd(); $config = new Config(true, $cwd); // determine and add main dirs to the config $home = self::getHomeDir(); $config->merge(array('config' => array( 'home' => $home, 'cache-dir' => self::getCacheDir($home), 'data-dir' => self::getDataDir($home), ))); // load global config $file = new JsonFile($config->get('home').'/config.json'); if ($file->exists()) { if ($io && $io->isDebug()) { $io->writeError('Loading config file ' . $file->getPath()); } $config->merge($file->read()); } $config->setConfigSource(new JsonConfigSource($file)); $htaccessProtect = (bool) $config->get('htaccess-protect'); if ($htaccessProtect) { // Protect directory against web access. Since HOME could be // the www-data's user home and be web-accessible it is a // potential security risk $dirs = array($config->get('home'), $config->get('cache-dir'), $config->get('data-dir')); foreach ($dirs as $dir) { if (!file_exists($dir . '/.htaccess')) { if (!is_dir($dir)) { Silencer::call('mkdir', $dir, 0777, true); } Silencer::call('file_put_contents', $dir . '/.htaccess', 'Deny from all'); } } } // load global auth file $file = new JsonFile($config->get('home').'/auth.json'); if ($file->exists()) { if ($io && $io->isDebug()) { $io->writeError('Loading config file ' . $file->getPath()); } $config->merge(array('config' => $file->read())); } $config->setAuthConfigSource(new JsonConfigSource($file, true)); // load COMPOSER_AUTH environment variable if set if ($composerAuthEnv = getenv('COMPOSER_AUTH')) { $authData = json_decode($composerAuthEnv, true); if (null === $authData) { throw new \UnexpectedValueException('COMPOSER_AUTH environment variable is malformed, should be a valid JSON object'); } if ($io && $io->isDebug()) { $io->writeError('Loading auth config from COMPOSER_AUTH'); } $config->merge(array('config' => $authData)); } return $config; } public static function getComposerFile() { return trim(getenv('COMPOSER')) ?: './composer.json'; } public static function createAdditionalStyles() { return array( 'highlight' => new OutputFormatterStyle('red'), 'warning' => new OutputFormatterStyle('black', 'yellow'), ); } /** * Creates a ConsoleOutput instance * * @return ConsoleOutput */ public static function createOutput() { $styles = self::createAdditionalStyles(); $formatter = new OutputFormatter(false, $styles); return new ConsoleOutput(ConsoleOutput::VERBOSITY_NORMAL, null, $formatter); } /** * @deprecated Use Composer\Repository\RepositoryFactory::defaultRepos instead */ public static function createDefaultRepositories(IOInterface $io = null, Config $config = null, RepositoryManager $rm = null) { return RepositoryFactory::defaultRepos($io, $config, $rm); } /** * Creates a Composer instance * * @param IOInterface $io IO instance * @param array|string|null $localConfig either a configuration array or a filename to read from, if null it will * read from the default filename * @param bool $disablePlugins Whether plugins should not be loaded * @param bool $fullLoad Whether to initialize everything or only main project stuff (used when loading the global composer) * @throws \InvalidArgumentException * @throws \UnexpectedValueException * @return Composer */ public function createComposer(IOInterface $io, $localConfig = null, $disablePlugins = false, $cwd = null, $fullLoad = true) { $cwd = $cwd ?: getcwd(); // load Composer configuration if (null === $localConfig) { $localConfig = static::getComposerFile(); } if (is_string($localConfig)) { $composerFile = $localConfig; $file = new JsonFile($localConfig, null, $io); if (!$file->exists()) { if ($localConfig === './composer.json' || $localConfig === 'composer.json') { $message = 'Composer could not find a composer.json file in '.$cwd; } else { $message = 'Composer could not find the config file: '.$localConfig; } $instructions = 'To initialize a project, please create a composer.json file as described in the https://getcomposer.org/ "Getting Started" section'; throw new \InvalidArgumentException($message.PHP_EOL.$instructions); } $file->validateSchema(JsonFile::LAX_SCHEMA); $jsonParser = new JsonParser; try { $jsonParser->parse(file_get_contents($localConfig), JsonParser::DETECT_KEY_CONFLICTS); } catch (DuplicateKeyException $e) { $details = $e->getDetails(); $io->writeError('<warning>Key '.$details['key'].' is a duplicate in '.$localConfig.' at line '.$details['line'].'</warning>'); } $localConfig = $file->read(); } // Load config and override with local config/auth config $config = static::createConfig($io, $cwd); $config->merge($localConfig); if (isset($composerFile)) { $io->writeError('Loading config file ' . $composerFile, true, IOInterface::DEBUG); $config->setConfigSource(new JsonConfigSource(new JsonFile(realpath($composerFile), null, $io))); $localAuthFile = new JsonFile(dirname(realpath($composerFile)) . '/auth.json', null, $io); if ($localAuthFile->exists()) { $io->writeError('Loading config file ' . $localAuthFile->getPath(), true, IOInterface::DEBUG); $config->merge(array('config' => $localAuthFile->read())); $config->setAuthConfigSource(new JsonConfigSource($localAuthFile, true)); } } $vendorDir = $config->get('vendor-dir'); // initialize composer $composer = new Composer(); $composer->setConfig($config); if ($fullLoad) { // load auth configs into the IO instance $io->loadConfiguration($config); } $rfs = self::createRemoteFilesystem($io, $config); // initialize event dispatcher $dispatcher = new EventDispatcher($composer, $io); $composer->setEventDispatcher($dispatcher); // initialize repository manager $rm = RepositoryFactory::manager($io, $config, $dispatcher, $rfs); $composer->setRepositoryManager($rm); // load local repository $this->addLocalRepository($io, $rm, $vendorDir); // force-set the version of the global package if not defined as // guessing it adds no value and only takes time if (!$fullLoad && !isset($localConfig['version'])) { $localConfig['version'] = '1.0.0'; } // load package $parser = new VersionParser; $guesser = new VersionGuesser($config, new ProcessExecutor($io), $parser); $loader = new Package\Loader\RootPackageLoader($rm, $config, $parser, $guesser, $io); $package = $loader->load($localConfig, 'Composer\Package\RootPackage', $cwd); $composer->setPackage($package); // initialize installation manager $im = $this->createInstallationManager(); $composer->setInstallationManager($im); if ($fullLoad) { // initialize download manager $dm = $this->createDownloadManager($io, $config, $dispatcher, $rfs); $composer->setDownloadManager($dm); // initialize autoload generator $generator = new AutoloadGenerator($dispatcher, $io); $composer->setAutoloadGenerator($generator); // initialize archive manager $am = $this->createArchiveManager($config, $dm); $composer->setArchiveManager($am); } // add installers to the manager (must happen after download manager is created since they read it out of $composer) $this->createDefaultInstallers($im, $composer, $io); if ($fullLoad) { $globalComposer = null; if (realpath($config->get('home')) !== $cwd) { $globalComposer = $this->createGlobalComposer($io, $config, $disablePlugins); } $pm = $this->createPluginManager($io, $composer, $globalComposer, $disablePlugins); $composer->setPluginManager($pm); $pm->loadInstalledPlugins(); } // init locker if possible if ($fullLoad && isset($composerFile)) { $lockFile = "json" === pathinfo($composerFile, PATHINFO_EXTENSION) ? substr($composerFile, 0, -4).'lock' : $composerFile . '.lock'; $locker = new Package\Locker($io, new JsonFile($lockFile, null, $io), $rm, $im, file_get_contents($composerFile)); $composer->setLocker($locker); } if ($fullLoad) { $initEvent = new Event(PluginEvents::INIT); $composer->getEventDispatcher()->dispatch($initEvent->getName(), $initEvent); // once everything is initialized we can // purge packages from local repos if they have been deleted on the filesystem if ($rm->getLocalRepository()) { $this->purgePackages($rm->getLocalRepository(), $im); } } return $composer; } /** * @param IOInterface $io IO instance * @param bool $disablePlugins Whether plugins should not be loaded * @return Composer */ public static function createGlobal(IOInterface $io, $disablePlugins = false) { $factory = new static(); return $factory->createGlobalComposer($io, static::createConfig($io), $disablePlugins, true); } /** * @param Repository\RepositoryManager $rm * @param string $vendorDir */ protected function addLocalRepository(IOInterface $io, RepositoryManager $rm, $vendorDir) { $rm->setLocalRepository(new Repository\InstalledFilesystemRepository(new JsonFile($vendorDir.'/composer/installed.json', null, $io))); } /** * @param Config $config * @return Composer|null */ protected function createGlobalComposer(IOInterface $io, Config $config, $disablePlugins, $fullLoad = false) { $composer = null; try { $composer = $this->createComposer($io, $config->get('home') . '/composer.json', $disablePlugins, $config->get('home'), $fullLoad); } catch (\Exception $e) { $io->writeError('Failed to initialize global composer: '.$e->getMessage(), true, IOInterface::DEBUG); } return $composer; } /** * @param IO\IOInterface $io * @param Config $config * @param EventDispatcher $eventDispatcher * @return Downloader\DownloadManager */ public function createDownloadManager(IOInterface $io, Config $config, EventDispatcher $eventDispatcher = null, RemoteFilesystem $rfs = null) { $cache = null; if ($config->get('cache-files-ttl') > 0) { $cache = new Cache($io, $config->get('cache-files-dir'), 'a-z0-9_./'); } $dm = new Downloader\DownloadManager($io); switch ($preferred = $config->get('preferred-install')) { case 'dist': $dm->setPreferDist(true); break; case 'source': $dm->setPreferSource(true); break; case 'auto': default: // noop break; } if (is_array($preferred)) { $dm->setPreferences($preferred); } $executor = new ProcessExecutor($io); $fs = new Filesystem($executor); $dm->setDownloader('git', new Downloader\GitDownloader($io, $config, $executor, $fs)); $dm->setDownloader('svn', new Downloader\SvnDownloader($io, $config, $executor, $fs)); $dm->setDownloader('fossil', new Downloader\FossilDownloader($io, $config, $executor, $fs)); $dm->setDownloader('hg', new Downloader\HgDownloader($io, $config, $executor, $fs)); $dm->setDownloader('perforce', new Downloader\PerforceDownloader($io, $config)); $dm->setDownloader('zip', new Downloader\ZipDownloader($io, $config, $eventDispatcher, $cache, $executor, $rfs)); $dm->setDownloader('rar', new Downloader\RarDownloader($io, $config, $eventDispatcher, $cache, $executor, $rfs)); $dm->setDownloader('tar', new Downloader\TarDownloader($io, $config, $eventDispatcher, $cache, $rfs)); $dm->setDownloader('gzip', new Downloader\GzipDownloader($io, $config, $eventDispatcher, $cache, $executor, $rfs)); $dm->setDownloader('xz', new Downloader\XzDownloader($io, $config, $eventDispatcher, $cache, $executor, $rfs)); $dm->setDownloader('phar', new Downloader\PharDownloader($io, $config, $eventDispatcher, $cache, $rfs)); $dm->setDownloader('file', new Downloader\FileDownloader($io, $config, $eventDispatcher, $cache, $rfs)); $dm->setDownloader('path', new Downloader\PathDownloader($io, $config, $eventDispatcher, $cache, $rfs)); return $dm; } /** * @param Config $config The configuration * @param Downloader\DownloadManager $dm Manager use to download sources * @return Archiver\ArchiveManager */ public function createArchiveManager(Config $config, Downloader\DownloadManager $dm = null) { if (null === $dm) { $io = new IO\NullIO(); $io->loadConfiguration($config); $dm = $this->createDownloadManager($io, $config); } $am = new Archiver\ArchiveManager($dm); $am->addArchiver(new Archiver\ZipArchiver); $am->addArchiver(new Archiver\PharArchiver); return $am; } /** * @param IOInterface $io * @param Composer $composer * @param Composer $globalComposer * @param bool $disablePlugins * @return Plugin\PluginManager */ protected function createPluginManager(IOInterface $io, Composer $composer, Composer $globalComposer = null, $disablePlugins = false) { return new Plugin\PluginManager($io, $composer, $globalComposer, $disablePlugins); } /** * @return Installer\InstallationManager */ protected function createInstallationManager() { return new Installer\InstallationManager(); } /** * @param Installer\InstallationManager $im * @param Composer $composer * @param IO\IOInterface $io */ protected function createDefaultInstallers(Installer\InstallationManager $im, Composer $composer, IOInterface $io) { $im->addInstaller(new Installer\LibraryInstaller($io, $composer, null)); $im->addInstaller(new Installer\PearInstaller($io, $composer, 'pear-library')); $im->addInstaller(new Installer\PluginInstaller($io, $composer)); $im->addInstaller(new Installer\MetapackageInstaller($io)); } /** * @param WritableRepositoryInterface $repo repository to purge packages from * @param Installer\InstallationManager $im manager to check whether packages are still installed */ protected function purgePackages(WritableRepositoryInterface $repo, Installer\InstallationManager $im) { foreach ($repo->getPackages() as $package) { if (!$im->isPackageInstalled($repo, $package)) { $repo->removePackage($package); } } } /** * @param IOInterface $io IO instance * @param mixed $config either a configuration array or a filename to read from, if null it will read from * the default filename * @param bool $disablePlugins Whether plugins should not be loaded * @return Composer */ public static function create(IOInterface $io, $config = null, $disablePlugins = false) { $factory = new static(); return $factory->createComposer($io, $config, $disablePlugins); } /** * @param IOInterface $io IO instance * @param Config $config Config instance * @param array $options Array of options passed directly to RemoteFilesystem constructor * @return RemoteFilesystem */ public static function createRemoteFilesystem(IOInterface $io, Config $config = null, $options = array()) { static $warned = false; $disableTls = false; if ($config && $config->get('disable-tls') === true) { if (!$warned) { $io->writeError('<warning>You are running Composer with SSL/TLS protection disabled.</warning>'); } $warned = true; $disableTls = true; } elseif (!extension_loaded('openssl')) { throw new Exception\NoSslException('The openssl extension is required for SSL/TLS protection but is not available. ' . 'If you can not enable the openssl extension, you can disable this error, at your own risk, by setting the \'disable-tls\' option to true.'); } $remoteFilesystemOptions = array(); if ($disableTls === false) { if ($config && $config->get('cafile')) { $remoteFilesystemOptions['ssl']['cafile'] = $config->get('cafile'); } if ($config && $config->get('capath')) { $remoteFilesystemOptions['ssl']['capath'] = $config->get('capath'); } $remoteFilesystemOptions = array_replace_recursive($remoteFilesystemOptions, $options); } try { $remoteFilesystem = new RemoteFilesystem($io, $config, $remoteFilesystemOptions, $disableTls); } catch (TransportException $e) { if (false !== strpos($e->getMessage(), 'cafile')) { $io->write('<error>Unable to locate a valid CA certificate file. You must set a valid \'cafile\' option.</error>'); $io->write('<error>A valid CA certificate file is required for SSL/TLS protection.</error>'); if (PHP_VERSION_ID < 50600) { $io->write('<error>It is recommended you upgrade to PHP 5.6+ which can detect your system CA file automatically.</error>'); } $io->write('<error>You can disable this error, at your own risk, by setting the \'disable-tls\' option to true.</error>'); } throw $e; } return $remoteFilesystem; } /** * @return bool */ private static function useXdg() { foreach (array_keys($_SERVER) as $key) { if (substr($key, 0, 4) === 'XDG_') { return true; } } return false; } /** * @throws \RuntimeException * @return string */ private static function getUserDir() { $home = getenv('HOME'); if (!$home) { throw new \RuntimeException('The HOME or COMPOSER_HOME environment variable must be set for composer to run correctly'); } return rtrim(strtr($home, '\\', '/'), '/'); } } composer/src/Composer/IO/IOInterface.php 0000644 00000015064 14736103146 0014134 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\IO; use Composer\Config; /** * The Input/Output helper interface. * * @author François Pluchino <francois.pluchino@opendisplay.com> */ interface IOInterface { const QUIET = 1; const NORMAL = 2; const VERBOSE = 4; const VERY_VERBOSE = 8; const DEBUG = 16; /** * Is this input means interactive? * * @return bool */ public function isInteractive(); /** * Is this output verbose? * * @return bool */ public function isVerbose(); /** * Is the output very verbose? * * @return bool */ public function isVeryVerbose(); /** * Is the output in debug verbosity? * * @return bool */ public function isDebug(); /** * Is this output decorated? * * @return bool */ public function isDecorated(); /** * Writes a message to the output. * * @param string|array $messages The message as an array of lines or a single string * @param bool $newline Whether to add a newline or not * @param int $verbosity Verbosity level from the VERBOSITY_* constants */ public function write($messages, $newline = true, $verbosity = self::NORMAL); /** * Writes a message to the error output. * * @param string|array $messages The message as an array of lines or a single string * @param bool $newline Whether to add a newline or not * @param int $verbosity Verbosity level from the VERBOSITY_* constants */ public function writeError($messages, $newline = true, $verbosity = self::NORMAL); /** * Overwrites a previous message to the output. * * @param string|array $messages The message as an array of lines or a single string * @param bool $newline Whether to add a newline or not * @param int $size The size of line * @param int $verbosity Verbosity level from the VERBOSITY_* constants */ public function overwrite($messages, $newline = true, $size = null, $verbosity = self::NORMAL); /** * Overwrites a previous message to the error output. * * @param string|array $messages The message as an array of lines or a single string * @param bool $newline Whether to add a newline or not * @param int $size The size of line * @param int $verbosity Verbosity level from the VERBOSITY_* constants */ public function overwriteError($messages, $newline = true, $size = null, $verbosity = self::NORMAL); /** * Asks a question to the user. * * @param string $question The question to ask * @param string $default The default answer if none is given by the user * * @throws \RuntimeException If there is no data to read in the input stream * @return string The user answer */ public function ask($question, $default = null); /** * Asks a confirmation to the user. * * The question will be asked until the user answers by nothing, yes, or no. * * @param string $question The question to ask * @param bool $default The default answer if the user enters nothing * * @return bool true if the user has confirmed, false otherwise */ public function askConfirmation($question, $default = true); /** * Asks for a value and validates the response. * * The validator receives the data to validate. It must return the * validated data when the data is valid and throw an exception * otherwise. * * @param string $question The question to ask * @param callable $validator A PHP callback * @param null|int $attempts Max number of times to ask before giving up (default of null means infinite) * @param mixed $default The default answer if none is given by the user * * @throws \Exception When any of the validators return an error * @return mixed */ public function askAndValidate($question, $validator, $attempts = null, $default = null); /** * Asks a question to the user and hide the answer. * * @param string $question The question to ask * * @return string The answer */ public function askAndHideAnswer($question); /** * Asks the user to select a value. * * @param string $question The question to ask * @param array $choices List of choices to pick from * @param bool|string $default The default answer if the user enters nothing * @param bool|int $attempts Max number of times to ask before giving up (false by default, which means infinite) * @param string $errorMessage Message which will be shown if invalid value from choice list would be picked * @param bool $multiselect Select more than one value separated by comma * * @throws \InvalidArgumentException * @return int|string|array The selected value or values (the key of the choices array) */ public function select($question, $choices, $default, $attempts = false, $errorMessage = 'Value "%s" is invalid', $multiselect = false); /** * Get all authentication information entered. * * @return array The map of authentication data */ public function getAuthentications(); /** * Verify if the repository has a authentication information. * * @param string $repositoryName The unique name of repository * * @return bool */ public function hasAuthentication($repositoryName); /** * Get the username and password of repository. * * @param string $repositoryName The unique name of repository * * @return array The 'username' and 'password' */ public function getAuthentication($repositoryName); /** * Set the authentication information for the repository. * * @param string $repositoryName The unique name of repository * @param string $username The username * @param string $password The password */ public function setAuthentication($repositoryName, $username, $password = null); /** * Loads authentications from a config instance * * @param Config $config */ public function loadConfiguration(Config $config); } composer/src/Composer/IO/BaseIO.php 0000644 00000020142 14736103146 0013077 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\IO; use Composer\Config; use Composer\Util\ProcessExecutor; use Psr\Log\LoggerInterface; use Psr\Log\LogLevel; abstract class BaseIO implements IOInterface, LoggerInterface { protected $authentications = array(); /** * {@inheritDoc} */ public function getAuthentications() { return $this->authentications; } /** * {@inheritDoc} */ public function resetAuthentications() { $this->authentications = array(); } /** * {@inheritDoc} */ public function hasAuthentication($repositoryName) { return isset($this->authentications[$repositoryName]); } /** * {@inheritDoc} */ public function getAuthentication($repositoryName) { if (isset($this->authentications[$repositoryName])) { return $this->authentications[$repositoryName]; } return array('username' => null, 'password' => null); } /** * {@inheritDoc} */ public function setAuthentication($repositoryName, $username, $password = null) { $this->authentications[$repositoryName] = array('username' => $username, 'password' => $password); } /** * {@inheritDoc} */ public function writeRaw($messages, $newline = true, $verbosity = self::NORMAL) { $this->write($messages, $newline, $verbosity); } /** * {@inheritDoc} */ public function writeErrorRaw($messages, $newline = true, $verbosity = self::NORMAL) { $this->writeError($messages, $newline, $verbosity); } /** * Check for overwrite and set the authentication information for the repository. * * @param string $repositoryName The unique name of repository * @param string $username The username * @param string $password The password */ protected function checkAndSetAuthentication($repositoryName, $username, $password = null) { if ($this->hasAuthentication($repositoryName)) { $auth = $this->getAuthentication($repositoryName); if ($auth['username'] === $username && $auth['password'] === $password) { return; } $this->writeError( sprintf( "<warning>Warning: You should avoid overwriting already defined auth settings for %s.</warning>", $repositoryName ) ); } $this->setAuthentication($repositoryName, $username, $password); } /** * {@inheritDoc} */ public function loadConfiguration(Config $config) { $bitbucketOauth = $config->get('bitbucket-oauth') ?: array(); $githubOauth = $config->get('github-oauth') ?: array(); $gitlabOauth = $config->get('gitlab-oauth') ?: array(); $gitlabToken = $config->get('gitlab-token') ?: array(); $httpBasic = $config->get('http-basic') ?: array(); $bearerToken = $config->get('bearer') ?: array(); // reload oauth tokens from config if available foreach ($bitbucketOauth as $domain => $cred) { $this->checkAndSetAuthentication($domain, $cred['consumer-key'], $cred['consumer-secret']); } foreach ($githubOauth as $domain => $token) { if (!preg_match('{^[.a-z0-9]+$}', $token)) { throw new \UnexpectedValueException('Your github oauth token for '.$domain.' contains invalid characters: "'.$token.'"'); } $this->checkAndSetAuthentication($domain, $token, 'x-oauth-basic'); } foreach ($gitlabOauth as $domain => $token) { $this->checkAndSetAuthentication($domain, $token, 'oauth2'); } foreach ($gitlabToken as $domain => $token) { $this->checkAndSetAuthentication($domain, $token, 'private-token'); } // reload http basic credentials from config if available foreach ($httpBasic as $domain => $cred) { $this->checkAndSetAuthentication($domain, $cred['username'], $cred['password']); } foreach ($bearerToken as $domain => $token) { $this->checkAndSetAuthentication($domain, $token, 'bearer'); } // setup process timeout ProcessExecutor::setTimeout((int) $config->get('process-timeout')); } /** * System is unusable. * * @param string $message * @param array $context * @return null */ public function emergency($message, array $context = array()) { return $this->log(LogLevel::EMERGENCY, $message, $context); } /** * Action must be taken immediately. * * Example: Entire website down, database unavailable, etc. This should * trigger the SMS alerts and wake you up. * * @param string $message * @param array $context * @return null */ public function alert($message, array $context = array()) { return $this->log(LogLevel::ALERT, $message, $context); } /** * Critical conditions. * * Example: Application component unavailable, unexpected exception. * * @param string $message * @param array $context * @return null */ public function critical($message, array $context = array()) { return $this->log(LogLevel::CRITICAL, $message, $context); } /** * Runtime errors that do not require immediate action but should typically * be logged and monitored. * * @param string $message * @param array $context * @return null */ public function error($message, array $context = array()) { return $this->log(LogLevel::ERROR, $message, $context); } /** * Exceptional occurrences that are not errors. * * Example: Use of deprecated APIs, poor use of an API, undesirable things * that are not necessarily wrong. * * @param string $message * @param array $context * @return null */ public function warning($message, array $context = array()) { return $this->log(LogLevel::WARNING, $message, $context); } /** * Normal but significant events. * * @param string $message * @param array $context * @return null */ public function notice($message, array $context = array()) { return $this->log(LogLevel::NOTICE, $message, $context); } /** * Interesting events. * * Example: User logs in, SQL logs. * * @param string $message * @param array $context * @return null */ public function info($message, array $context = array()) { return $this->log(LogLevel::INFO, $message, $context); } /** * Detailed debug information. * * @param string $message * @param array $context * @return null */ public function debug($message, array $context = array()) { return $this->log(LogLevel::DEBUG, $message, $context); } /** * Logs with an arbitrary level. * * @param mixed $level * @param string $message * @param array $context * @return null */ public function log($level, $message, array $context = array()) { if (in_array($level, array(LogLevel::EMERGENCY, LogLevel::ALERT, LogLevel::CRITICAL, LogLevel::ERROR))) { $this->writeError('<error>'.$message.'</error>', true, self::NORMAL); } elseif ($level === LogLevel::WARNING) { $this->writeError('<warning>'.$message.'</warning>', true, self::NORMAL); } elseif ($level === LogLevel::NOTICE) { $this->writeError('<info>'.$message.'</info>', true, self::VERBOSE); } elseif ($level === LogLevel::INFO) { $this->writeError('<info>'.$message.'</info>', true, self::VERY_VERBOSE); } else { $this->writeError($message, true, self::DEBUG); } } } composer/src/Composer/IO/NullIO.php 0000644 00000004407 14736103146 0013145 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\IO; /** * IOInterface that is not interactive and never writes the output * * @author Christophe Coevoet <stof@notk.org> */ class NullIO extends BaseIO { /** * {@inheritDoc} */ public function isInteractive() { return false; } /** * {@inheritDoc} */ public function isVerbose() { return false; } /** * {@inheritDoc} */ public function isVeryVerbose() { return false; } /** * {@inheritDoc} */ public function isDebug() { return false; } /** * {@inheritDoc} */ public function isDecorated() { return false; } /** * {@inheritDoc} */ public function write($messages, $newline = true, $verbosity = self::NORMAL) { } /** * {@inheritDoc} */ public function writeError($messages, $newline = true, $verbosity = self::NORMAL) { } /** * {@inheritDoc} */ public function overwrite($messages, $newline = true, $size = 80, $verbosity = self::NORMAL) { } /** * {@inheritDoc} */ public function overwriteError($messages, $newline = true, $size = 80, $verbosity = self::NORMAL) { } /** * {@inheritDoc} */ public function ask($question, $default = null) { return $default; } /** * {@inheritDoc} */ public function askConfirmation($question, $default = true) { return $default; } /** * {@inheritDoc} */ public function askAndValidate($question, $validator, $attempts = false, $default = null) { return $default; } /** * {@inheritDoc} */ public function askAndHideAnswer($question) { return null; } /** * {@inheritDoc} */ public function select($question, $choices, $default, $attempts = false, $errorMessage = 'Value "%s" is invalid', $multiselect = false) { return $default; } } composer/src/Composer/IO/BufferIO.php 0000644 00000005063 14736103146 0013443 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\IO; use Symfony\Component\Console\Helper\QuestionHelper; use Symfony\Component\Console\Output\StreamOutput; use Symfony\Component\Console\Formatter\OutputFormatterInterface; use Symfony\Component\Console\Input\StreamableInputInterface; use Symfony\Component\Console\Input\StringInput; use Symfony\Component\Console\Helper\HelperSet; /** * @author Jordi Boggiano <j.boggiano@seld.be> */ class BufferIO extends ConsoleIO { /** * @param string $input * @param int $verbosity * @param OutputFormatterInterface|null $formatter */ public function __construct($input = '', $verbosity = StreamOutput::VERBOSITY_NORMAL, OutputFormatterInterface $formatter = null) { $input = new StringInput($input); $input->setInteractive(false); $output = new StreamOutput(fopen('php://memory', 'rw'), $verbosity, $formatter ? $formatter->isDecorated() : false, $formatter); parent::__construct($input, $output, new HelperSet(array( new QuestionHelper(), ))); } public function getOutput() { fseek($this->output->getStream(), 0); $output = stream_get_contents($this->output->getStream()); $output = preg_replace_callback("{(?<=^|\n|\x08)(.+?)(\x08+)}", function ($matches) { $pre = strip_tags($matches[1]); if (strlen($pre) === strlen($matches[2])) { return ''; } // TODO reverse parse the string, skipping span tags and \033\[([0-9;]+)m(.*?)\033\[0m style blobs return rtrim($matches[1])."\n"; }, $output); return $output; } public function setUserInputs(array $inputs) { if (!$this->input instanceof StreamableInputInterface) { throw new \RuntimeException('Setting the user inputs requires at least the version 3.2 of the symfony/console component.'); } $this->input->setStream($this->createStream($inputs)); $this->input->setInteractive(true); } private function createStream(array $inputs) { $stream = fopen('php://memory', 'r+', false); foreach ($inputs as $input) { fwrite($stream, $input.PHP_EOL); } rewind($stream); return $stream; } } composer/src/Composer/IO/ConsoleIO.php 0000644 00000024747 14736103146 0013646 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\IO; use Composer\Question\StrictConfirmationQuestion; use Symfony\Component\Console\Helper\HelperSet; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\ConsoleOutputInterface; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Question\ChoiceQuestion; use Symfony\Component\Console\Question\Question; /** * The Input/Output helper. * * @author François Pluchino <francois.pluchino@opendisplay.com> * @author Jordi Boggiano <j.boggiano@seld.be> */ class ConsoleIO extends BaseIO { /** @var InputInterface */ protected $input; /** @var OutputInterface */ protected $output; /** @var HelperSet */ protected $helperSet; /** @var string */ protected $lastMessage; /** @var string */ protected $lastMessageErr; /** @var float */ private $startTime; /** @var array<int, int> */ private $verbosityMap; /** * Constructor. * * @param InputInterface $input The input instance * @param OutputInterface $output The output instance * @param HelperSet $helperSet The helperSet instance */ public function __construct(InputInterface $input, OutputInterface $output, HelperSet $helperSet) { $this->input = $input; $this->output = $output; $this->helperSet = $helperSet; $this->verbosityMap = array( self::QUIET => OutputInterface::VERBOSITY_QUIET, self::NORMAL => OutputInterface::VERBOSITY_NORMAL, self::VERBOSE => OutputInterface::VERBOSITY_VERBOSE, self::VERY_VERBOSE => OutputInterface::VERBOSITY_VERY_VERBOSE, self::DEBUG => OutputInterface::VERBOSITY_DEBUG, ); } /** * @param float $startTime */ public function enableDebugging($startTime) { $this->startTime = $startTime; } /** * {@inheritDoc} */ public function isInteractive() { return $this->input->isInteractive(); } /** * {@inheritDoc} */ public function isDecorated() { return $this->output->isDecorated(); } /** * {@inheritDoc} */ public function isVerbose() { return $this->output->getVerbosity() >= OutputInterface::VERBOSITY_VERBOSE; } /** * {@inheritDoc} */ public function isVeryVerbose() { return $this->output->getVerbosity() >= OutputInterface::VERBOSITY_VERY_VERBOSE; } /** * {@inheritDoc} */ public function isDebug() { return $this->output->getVerbosity() >= OutputInterface::VERBOSITY_DEBUG; } /** * {@inheritDoc} */ public function write($messages, $newline = true, $verbosity = self::NORMAL) { $this->doWrite($messages, $newline, false, $verbosity); } /** * {@inheritDoc} */ public function writeError($messages, $newline = true, $verbosity = self::NORMAL) { $this->doWrite($messages, $newline, true, $verbosity); } /** * {@inheritDoc} */ public function writeRaw($messages, $newline = true, $verbosity = self::NORMAL) { $this->doWrite($messages, $newline, false, $verbosity, true); } /** * {@inheritDoc} */ public function writeErrorRaw($messages, $newline = true, $verbosity = self::NORMAL) { $this->doWrite($messages, $newline, true, $verbosity, true); } /** * @param array|string $messages * @param bool $newline * @param bool $stderr * @param int $verbosity */ private function doWrite($messages, $newline, $stderr, $verbosity, $raw = false) { $sfVerbosity = $this->verbosityMap[$verbosity]; if ($sfVerbosity > $this->output->getVerbosity()) { return; } // hack to keep our usage BC with symfony<2.8 versions // this removes the quiet output but there is no way around it // see https://github.com/composer/composer/pull/4913 if (OutputInterface::VERBOSITY_QUIET === 0) { $sfVerbosity = OutputInterface::OUTPUT_NORMAL; } if ($raw) { if ($sfVerbosity === OutputInterface::OUTPUT_NORMAL) { $sfVerbosity = OutputInterface::OUTPUT_RAW; } else { $sfVerbosity |= OutputInterface::OUTPUT_RAW; } } if (null !== $this->startTime) { $memoryUsage = memory_get_usage() / 1024 / 1024; $timeSpent = microtime(true) - $this->startTime; $messages = array_map(function ($message) use ($memoryUsage, $timeSpent) { return sprintf('[%.1fMiB/%.2fs] %s', $memoryUsage, $timeSpent, $message); }, (array) $messages); } if (true === $stderr && $this->output instanceof ConsoleOutputInterface) { $this->output->getErrorOutput()->write($messages, $newline, $sfVerbosity); $this->lastMessageErr = implode($newline ? "\n" : '', (array) $messages); return; } $this->output->write($messages, $newline, $sfVerbosity); $this->lastMessage = implode($newline ? "\n" : '', (array) $messages); } /** * {@inheritDoc} */ public function overwrite($messages, $newline = true, $size = null, $verbosity = self::NORMAL) { $this->doOverwrite($messages, $newline, $size, false, $verbosity); } /** * {@inheritDoc} */ public function overwriteError($messages, $newline = true, $size = null, $verbosity = self::NORMAL) { $this->doOverwrite($messages, $newline, $size, true, $verbosity); } /** * @param array|string $messages * @param bool $newline * @param int|null $size * @param bool $stderr * @param int $verbosity */ private function doOverwrite($messages, $newline, $size, $stderr, $verbosity) { // messages can be an array, let's convert it to string anyway $messages = implode($newline ? "\n" : '', (array) $messages); // since overwrite is supposed to overwrite last message... if (!isset($size)) { // removing possible formatting of lastMessage with strip_tags $size = strlen(strip_tags($stderr ? $this->lastMessageErr : $this->lastMessage)); } // ...let's fill its length with backspaces $this->doWrite(str_repeat("\x08", $size), false, $stderr, $verbosity); // write the new message $this->doWrite($messages, false, $stderr, $verbosity); // In cmd.exe on Win8.1 (possibly 10?), the line can not be cleared, so we need to // track the length of previous output and fill it with spaces to make sure the line is cleared. // See https://github.com/composer/composer/pull/5836 for more details $fill = $size - strlen(strip_tags($messages)); if ($fill > 0) { // whitespace whatever has left $this->doWrite(str_repeat(' ', $fill), false, $stderr, $verbosity); // move the cursor back $this->doWrite(str_repeat("\x08", $fill), false, $stderr, $verbosity); } if ($newline) { $this->doWrite('', true, $stderr, $verbosity); } if ($stderr) { $this->lastMessageErr = $messages; } else { $this->lastMessage = $messages; } } /** * {@inheritDoc} */ public function ask($question, $default = null) { /** @var \Symfony\Component\Console\Helper\QuestionHelper $helper */ $helper = $this->helperSet->get('question'); $question = new Question($question, $default); return $helper->ask($this->input, $this->getErrorOutput(), $question); } /** * {@inheritDoc} */ public function askConfirmation($question, $default = true) { /** @var \Symfony\Component\Console\Helper\QuestionHelper $helper */ $helper = $this->helperSet->get('question'); $question = new StrictConfirmationQuestion($question, $default); return $helper->ask($this->input, $this->getErrorOutput(), $question); } /** * {@inheritDoc} */ public function askAndValidate($question, $validator, $attempts = null, $default = null) { /** @var \Symfony\Component\Console\Helper\QuestionHelper $helper */ $helper = $this->helperSet->get('question'); $question = new Question($question, $default); $question->setValidator($validator); $question->setMaxAttempts($attempts); return $helper->ask($this->input, $this->getErrorOutput(), $question); } /** * {@inheritDoc} */ public function askAndHideAnswer($question) { /** @var \Symfony\Component\Console\Helper\QuestionHelper $helper */ $helper = $this->helperSet->get('question'); $question = new Question($question); $question->setHidden(true); return $helper->ask($this->input, $this->getErrorOutput(), $question); } /** * {@inheritDoc} */ public function select($question, $choices, $default, $attempts = false, $errorMessage = 'Value "%s" is invalid', $multiselect = false) { /** @var \Symfony\Component\Console\Helper\QuestionHelper $helper */ $helper = $this->helperSet->get('question'); $question = new ChoiceQuestion($question, $choices, $default); $question->setMaxAttempts($attempts ?: null); // IOInterface requires false, and Question requires null or int $question->setErrorMessage($errorMessage); $question->setMultiselect($multiselect); $result = $helper->ask($this->input, $this->getErrorOutput(), $question); if (!is_array($result)) { return (string) array_search($result, $choices, true); } $results = array(); foreach ($choices as $index => $choice) { if (in_array($choice, $result, true)) { $results[] = (string) $index; } } return $results; } /** * @return OutputInterface */ private function getErrorOutput() { if ($this->output instanceof ConsoleOutputInterface) { return $this->output->getErrorOutput(); } return $this->output; } } composer/src/Composer/Composer.php 0000644 00000014737 14736103146 0013272 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer; use Composer\Package\RootPackageInterface; use Composer\Package\Locker; use Composer\Repository\RepositoryManager; use Composer\Installer\InstallationManager; use Composer\Plugin\PluginManager; use Composer\Downloader\DownloadManager; use Composer\EventDispatcher\EventDispatcher; use Composer\Autoload\AutoloadGenerator; use Composer\Package\Archiver\ArchiveManager; /** * @author Jordi Boggiano <j.boggiano@seld.be> * @author Konstantin Kudryashiv <ever.zet@gmail.com> * @author Nils Adermann <naderman@naderman.de> */ class Composer { /* * Examples of the following constants in the various configurations they can be in * * releases (phar): * const VERSION = '1.8.2'; * const BRANCH_ALIAS_VERSION = ''; * const RELEASE_DATE = '2019-01-29 15:00:53'; * const SOURCE_VERSION = ''; * * snapshot builds (phar): * const VERSION = 'd3873a05650e168251067d9648845c220c50e2d7'; * const BRANCH_ALIAS_VERSION = '1.9-dev'; * const RELEASE_DATE = '2019-02-20 07:43:56'; * const SOURCE_VERSION = ''; * * source (git clone): * const VERSION = '1.10.6'; * const BRANCH_ALIAS_VERSION = ''; * const RELEASE_DATE = '2020-05-06 10:28:10'; * const SOURCE_VERSION = '1.8-dev+source'; */ const VERSION = '1.10.6'; const BRANCH_ALIAS_VERSION = ''; const RELEASE_DATE = '2020-05-06 10:28:10'; const SOURCE_VERSION = '1.10-dev+source'; /** * Version number of the internal composer-runtime-api package * * This is used to version features available to projects at runtime * like the platform-check file, the Composer\InstalledVersions class * and possibly others in the future. * * @var string */ const RUNTIME_API_VERSION = '1.0.0'; public static function getVersion() { // no replacement done, this must be a source checkout if (self::VERSION === '@package_version'.'@') { return self::SOURCE_VERSION; } // we have a branch alias and version is a commit id, this must be a snapshot build if (self::BRANCH_ALIAS_VERSION !== '' && preg_match('{^[a-f0-9]{40}$}', self::VERSION)) { return self::BRANCH_ALIAS_VERSION.'+'.self::VERSION; } return self::VERSION; } /** * @var Package\RootPackageInterface */ private $package; /** * @var Locker */ private $locker; /** * @var Repository\RepositoryManager */ private $repositoryManager; /** * @var Downloader\DownloadManager */ private $downloadManager; /** * @var Installer\InstallationManager */ private $installationManager; /** * @var Plugin\PluginManager */ private $pluginManager; /** * @var Config */ private $config; /** * @var EventDispatcher */ private $eventDispatcher; /** * @var Autoload\AutoloadGenerator */ private $autoloadGenerator; /** * @var ArchiveManager */ private $archiveManager; /** * @param Package\RootPackageInterface $package * @return void */ public function setPackage(RootPackageInterface $package) { $this->package = $package; } /** * @return Package\RootPackageInterface */ public function getPackage() { return $this->package; } /** * @param Config $config */ public function setConfig(Config $config) { $this->config = $config; } /** * @return Config */ public function getConfig() { return $this->config; } /** * @param Package\Locker $locker */ public function setLocker(Locker $locker) { $this->locker = $locker; } /** * @return Package\Locker */ public function getLocker() { return $this->locker; } /** * @param Repository\RepositoryManager $manager */ public function setRepositoryManager(RepositoryManager $manager) { $this->repositoryManager = $manager; } /** * @return Repository\RepositoryManager */ public function getRepositoryManager() { return $this->repositoryManager; } /** * @param Downloader\DownloadManager $manager */ public function setDownloadManager(DownloadManager $manager) { $this->downloadManager = $manager; } /** * @return Downloader\DownloadManager */ public function getDownloadManager() { return $this->downloadManager; } /** * @param ArchiveManager $manager */ public function setArchiveManager(ArchiveManager $manager) { $this->archiveManager = $manager; } /** * @return ArchiveManager */ public function getArchiveManager() { return $this->archiveManager; } /** * @param Installer\InstallationManager $manager */ public function setInstallationManager(InstallationManager $manager) { $this->installationManager = $manager; } /** * @return Installer\InstallationManager */ public function getInstallationManager() { return $this->installationManager; } /** * @param Plugin\PluginManager $manager */ public function setPluginManager(PluginManager $manager) { $this->pluginManager = $manager; } /** * @return Plugin\PluginManager */ public function getPluginManager() { return $this->pluginManager; } /** * @param EventDispatcher $eventDispatcher */ public function setEventDispatcher(EventDispatcher $eventDispatcher) { $this->eventDispatcher = $eventDispatcher; } /** * @return EventDispatcher */ public function getEventDispatcher() { return $this->eventDispatcher; } /** * @param Autoload\AutoloadGenerator $autoloadGenerator */ public function setAutoloadGenerator(AutoloadGenerator $autoloadGenerator) { $this->autoloadGenerator = $autoloadGenerator; } /** * @return Autoload\AutoloadGenerator */ public function getAutoloadGenerator() { return $this->autoloadGenerator; } } composer/src/Composer/Json/JsonValidationException.php 0000644 00000001300 14736103146 0017175 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Json; use Exception; /** * @author Jordi Boggiano <j.boggiano@seld.be> */ class JsonValidationException extends Exception { protected $errors; public function __construct($message, $errors = array(), Exception $previous = null) { $this->errors = $errors; parent::__construct($message, 0, $previous); } public function getErrors() { return $this->errors; } } composer/src/Composer/Json/JsonManipulator.php 0000644 00000046407 14736103146 0015540 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Json; use Composer\Repository\PlatformRepository; /** * @author Jordi Boggiano <j.boggiano@seld.be> */ class JsonManipulator { private static $DEFINES = '(?(DEFINE) (?<number> -? (?= [1-9]|0(?!\d) ) \d+ (\.\d+)? ([eE] [+-]? \d+)? ) (?<boolean> true | false | null ) (?<string> " ([^"\\\\]* | \\\\ ["\\\\bfnrt\/] | \\\\ u [0-9A-Fa-f]{4} )* " ) (?<array> \[ (?: (?&json) \s* (?: , (?&json) \s* )* )? \s* \] ) (?<pair> \s* (?&string) \s* : (?&json) \s* ) (?<object> \{ (?: (?&pair) (?: , (?&pair) )* )? \s* \} ) (?<json> \s* (?: (?&number) | (?&boolean) | (?&string) | (?&array) | (?&object) ) ) )'; private $contents; private $newline; private $indent; public function __construct($contents) { $contents = trim($contents); if ($contents === '') { $contents = '{}'; } if (!$this->pregMatch('#^\{(.*)\}$#s', $contents)) { throw new \InvalidArgumentException('The json file must be an object ({})'); } $this->newline = false !== strpos($contents, "\r\n") ? "\r\n" : "\n"; $this->contents = $contents === '{}' ? '{' . $this->newline . '}' : $contents; $this->detectIndenting(); } public function getContents() { return $this->contents . $this->newline; } public function addLink($type, $package, $constraint, $sortPackages = false) { $decoded = JsonFile::parseJson($this->contents); // no link of that type yet if (!isset($decoded[$type])) { return $this->addMainKey($type, array($package => $constraint)); } $regex = '{'.self::$DEFINES.'^(?P<start>\s*\{\s*(?:(?&string)\s*:\s*(?&json)\s*,\s*)*?)'. '(?P<property>'.preg_quote(JsonFile::encode($type)).'\s*:\s*)(?P<value>(?&json))(?P<end>.*)}sx'; if (!$this->pregMatch($regex, $this->contents, $matches)) { return false; } $links = $matches['value']; // try to find existing link $packageRegex = str_replace('/', '\\\\?/', preg_quote($package)); $regex = '{'.self::$DEFINES.'"(?P<package>'.$packageRegex.')"(\s*:\s*)(?&string)}ix'; if ($this->pregMatch($regex, $links, $packageMatches)) { // update existing link $existingPackage = $packageMatches['package']; $packageRegex = str_replace('/', '\\\\?/', preg_quote($existingPackage)); $links = preg_replace_callback('{'.self::$DEFINES.'"'.$packageRegex.'"(?P<separator>\s*:\s*)(?&string)}ix', function ($m) use ($existingPackage, $constraint) { return JsonFile::encode(str_replace('\\/', '/', $existingPackage)) . $m['separator'] . '"' . $constraint . '"'; }, $links); } else { if ($this->pregMatch('#^\s*\{\s*\S+.*?(\s*\}\s*)$#s', $links, $match)) { // link missing but non empty links $links = preg_replace( '{'.preg_quote($match[1]).'$}', // addcslashes is used to double up backslashes/$ since preg_replace resolves them as back references otherwise, see #1588 addcslashes(',' . $this->newline . $this->indent . $this->indent . JsonFile::encode($package).': '.JsonFile::encode($constraint) . $match[1], '\\$'), $links ); } else { // links empty $links = '{' . $this->newline . $this->indent . $this->indent . JsonFile::encode($package).': '.JsonFile::encode($constraint) . $this->newline . $this->indent . '}'; } } if (true === $sortPackages) { $requirements = json_decode($links, true); $this->sortPackages($requirements); $links = $this->format($requirements); } $this->contents = $matches['start'] . $matches['property'] . $links . $matches['end']; return true; } /** * Sorts packages by importance (platform packages first, then PHP dependencies) and alphabetically. * * @link https://getcomposer.org/doc/02-libraries.md#platform-packages * * @param array $packages */ private function sortPackages(array &$packages = array()) { $prefix = function ($requirement) { if (preg_match(PlatformRepository::PLATFORM_PACKAGE_REGEX, $requirement)) { return preg_replace( array( '/^php/', '/^hhvm/', '/^ext/', '/^lib/', '/^\D/', ), array( '0-$0', '1-$0', '2-$0', '3-$0', '4-$0', ), $requirement ); } return '5-'.$requirement; }; uksort($packages, function ($a, $b) use ($prefix) { return strnatcmp($prefix($a), $prefix($b)); }); } public function addRepository($name, $config) { return $this->addSubNode('repositories', $name, $config); } public function removeRepository($name) { return $this->removeSubNode('repositories', $name); } public function addConfigSetting($name, $value) { return $this->addSubNode('config', $name, $value); } public function removeConfigSetting($name) { return $this->removeSubNode('config', $name); } public function addProperty($name, $value) { if (substr($name, 0, 8) === 'suggest.') { return $this->addSubNode('suggest', substr($name, 8), $value); } if (substr($name, 0, 6) === 'extra.') { return $this->addSubNode('extra', substr($name, 6), $value); } if (substr($name, 0, 8) === 'scripts.') { return $this->addSubNode('scripts', substr($name, 8), $value); } return $this->addMainKey($name, $value); } public function removeProperty($name) { if (substr($name, 0, 8) === 'suggest.') { return $this->removeSubNode('suggest', substr($name, 8)); } if (substr($name, 0, 6) === 'extra.') { return $this->removeSubNode('extra', substr($name, 6)); } if (substr($name, 0, 8) === 'scripts.') { return $this->removeSubNode('scripts', substr($name, 8)); } return $this->removeMainKey($name); } public function addSubNode($mainNode, $name, $value) { $decoded = JsonFile::parseJson($this->contents); $subName = null; if (in_array($mainNode, array('config', 'extra', 'scripts')) && false !== strpos($name, '.')) { list($name, $subName) = explode('.', $name, 2); } // no main node yet if (!isset($decoded[$mainNode])) { if ($subName !== null) { $this->addMainKey($mainNode, array($name => array($subName => $value))); } else { $this->addMainKey($mainNode, array($name => $value)); } return true; } // main node content not match-able $nodeRegex = '{'.self::$DEFINES.'^(?P<start> \s* \{ \s* (?: (?&string) \s* : (?&json) \s* , \s* )*?'. preg_quote(JsonFile::encode($mainNode)).'\s*:\s*)(?P<content>(?&object))(?P<end>.*)}sx'; try { if (!$this->pregMatch($nodeRegex, $this->contents, $match)) { return false; } } catch (\RuntimeException $e) { if ($e->getCode() === PREG_BACKTRACK_LIMIT_ERROR) { return false; } throw $e; } $children = $match['content']; // invalid match due to un-regexable content, abort if (!@json_decode($children)) { return false; } $that = $this; // child exists $childRegex = '{'.self::$DEFINES.'(?P<start>"'.preg_quote($name).'"\s*:\s*)(?P<content>(?&json))(?P<end>,?)}x'; if ($this->pregMatch($childRegex, $children, $matches)) { $children = preg_replace_callback($childRegex, function ($matches) use ($subName, $value, $that) { if ($subName !== null) { $curVal = json_decode($matches['content'], true); if (!is_array($curVal)) { $curVal = array(); } $curVal[$subName] = $value; $value = $curVal; } return $matches['start'] . $that->format($value, 1) . $matches['end']; }, $children); } else { $this->pregMatch('#^{ \s*? (?P<content>\S+.*?)? (?P<trailingspace>\s*) }$#sx', $children, $match); $whitespace = ''; if (!empty($match['trailingspace'])) { $whitespace = $match['trailingspace']; } if (!empty($match['content'])) { if ($subName !== null) { $value = array($subName => $value); } // child missing but non empty children $children = preg_replace( '#'.$whitespace.'}$#', addcslashes(',' . $this->newline . $this->indent . $this->indent . JsonFile::encode($name).': '.$this->format($value, 1) . $whitespace . '}', '\\$'), $children ); } else { if ($subName !== null) { $value = array($subName => $value); } // children present but empty $children = '{' . $this->newline . $this->indent . $this->indent . JsonFile::encode($name).': '.$this->format($value, 1) . $whitespace . '}'; } } $this->contents = preg_replace_callback($nodeRegex, function ($m) use ($children) { return $m['start'] . $children . $m['end']; }, $this->contents); return true; } public function removeSubNode($mainNode, $name) { $decoded = JsonFile::parseJson($this->contents); // no node or empty node if (empty($decoded[$mainNode])) { return true; } // no node content match-able $nodeRegex = '{'.self::$DEFINES.'^(?P<start> \s* \{ \s* (?: (?&string) \s* : (?&json) \s* , \s* )*?'. preg_quote(JsonFile::encode($mainNode)).'\s*:\s*)(?P<content>(?&object))(?P<end>.*)}sx'; try { if (!$this->pregMatch($nodeRegex, $this->contents, $match)) { return false; } } catch (\RuntimeException $e) { if ($e->getCode() === PREG_BACKTRACK_LIMIT_ERROR) { return false; } throw $e; } $children = $match['content']; // invalid match due to un-regexable content, abort if (!@json_decode($children, true)) { return false; } $subName = null; if (in_array($mainNode, array('config', 'extra', 'scripts')) && false !== strpos($name, '.')) { list($name, $subName) = explode('.', $name, 2); } // no node to remove if (!isset($decoded[$mainNode][$name]) || ($subName && !isset($decoded[$mainNode][$name][$subName]))) { return true; } // try and find a match for the subkey $keyRegex = str_replace('/', '\\\\?/', preg_quote($name)); if ($this->pregMatch('{"'.$keyRegex.'"\s*:}i', $children)) { // find best match for the value of "name" if (preg_match_all('{'.self::$DEFINES.'"'.$keyRegex.'"\s*:\s*(?:(?&json))}x', $children, $matches)) { $bestMatch = ''; foreach ($matches[0] as $match) { if (strlen($bestMatch) < strlen($match)) { $bestMatch = $match; } } $childrenClean = preg_replace('{,\s*'.preg_quote($bestMatch).'}i', '', $children, -1, $count); if (1 !== $count) { $childrenClean = preg_replace('{'.preg_quote($bestMatch).'\s*,?\s*}i', '', $childrenClean, -1, $count); if (1 !== $count) { return false; } } } } else { $childrenClean = $children; } // no child data left, $name was the only key in $this->pregMatch('#^{ \s*? (?P<content>\S+.*?)? (?P<trailingspace>\s*) }$#sx', $childrenClean, $match); if (empty($match['content'])) { $newline = $this->newline; $indent = $this->indent; $this->contents = preg_replace_callback($nodeRegex, function ($matches) use ($indent, $newline) { return $matches['start'] . '{' . $newline . $indent . '}' . $matches['end']; }, $this->contents); // we have a subname, so we restore the rest of $name if ($subName !== null) { $curVal = json_decode($children, true); unset($curVal[$name][$subName]); $this->addSubNode($mainNode, $name, $curVal[$name]); } return true; } $that = $this; $this->contents = preg_replace_callback($nodeRegex, function ($matches) use ($that, $name, $subName, $childrenClean) { if ($subName !== null) { $curVal = json_decode($matches['content'], true); unset($curVal[$name][$subName]); $childrenClean = $that->format($curVal, 0); } return $matches['start'] . $childrenClean . $matches['end']; }, $this->contents); return true; } public function addMainKey($key, $content) { $decoded = JsonFile::parseJson($this->contents); $content = $this->format($content); // key exists already $regex = '{'.self::$DEFINES.'^(?P<start>\s*\{\s*(?:(?&string)\s*:\s*(?&json)\s*,\s*)*?)'. '(?P<key>'.preg_quote(JsonFile::encode($key)).'\s*:\s*(?&json))(?P<end>.*)}sx'; if (isset($decoded[$key]) && $this->pregMatch($regex, $this->contents, $matches)) { // invalid match due to un-regexable content, abort if (!@json_decode('{'.$matches['key'].'}')) { return false; } $this->contents = $matches['start'] . JsonFile::encode($key).': '.$content . $matches['end']; return true; } // append at the end of the file and keep whitespace if ($this->pregMatch('#[^{\s](\s*)\}$#', $this->contents, $match)) { $this->contents = preg_replace( '#'.$match[1].'\}$#', addcslashes(',' . $this->newline . $this->indent . JsonFile::encode($key). ': '. $content . $this->newline . '}', '\\$'), $this->contents ); return true; } // append at the end of the file $this->contents = preg_replace( '#\}$#', addcslashes($this->indent . JsonFile::encode($key). ': '.$content . $this->newline . '}', '\\$'), $this->contents ); return true; } public function removeMainKey($key) { $decoded = JsonFile::parseJson($this->contents); if (!array_key_exists($key, $decoded)) { return true; } // key exists already $regex = '{'.self::$DEFINES.'^(?P<start>\s*\{\s*(?:(?&string)\s*:\s*(?&json)\s*,\s*)*?)'. '(?P<removal>'.preg_quote(JsonFile::encode($key)).'\s*:\s*(?&json))\s*,?\s*(?P<end>.*)}sx'; if ($this->pregMatch($regex, $this->contents, $matches)) { // invalid match due to un-regexable content, abort if (!@json_decode('{'.$matches['removal'].'}')) { return false; } // check that we are not leaving a dangling comma on the previous line if the last line was removed if (preg_match('#,\s*$#', $matches['start']) && preg_match('#^\}$#', $matches['end'])) { $matches['start'] = rtrim(preg_replace('#,(\s*)$#', '$1', $matches['start']), $this->indent); } $this->contents = $matches['start'] . $matches['end']; if (preg_match('#^\{\s*\}\s*$#', $this->contents)) { $this->contents = "{\n}"; } return true; } return false; } public function format($data, $depth = 0) { if (is_array($data)) { reset($data); if (is_numeric(key($data))) { foreach ($data as $key => $val) { $data[$key] = $this->format($val, $depth + 1); } return '['.implode(', ', $data).']'; } $out = '{' . $this->newline; $elems = array(); foreach ($data as $key => $val) { $elems[] = str_repeat($this->indent, $depth + 2) . JsonFile::encode($key). ': '.$this->format($val, $depth + 1); } return $out . implode(','.$this->newline, $elems) . $this->newline . str_repeat($this->indent, $depth + 1) . '}'; } return JsonFile::encode($data); } protected function detectIndenting() { if ($this->pregMatch('{^([ \t]+)"}m', $this->contents, $match)) { $this->indent = $match[1]; } else { $this->indent = ' '; } } protected function pregMatch($re, $str, &$matches = array()) { $count = preg_match($re, $str, $matches); if ($count === false) { switch (preg_last_error()) { case PREG_NO_ERROR: throw new \RuntimeException('Failed to execute regex: PREG_NO_ERROR', PREG_NO_ERROR); case PREG_INTERNAL_ERROR: throw new \RuntimeException('Failed to execute regex: PREG_INTERNAL_ERROR', PREG_INTERNAL_ERROR); case PREG_BACKTRACK_LIMIT_ERROR: throw new \RuntimeException('Failed to execute regex: PREG_BACKTRACK_LIMIT_ERROR', PREG_BACKTRACK_LIMIT_ERROR); case PREG_RECURSION_LIMIT_ERROR: throw new \RuntimeException('Failed to execute regex: PREG_RECURSION_LIMIT_ERROR', PREG_RECURSION_LIMIT_ERROR); case PREG_BAD_UTF8_ERROR: throw new \RuntimeException('Failed to execute regex: PREG_BAD_UTF8_ERROR', PREG_BAD_UTF8_ERROR); case PREG_BAD_UTF8_OFFSET_ERROR: throw new \RuntimeException('Failed to execute regex: PREG_BAD_UTF8_OFFSET_ERROR', PREG_BAD_UTF8_OFFSET_ERROR); case 6: // PREG_JIT_STACKLIMIT_ERROR if (PHP_VERSION_ID > 70000) { throw new \RuntimeException('Failed to execute regex: PREG_JIT_STACKLIMIT_ERROR', 6); } // no break default: throw new \RuntimeException('Failed to execute regex: Unknown error'); } } return $count; } } composer/src/Composer/Json/JsonFile.php 0000644 00000023516 14736103146 0014120 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Json; use JsonSchema\Validator; use Seld\JsonLint\JsonParser; use Seld\JsonLint\ParsingException; use Composer\Util\RemoteFilesystem; use Composer\IO\IOInterface; use Composer\Downloader\TransportException; /** * Reads/writes json files. * * @author Konstantin Kudryashiv <ever.zet@gmail.com> * @author Jordi Boggiano <j.boggiano@seld.be> */ class JsonFile { const LAX_SCHEMA = 1; const STRICT_SCHEMA = 2; const JSON_UNESCAPED_SLASHES = 64; const JSON_PRETTY_PRINT = 128; const JSON_UNESCAPED_UNICODE = 256; const COMPOSER_SCHEMA_PATH = '/../../../res/composer-schema.json'; private $path; private $rfs; private $io; /** * Initializes json file reader/parser. * * @param string $path path to a lockfile * @param RemoteFilesystem $rfs required for loading http/https json files * @param IOInterface $io * @throws \InvalidArgumentException */ public function __construct($path, RemoteFilesystem $rfs = null, IOInterface $io = null) { $this->path = $path; if (null === $rfs && preg_match('{^https?://}i', $path)) { throw new \InvalidArgumentException('http urls require a RemoteFilesystem instance to be passed'); } $this->rfs = $rfs; $this->io = $io; } /** * @return string */ public function getPath() { return $this->path; } /** * Checks whether json file exists. * * @return bool */ public function exists() { return is_file($this->path); } /** * Reads json file. * * @throws \RuntimeException * @return mixed */ public function read() { try { if ($this->rfs) { $json = $this->rfs->getContents($this->path, $this->path, false); } else { if ($this->io && $this->io->isDebug()) { $this->io->writeError('Reading ' . $this->path); } $json = file_get_contents($this->path); } } catch (TransportException $e) { throw new \RuntimeException($e->getMessage(), 0, $e); } catch (\Exception $e) { throw new \RuntimeException('Could not read '.$this->path."\n\n".$e->getMessage()); } return static::parseJson($json, $this->path); } /** * Writes json file. * * @param array $hash writes hash into json file * @param int $options json_encode options (defaults to JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) * @throws \UnexpectedValueException|\Exception */ public function write(array $hash, $options = 448) { $dir = dirname($this->path); if (!is_dir($dir)) { if (file_exists($dir)) { throw new \UnexpectedValueException( $dir.' exists and is not a directory.' ); } if (!@mkdir($dir, 0777, true)) { throw new \UnexpectedValueException( $dir.' does not exist and could not be created.' ); } } $retries = 3; while ($retries--) { try { $this->filePutContentsIfModified($this->path, static::encode($hash, $options). ($options & self::JSON_PRETTY_PRINT ? "\n" : '')); break; } catch (\Exception $e) { if ($retries) { usleep(500000); continue; } throw $e; } } } /** * modify file properties only if content modified */ private function filePutContentsIfModified($path, $content) { $currentContent = @file_get_contents($path); if (!$currentContent || ($currentContent != $content)) { return file_put_contents($path, $content); } return 0; } /** * Validates the schema of the current json file according to composer-schema.json rules * * @param int $schema a JsonFile::*_SCHEMA constant * @param string|null $schemaFile a path to the schema file * @throws JsonValidationException * @return bool true on success */ public function validateSchema($schema = self::STRICT_SCHEMA, $schemaFile = null) { $content = file_get_contents($this->path); $data = json_decode($content); if (null === $data && 'null' !== $content) { self::validateSyntax($content, $this->path); } if (null === $schemaFile) { $schemaFile = __DIR__ . self::COMPOSER_SCHEMA_PATH; } // Prepend with file:// only when not using a special schema already (e.g. in the phar) if (false === strpos($schemaFile, '://')) { $schemaFile = 'file://' . $schemaFile; } $schemaData = (object) array('$ref' => $schemaFile); if ($schema === self::LAX_SCHEMA) { $schemaData->additionalProperties = true; $schemaData->required = array(); } $validator = new Validator(); $validator->check($data, $schemaData); // TODO add more validation like check version constraints and such, perhaps build that into the arrayloader? if (!$validator->isValid()) { $errors = array(); foreach ((array) $validator->getErrors() as $error) { $errors[] = ($error['property'] ? $error['property'].' : ' : '').$error['message']; } throw new JsonValidationException('"'.$this->path.'" does not match the expected JSON schema', $errors); } return true; } /** * Encodes an array into (optionally pretty-printed) JSON * * @param mixed $data Data to encode into a formatted JSON string * @param int $options json_encode options (defaults to JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) * @return string Encoded json */ public static function encode($data, $options = 448) { if (PHP_VERSION_ID >= 50400) { $json = json_encode($data, $options); if (false === $json) { self::throwEncodeError(json_last_error()); } // compact brackets to follow recent php versions if (PHP_VERSION_ID < 50428 || (PHP_VERSION_ID >= 50500 && PHP_VERSION_ID < 50512) || (defined('JSON_C_VERSION') && version_compare(phpversion('json'), '1.3.6', '<'))) { $json = preg_replace('/\[\s+\]/', '[]', $json); $json = preg_replace('/\{\s+\}/', '{}', $json); } return $json; } $json = json_encode($data); if (false === $json) { self::throwEncodeError(json_last_error()); } $prettyPrint = (bool) ($options & self::JSON_PRETTY_PRINT); $unescapeUnicode = (bool) ($options & self::JSON_UNESCAPED_UNICODE); $unescapeSlashes = (bool) ($options & self::JSON_UNESCAPED_SLASHES); if (!$prettyPrint && !$unescapeUnicode && !$unescapeSlashes) { return $json; } return JsonFormatter::format($json, $unescapeUnicode, $unescapeSlashes); } /** * Throws an exception according to a given code with a customized message * * @param int $code return code of json_last_error function * @throws \RuntimeException */ private static function throwEncodeError($code) { switch ($code) { case JSON_ERROR_DEPTH: $msg = 'Maximum stack depth exceeded'; break; case JSON_ERROR_STATE_MISMATCH: $msg = 'Underflow or the modes mismatch'; break; case JSON_ERROR_CTRL_CHAR: $msg = 'Unexpected control character found'; break; case JSON_ERROR_UTF8: $msg = 'Malformed UTF-8 characters, possibly incorrectly encoded'; break; default: $msg = 'Unknown error'; } throw new \RuntimeException('JSON encoding failed: '.$msg); } /** * Parses json string and returns hash. * * @param string $json json string * @param string $file the json file * * @return mixed */ public static function parseJson($json, $file = null) { if (null === $json) { return; } $data = json_decode($json, true); if (null === $data && JSON_ERROR_NONE !== json_last_error()) { self::validateSyntax($json, $file); } return $data; } /** * Validates the syntax of a JSON string * * @param string $json * @param string $file * @throws \UnexpectedValueException * @throws ParsingException * @return bool true on success */ protected static function validateSyntax($json, $file = null) { $parser = new JsonParser(); $result = $parser->lint($json); if (null === $result) { if (defined('JSON_ERROR_UTF8') && JSON_ERROR_UTF8 === json_last_error()) { throw new \UnexpectedValueException('"'.$file.'" is not UTF-8, could not parse as JSON'); } return true; } throw new ParsingException('"'.$file.'" does not contain valid JSON'."\n".$result->getMessage(), $result->getDetails()); } } composer/src/Composer/Json/JsonFormatter.php 0000644 00000010631 14736103146 0015176 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Json; /** * Formats json strings used for php < 5.4 because the json_encode doesn't * supports the flags JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE * in these versions * * @author Konstantin Kudryashiv <ever.zet@gmail.com> * @author Jordi Boggiano <j.boggiano@seld.be> */ class JsonFormatter { /** * This code is based on the function found at: * http://recursive-design.com/blog/2008/03/11/format-json-with-php/ * * Originally licensed under MIT by Dave Perrett <mail@recursive-design.com> * * * @param string $json * @param bool $unescapeUnicode Un escape unicode * @param bool $unescapeSlashes Un escape slashes * @return string */ public static function format($json, $unescapeUnicode, $unescapeSlashes) { $result = ''; $pos = 0; $strLen = strlen($json); $indentStr = ' '; $newLine = "\n"; $outOfQuotes = true; $buffer = ''; $noescape = true; for ($i = 0; $i < $strLen; $i++) { // Grab the next character in the string $char = substr($json, $i, 1); // Are we inside a quoted string? if ('"' === $char && $noescape) { $outOfQuotes = !$outOfQuotes; } if (!$outOfQuotes) { $buffer .= $char; $noescape = '\\' === $char ? !$noescape : true; continue; } elseif ('' !== $buffer) { if ($unescapeSlashes) { $buffer = str_replace('\\/', '/', $buffer); } if ($unescapeUnicode && function_exists('mb_convert_encoding')) { // https://stackoverflow.com/questions/2934563/how-to-decode-unicode-escape-sequences-like-u00ed-to-proper-utf-8-encoded-cha $buffer = preg_replace_callback('/(\\\\+)u([0-9a-f]{4})/i', function ($match) { $l = strlen($match[1]); if ($l % 2) { $code = hexdec($match[2]); // 0xD800..0xDFFF denotes UTF-16 surrogate pair which won't be unescaped // see https://github.com/composer/composer/issues/7510 if (0xD800 <= $code && 0xDFFF >= $code) { return $match[0]; } return str_repeat('\\', $l - 1) . mb_convert_encoding( pack('H*', $match[2]), 'UTF-8', 'UCS-2BE' ); } return $match[0]; }, $buffer); } $result .= $buffer.$char; $buffer = ''; continue; } if (':' === $char) { // Add a space after the : character $char .= ' '; } elseif ('}' === $char || ']' === $char) { $pos--; $prevChar = substr($json, $i - 1, 1); if ('{' !== $prevChar && '[' !== $prevChar) { // If this character is the end of an element, // output a new line and indent the next line $result .= $newLine; for ($j = 0; $j < $pos; $j++) { $result .= $indentStr; } } else { // Collapse empty {} and [] $result = rtrim($result); } } $result .= $char; // If the last character was the beginning of an element, // output a new line and indent the next line if (',' === $char || '{' === $char || '[' === $char) { $result .= $newLine; if ('{' === $char || '[' === $char) { $pos++; } for ($j = 0; $j < $pos; $j++) { $result .= $indentStr; } } } return $result; } } composer/src/Composer/Script/PackageEvent.php 0000644 00000000757 14736103146 0015301 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Script; use Composer\Installer\PackageEvent as BasePackageEvent; /** * The Package Event. * * @deprecated Use Composer\Installer\PackageEvent instead */ class PackageEvent extends BasePackageEvent { } composer/src/Composer/Script/ScriptEvents.php 0000644 00000013253 14736103146 0015370 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Script; /** * The Script Events. * * @author François Pluchino <francois.pluchino@opendisplay.com> * @author Jordi Boggiano <j.boggiano@seld.be> */ class ScriptEvents { /** * The PRE_INSTALL_CMD event occurs before the install command is executed. * * The event listener method receives a Composer\Script\Event instance. * * @var string */ const PRE_INSTALL_CMD = 'pre-install-cmd'; /** * The POST_INSTALL_CMD event occurs after the install command is executed. * * The event listener method receives a Composer\Script\Event instance. * * @var string */ const POST_INSTALL_CMD = 'post-install-cmd'; /** * The PRE_UPDATE_CMD event occurs before the update command is executed. * * The event listener method receives a Composer\Script\Event instance. * * @var string */ const PRE_UPDATE_CMD = 'pre-update-cmd'; /** * The POST_UPDATE_CMD event occurs after the update command is executed. * * The event listener method receives a Composer\Script\Event instance. * * @var string */ const POST_UPDATE_CMD = 'post-update-cmd'; /** * The PRE_STATUS_CMD event occurs before the status command is executed. * * The event listener method receives a Composer\Script\Event instance. * * @var string */ const PRE_STATUS_CMD = 'pre-status-cmd'; /** * The POST_STATUS_CMD event occurs after the status command is executed. * * The event listener method receives a Composer\Script\Event instance. * * @var string */ const POST_STATUS_CMD = 'post-status-cmd'; /** * The PRE_AUTOLOAD_DUMP event occurs before the autoload file is generated. * * The event listener method receives a Composer\Script\Event instance. * * @var string */ const PRE_AUTOLOAD_DUMP = 'pre-autoload-dump'; /** * The POST_AUTOLOAD_DUMP event occurs after the autoload file has been generated. * * The event listener method receives a Composer\Script\Event instance. * * @var string */ const POST_AUTOLOAD_DUMP = 'post-autoload-dump'; /** * The POST_ROOT_PACKAGE_INSTALL event occurs after the root package has been installed. * * The event listener method receives a Composer\Script\Event instance. * * @var string */ const POST_ROOT_PACKAGE_INSTALL = 'post-root-package-install'; /** * The POST_CREATE_PROJECT event occurs after the create-project command has been executed. * Note: Event occurs after POST_INSTALL_CMD * * The event listener method receives a Composer\Script\Event instance. * * @var string */ const POST_CREATE_PROJECT_CMD = 'post-create-project-cmd'; /** * The PRE_ARCHIVE_CMD event occurs before the update command is executed. * * The event listener method receives a Composer\Script\Event instance. * * @var string */ const PRE_ARCHIVE_CMD = 'pre-archive-cmd'; /** * The POST_ARCHIVE_CMD event occurs after the status command is executed. * * The event listener method receives a Composer\Script\Event instance. * * @var string */ const POST_ARCHIVE_CMD = 'post-archive-cmd'; /** Deprecated constants below */ /** * The PRE_PACKAGE_INSTALL event occurs before a package is installed. * * The event listener method receives a Composer\Installer\PackageEvent instance. * * @deprecated Use Composer\Installer\PackageEvents::PRE_PACKAGE_INSTALL instead. * @var string */ const PRE_PACKAGE_INSTALL = 'pre-package-install'; /** * The POST_PACKAGE_INSTALL event occurs after a package is installed. * * The event listener method receives a Composer\Installer\PackageEvent instance. * * @deprecated Use Composer\Installer\PackageEvents::POST_PACKAGE_INSTALL instead. * @var string */ const POST_PACKAGE_INSTALL = 'post-package-install'; /** * The PRE_PACKAGE_UPDATE event occurs before a package is updated. * * The event listener method receives a Composer\Installer\PackageEvent instance. * * @deprecated Use Composer\Installer\PackageEvents::PRE_PACKAGE_UPDATE instead. * @var string */ const PRE_PACKAGE_UPDATE = 'pre-package-update'; /** * The POST_PACKAGE_UPDATE event occurs after a package is updated. * * The event listener method receives a Composer\Installer\PackageEvent instance. * * @deprecated Use Composer\Installer\PackageEvents::POST_PACKAGE_UPDATE instead. * @var string */ const POST_PACKAGE_UPDATE = 'post-package-update'; /** * The PRE_PACKAGE_UNINSTALL event occurs before a package has been uninstalled. * * The event listener method receives a Composer\Installer\PackageEvent instance. * * @deprecated Use Composer\Installer\PackageEvents::PRE_PACKAGE_UNINSTALL instead. * @var string */ const PRE_PACKAGE_UNINSTALL = 'pre-package-uninstall'; /** * The POST_PACKAGE_UNINSTALL event occurs after a package has been uninstalled. * * The event listener method receives a Composer\Installer\PackageEvent instance. * * @deprecated Use Composer\Installer\PackageEvents::POST_PACKAGE_UNINSTALL instead. * @var string */ const POST_PACKAGE_UNINSTALL = 'post-package-uninstall'; } composer/src/Composer/Script/CommandEvent.php 0000644 00000000640 14736103146 0015313 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Script; /** * The Command Event. * * @deprecated use Composer\Script\Event instead */ class CommandEvent extends Event { } composer/src/Composer/Script/Event.php 0000644 00000005754 14736103146 0014027 0 ustar 00 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Script; use Composer\Composer; use Composer\IO\IOInterface; use Composer\EventDispatcher\Event as BaseEvent; /** * The script event class * * @author François Pluchino <francois.pluchino@opendisplay.com> * @author Nils Adermann <naderman@naderman.de> */ class Event extends BaseEvent { /** * @var Composer The composer instance */ private $composer; /** * @var IOInterface The IO instance */ private $io; /** * @var bool Dev mode flag */ private $devMode; /** * @var BaseEvent */ private $originatingEvent; /** * Constructor. * * @param string $name The event name * @param Composer $composer The composer object * @param IOInterface $io The IOInterface object * @param bool $devMode Whether or not we are in dev mode * @param array $args Arguments passed by the user * @param array $flags Optional flags to pass data not as argument */ public function __construct($name, Composer $composer, IOInterface $io, $devMode = false, array $args = array(), array $flags = array()) { parent::__construct($name, $args, $flags); $this->composer = $composer; $this->io = $io; $this->devMode = $devMode; $this->originatingEvent = null; } /** * Returns the composer instance. * * @return Composer */ public function getComposer() { return $this->composer; } /** * Returns the IO instance. * * @return IOInterface */ public function getIO() { return $this->io; } /** * Return the dev mode flag * * @return bool */ public function isDevMode() { return $this->devMode; } /** * Set the originating event. * * @return \Composer\EventDispatcher\Event|null */ public function getOriginatingEvent() { return $this->originatingEvent; } /** * Set the originating event. * * @param \Composer\EventDispatcher\Event $event * @return $this */ public function setOriginatingEvent(BaseEvent $event) { $this->originatingEvent = $this->calculateOriginatingEvent($event); return $this; } /** * Returns the upper-most event in chain. * * @param \Composer\EventDispatcher\Event $event * @return \Composer\EventDispatcher\Event */ private function calculateOriginatingEvent(BaseEvent $event) { if ($event instanceof Event && $event->getOriginatingEvent()) { return $this->calculateOriginatingEvent($event->getOriginatingEvent()); } return $event; } } composer/README.md 0000644 00000004474 14736103146 0007670 0 ustar 00 Composer - Dependency Management for PHP ======================================== Composer helps you declare, manage, and install dependencies of PHP projects. See [https://getcomposer.org/](https://getcomposer.org/) for more information and documentation. [![Continuous Integration](https://github.com/composer/composer.svg/workflows/Continuous%20Integration/badge.svg?branch=master)](https://github.com/composer/composer.svg/actions) [![Build Status](https://travis-ci.org/composer/composer.svg?branch=master)](https://travis-ci.org/composer/composer) Installation / Usage -------------------- Download and install Composer by following the [official instructions](https://getcomposer.org/download/). For usage, see [the documentation](https://getcomposer.org/doc/). Packages -------- Find packages on [Packagist](https://packagist.org). Community --------- IRC channels are on irc.freenode.org: [#composer](irc://irc.freenode.org/composer) for users and [#composer-dev](irc://irc.freenode.org/composer-dev) for development. For support, Stack Overflow also offers a good collection of [Composer related questions](https://stackoverflow.com/questions/tagged/composer-php). Please note that this project is released with a [Contributor Code of Conduct](http://contributor-covenant.org/version/1/4/). By participating in this project and its community you agree to abide by those terms. Requirements ------------ PHP 5.3.2 or above (at least 5.3.4 recommended to avoid potential bugs) Authors ------- - Nils Adermann | [GitHub](https://github.com/naderman) | [Twitter](https://twitter.com/naderman) | <naderman@naderman.de> | [naderman.de](http://naderman.de) - Jordi Boggiano | [GitHub](https://github.com/Seldaek) | [Twitter](https://twitter.com/seldaek) | <j.boggiano@seld.be> | [seld.be](http://seld.be) See also the list of [contributors](https://github.com/composer/composer/contributors) who participated in this project. Security Reports ---------------- Please send any sensitive issue to [security@packagist.org](mailto:security@packagist.org). Thanks! License ------- Composer is licensed under the MIT License - see the [LICENSE](LICENSE) file for details Acknowledgments --------------- - This project's Solver started out as a PHP port of openSUSE's [Libzypp satsolver](https://en.opensuse.org/openSUSE:Libzypp_satsolver). composer/.php_cs 0000644 00000003566 14736103146 0007667 0 ustar 00 <?php $header = <<<EOF This file is part of Composer. (c) Nils Adermann <naderman@naderman.de> Jordi Boggiano <j.boggiano@seld.be> For the full copyright and license information, please view the LICENSE file that was distributed with this source code. EOF; $finder = PhpCsFixer\Finder::create() ->files() ->name('*.php') ->exclude('Fixtures') ->in(__DIR__.'/src') ->in(__DIR__.'/tests') ; return PhpCsFixer\Config::create() ->setUsingCache(true) //->setUsingLinter(false) ->setRiskyAllowed(true) ->setRules(array( '@PSR2' => true, 'binary_operator_spaces' => true, 'blank_line_before_return' => true, 'cast_spaces' => true, 'header_comment' => array('header' => $header), 'include' => true, 'long_array_syntax' => true, 'method_separation' => true, 'no_blank_lines_after_class_opening' => true, 'no_blank_lines_after_phpdoc' => true, 'no_blank_lines_between_uses' => true, 'no_duplicate_semicolons' => true, 'no_extra_consecutive_blank_lines' => true, 'no_leading_import_slash' => true, 'no_leading_namespace_whitespace' => true, 'no_trailing_comma_in_singleline_array' => true, 'no_unused_imports' => true, 'no_whitespace_in_blank_lines' => true, 'object_operator_without_whitespace' => true, 'phpdoc_align' => true, 'phpdoc_indent' => true, 'phpdoc_no_access' => true, 'phpdoc_no_package' => true, 'phpdoc_order' => true, 'phpdoc_scalar' => true, 'phpdoc_trim' => true, 'phpdoc_type_to_var' => true, 'psr0' => true, 'single_blank_line_before_namespace' => true, 'standardize_not_equals' => true, 'ternary_operator_spaces' => true, 'trailing_comma_in_multiline_array' => true, )) ->finder($finder) ; composer/CHANGELOG.md 0000644 00000167324 14736103146 0010226 0 ustar 00 ### [1.10.6] 2020-05-06 * Fixed version guessing to take composer-runtime-api and composer-plugin-api requirements into account to avoid selecting packages which require Composer 2 * Fixed package name validation to allow several dashes following each other * Fixed post-status-cmd script not firing when there were no changes to be displayed * Fixed composer-runtime-api support on Composer 1.x, the package is now present as 1.0.0 * Fixed support for composer show --name-only --self * Fixed detection of GitLab URLs when handling authentication in some cases ### [1.10.5] 2020-04-10 * Fixed self-update on PHP <5.6, seriously please upgrade people, it's time * Fixed 1.10.2 regression with PATH resolution in scripts ### [1.10.4] 2020-04-09 * Fixed 1.10.2 regression in path symlinking with absolute path repos ### [1.10.3] 2020-04-09 * Fixed invalid --2 flag warning in `self-update` when no channel is requested ### [1.10.2] 2020-04-09 * Added --1 flag to `self-update` command which can be added to automated self-update runs to make sure it won't automatically jump to 2.0 once that is released * Fixed path repository symlinks being made relative when the repo url is defined as absolute paths * Fixed potential issues when using "composer ..." in scripts and composer/composer was also required in the project * Fixed 1.10.0 regression when downloading GitHub archives from non-API URLs * Fixed handling of malformed info in fund command * Fixed Symfony5 compatibility issues in a few commands ### [1.10.1] 2020-03-13 * Fixed path repository warning on empty path when using wildcards * Fixed superfluous warnings when generating optimized autoloaders ### [1.10.0] 2020-03-10 * Added `bearer` auth config to authenticate using `Authorization: Bearer <token>` headers * Added `plugin-api-version` in composer.lock so third-party tools can know which Composer version was used to generate a lock file * Fixed composer fund command and funding info parsing to be more useful * Fixed issue where --no-dev autoload generation was excluding some packages which should not have been excluded * Fixed 1.10-RC regression in create project's handling of absolute paths ### [1.10.0-RC] 2020-02-14 * Breaking: `composer global exec ...` now executes the process in the current working directory instead of executing it in the global directory. * Warning: Added a warning when class names are being loaded by a PSR-4 or PSR-0 rule only due to classmap optimization, but would not otherwise be autoloadable. Composer 2.0 will stop autoloading these classes so make sure you fix your autoload configs. * Added new funding key to composer.json to describe ways your package's maintenance can be funded. This reads info from GitHub's FUNDING.yml by default so better configure it there so it shows on GitHub and Composer/Packagist * Added `composer fund` command to show funding info of your dependencies * Added support for --format=json output for show command when showing a single package * Added support for configuring suggestions using config command, e.g. `composer config suggest.foo/bar some text` * Added support for configuring fine-grained preferred-install using config command, e.g. `composer config preferred-install.foo/* dist` * Added `@putenv` script handler to set environment variables from composer.json for following scripts * Added `lock` option that can be set to false, in which case no composer.lock file will be generated * Added --add-repository flag to create-project command which will persist the repo given in --repository into the composer.json of the package being installed * Added support for IPv6 addresses in NO_PROXY * Added package homepage display in the show command * Added debug info about HTTP authentications * Added Symfony 5 compatibility * Added --fixed flag to require command to make it use a fixed constraint instead of a ^x.y constraint when adding the requirement * Fixed exclude-from-classmap matching subsets of directories e.g. foo/ was excluding foobar/ * Fixed archive command to persist file permissions inside the zip files * Fixed init/require command to avoid suggesting packages which are already selected in the search results * Fixed create-project UX issues * Fixed filemtime for vendor/composer/* files is now only changing when the files actually change * Fixed issues detecting docker environment with an active open_basedir ### [1.9.3] 2020-02-04 * Fixed GitHub deprecation of access_token query parameter, now using Authorization header ### [1.9.2] 2020-01-14 * Fixed minor git driver bugs * Fixed schema validation for version field to allow dev-* versions too * Fixed external processes' output being formatted even though it should not * Fixed issue with path repositories when trying to install feature branches ### [1.9.1] 2019-11-01 * Fixed various credential handling issues with gitlab and github * Fixed credentials being present in git remotes in Composer cache and vendor directory when not using SSH keys * Fixed `composer why` not listing replacers as a reason something is present * Fixed various PHP 7.4 compatibility issues * Fixed root warnings always present in Docker containers, setting COMPOSER_ALLOW_SUPERUSER is not necessary anymore * Fixed GitHub access tokens leaking into debug-verbosity output * Fixed several edge case issues detecting GitHub, Bitbucket and GitLab repository types * Fixed Composer asking if you want to use a composer.json in a parent directory when ran in non-interactive mode * Fixed classmap autoloading issue finding classes located within a few non-PHP context blocks (?>...<?php) ### [1.9.0] 2019-08-02 * Breaking: artifact repositories with URLs containing port numbers and requiring authentication now require you to configure http-basic auth for the `host:port` pair explicitly * Added a `--no-cache` flag available on all commands to run with the cache disabled * Added PHP_BINARY as env var pointing to the PHP process when executing Composer scripts as shell scripts * Added a `use-github-api` config option which can set the `no-api` flag on all GitHub VCS repositories declared * Added a static helper you can preprend to a script to avoid process timeouts, `"Composer\\Config::disableProcessTimeout"` * Added Event::getOriginatingEvent to retrieve an event's original event when a script handler forwards to another one * Added support for autoloading directly from a phar file * Fixed loading order of plugins to always initialize them in order of dependencies * Fixed various network-mount related issues * Fixed --ignore-platform-reqs not ignoring conflict rules against platform packages ### [1.8.6] 2019-06-11 * Fixed handling of backslash-escapes handling in composer.json when using the require command * Fixed create-project not following classmap-authoritative and apcu-autoloader config values * Fixed HHVM version warning showing up in some cases when it was not in use ### [1.8.5] 2019-04-09 * HHVM 4.0 is no longer compatible with Composer. Please use PHP instead going forward. * Added forward compatibility with upcoming 2.0 changes * Fixed support for PHP 7.3-style heredoc/nowdoc syntax changes in autoload generation * Fixed require command usage when combined with --ignore-platform-reqs * Fixed and cleaned up various Windows junctions handling issues ### [1.8.4] 2019-02-11 * Fixed long standing solver bug leading to odd solving issues in edge cases, see #7946 * Fixed HHVM support for upcoming releases * Fixed unix proxy for binaries to be POSIX compatible instead of breaking some shells * Fixed invalid deprecation warning for composer-plugin-api * Fixed edge case issues with Windows junctions when working with path repositories ### [1.8.3] 2019-01-30 * Fixed regression when executing partial updates ### [1.8.2] 2019-01-29 * Fixed invalid deprecation warning for ext-pdo_mysql and similar * Updated to latest xdebug-handler ### [1.8.1] 2019-01-29 * Deprecated support for non-standard package names (anything with uppercase, or no / in it). Make sure to follow the warnings if you see any to avoid problems in 2.0. * Fixed some packages missing from the autoloader config when installing with --no-dev * Fixed support for cloning GitLab repos using OAuth tokens instead of SSH keys * Fixed metapackage installs/updates missing from output * Fixed --with-dependencies / --with-all-dependencies not updating some packages in some edge cases * Fixed compatibility with Symfony 4.2 deprecations * Fixed temp dir not being cleaned up on download error while archiving packages * Updated to latest ca-bundle ### [1.8.0] 2018-12-03 * Changed `post-package-install` / `post-package-update` event to be fired *after* the lock file has been updated as opposed to before * Added support for removing packages using a wildcard with the `remove` command, e.g. `composer remove foo/*` * Added `chat` to the list of `support` channels you can list in composer.json * Added signal handling on require command to restore the composer.json in case of abort * Added `--ignore` to `outdated` command to pass one or more packages that you do not want to be listed * Added `--no-dev` to `check-platform-reqs` command to skip dev requirements even if they are installed * Added support for running plugin commands from sub-directories within a project much like other Composer commands * Added support for running Composer via phpdbg * Added `lib-imagick` platform package * Fixed validate command always checking for disabled checks when used with `--strict` ### [1.7.3] 2018-11-01 * Fixed handling of replace/conflict rules. This may affect dependency resolution in some edge cases. * Fixed Bitbucket API support and migrated all calls to API v2 as v1 is deprecated * Fixed support for lib-openssl 1.1.1 having only lowercase algorithm names * Fixed escaping of URLs in Perforce and Svn drivers * Fixed `show` command not respecting `--path` when a single package name was given * Fixed regression in 1.7.2's handling of metapackages ### [1.7.2] 2018-08-16 * Fixed reporting of authentication/rate limiting issues for GitHub API access * Fixed `create-project` not checking the checking the latest commit out when a cache was already present * Fixed reporting of errors when `global` command can not switch the working directory * Fixed PHP 5.3 JSON encoding issues with complex unicode character sequences * Updated to latest ca-bundle and xdebug-handler projects, see related changelogs ### [1.7.1] 2018-08-07 * Fixed issue autoloading plugins in require-dev in some conditions * Fixed handling of SSL to repo.packagist.org on very old PHP versions ### [1.7.0] 2018-08-03 * Added the overridden platform config's PHP version in the `diagnose` command output * Fixed --no-plugins not being respected in a few commands * Fixed 1.7.0-RC regression in output showing <warn> instead of proper colors * Fixed 1.7.0-RC regression in output missing "Loading from cache" output on package install ### [1.7.0-RC] 2018-07-24 * Changed default repository URL from packagist.org to repo.packagist.org, this might affect people with strict firewall rules * Changed output from Updating to Downgrading when performing package downgrades, this might affect anything parsing output * Several minor performance improvements * Added basic authentication support for mercurial repos * Added explicit `i` and `u` aliases for the `install` and `update` commands * Added support for `show` command to output json format with --tree * Added support for {glob,braces} support in the path repository's path argument * Added support in `status` command for showing diffs in vendor dir even for packages installed as dist/zip archives * Added `--remove-vcs` flag to `create-project` command to avoid prompting for keeping VCS files * Added `--no-secure-http` flag to `create-project` command to bypass https (use at your own risk) * Added `pre-command-run` event that lets plugins modify arguments * Added RemoteFilesystem::getRemoteContents extension point * Fixed setting scripts via `config` command ### [1.6.5] 2018-05-04 * Fixed regression in 1.6.4 causing strange update behaviors with dev packages * Fixed regression in 1.6.4 color support detection for Windows * Fixed issues dealing with broken symlinks when switching branches and using path repositories * Fixed JSON schema for package repositories * Fixed issues on computers set to Turkish locale * Fixed classmap parsing of files using short-open-tags when they are disabled in php ### [1.6.4] 2018-04-13 * Security fixes in some edge case scenarios, recommended update for all users * Fixed regression in version guessing of path repositories * Fixed removing aliased packages from the repository, which might resolve some odd update bugs * Fixed updating of package URLs for GitLab * Fixed run-script --list failing when script handlers were defined * Fixed init command not respecting the current php version when selecting package versions * Fixed handling of uppercase package names in why/why-not commands * Fixed exclude-from-classmap symlink handling * Fixed filesystem permissions of PEAR binaries * Improved performance of subversion repos * Other minor fixes ### [1.6.3] 2018-01-31 * Fixed GitLab downloads failing in some edge cases * Fixed ctrl-C handling during create-project * Fixed GitHub VCS repositories not prompting for a token in some conditions * Fixed SPDX license identifiers being case sensitive * Fixed and clarified a few dependency resolution error reporting strings * Fixed SVN commit log fetching in verbose mode when using private repositories ### [1.6.2] 2018-01-05 * Fixed more autoloader regressions * Fixed support for updating dist refs in gitlab URLs ### [1.6.1] 2018-01-04 * Fixed upgrade regression due to some autoloader cleanups * Fixed some overly loose version constraints ### [1.6.0] 2018-01-04 * Added support for SPDX license identifiers v3.0, deprecates GPL/LGPL/AGPL identifiers, which should now have a `-only` or `-or-later` suffix added. * Added support for COMPOSER_MEMORY_LIMIT env var to make Composer set the PHP memory limit explicitly * Added support for simple strings for the `bin` * Fixed `check-platform-reqs` bug in version checking ### [1.6.0-RC] 2017-12-19 * Improved performance of installs and updates from git clones when checking out known commits * Added `check-platform-reqs` command that checks that your PHP and extensions versions match the platform requirements of the installed packages * Added `--with-all-dependencies` to the `update` and `require` commands which updates all dependencies of the listed packages, including those that are direct root requirements * Added `scripts-descriptions` key to composer.json to customize the description and document your custom commands * Added support for the uppercase NO_PROXY env var * Added support for COMPOSER_DEFAULT_{AUTHOR,LICENSE,EMAIL,VENDOR} env vars to pre-populate init command values * Added support for local fossil repositories * Added suggestions for alternative spellings when entering packages in `init` and `require` commands and nothing can be found * Fixed installed.json data to be sorted alphabetically by package name * Fixed compatibility with Symfony 4.x components that Composer uses ### [1.5.6] - 2017-12-18 * Fixed root package version guessed when a tag is checked out * Fixed support for GitLab repos hosted on non-standard ports * Fixed regression in require command when requiring unstable packages, part 3 ### [1.5.5] - 2017-12-01 * Fixed regression in require command when requiring unstable packages, part 2 ### [1.5.4] - 2017-12-01 * Fixed regression in require command when requiring unstable packages ### [1.5.3] - 2017-11-30 * Fixed require/remove commands reverting the composer.json change when a non-solver-related error occurs * Fixed GitLabDriver to support installations of GitLab not at the root of the domain * Fixed create-project not following the optimize-autoloader flag of the root package * Fixed Authorization header being forwarded across domains after a redirect * Improved some error messages for clarity ### [1.5.2] - 2017-09-11 * Fixed GitLabDriver looping endlessly in some conditions * Fixed GitLabDriver support for unauthenticated requests * Fixed GitLab zip downloads not triggering credentials prompt if unauthenticated * Fixed path repository support of COMPOSER_ROOT_VERSION, it now applies to all path repos within the same git repository * Fixed path repository handling of copies to avoid copying VCS files and others * Fixed sub-directory call to ignore list and create-project commands as well as calls to Composer using --working-dir * Fixed invalid warning appearing when calling `remove` on an non-stable package ### [1.5.1] - 2017-08-09 * Fixed regression in GitLabDriver with repos containing >100 branches or tags * Fixed sub-directory call support to respect the COMPOSER env var ### [1.5.0] - 2017-08-08 * Changed the package install order to ensure that plugins are always installed as soon as possible * Added ability to call composer from within sub-directories of a project * Added support for GitLab API v4 * Added support for GitLab sub-groups * Added some more rules to composer validate * Added support for reading the `USER` env when guessing the username in `composer init` * Added warning when uncompressing files with the same name but difference cases on case insensitive filesystems * Added `htaccess-protect` option / `COMPOSER_HTACCESS_PROTECT` env var to disable the .htaccess creation in home dir (defaults to true) * Improved `clear-cache` command * Minor improvements/fixes and many documentation updates ### [1.4.3] - 2017-08-06 * Fixed GitLab URLs * Fixed root package version detection using latest git versions * Fixed inconsistencies in date format in composer.lock when installing from source * Fixed Mercurial support regression * Fixed exclude-from-classmap not being applied when autoloading files for Composer plugins * Fixed exclude-from-classmap being ignored when cwd has the wrong case on case insensitive filesystems * Fixed several other minor issues ### [1.4.2] - 2017-05-17 * Fixed Bitbucket API handler parsing old deleted branches in hg repos * Fixed regression in gitlab downloads * Fixed output inconsistencies * Fixed unicode handling in `init` command for author names * Fixed useless warning when doing partial updates/removes on packages that are not currently installed * Fixed Xdebug disabling issue when combined with disable_functions and allow_url_fopen CLI overrides ### [1.4.1] - 2017-03-10 * Fixed `apcu-autoloader` config option being ignored in `dump-autoload` command * Fixed json validation not allowing boolean for trunk-path, branches-path and tags-path in svn repos * Fixed json validation not allowing repository URLs without scheme ### [1.4.0] - 2017-03-08 * Improved memory usage of dependency solver * Added `--format json` option to the `outdated` and `show` command to get machine readable package listings * Added `--ignore-filters` flag to `archive` command to bypass the .gitignore and co * Added support for `outdated` output without ansi colors * Added support for Bitbucket API v2 * Changed the require command to follow minimum-stability / prefer-stable values when picking a version * Fixed regression when using composer in a Mercurial repository ### [1.3.3] - 2017-03-08 * **Capifony users beware**: This release has output format tweaks that mess up capifony interactive mode, see #6233 * Improved baseline psr-4 autoloader performance for projects with many nested namespaces configured * Fixed issues with gitlab API access when the token had insufficient permissions * Fixed some HHVM strict type issues * Fixed version guessing of headless git checkouts in some conditions * Fixed compatibility with subversion 1.8 * Fixed version guessing not working with svn/hg * Fixed script/exec errors not being output correctly * Fixed PEAR repository bug with pear.php.net ### [1.3.2] - 2017-01-27 * Added `COMPOSER_BINARY` env var that is defined within the scope of a Composer run automatically with the path to the phar file * Fixed create-project ending in a detached HEAD when installing aliased packages * Fixed composer show not returning non-zero exit code when the package does not exist * Fixed `@composer` handling in scripts when --working-dir is used together with it * Fixed private-GitLab handling of repos with dashes in them ### [1.3.1] - 2017-01-07 * Fixed dist downloads from Bitbucket * Fixed some regressions related to xdebug disabling * Fixed `--minor-only` flag in `outdated` command * Fixed handling of config.platform.php which did not replace other php-* package's versions ### [1.3.0] - 2016-12-24 * Fixed handling of annotated git tags vs lightweight tags leading to useless updates sometimes * Fixed ext-xdebug not being require-able anymore due to automatic xdebug disabling * Fixed case insensitivity of remove command ### [1.3.0-RC] - 2016-12-11 * Added workaround for xdebug performance impact by restarting PHP without xdebug automatically in case it is enabled * Added `--minor-only` to the `outdated` command to only show updates to minor versions and ignore new major versions * Added `--apcu-autoloader` to the `update`/`install` commands and `--apcu` to `dump-autoload` to enable an APCu-caching autoloader, which can be more efficient than --classmap-authoritative if you attempt to autoload many classes that do not exist, or if you can not use authoritative classmaps for some reason * Added summary of operations to be executed before they run, and made execution output more compact * Added `php-debug` and `php-zts` virtual platform packages * Added `gitlab-token` auth config for GitLab private tokens * Added `--strict` to the `outdated` command to return a non-zero exit code when there are outdated packages * Added ability to call php scripts using the current php interpreter (instead of finding php in PATH by default) in script handlers via `@php ...` * Added `COMPOSER_ALLOW_XDEBUG` env var to circumvent the Xdebug-disabling behavior * Added `COMPOSER_MIRROR_PATH_REPOS` env var to force mirroring of path repositories vs symlinking * Added `COMPOSER_DEV_MODE` env var that is set by Composer to forward the dev mode to script handlers * Fixed support for git 2.11 * Fixed output from zip and rar leaking out when an error occurred * Removed `hash` from composer.lock, only `content-hash` is now used which should reduce conflicts * Minor fixes and performance improvements ### [1.2.4] - 2016-12-06 * Fixed regression in output handling of scripts from 1.2.3 * Fixed support for LibreSSL detection as lib-openssl * Fixed issue with Zend Guard in the autoloader bootstrapping * Fixed support for loading partial provider repositories ### [1.2.3] - 2016-12-01 * Fixed bug in HgDriver failing to identify BitBucket repositories * Fixed support for loading partial provider repositories ### [1.2.2] - 2016-11-03 * Fixed selection of packages based on stability to be independent from package repository order * Fixed POST_DEPENDENCIES_SOLVING not containing some operations in edge cases * Fixed issue handling GitLab URLs containing dots and other special characters * Fixed issue on Windows when running composer at the root of a drive * Minor fixes ### [1.2.1] - 2016-09-12 * Fixed edge case issues with the static autoloader * Minor fixes ### [1.2.0] - 2016-07-19 * Security: Fixed [httpoxy](https://httpoxy.org/) vulnerability * Fixed `home` command to avoid rogue output on unix * Fixed output of git clones to clearly state when clones are from cache * (from 1.2 RC) Fixed ext-network-ipv6 to be php-ipv6 ### [1.2.0-RC] - 2016-07-04 * Added caching of git repositories if you have git 2.3+ installed. Repositories will now be cached once and then cloned from local cache so subsequent installs should be faster * Added detection of HEAD changes to the `status` command. If you `git checkout X` in a vendor directory for example it will tell you that it is not at the version that was installed * Added a virtual `php-ipv6` extension to require PHP compiled with IPv6 support * Added `--no-suggest` to `install` and `update` commands to skip output of suggestions at the end * Added `--type` to the `search` command to restrict to a given package type * Added fossil support as alternative to git/svn/.. for package downloads * Improved BitBucket OAuth support * Added support for blocking cache operations using COMPOSER_CACHE_DIR=/dev/null (or NUL on windows) * Added support for using declare(strict_types=1) in plugins * Added `--prefer-stable` and `--prefer-lowest` to the `require` command * Added `--no-scripts` to the `require` and `remove` commands * Added `_comment` top level key to the schema to endorse using it as a place to store comments (it can be a string or array of strings) * Added support for justinrainbow/json-schema 2.0 * Fixed binaries not being re-installed if deleted by users or the bin-dir changes. `update` and `install` will now re-install them * Many minor UX and docs improvements ### [1.1.3] - 2016-06-26 * Fixed bitbucket oauth instructions * Fixed version parsing issue * Fixed handling of bad proxies that modify JSON content on the fly ### [1.1.2] - 2016-05-31 * Fixed degraded mode issue when accessing packagist.org * Fixed GitHub access_token being added on subsequent requests in case of redirections * Fixed exclude-from-classmap not working in some circumstances * Fixed openssl warning preventing the use of config command for disabling tls ### [1.1.1] - 2016-05-17 * Fixed regression in handling of #reference which made it update every time * Fixed dev platform requirements being required even in --no-dev install from a lock file * Fixed parsing of extension versions that do not follow valid numbers, we now try to parse x.y.z and ignore the rest * Fixed exact constraints warnings appearing for 0.x versions * Fixed regression in the `remove` command ### [1.1.0] - 2016-05-10 * Added fallback to SSH for https bitbucket URLs * Added BaseCommand::isProxyCommand that can be overridden to mark a command as being a mere proxy, which helps avoid duplicate warnings etc on composer startup * Fixed archiving generating long paths in zip files on Windows ### [1.1.0-RC] - 2016-04-29 * Added ability for plugins to register their own composer commands * Optimized the autoloader initialization using static loading on PHP 5.6 and above, this reduces the load time for large classmaps to almost nothing * Added `--latest` to `show` command to show the latest version available of your dependencies * Added `--outdated` to `show` command an `composer outdated` alias for it, to show only packages in need of update * Added `--direct` to `show` and `outdated` commands to show only your direct dependencies in the listing * Added support for editing all top-level properties (name, minimum-stability, ...) as well as extra values via the `config` command * Added abandoned state warning to the `show` and `outdated` commands when listing latest packages * Added support for `~/` and `$HOME/` in the path repository paths * Added support for wildcards in the `show` command package filter, e.g. `composer show seld/*` * Added ability to call composer itself from scripts via `@composer ...` * Added untracked files detection to the `status` command * Added warning to `validate` command when using exact-version requires * Added warning once per domain when accessing insecure URLs with secure-http disabled * Added a dependency on composer/ca-bundle (extracted CA bundle management to a standalone lib) * Added support for empty directories when archiving to tar * Added an `init` event for plugins to react to, which occurs right after a Composer instance is fully initialized * Added many new detections of problems in the `why-not`/`prohibits` command to figure out why something does not get installed in the expected version * Added a deprecation notice for script event listeners that use legacy script classes * Fixed abandoned state not showing up if you had a package installed before it was marked abandoned * Fixed --no-dev updates creating an incomplete lock file, everything is now always resolved on update * Fixed partial updates in case the vendor dir was not up to date with the lock file ### [1.0.3] - 2016-04-29 * Security: Fixed possible command injection from the env vars into our sudo detection * Fixed interactive authentication with gitlab * Fixed class name replacement in plugins * Fixed classmap generation mistakenly detecting anonymous classes * Fixed auto-detection of stability flags in complex constraints like `2.0-dev || ^1.5` * Fixed content-length handling when redirecting to very small responses ### [1.0.2] - 2016-04-21 * Fixed regression in 1.0.1 on systems with mbstring.func_overload enabled * Fixed regression in 1.0.1 that made dev packages update to the latest reference even if not whitelisted in a partial update * Fixed init command ignoring the COMPOSER env var for choosing the json file name * Fixed error reporting bug when the dependency resolution fails * Fixed handling of `$` sign in composer config command in some cases it could corrupt the json file ### [1.0.1] - 2016-04-18 * Fixed URL updating when a package's URL changes, composer.lock now contains the right URL including correct reference * Fixed URL updating of the origin git remote as well for packages installed as git clone * Fixed binary .bat files generated from linux being incompatible with windows cmd * Fixed handling of paths with trailing slashes in path repository * Fixed create-project not using platform config when selecting a package * Fixed self-update not showing the channel it uses to perform the update * Fixed file downloads not failing loudly when the content does not match the Content-Length header * Fixed secure-http detecting some malformed URLs as insecure * Updated CA bundle ### [1.0.0] - 2016-04-05 * Added support for bitbucket-oauth configuration * Added warning when running composer as super user, set COMPOSER_ALLOW_SUPERUSER=1 to hide the warning if you really must * Added PluginManager::getGlobalComposer getter to retrieve the global instance (which can be null!) * Fixed dependency solver error reporting in many cases it now shows you proper errors instead of just saying a package does not exist * Fixed output of failed downloads appearing as 100% done instead of Failed * Fixed handling of empty directories when archiving, they are not skipped anymore * Fixed installation of broken plugins corrupting the vendor state when combined with symlinked path repositories ### [1.0.0-beta2] - 2016-03-27 * Break: The `install` command now turns into an `update` command automatically if you have no composer.lock. This was done only half-way before which caused inconsistencies * Break: By default the `remove` command now removes dependencies as well, and --update-with-dependencies is deprecated. Use --no-update-with-dependencies to get old behavior * Added support for update channels in `self-update`. All users will now update to stable builds by default. Run `self-update` with `--snapshot`, `--preview` or `--stable` to switch between update channels. * Added support for SSL_CERT_DIR env var and openssl.capath ini value * Added some conflict detection in `why-not` command * Added suggestion of root package's suggests in `create-project` command * Fixed `create-project` ignoring --ignore-platform-reqs when choosing a version of the package * Fixed `search` command in a directory without composer.json * Fixed path repository handling of symlinks on windows * Fixed PEAR repo handling to prefer HTTPS mirrors over HTTP ones * Fixed handling of Path env var on Windows, only PATH was accepted before * Small error reporting and docs improvements ### [1.0.0-beta1] - 2016-03-03 * Break: By default we now disable any non-secure protocols (http, git, svn). This may lead to issues if you rely on those. See `secure-http` config option. * Break: `show` / `list` command now only show installed packages by default. An `--all` option is added to show all packages. * Added VCS repo support for the GitLab API, see also `gitlab-oauth` and `gitlab-domains` config options * Added `prohibits` / `why-not` command to show what blocks an upgrade to a given package:version pair * Added --tree / -t to the `show` command to see all your installed packages in a tree view * Added --interactive / -i to the `update` command, which lets you pick packages to update interactively * Added `exec` command to run binaries while having bin-dir in the PATH for convenience * Added --root-reqs to the `update` command to update only your direct, first degree dependencies * Added `cafile` and `capath` config options to control HTTPS certificate authority * Added pubkey verification of composer.phar when running self-update * Added possibility to configure per-package `preferred-install` types for more flexibility between prefer-source and prefer-dist * Added unpushed-changes detection when updating dependencies and in the `status` command * Added COMPOSER_AUTH env var that lets you pass a json configuration like the auth.json file * Added `secure-http` and `disable-tls` config options to control HTTPS/HTTP * Added warning when Xdebug is enabled as it reduces performance quite a bit, hide it with COMPOSER_DISABLE_XDEBUG_WARN=1 if you must * Added duplicate key detection when loading composer.json * Added `sort-packages` config option to force sorting of the requirements when using the `require` command * Added support for the XDG Base Directory spec on linux * Added XzDownloader for xz file support * Fixed SSL support to fully verify peers in all PHP versions, unsecure HTTP is also disabled by default * Fixed stashing and cleaning up of untracked files when updating packages * Fixed plugins being enabled after installation even when --no-plugins * Many small bug fixes and additions ### [1.0.0-alpha11] - 2015-11-14 * Added config.platform to let you specify what your target environment looks like and make sure you do not inadvertently install dependencies that would break it * Added `exclude-from-classmap` in the autoload config that lets you ignore sub-paths of classmapped directories, or psr-0/4 directories when building optimized autoloaders * Added `path` repository type to install/symlink packages from local paths * Added possibility to reference script handlers from within other handlers using @script-name to reduce duplication * Added `suggests` command to show what packages are suggested, use -v to see more details * Added `content-hash` inside the composer.lock to restrict the warnings about outdated lock file to some specific changes in the composer.json file * Added `archive-format` and `archive-dir` config options to specify default values for the archive command * Added --classmap-authoritative to `install`, `update`, `require`, `remove` and `dump-autoload` commands, forcing the optimized classmap to be authoritative * Added -A / --with-dependencies to the `validate` command to allow validating all your dependencies recursively * Added --strict to the `validate` command to treat any warning as an error that then returns a non-zero exit code * Added a dependency on composer/semver, which is the externalized lib for all the version constraints parsing and handling * Added support for classmap autoloading to load plugin classes and script handlers * Added `bin-compat` config option that if set to `full` will create .bat proxy for binaries even if Composer runs in a linux VM * Added SPDX 2.0 support, and externalized that in a composer/spdx-licenses lib * Added warnings when the classmap autoloader finds duplicate classes * Added --file to the `archive` command to choose the filename * Added Ctrl+C handling in create-project to cancel the operation cleanly * Fixed version guessing to use ^ always, default to stable versions, and avoid versions that require a higher php version than you have * Fixed the lock file switching back and forth between old and new URL when a package URL is changed and many people run updates * Fixed partial updates updating things they shouldn't when the current vendor dir was out of date with the lock file * Fixed PHAR file creation to be more reproducible and always generate the exact same phar file from a given source * Fixed issue when checking out git branches or tags that are also the name of a file in the repo * Many minor fixes and documentation additions and UX improvements ### [1.0.0-alpha10] - 2015-04-14 * Break: The following event classes are deprecated and you should update your script handlers to use the new ones in type hints: - `Composer\Script\CommandEvent` is deprecated, use `Composer\Script\Event` - `Composer\Script\PackageEvent` is deprecated, use `Composer\Installer\PackageEvent` * Break: Output is now split between stdout and stderr. Any irrelevant output to each command is on stderr as per unix best practices. * Added support for npm-style semver operators (`^` and `-` ranges, ` ` = AND, `||` = OR) * Added --prefer-lowest to `update` command to allow testing a package with the lowest declared dependencies * Added support for parsing semver build metadata `+anything` at the end of versions * Added --sort-packages option to `require` command for sorting dependencies * Added --no-autoloader to `install` and `update` commands to skip autoload generation * Added --list to `run-script` command to see available scripts * Added --absolute to `config` command to get back absolute paths * Added `classmap-authoritative` config option, if enabled only the classmap info will be used by the composer autoloader * Added support for branch-alias on numeric branches * Added support for the `https_proxy`/`HTTPS_PROXY` env vars used only for https URLs * Added support for using real composer repos as local paths in `create-project` command * Added --no-dev to `licenses` command * Added support for PHP 7.0 nightly builds * Fixed detection of stability when parsing multiple constraints * Fixed installs from lock file containing updated composer.json requirement * Fixed the autoloader suffix in vendor/autoload.php changing in every build * Many minor fixes, documentation additions and UX improvements ### [1.0.0-alpha9] - 2014-12-07 * Added `remove` command to do the reverse of `require` * Added --ignore-platform-reqs to `install`/`update` commands to install even if you are missing a php extension or have an invalid php version * Added a warning when abandoned packages are being installed * Added auto-selection of the version constraint in the `require` command, which can now be used simply as `composer require foo/bar` * Added ability to define custom composer commands using scripts * Added `browse` command to open a browser to the given package's repo URL (or homepage with `-H`) * Added an `autoload-dev` section to declare dev-only autoload rules + a --no-dev flag to dump-autoload * Added an `auth.json` file, with `store-auths` config option * Added a `http-basic` config option to store login/pwds to hosts * Added failover to source/dist and vice-versa in case a download method fails * Added --path (-P) flag to the show command to see the install path of packages * Added --update-with-dependencies and --update-no-dev flags to the require command * Added `optimize-autoloader` config option to force the `-o` flag from the config * Added `clear-cache` command * Added a GzipDownloader to download single gzipped files * Added `ssh` support in the `github-protocols` config option * Added `pre-dependencies-solving` and `post-dependencies-solving` events * Added `pre-archive-cmd` and `post-archive-cmd` script events to the `archive` command * Added a `no-api` flag to GitHub VCS repos to skip the API but still get zip downloads * Added http-basic auth support for private git repos not on github * Added support for autoloading `.hh` files when running HHVM * Added support for PHP 5.6 * Added support for OTP auth when retrieving a GitHub API key * Fixed isolation of `files` autoloaded scripts to ensure they can not affect anything * Improved performance of solving dependencies * Improved SVN and Perforce support * A boatload of minor fixes, documentation additions and UX improvements ### [1.0.0-alpha8] - 2014-01-06 * Break: The `install` command now has --dev enabled by default. --no-dev can be used to install without dev requirements * Added `composer-plugin` package type to allow extensibility, and deprecated `composer-installer` * Added `psr-4` autoloading support and deprecated `target-dir` since it is a better alternative * Added --no-plugins flag to replace --no-custom-installers where available * Added `global` command to operate Composer in a user-global directory * Added `licenses` command to list the license of all your dependencies * Added `pre-status-cmd` and `post-status-cmd` script events to the `status` command * Added `post-root-package-install` and `post-create-project-cmd` script events to the `create-project` command * Added `pre-autoload-dump` script event * Added --rollback flag to self-update * Added --no-install flag to create-project to skip installing the dependencies * Added a `hhvm` platform package to require Facebook's HHVM implementation of PHP * Added `github-domains` config option to allow using GitHub Enterprise with Composer's GitHub support * Added `prepend-autoloader` config option to allow appending Composer's autoloader instead of the default prepend behavior * Added Perforce support to the VCS repository * Added a vendor/composer/autoload_files.php file that lists all files being included by the files autoloader * Added support for the `no_proxy` env var and other proxy support improvements * Added many robustness tweaks to make sure zip downloads work more consistently and corrupted caches are invalidated * Added the release date to `composer -V` output * Added `autoloader-suffix` config option to allow overriding the randomly generated autoloader class suffix * Fixed BitBucket API usage * Fixed parsing of inferred stability flags that are more stable than the minimum stability * Fixed installation order of plugins/custom installers * Fixed tilde and wildcard version constraints to be more intuitive regarding stabilities * Fixed handling of target-dir changes when updating packages * Improved performance of the class loader * Improved memory usage and performance of solving dependencies * Tons of minor bug fixes and improvements ### [1.0.0-alpha7] - 2013-05-04 * Break: For forward compatibility, you should change your deployment scripts to run `composer install --no-dev`. The install command will install dev dependencies by default starting in the next release * Break: The `update` command now has --dev enabled by default. --no-dev can be used to update without dev requirements, but it will create an incomplete lock file and is discouraged * Break: Removed support for lock files created before 2012-09-15 due to their outdated unusable format * Added `prefer-stable` flag to pick stable packages over unstable ones when possible * Added `preferred-install` config option to always enable --prefer-source or --prefer-dist * Added `diagnose` command to to system/network checks and find common problems * Added wildcard support in the update whitelist, e.g. to update all packages of a vendor do `composer update vendor/*` * Added `archive` command to archive the current directory or a given package * Added `run-script` command to manually trigger scripts * Added `proprietary` as valid license identifier for non-free code * Added a `php-64bit` platform package that you can require to force a 64bit php * Added a `lib-ICU` platform package * Added a new official package type `project` for project-bootstrapping packages * Added zip/dist local cache to speed up repetitive installations * Added `post-autoload-dump` script event * Added `Event::getDevMode` to let script handlers know if dev requirements are being installed * Added `discard-changes` config option to control the default behavior when updating "dirty" dependencies * Added `use-include-path` config option to make the autoloader look for files in the include path too * Added `cache-ttl`, `cache-files-ttl` and `cache-files-maxsize` config option * Added `cache-dir`, `cache-files-dir`, `cache-repo-dir` and `cache-vcs-dir` config option * Added support for using http(s) authentication to non-github repos * Added support for using multiple autoloaders at once (e.g. PHPUnit + application both using Composer autoloader) * Added support for .inc files for classmap autoloading (legacy support, do not do this on new projects!) * Added support for version constraints in show command, e.g. `composer show monolog/monolog 1.4.*` * Added support for svn repositories containing packages in a deeper path (see package-path option) * Added an `artifact` repository to scan a directory containing zipped packages * Added --no-dev flag to `install` and `update` commands * Added --stability (-s) flag to create-project to lower the required stability * Added --no-progress to `install` and `update` to hide the progress indicators * Added --available (-a) flag to the `show` command to display only available packages * Added --name-only (-N) flag to the `show` command to show only package names (one per line, no formatting) * Added --optimize-autoloader (-o) flag to optimize the autoloader from the `install` and `update` commands * Added -vv and -vvv flags to get more verbose output, can be useful to debug some issues * Added COMPOSER_NO_INTERACTION env var to do the equivalent of --no-interaction (should be set on build boxes, CI, PaaS) * Added PHP 5.2 compatibility to the autoloader configuration files so they can be used to configure another autoloader * Fixed handling of platform requirements of the root package when installing from lock * Fixed handling of require-dev dependencies * Fixed handling of unstable packages that should be downgraded to stable packages when updating to new version constraints * Fixed parsing of the `~` operator combined with unstable versions * Fixed the `require` command corrupting the json if the new requirement was invalid * Fixed support of aliases used together with `<version>#<reference>` constraints * Improved output of dependency solver problems by grouping versions of a package together * Improved performance of classmap generation * Improved mercurial support in various places * Improved lock file format to minimize unnecessary diffs * Improved the `config` command to support all options * Improved the coverage of the `validate` command * Tons of minor bug fixes and improvements ### [1.0.0-alpha6] - 2012-10-23 * Schema: Added ability to pass additional options to repositories (i.e. ssh keys/client certificates to secure private repos) * Schema: Added a new `~` operator that should be preferred over `>=`, see http://getcomposer.org/doc/01-basic-usage.md#package-versions * Schema: Version constraints `<x.y` are assumed to be `<x.y-dev` unless specified as `<x.y-stable` to reduce confusion * Added `config` command to edit/list config values, including --global switch for system config * Added OAuth token support for the GitHub API * Added ability to specify CLI commands as scripts in addition to PHP callbacks * Added --prefer-dist flag to force installs of dev packages from zip archives instead of clones * Added --working-dir (-d) flag to change the working directory * Added --profile flag to all commands to display execution time and memory usage * Added `github-protocols` config key to define the order of preferred protocols for github.com clones * Added ability to interactively reset changes to vendor dirs while updating * Added support for hg bookmarks in the hg driver * Added support for svn repositories not following the standard trunk/branch/tags scheme * Fixed git clones of dev versions so that you end up on a branch and not in detached HEAD * Fixed "Package not installed" issues with --dev installs * Fixed the lock file format to be a snapshot of all the package info at the time of update * Fixed order of autoload requires to follow package dependencies * Fixed rename() failures with "Access denied" on windows * Improved memory usage to be more reasonable and not grow with the repository size * Improved performance and memory usage of installs from composer.lock * Improved performance of a few essential code paths * Many bug small fixes and docs improvements ### [1.0.0-alpha5] - 2012-08-18 * Added `dump-autoload` command to only regenerate the autoloader * Added --optimize to `dump-autoload` to generate a more performant classmap-based autoloader for production * Added `status` command to show if any source-installed dependency has local changes, use --verbose to see changed files * Added --verbose flag to `install` and `update` that shows the new commits when updating source-installed dependencies * Added --no-update flag to `require` to only modify the composer.json file but skip the update * Added --no-custom-installers and --no-scripts to `install`, `update` and `create-project` to prevent all automatic code execution * Added support for installing archives that contain only a single file * Fixed APC related issues in the autoload script on high load websites * Fixed installation of branches containing capital letters * Fixed installation of custom dev versions/branches * Improved the coverage of the `validate` command * Improved PEAR scripts/binaries support * Improved and fixed the output of various commands * Improved error reporting on network failures and some other edge cases * Various minor bug fixes and docs improvements ### [1.0.0-alpha4] - 2012-07-04 * Break: The default `minimum-stability` is now `stable`, [read more](https://groups.google.com/d/topic/composer-dev/_g3ASeIFlrc/discussion) * Break: Custom installers now receive the IO instance and a Composer instance in their constructor * Schema: Added references for dev versions, requiring `dev-master#abcdef` for example will force the abcdef commit * Schema: Added `support` key with some more metadata (email, issues, forum, wiki, irc, source) * Schema: Added `!=` operator for version constraints in `require`/`require-dev` * Added a recommendation for package names to be `lower-cased/with-dashes`, it will be enforced for new packages on Pacakgist * Added `require` command to add a package to your requirements and install it * Added a whitelist to `update`. Calling `composer update foo/bar foo/baz` allows you to update only those packages * Added support for overriding repositories in the system config (define repositories in ~/.composer/config.json) * Added `lib-*` packages to the platform repository, e.g. `lib-pcre` contains the pcre version * Added caching of GitHub metadata (faster startup time with custom GitHub VCS repos) * Added caching of SVN metadata (faster startup time with custom SVN VCS repos) * Added support for file:// URLs to GitDriver * Added --self flag to the `show` command to display the infos of the root package * Added --dev flag to `create-project` command * Added --no-scripts to `install` and `update` commands to avoid triggering the scripts * Added `COMPOSER_ROOT_VERSION` env var to specify the version of the root package (fixes some edge cases) * Added support for multiple custom installers in one package * Added files autoloading method which requires files on every request, e.g. to load functional code * Added automatic recovery for lock files that contain references to rewritten (force pushed) commits * Improved PEAR repositories support and package.xml extraction * Improved and fixed the output of various commands * Fixed the order of installation of requirements (they are always installed before the packages requiring them) * Cleaned up / refactored the dependency solver code as well as the output for unsolvable requirements * Various bug fixes and docs improvements ### [1.0.0-alpha3] - 2012-05-13 * Schema: Added `require-dev` for development-time requirements (tests, etc), install with --dev * Schema: Added author.role to list the author's role in the project * Schema: Added `minimum-stability` + `@<stability>` flags in require for restricting packages to a certain stability * Schema: Removed `recommend` * Schema: `suggest` is now informational and can use any description for a package, not only a constraint * Break: vendor/.composer/autoload.php has been moved to vendor/autoload.php, other files are now in vendor/composer/ * Added caching of repository metadata (faster startup times & failover if packagist is down) * Added removal of packages that are not needed anymore * Added include_path support for legacy projects that are full of require_once statements * Added installation notifications API to allow better statistics on Composer repositories * Added support for proxies that require authentication * Added support for private github repositories over https * Added autoloading support for root packages that use target-dir * Added awareness of the root package presence and support for it's provide/replace/conflict keys * Added IOInterface::isDecorated to test for colored output support * Added validation of licenses based on the [SPDX registry](https://spdx.org/licenses/) * Improved repository protocol to have large cacheable parts * Fixed various bugs relating to package aliasing, proxy configuration, binaries * Various bug fixes and docs improvements ### [1.0.0-alpha2] - 2012-04-03 * Added `create-project` command to install a project from scratch with composer * Added automated `classmap` autoloading support for non-PSR-0 compliant projects * Added human readable error reporting when deps can not be solved * Added support for private GitHub and SVN repositories (use --no-interaction for CI) * Added "file" downloader type to download plain files * Added support for authentication with svn repositories * Added autoload support for PEAR repositories * Improved clones from GitHub which now automatically select between git/https/http protocols * Improved `validate` command to give more feedback * Improved the `search` & `show` commands output * Removed dependency on filter_var * Various robustness & error handling improvements, docs fixes and more bug fixes ### 1.0.0-alpha1 - 2012-03-01 * Initial release [1.10.6]: https://github.com/composer/composer/compare/1.10.5...1.10.6 [1.10.5]: https://github.com/composer/composer/compare/1.10.4...1.10.5 [1.10.4]: https://github.com/composer/composer/compare/1.10.3...1.10.4 [1.10.3]: https://github.com/composer/composer/compare/1.10.2...1.10.3 [1.10.2]: https://github.com/composer/composer/compare/1.10.1...1.10.2 [1.10.1]: https://github.com/composer/composer/compare/1.10.0...1.10.1 [1.10.0]: https://github.com/composer/composer/compare/1.10.0-RC...1.10.0 [1.10.0-RC]: https://github.com/composer/composer/compare/1.9.3...1.10.0-RC [1.9.3]: https://github.com/composer/composer/compare/1.9.2...1.9.3 [1.9.2]: https://github.com/composer/composer/compare/1.9.1...1.9.2 [1.9.1]: https://github.com/composer/composer/compare/1.9.0...1.9.1 [1.9.0]: https://github.com/composer/composer/compare/1.8.6...1.9.0 [1.8.6]: https://github.com/composer/composer/compare/1.8.5...1.8.6 [1.8.5]: https://github.com/composer/composer/compare/1.8.4...1.8.5 [1.8.4]: https://github.com/composer/composer/compare/1.8.3...1.8.4 [1.8.3]: https://github.com/composer/composer/compare/1.8.2...1.8.3 [1.8.2]: https://github.com/composer/composer/compare/1.8.1...1.8.2 [1.8.1]: https://github.com/composer/composer/compare/1.8.0...1.8.1 [1.8.0]: https://github.com/composer/composer/compare/1.7.3...1.8.0 [1.7.3]: https://github.com/composer/composer/compare/1.7.2...1.7.3 [1.7.2]: https://github.com/composer/composer/compare/1.7.1...1.7.2 [1.7.1]: https://github.com/composer/composer/compare/1.7.0...1.7.1 [1.7.0]: https://github.com/composer/composer/compare/1.7.0-RC...1.7.0 [1.7.0-RC]: https://github.com/composer/composer/compare/1.6.5...1.7.0-RC [1.6.5]: https://github.com/composer/composer/compare/1.6.4...1.6.5 [1.6.4]: https://github.com/composer/composer/compare/1.6.3...1.6.4 [1.6.3]: https://github.com/composer/composer/compare/1.6.2...1.6.3 [1.6.2]: https://github.com/composer/composer/compare/1.6.1...1.6.2 [1.6.1]: https://github.com/composer/composer/compare/1.6.0...1.6.1 [1.6.0]: https://github.com/composer/composer/compare/1.6.0-RC...1.6.0 [1.6.0-RC]: https://github.com/composer/composer/compare/1.5.6...1.6.0-RC [1.5.6]: https://github.com/composer/composer/compare/1.5.5...1.5.6 [1.5.5]: https://github.com/composer/composer/compare/1.5.4...1.5.5 [1.5.4]: https://github.com/composer/composer/compare/1.5.3...1.5.4 [1.5.3]: https://github.com/composer/composer/compare/1.5.2...1.5.3 [1.5.2]: https://github.com/composer/composer/compare/1.5.1...1.5.2 [1.5.1]: https://github.com/composer/composer/compare/1.5.0...1.5.1 [1.5.0]: https://github.com/composer/composer/compare/1.4.3...1.5.0 [1.4.3]: https://github.com/composer/composer/compare/1.4.2...1.4.3 [1.4.2]: https://github.com/composer/composer/compare/1.4.1...1.4.2 [1.4.1]: https://github.com/composer/composer/compare/1.4.0...1.4.1 [1.4.0]: https://github.com/composer/composer/compare/1.3.3...1.4.0 [1.3.3]: https://github.com/composer/composer/compare/1.3.2...1.3.3 [1.3.2]: https://github.com/composer/composer/compare/1.3.1...1.3.2 [1.3.1]: https://github.com/composer/composer/compare/1.3.0...1.3.1 [1.3.0]: https://github.com/composer/composer/compare/1.3.0-RC...1.3.0 [1.3.0-RC]: https://github.com/composer/composer/compare/1.2.4...1.3.0-RC [1.2.4]: https://github.com/composer/composer/compare/1.2.3...1.2.4 [1.2.3]: https://github.com/composer/composer/compare/1.2.2...1.2.3 [1.2.2]: https://github.com/composer/composer/compare/1.2.1...1.2.2 [1.2.1]: https://github.com/composer/composer/compare/1.2.0...1.2.1 [1.2.0]: https://github.com/composer/composer/compare/1.2.0-RC...1.2.0 [1.2.0-RC]: https://github.com/composer/composer/compare/1.1.3...1.2.0-RC [1.1.3]: https://github.com/composer/composer/compare/1.1.2...1.1.3 [1.1.2]: https://github.com/composer/composer/compare/1.1.1...1.1.2 [1.1.1]: https://github.com/composer/composer/compare/1.1.0...1.1.1 [1.1.0]: https://github.com/composer/composer/compare/1.0.3...1.1.0 [1.1.0-RC]: https://github.com/composer/composer/compare/1.0.3...1.1.0-RC [1.0.3]: https://github.com/composer/composer/compare/1.0.2...1.0.3 [1.0.2]: https://github.com/composer/composer/compare/1.0.1...1.0.2 [1.0.1]: https://github.com/composer/composer/compare/1.0.0...1.0.1 [1.0.0]: https://github.com/composer/composer/compare/1.0.0-beta2...1.0.0 [1.0.0-beta2]: https://github.com/composer/composer/compare/1.0.0-beta1...1.0.0-beta2 [1.0.0-beta1]: https://github.com/composer/composer/compare/1.0.0-alpha11...1.0.0-beta1 [1.0.0-alpha11]: https://github.com/composer/composer/compare/1.0.0-alpha10...1.0.0-alpha11 [1.0.0-alpha10]: https://github.com/composer/composer/compare/1.0.0-alpha9...1.0.0-alpha10 [1.0.0-alpha9]: https://github.com/composer/composer/compare/1.0.0-alpha8...1.0.0-alpha9 [1.0.0-alpha8]: https://github.com/composer/composer/compare/1.0.0-alpha7...1.0.0-alpha8 [1.0.0-alpha7]: https://github.com/composer/composer/compare/1.0.0-alpha6...1.0.0-alpha7 [1.0.0-alpha6]: https://github.com/composer/composer/compare/1.0.0-alpha5...1.0.0-alpha6 [1.0.0-alpha5]: https://github.com/composer/composer/compare/1.0.0-alpha4...1.0.0-alpha5 [1.0.0-alpha4]: https://github.com/composer/composer/compare/1.0.0-alpha3...1.0.0-alpha4 [1.0.0-alpha3]: https://github.com/composer/composer/compare/1.0.0-alpha2...1.0.0-alpha3 [1.0.0-alpha2]: https://github.com/composer/composer/compare/1.0.0-alpha1...1.0.0-alpha2 composer/LICENSE 0000644 00000002054 14736103146 0007406 0 ustar 00 Copyright (c) Nils Adermann, Jordi Boggiano Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. composer/.github/CONTRIBUTING.md 0000644 00000004135 14736103146 0012174 0 ustar 00 Contributing to Composer ======================== Please note that this project is released with a [Contributor Code of Conduct](http://contributor-covenant.org/version/1/2/0/). By participating in this project you agree to abide by its terms. Reporting Issues ---------------- When reporting issues, please try to be as descriptive as possible, and include as much relevant information as you can. A step by step guide on how to reproduce the issue will greatly increase the chances of your issue being resolved in a timely manner. For example, if you are experiencing a problem while running one of the commands, please provide full output of said command in very very verbose mode (`-vvv`, e.g. `composer install -vvv`). If your issue involves installing, updating or resolving dependencies, the chance of us being able to reproduce your issue will be much higher if you share your `composer.json` with us. Installation from Source ------------------------ Prior to contributing to Composer, you must be able to run the test suite. To achieve this, you need to acquire the Composer source code: 1. Run `git clone https://github.com/composer/composer.git` 2. Download the [`composer.phar`](https://getcomposer.org/composer.phar) executable 3. Run Composer to get the dependencies: `cd composer && php ../composer.phar install` You can run the test suite by executing `vendor/bin/phpunit` when inside the composer directory, and run Composer by executing the `bin/composer`. To test your modified Composer code against another project, run `php /path/to/composer/bin/composer` inside that project's directory. Contributing policy ------------------- Fork the project, create a feature branch, and send us a pull request. To ensure a consistent code base, you should make sure the code follows the [PSR-2 Coding Standards](http://www.php-fig.org/psr/psr-2/). You can also run [php-cs-fixer](https://github.com/FriendsOfPHP/PHP-CS-Fixer) with the configuration file that can be found in the project root directory. If you would like to help, take a look at the [list of open issues](https://github.com/composer/composer/issues). composer/.github/ISSUE_TEMPLATE.md 0000644 00000000311 14736103146 0012440 0 ustar 00 With the following composer.json: ```json { ... } ``` When I run this command: ``` composer command -vvv (please include -vvv!) ``` I get this output: ``` ``` And I expected this to happen: autoload_namespaces.php 0000644 00000001335 14736103146 0011273 0 ustar 00 <?php // autoload_namespaces.php @generated by Composer $vendorDir = dirname(dirname(__FILE__)); $baseDir = dirname($vendorDir); return array( 'PhpCollection' => array($vendorDir . '/phpcollection/phpcollection/src'), 'OAuth2\\HttpFoundationBridge' => array($vendorDir . '/bshaffer/oauth2-server-httpfoundation-bridge/src'), 'OAuth2' => array($vendorDir . '/bshaffer/oauth2-server-php/src'), 'Metadata\\' => array($vendorDir . '/jms/metadata/src'), 'JMS\\Serializer' => array($vendorDir . '/jms/serializer/src'), 'JMS\\' => array($vendorDir . '/jms/parser-lib/src'), 'HTMLPurifier' => array($vendorDir . '/ezyang/htmlpurifier/library'), 'Google_' => array($vendorDir . '/google/apiclient/src'), ); ca-bundle/res/cacert.pem 0000644 00000661734 14736103146 0011161 0 ustar 00 ## ## Bundle of CA Root Certificates ## ## Certificate data from Mozilla as of: Wed Jul 22 03:12:14 2020 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.28. ## SHA256: cc6408bd4be7fbfb8699bdb40ccb7f6de5780d681d87785ea362646e4dad5e8e ## 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----- 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----- 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----- 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 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----- 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----- 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----- 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----- 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----- 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----- 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----- 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----- 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----- 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----- 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----- 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----- 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----- 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----- 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----- 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----- 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----- 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----- D-TRUST Root Class 3 CA 2 2009 ============================== -----BEGIN CERTIFICATE----- MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ 4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm 2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I= -----END CERTIFICATE----- D-TRUST Root Class 3 CA 2 EV 2009 ================================= -----BEGIN CERTIFICATE----- MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T 7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60 sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35 11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+ PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv w9y4AyHqnxbxLFS1 -----END CERTIFICATE----- CA Disig Root R2 ================ -----BEGIN CERTIFICATE----- MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7 A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa 5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8 1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01 utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0 sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV 7+ZtsH8tZ/3zbBt1RqPlShfppNcL -----END CERTIFICATE----- ACCVRAIZ1 ========= -----BEGIN CERTIFICATE----- MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1 MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0 RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ 0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7 8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR 5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J 9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0 dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2 MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49 nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3 sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd 3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p EfbRD0tVNEYqi4Y7 -----END CERTIFICATE----- TWCA Global Root CA =================== -----BEGIN CERTIFICATE----- MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99 sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M 8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg /eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8 EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3 zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0= -----END CERTIFICATE----- TeliaSonera Root CA v1 ====================== -----BEGIN CERTIFICATE----- MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4 MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+ 6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA 3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3 F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7 gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx 0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2 qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6 Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= -----END CERTIFICATE----- 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----- 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----- OISTE WISeKey Global Root GB CA =============================== -----BEGIN CERTIFICATE----- MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG EwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw MzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds b2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX scriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP rby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk 9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o Qnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg GUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB /zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI hvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD dHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0 VQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui HZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= -----END CERTIFICATE----- SZAFIR ROOT CA2 =============== -----BEGIN CERTIFICATE----- MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQELBQAwUTELMAkG A1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4xGDAWBgNV BAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkwNzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJ BgNVBAYTAlBMMSgwJgYDVQQKDB9LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYD VQQDDA9TWkFGSVIgUk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5Q qEvNQLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT3PSQ1hNK DJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw3gAeqDRHu5rr/gsUvTaE 2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr63fE9biCloBK0TXC5ztdyO4mTp4CEHCdJ ckm1/zuVnsHMyAHs6A6KCpbns6aH5db5BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwi ieDhZNRnvDF5YTy7ykHNXGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P AQH/BAQDAgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsFAAOC AQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw8PRBEew/R40/cof5 O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOGnXkZ7/e7DDWQw4rtTw/1zBLZpD67 oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCPoky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul 4+vJhaAlIDf7js4MNIThPIGyd05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6 +/NNIxuZMzSgLvWpCz/UXeHPhJ/iGcJfitYgHuNztw== -----END CERTIFICATE----- Certum Trusted Network CA 2 =========================== -----BEGIN CERTIFICATE----- MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCBgDELMAkGA1UE BhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1 bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29y ayBDQSAyMCIYDzIwMTExMDA2MDgzOTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQ TDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENl cnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENB IDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWADGSdhhuWZGc/IjoedQF9 7/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+o CgCXhVqqndwpyeI1B+twTUrWwbNWuKFBOJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40b Rr5HMNUuctHFY9rnY3lEfktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2p uTRZCr+ESv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1mo130 GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02isx7QBlrd9pPPV3WZ 9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOWOZV7bIBaTxNyxtd9KXpEulKkKtVB Rgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgezTv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pye hizKV/Ma5ciSixqClnrDvFASadgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vM BhBgu4M1t15n3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZI hvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQF/xlhMcQSZDe28cmk4gmb3DW Al45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTfCVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuA L55MYIR4PSFk1vtBHxgP58l1cb29XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMo clm2q8KMZiYcdywmdjWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tM pkT/WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jbAoJnwTnb w3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksqP/ujmv5zMnHCnsZy4Ypo J/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Kob7a6bINDd82Kkhehnlt4Fj1F4jNy3eFm ypnTycUm/Q1oBEauttmbjL4ZvrHG8hnjXALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLX is7VmFxWlgPF7ncGNf/P5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7 zAYspsbiDrW5viSP -----END CERTIFICATE----- Hellenic Academic and Research Institutions RootCA 2015 ======================================================= -----BEGIN CERTIFICATE----- MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcT BkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0 aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl YXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAx MTIxWjCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMg QWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNV BAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIw MTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDC+Kk/G4n8PDwEXT2QNrCROnk8Zlrv bTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+eh iGsxr/CL0BgzuNtFajT0AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+ 6PAQZe104S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06CojXd FPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV9Cz82XBST3i4vTwr i5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrDgfgXy5I2XdGj2HUb4Ysn6npIQf1F GQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2 fu/Z8VFRfS0myGlZYeCsargqNhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9mu iNX6hME6wGkoLfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVdctA4GGqd83EkVAswDQYJKoZI hvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0IXtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+ D1hYc2Ryx+hFjtyp8iY/xnmMsVMIM4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrM d/K4kPFox/la/vot9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+y d+2VZ5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/eaj8GsGsVn 82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnhX9izjFk0WaSrT2y7Hxjb davYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQl033DlZdwJVqwjbDG2jJ9SrcR5q+ss7F Jej6A7na+RZukYT1HCjI/CbM1xyQVqdfbzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVt J94Cj8rDtSvK6evIIVM4pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGa JI7ZjnHKe7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0vm9q p/UsQu0yrbYhnr68 -----END CERTIFICATE----- Hellenic Academic and Research Institutions ECC RootCA 2015 =========================================================== -----BEGIN CERTIFICATE----- MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0 aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u cyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj aCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEw MzcxMlowgaoxCzAJBgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmlj IEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUQwQgYD VQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290 Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKgQehLgoRc4vgxEZmGZE4JJS+dQS8KrjVP dJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJajq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoK Vlp8aQuqgAkkbH7BRqNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O BBYEFLQiC4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaeplSTA GiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7SofTUwJCA3sS61kFyjn dc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR -----END CERTIFICATE----- ISRG Root X1 ============ -----BEGIN CERTIFICATE----- MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAwTzELMAkGA1UE BhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQD EwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQG EwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMT DElTUkcgUm9vdCBYMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54r Vygch77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+0TM8ukj1 3Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6UA5/TR5d8mUgjU+g4rk8K b4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sWT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCN Aymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyHB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ 4Q7e2RCOFvu396j3x+UCB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf 1b0SHzUvKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWnOlFu hjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTnjh8BCNAw1FtxNrQH usEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbwqHyGO0aoSCqI3Haadr8faqU9GY/r OPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CIrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4G A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY 9umbbjANBgkqhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ3BebYhtF8GaV 0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KKNFtY2PwByVS5uCbMiogziUwt hDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJw TdwJx4nLCgdNbOhdjsnvzqvHu7UrTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nx e5AW0wdeRlN8NwdCjNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZA JzVcoyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq4RgqsahD YVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPAmRGunUHBcnWEvgJBQl9n JEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57demyPxgcYxn/eR44/KJ4EBs+lVDR3veyJ m+kXQ99b21/+jh5Xos1AnX5iItreGCc= -----END CERTIFICATE----- AC RAIZ FNMT-RCM ================ -----BEGIN CERTIFICATE----- MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsxCzAJBgNVBAYT AkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTAeFw0wODEw MjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJD TTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC ggIBALpxgHpMhm5/yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcf qQgfBBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAzWHFctPVr btQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxFtBDXaEAUwED653cXeuYL j2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z374jNUUeAlz+taibmSXaXvMiwzn15Cou 08YfxGyqxRxqAQVKL9LFwag0Jl1mpdICIfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mw WsXmo8RZZUc1g16p6DULmbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnT tOmlcYF7wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peSMKGJ 47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2ZSysV4999AeU14EC ll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMetUqIJ5G+GR4of6ygnXYMgrwTJbFaa i0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE FPd9xf3E6Jobd2Sn9R2gzL+HYJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1o dHRwOi8vd3d3LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1RXxlDPiyN8+s D8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYMLVN0V2Ue1bLdI4E7pWYjJ2cJ j+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrT Qfv6MooqtyuGC2mDOL7Nii4LcK2NJpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW +YJF1DngoABd15jmfZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7 Ixjp6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp1txyM/1d 8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B9kiABdcPUXmsEKvU7ANm 5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wokRqEIr9baRRmW1FMdW4R58MD3R++Lj8UG rp1MYp3/RgT408m2ECVAdf4WqslKYIYvuu8wd+RU4riEmViAqhOLUTpPSPaLtrM= -----END CERTIFICATE----- Amazon Root CA 1 ================ -----BEGIN CERTIFICATE----- MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYD VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1 MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgH FzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQ gLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0t dHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcce VOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB /zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3 DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PM CCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy 8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa 2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2 xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5 -----END CERTIFICATE----- Amazon Root CA 2 ================ -----BEGIN CERTIFICATE----- MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwFADA5MQswCQYD VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAyMB4XDTE1 MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC ggIBAK2Wny2cSkxKgXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4 kHbZW0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg1dKmSYXp N+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K8nu+NQWpEjTj82R0Yiw9 AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvd fLC6HM783k81ds8P+HgfajZRRidhW+mez/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAEx kv8LV/SasrlX6avvDXbR8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSS btqDT6ZjmUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz7Mt0 Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6+XUyo05f7O0oYtlN c/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI0u1ufm8/0i2BWSlmy5A5lREedCf+ 3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSw DPBMMPQFWAJI/TPlUq9LhONmUjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oA A7CXDpO8Wqj2LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY +gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kSk5Nrp+gvU5LE YFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl7uxMMne0nxrpS10gxdr9HIcW xkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygmbtmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQ gj9sAq+uEjonljYE1x2igGOpm/HlurR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbW aQbLU8uz/mtBzUF+fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoV Yh63n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE76KlXIx3 KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H9jVlpNMKVv/1F2Rs76gi JUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT4PsJYGw= -----END CERTIFICATE----- Amazon Root CA 3 ================ -----BEGIN CERTIFICATE----- MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5MQswCQYDVQQG EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAzMB4XDTE1MDUy NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZB f8ANm+gBG1bG8lKlui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjr Zt6jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSrttvXBp43 rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkrBqWTrBqYaGFy+uGh0Psc eGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteMYyRIHN8wfdVoOw== -----END CERTIFICATE----- Amazon Root CA 4 ================ -----BEGIN CERTIFICATE----- MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5MQswCQYDVQQG EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSA0MB4XDTE1MDUy NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN /sGKe0uoe0ZLY7Bi9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri 83BkM6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV HQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WBMAoGCCqGSM49BAMDA2gA MGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlwCkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1 AE47xDqUEpHJWEadIRNyp4iciuRMStuW1KyLa2tJElMzrdfkviT8tQp21KW8EA== -----END CERTIFICATE----- TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 ============================================= -----BEGIN CERTIFICATE----- MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIxGDAWBgNVBAcT D0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxpbXNlbCB2ZSBUZWtub2xvamlr IEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0wKwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24g TWVya2V6aSAtIEthbXUgU00xNjA0BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRp ZmlrYXNpIC0gU3VydW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYD VQQGEwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXllIEJpbGlt c2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklUQUsxLTArBgNVBAsTJEth bXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBTTTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11 IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEAr3UwM6q7a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y8 6Ij5iySrLqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INrN3wc wv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2XYacQuFWQfw4tJzh0 3+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/iSIzL+aFCr2lqBs23tPcLG07xxO9 WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4fAJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQU ZT/HiobGPN08VFw1+DrtUgxHV8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJ KoZIhvcNAQELBQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPfIPP54+M638yc lNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4lzwDGrpDxpa5RXI4s6ehlj2R e37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0j q5Rm+K37DwhuJi1/FwcJsoz7UMCflo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= -----END CERTIFICATE----- GDCA TrustAUTH R5 ROOT ====================== -----BEGIN CERTIFICATE----- MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UEBhMCQ04xMjAw BgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8wHQYDVQQD DBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVow YjELMAkGA1UEBhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJjDp6L3TQs AlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBjTnnEt1u9ol2x8kECK62p OqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+uKU49tm7srsHwJ5uu4/Ts765/94Y9cnrr pftZTqfrlYwiOXnhLQiPzLyRuEH3FMEjqcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ 9Cy5WmYqsBebnh52nUpmMUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQ xXABZG12ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloPzgsM R6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3GkL30SgLdTMEZeS1SZ D2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeCjGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4 oR24qoAATILnsn8JuLwwoC8N9VKejveSswoAHQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx 9hoh49pwBiFYFIeFd3mqgnkCAwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlR MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZmDRd9FBUb1Ov9 H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5COmSdI31R9KrO9b7eGZONn35 6ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ryL3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd +PwyvzeG5LuOmCd+uh8W4XAR8gPfJWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQ HtZa37dG/OaG+svgIHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBD F8Io2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV09tL7ECQ 8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQXR4EzzffHqhmsYzmIGrv /EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrqT8p+ck0LcIymSLumoRT2+1hEmRSuqguT aaApJUqlyyvdimYHFngVV3Eb7PVHhPOeMTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== -----END CERTIFICATE----- TrustCor RootCert CA-1 ====================== -----BEGIN CERTIFICATE----- MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYDVQQGEwJQQTEP MA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3Ig U3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3Jp dHkxHzAdBgNVBAMMFlRydXN0Q29yIFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkx MjMxMTcyMzE2WjCBpDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFu YW1hIENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUGA1UECwwe VHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZUcnVzdENvciBSb290Q2Vy dCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv463leLCJhJrMxnHQFgKq1mq jQCj/IDHUHuO1CAmujIS2CNUSSUQIpidRtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4 pQa81QBeCQryJ3pS/C3Vseq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0 JEsq1pme9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CVEY4h gLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorWhnAbJN7+KIor0Gqw /Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/DeOxCbeKyKsZn3MzUOcwHwYDVR0j BBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AYYwDQYJKoZIhvcNAQELBQADggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5 mDo4Nvu7Zp5I/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZyonnMlo2HD6C qFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djtsL1Ac59v2Z3kf9YKVmgenFK+P 3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdNzl/HHk484IkzlQsPpTLWPFp5LBk= -----END CERTIFICATE----- TrustCor RootCert CA-2 ====================== -----BEGIN CERTIFICATE----- MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNVBAYTAlBBMQ8w DQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQwIgYDVQQKDBtUcnVzdENvciBT eXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRydXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0 eTEfMB0GA1UEAwwWVHJ1c3RDb3IgUm9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEy MzExNzI2MzlaMIGkMQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5h bWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29yIFJvb3RDZXJ0 IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnIG7CKqJiJJWQdsg4foDSq8Gb ZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9Nk RvRUqdw6VC0xK5mC8tkq1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1 oYxOdqHp2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nKDOOb XUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hapeaz6LMvYHL1cEksr1 /p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF3wP+TfSvPd9cW436cOGlfifHhi5q jxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQP eSghYA2FFn3XVDjxklb9tTNMg9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+Ctg rKAmrhQhJ8Z3mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh 8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAdBgNVHQ4EFgQU 2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6UnrybPZx9mCAZ5YwwYrIwDwYD VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/h Osh80QA9z+LqBrWyOrsGS2h60COXdKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnp kpfbsEZC89NiqpX+MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv 2wnL/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RXCI/hOWB3 S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYaZH9bDTMJBzN7Bj8RpFxw PIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dv DDqPys/cA8GiCcjl/YBeyGBCARsaU1q7N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYU RpFHmygk71dSTlxCnKr3Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANE xdqtvArBAs8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp5KeX RKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu1uwJ -----END CERTIFICATE----- TrustCor ECA-1 ============== -----BEGIN CERTIFICATE----- MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYDVQQGEwJQQTEP MA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3Ig U3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3Jp dHkxFzAVBgNVBAMMDlRydXN0Q29yIEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3Mjgw N1owgZwxCzAJBgNVBAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5 MSQwIgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRydXN0Q29y IENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3IgRUNBLTEwggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb3w9U73NjKYKtR8aja+3+XzP4Q1HpGjOR MRegdMTUpwHmspI+ap3tDvl0mEDTPwOABoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23 xFUfJ3zSCNV2HykVh0A53ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmc p0yJF4OuowReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/wZ0+ fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZFZtS6mFjBAgMBAAGj YzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAfBgNVHSMEGDAWgBREnkj1zG1I1KBL f/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsF AAOCAQEABT41XBVwm8nHc2FvcivUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u /ukZMjgDfxT2AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50soIipX1TH0Xs J5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BIWJZpTdwHjFGTot+fDz2LYLSC jaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1WitJ/X5g== -----END CERTIFICATE----- SSL.com Root Certification Authority RSA ======================================== -----BEGIN CERTIFICATE----- MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UEBhMCVVMxDjAM BgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24x MTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYw MjEyMTczOTM5WhcNNDEwMjEyMTczOTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NM LmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcNAQEBBQAD ggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2RxFdHaxh3a3by/ZPkPQ/C Fp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aXqhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8 P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcCC52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/ge oeOy3ZExqysdBP+lSgQ36YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkp k8zruFvh/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrFYD3Z fBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93EJNyAKoFBbZQ+yODJ gUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVcUS4cK38acijnALXRdMbX5J+tB5O2 UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi8 1xtZPCvM8hnIk2snYxnP/Okm+Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4s bE6x/c+cCbqiM+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4GA1UdDwEB/wQE AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGVcpNxJK1ok1iOMq8bs3AD/CUr dIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBcHadm47GUBwwyOabqG7B52B2ccETjit3E+ZUf ijhDPwGFpUenPUayvOUiaPd7nNgsPgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAsl u1OJD7OAUN5F7kR/q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjq erQ0cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jra6x+3uxj MxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90IH37hVZkLId6Tngr75qNJ vTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/YK9f1JmzJBjSWFupwWRoyeXkLtoh/D1JI Pb9s2KJELtFOt3JY04kTlf5Eq/jXixtunLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406y wKBjYZC6VWg3dGq2ktufoYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NI WuuA8ShYIc2wBlX7Jz9TkHCpBB5XJ7k= -----END CERTIFICATE----- SSL.com Root Certification Authority ECC ======================================== -----BEGIN CERTIFICATE----- MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMCVVMxDjAMBgNV BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xMTAv BgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEy MTgxNDAzWhcNNDEwMjEyMTgxNDAzWjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAO BgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuBBAAiA2IA BEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI7Z4INcgn64mMU1jrYor+ 8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPgCemB+vNH06NjMGEwHQYDVR0OBBYEFILR hXMw5zUE044CkvvlpNHEIejNMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTT jgKS++Wk0cQh6M0wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCW e+0F+S8Tkdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+gA0z 5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl -----END CERTIFICATE----- SSL.com EV Root Certification Authority RSA R2 ============================================== -----BEGIN CERTIFICATE----- MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNVBAYTAlVTMQ4w DAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9u MTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy MB4XDTE3MDUzMTE4MTQzN1oXDTQyMDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQI DAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYD VQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMIICIjAN BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvqM0fNTPl9fb69LT3w23jh hqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssufOePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7w cXHswxzpY6IXFJ3vG2fThVUCAtZJycxa4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTO Zw+oz12WGQvE43LrrdF9HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+ B6KjBSYRaZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcAb9Zh CBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQGp8hLH94t2S42Oim 9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQVPWKchjgGAGYS5Fl2WlPAApiiECto RHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMOpgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+Slm JuwgUHfbSguPvuUCYHBBXtSuUDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48 +qvWBkofZ6aYMBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa49QaAJadz20Zp qJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBWs47LCp1Jjr+kxJG7ZhcFUZh1 ++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nx Y/hoLVUE0fKNsKTPvDxeH3jnpaAgcLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2G guDKBAdRUNf/ktUM79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDz OFSz/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXtll9ldDz7 CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEmKf7GUmG6sXP/wwyc5Wxq lD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKKQbNmC1r7fSOl8hqw/96bg5Qu0T/fkreR rwU7ZcegbLHNYhLDkBvjJc40vG93drEQw/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1 hlMYegouCRw2n5H9gooiS9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX 9hwJ1C07mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== -----END CERTIFICATE----- SSL.com EV Root Certification Authority ECC =========================================== -----BEGIN CERTIFICATE----- MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMCVVMxDjAMBgNV BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xNDAy BgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYw MjEyMTgxNTIzWhcNNDEwMjEyMTgxNTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NM LmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB BAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMAVIbc/R/fALhBYlzccBYy 3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1KthkuWnBaBu2+8KGwytAJKaNjMGEwHQYDVR0O BBYEFFvKXuXe0oGqzagtZFG22XKbl+ZPMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe 5d7SgarNqC1kUbbZcpuX5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJ N+vp1RPZytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZgh5Mm m7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== -----END CERTIFICATE----- GlobalSign Root CA - R6 ======================= -----BEGIN CERTIFICATE----- MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEgMB4GA1UECxMX R2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds b2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQxMjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9i YWxTaWduIFJvb3QgQ0EgLSBSNjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFs U2lnbjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQss grRIxutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1kZguSgMpE 3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxDaNc9PIrFsmbVkJq3MQbF vuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJwLnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqM PKq0pPbzlUoSB239jLKJz9CgYXfIWHSw1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+ azayOeSsJDa38O+2HBNXk7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05O WgtH8wY2SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/hbguy CLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4nWUx2OVvq+aWh2IMP 0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpYrZxCRXluDocZXFSxZba/jJvcE+kN b7gu3GduyYsRtYQUigAZcIN5kZeR1BonvzceMgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQE AwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNV HSMEGDAWgBSubAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGtIxg93eFyRJa0 lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr6155wsTLxDKZmOMNOsIeDjHfrY BzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLjvUYAGm0CuiVdjaExUd1URhxN25mW7xocBFym Fe944Hn+Xds+qkxV/ZoVqW/hpvvfcDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr 3TsTjxKM4kEaSHpzoHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB1 0jZpnOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfspA9MRf/T uTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+vJJUEeKgDu+6B5dpffItK oZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+t JDfLRVpOoERIyNiwmcUVhAn21klJwGW45hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= -----END CERTIFICATE----- OISTE WISeKey Global Root GC CA =============================== -----BEGIN CERTIFICATE----- MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQswCQYDVQQGEwJD SDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEo MCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRa Fw00MjA1MDkwOTU4MzNaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQL ExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh bCBSb290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4nieUqjFqdr VCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4Wp2OQ0jnUsYd4XxiWD1Ab NTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd BgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7TrYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0E AwMDaAAwZQIwJsdpW9zV57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtk AjEA2zQgMgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 -----END CERTIFICATE----- GTS Root R1 =========== -----BEGIN CERTIFICATE----- MIIFWjCCA0KgAwIBAgIQbkepxUtHDA3sM9CJuRz04TANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQG EwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJv b3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAG A1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIi MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx 9vaMf/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7wCl7r aKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjwTcLCeoiKu7rPWRnW r4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0PfyblqAj+lug8aJRT7oM6iCsVlgmy4HqM LnXWnOunVmSPlk9orj2XwoSPwLxAwAtcvfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly 4cpk9+aCEI3oncKKiPo4Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr 06zqkUspzBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92 wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70paDPvOmbsB4om 3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrNVjzRlwW5y0vtOUucxD/SVRNu JLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEM BQADggIBADiWCu49tJYeX++dnAsznyvgyv3SjgofQXSlfKqE1OXyHuY3UjKcC9FhHb8owbZEKTV1 d5iyfNm9dKyKaOOpMQkpAWBz40d8U6iQSifvS9efk+eCNs6aaAyC58/UEBZvXw6ZXPYfcX3v73sv fuo21pdwCxXu11xWajOl40k4DLh9+42FpLFZXvRq4d2h9mREruZRgyFmxhE+885H7pwoHyXa/6xm ld01D1zvICxi/ZG6qcz8WpyTgYMpl0p8WnK0OdC3d8t5/Wk6kjftbjhlRn7pYL15iJdfOBL07q9b gsiG1eGZbYwE8na6SfZu6W0eX6DvJ4J2QPim01hcDyxC2kLGe4g0x8HYRZvBPsVhHdljUEn2NIVq 4BjFbkerQUIpm/ZgDdIx02OYI5NaAIFItO/Nis3Jz5nu2Z6qNuFoS3FJFDYoOj0dzpqPJeaAcWEr tXvM+SUWgeExX6GjfhaknBZqlxi9dnKlC54dNuYvoS++cJEPqOba+MSSQGwlfnuzCdyyF62ARPBo pY+Udf90WuioAnwMCeKpSwughQtiue+hMZL77/ZRBIls6Kl0obsXs7X9SQ98POyDGCBDTtWTurQ0 sR8WNh8M5mQ5Fkzc4P4dyKliPUDqysU0ArSuiYgzNdwsE3PYJ/HQcu51OyLemGhmW/HGY0dVHLql CFF1pkgl -----END CERTIFICATE----- GTS Root R2 =========== -----BEGIN CERTIFICATE----- MIIFWjCCA0KgAwIBAgIQbkepxlqz5yDFMJo/aFLybzANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQG EwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJv b3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAG A1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIi MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTuk k3LvCvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3KgGjSY6Dlo 7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9BuXvAuMC6C/Pq8tBcKSOWI m8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOdre7kRXuJVfeKH2JShBKzwkCX44ofR5Gm dFrS+LFjKBC4swm4VndAoiaYecb+3yXuPuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbu ak7MkogwTZq9TwtImoS1mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscsz cTJGr61K8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqjx5RW Ir9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsRnTKaG73Vululycsl aVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0kzCqgc7dGtxRcw1PcOnlthYhGXmy 5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9OktwIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEM BQADggIBALZp8KZ3/p7uC4Gt4cCpx/k1HUCCq+YEtN/L9x0Pg/B+E02NjO7jMyLDOfxA325BS0JT vhaI8dI4XsRomRyYUpOM52jtG2pzegVATX9lO9ZY8c6DR2Dj/5epnGB3GFW1fgiTz9D2PGcDFWEJ +YF59exTpJ/JjwGLc8R3dtyDovUMSRqodt6Sm2T4syzFJ9MHwAiApJiS4wGWAqoC7o87xdFtCjMw c3i5T1QWvwsHoaRc5svJXISPD+AVdyx+Jn7axEvbpxZ3B7DNdehyQtaVhJ2Gg/LkkM0JR9SLA3Da WsYDQvTtN6LwG1BUSw7YhN4ZKJmBR64JGz9I0cNv4rBgF/XuIwKl2gBbbZCr7qLpGzvpx0QnRY5r n/WkhLx3+WuXrD5RRaIRpsyF7gpo8j5QOHokYh4XIDdtak23CZvJ/KRY9bb7nE4Yu5UC56Gtmwfu Nmsk0jmGwZODUNKBRqhfYlcsu2xkiAhu7xNUX90txGdj08+JN7+dIPT7eoOboB6BAFDC5AwiWVIQ 7UNWhwD4FFKnHYuTjKJNRn8nxnGbJN7k2oaLDX5rIMHAnuFl2GqjpuiFizoHCBy69Y9Vmhh1fuXs gWbRIXOhNUQLgD1bnF5vKheW0YMjiGZt5obicDIvUiLnyOd/xCxgXS/Dr55FBcOEArf9LAhST4Ld o/DUhgkC -----END CERTIFICATE----- GTS Root R3 =========== -----BEGIN CERTIFICATE----- MIICDDCCAZGgAwIBAgIQbkepx2ypcyRAiQ8DVd2NHTAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJV UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg UjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcq hkjOPQIBBgUrgQQAIgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUU Rout736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2ADDL24Cej QjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTB8Sa6oC2uhYHP 0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEAgFukfCPAlaUs3L6JbyO5o91lAFJekazInXJ0 glMLfalAvWhgxeG4VDvBNhcl2MG9AjEAnjWSdIUlUfUk7GRSJFClH9voy8l27OyCbvWFGFPouOOa KaqW04MjyaR7YbPMAuhd -----END CERTIFICATE----- GTS Root R4 =========== -----BEGIN CERTIFICATE----- MIICCjCCAZGgAwIBAgIQbkepyIuUtui7OyrYorLBmTAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJV UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg UjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcq hkjOPQIBBgUrgQQAIgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa 6zzuhXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvRHYqj QjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSATNbrdP9JNqPV 2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNnADBkAjBqUFJ0CMRw3J5QdCHojXohw0+WbhXRIjVhLfoI N+4Zba3bssx9BzT1YBkstTTZbyACMANxsbqjYAuG7ZoIapVon+Kz4ZNkfF6Tpt95LY2F45TPI11x zPKwTdb+mciUqXWi4w== -----END CERTIFICATE----- UCA Global G2 Root ================== -----BEGIN CERTIFICATE----- MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9MQswCQYDVQQG EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBHbG9iYWwgRzIgUm9vdDAeFw0x NjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0xCzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlU cnVzdDEbMBkGA1UEAwwSVUNBIEdsb2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A MIICCgKCAgEAxeYrb3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmT oni9kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzmVHqUwCoV 8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/RVogvGjqNO7uCEeBHANBS h6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDcC/Vkw85DvG1xudLeJ1uK6NjGruFZfc8o LTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIjtm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/ R+zvWr9LesGtOxdQXGLYD0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBe KW4bHAyvj5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6DlNaBa 4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6iIis7nCs+dwp4wwc OxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznPO6Q0ibd5Ei9Hxeepl2n8pndntd97 8XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O BBYEFIHEjMz15DD/pQwIX4wVZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo 5sOASD0Ee/ojL3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5 1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl1qnN3e92mI0A Ds0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oUb3n09tDh05S60FdRvScFDcH9 yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LVPtateJLbXDzz2K36uGt/xDYotgIVilQsnLAX c47QN6MUPJiVAAwpBVueSUmxX8fjy88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHo jhJi6IjMtX9Gl8CbEGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZk bxqgDMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI+Vg7RE+x ygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGyYiGqhkCyLmTTX8jjfhFn RR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bXUB+K+wb1whnw0A== -----END CERTIFICATE----- UCA Extended Validation Root ============================ -----BEGIN CERTIFICATE----- MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQG EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9u IFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMxMDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8G A1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIi MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrs iWogD4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvSsPGP2KxF Rv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aopO2z6+I9tTcg1367r3CTu eUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dksHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR 59mzLC52LqGj3n5qiAno8geK+LLNEOfic0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH 0mK1lTnj8/FtDw5lhIpjVMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KR el7sFsLzKuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/TuDv B0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41Gsx2VYVdWf6/wFlth WG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs1+lvK9JKBZP8nm9rZ/+I8U6laUpS NwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQDfwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS 3H5aBZ8eNJr34RQwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQEL BQADggIBADaNl8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQVBcZEhrxH9cM aVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5c6sq1WnIeJEmMX3ixzDx/BR4 dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb +7lsq+KePRXBOy5nAliRn+/4Qh8st2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOW F3sGPjLtx7dCvHaj2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwi GpWOvpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2CxR9GUeOc GMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmxcmtpzyKEC2IPrNkZAJSi djzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbMfjKaiJUINlK73nZfdklJrX+9ZSCyycEr dhh2n1ax -----END CERTIFICATE----- Certigna Root CA ================ -----BEGIN CERTIFICATE----- MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAwWjELMAkGA1UE BhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAwMiA0ODE0NjMwODEwMDAzNjEZ MBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0xMzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjda MFoxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYz MDgxMDAwMzYxGTAXBgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sOty3tRQgX stmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9MCiBtnyN6tMbaLOQdLNyz KNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPuI9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8 JXrJhFwLrN1CTivngqIkicuQstDuI7pmTLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16 XdG+RCYyKfHx9WzMfgIhC59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq 4NYKpkDfePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3YzIoej wpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWTCo/1VTp2lc5ZmIoJ lXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1kJWumIWmbat10TWuXekG9qxf5kBdI jzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp/ /TBt2dzhauH8XwIDAQABo4IBGjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw HQYDVR0OBBYEFBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of 1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczovL3d3d3cuY2Vy dGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilodHRwOi8vY3JsLmNlcnRpZ25h LmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYraHR0cDovL2NybC5kaGlteW90aXMuY29tL2Nl cnRpZ25hcm9vdGNhLmNybDANBgkqhkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOIt OoldaDgvUSILSo3L6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxP TGRGHVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH60BGM+RFq 7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncBlA2c5uk5jR+mUYyZDDl3 4bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdio2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd 8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS 6Cvu5zHbugRqh5jnxV/vfaci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaY tlu3zM63Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayhjWZS aX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw3kAP+HwV96LOPNde E4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0= -----END CERTIFICATE----- emSign Root CA - G1 =================== -----BEGIN CERTIFICATE----- MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYDVQQGEwJJTjET MBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRl ZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBHMTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgx ODMwMDBaMGcxCzAJBgNVBAYTAklOMRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVk aHJhIFRlY2hub2xvZ2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIB IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQzf2N4aLTN LnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO8oG0x5ZOrRkVUkr+PHB1 cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aqd7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHW DV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhMtTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ 6DqS0hdW5TUaQBw+jSztOd9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrH hQIDAQABo0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQDAgEG MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31xPaOfG1vR2vjTnGs2 vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjMwiI/aTvFthUvozXGaCocV685743Q NcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6dGNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q +Mri/Tm3R7nrft8EI6/6nAYH6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeih U80Bv2noWgbyRQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx iN66zB+Afko= -----END CERTIFICATE----- emSign ECC Root CA - G3 ======================= -----BEGIN CERTIFICATE----- MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQGEwJJTjETMBEG A1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEg MB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4 MTgzMDAwWjBrMQswCQYDVQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11 ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g RzMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0WXTsuwYc 58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xySfvalY8L1X44uT6EYGQIr MgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuBzhccLikenEhjQjAOBgNVHQ8BAf8EBAMC AQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+D CBeQyh+KTOgNG3qxrdWBCUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7 jHvrZQnD+JbNR6iC8hZVdyR+EhCVBCyj -----END CERTIFICATE----- emSign Root CA - C1 =================== -----BEGIN CERTIFICATE----- MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkGA1UEBhMCVVMx EzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNp Z24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UE BhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQD ExNlbVNpZ24gUm9vdCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+up ufGZBczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZHdPIWoU/ Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH3DspVpNqs8FqOp099cGX OFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvHGPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4V I5b2P/AgNBbeCsbEBEV5f6f9vtKppa+cxSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleooms lMuoaJuvimUnzYnu3Yy1aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+ XJGFehiqTbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQAD ggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87/kOXSTKZEhVb3xEp /6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4kqNPEjE2NuLe/gDEo2APJ62gsIq1 NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrGYQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9 wC68AivTxEDkigcxHpvOJpkT+xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQ BmIMMMAVSKeoWXzhriKi4gp6D/piq1JM4fHfyr6DDUI= -----END CERTIFICATE----- emSign ECC Root CA - C3 ======================= -----BEGIN CERTIFICATE----- MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQGEwJVUzETMBEG A1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMxIDAeBgNVBAMTF2VtU2lnbiBF Q0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UE BhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQD ExdlbVNpZ24gRUNDIFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd 6bciMK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4OjavtisIGJAnB9 SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0OBBYEFPtaSNCAIEDyqOkA B2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2gA MGUCMQC02C8Cif22TGK6Q04ThHK1rt0c3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwU ZOR8loMRnLDRWmFLpg9J0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ== -----END CERTIFICATE----- Hongkong Post Root CA 3 ======================= -----BEGIN CERTIFICATE----- MIIFzzCCA7egAwIBAgIUCBZfikyl7ADJk0DfxMauI7gcWqQwDQYJKoZIhvcNAQELBQAwbzELMAkG A1UEBhMCSEsxEjAQBgNVBAgTCUhvbmcgS29uZzESMBAGA1UEBxMJSG9uZyBLb25nMRYwFAYDVQQK Ew1Ib25na29uZyBQb3N0MSAwHgYDVQQDExdIb25na29uZyBQb3N0IFJvb3QgQ0EgMzAeFw0xNzA2 MDMwMjI5NDZaFw00MjA2MDMwMjI5NDZaMG8xCzAJBgNVBAYTAkhLMRIwEAYDVQQIEwlIb25nIEtv bmcxEjAQBgNVBAcTCUhvbmcgS29uZzEWMBQGA1UEChMNSG9uZ2tvbmcgUG9zdDEgMB4GA1UEAxMX SG9uZ2tvbmcgUG9zdCBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz iNfqzg8gTr7m1gNt7ln8wlffKWihgw4+aMdoWJwcYEuJQwy51BWy7sFOdem1p+/l6TWZ5Mwc50tf jTMwIDNT2aa71T4Tjukfh0mtUC1Qyhi+AViiE3CWu4mIVoBc+L0sPOFMV4i707mV78vH9toxdCim 5lSJ9UExyuUmGs2C4HDaOym71QP1mbpV9WTRYA6ziUm4ii8F0oRFKHyPaFASePwLtVPLwpgchKOe sL4jpNrcyCse2m5FHomY2vkALgbpDDtw1VAliJnLzXNg99X/NWfFobxeq81KuEXryGgeDQ0URhLj 0mRiikKYvLTGCAj4/ahMZJx2Ab0vqWwzD9g/KLg8aQFChn5pwckGyuV6RmXpwtZQQS4/t+TtbNe/ JgERohYpSms0BpDsE9K2+2p20jzt8NYt3eEV7KObLyzJPivkaTv/ciWxNoZbx39ri1UbSsUgYT2u y1DhCDq+sI9jQVMwCFk8mB13umOResoQUGC/8Ne8lYePl8X+l2oBlKN8W4UdKjk60FSh0Tlxnf0h +bV78OLgAo9uliQlLKAeLKjEiafv7ZkGL7YKTE/bosw3Gq9HhS2KX8Q0NEwA/RiTZxPRN+ZItIsG xVd7GYYKecsAyVKvQv83j+GjHno9UKtjBucVtT+2RTeUN7F+8kjDf8V1/peNRY8apxpyKBpADwID AQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQXnc0e i9Y5K3DTXNSguB+wAPzFYTAdBgNVHQ4EFgQUF53NHovWOStw01zUoLgfsAD8xWEwDQYJKoZIhvcN AQELBQADggIBAFbVe27mIgHSQpsY1Q7XZiNc4/6gx5LS6ZStS6LG7BJ8dNVI0lkUmcDrudHr9Egw W62nV3OZqdPlt9EuWSRY3GguLmLYauRwCy0gUCCkMpXRAJi70/33MvJJrsZ64Ee+bs7Lo3I6LWld y8joRTnU+kLBEUx3XZL7av9YROXrgZ6voJmtvqkBZss4HTzfQx/0TW60uhdG/H39h4F5ag0zD/ov +BS5gLNdTaqX4fnkGMX41TiMJjz98iji7lpJiCzfeT2OnpA8vUFKOt1b9pq0zj8lMH8yfaIDlNDc eqFS3m6TjRgm/VWsvY+b0s+v54Ysyx8Jb6NvqYTUc79NoXQbTiNg8swOqn+knEwlqLJmOzj/2ZQw 9nKEvmhVEA/GcywWaZMH/rFF7buiVWqw2rVKAiUnhde3t4ZEFolsgCs+l6mc1X5VTMbeRRAc6uk7 nwNT7u56AQIWeNTowr5GdogTPyK7SBIdUgC0An4hGh6cJfTzPV4e0hz5sy229zdcxsshTrD3mUcY hcErulWuBurQB7Lcq9CClnXO0lD+mefPL5/ndtFhKvshuzHQqp9HpLIiyhY6UFfEW0NnxWViA0kB 60PZ2Pierc+xYw5F9KBaLJstxabArahH9CdMOA0uG0k7UvToiIMrVCjU8jVStDKDYmlkDJGcn5fq dBb9HxEGmpv0 -----END CERTIFICATE----- Entrust Root Certification Authority - G4 ========================================= -----BEGIN CERTIFICATE----- MIIGSzCCBDOgAwIBAgIRANm1Q3+vqTkPAAAAAFVlrVgwDQYJKoZIhvcNAQELBQAwgb4xCzAJBgNV BAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3Qu bmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1 dGhvcml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1 dGhvcml0eSAtIEc0MB4XDTE1MDUyNzExMTExNloXDTM3MTIyNzExNDExNlowgb4xCzAJBgNVBAYT AlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhv cml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhv cml0eSAtIEc0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAsewsQu7i0TD/pZJH4i3D umSXbcr3DbVZwbPLqGgZ2K+EbTBwXX7zLtJTmeH+H17ZSK9dE43b/2MzTdMAArzE+NEGCJR5WIoV 3imz/f3ET+iq4qA7ec2/a0My3dl0ELn39GjUu9CH1apLiipvKgS1sqbHoHrmSKvS0VnM1n4j5pds 8ELl3FFLFUHtSUrJ3hCX1nbB76W1NhSXNdh4IjVS70O92yfbYVaCNNzLiGAMC1rlLAHGVK/XqsEQ e9IFWrhAnoanw5CGAlZSCXqc0ieCU0plUmr1POeo8pyvi73TDtTUXm6Hnmo9RR3RXRv06QqsYJn7 ibT/mCzPfB3pAqoEmh643IhuJbNsZvc8kPNXwbMv9W3y+8qh+CmdRouzavbmZwe+LGcKKh9asj5X xNMhIWNlUpEbsZmOeX7m640A2Vqq6nPopIICR5b+W45UYaPrL0swsIsjdXJ8ITzI9vF01Bx7owVV 7rtNOzK+mndmnqxpkCIHH2E6lr7lmk/MBTwoWdPBDFSoWWG9yHJM6Nyfh3+9nEg2XpWjDrk4JFX8 dWbrAuMINClKxuMrLzOg2qOGpRKX/YAr2hRC45K9PvJdXmd0LhyIRyk0X+IyqJwlN4y6mACXi0mW Hv0liqzc2thddG5msP9E36EYxr5ILzeUePiVSj9/E15dWf10hkNjc0kCAwEAAaNCMEAwDwYDVR0T AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJ84xFYjwznooHFs6FRM5Og6sb9n MA0GCSqGSIb3DQEBCwUAA4ICAQAS5UKme4sPDORGpbZgQIeMJX6tuGguW8ZAdjwD+MlZ9POrYs4Q jbRaZIxowLByQzTSGwv2LFPSypBLhmb8qoMi9IsabyZIrHZ3CL/FmFz0Jomee8O5ZDIBf9PD3Vht 7LGrhFV0d4QEJ1JrhkzO3bll/9bGXp+aEJlLdWr+aumXIOTkdnrG0CSqkM0gkLpHZPt/B7NTeLUK YvJzQ85BK4FqLoUWlFPUa19yIqtRLULVAJyZv967lDtX/Zr1hstWO1uIAeV8KEsD+UmDfLJ/fOPt jqF/YFOOVZ1QNBIPt5d7bIdKROf1beyAN/BYGW5KaHbwH5Lk6rWS02FREAutp9lfx1/cH6NcjKF+ m7ee01ZvZl4HliDtC3T7Zk6LERXpgUl+b7DUUH8i119lAg2m9IUe2K4GS0qn0jFmwvjO5QimpAKW RGhXxNUzzxkvFMSUHHuk2fCfDrGA4tGeEWSpiBE6doLlYsKA2KSD7ZPvfC+QsDJMlhVoSFLUmQjA JOgc47OlIQ6SwJAfzyBfyjs4x7dtOvPmRLgOMWuIjnDrnBdSqEGULoe256YSxXXfW8AKbnuk5F6G +TaU33fD6Q3AOfF5u0aOq0NZJ7cguyPpVkAh7DE9ZapD8j3fcEThuk0mEDuYn/PIjhs4ViFqUZPT kcpG2om3PVODLAgfi49T3f+sHw== -----END CERTIFICATE----- Microsoft ECC Root Certificate Authority 2017 ============================================= -----BEGIN CERTIFICATE----- MIICWTCCAd+gAwIBAgIQZvI9r4fei7FK6gxXMQHC7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNyb3NvZnQgRUND IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwHhcNMTkxMjE4MjMwNjQ1WhcNNDIwNzE4 MjMxNjA0WjBlMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYw NAYDVQQDEy1NaWNyb3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwdjAQ BgcqhkjOPQIBBgUrgQQAIgNiAATUvD0CQnVBEyPNgASGAlEvaqiBYgtlzPbKnR5vSmZRogPZnZH6 thaxjG7efM3beaYvzrvOcS/lpaso7GMEZpn4+vKTEAXhgShC48Zo9OYbhGBKia/teQ87zvH2RPUB eMCjVDBSMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTIy5lycFIM +Oa+sgRXKSrPQhDtNTAQBgkrBgEEAYI3FQEEAwIBADAKBggqhkjOPQQDAwNoADBlAjBY8k3qDPlf Xu5gKcs68tvWMoQZP3zVL8KxzJOuULsJMsbG7X7JNpQS5GiFBqIb0C8CMQCZ6Ra0DvpWSNSkMBaR eNtUjGUBiudQZsIxtzm6uBoiB078a1QWIP8rtedMDE2mT3M= -----END CERTIFICATE----- Microsoft RSA Root Certificate Authority 2017 ============================================= -----BEGIN CERTIFICATE----- MIIFqDCCA5CgAwIBAgIQHtOXCV/YtLNHcB6qvn9FszANBgkqhkiG9w0BAQwFADBlMQswCQYDVQQG EwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNyb3NvZnQg UlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwHhcNMTkxMjE4MjI1MTIyWhcNNDIw NzE4MjMwMDIzWjBlMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u MTYwNAYDVQQDEy1NaWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcw ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKW76UM4wplZEWCpW9R2LBifOZNt9GkMml 7Xhqb0eRaPgnZ1AzHaGm++DlQ6OEAlcBXZxIQIJTELy/xztokLaCLeX0ZdDMbRnMlfl7rEqUrQ7e S0MdhweSE5CAg2Q1OQT85elss7YfUJQ4ZVBcF0a5toW1HLUX6NZFndiyJrDKxHBKrmCk3bPZ7Pw7 1VdyvD/IybLeS2v4I2wDwAW9lcfNcztmgGTjGqwu+UcF8ga2m3P1eDNbx6H7JyqhtJqRjJHTOoI+ dkC0zVJhUXAoP8XFWvLJjEm7FFtNyP9nTUwSlq31/niol4fX/V4ggNyhSyL71Imtus5Hl0dVe49F yGcohJUcaDDv70ngNXtk55iwlNpNhTs+VcQor1fznhPbRiefHqJeRIOkpcrVE7NLP8TjwuaGYaRS MLl6IE9vDzhTyzMMEyuP1pq9KsgtsRx9S1HKR9FIJ3Jdh+vVReZIZZ2vUpC6W6IYZVcSn2i51BVr lMRpIpj0M+Dt+VGOQVDJNE92kKz8OMHY4Xu54+OU4UZpyw4KUGsTuqwPN1q3ErWQgR5WrlcihtnJ 0tHXUeOrO8ZV/R4O03QK0dqq6mm4lyiPSMQH+FJDOvTKVTUssKZqwJz58oHhEmrARdlns87/I6KJ ClTUFLkqqNfs+avNJVgyeY+QW5g5xAgGwax/Dj0ApQIDAQABo1QwUjAOBgNVHQ8BAf8EBAMCAYYw DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUCctZf4aycI8awznjwNnpv7tNsiMwEAYJKwYBBAGC NxUBBAMCAQAwDQYJKoZIhvcNAQEMBQADggIBAKyvPl3CEZaJjqPnktaXFbgToqZCLgLNFgVZJ8og 6Lq46BrsTaiXVq5lQ7GPAJtSzVXNUzltYkyLDVt8LkS/gxCP81OCgMNPOsduET/m4xaRhPtthH80 dK2Jp86519efhGSSvpWhrQlTM93uCupKUY5vVau6tZRGrox/2KJQJWVggEbbMwSubLWYdFQl3JPk +ONVFT24bcMKpBLBaYVu32TxU5nhSnUgnZUP5NbcA/FZGOhHibJXWpS2qdgXKxdJ5XbLwVaZOjex /2kskZGT4d9Mozd2TaGf+G0eHdP67Pv0RR0Tbc/3WeUiJ3IrhvNXuzDtJE3cfVa7o7P4NHmJweDy AmH3pvwPuxwXC65B2Xy9J6P9LjrRk5Sxcx0ki69bIImtt2dmefU6xqaWM/5TkshGsRGRxpl/j8nW ZjEgQRCHLQzWwa80mMpkg/sTV9HB8Dx6jKXB/ZUhoHHBk2dxEuqPiAppGWSZI1b7rCoucL5mxAyE 7+WL85MB+GqQk2dLsmijtWKP6T+MejteD+eMuMZ87zf9dOLITzNy4ZQ5bb0Sr74MTnB8G2+NszKT c0QWbej09+CVgI+WXTik9KveCjCHk9hNAHFiRSdLOkKEW39lt2c0Ui2cFmuqqNh7o0JMcccMyj6D 5KbvtwEwXlGjefVwaaZBRA+GsCyRxj3qrg+E -----END CERTIFICATE----- e-Szigno Root CA 2017 ===================== -----BEGIN CERTIFICATE----- MIICQDCCAeWgAwIBAgIMAVRI7yH9l1kN9QQKMAoGCCqGSM49BAMCMHExCzAJBgNVBAYTAkhVMREw DwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMgTHRkLjEXMBUGA1UEYQwOVkFUSFUt MjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25vIFJvb3QgQ0EgMjAxNzAeFw0xNzA4MjIxMjA3MDZa Fw00MjA4MjIxMjA3MDZaMHExCzAJBgNVBAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UE CgwNTWljcm9zZWMgTHRkLjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3pp Z25vIFJvb3QgQ0EgMjAxNzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJbcPYrYsHtvxie+RJCx s1YVe45DJH0ahFnuY2iyxl6H0BVIHqiQrb1TotreOpCmYF9oMrWGQd+HWyx7xf58etqjYzBhMA8G A1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSHERUI0arBeAyxr87GyZDv vzAEwDAfBgNVHSMEGDAWgBSHERUI0arBeAyxr87GyZDvvzAEwDAKBggqhkjOPQQDAgNJADBGAiEA tVfd14pVCzbhhkT61NlojbjcI4qKDdQvfepz7L9NbKgCIQDLpbQS+ue16M9+k/zzNY9vTlp8tLxO svxyqltZ+efcMQ== -----END CERTIFICATE----- certSIGN Root CA G2 =================== -----BEGIN CERTIFICATE----- MIIFRzCCAy+gAwIBAgIJEQA0tk7GNi02MA0GCSqGSIb3DQEBCwUAMEExCzAJBgNVBAYTAlJPMRQw EgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJR04gUk9PVCBDQSBHMjAeFw0xNzAy MDYwOTI3MzVaFw00MjAyMDYwOTI3MzVaMEExCzAJBgNVBAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lH TiBTQTEcMBoGA1UECxMTY2VydFNJR04gUk9PVCBDQSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP ADCCAgoCggIBAMDFdRmRfUR0dIf+DjuW3NgBFszuY5HnC2/OOwppGnzC46+CjobXXo9X69MhWf05 N0IwvlDqtg+piNguLWkh59E3GE59kdUWX2tbAMI5Qw02hVK5U2UPHULlj88F0+7cDBrZuIt4Imfk abBoxTzkbFpG583H+u/E7Eu9aqSs/cwoUe+StCmrqzWaTOTECMYmzPhpn+Sc8CnTXPnGFiWeI8Mg wT0PPzhAsP6CRDiqWhqKa2NYOLQV07YRaXseVO6MGiKscpc/I1mbySKEwQdPzH/iV8oScLumZfNp dWO9lfsbl83kqK/20U6o2YpxJM02PbyWxPFsqa7lzw1uKA2wDrXKUXt4FMMgL3/7FFXhEZn91Qqh ngLjYl/rNUssuHLoPj1PrCy7Lobio3aP5ZMqz6WryFyNSwb/EkaseMsUBzXgqd+L6a8VTxaJW732 jcZZroiFDsGJ6x9nxUWO/203Nit4ZoORUSs9/1F3dmKh7Gc+PoGD4FapUB8fepmrY7+EF3fxDTvf 95xhszWYijqy7DwaNz9+j5LP2RIUZNoQAhVB/0/E6xyjyfqZ90bp4RjZsbgyLcsUDFDYg2WD7rlc z8sFWkz6GZdr1l0T08JcVLwyc6B49fFtHsufpaafItzRUZ6CeWRgKRM+o/1Pcmqr4tTluCRVLERL iohEnMqE0yo7AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1Ud DgQWBBSCIS1mxteg4BXrzkwJd8RgnlRuAzANBgkqhkiG9w0BAQsFAAOCAgEAYN4auOfyYILVAzOB ywaK8SJJ6ejqkX/GM15oGQOGO0MBzwdw5AgeZYWR5hEit/UCI46uuR59H35s5r0l1ZUa8gWmr4UC b6741jH/JclKyMeKqdmfS0mbEVeZkkMR3rYzpMzXjWR91M08KCy0mpbqTfXERMQlqiCA2ClV9+BB /AYm/7k29UMUA2Z44RGx2iBfRgB4ACGlHgAoYXhvqAEBj500mv/0OJD7uNGzcgbJceaBxXntC6Z5 8hMLnPddDnskk7RI24Zf3lCGeOdA5jGokHZwYa+cNywRtYK3qq4kNFtyDGkNzVmf9nGvnAvRCjj5 BiKDUyUM/FHE5r7iOZULJK2v0ZXkltd0ZGtxTgI8qoXzIKNDOXZbbFD+mpwUHmUUihW9o4JFWklW atKcsWMy5WHgUyIOpwpJ6st+H6jiYoD2EEVSmAYY3qXNL3+q1Ok+CHLsIwMCPKaq2LxndD0UF/tU Sxfj03k9bWtJySgOLnRQvwzZRjoQhsmnP+mg7H/rpXdYaXHmgwo38oZJar55CJD2AhZkPuXaTH4M NMn5X7azKFGnpyuqSfqNZSlO42sTp5SjLVFteAxEy9/eCG/Oo2Sr05WE1LlSVHJ7liXMvGnjSG4N 0MedJ5qq+BOS3R7fY581qRY27Iy4g/Q9iY/NtBde17MXQRBdJ3NghVdJIgc= -----END CERTIFICATE----- ca-bundle/src/CaBundle.php 0000644 00000034346 14736103146 0011372 0 ustar 00 <?php /* * This file is part of composer/ca-bundle. * * (c) Composer <https://github.com/composer> * * For the full copyright and license information, please view * the LICENSE file that was distributed with this source code. */ namespace Composer\CaBundle; use Psr\Log\LoggerInterface; use Symfony\Component\Process\PhpProcess; /** * @author Chris Smith <chris@cs278.org> * @author Jordi Boggiano <j.boggiano@seld.be> */ class CaBundle { private static $caPath; private static $caFileValidity = array(); private static $useOpensslParse; /** * Returns the system CA bundle path, or a path to the bundled one * * This method was adapted from Sslurp. * https://github.com/EvanDotPro/Sslurp * * (c) Evan Coury <me@evancoury.com> * * For the full copyright and license information, please see below: * * Copyright (c) 2013, Evan Coury * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @param LoggerInterface $logger optional logger for information about which CA files were loaded * @return string path to a CA bundle file or directory */ public static function getSystemCaRootBundlePath(LoggerInterface $logger = null) { if (self::$caPath !== null) { return self::$caPath; } $caBundlePaths = array(); // If SSL_CERT_FILE env variable points to a valid certificate/bundle, use that. // This mimics how OpenSSL uses the SSL_CERT_FILE env variable. $caBundlePaths[] = self::getEnvVariable('SSL_CERT_FILE'); // If SSL_CERT_DIR env variable points to a valid certificate/bundle, use that. // This mimics how OpenSSL uses the SSL_CERT_FILE env variable. $caBundlePaths[] = self::getEnvVariable('SSL_CERT_DIR'); $caBundlePaths[] = ini_get('openssl.cafile'); $caBundlePaths[] = ini_get('openssl.capath'); $otherLocations = array( '/etc/pki/tls/certs/ca-bundle.crt', // Fedora, RHEL, CentOS (ca-certificates package) '/etc/ssl/certs/ca-certificates.crt', // Debian, Ubuntu, Gentoo, Arch Linux (ca-certificates package) '/etc/ssl/ca-bundle.pem', // SUSE, openSUSE (ca-certificates package) '/usr/local/share/certs/ca-root-nss.crt', // FreeBSD (ca_root_nss_package) '/usr/ssl/certs/ca-bundle.crt', // Cygwin '/opt/local/share/curl/curl-ca-bundle.crt', // OS X macports, curl-ca-bundle package '/usr/local/share/curl/curl-ca-bundle.crt', // Default cURL CA bunde path (without --with-ca-bundle option) '/usr/share/ssl/certs/ca-bundle.crt', // Really old RedHat? '/etc/ssl/cert.pem', // OpenBSD '/usr/local/etc/ssl/cert.pem', // FreeBSD 10.x '/usr/local/etc/openssl/cert.pem', // OS X homebrew, openssl package '/usr/local/etc/openssl@1.1/cert.pem', // OS X homebrew, openssl@1.1 package ); foreach($otherLocations as $location) { $otherLocations[] = dirname($location); } $caBundlePaths = array_merge($caBundlePaths, $otherLocations); foreach ($caBundlePaths as $caBundle) { if (self::caFileUsable($caBundle, $logger)) { return self::$caPath = $caBundle; } if (self::caDirUsable($caBundle)) { return self::$caPath = $caBundle; } } return self::$caPath = static::getBundledCaBundlePath(); // Bundled CA file, last resort } /** * Returns the path to the bundled CA file * * In case you don't want to trust the user or the system, you can use this directly * * @return string path to a CA bundle file */ public static function getBundledCaBundlePath() { $caBundleFile = __DIR__.'/../res/cacert.pem'; // cURL does not understand 'phar://' paths // see https://github.com/composer/ca-bundle/issues/10 if (0 === strpos($caBundleFile, 'phar://')) { file_put_contents( $tempCaBundleFile = tempnam(sys_get_temp_dir(), 'openssl-ca-bundle-'), file_get_contents($caBundleFile) ); register_shutdown_function(function() use ($tempCaBundleFile) { @unlink($tempCaBundleFile); }); $caBundleFile = $tempCaBundleFile; } return $caBundleFile; } /** * Validates a CA file using opensl_x509_parse only if it is safe to use * * @param string $filename * @param LoggerInterface $logger optional logger for information about which CA files were loaded * * @return bool */ public static function validateCaFile($filename, LoggerInterface $logger = null) { static $warned = false; if (isset(self::$caFileValidity[$filename])) { return self::$caFileValidity[$filename]; } $contents = file_get_contents($filename); // assume the CA is valid if php is vulnerable to // https://www.sektioneins.de/advisories/advisory-012013-php-openssl_x509_parse-memory-corruption-vulnerability.html if (!static::isOpensslParseSafe()) { if (!$warned && $logger) { $logger->warning(sprintf( 'Your version of PHP, %s, is affected by CVE-2013-6420 and cannot safely perform certificate validation, we strongly suggest you upgrade.', PHP_VERSION )); $warned = true; } $isValid = !empty($contents); } else { $contents = preg_replace("/^(\\-+(?:BEGIN|END))\\s+TRUSTED\\s+(CERTIFICATE\\-+)\$/m", '$1 $2', $contents); $isValid = (bool) openssl_x509_parse($contents); } if ($logger) { $logger->debug('Checked CA file '.realpath($filename).': '.($isValid ? 'valid' : 'invalid')); } return self::$caFileValidity[$filename] = $isValid; } /** * Test if it is safe to use the PHP function openssl_x509_parse(). * * This checks if OpenSSL extensions is vulnerable to remote code execution * via the exploit documented as CVE-2013-6420. * * @return bool */ public static function isOpensslParseSafe() { if (null !== self::$useOpensslParse) { return self::$useOpensslParse; } if (PHP_VERSION_ID >= 50600) { return self::$useOpensslParse = true; } // Vulnerable: // PHP 5.3.0 - PHP 5.3.27 // PHP 5.4.0 - PHP 5.4.22 // PHP 5.5.0 - PHP 5.5.6 if ( (PHP_VERSION_ID < 50400 && PHP_VERSION_ID >= 50328) || (PHP_VERSION_ID < 50500 && PHP_VERSION_ID >= 50423) || (PHP_VERSION_ID < 50600 && PHP_VERSION_ID >= 50507) ) { // This version of PHP has the fix for CVE-2013-6420 applied. return self::$useOpensslParse = true; } if (defined('PHP_WINDOWS_VERSION_BUILD')) { // Windows is probably insecure in this case. return self::$useOpensslParse = false; } $compareDistroVersionPrefix = function ($prefix, $fixedVersion) { $regex = '{^'.preg_quote($prefix).'([0-9]+)$}'; if (preg_match($regex, PHP_VERSION, $m)) { return ((int) $m[1]) >= $fixedVersion; } return false; }; // Hard coded list of PHP distributions with the fix backported. if ( $compareDistroVersionPrefix('5.3.3-7+squeeze', 18) // Debian 6 (Squeeze) || $compareDistroVersionPrefix('5.4.4-14+deb7u', 7) // Debian 7 (Wheezy) || $compareDistroVersionPrefix('5.3.10-1ubuntu3.', 9) // Ubuntu 12.04 (Precise) ) { return self::$useOpensslParse = true; } // Symfony Process component is missing so we assume it is unsafe at this point if (!class_exists('Symfony\Component\Process\PhpProcess')) { return self::$useOpensslParse = false; } // This is where things get crazy, because distros backport security // fixes the chances are on NIX systems the fix has been applied but // it's not possible to verify that from the PHP version. // // To verify exec a new PHP process and run the issue testcase with // known safe input that replicates the bug. // Based on testcase in https://github.com/php/php-src/commit/c1224573c773b6845e83505f717fbf820fc18415 // changes in https://github.com/php/php-src/commit/76a7fd893b7d6101300cc656058704a73254d593 $cert = 'LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVwRENDQTR5Z0F3SUJBZ0lKQUp6dThyNnU2ZUJjTUEwR0NTcUdTSWIzRFFFQkJRVUFNSUhETVFzd0NRWUQKVlFRR0V3SkVSVEVjTUJvR0ExVUVDQXdUVG05eVpISm9aV2x1TFZkbGMzUm1ZV3hsYmpFUU1BNEdBMVVFQnd3SApTOE9Ed3Jac2JqRVVNQklHQTFVRUNnd0xVMlZyZEdsdmJrVnBibk14SHpBZEJnTlZCQXNNRmsxaGJHbGphVzkxCmN5QkRaWEowSUZObFkzUnBiMjR4SVRBZkJnTlZCQU1NR0cxaGJHbGphVzkxY3k1elpXdDBhVzl1WldsdWN5NWsKWlRFcU1DZ0dDU3FHU0liM0RRRUpBUlliYzNSbFptRnVMbVZ6YzJWeVFITmxhM1JwYjI1bGFXNXpMbVJsTUhVWQpaREU1TnpBd01UQXhNREF3TURBd1dnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBCkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEKQUFBQUFBQVhEVEUwTVRFeU9ERXhNemt6TlZvd2djTXhDekFKQmdOVkJBWVRBa1JGTVJ3d0dnWURWUVFJREJOTwpiM0prY21obGFXNHRWMlZ6ZEdaaGJHVnVNUkF3RGdZRFZRUUhEQWRMdzRQQ3RteHVNUlF3RWdZRFZRUUtEQXRUClpXdDBhVzl1UldsdWN6RWZNQjBHQTFVRUN3d1dUV0ZzYVdOcGIzVnpJRU5sY25RZ1UyVmpkR2x2YmpFaE1COEcKQTFVRUF3d1liV0ZzYVdOcGIzVnpMbk5sYTNScGIyNWxhVzV6TG1SbE1Tb3dLQVlKS29aSWh2Y05BUWtCRmh0egpkR1ZtWVc0dVpYTnpaWEpBYzJWcmRHbHZibVZwYm5NdVpHVXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCCkR3QXdnZ0VLQW9JQkFRRERBZjNobDdKWTBYY0ZuaXlFSnBTU0RxbjBPcUJyNlFQNjV1c0pQUnQvOFBhRG9xQnUKd0VZVC9OYSs2ZnNnUGpDMHVLOURaZ1dnMnRIV1dvYW5TYmxBTW96NVBINlorUzRTSFJaN2UyZERJalBqZGhqaAowbUxnMlVNTzV5cDBWNzk3R2dzOWxOdDZKUmZIODFNTjJvYlhXczROdHp0TE11RDZlZ3FwcjhkRGJyMzRhT3M4CnBrZHVpNVVhd1Raa3N5NXBMUEhxNWNNaEZHbTA2djY1Q0xvMFYyUGQ5K0tBb2tQclBjTjVLTEtlYno3bUxwazYKU01lRVhPS1A0aWRFcXh5UTdPN2ZCdUhNZWRzUWh1K3ByWTNzaTNCVXlLZlF0UDVDWm5YMmJwMHdLSHhYMTJEWAoxbmZGSXQ5RGJHdkhUY3lPdU4rblpMUEJtM3ZXeG50eUlJdlZBZ01CQUFHalFqQkFNQWtHQTFVZEV3UUNNQUF3CkVRWUpZSVpJQVliNFFnRUJCQVFEQWdlQU1Bc0dBMVVkRHdRRUF3SUZvREFUQmdOVkhTVUVEREFLQmdnckJnRUYKQlFjREFqQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFHMGZaWVlDVGJkajFYWWMrMVNub2FQUit2SThDOENhRAo4KzBVWWhkbnlVNGdnYTBCQWNEclk5ZTk0ZUVBdTZacXljRjZGakxxWFhkQWJvcHBXb2NyNlQ2R0QxeDMzQ2tsClZBcnpHL0t4UW9oR0QySmVxa2hJTWxEb214SE83a2EzOStPYThpMnZXTFZ5alU4QVp2V01BcnVIYTRFRU55RzcKbFcyQWFnYUZLRkNyOVRuWFRmcmR4R1ZFYnY3S1ZRNmJkaGc1cDVTanBXSDErTXEwM3VSM1pYUEJZZHlWODMxOQpvMGxWajFLRkkyRENML2xpV2lzSlJvb2YrMWNSMzVDdGQwd1lCY3BCNlRac2xNY09QbDc2ZHdLd0pnZUpvMlFnClpzZm1jMnZDMS9xT2xOdU5xLzBUenprVkd2OEVUVDNDZ2FVK1VYZTRYT1Z2a2NjZWJKbjJkZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K'; $script = <<<'EOT' error_reporting(-1); $info = openssl_x509_parse(base64_decode('%s')); var_dump(PHP_VERSION, $info['issuer']['emailAddress'], $info['validFrom_time_t']); EOT; $script = '<'."?php\n".sprintf($script, $cert); try { $process = new PhpProcess($script); $process->mustRun(); } catch (\Exception $e) { // In the case of any exceptions just accept it is not possible to // determine the safety of openssl_x509_parse and bail out. return self::$useOpensslParse = false; } $output = preg_split('{\r?\n}', trim($process->getOutput())); $errorOutput = trim($process->getErrorOutput()); if ( count($output) === 3 && $output[0] === sprintf('string(%d) "%s"', strlen(PHP_VERSION), PHP_VERSION) && $output[1] === 'string(27) "stefan.esser@sektioneins.de"' && $output[2] === 'int(-1)' && preg_match('{openssl_x509_parse\(\): illegal (?:ASN1 data type for|length in) timestamp in - on line \d+}', $errorOutput) ) { // This PHP has the fix backported probably by a distro security team. return self::$useOpensslParse = true; } return self::$useOpensslParse = false; } /** * Resets the static caches */ public static function reset() { self::$caFileValidity = array(); self::$caPath = null; self::$useOpensslParse = null; } private static function getEnvVariable($name) { if (isset($_SERVER[$name])) { return (string) $_SERVER[$name]; } if (PHP_SAPI === 'cli' && ($value = getenv($name)) !== false && $value !== null) { return (string) $value; } return false; } private static function caFileUsable($certFile, LoggerInterface $logger = null) { return $certFile && @is_file($certFile) && @is_readable($certFile) && static::validateCaFile($certFile, $logger); } private static function caDirUsable($certDir) { return $certDir && @is_dir($certDir) && @is_readable($certDir) && glob($certDir . '/*'); } } ca-bundle/README.md 0000644 00000004061 14736103146 0007663 0 ustar 00 composer/ca-bundle ================== Small utility library that lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle. Originally written as part of [composer/composer](https://github.com/composer/composer), now extracted and made available as a stand-alone library. Installation ------------ Install the latest version with: ```bash $ composer require composer/ca-bundle ``` Requirements ------------ * PHP 5.3.2 is required but using the latest version of PHP is highly recommended. Basic usage ----------- ### `Composer\CaBundle\CaBundle` - `CaBundle::getSystemCaRootBundlePath()`: Returns the system CA bundle path, or a path to the bundled one as fallback - `CaBundle::getBundledCaBundlePath()`: Returns the path to the bundled CA file - `CaBundle::validateCaFile($filename)`: Validates a CA file using openssl_x509_parse only if it is safe to use - `CaBundle::isOpensslParseSafe()`: Test if it is safe to use the PHP function openssl_x509_parse() - `CaBundle::reset()`: Resets the static caches #### To use with curl ```php $curl = curl_init("https://example.org/"); $caPathOrFile = \Composer\CaBundle\CaBundle::getSystemCaRootBundlePath(); if (is_dir($caPathOrFile)) { curl_setopt($curl, CURLOPT_CAPATH, $caPathOrFile); } else { curl_setopt($curl, CURLOPT_CAINFO, $caPathOrFile); } $result = curl_exec($curl); ``` #### To use with php streams ```php $opts = array( 'http' => array( 'method' => "GET" ) ); $caPathOrFile = \Composer\CaBundle\CaBundle::getSystemCaRootBundlePath(); if (is_dir($caPathOrFile)) { $opts['ssl']['capath'] = $caPathOrFile; } else { $opts['ssl']['cafile'] = $caPathOrFile; } $context = stream_context_create($opts); $result = file_get_contents('https://example.com', false, $context); ``` #### To use with Guzzle ```php $client = new \GuzzleHttp\Client([ \GuzzleHttp\RequestOptions::VERIFY => \Composer\CaBundle\CaBundle::getSystemCaRootBundlePath() ]); ``` License ------- composer/ca-bundle is licensed under the MIT License, see the LICENSE file for details. ca-bundle/LICENSE 0000644 00000002034 14736103146 0007407 0 ustar 00 Copyright (C) 2016 Composer Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.